diff --git a/python/client-contract/CHANGELOG.md b/python/client-contract/CHANGELOG.md index 1a91094..f78ec72 100644 --- a/python/client-contract/CHANGELOG.md +++ b/python/client-contract/CHANGELOG.md @@ -7,11 +7,11 @@ All notable changes to the `dfo-spec-kit-client-contract` Python package will be ### Added - Package scaffolding (uv, ruff, ty, pytest). -- `served/openapi.json`, the composed dfo-apis app's OpenAPI document, and `served/SOURCE.json`, naming dfo-apis commit `d80df9f5fd598b7345255470932d202ee5d49942`. The document admits `timed_out` as a no_data reason and the optional `entity_refs` on each answer part, a list of `EntityRefs` with one entry per restatement entity row, the graph nodes that row binds, and a stored manifest warning states its counts and the refs it names (`CountedRefsModel`, `CountedEntityYearsModel`, `EntityYearsModel`). `NoDataOption` and `SentenceToken` carry `entity_choice`, the index into `NoData.ambiguous_entities` of the group an entity_ambiguous option settles or a slot token asks, so a client groups a place menu by it when two wordings share one text. +- `served/openapi.json`, the composed dfo-apis app's OpenAPI document, and `served/SOURCE.json`, naming dfo-apis commit `ccb6617922c839ce3cd5615a3bbb65c70bfe1bde`. The document admits `timed_out` as a no_data reason and the optional `entity_refs` on each answer part, a list of `EntityRefs` with one entry per restatement entity row, the graph nodes that row binds, and a stored manifest warning states its counts and the refs it names (`CountedRefsModel`, `CountedEntityYearsModel`, `EntityYearsModel`). `NoDataOption` and `SentenceToken` carry `entity_choice`, the index into `NoData.ambiguous_entities` of the group an entity_ambiguous option settles or a slot token asks, so a client groups a place menu by it when two wordings share one text. - `strict-fields.json` and its schema: 29 members that stay required and non-nullable, each one a client reads, and the answer kinds, part statuses and operation statuses the clients branch on. - `actions.json` and its schema: the caller's next step for each of the 148 active refusal codes on `problem_details` or `no_data_reason`, with the gap kind of each no_data reason. - The status fallback for a refusal whose code has no row: 400 and 422 to `InvalidRequestError`, 401 to `AuthenticationError`, 403 to `PermissionDeniedError`, 404 and 410 to `NotFoundError`, 408 to `DfoTimeoutError`, 429 to `RateLimitError`, and any other 4xx or 5xx to `InvalidRequestError` or `ServerError`. -- `scenario.schema.json`, the scenario record, and 126 scenarios: 34 recorded against the deployed dfo-apis dev app at `d80df9f5f`, and 92 synthetic, each derived from a recorded one by a one-line edit, with 21 binary bodies totalling 1,134,603 bytes and records and bodies together 13,695,441 bytes. `search-place-ambiguous-twice` pins two entity_ambiguous groups of one text, each option and slot token naming its group by `entity_choice`, and `choose-refused-label-in-two-groups` pins that a label both groups offer matches two options, so a choice there names its option by index. The scenarios cover the several-part choice entries and the assumptions each identity entry echoes, a picked reading whose assumption Search states in its answer, the place choice through a no_data part's options, the choice refusals, a part without variable_text, an unknown status without a restatement, a shared label, a one-part option whose data_query holds two parts, the separate and operations echo, an unsupported part's placeholder, the timed_out, unsupported and unknown gaps, an unknown answer kind, the `SearchWarning` rule, the stacked dataset's `part` column, the frame layout, a strict fetch's `DataWarning`, a spec fetch that rebinds one of two entity roles and keeps the other, one that drops a role bound to null, a spec whose destination is a named group fetched with a window or with its origin rebound, whose sentence lookup posts the groups of the roles the build left bound, a twice cut-off build, a cut-off build retried after its Retry-After, a retryable refusal whose Retry-After passes the 60-second cap, a build refused 504 then 503 and one refused 503 then 504, a refused build, a build refused 501 `capability_unavailable`, a digest mismatch, a signed URL refused on both rounds, a relative files-route Location, an artifact url on a foreign origin, on the storage host and absolute on the API's origin, a manifest definition without identity or schema_version, a Search spec without identity or resolved, nested specs no rule reads, an empty parts list, a Search body that is not an object, a codeless 503 problem document that is not retryable, a 401, an identity resubmit answering another spec, a part whose status is not a string, a Search spec whose definition names another spec_id, a Search response with no JSON body, an option with no data_query, empty entities and facets, a Sunset header issued once, `x-dfo-warning` messages and a Deprecation and Sunset pair, an unreadable versions page, a mint and a spec fetch whose build answers 202 and is polled to done, a resumed operation, a rate-limited poll, 503 polls retried within the budget an answered poll restores, a 202 that reads running, polls whose `retry_after_ms` changes from one to the next, a 404 poll that raises, a failed operation posted again, a failed operation with no error, and a ref whose stored file expired, read through the file selector, rebuilt at the same version, at a newer one, or refused with the newest version read from the versions route: the first version it lists with no `base_content_version`, the newest plain build, so a derived version listed before it is skipped. +- `scenario.schema.json`, the scenario record, and 126 scenarios: 34 recorded against the deployed dfo-apis dev app at `ccb661792`, and 92 synthetic, each derived from a recorded one by a one-line edit, with 21 binary bodies totalling 1,142,020 bytes and records and bodies together 14,160,817 bytes. `search-place-ambiguous-twice` pins two entity_ambiguous groups of one text, each option and slot token naming its group by `entity_choice`, and `choose-refused-label-in-two-groups` pins that a label both groups offer matches two options, so a choice there names its option by index. The scenarios cover the several-part choice entries and the assumptions each identity entry echoes, a picked reading whose assumption Search states in its answer, the place choice through a no_data part's options, the choice refusals, a part without variable_text, an unknown status without a restatement, a shared label, a one-part option whose data_query holds two parts, the separate and operations echo, an unsupported part's placeholder, the timed_out, unsupported and unknown gaps, an unknown answer kind, the `SearchWarning` rule, the stacked dataset's `part` column, the frame layout, a strict fetch's `DataWarning`, a spec fetch that rebinds one of two entity roles and keeps the other, one that drops a role bound to null, a spec whose destination is a named group fetched with a window or with its origin rebound, whose sentence lookup posts the groups of the roles the build left bound, a twice cut-off build, a cut-off build retried after its Retry-After, a retryable refusal whose Retry-After passes the 60-second cap, a build refused 504 then 503 and one refused 503 then 504, a refused build, a build refused 501 `capability_unavailable`, a digest mismatch, a signed URL refused on both rounds, a relative files-route Location, an artifact url on a foreign origin, on the storage host and absolute on the API's origin, a manifest definition without identity or schema_version, a Search spec without identity or resolved, nested specs no rule reads, an empty parts list, a Search body that is not an object, a codeless 503 problem document that is not retryable, a 401, an identity resubmit answering another spec, a part whose status is not a string, a Search spec whose definition names another spec_id, a Search response with no JSON body, an option with no data_query, empty entities and facets, a Sunset header issued once, `x-dfo-warning` messages and a Deprecation and Sunset pair, an unreadable versions page, a mint and a spec fetch whose build answers 202 and is polled to done, a resumed operation, a rate-limited poll, 503 polls retried within the budget an answered poll restores, a 202 that reads running, polls whose `retry_after_ms` changes from one to the next, a 404 poll that raises, a failed operation posted again, a failed operation with no error, and a ref whose stored file expired, read through the file selector, rebuilt at the same version, at a newer one, or refused with the newest version read from the versions route: the first version it lists with no `base_content_version`, the newest plain build, so a derived version listed before it is skipped. - `client-codes.json` and its schema: the 23 codes a client sets on the errors it raises itself, each with its error class, retryable flag and condition, disjoint from `actions.json` and `registries/codes.json`, and the `client_codes()` and `client_codes_schema()` accessors. Every scenario error the client raises itself carries its code, and `refusal_without_code` names a refusal whose body carries no code. - `proxy-codes.json` and its schema, the website proxy's `rate_limited` and `transient_unavailable` codes with their statuses, which the proxy sends in problem documents of the shape every refusal has, both retryable, with `Retry-After` on the 429, so a client reads one refusal shape, and `warning-codes.json` and its schema, the 7 codes a client sets on the warnings it issues itself, with the `proxy_codes()` and `warning_codes()` accessors. - `ref_digest_changed` in `warning-codes.json`, a `DfoWarning` for a ref member whose `content_version` serves a file with another digest than the ref's, because the server rendered the same data again. The client returns the data, with no error under strict. diff --git a/python/client-contract/README.md b/python/client-contract/README.md index 6407aa4..273fc36 100644 --- a/python/client-contract/README.md +++ b/python/client-contract/README.md @@ -199,7 +199,7 @@ uv sync --directory ../dfo-apis --extra eval --extra api --extra engine --extra uv run tools/capture_client_contract.py openapi --dfo-apis ../dfo-apis ``` -Its `record` command runs every scenario against a base URL, dev's Cloud Run URL by default, checks each live answer still has the shape its scenario names, derives the synthetic scenarios from the fresh records with no request, and then runs the validator. A recorded scenario holds only exchanges the server made, and the run refuses one that a canned exchange answered, and an API response without the `x-dfo-trace-id` header the server sends on every response but a shared-cacheable one, marked `Cache-Control: public`, whose `cache-control` header the record then keeps. The validator refuses a recorded API response with neither. The record names the commit the server's responses name. It fails when the validator reports a problem or the binary bodies pass 5 MB. `--only` records the scenarios it names. `--offline` makes no request. Each recorded scenario's steps run again over its own exchanges and rewrite its `expect`, and each synthetic scenario is derived again from its parent, so a change to the outcome rules or to `client-codes.json` reaches the records without a recording: +Its `record` command runs every scenario against a base URL, dev's Cloud Run URL by default, which refuses anonymous callers, so a record against dev passes `--cloud-run-token` to send the gcloud account's Google ID token in `X-Serverless-Authorization` to the base URL's origin and to no other host. It checks each live answer still has the shape its scenario names, derives the synthetic scenarios from the fresh records with no request, and then runs the validator. A recorded scenario holds only exchanges the server made, and the run refuses one that a canned exchange answered, and an API response without the `x-dfo-trace-id` header the server sends on every response but a shared-cacheable one, marked `Cache-Control: public`, whose `cache-control` header the record then keeps. The validator refuses a recorded API response with neither. The record names the commit the server's responses name. It fails when the validator reports a problem or the binary bodies pass 5 MB. `--only` records the scenarios it names. `--offline` makes no request. Each recorded scenario's steps run again over its own exchanges and rewrite its `expect`, and each synthetic scenario is derived again from its parent, so a change to the outcome rules or to `client-codes.json` reaches the records without a recording: ```bash uv run tools/capture_client_contract.py record --offline --only answer-declined choose-refused-no-choice diff --git a/python/client-contract/src/dfo_client_contract/refs/ref-one-member.json b/python/client-contract/src/dfo_client_contract/refs/ref-one-member.json index e6a2563..acb0db4 100644 --- a/python/client-contract/src/dfo_client_contract/refs/ref-one-member.json +++ b/python/client-contract/src/dfo_client_contract/refs/ref-one-member.json @@ -8,12 +8,12 @@ "members": [ { "parts": [], - "sentence": "Gross disbursements to Kenya from 96 providers for official development assistance in 2022. Current US dollars · OECD DAC2a.", + "sentence": "Net disbursements to Kenya from 96 providers for official development assistance in 2022. Current US dollars · OECD DAC2a.", "spec": { - "spec_id": "spec_73897fdfb0206fcf27c5898b353348fb", + "spec_id": "spec_e14699f9dcd167f0211081a726ae1031", "definition": { "schema_version": 1, - "spec_id": "spec_73897fdfb0206fcf27c5898b353348fb", + "spec_id": "spec_e14699f9dcd167f0211081a726ae1031", "identity": { "shape": { "kind": "statvar_schema", @@ -45,7 +45,7 @@ }, { "binding": { - "ref": "Gross", + "ref": "Net", "state": "value" }, "property": "nettingBasis" @@ -65,9 +65,9 @@ } } }, - "content_version": "cv_2aa4cc2fd852cd9b84347c61d07d609a", + "content_version": "cv_574e68a18917407b0f5534cfc9ff001b", "artifact": { - "digest": "sha256:05d0cbf59e8dddd7162104bf8e2edc406fc402a0b8d0d971452d01b07b0ee426", + "digest": "sha256:7ef1038eb25d978077bb4f5b9c54e940052ccd2aedd3284e6fb9739f1deca1f4", "rendering": { "format": "parquet", "bundle": false diff --git a/python/client-contract/src/dfo_client_contract/scenarios/answer-candidate-specs-not-a-list.json b/python/client-contract/src/dfo_client_contract/scenarios/answer-candidate-specs-not-a-list.json index 00abc2b..69a5076 100644 --- a/python/client-contract/src/dfo_client_contract/scenarios/answer-candidate-specs-not-a-list.json +++ b/python/client-contract/src/dfo_client_contract/scenarios/answer-candidate-specs-not-a-list.json @@ -30,7 +30,7 @@ "status": 200, "headers": { "content-type": "application/json", - "x-dfo-trace-id": "2de415a9f27d4ce69e4f1eb97b5951af" + "x-dfo-trace-id": "b250c3db1b784b9fa66b8173b78a6c0f" }, "json": { "schema_version": 1, @@ -41,20 +41,21 @@ "extract_skipped": false }, "diagnostics": { - "engine_build": "d80df9f5fd598b7345255470932d202ee5d49942", - "trace_id": "2de415a9f27d4ce69e4f1eb97b5951af", + "engine_build": "ccb6617922c839ce3cd5615a3bbb65c70bfe1bde", + "trace_id": "b250c3db1b784b9fa66b8173b78a6c0f", "warnings": [], "timing_ms": { - "total": 4676, + "total": 28220, "by_step": { - "coverage": 1, - "extract": 1, - "cache_lookup": 0 + "coverage": 0, + "extract": 957, + "exclusion_read": 667, + "cache_lookup": 1 } }, "llm_usage": { - "input_tokens": 0, - "output_tokens": 0, + "input_tokens": 2796, + "output_tokens": 152, "cached_tokens": 0, "jev_input_tokens": 13359, "jev_output_tokens": 2855 @@ -65,33 +66,39 @@ "parts": [ { "variable_text": "mortality", - "warnings": [], + "warnings": [ + { + "code": "membership_unverified", + "severity": "warn", + "message": "the full set of series behind this answer could not be confirmed, so it uses the series the search found; a dataset made from it may hold different series." + } + ], "timing_ms": { - "total": 4672, + "total": 26613, "by_step": { - "recall": 1, + "recall": 4404, "phase_resolve_places": 0, "phase_check_entities": 0, "shape_arcs": 6, - "shape_probe": 120, + "shape_probe": 126, "shape_groups": 6, "shape_labels": 2, - "shape_admission": 1, + "shape_admission": 2, "phase_derive_shapes": 0, - "shape": 258, + "shape": 238, "phase_prune_and_rank": 0, - "bind": 154, - "phase_bind": 18, + "bind": 145, + "phase_bind": 25, "phase_settle": 1, - "phase_place_bindings": 39, + "phase_place_bindings": 7249, "phase_facet_requests": 0, - "materialise": 202, - "phase_materialise": 33, - "answer": 30, - "phase_outcome": 3936 + "materialise": 1955, + "phase_materialise": 113, + "answer": 1043, + "phase_outcome": 11440 } }, - "rendered_sentence": "2 readings. Kenya's deaths rate per capita. World Development Indicators · 2013 to 2022. Kenya's number of deaths. Kenya Census · 2018 to 2022.", + "rendered_sentence": "2 readings. Kenya's deaths rate per 1,000 people. World Development Indicators · 2013 to 2022. Kenya's number of deaths. Kenya Census · 2018 to 2022.", "sentence_plan": [ { "kind": "text", @@ -144,7 +151,7 @@ }, { "kind": "text", - "text": "per capita", + "text": "per 1,000 people", "segment": "heading", "entity_refs": [], "states": [] @@ -623,7 +630,7 @@ "source": "observed" } ], - "rendered_sentence": "Kenya's deaths rate per capita, 2013 to 2022. World Development Indicators.", + "rendered_sentence": "Kenya's deaths rate per 1,000 people, 2013 to 2022. World Development Indicators.", "sentence_plan": [ { "kind": "slot", @@ -668,11 +675,14 @@ }, { "kind": "slot", - "text": "per capita", + "text": "per 1,000 people", "axis": "unit", "segment": "heading", + "binding_ref": "unit:", "entity_refs": [], - "states": [] + "states": [ + "unit:" + ] }, { "kind": "slot", @@ -810,7 +820,7 @@ "start_year": 2013, "end_year": 2022 }, - "capability_version": "cap_765c9d2a0c7529b9", + "capability_version": "cap_4913302d7a6b6435", "default_reading": { "applied": true, "removed_stat_vars": [] @@ -819,7 +829,8 @@ "confidence": "high", "available_at_place": true, "measure_label_axes": [], - "measure_axis_values": [] + "measure_axis_values": [], + "published_tables": "World Development Indicators" } }, "1": { @@ -992,7 +1003,7 @@ "label": "data source" } ], - "member_count": 2978, + "member_count": 10, "refine_supported": true, "data_commons": [ { @@ -1171,9 +1182,8 @@ ], "unresolved_slots": [], "stat_vars": { - "member_count": 37, + "member_count": 1, "member_count_exact": false, - "served_count": 1, "data_date_range": { "start": "2018", "end": "2022" @@ -2362,7 +2372,7 @@ "start_year": 2013, "end_year": 2022 }, - "capability_version": "cap_765c9d2a0c7529b9", + "capability_version": "cap_4913302d7a6b6435", "default_reading": { "applied": true, "removed_stat_vars": [] @@ -2372,7 +2382,8 @@ "basis": "structural", "available_at_place": true, "measure_label_axes": [], - "measure_axis_values": [] + "measure_axis_values": [], + "published_tables": "Kenya Census" } } }, @@ -2384,7 +2395,7 @@ } } ], - "rendered_sentence": "2 readings. Kenya's deaths rate per capita. World Development Indicators · 2013 to 2022. Kenya's number of deaths. Kenya Census · 2018 to 2022.", + "rendered_sentence": "2 readings. Kenya's deaths rate per 1,000 people. World Development Indicators · 2013 to 2022. Kenya's number of deaths. Kenya Census · 2018 to 2022.", "sentence_plan": [ { "kind": "text", @@ -2444,7 +2455,7 @@ }, { "kind": "text", - "text": "per capita", + "text": "per 1,000 people", "segment": "heading", "entity_refs": [], "states": [], @@ -2597,7 +2608,7 @@ "error": { "class": "ContractError", "code": "contract_violation", - "trace_id": "2de415a9f27d4ce69e4f1eb97b5951af" + "trace_id": "b250c3db1b784b9fa66b8173b78a6c0f" } } ] diff --git a/python/client-contract/src/dfo_client_contract/scenarios/answer-candidates-choose-fetch.json b/python/client-contract/src/dfo_client_contract/scenarios/answer-candidates-choose-fetch.json index 6da0d9d..d5f6b3f 100644 --- a/python/client-contract/src/dfo_client_contract/scenarios/answer-candidates-choose-fetch.json +++ b/python/client-contract/src/dfo_client_contract/scenarios/answer-candidates-choose-fetch.json @@ -5,8 +5,8 @@ "origin": { "kind": "recorded", "base_url": "https://dfo-dev-apis-zms5lj4zhq-nn.a.run.app/api", - "dfo_commit": "d80df9f5fd598b7345255470932d202ee5d49942", - "recorded_at": "2026-10-26T09:22:01Z" + "dfo_commit": "ccb6617922c839ce3cd5615a3bbb65c70bfe1bde", + "recorded_at": "2026-11-01T07:35:53Z" }, "call": [ { @@ -38,7 +38,7 @@ "status": 200, "headers": { "content-type": "application/json", - "x-dfo-trace-id": "2de415a9f27d4ce69e4f1eb97b5951af" + "x-dfo-trace-id": "b250c3db1b784b9fa66b8173b78a6c0f" }, "json": { "schema_version": 1, @@ -49,20 +49,21 @@ "extract_skipped": false }, "diagnostics": { - "engine_build": "d80df9f5fd598b7345255470932d202ee5d49942", - "trace_id": "2de415a9f27d4ce69e4f1eb97b5951af", + "engine_build": "ccb6617922c839ce3cd5615a3bbb65c70bfe1bde", + "trace_id": "b250c3db1b784b9fa66b8173b78a6c0f", "warnings": [], "timing_ms": { - "total": 4676, + "total": 28220, "by_step": { - "coverage": 1, - "extract": 1, - "cache_lookup": 0 + "coverage": 0, + "extract": 957, + "exclusion_read": 667, + "cache_lookup": 1 } }, "llm_usage": { - "input_tokens": 0, - "output_tokens": 0, + "input_tokens": 2796, + "output_tokens": 152, "cached_tokens": 0, "jev_input_tokens": 13359, "jev_output_tokens": 2855 @@ -73,33 +74,39 @@ "parts": [ { "variable_text": "mortality", - "warnings": [], + "warnings": [ + { + "code": "membership_unverified", + "severity": "warn", + "message": "the full set of series behind this answer could not be confirmed, so it uses the series the search found; a dataset made from it may hold different series." + } + ], "timing_ms": { - "total": 4672, + "total": 26613, "by_step": { - "recall": 1, + "recall": 4404, "phase_resolve_places": 0, "phase_check_entities": 0, "shape_arcs": 6, - "shape_probe": 120, + "shape_probe": 126, "shape_groups": 6, "shape_labels": 2, - "shape_admission": 1, + "shape_admission": 2, "phase_derive_shapes": 0, - "shape": 258, + "shape": 238, "phase_prune_and_rank": 0, - "bind": 154, - "phase_bind": 18, + "bind": 145, + "phase_bind": 25, "phase_settle": 1, - "phase_place_bindings": 39, + "phase_place_bindings": 7249, "phase_facet_requests": 0, - "materialise": 202, - "phase_materialise": 33, - "answer": 30, - "phase_outcome": 3936 + "materialise": 1955, + "phase_materialise": 113, + "answer": 1043, + "phase_outcome": 11440 } }, - "rendered_sentence": "2 readings. Kenya's deaths rate per capita. World Development Indicators · 2013 to 2022. Kenya's number of deaths. Kenya Census · 2018 to 2022.", + "rendered_sentence": "2 readings. Kenya's deaths rate per 1,000 people. World Development Indicators · 2013 to 2022. Kenya's number of deaths. Kenya Census · 2018 to 2022.", "sentence_plan": [ { "kind": "text", @@ -152,7 +159,7 @@ }, { "kind": "text", - "text": "per capita", + "text": "per 1,000 people", "segment": "heading", "entity_refs": [], "states": [] @@ -631,7 +638,7 @@ "source": "observed" } ], - "rendered_sentence": "Kenya's deaths rate per capita, 2013 to 2022. World Development Indicators.", + "rendered_sentence": "Kenya's deaths rate per 1,000 people, 2013 to 2022. World Development Indicators.", "sentence_plan": [ { "kind": "slot", @@ -676,11 +683,14 @@ }, { "kind": "slot", - "text": "per capita", + "text": "per 1,000 people", "axis": "unit", "segment": "heading", + "binding_ref": "unit:", "entity_refs": [], - "states": [] + "states": [ + "unit:" + ] }, { "kind": "slot", @@ -818,7 +828,7 @@ "start_year": 2013, "end_year": 2022 }, - "capability_version": "cap_765c9d2a0c7529b9", + "capability_version": "cap_4913302d7a6b6435", "default_reading": { "applied": true, "removed_stat_vars": [] @@ -827,7 +837,8 @@ "confidence": "high", "available_at_place": true, "measure_label_axes": [], - "measure_axis_values": [] + "measure_axis_values": [], + "published_tables": "World Development Indicators" } }, { @@ -1000,7 +1011,7 @@ "label": "data source" } ], - "member_count": 2978, + "member_count": 10, "refine_supported": true, "data_commons": [ { @@ -1179,9 +1190,8 @@ ], "unresolved_slots": [], "stat_vars": { - "member_count": 37, + "member_count": 1, "member_count_exact": false, - "served_count": 1, "data_date_range": { "start": "2018", "end": "2022" @@ -2370,7 +2380,7 @@ "start_year": 2013, "end_year": 2022 }, - "capability_version": "cap_765c9d2a0c7529b9", + "capability_version": "cap_4913302d7a6b6435", "default_reading": { "applied": true, "removed_stat_vars": [] @@ -2380,7 +2390,8 @@ "basis": "structural", "available_at_place": true, "measure_label_axes": [], - "measure_axis_values": [] + "measure_axis_values": [], + "published_tables": "Kenya Census" } } ], @@ -2392,7 +2403,7 @@ } } ], - "rendered_sentence": "2 readings. Kenya's deaths rate per capita. World Development Indicators · 2013 to 2022. Kenya's number of deaths. Kenya Census · 2018 to 2022.", + "rendered_sentence": "2 readings. Kenya's deaths rate per 1,000 people. World Development Indicators · 2013 to 2022. Kenya's number of deaths. Kenya Census · 2018 to 2022.", "sentence_plan": [ { "kind": "text", @@ -2452,7 +2463,7 @@ }, { "kind": "text", - "text": "per capita", + "text": "per 1,000 people", "segment": "heading", "entity_refs": [], "states": [], @@ -2651,7 +2662,7 @@ "status": 200, "headers": { "content-type": "application/json", - "x-dfo-trace-id": "97f100748b194ca09afc06c9dc1ac81d" + "x-dfo-trace-id": "50796872852647b9830003fca9213a89" }, "json": { "schema_version": 1, @@ -2660,11 +2671,11 @@ "extract_skipped": true }, "diagnostics": { - "engine_build": "d80df9f5fd598b7345255470932d202ee5d49942", - "trace_id": "97f100748b194ca09afc06c9dc1ac81d", + "engine_build": "ccb6617922c839ce3cd5615a3bbb65c70bfe1bde", + "trace_id": "50796872852647b9830003fca9213a89", "warnings": [], "timing_ms": { - "total": 345, + "total": 1601, "by_step": { "coverage": 0 } @@ -2677,19 +2688,39 @@ "variable_text": "mortality", "warnings": [], "timing_ms": { - "total": 284, + "total": 1298, "by_step": { - "validate": 0, - "walk": 0, + "validate": 1, + "phase_validate": 0, + "walk": 510, "reread_arcs": 0, + "phase_reread_arcs": 0, "detect_edits": 0, + "phase_detect_edits": 0, "resolve_survivors": 0, - "shape": 174, + "phase_resolve_survivors": 0, + "shape": 651, + "phase_build_shape": 0, "bind": 0, + "phase_build_bindings": 0, "where_places": 0, - "materialise": 107, - "answer": 2, - "options": 1 + "phase_where_places": 0, + "materialise": 10, + "phase_materialise": 0, + "ground_related": 12, + "ground_units": 0, + "ground_facets": 0, + "ground_convert": 0, + "answer": 1, + "ground_gates": 0, + "phase_ground_build": 2, + "finalize_preview": 0, + "options": 1, + "finalize_related": 110, + "finalize_wholes": 0, + "finalize_relaunch": 0, + "phase_finalize": 0, + "served_entry": 0 } }, "entity_refs": [], @@ -3024,7 +3055,7 @@ "source": "observed" } ], - "rendered_sentence": "Kenya's deaths rate per capita, 2013 to 2022. World Development Indicators.", + "rendered_sentence": "Kenya's deaths rate per 1,000 people, 2013 to 2022. World Development Indicators.", "sentence_plan": [ { "kind": "slot", @@ -3068,11 +3099,14 @@ }, { "kind": "slot", - "text": "per capita", + "text": "per 1,000 people", "axis": "unit", "segment": "heading", + "binding_ref": "unit:", "entity_refs": [], - "states": [] + "states": [ + "unit:" + ] }, { "kind": "slot", @@ -3208,12 +3242,13 @@ "start_year": 2013, "end_year": 2022 }, - "capability_version": "cap_765c9d2a0c7529b9" + "capability_version": "cap_4913302d7a6b6435" }, "confidence": "high", "available_at_place": true, "measure_label_axes": [], "measure_axis_values": [], + "published_tables": "World Development Indicators", "related_group": { "ref": "dc/g/MortalityEvent", "label": "Mortality Event" @@ -3254,7 +3289,7 @@ } } ], - "rendered_sentence": "Kenya's deaths rate per capita, 2013 to 2022. World Development Indicators.", + "rendered_sentence": "Kenya's deaths rate per 1,000 people, 2013 to 2022. World Development Indicators.", "sentence_plan": [ { "kind": "slot", @@ -3303,11 +3338,14 @@ }, { "kind": "slot", - "text": "per capita", + "text": "per 1,000 people", "axis": "unit", "segment": "heading", + "binding_ref": "unit:", "entity_refs": [], - "states": [], + "states": [ + "unit:" + ], "part_index": 0 }, { @@ -3430,7 +3468,7 @@ "status": 200, "headers": { "content-type": "application/json", - "x-dfo-trace-id": "1607014b90c1472db06c480ad25623d1" + "x-dfo-trace-id": "b6c465bacda941fda5a2501a028854ec" }, "json": { "schema_version": 1, @@ -3637,8 +3675,8 @@ "family_member_digest": "c090b56d31a596a8be16dafb518382db666c6b100a80534c3cb81dbfe3111c5d", "frame_grammar_version": "1.1.0", "origin_catalogue_build_id": "20261023T061534Z-06fa7b89", - "served_from": "head", - "confirmed_at": "2026-10-26T09:17:50.952592+00:00" + "served_from": "materialise", + "confirmed_at": "2026-11-01T07:36:31.090993+00:00" }, "warnings": [], "diagnostics": [ @@ -3677,7 +3715,7 @@ ], "series_count": 1, "output_options": { - "capability_version": "dset_76f5fa7244511c58", + "capability_version": "dset_5282a0674178a233", "columns": [ { "name": "stat_var", @@ -3754,7 +3792,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": false }, { "column": "observationAbout", @@ -3766,7 +3805,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": false }, { "column": "observationAbout", @@ -3778,7 +3818,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true }, { "column": "observationAbout", @@ -3790,7 +3831,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": false } ], "long_layout_defaults": [ @@ -3816,7 +3858,7 @@ ] } }, - "series_coverage_stamp": "e6e717ab8c77e84d010915893ede5809e9ecec67929a07cfafbcc2210edfa1eb", + "series_coverage_stamp": "ad27fd11738abb03d2d84dc214e223f04781609636cf678d0d08c385fb863d99", "retention": { "pinned": false, "held_until": "2026-11-22T17:34:00.253769Z" @@ -3834,7 +3876,7 @@ "headers": { "content-type": "text/html", "location": "https://storage.googleapis.com/dev-fin-observatory-datasets-working/sha256%3A38f1b5db24567c68f9791ac00bce803082c607f23c78688edf2d95e0778a070a?X-Goog-Signature=redacted", - "x-dfo-trace-id": "08870d34b30642f8b5dc651859af6425" + "x-dfo-trace-id": "2fa64ff5aca8449f9839b1d94443c428" } } }, @@ -3857,7 +3899,7 @@ "answer": { "kind": "resolution", "status": "candidates", - "sentence": "2 readings. Kenya's deaths rate per capita. World Development Indicators · 2013 to 2022. Kenya's number of deaths. Kenya Census · 2018 to 2022.", + "sentence": "2 readings. Kenya's deaths rate per 1,000 people. World Development Indicators · 2013 to 2022. Kenya's number of deaths. Kenya Census · 2018 to 2022.", "complete": false, "specs": [], "gaps": [ @@ -3873,7 +3915,7 @@ "answer": { "kind": "resolution", "status": "definite", - "sentence": "Kenya's deaths rate per capita, 2013 to 2022. World Development Indicators.", + "sentence": "Kenya's deaths rate per 1,000 people, 2013 to 2022. World Development Indicators.", "complete": true, "specs": [ "spec_10bf62f9687154286b463d206f03a086" @@ -3909,7 +3951,7 @@ ], "spec_id": "spec_10bf62f9687154286b463d206f03a086", "content_version": "cv_9834a942532e03aac3aa48f2cf731a4c", - "sentence": "Kenya's deaths rate per capita, 2013 to 2022. World Development Indicators." + "sentence": "Kenya's deaths rate per 1,000 people, 2013 to 2022. World Development Indicators." } ], "missing": [], diff --git a/python/client-contract/src/dfo_client_contract/scenarios/answer-catalogue.json b/python/client-contract/src/dfo_client_contract/scenarios/answer-catalogue.json index d55b3e7..9d79b55 100644 --- a/python/client-contract/src/dfo_client_contract/scenarios/answer-catalogue.json +++ b/python/client-contract/src/dfo_client_contract/scenarios/answer-catalogue.json @@ -5,8 +5,8 @@ "origin": { "kind": "recorded", "base_url": "https://dfo-dev-apis-zms5lj4zhq-nn.a.run.app/api", - "dfo_commit": "d80df9f5fd598b7345255470932d202ee5d49942", - "recorded_at": "2026-10-26T09:23:10Z" + "dfo_commit": "ccb6617922c839ce3cd5615a3bbb65c70bfe1bde", + "recorded_at": "2026-11-01T07:39:03Z" }, "call": [ { @@ -34,7 +34,7 @@ "status": 200, "headers": { "content-type": "application/json", - "x-dfo-trace-id": "f384c8a7105445ed8da7d4f21c168a64" + "x-dfo-trace-id": "a2c1f7531a0d49d1928113c1ccc2fa03" }, "json": { "schema_version": 1, @@ -45,22 +45,23 @@ "extract_skipped": false }, "diagnostics": { - "engine_build": "d80df9f5fd598b7345255470932d202ee5d49942", - "trace_id": "f384c8a7105445ed8da7d4f21c168a64", + "engine_build": "ccb6617922c839ce3cd5615a3bbb65c70bfe1bde", + "trace_id": "a2c1f7531a0d49d1928113c1ccc2fa03", "warnings": [], "timing_ms": { - "total": 969, + "total": 697, "by_step": { "coverage": 0, - "extract": 967, + "extract": 696, + "exclusion_read": 644, "entity_check": 0, "cache_lookup": 0 } }, "llm_usage": { - "input_tokens": 2227, - "output_tokens": 45, - "cached_tokens": 840 + "input_tokens": 2776, + "output_tokens": 50, + "cached_tokens": 0 }, "timed_out": false }, @@ -84,7 +85,7 @@ "error": { "class": "DeclinedError", "code": "answer_declined", - "trace_id": "f384c8a7105445ed8da7d4f21c168a64" + "trace_id": "a2c1f7531a0d49d1928113c1ccc2fa03" } } ] diff --git a/python/client-contract/src/dfo_client_contract/scenarios/answer-declined.json b/python/client-contract/src/dfo_client_contract/scenarios/answer-declined.json index 1e7c21c..83875b0 100644 --- a/python/client-contract/src/dfo_client_contract/scenarios/answer-declined.json +++ b/python/client-contract/src/dfo_client_contract/scenarios/answer-declined.json @@ -5,8 +5,8 @@ "origin": { "kind": "recorded", "base_url": "https://dfo-dev-apis-zms5lj4zhq-nn.a.run.app/api", - "dfo_commit": "d80df9f5fd598b7345255470932d202ee5d49942", - "recorded_at": "2026-10-26T09:23:09Z" + "dfo_commit": "ccb6617922c839ce3cd5615a3bbb65c70bfe1bde", + "recorded_at": "2026-11-01T07:39:02Z" }, "call": [ { @@ -34,7 +34,7 @@ "status": 200, "headers": { "content-type": "application/json", - "x-dfo-trace-id": "518bf1ffcf3d4739b1a9d866a0cab91a" + "x-dfo-trace-id": "32984221d8124bab90fe9fdae1b3ec30" }, "json": { "schema_version": 1, @@ -45,22 +45,23 @@ "extract_skipped": false }, "diagnostics": { - "engine_build": "d80df9f5fd598b7345255470932d202ee5d49942", - "trace_id": "518bf1ffcf3d4739b1a9d866a0cab91a", + "engine_build": "ccb6617922c839ce3cd5615a3bbb65c70bfe1bde", + "trace_id": "32984221d8124bab90fe9fdae1b3ec30", "warnings": [], "timing_ms": { - "total": 902, + "total": 816, "by_step": { "coverage": 0, - "extract": 901, + "extract": 815, + "exclusion_read": 788, "entity_check": 0, "cache_lookup": 0 } }, "llm_usage": { - "input_tokens": 2229, - "output_tokens": 64, - "cached_tokens": 840 + "input_tokens": 2780, + "output_tokens": 73, + "cached_tokens": 0 }, "timed_out": false }, @@ -90,7 +91,7 @@ "error": { "class": "DeclinedError", "code": "answer_declined", - "trace_id": "518bf1ffcf3d4739b1a9d866a0cab91a" + "trace_id": "32984221d8124bab90fe9fdae1b3ec30" } } ] diff --git a/python/client-contract/src/dfo_client_contract/scenarios/answer-definite-fetch.json b/python/client-contract/src/dfo_client_contract/scenarios/answer-definite-fetch.json index 7d66613..3bee37a 100644 --- a/python/client-contract/src/dfo_client_contract/scenarios/answer-definite-fetch.json +++ b/python/client-contract/src/dfo_client_contract/scenarios/answer-definite-fetch.json @@ -5,8 +5,8 @@ "origin": { "kind": "recorded", "base_url": "https://dfo-dev-apis-zms5lj4zhq-nn.a.run.app/api", - "dfo_commit": "d80df9f5fd598b7345255470932d202ee5d49942", - "recorded_at": "2026-10-26T09:21:59Z" + "dfo_commit": "ccb6617922c839ce3cd5615a3bbb65c70bfe1bde", + "recorded_at": "2026-11-01T07:34:11Z" }, "call": [ { @@ -34,7 +34,7 @@ "status": 200, "headers": { "content-type": "application/json", - "x-dfo-trace-id": "c7cb40f3790f4a15a0ddcad0cc93c9bb" + "x-dfo-trace-id": "92a325e77a854c5daafa875164b5e23e" }, "json": { "schema_version": 1, @@ -42,23 +42,27 @@ "entry_path": "raw_text", "raw_query": "ODA disbursements from Germany to Nigeria for basic health care", "normalized_query": "ODA disbursements from Germany to Nigeria for basic health care", - "extract_skipped": true + "extract_skipped": false }, "diagnostics": { - "engine_build": "d80df9f5fd598b7345255470932d202ee5d49942", - "trace_id": "c7cb40f3790f4a15a0ddcad0cc93c9bb", + "engine_build": "ccb6617922c839ce3cd5615a3bbb65c70bfe1bde", + "trace_id": "92a325e77a854c5daafa875164b5e23e", "warnings": [], "timing_ms": { - "total": 3, + "total": 17540, "by_step": { "coverage": 0, - "response_cache_layer1": 1 + "extract": 1239, + "exclusion_read": 719, + "cache_lookup": 0 } }, "llm_usage": { - "input_tokens": 0, - "output_tokens": 0, - "cached_tokens": 0 + "input_tokens": 2784, + "output_tokens": 111, + "cached_tokens": 0, + "jev_input_tokens": 6695, + "jev_output_tokens": 2088 }, "timed_out": false }, @@ -68,30 +72,30 @@ "variable_text": "ODA disbursements for basic health care", "warnings": [], "timing_ms": { - "total": 3011, + "total": 16265, "by_step": { - "recall": 457, + "recall": 2821, "phase_resolve_places": 0, "phase_check_entities": 0, "shape_arcs": 2, - "shape_probe_coverage": 8, - "shape_probe": 114, - "shape_groups": 579, + "shape_probe_coverage": 104, + "shape_probe": 352, + "shape_groups": 109, "shape_labels": 1, - "shape_admission": 2, + "shape_admission": 0, "phase_derive_shapes": 0, - "shape": 1247, + "shape": 1134, "phase_prune_and_rank": 0, - "bind": 266, - "phase_bind": 327, - "phase_settle": 46, - "phase_place_bindings": 57, + "bind": 5473, + "phase_bind": 345, + "phase_settle": 105, + "phase_place_bindings": 1078, "phase_facet_requests": 0, - "materialise": 44, - "phase_materialise": 200, - "answer": 220, - "options": 55, - "phase_outcome": 92 + "materialise": 2132, + "phase_materialise": 313, + "answer": 1829, + "options": 872, + "phase_outcome": 163 } }, "restatement": { @@ -538,7 +542,7 @@ "label": "OECD Terms and Conditions" } }, - "coverage_stamp": "e6e717ab8c77e84d010915893ede5809e9ecec67929a07cfafbcc2210edfa1eb", + "coverage_stamp": "ad27fd11738abb03d2d84dc214e223f04781609636cf678d0d08c385fb863d99", "facets": { "provenance": { "basis": "fallback", @@ -596,7 +600,7 @@ }, "relation": "child", "parent": "CRSCooperationModalityB", - "member_count": 1606, + "member_count": 1614, "served_rows": 1, "served_rows_exact": true }, @@ -610,7 +614,7 @@ }, "relation": "child", "parent": "CRSCooperationModalityB", - "member_count": 1331, + "member_count": 1337, "served_rows": 6, "served_rows_exact": true }, @@ -637,7 +641,7 @@ }, "relation": "child", "parent": "CRSCooperationModalityC", - "member_count": 7005, + "member_count": 7041, "served_rows": 7, "served_rows_exact": true }, @@ -733,7 +737,7 @@ }, "relation": "child", "parent": "CRSTypeOfFinance100", - "member_count": 12672, + "member_count": 12745, "served_rows": 30, "served_rows_exact": true } @@ -760,7 +764,7 @@ "value_kind": "enum_value" }, "relation": "root", - "member_count": 14098, + "member_count": 14146, "served_rows": 30, "served_rows_exact": true } @@ -1191,7 +1195,7 @@ "selected": [] } ], - "capability_version": "cap_765c9d2a0c7529b9", + "capability_version": "cap_4913302d7a6b6435", "default_reading": { "applied": true, "removed_stat_vars": [] @@ -1199,214 +1203,7 @@ }, "confidence": "high", "available_at_place": true, - "alternative_measures": [ - { - "definition": { - "schema_version": 1, - "spec_id": "spec_80b92ca1ba1114b426eb5e79b84361d4", - "identity": { - "identity_version": "spec1", - "shape": { - "kind": "statvar_schema", - "population_type": "FinancialFlow", - "measured_property": "amount", - "stat_type": "measuredValue", - "measurement_qualifier": "Nominal" - }, - "slots": [ - { - "property": "crsCooperationModality", - "binding": { - "state": "unbound" - } - }, - { - "property": "crsPurpose", - "binding": { - "state": "value", - "ref": "CRSPurposeCode12220" - } - }, - { - "property": "crsTypeOfFinance", - "binding": { - "state": "unbound" - } - }, - { - "property": "crsTypeOfFlow", - "binding": { - "state": "value", - "ref": "CRSTypeOfFlow10" - } - }, - { - "property": "financialFlowType", - "binding": { - "state": "value", - "ref": "Disbursement" - } - }, - { - "property": "nettingBasis", - "binding": { - "state": "value", - "ref": "Net" - } - } - ], - "entities": { - "destination": [ - "country/NGA" - ], - "origin": [ - "country/DEU" - ] - }, - "requested_window": { - "kind": "all" - } - } - }, - "label": "net disbursements", - "axis": "what", - "measure_axis_values": [ - { - "axis": "populationType", - "value": { - "ref": "FinancialFlow", - "label": "financial flow" - } - }, - { - "axis": "measuredProperty", - "value": { - "ref": "amount", - "label": "amount" - } - }, - { - "axis": "measurementQualifier", - "value": { - "ref": "Nominal", - "label": "nominal" - } - }, - { - "axis": "financialFlowType", - "value": { - "ref": "Disbursement", - "label": "disbursement" - } - }, - { - "axis": "nettingBasis", - "value": { - "ref": "Net", - "label": "net" - } - } - ], - "served_rows": 30, - "served_rows_exact": true - }, - { - "definition": { - "schema_version": 1, - "spec_id": "spec_c394f9108db2100f1c8e4532d8d1c804", - "identity": { - "identity_version": "spec1", - "shape": { - "kind": "statvar_schema", - "population_type": "FinancialObligation", - "measured_property": "amount", - "stat_type": "measuredValue", - "measurement_qualifier": "Nominal" - }, - "slots": [ - { - "property": "crsCooperationModality", - "binding": { - "state": "unbound" - } - }, - { - "property": "crsPurpose", - "binding": { - "state": "value", - "ref": "CRSPurposeCode12220" - } - }, - { - "property": "crsTypeOfFinance", - "binding": { - "state": "unbound" - } - }, - { - "property": "crsTypeOfFlow", - "binding": { - "state": "value", - "ref": "CRSTypeOfFlow10" - } - }, - { - "property": "financialObligationType", - "binding": { - "state": "value", - "ref": "Commitment" - } - } - ], - "entities": { - "destination": [ - "country/NGA" - ], - "origin": [ - "country/DEU" - ] - }, - "requested_window": { - "kind": "all" - } - } - }, - "label": "commitments", - "axis": "what", - "measure_axis_values": [ - { - "axis": "populationType", - "value": { - "ref": "FinancialObligation", - "label": "financial obligation" - } - }, - { - "axis": "measuredProperty", - "value": { - "ref": "amount", - "label": "amount" - } - }, - { - "axis": "measurementQualifier", - "value": { - "ref": "Nominal", - "label": "nominal" - } - }, - { - "axis": "financialObligationType", - "value": { - "ref": "Commitment", - "label": "commitment" - } - } - ], - "served_rows": 24, - "served_rows_exact": true - } - ], + "alternative_measures": [], "measure_label": "gross disbursements", "measure_label_axes": [ "populationType", @@ -1452,6 +1249,8 @@ } } ], + "concept_label": "basic health care", + "published_tables": "OECD Creditor Reporting System (CRS)", "open_axis_facts": [ { "property": "crsTypeOfFinance", @@ -3477,6 +3276,363 @@ "destination": "NGN", "origin": "EUR" } + }, + "scope_choices": { + "id": "spec_774d6c001a6250aa67ca676ab067895e", + "base": { + "schema_version": 1, + "spec_id": "spec_774d6c001a6250aa67ca676ab067895e", + "identity": { + "identity_version": "spec1", + "shape": { + "kind": "statvar_schema", + "population_type": "FinancialFlow", + "measured_property": "amount", + "stat_type": "measuredValue", + "measurement_qualifier": "Nominal" + }, + "slots": [ + { + "property": "crsCooperationModality", + "binding": { + "state": "unbound" + } + }, + { + "property": "crsPurpose", + "binding": { + "state": "value", + "ref": "CRSPurposeCode12220" + } + }, + { + "property": "crsTypeOfFinance", + "binding": { + "state": "unbound" + } + }, + { + "property": "crsTypeOfFlow", + "binding": { + "state": "value", + "ref": "CRSTypeOfFlow10" + } + }, + { + "property": "financialFlowType", + "binding": { + "state": "value", + "ref": "Disbursement" + } + }, + { + "property": "nettingBasis", + "binding": { + "state": "value", + "ref": "Gross" + } + } + ], + "entities": { + "destination": [ + "country/NGA" + ], + "origin": [ + "country/DEU" + ] + }, + "requested_window": { + "kind": "all" + } + } + }, + "rule_version": "scope1:3eef00a928eedd463ee48d02b79730da", + "entries": [ + { + "axis": "sector", + "option_id": "sector:12220", + "provenance": "explicit", + "origin": { + "kind": "text", + "text": "basic health care", + "start": 46, + "end": 63 + } + } + ], + "dropped_entries": [], + "choices": [ + { + "id": "spec_774d6c001a6250aa67ca676ab067895e:sector", + "axis": "sector", + "rule": "sector_code", + "provenance": "explicit", + "active": "sector:12220", + "options": [ + { + "option_id": "sector:12220", + "label": "basic health care (CRS 12220)", + "binding": { + "kind": "slot", + "slot": "crsPurpose", + "state": "value", + "refs": [ + "CRSPurposeCode12220" + ] + }, + "availability": { + "status": "available", + "detail": {} + } + } + ] + }, + { + "id": "spec_774d6c001a6250aa67ca676ab067895e:measure_basis", + "axis": "measure_basis", + "rule": "measure_basis_convention", + "provenance": "default", + "active": "measure_basis:gross", + "options": [ + { + "option_id": "measure_basis:gross", + "label": "gross disbursements, current USD", + "binding": { + "kind": "shape", + "measured_property": "amount", + "netting_basis": "Gross" + }, + "availability": { + "status": "available", + "detail": {} + } + }, + { + "option_id": "measure_basis:net", + "label": "net disbursements, current USD", + "binding": { + "kind": "shape", + "measured_property": "amount", + "netting_basis": "Net" + }, + "availability": { + "status": "available", + "detail": {} + } + }, + { + "option_id": "measure_basis:grant_equivalent", + "label": "grant equivalents (OECD headline), current USD", + "binding": { + "kind": "shape", + "measured_property": "grantEquivalent", + "netting_basis": null + }, + "availability": { + "status": "available", + "detail": {} + } + }, + { + "option_id": "measure_basis:commitments", + "label": "commitments, current USD", + "binding": { + "kind": "shape", + "measured_property": "amount", + "netting_basis": null + }, + "availability": { + "status": "available", + "detail": {} + } + } + ] + }, + { + "id": "spec_774d6c001a6250aa67ca676ab067895e:provider", + "axis": "provider", + "rule": "bilateral_flows", + "provenance": "default", + "active": "provider:bilateral", + "options": [ + { + "option_id": "provider:bilateral", + "label": "bilateral flows only", + "binding": { + "kind": "provider", + "scope": "bilateral" + }, + "availability": { + "status": "available", + "detail": {} + } + }, + { + "option_id": "provider:inclusive", + "label": "bilateral plus imputed multilateral, 2020 to 2024", + "binding": { + "kind": "provider", + "scope": "inclusive", + "window": [ + 2020, + 2024 + ], + "provenance": "provenance/ONEBilateralAndImputedMultilateral" + }, + "availability": { + "status": "partial", + "years": [ + [ + 2011, + 2016 + ], + [ + 2020, + 2024 + ] + ], + "code": "imputed_coverage", + "detail": {} + } + } + ] + } + ], + "compiled": { + "spec_id": "spec_774d6c001a6250aa67ca676ab067895e", + "identity": { + "identity_version": "spec1", + "shape": { + "kind": "statvar_schema", + "population_type": "FinancialFlow", + "measured_property": "amount", + "stat_type": "measuredValue", + "measurement_qualifier": "Nominal" + }, + "slots": [ + { + "property": "crsCooperationModality", + "binding": { + "state": "unbound" + } + }, + { + "property": "crsPurpose", + "binding": { + "state": "value", + "ref": "CRSPurposeCode12220" + } + }, + { + "property": "crsTypeOfFinance", + "binding": { + "state": "unbound" + } + }, + { + "property": "crsTypeOfFlow", + "binding": { + "state": "value", + "ref": "CRSTypeOfFlow10" + } + }, + { + "property": "financialFlowType", + "binding": { + "state": "value", + "ref": "Disbursement" + } + }, + { + "property": "nettingBasis", + "binding": { + "state": "value", + "ref": "Gross" + } + } + ], + "entities": { + "destination": [ + "country/NGA" + ], + "origin": [ + "country/DEU" + ] + }, + "requested_window": { + "kind": "all" + } + }, + "components": [ + { + "role": "whole", + "identity": { + "identity_version": "spec1", + "shape": { + "kind": "statvar_schema", + "population_type": "FinancialFlow", + "measured_property": "amount", + "stat_type": "measuredValue", + "measurement_qualifier": "Nominal" + }, + "slots": [ + { + "property": "crsCooperationModality", + "binding": { + "state": "unbound" + } + }, + { + "property": "crsPurpose", + "binding": { + "state": "value", + "ref": "CRSPurposeCode12220" + } + }, + { + "property": "crsTypeOfFinance", + "binding": { + "state": "unbound" + } + }, + { + "property": "crsTypeOfFlow", + "binding": { + "state": "value", + "ref": "CRSTypeOfFlow10" + } + }, + { + "property": "financialFlowType", + "binding": { + "state": "value", + "ref": "Disbursement" + } + }, + { + "property": "nettingBasis", + "binding": { + "state": "value", + "ref": "Gross" + } + } + ], + "entities": { + "destination": [ + "country/NGA" + ], + "origin": [ + "country/DEU" + ] + }, + "requested_window": { + "kind": "all" + } + } + } + ] + }, + "ledger": [] } } } @@ -3790,7 +3946,7 @@ "status": 200, "headers": { "content-type": "application/json", - "x-dfo-trace-id": "4c3f35c8c0d44b99941a73a9519b41d2" + "x-dfo-trace-id": "fff69a3d23f5431c8a34da1b72c9e034" }, "json": { "schema_version": 1, @@ -4190,8 +4346,8 @@ "family_member_digest": "9fd3643bbde505d9542fd3d090ddd549349765d12b6bad95b17271cbf297ea8c", "frame_grammar_version": "1.1.0", "origin_catalogue_build_id": "20261011T194155Z-80081f08", - "served_from": "head", - "confirmed_at": "2026-10-26T09:17:22.037029+00:00" + "served_from": "materialise", + "confirmed_at": "2026-11-01T07:35:51.549820+00:00" }, "warnings": [ { @@ -4221,7 +4377,7 @@ "created_at": "2026-10-23T16:56:32.058938+00:00", "tier": "working", "url": "/api/datasets/spec_774d6c001a6250aa67ca676ab067895e/cv_b92d94774702c7f05f2075d0b03dd756/files/sha256:421efacc2dc010af38112a087b0b49ff5539f61d2afd12a88272b27e99b5f5db", - "enrichment_stamp": "08ed6c734fc69ea2204a21f4e1dd8b963f14dd1e03a2484c618049ac2e2d93d8" + "enrichment_stamp": "55887b871f7aa1c5d120cb2bee97086605351d5acfbec645ab027f562d0f65c5" }, { "artifact_digest": "sha256:07984a96eaf8ee637fe15bf13f2b0d9160a6378d3fa1efae2e71cf0e20115dff", @@ -4237,7 +4393,7 @@ ], "series_count": 5, "output_options": { - "capability_version": "dset_76f5fa7244511c58", + "capability_version": "dset_5282a0674178a233", "columns": [ { "name": "stat_var", @@ -4320,7 +4476,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": false }, { "column": "financingProvider", @@ -4332,7 +4489,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": false }, { "column": "financingProvider", @@ -4344,7 +4502,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true }, { "column": "financingProvider", @@ -4356,7 +4515,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": false }, { "column": "financingProvider", @@ -4368,7 +4528,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true }, { "column": "financingProvider", @@ -4380,7 +4541,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true }, { "column": "financingProvider", @@ -4392,7 +4554,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true }, { "column": "financingRecipient", @@ -4404,7 +4567,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": false }, { "column": "financingRecipient", @@ -4416,7 +4580,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": false }, { "column": "financingRecipient", @@ -4428,7 +4593,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true }, { "column": "financingRecipient", @@ -4440,7 +4606,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": false }, { "column": "financingRecipient", @@ -4452,7 +4619,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true }, { "column": "financingRecipient", @@ -4464,7 +4632,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true }, { "column": "financingRecipient", @@ -4476,7 +4645,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true } ], "long_layout_defaults": [ @@ -4520,7 +4690,7 @@ ] } }, - "series_coverage_stamp": "e6e717ab8c77e84d010915893ede5809e9ecec67929a07cfafbcc2210edfa1eb", + "series_coverage_stamp": "ad27fd11738abb03d2d84dc214e223f04781609636cf678d0d08c385fb863d99", "retention": { "pinned": true } @@ -4537,7 +4707,7 @@ "headers": { "content-type": "text/html", "location": "https://storage.googleapis.com/dev-fin-observatory-datasets-working/sha256%3A421efacc2dc010af38112a087b0b49ff5539f61d2afd12a88272b27e99b5f5db?X-Goog-Signature=redacted", - "x-dfo-trace-id": "333ab72de55449ed8288a5f458406a4c" + "x-dfo-trace-id": "815c18c3e59945d6ade9f99db58f2960" } } }, diff --git a/python/client-contract/src/dfo_client_contract/scenarios/answer-definition-spec-id-mismatch.json b/python/client-contract/src/dfo_client_contract/scenarios/answer-definition-spec-id-mismatch.json index 5b84639..e5ad972 100644 --- a/python/client-contract/src/dfo_client_contract/scenarios/answer-definition-spec-id-mismatch.json +++ b/python/client-contract/src/dfo_client_contract/scenarios/answer-definition-spec-id-mismatch.json @@ -30,7 +30,7 @@ "status": 200, "headers": { "content-type": "application/json", - "x-dfo-trace-id": "c7cb40f3790f4a15a0ddcad0cc93c9bb" + "x-dfo-trace-id": "92a325e77a854c5daafa875164b5e23e" }, "json": { "schema_version": 1, @@ -38,23 +38,27 @@ "entry_path": "raw_text", "raw_query": "ODA disbursements from Germany to Nigeria for basic health care", "normalized_query": "ODA disbursements from Germany to Nigeria for basic health care", - "extract_skipped": true + "extract_skipped": false }, "diagnostics": { - "engine_build": "d80df9f5fd598b7345255470932d202ee5d49942", - "trace_id": "c7cb40f3790f4a15a0ddcad0cc93c9bb", + "engine_build": "ccb6617922c839ce3cd5615a3bbb65c70bfe1bde", + "trace_id": "92a325e77a854c5daafa875164b5e23e", "warnings": [], "timing_ms": { - "total": 3, + "total": 17540, "by_step": { "coverage": 0, - "response_cache_layer1": 1 + "extract": 1239, + "exclusion_read": 719, + "cache_lookup": 0 } }, "llm_usage": { - "input_tokens": 0, - "output_tokens": 0, - "cached_tokens": 0 + "input_tokens": 2784, + "output_tokens": 111, + "cached_tokens": 0, + "jev_input_tokens": 6695, + "jev_output_tokens": 2088 }, "timed_out": false }, @@ -64,30 +68,30 @@ "variable_text": "ODA disbursements for basic health care", "warnings": [], "timing_ms": { - "total": 3011, + "total": 16265, "by_step": { - "recall": 457, + "recall": 2821, "phase_resolve_places": 0, "phase_check_entities": 0, "shape_arcs": 2, - "shape_probe_coverage": 8, - "shape_probe": 114, - "shape_groups": 579, + "shape_probe_coverage": 104, + "shape_probe": 352, + "shape_groups": 109, "shape_labels": 1, - "shape_admission": 2, + "shape_admission": 0, "phase_derive_shapes": 0, - "shape": 1247, + "shape": 1134, "phase_prune_and_rank": 0, - "bind": 266, - "phase_bind": 327, - "phase_settle": 46, - "phase_place_bindings": 57, + "bind": 5473, + "phase_bind": 345, + "phase_settle": 105, + "phase_place_bindings": 1078, "phase_facet_requests": 0, - "materialise": 44, - "phase_materialise": 200, - "answer": 220, - "options": 55, - "phase_outcome": 92 + "materialise": 2132, + "phase_materialise": 313, + "answer": 1829, + "options": 872, + "phase_outcome": 163 } }, "restatement": { @@ -534,7 +538,7 @@ "label": "OECD Terms and Conditions" } }, - "coverage_stamp": "e6e717ab8c77e84d010915893ede5809e9ecec67929a07cfafbcc2210edfa1eb", + "coverage_stamp": "ad27fd11738abb03d2d84dc214e223f04781609636cf678d0d08c385fb863d99", "facets": { "provenance": { "basis": "fallback", @@ -592,7 +596,7 @@ }, "relation": "child", "parent": "CRSCooperationModalityB", - "member_count": 1606, + "member_count": 1614, "served_rows": 1, "served_rows_exact": true }, @@ -606,7 +610,7 @@ }, "relation": "child", "parent": "CRSCooperationModalityB", - "member_count": 1331, + "member_count": 1337, "served_rows": 6, "served_rows_exact": true }, @@ -633,7 +637,7 @@ }, "relation": "child", "parent": "CRSCooperationModalityC", - "member_count": 7005, + "member_count": 7041, "served_rows": 7, "served_rows_exact": true }, @@ -729,7 +733,7 @@ }, "relation": "child", "parent": "CRSTypeOfFinance100", - "member_count": 12672, + "member_count": 12745, "served_rows": 30, "served_rows_exact": true } @@ -756,7 +760,7 @@ "value_kind": "enum_value" }, "relation": "root", - "member_count": 14098, + "member_count": 14146, "served_rows": 30, "served_rows_exact": true } @@ -1187,7 +1191,7 @@ "selected": [] } ], - "capability_version": "cap_765c9d2a0c7529b9", + "capability_version": "cap_4913302d7a6b6435", "default_reading": { "applied": true, "removed_stat_vars": [] @@ -1195,214 +1199,7 @@ }, "confidence": "high", "available_at_place": true, - "alternative_measures": [ - { - "definition": { - "schema_version": 1, - "spec_id": "spec_80b92ca1ba1114b426eb5e79b84361d4", - "identity": { - "identity_version": "spec1", - "shape": { - "kind": "statvar_schema", - "population_type": "FinancialFlow", - "measured_property": "amount", - "stat_type": "measuredValue", - "measurement_qualifier": "Nominal" - }, - "slots": [ - { - "property": "crsCooperationModality", - "binding": { - "state": "unbound" - } - }, - { - "property": "crsPurpose", - "binding": { - "state": "value", - "ref": "CRSPurposeCode12220" - } - }, - { - "property": "crsTypeOfFinance", - "binding": { - "state": "unbound" - } - }, - { - "property": "crsTypeOfFlow", - "binding": { - "state": "value", - "ref": "CRSTypeOfFlow10" - } - }, - { - "property": "financialFlowType", - "binding": { - "state": "value", - "ref": "Disbursement" - } - }, - { - "property": "nettingBasis", - "binding": { - "state": "value", - "ref": "Net" - } - } - ], - "entities": { - "destination": [ - "country/NGA" - ], - "origin": [ - "country/DEU" - ] - }, - "requested_window": { - "kind": "all" - } - } - }, - "label": "net disbursements", - "axis": "what", - "measure_axis_values": [ - { - "axis": "populationType", - "value": { - "ref": "FinancialFlow", - "label": "financial flow" - } - }, - { - "axis": "measuredProperty", - "value": { - "ref": "amount", - "label": "amount" - } - }, - { - "axis": "measurementQualifier", - "value": { - "ref": "Nominal", - "label": "nominal" - } - }, - { - "axis": "financialFlowType", - "value": { - "ref": "Disbursement", - "label": "disbursement" - } - }, - { - "axis": "nettingBasis", - "value": { - "ref": "Net", - "label": "net" - } - } - ], - "served_rows": 30, - "served_rows_exact": true - }, - { - "definition": { - "schema_version": 1, - "spec_id": "spec_c394f9108db2100f1c8e4532d8d1c804", - "identity": { - "identity_version": "spec1", - "shape": { - "kind": "statvar_schema", - "population_type": "FinancialObligation", - "measured_property": "amount", - "stat_type": "measuredValue", - "measurement_qualifier": "Nominal" - }, - "slots": [ - { - "property": "crsCooperationModality", - "binding": { - "state": "unbound" - } - }, - { - "property": "crsPurpose", - "binding": { - "state": "value", - "ref": "CRSPurposeCode12220" - } - }, - { - "property": "crsTypeOfFinance", - "binding": { - "state": "unbound" - } - }, - { - "property": "crsTypeOfFlow", - "binding": { - "state": "value", - "ref": "CRSTypeOfFlow10" - } - }, - { - "property": "financialObligationType", - "binding": { - "state": "value", - "ref": "Commitment" - } - } - ], - "entities": { - "destination": [ - "country/NGA" - ], - "origin": [ - "country/DEU" - ] - }, - "requested_window": { - "kind": "all" - } - } - }, - "label": "commitments", - "axis": "what", - "measure_axis_values": [ - { - "axis": "populationType", - "value": { - "ref": "FinancialObligation", - "label": "financial obligation" - } - }, - { - "axis": "measuredProperty", - "value": { - "ref": "amount", - "label": "amount" - } - }, - { - "axis": "measurementQualifier", - "value": { - "ref": "Nominal", - "label": "nominal" - } - }, - { - "axis": "financialObligationType", - "value": { - "ref": "Commitment", - "label": "commitment" - } - } - ], - "served_rows": 24, - "served_rows_exact": true - } - ], + "alternative_measures": [], "measure_label": "gross disbursements", "measure_label_axes": [ "populationType", @@ -1448,6 +1245,8 @@ } } ], + "concept_label": "basic health care", + "published_tables": "OECD Creditor Reporting System (CRS)", "open_axis_facts": [ { "property": "crsTypeOfFinance", @@ -3473,6 +3272,363 @@ "destination": "NGN", "origin": "EUR" } + }, + "scope_choices": { + "id": "spec_774d6c001a6250aa67ca676ab067895e", + "base": { + "schema_version": 1, + "spec_id": "spec_774d6c001a6250aa67ca676ab067895e", + "identity": { + "identity_version": "spec1", + "shape": { + "kind": "statvar_schema", + "population_type": "FinancialFlow", + "measured_property": "amount", + "stat_type": "measuredValue", + "measurement_qualifier": "Nominal" + }, + "slots": [ + { + "property": "crsCooperationModality", + "binding": { + "state": "unbound" + } + }, + { + "property": "crsPurpose", + "binding": { + "state": "value", + "ref": "CRSPurposeCode12220" + } + }, + { + "property": "crsTypeOfFinance", + "binding": { + "state": "unbound" + } + }, + { + "property": "crsTypeOfFlow", + "binding": { + "state": "value", + "ref": "CRSTypeOfFlow10" + } + }, + { + "property": "financialFlowType", + "binding": { + "state": "value", + "ref": "Disbursement" + } + }, + { + "property": "nettingBasis", + "binding": { + "state": "value", + "ref": "Gross" + } + } + ], + "entities": { + "destination": [ + "country/NGA" + ], + "origin": [ + "country/DEU" + ] + }, + "requested_window": { + "kind": "all" + } + } + }, + "rule_version": "scope1:3eef00a928eedd463ee48d02b79730da", + "entries": [ + { + "axis": "sector", + "option_id": "sector:12220", + "provenance": "explicit", + "origin": { + "kind": "text", + "text": "basic health care", + "start": 46, + "end": 63 + } + } + ], + "dropped_entries": [], + "choices": [ + { + "id": "spec_774d6c001a6250aa67ca676ab067895e:sector", + "axis": "sector", + "rule": "sector_code", + "provenance": "explicit", + "active": "sector:12220", + "options": [ + { + "option_id": "sector:12220", + "label": "basic health care (CRS 12220)", + "binding": { + "kind": "slot", + "slot": "crsPurpose", + "state": "value", + "refs": [ + "CRSPurposeCode12220" + ] + }, + "availability": { + "status": "available", + "detail": {} + } + } + ] + }, + { + "id": "spec_774d6c001a6250aa67ca676ab067895e:measure_basis", + "axis": "measure_basis", + "rule": "measure_basis_convention", + "provenance": "default", + "active": "measure_basis:gross", + "options": [ + { + "option_id": "measure_basis:gross", + "label": "gross disbursements, current USD", + "binding": { + "kind": "shape", + "measured_property": "amount", + "netting_basis": "Gross" + }, + "availability": { + "status": "available", + "detail": {} + } + }, + { + "option_id": "measure_basis:net", + "label": "net disbursements, current USD", + "binding": { + "kind": "shape", + "measured_property": "amount", + "netting_basis": "Net" + }, + "availability": { + "status": "available", + "detail": {} + } + }, + { + "option_id": "measure_basis:grant_equivalent", + "label": "grant equivalents (OECD headline), current USD", + "binding": { + "kind": "shape", + "measured_property": "grantEquivalent", + "netting_basis": null + }, + "availability": { + "status": "available", + "detail": {} + } + }, + { + "option_id": "measure_basis:commitments", + "label": "commitments, current USD", + "binding": { + "kind": "shape", + "measured_property": "amount", + "netting_basis": null + }, + "availability": { + "status": "available", + "detail": {} + } + } + ] + }, + { + "id": "spec_774d6c001a6250aa67ca676ab067895e:provider", + "axis": "provider", + "rule": "bilateral_flows", + "provenance": "default", + "active": "provider:bilateral", + "options": [ + { + "option_id": "provider:bilateral", + "label": "bilateral flows only", + "binding": { + "kind": "provider", + "scope": "bilateral" + }, + "availability": { + "status": "available", + "detail": {} + } + }, + { + "option_id": "provider:inclusive", + "label": "bilateral plus imputed multilateral, 2020 to 2024", + "binding": { + "kind": "provider", + "scope": "inclusive", + "window": [ + 2020, + 2024 + ], + "provenance": "provenance/ONEBilateralAndImputedMultilateral" + }, + "availability": { + "status": "partial", + "years": [ + [ + 2011, + 2016 + ], + [ + 2020, + 2024 + ] + ], + "code": "imputed_coverage", + "detail": {} + } + } + ] + } + ], + "compiled": { + "spec_id": "spec_774d6c001a6250aa67ca676ab067895e", + "identity": { + "identity_version": "spec1", + "shape": { + "kind": "statvar_schema", + "population_type": "FinancialFlow", + "measured_property": "amount", + "stat_type": "measuredValue", + "measurement_qualifier": "Nominal" + }, + "slots": [ + { + "property": "crsCooperationModality", + "binding": { + "state": "unbound" + } + }, + { + "property": "crsPurpose", + "binding": { + "state": "value", + "ref": "CRSPurposeCode12220" + } + }, + { + "property": "crsTypeOfFinance", + "binding": { + "state": "unbound" + } + }, + { + "property": "crsTypeOfFlow", + "binding": { + "state": "value", + "ref": "CRSTypeOfFlow10" + } + }, + { + "property": "financialFlowType", + "binding": { + "state": "value", + "ref": "Disbursement" + } + }, + { + "property": "nettingBasis", + "binding": { + "state": "value", + "ref": "Gross" + } + } + ], + "entities": { + "destination": [ + "country/NGA" + ], + "origin": [ + "country/DEU" + ] + }, + "requested_window": { + "kind": "all" + } + }, + "components": [ + { + "role": "whole", + "identity": { + "identity_version": "spec1", + "shape": { + "kind": "statvar_schema", + "population_type": "FinancialFlow", + "measured_property": "amount", + "stat_type": "measuredValue", + "measurement_qualifier": "Nominal" + }, + "slots": [ + { + "property": "crsCooperationModality", + "binding": { + "state": "unbound" + } + }, + { + "property": "crsPurpose", + "binding": { + "state": "value", + "ref": "CRSPurposeCode12220" + } + }, + { + "property": "crsTypeOfFinance", + "binding": { + "state": "unbound" + } + }, + { + "property": "crsTypeOfFlow", + "binding": { + "state": "value", + "ref": "CRSTypeOfFlow10" + } + }, + { + "property": "financialFlowType", + "binding": { + "state": "value", + "ref": "Disbursement" + } + }, + { + "property": "nettingBasis", + "binding": { + "state": "value", + "ref": "Gross" + } + } + ], + "entities": { + "destination": [ + "country/NGA" + ], + "origin": [ + "country/DEU" + ] + }, + "requested_window": { + "kind": "all" + } + } + } + ] + }, + "ledger": [] } } } @@ -3704,7 +3860,7 @@ "error": { "class": "ContractError", "code": "contract_violation", - "trace_id": "c7cb40f3790f4a15a0ddcad0cc93c9bb" + "trace_id": "92a325e77a854c5daafa875164b5e23e" } } ] diff --git a/python/client-contract/src/dfo_client_contract/scenarios/answer-empty-parts.json b/python/client-contract/src/dfo_client_contract/scenarios/answer-empty-parts.json index 7b3098b..383b5a9 100644 --- a/python/client-contract/src/dfo_client_contract/scenarios/answer-empty-parts.json +++ b/python/client-contract/src/dfo_client_contract/scenarios/answer-empty-parts.json @@ -30,7 +30,7 @@ "status": 200, "headers": { "content-type": "application/json", - "x-dfo-trace-id": "01cf4a9623c449759f24d249f8783de1" + "x-dfo-trace-id": "1d05424fb2784068acf168d73a67c0d0" }, "json": { "schema_version": 1, @@ -41,21 +41,22 @@ "extract_skipped": false }, "diagnostics": { - "engine_build": "d80df9f5fd598b7345255470932d202ee5d49942", - "trace_id": "01cf4a9623c449759f24d249f8783de1", + "engine_build": "ccb6617922c839ce3cd5615a3bbb65c70bfe1bde", + "trace_id": "1d05424fb2784068acf168d73a67c0d0", "warnings": [], "timing_ms": { - "total": 1162, + "total": 1946, "by_step": { "coverage": 0, - "extract": 1040, + "extract": 1070, + "exclusion_read": 606, "cache_lookup": 0 } }, "llm_usage": { - "input_tokens": 2233, - "output_tokens": 193, - "cached_tokens": 841 + "input_tokens": 2788, + "output_tokens": 202, + "cached_tokens": 0 }, "timed_out": false }, @@ -101,7 +102,7 @@ "error": { "class": "ContractError", "code": "contract_violation", - "trace_id": "01cf4a9623c449759f24d249f8783de1" + "trace_id": "1d05424fb2784068acf168d73a67c0d0" } } ] diff --git a/python/client-contract/src/dfo_client_contract/scenarios/answer-folded-parts-unnamed.json b/python/client-contract/src/dfo_client_contract/scenarios/answer-folded-parts-unnamed.json index 9a7302c..a5a841e 100644 --- a/python/client-contract/src/dfo_client_contract/scenarios/answer-folded-parts-unnamed.json +++ b/python/client-contract/src/dfo_client_contract/scenarios/answer-folded-parts-unnamed.json @@ -33,7 +33,7 @@ "status": 200, "headers": { "content-type": "application/json", - "x-dfo-trace-id": "5e0f0d6a5a6442a38932b02d7f72ed6c" + "x-dfo-trace-id": "c58dd2d53f1d4340a3f1fcb4c72681c5" }, "json": { "schema_version": 1, @@ -41,23 +41,27 @@ "entry_path": "raw_text", "raw_query": "ODA disbursements for health and for education from Germany to Kenya, and GDP of Kenya", "normalized_query": "ODA disbursements for health and for education from Germany to Kenya, and GDP of Kenya", - "extract_skipped": true + "extract_skipped": false }, "diagnostics": { - "engine_build": "d80df9f5fd598b7345255470932d202ee5d49942", - "trace_id": "5e0f0d6a5a6442a38932b02d7f72ed6c", + "engine_build": "ccb6617922c839ce3cd5615a3bbb65c70bfe1bde", + "trace_id": "c58dd2d53f1d4340a3f1fcb4c72681c5", "warnings": [], "timing_ms": { - "total": 8, + "total": 6877, "by_step": { "coverage": 0, - "response_cache_layer1": 1 + "extract": 1225, + "exclusion_read": 636, + "cache_lookup": 0 } }, "llm_usage": { - "input_tokens": 0, - "output_tokens": 0, - "cached_tokens": 0 + "input_tokens": 2796, + "output_tokens": 224, + "cached_tokens": 0, + "jev_input_tokens": 25826, + "jev_output_tokens": 5796 }, "timed_out": false }, @@ -66,30 +70,30 @@ { "warnings": [], "timing_ms": { - "total": 4401, + "total": 4245, "by_step": { - "recall": 1271, + "recall": 1975, "phase_resolve_places": 0, "phase_check_entities": 0, - "shape_arcs": 108, - "shape_probe_coverage": 4, - "shape_probe": 113, - "shape_groups": 72, - "shape_labels": 12, - "shape_admission": 0, + "shape_arcs": 1, + "shape_probe_coverage": 5, + "shape_probe": 116, + "shape_groups": 62, + "shape_labels": 11, + "shape_admission": 1, "phase_derive_shapes": 0, - "shape": 524, + "shape": 280, "phase_prune_and_rank": 0, - "bind": 482, - "phase_bind": 205, - "phase_settle": 57, - "phase_place_bindings": 34, + "bind": 227, + "phase_bind": 195, + "phase_settle": 82, + "phase_place_bindings": 31, "phase_facet_requests": 0, - "materialise": 686, - "phase_materialise": 225, - "answer": 28, - "options": 685, - "phase_outcome": 204 + "materialise": 858, + "phase_materialise": 171, + "answer": 78, + "options": 214, + "phase_outcome": 134 } }, "restatement": { @@ -126,10 +130,10 @@ "assumptions": [], "status": "definite", "spec": { - "spec_id": "spec_25f482395c5d012ec278118f38dff29c", + "spec_id": "spec_7a02b6facd2dc17b5d0d7c35c11bf5d2", "definition": { "schema_version": 1, - "spec_id": "spec_25f482395c5d012ec278118f38dff29c", + "spec_id": "spec_7a02b6facd2dc17b5d0d7c35c11bf5d2", "identity": { "identity_version": "spec1", "shape": { @@ -152,7 +156,8 @@ "state": "set", "refs": [ "CRSPurposeCode110", - "CRSPurposeCode120" + "CRSPurposeCode120", + "CRSPurposeCode130" ] } }, @@ -200,7 +205,7 @@ "resolved": { "shape": { "shape_id": "financialflow_amount_measuredvalue_nominal", - "label": "gross disbursements (official development assistance)", + "label": "gross disbursements (education, health and population policy, programme, and reproductive health, official development assistance)", "population_type": { "ref": "FinancialFlow", "label": "financial flow" @@ -280,8 +285,8 @@ "label": "data source" } ], - "member_count": 545, - "member_digest": "0c7508fd1997d6cdc896f2eab0f092a4915cfca9e2400eb9577bb22b527fe882", + "member_count": 634, + "member_digest": "5c91c0a8d90f4619a1ff7122cacdc8b0bc48b22c70516d7673aec42caf6da0d4", "refine_supported": true, "data_commons": [ { @@ -316,6 +321,13 @@ "label": "health" }, "value_kind": "enum_value" + }, + { + "ref": { + "ref": "CRSPurposeCode130", + "label": "population policy, programme, and reproductive health" + }, + "value_kind": "enum_value" } ] }, @@ -408,6 +420,26 @@ { "ref": "CRSPurposeCode12382", "label": "research for noncommunicable disease prevention and control" + }, + { + "ref": "CRSPurposeCode13010", + "label": "population policy and administrative management" + }, + { + "ref": "CRSPurposeCode13020", + "label": "reproductive health care" + }, + { + "ref": "CRSPurposeCode13030", + "label": "family planning" + }, + { + "ref": "CRSPurposeCode13040", + "label": "sexually transmitted disease control" + }, + { + "ref": "CRSPurposeCode13081", + "label": "personnel development for population and reproductive health" } ] }, @@ -547,9 +579,9 @@ ], "unresolved_slots": [], "stat_vars": { - "member_count": 108, + "member_count": 123, "member_count_exact": true, - "served_count": 545, + "served_count": 634, "data_date_range": { "start": "1997", "end": "2024" @@ -579,15 +611,21 @@ }, { "label": "observations", - "count": 12 + "count": 19 }, { "label": "variables", - "count": 51 + "count": 66 } ] }, "facets": { + "unit": { + "basis": "fallback", + "ref": "CurrencyUSD", + "label": "US Dollar", + "currency": "USD" + }, "provenance": { "basis": "fallback", "ref": "provenance/OECDCreditorReportingSystem", @@ -602,12 +640,6 @@ }, "documentation": "/api/graph/documentation/provenance/OECDCreditorReportingSystem", "account": "provider" - }, - "unit": { - "basis": "fallback", - "ref": "CurrencyUSD", - "label": "US Dollar", - "currency": "USD" } }, "slot_options": [ @@ -624,45 +656,85 @@ { "value": { "ref": { - "ref": "CRSPurposeCode121", - "label": "general health" + "ref": "CRSPurposeCode998", + "label": "unallocated and unspecified" + }, + "value_kind": "enum_value" + }, + "relation": "root", + "member_count": 76, + "served_rows": 74, + "served_rows_exact": true + }, + { + "value": { + "ref": { + "ref": "CRSPurposeCode99810", + "label": "sectors not specified" }, "value_kind": "enum_value" }, "relation": "child", - "parent": "CRSPurposeCode120", - "member_count": 6, - "served_rows": 82, + "parent": "CRSPurposeCode998", + "member_count": 255, + "served_rows": 71, "served_rows_exact": true }, { "value": { "ref": { - "ref": "CRSPurposeCode122", - "label": "basic health" + "ref": "CRSPurposeCode99820", + "label": "non-sector allocable promotion of development awareness" }, "value_kind": "enum_value" }, "relation": "child", - "parent": "CRSPurposeCode120", - "member_count": 4, - "served_rows": 108, + "parent": "CRSPurposeCode998", + "member_count": 77, + "served_rows": 3, + "served_rows_exact": true + }, + { + "value": { + "ref": { + "ref": "CRSPurposeCode600", + "label": "action relating to debt" + }, + "value_kind": "enum_value" + }, + "relation": "root", + "member_count": 21, + "served_rows": 9, "served_rows_exact": true }, { "value": { "ref": { - "ref": "CRSPurposeCode123", - "label": "noncommunicable disease" + "ref": "CRSPurposeCode60020", + "label": "debt forgiveness" }, "value_kind": "enum_value" }, "relation": "child", - "parent": "CRSPurposeCode120", - "member_count": 3, + "parent": "CRSPurposeCode600", + "member_count": 75, "served_rows": 4, "served_rows_exact": true }, + { + "value": { + "ref": { + "ref": "CRSPurposeCode60040", + "label": "rescheduling and refinancing" + }, + "value_kind": "enum_value" + }, + "relation": "child", + "parent": "CRSPurposeCode600", + "member_count": 54, + "served_rows": 5, + "served_rows_exact": true + }, { "value": { "ref": { @@ -671,7 +743,7 @@ }, "value_kind": "enum_value" }, - "relation": "parent", + "relation": "root", "member_count": 13, "served_rows": 1214, "served_rows_exact": true @@ -679,360 +751,760 @@ { "value": { "ref": { - "ref": "CRSPurposeCode111", - "label": "unspecified-level education" + "ref": "CRSPurposeCode140", + "label": "water supply and sanitation" }, "value_kind": "enum_value" }, "relation": "child", - "parent": "CRSPurposeCode110", - "member_count": 6, - "served_rows": 78, + "parent": "CRSPurposeCode100", + "member_count": 10, + "served_rows": 275, "served_rows_exact": true }, { "value": { "ref": { - "ref": "CRSPurposeCode112", - "label": "basic education" + "ref": "CRSPurposeCode110", + "label": "education" }, "value_kind": "enum_value" }, "relation": "child", - "parent": "CRSPurposeCode110", + "parent": "CRSPurposeCode100", + "member_count": 9, + "served_rows": 318, + "served_rows_exact": true + }, + { + "value": { + "ref": { + "ref": "CRSPurposeCode160", + "label": "other social infrastructure and services" + }, + "value_kind": "enum_value" + }, + "relation": "child", + "parent": "CRSPurposeCode100", + "member_count": 7, + "served_rows": 102, + "served_rows_exact": true + }, + { + "value": { + "ref": { + "ref": "CRSPurposeCode120", + "label": "health" + }, + "value_kind": "enum_value" + }, + "relation": "child", + "parent": "CRSPurposeCode100", "member_count": 6, - "served_rows": 77, + "served_rows": 194, "served_rows_exact": true }, { "value": { "ref": { - "ref": "CRSPurposeCode113", - "label": "upper secondary education" + "ref": "CRSPurposeCode130", + "label": "population policy, programme, and reproductive health" }, "value_kind": "enum_value" }, "relation": "child", - "parent": "CRSPurposeCode110", + "parent": "CRSPurposeCode100", "member_count": 5, - "served_rows": 69, + "served_rows": 81, "served_rows_exact": true }, { "value": { "ref": { - "ref": "CRSPurposeCode114", - "label": "post-secondary education" + "ref": "CRSPurposeCode150", + "label": "government and civil society" }, "value_kind": "enum_value" }, "relation": "child", - "parent": "CRSPurposeCode110", + "parent": "CRSPurposeCode100", "member_count": 4, - "served_rows": 94, + "served_rows": 244, "served_rows_exact": true - } - ], - "truncated": false, - "source": "observed" - }, - { - "key": { - "axis": "how", - "property": { - "ref": "crsTypeOfFinance", - "label": "CRS type of finance" }, - "label": "instrument" - }, - "options": [ { "value": { "ref": { - "ref": "CRSTypeOfFinance100", - "label": "grant" + "ref": "CRSPurposeCode200", + "label": "economic infrastructure and services" }, "value_kind": "enum_value" }, "relation": "root", - "member_count": 0, - "served_rows": 501, + "member_count": 13, + "served_rows": 286, "served_rows_exact": true }, { "value": { "ref": { - "ref": "CRSTypeOfFinance110", - "label": "standard grant" + "ref": "CRSPurposeCode240", + "label": "banking and financial services" }, "value_kind": "enum_value" }, "relation": "child", - "parent": "CRSTypeOfFinance100", - "member_count": 12672, - "served_rows": 501, + "parent": "CRSPurposeCode200", + "member_count": 16, + "served_rows": 30, "served_rows_exact": true }, { "value": { "ref": { - "ref": "CRSTypeOfFinance420", - "label": "debt instrument" + "ref": "CRSPurposeCode220", + "label": "communication system and technology" }, "value_kind": "enum_value" }, - "relation": "root", - "member_count": 0, - "served_rows": 11, + "relation": "child", + "parent": "CRSPurposeCode200", + "member_count": 13, + "served_rows": 23, "served_rows_exact": true }, { "value": { "ref": { - "ref": "CRSTypeOfFinance421", - "label": "standard loan" + "ref": "CRSPurposeCode250", + "label": "business environment and governance" }, "value_kind": "enum_value" }, "relation": "child", - "parent": "CRSTypeOfFinance420", - "member_count": 4620, - "served_rows": 11, + "parent": "CRSPurposeCode200", + "member_count": 13, + "served_rows": 30, "served_rows_exact": true - } - ], - "truncated": false, - "source": "observed" - }, - { - "key": { - "axis": "how", - "property": { - "ref": "crsTypeOfFlow", - "label": "CRS type of flow" }, - "label": "flow" - }, - "options": [ { "value": { "ref": { - "ref": "CRSTypeOfFlow10", - "label": "official development assistance" + "ref": "CRSPurposeCode210", + "label": "transport and storage" }, "value_kind": "enum_value" }, - "relation": "root", - "member_count": 14098, - "served_rows": 512, + "relation": "child", + "parent": "CRSPurposeCode200", + "member_count": 7, + "served_rows": 97, "served_rows_exact": true - } - ], - "truncated": false, - "source": "observed" - }, - { - "key": { - "axis": "how", - "property": { - "ref": "crsCooperationModality", - "label": "CRS cooperation modality" }, - "label": "modality" - }, - "options": [ { "value": { "ref": { - "ref": "CRSCooperationModalityB", - "label": "core contribution and pooled programme and fund" + "ref": "CRSPurposeCode230", + "label": "energy" }, "value_kind": "enum_value" }, - "relation": "root", - "member_count": 0, - "served_rows": 104, + "relation": "child", + "parent": "CRSPurposeCode200", + "member_count": 7, + "served_rows": 106, "served_rows_exact": true }, { "value": { "ref": { - "ref": "CRSCooperationModalityB03", - "label": "contribution to specific-purpose programme and fund managed by an international organisation" + "ref": "CRSPurposeCode300", + "label": "productive sector" }, "value_kind": "enum_value" }, - "relation": "child", - "parent": "CRSCooperationModalityB", - "member_count": 1606, - "served_rows": 21, + "relation": "root", + "member_count": 13, + "served_rows": 493, "served_rows_exact": true }, { "value": { "ref": { - "ref": "CRSCooperationModalityB01", - "label": "core support to non-governmental organisations, other private bodies, public-private partnerships, and research institutes" + "ref": "CRSPurposeCode310", + "label": "agriculture, forestry and fishing" }, "value_kind": "enum_value" }, "relation": "child", - "parent": "CRSCooperationModalityB", - "member_count": 1331, - "served_rows": 83, + "parent": "CRSPurposeCode300", + "member_count": 12, + "served_rows": 405, "served_rows_exact": true }, { "value": { "ref": { - "ref": "CRSCooperationModalityC", - "label": "project-type intervention (group)" + "ref": "CRSPurposeCode320", + "label": "industry, mining and construction" }, "value_kind": "enum_value" }, - "relation": "root", - "member_count": 0, - "served_rows": 136, + "relation": "child", + "parent": "CRSPurposeCode300", + "member_count": 9, + "served_rows": 66, "served_rows_exact": true }, { "value": { "ref": { - "ref": "CRSCooperationModalityC01", - "label": "project-type intervention" + "ref": "CRSPurposeCode331", + "label": "trade policies and regulations" }, "value_kind": "enum_value" }, "relation": "child", - "parent": "CRSCooperationModalityC", - "member_count": 7005, - "served_rows": 136, + "parent": "CRSPurposeCode300", + "member_count": 7, + "served_rows": 22, "served_rows_exact": true }, { "value": { "ref": { - "ref": "CRSCooperationModalityD", - "label": "expert and other technical assistance" + "ref": "CRSPurposeCode400", + "label": "multisector" }, "value_kind": "enum_value" }, "relation": "root", - "member_count": 0, - "served_rows": 111, + "member_count": 7, + "served_rows": 206, "served_rows_exact": true }, { "value": { "ref": { - "ref": "CRSCooperationModalityD02", - "label": "other technical assistance" + "ref": "CRSPurposeCode430", + "label": "other multisector" }, "value_kind": "enum_value" }, "relation": "child", - "parent": "CRSCooperationModalityD", - "member_count": 1600, - "served_rows": 84, + "parent": "CRSPurposeCode400", + "member_count": 10, + "served_rows": 162, "served_rows_exact": true }, { "value": { "ref": { - "ref": "CRSCooperationModalityD01", - "label": "donor country personnel" + "ref": "CRSPurposeCode410", + "label": "general environment protection" }, "value_kind": "enum_value" }, "relation": "child", - "parent": "CRSCooperationModalityD", - "member_count": 976, - "served_rows": 27, + "parent": "CRSPurposeCode400", + "member_count": 7, + "served_rows": 44, "served_rows_exact": true }, { "value": { "ref": { - "ref": "CRSCooperationModalityE", - "label": "scholarship and student cost in donor country" + "ref": "CRSPurposeCode500", + "label": "commodity aid and general programme assistance" }, "value_kind": "enum_value" }, "relation": "root", - "member_count": 0, - "served_rows": 38, + "member_count": 5, + "served_rows": 70, "served_rows_exact": true }, { "value": { "ref": { - "ref": "CRSCooperationModalityE01", - "label": "scholarship and training in donor country" + "ref": "CRSPurposeCode510", + "label": "budget support" }, "value_kind": "enum_value" }, "relation": "child", - "parent": "CRSCooperationModalityE", - "member_count": 819, - "served_rows": 19, + "parent": "CRSPurposeCode500", + "member_count": 3, + "served_rows": 10, "served_rows_exact": true }, { "value": { "ref": { - "ref": "CRSCooperationModalityE02", - "label": "imputed student cost" + "ref": "CRSPurposeCode520", + "label": "food assistance" }, "value_kind": "enum_value" }, "relation": "child", - "parent": "CRSCooperationModalityE", - "member_count": 315, + "parent": "CRSPurposeCode500", + "member_count": 3, "served_rows": 19, "served_rows_exact": true - } - ], - "truncated": false, - "source": "observed" - } - ], - "entity_options": [], - "facet_options": [ - { - "axis": "provenance", - "options": [ + }, { "value": { "ref": { - "ref": "provenance/OECDCreditorReportingSystem", - "label": "OECD Creditor Reporting System (CRS)" + "ref": "CRSPurposeCode530", + "label": "other commodity assistance" }, - "value_kind": "source" - } - } - ], - "truncated": false, - "source": "observed" - }, - { - "axis": "unit", - "options": [ + "value_kind": "enum_value" + }, + "relation": "child", + "parent": "CRSPurposeCode500", + "member_count": 3, + "served_rows": 41, + "served_rows_exact": true + }, { "value": { "ref": { - "ref": "CurrencyUSD", - "label": "US Dollar" + "ref": "CRSPurposeCode700", + "label": "humanitarian aid" }, "value_kind": "enum_value" - } - } - ], - "truncated": false, - "source": "observed" - } - ], - "rendered_sentence": "Germany's gross ODA disbursements to Kenya for education and health, 1997 to 2024. Current US dollars · OECD Creditor Reporting System (CRS).", - "sentence_plan": [ + }, + "relation": "root", + "member_count": 5, + "served_rows": 68, + "served_rows_exact": true + }, + { + "value": { + "ref": { + "ref": "CRSPurposeCode720", + "label": "emergency response" + }, + "value_kind": "enum_value" + }, + "relation": "child", + "parent": "CRSPurposeCode700", + "member_count": 6, + "served_rows": 46, + "served_rows_exact": true + }, + { + "value": { + "ref": { + "ref": "CRSPurposeCode730", + "label": "reconstruction and rehabilitation" + }, + "value_kind": "enum_value" + }, + "relation": "child", + "parent": "CRSPurposeCode700", + "member_count": 3, + "served_rows": 14, + "served_rows_exact": true + }, + { + "value": { + "ref": { + "ref": "CRSPurposeCode740", + "label": "disaster preparedness" + }, + "value_kind": "enum_value" + }, + "relation": "child", + "parent": "CRSPurposeCode700", + "member_count": 0, + "served_rows": 8, + "served_rows_exact": true + }, + { + "value": { + "ref": { + "ref": "CRSPurposeCode930", + "label": "support for refugees and asylum seekers in donor countries" + }, + "value_kind": "enum_value" + }, + "relation": "root", + "member_count": 3, + "served_rows": 6, + "served_rows_exact": true + }, + { + "value": { + "ref": { + "ref": "CRSPurposeCode93010", + "label": "general support for refugees and asylum seekers in donor countries" + }, + "value_kind": "enum_value" + }, + "relation": "child", + "parent": "CRSPurposeCode930", + "member_count": 57, + "served_rows": 6, + "served_rows_exact": true + }, + { + "value": { + "ref": { + "ref": "CRSPurposeCode111", + "label": "unspecified-level education" + }, + "value_kind": "enum_value" + }, + "relation": "child", + "parent": "CRSPurposeCode110", + "member_count": 6, + "served_rows": 78, + "served_rows_exact": true + }, + { + "value": { + "ref": { + "ref": "CRSPurposeCode112", + "label": "basic education" + }, + "value_kind": "enum_value" + }, + "relation": "child", + "parent": "CRSPurposeCode110", + "member_count": 6, + "served_rows": 77, + "served_rows_exact": true + }, + { + "value": { + "ref": { + "ref": "CRSPurposeCode113", + "label": "upper secondary education" + }, + "value_kind": "enum_value" + }, + "relation": "child", + "parent": "CRSPurposeCode110", + "member_count": 5, + "served_rows": 69, + "served_rows_exact": true + }, + { + "value": { + "ref": { + "ref": "CRSPurposeCode114", + "label": "post-secondary education" + }, + "value_kind": "enum_value" + }, + "relation": "child", + "parent": "CRSPurposeCode110", + "member_count": 4, + "served_rows": 94, + "served_rows_exact": true + } + ], + "truncated": false, + "source": "observed" + }, + { + "key": { + "axis": "how", + "property": { + "ref": "crsTypeOfFinance", + "label": "CRS type of finance" + }, + "label": "instrument" + }, + "options": [ + { + "value": { + "ref": { + "ref": "CRSTypeOfFinance100", + "label": "grant" + }, + "value_kind": "enum_value" + }, + "relation": "root", + "member_count": 0, + "served_rows": 582, + "served_rows_exact": true + }, + { + "value": { + "ref": { + "ref": "CRSTypeOfFinance110", + "label": "standard grant" + }, + "value_kind": "enum_value" + }, + "relation": "child", + "parent": "CRSTypeOfFinance100", + "member_count": 12745, + "served_rows": 582, + "served_rows_exact": true + }, + { + "value": { + "ref": { + "ref": "CRSTypeOfFinance420", + "label": "debt instrument" + }, + "value_kind": "enum_value" + }, + "relation": "root", + "member_count": 0, + "served_rows": 11, + "served_rows_exact": true + }, + { + "value": { + "ref": { + "ref": "CRSTypeOfFinance421", + "label": "standard loan" + }, + "value_kind": "enum_value" + }, + "relation": "child", + "parent": "CRSTypeOfFinance420", + "member_count": 4620, + "served_rows": 11, + "served_rows_exact": true + } + ], + "truncated": false, + "source": "observed" + }, + { + "key": { + "axis": "how", + "property": { + "ref": "crsTypeOfFlow", + "label": "CRS type of flow" + }, + "label": "flow" + }, + "options": [ + { + "value": { + "ref": { + "ref": "CRSTypeOfFlow10", + "label": "official development assistance" + }, + "value_kind": "enum_value" + }, + "relation": "root", + "member_count": 14146, + "served_rows": 593, + "served_rows_exact": true + } + ], + "truncated": false, + "source": "observed" + }, + { + "key": { + "axis": "how", + "property": { + "ref": "crsCooperationModality", + "label": "CRS cooperation modality" + }, + "label": "modality" + }, + "options": [ + { + "value": { + "ref": { + "ref": "CRSCooperationModalityB", + "label": "core contribution and pooled programme and fund" + }, + "value_kind": "enum_value" + }, + "relation": "root", + "member_count": 0, + "served_rows": 118, + "served_rows_exact": true + }, + { + "value": { + "ref": { + "ref": "CRSCooperationModalityB03", + "label": "contribution to specific-purpose programme and fund managed by an international organisation" + }, + "value_kind": "enum_value" + }, + "relation": "child", + "parent": "CRSCooperationModalityB", + "member_count": 1614, + "served_rows": 25, + "served_rows_exact": true + }, + { + "value": { + "ref": { + "ref": "CRSCooperationModalityB01", + "label": "core support to non-governmental organisations, other private bodies, public-private partnerships, and research institutes" + }, + "value_kind": "enum_value" + }, + "relation": "child", + "parent": "CRSCooperationModalityB", + "member_count": 1337, + "served_rows": 93, + "served_rows_exact": true + }, + { + "value": { + "ref": { + "ref": "CRSCooperationModalityC", + "label": "project-type intervention (group)" + }, + "value_kind": "enum_value" + }, + "relation": "root", + "member_count": 0, + "served_rows": 173, + "served_rows_exact": true + }, + { + "value": { + "ref": { + "ref": "CRSCooperationModalityC01", + "label": "project-type intervention" + }, + "value_kind": "enum_value" + }, + "relation": "child", + "parent": "CRSCooperationModalityC", + "member_count": 7041, + "served_rows": 173, + "served_rows_exact": true + }, + { + "value": { + "ref": { + "ref": "CRSCooperationModalityD", + "label": "expert and other technical assistance" + }, + "value_kind": "enum_value" + }, + "relation": "root", + "member_count": 0, + "served_rows": 116, + "served_rows_exact": true + }, + { + "value": { + "ref": { + "ref": "CRSCooperationModalityD02", + "label": "other technical assistance" + }, + "value_kind": "enum_value" + }, + "relation": "child", + "parent": "CRSCooperationModalityD", + "member_count": 1600, + "served_rows": 87, + "served_rows_exact": true + }, + { + "value": { + "ref": { + "ref": "CRSCooperationModalityD01", + "label": "donor country personnel" + }, + "value_kind": "enum_value" + }, + "relation": "child", + "parent": "CRSCooperationModalityD", + "member_count": 980, + "served_rows": 29, + "served_rows_exact": true + }, + { + "value": { + "ref": { + "ref": "CRSCooperationModalityE", + "label": "scholarship and student cost in donor country" + }, + "value_kind": "enum_value" + }, + "relation": "root", + "member_count": 0, + "served_rows": 38, + "served_rows_exact": true + }, + { + "value": { + "ref": { + "ref": "CRSCooperationModalityE01", + "label": "scholarship and training in donor country" + }, + "value_kind": "enum_value" + }, + "relation": "child", + "parent": "CRSCooperationModalityE", + "member_count": 819, + "served_rows": 19, + "served_rows_exact": true + }, + { + "value": { + "ref": { + "ref": "CRSCooperationModalityE02", + "label": "imputed student cost" + }, + "value_kind": "enum_value" + }, + "relation": "child", + "parent": "CRSCooperationModalityE", + "member_count": 315, + "served_rows": 19, + "served_rows_exact": true + } + ], + "truncated": false, + "source": "observed" + } + ], + "entity_options": [], + "facet_options": [ + { + "axis": "provenance", + "options": [ + { + "value": { + "ref": { + "ref": "provenance/OECDCreditorReportingSystem", + "label": "OECD Creditor Reporting System (CRS)" + }, + "value_kind": "source" + } + } + ], + "truncated": false, + "source": "observed" + }, + { + "axis": "unit", + "options": [ + { + "value": { + "ref": { + "ref": "CurrencyUSD", + "label": "US Dollar" + }, + "value_kind": "enum_value" + } + } + ], + "truncated": false, + "source": "observed" + } + ], + "rendered_sentence": "Germany's gross ODA disbursements to Kenya for education, health, and population policy, programme, and reproductive health, 1997 to 2024. Current US dollars · OECD Creditor Reporting System (CRS).", + "sentence_plan": [ { "kind": "slot", "text": "Germany", @@ -1104,7 +1576,7 @@ }, { "kind": "slot", - "text": "education and health", + "text": "education, health, and population policy, programme, and reproductive health", "axis": "how", "segment": "heading", "property_dcid": "crsPurpose", @@ -1278,6 +1750,10 @@ { "ref": "CRSPurposeCode120", "label": "health" + }, + { + "ref": "CRSPurposeCode130", + "label": "population policy, programme, and reproductive health" } ], "provenance": "text_recognized" @@ -1315,344 +1791,131 @@ }, { "key": { - "axis": "how", - "property": { - "ref": "financialFlowType", - "label": "financial flow type" - }, - "label": "financial flow type" - }, - "binding_kind": "value", - "refs": [ - { - "ref": "Disbursement", - "label": "disbursement" - } - ], - "provenance": "text_recognized" - }, - { - "key": { - "axis": "how", - "property": { - "ref": "nettingBasis", - "label": "netting basis" - }, - "label": "netting basis" - }, - "binding_kind": "value", - "refs": [ - { - "ref": "Gross", - "label": "gross" - } - ], - "provenance": "measure_elected" - }, - { - "key": { - "axis": "how", - "property": { - "ref": "crsCooperationModality", - "label": "CRS cooperation modality" - }, - "label": "modality" - }, - "binding_kind": "unbound", - "refs": [], - "provenance": "binder" - }, - { - "key": { - "axis": "where", - "label": "place" - }, - "binding_kind": "value", - "refs": [ - { - "ref": "country/KEN", - "label": "Kenya" - } - ], - "provenance": "binder" - }, - { - "key": { - "axis": "when", - "label": "time window" - }, - "binding_kind": "unbound", - "refs": [], - "provenance": "binder" - }, - { - "key": { - "axis": "source", - "label": "data source" - }, - "binding_kind": "unbound", - "refs": [], - "provenance": "binder" - } - ], - "query_qualifiers": [ - { - "text": "health", - "named": [ - { - "ref": "CRSPurposeCode120", - "label": "health" - } - ], - "slot": "crsPurpose", - "disposition": "bound", - "selected": [] - }, - { - "text": "ODA", - "named": [ - { - "ref": "CRSTypeOfFlow10", - "label": "official development assistance" - } - ], - "slot": "crsTypeOfFlow", - "disposition": "bound", - "selected": [] - }, - { - "text": "education", - "named": [ - { - "ref": "CRSPurposeCode110", - "label": "education" - } - ], - "slot": "crsPurpose", - "disposition": "bound", - "selected": [] - } - ], - "capability_version": "cap_765c9d2a0c7529b9", - "default_reading": { - "applied": true, - "removed_stat_vars": [] - } - }, - "alternative_measures": [ - { - "definition": { - "schema_version": 1, - "spec_id": "spec_b438dc000255d174bcc13eb675e603f7", - "identity": { - "identity_version": "spec1", - "shape": { - "kind": "statvar_schema", - "population_type": "FinancialFlow", - "measured_property": "amount", - "stat_type": "measuredValue", - "measurement_qualifier": "Nominal" - }, - "slots": [ - { - "property": "crsCooperationModality", - "binding": { - "state": "unbound" - } - }, - { - "property": "crsPurpose", - "binding": { - "state": "set", - "refs": [ - "CRSPurposeCode110", - "CRSPurposeCode120" - ] - } - }, - { - "property": "crsTypeOfFinance", - "binding": { - "state": "unbound" - } - }, - { - "property": "crsTypeOfFlow", - "binding": { - "state": "value", - "ref": "CRSTypeOfFlow10" - } - }, - { - "property": "financialFlowType", - "binding": { - "state": "value", - "ref": "Disbursement" - } - }, - { - "property": "nettingBasis", - "binding": { - "state": "value", - "ref": "Net" - } - } - ], - "entities": { - "destination": [ - "country/KEN" - ], - "origin": [ - "country/DEU" - ] - }, - "requested_window": { - "kind": "all" - } - } - }, - "label": "net disbursements", - "axis": "what", - "measure_axis_values": [ - { - "axis": "populationType", - "value": { - "ref": "FinancialFlow", - "label": "financial flow" - } - }, - { - "axis": "measuredProperty", - "value": { - "ref": "amount", - "label": "amount" - } - }, - { - "axis": "measurementQualifier", - "value": { - "ref": "Nominal", - "label": "nominal" - } - }, - { - "axis": "financialFlowType", - "value": { - "ref": "Disbursement", - "label": "disbursement" - } - }, - { - "axis": "nettingBasis", - "value": { - "ref": "Net", - "label": "net" - } - } - ], - "served_rows": 512, - "served_rows_exact": true - }, - { - "definition": { - "schema_version": 1, - "spec_id": "spec_e348565295de394da8ddaa23ec5fa475", - "identity": { - "identity_version": "spec1", - "shape": { - "kind": "statvar_schema", - "population_type": "FinancialObligation", - "measured_property": "amount", - "stat_type": "measuredValue", - "measurement_qualifier": "Nominal" - }, - "slots": [ - { - "property": "crsCooperationModality", - "binding": { - "state": "unbound" - } - }, - { - "property": "crsPurpose", - "binding": { - "state": "set", - "refs": [ - "CRSPurposeCode110", - "CRSPurposeCode120" - ] - } - }, - { - "property": "crsTypeOfFinance", - "binding": { - "state": "unbound" - } - }, - { - "property": "crsTypeOfFlow", - "binding": { - "state": "value", - "ref": "CRSTypeOfFlow10" - } - }, - { - "property": "financialObligationType", - "binding": { - "state": "value", - "ref": "Commitment" - } - } - ], - "entities": { - "destination": [ - "country/KEN" - ], - "origin": [ - "country/DEU" - ] + "axis": "how", + "property": { + "ref": "financialFlowType", + "label": "financial flow type" }, - "requested_window": { - "kind": "all" + "label": "financial flow type" + }, + "binding_kind": "value", + "refs": [ + { + "ref": "Disbursement", + "label": "disbursement" } - } + ], + "provenance": "text_recognized" }, - "label": "commitments", - "axis": "what", - "measure_axis_values": [ - { - "axis": "populationType", - "value": { - "ref": "FinancialObligation", - "label": "financial obligation" - } + { + "key": { + "axis": "how", + "property": { + "ref": "nettingBasis", + "label": "netting basis" + }, + "label": "netting basis" }, - { - "axis": "measuredProperty", - "value": { - "ref": "amount", - "label": "amount" + "binding_kind": "value", + "refs": [ + { + "ref": "Gross", + "label": "gross" } + ], + "provenance": "measure_elected" + }, + { + "key": { + "axis": "how", + "property": { + "ref": "crsCooperationModality", + "label": "CRS cooperation modality" + }, + "label": "modality" }, - { - "axis": "measurementQualifier", - "value": { - "ref": "Nominal", - "label": "nominal" + "binding_kind": "unbound", + "refs": [], + "provenance": "binder" + }, + { + "key": { + "axis": "where", + "label": "place" + }, + "binding_kind": "value", + "refs": [ + { + "ref": "country/KEN", + "label": "Kenya" } + ], + "provenance": "binder" + }, + { + "key": { + "axis": "when", + "label": "time window" }, - { - "axis": "financialObligationType", - "value": { - "ref": "Commitment", - "label": "commitment" + "binding_kind": "unbound", + "refs": [], + "provenance": "binder" + }, + { + "key": { + "axis": "source", + "label": "data source" + }, + "binding_kind": "unbound", + "refs": [], + "provenance": "binder" + } + ], + "query_qualifiers": [ + { + "text": "health", + "named": [ + { + "ref": "CRSPurposeCode120", + "label": "health" } - } - ], - "served_rows": 519, - "served_rows_exact": true + ], + "slot": "crsPurpose", + "disposition": "bound", + "selected": [] + }, + { + "text": "ODA", + "named": [ + { + "ref": "CRSTypeOfFlow10", + "label": "official development assistance" + } + ], + "slot": "crsTypeOfFlow", + "disposition": "bound", + "selected": [] + }, + { + "text": "education", + "named": [ + { + "ref": "CRSPurposeCode110", + "label": "education" + } + ], + "slot": "crsPurpose", + "disposition": "bound", + "selected": [] + } + ], + "capability_version": "cap_4913302d7a6b6435", + "default_reading": { + "applied": true, + "removed_stat_vars": [] } - ], + }, + "alternative_measures": [], "measure_label": "gross disbursements", "measure_label_axes": [ "populationType", @@ -1698,6 +1961,8 @@ } } ], + "concept_label": "education, health, and population policy, programme, and reproductive health", + "published_tables": "OECD Creditor Reporting System (CRS)", "open_axis_facts": [ { "property": "crsTypeOfFinance", @@ -1710,7 +1975,7 @@ "ref": "CRSTypeOfFinance110", "label": "standard grant" }, - "count": 105 + "count": 120 }, { "value": { @@ -1725,42 +1990,42 @@ "property": "crsCooperationModality", "varies": true, "distinct_count": 7, - "undeclared_count": 19, + "undeclared_count": 22, "values": [ { "value": { "ref": "CRSCooperationModalityC01", "label": "project-type intervention" }, - "count": 27 + "count": 30 }, { "value": { "ref": "CRSCooperationModalityB03", "label": "contribution to specific-purpose programme and fund managed by an international organisation" }, - "count": 21 + "count": 24 }, { "value": { - "ref": "CRSCooperationModalityD02", - "label": "other technical assistance" + "ref": "CRSCooperationModalityB01", + "label": "core support to non-governmental organisations, other private bodies, public-private partnerships, and research institutes" }, - "count": 16 + "count": 18 }, { "value": { - "ref": "CRSCooperationModalityB01", - "label": "core support to non-governmental organisations, other private bodies, public-private partnerships, and research institutes" + "ref": "CRSCooperationModalityD02", + "label": "other technical assistance" }, - "count": 15 + "count": 18 }, { "value": { "ref": "CRSCooperationModalityD01", "label": "donor country personnel" }, - "count": 8 + "count": 9 }, { "value": { @@ -3720,33 +3985,404 @@ "start_year": 1980, "end_year": 2025 }, - "constant_years": { - "start_year": 1960, - "end_year": 2025 + "constant_years": { + "start_year": 1960, + "end_year": 2025 + }, + "base_year_min": 1980, + "base_year_max": 2025 + }, + { + "code": "ZMW", + "noun": "Zambian kwachas", + "current_years": { + "start_year": 1980, + "end_year": 2025 + }, + "constant_years": { + "start_year": 1960, + "end_year": 2025 + }, + "base_year_min": 1980, + "base_year_max": 2025 + } + ], + "default_base_year": 2024, + "role_currencies": { + "destination": "KES", + "origin": "EUR" + } + }, + "scope_choices": { + "id": "spec_7a02b6facd2dc17b5d0d7c35c11bf5d2", + "base": { + "schema_version": 1, + "spec_id": "spec_7a02b6facd2dc17b5d0d7c35c11bf5d2", + "identity": { + "identity_version": "spec1", + "shape": { + "kind": "statvar_schema", + "population_type": "FinancialFlow", + "measured_property": "amount", + "stat_type": "measuredValue", + "measurement_qualifier": "Nominal" + }, + "slots": [ + { + "property": "crsCooperationModality", + "binding": { + "state": "unbound" + } + }, + { + "property": "crsPurpose", + "binding": { + "state": "set", + "refs": [ + "CRSPurposeCode110", + "CRSPurposeCode120", + "CRSPurposeCode130" + ] + } + }, + { + "property": "crsTypeOfFinance", + "binding": { + "state": "unbound" + } + }, + { + "property": "crsTypeOfFlow", + "binding": { + "state": "value", + "ref": "CRSTypeOfFlow10" + } + }, + { + "property": "financialFlowType", + "binding": { + "state": "value", + "ref": "Disbursement" + } + }, + { + "property": "nettingBasis", + "binding": { + "state": "value", + "ref": "Gross" + } + } + ], + "entities": { + "destination": [ + "country/KEN" + ], + "origin": [ + "country/DEU" + ] + }, + "requested_window": { + "kind": "all" + } + } + }, + "rule_version": "scope1:3eef00a928eedd463ee48d02b79730da", + "entries": [], + "dropped_entries": [ + { + "entry": { + "axis": "sector", + "option_id": "sector:110", + "provenance": "explicit", + "origin": { + "kind": "text", + "text": "education", + "start": 0, + "end": 9 + } + }, + "code": "stated_choice_not_applied", + "cause": "option_unknown" + } + ], + "choices": [ + { + "id": "spec_7a02b6facd2dc17b5d0d7c35c11bf5d2:sector", + "axis": "sector", + "rule": "sector_code", + "provenance": "default", + "active": "sector:110+120+130", + "options": [ + { + "option_id": "sector:110+120+130", + "label": "education (CRS 110) + health (CRS 120) + population policy, programme, and reproductive health (CRS 130)", + "binding": { + "kind": "slot", + "slot": "crsPurpose", + "state": "set", + "refs": [ + "CRSPurposeCode110", + "CRSPurposeCode120", + "CRSPurposeCode130" + ] + }, + "availability": { + "status": "available", + "detail": {} + } + } + ] + }, + { + "id": "spec_7a02b6facd2dc17b5d0d7c35c11bf5d2:measure_basis", + "axis": "measure_basis", + "rule": "measure_basis_convention", + "provenance": "default", + "active": "measure_basis:gross", + "options": [ + { + "option_id": "measure_basis:gross", + "label": "gross disbursements, current USD", + "binding": { + "kind": "shape", + "measured_property": "amount", + "netting_basis": "Gross" + }, + "availability": { + "status": "available", + "detail": {} + } + }, + { + "option_id": "measure_basis:net", + "label": "net disbursements, current USD", + "binding": { + "kind": "shape", + "measured_property": "amount", + "netting_basis": "Net" + }, + "availability": { + "status": "available", + "detail": {} + } + }, + { + "option_id": "measure_basis:grant_equivalent", + "label": "grant equivalents (OECD headline), current USD", + "binding": { + "kind": "shape", + "measured_property": "grantEquivalent", + "netting_basis": null + }, + "availability": { + "status": "available", + "detail": {} + } + }, + { + "option_id": "measure_basis:commitments", + "label": "commitments, current USD", + "binding": { + "kind": "shape", + "measured_property": "amount", + "netting_basis": null + }, + "availability": { + "status": "available", + "detail": {} + } + } + ] + }, + { + "id": "spec_7a02b6facd2dc17b5d0d7c35c11bf5d2:provider", + "axis": "provider", + "rule": "bilateral_flows", + "provenance": "default", + "active": "provider:bilateral", + "options": [ + { + "option_id": "provider:bilateral", + "label": "bilateral flows only", + "binding": { + "kind": "provider", + "scope": "bilateral" + }, + "availability": { + "status": "available", + "detail": {} + } + }, + { + "option_id": "provider:inclusive", + "label": "bilateral plus imputed multilateral, 2011 to 2024", + "binding": { + "kind": "provider", + "scope": "inclusive", + "window": [ + 2011, + 2024 + ], + "provenance": "provenance/ONEBilateralAndImputedMultilateral" + }, + "availability": { + "status": "partial", + "years": [ + [ + 2011, + 2024 + ] + ], + "code": "imputed_coverage", + "detail": {} + } + } + ] + } + ], + "compiled": { + "spec_id": "spec_7a02b6facd2dc17b5d0d7c35c11bf5d2", + "identity": { + "identity_version": "spec1", + "shape": { + "kind": "statvar_schema", + "population_type": "FinancialFlow", + "measured_property": "amount", + "stat_type": "measuredValue", + "measurement_qualifier": "Nominal" + }, + "slots": [ + { + "property": "crsCooperationModality", + "binding": { + "state": "unbound" + } + }, + { + "property": "crsPurpose", + "binding": { + "state": "set", + "refs": [ + "CRSPurposeCode110", + "CRSPurposeCode120", + "CRSPurposeCode130" + ] + } + }, + { + "property": "crsTypeOfFinance", + "binding": { + "state": "unbound" + } + }, + { + "property": "crsTypeOfFlow", + "binding": { + "state": "value", + "ref": "CRSTypeOfFlow10" + } + }, + { + "property": "financialFlowType", + "binding": { + "state": "value", + "ref": "Disbursement" + } + }, + { + "property": "nettingBasis", + "binding": { + "state": "value", + "ref": "Gross" + } + } + ], + "entities": { + "destination": [ + "country/KEN" + ], + "origin": [ + "country/DEU" + ] }, - "base_year_min": 1980, - "base_year_max": 2025 + "requested_window": { + "kind": "all" + } }, - { - "code": "ZMW", - "noun": "Zambian kwachas", - "current_years": { - "start_year": 1980, - "end_year": 2025 - }, - "constant_years": { - "start_year": 1960, - "end_year": 2025 - }, - "base_year_min": 1980, - "base_year_max": 2025 - } - ], - "default_base_year": 2024, - "role_currencies": { - "destination": "KES", - "origin": "EUR" - } + "components": [ + { + "role": "whole", + "identity": { + "identity_version": "spec1", + "shape": { + "kind": "statvar_schema", + "population_type": "FinancialFlow", + "measured_property": "amount", + "stat_type": "measuredValue", + "measurement_qualifier": "Nominal" + }, + "slots": [ + { + "property": "crsCooperationModality", + "binding": { + "state": "unbound" + } + }, + { + "property": "crsPurpose", + "binding": { + "state": "set", + "refs": [ + "CRSPurposeCode110", + "CRSPurposeCode120", + "CRSPurposeCode130" + ] + } + }, + { + "property": "crsTypeOfFinance", + "binding": { + "state": "unbound" + } + }, + { + "property": "crsTypeOfFlow", + "binding": { + "state": "value", + "ref": "CRSTypeOfFlow10" + } + }, + { + "property": "financialFlowType", + "binding": { + "state": "value", + "ref": "Disbursement" + } + }, + { + "property": "nettingBasis", + "binding": { + "state": "value", + "ref": "Gross" + } + } + ], + "entities": { + "destination": [ + "country/KEN" + ], + "origin": [ + "country/DEU" + ] + }, + "requested_window": { + "kind": "all" + } + } + } + ] + }, + "ledger": [] } } } @@ -3761,30 +4397,30 @@ } ], "timing_ms": { - "total": 4561, + "total": 5452, "by_step": { - "recall": 1310, + "recall": 2999, "phase_resolve_places": 0, "phase_check_entities": 0, - "shape_arcs": 117, - "shape_probe_coverage": 28, - "shape_probe": 126, - "shape_groups": 83, + "shape_arcs": 1, + "shape_probe_coverage": 46, + "shape_probe": 144, + "shape_groups": 96, "shape_labels": 12, "shape_admission": 1, "phase_derive_shapes": 0, - "shape": 753, + "shape": 450, "phase_prune_and_rank": 0, - "bind": 309, - "phase_bind": 209, - "phase_settle": 82, + "bind": 646, + "phase_bind": 157, + "phase_settle": 101, "phase_place_bindings": 25, "phase_facet_requests": 0, - "materialise": 1061, - "phase_materialise": 233, - "answer": 29, - "options": 385, - "phase_outcome": 165 + "materialise": 602, + "phase_materialise": 196, + "answer": 45, + "options": 138, + "phase_outcome": 93 } }, "restatement": { @@ -3821,10 +4457,10 @@ "assumptions": [], "status": "definite", "spec": { - "spec_id": "spec_25f482395c5d012ec278118f38dff29c", + "spec_id": "spec_7a02b6facd2dc17b5d0d7c35c11bf5d2", "definition": { "schema_version": 1, - "spec_id": "spec_25f482395c5d012ec278118f38dff29c", + "spec_id": "spec_7a02b6facd2dc17b5d0d7c35c11bf5d2", "identity": { "identity_version": "spec1", "shape": { @@ -3847,7 +4483,8 @@ "state": "set", "refs": [ "CRSPurposeCode110", - "CRSPurposeCode120" + "CRSPurposeCode120", + "CRSPurposeCode130" ] } }, @@ -3895,7 +4532,7 @@ "resolved": { "shape": { "shape_id": "financialflow_amount_measuredvalue_nominal", - "label": "gross disbursements (official development assistance)", + "label": "gross disbursements (education, health and population policy, programme, and reproductive health, official development assistance)", "population_type": { "ref": "FinancialFlow", "label": "financial flow" @@ -3922,7 +4559,221 @@ }, "label": "sector" }, - { + { + "axis": "how", + "property": { + "ref": "crsTypeOfFinance", + "label": "CRS type of finance" + }, + "label": "instrument" + }, + { + "axis": "how", + "property": { + "ref": "crsTypeOfFlow", + "label": "CRS type of flow" + }, + "label": "flow" + }, + { + "axis": "how", + "property": { + "ref": "financialFlowType", + "label": "financial flow type" + }, + "label": "financial flow type" + }, + { + "axis": "how", + "property": { + "ref": "nettingBasis", + "label": "netting basis" + }, + "label": "netting basis" + }, + { + "axis": "how", + "property": { + "ref": "crsCooperationModality", + "label": "CRS cooperation modality" + }, + "label": "modality" + }, + { + "axis": "where", + "label": "place" + }, + { + "axis": "when", + "label": "time window" + }, + { + "axis": "source", + "label": "data source" + } + ], + "member_count": 634, + "member_digest": "5c91c0a8d90f4619a1ff7122cacdc8b0bc48b22c70516d7673aec42caf6da0d4", + "refine_supported": true, + "data_commons": [ + { + "id": "dfo", + "label": "Development Finance Observatory" + } + ] + }, + "slots": [ + { + "key": { + "axis": "how", + "property": { + "ref": "crsPurpose", + "label": "CRS purpose" + }, + "label": "sector" + }, + "binding": { + "kind": "set", + "values": [ + { + "ref": { + "ref": "CRSPurposeCode110", + "label": "education" + }, + "value_kind": "enum_value" + }, + { + "ref": { + "ref": "CRSPurposeCode120", + "label": "health" + }, + "value_kind": "enum_value" + }, + { + "ref": { + "ref": "CRSPurposeCode130", + "label": "population policy, programme, and reproductive health" + }, + "value_kind": "enum_value" + } + ] + }, + "expansion": { + "added": [ + { + "ref": "CRSPurposeCode121", + "label": "general health" + }, + { + "ref": "CRSPurposeCode122", + "label": "basic health" + }, + { + "ref": "CRSPurposeCode123", + "label": "noncommunicable disease" + }, + { + "ref": "CRSPurposeCode12110", + "label": "health policy and administrative management" + }, + { + "ref": "CRSPurposeCode12181", + "label": "medical education and training" + }, + { + "ref": "CRSPurposeCode12182", + "label": "medical research" + }, + { + "ref": "CRSPurposeCode12191", + "label": "medical service" + }, + { + "ref": "CRSPurposeCode12220", + "label": "basic health care" + }, + { + "ref": "CRSPurposeCode12230", + "label": "basic health infrastructure" + }, + { + "ref": "CRSPurposeCode12240", + "label": "basic nutrition" + }, + { + "ref": "CRSPurposeCode12250", + "label": "infectious disease control" + }, + { + "ref": "CRSPurposeCode12261", + "label": "health education" + }, + { + "ref": "CRSPurposeCode12262", + "label": "malaria control" + }, + { + "ref": "CRSPurposeCode12263", + "label": "tuberculosis control" + }, + { + "ref": "CRSPurposeCode12264", + "label": "COVID-19 control" + }, + { + "ref": "CRSPurposeCode12281", + "label": "health personnel development" + }, + { + "ref": "CRSPurposeCode12310", + "label": "general noncommunicable disease control" + }, + { + "ref": "CRSPurposeCode12320", + "label": "tobacco use control" + }, + { + "ref": "CRSPurposeCode12330", + "label": "control of harmful use of alcohol and drugs" + }, + { + "ref": "CRSPurposeCode12340", + "label": "mental health and well-being promotion" + }, + { + "ref": "CRSPurposeCode12350", + "label": "other noncommunicable disease prevention and treatment" + }, + { + "ref": "CRSPurposeCode12382", + "label": "research for noncommunicable disease prevention and control" + }, + { + "ref": "CRSPurposeCode13010", + "label": "population policy and administrative management" + }, + { + "ref": "CRSPurposeCode13020", + "label": "reproductive health care" + }, + { + "ref": "CRSPurposeCode13030", + "label": "family planning" + }, + { + "ref": "CRSPurposeCode13040", + "label": "sexually transmitted disease control" + }, + { + "ref": "CRSPurposeCode13081", + "label": "personnel development for population and reproductive health" + } + ] + }, + "summable": true + }, + { + "key": { "axis": "how", "property": { "ref": "crsTypeOfFinance", @@ -3930,7 +4781,13 @@ }, "label": "instrument" }, - { + "binding": { + "kind": "unbound" + }, + "summable": true + }, + { + "key": { "axis": "how", "property": { "ref": "crsTypeOfFlow", @@ -3938,7 +4795,20 @@ }, "label": "flow" }, - { + "binding": { + "kind": "value", + "value": { + "ref": { + "ref": "CRSTypeOfFlow10", + "label": "official development assistance" + }, + "value_kind": "enum_value" + } + }, + "summable": true + }, + { + "key": { "axis": "how", "property": { "ref": "financialFlowType", @@ -3946,7 +4816,20 @@ }, "label": "financial flow type" }, - { + "binding": { + "kind": "value", + "value": { + "ref": { + "ref": "Disbursement", + "label": "disbursement" + }, + "value_kind": "enum_value" + } + }, + "summable": false + }, + { + "key": { "axis": "how", "property": { "ref": "nettingBasis", @@ -3954,7 +4837,20 @@ }, "label": "netting basis" }, - { + "binding": { + "kind": "value", + "value": { + "ref": { + "ref": "Gross", + "label": "gross" + }, + "value_kind": "enum_value" + } + }, + "summable": false + }, + { + "key": { "axis": "how", "property": { "ref": "crsCooperationModality", @@ -3962,30 +4858,118 @@ }, "label": "modality" }, - { + "binding": { + "kind": "unbound" + }, + "summable": true + }, + { + "key": { "axis": "where", "label": "place" }, - { + "binding": { + "kind": "value", + "value": { + "ref": { + "ref": "country/KEN", + "label": "Kenya" + }, + "value_kind": "entity" + } + }, + "summable": false + }, + { + "key": { "axis": "when", "label": "time window" }, - { + "binding": { + "kind": "unbound" + }, + "summable": false + }, + { + "key": { "axis": "source", "label": "data source" - } - ], - "member_count": 545, - "member_digest": "0c7508fd1997d6cdc896f2eab0f092a4915cfca9e2400eb9577bb22b527fe882", - "refine_supported": true, - "data_commons": [ + }, + "binding": { + "kind": "unbound" + }, + "summable": false + } + ], + "inapplicable_slots": [ + "financialObligationType" + ], + "unresolved_slots": [], + "stat_vars": { + "member_count": 123, + "member_count_exact": true, + "served_count": 634, + "data_date_range": { + "start": "1997", + "end": "2024" + } + }, + "entities": [ + { + "ref": "country/KEN", + "label": "Kenya", + "entity_type": "Country", + "role": "destination" + }, + { + "ref": "country/DEU", + "label": "Germany", + "entity_type": "Country", + "role": "origin" + } + ], + "coverage": { + "kind": "breadth", + "has_data": true, + "dimensions": [ { - "id": "dfo", - "label": "Development Finance Observatory" + "label": "sources", + "count": 1 + }, + { + "label": "observations", + "count": 19 + }, + { + "label": "variables", + "count": 66 } ] }, - "slots": [ + "facets": { + "unit": { + "basis": "fallback", + "ref": "CurrencyUSD", + "label": "US Dollar", + "currency": "USD" + }, + "provenance": { + "basis": "fallback", + "ref": "provenance/OECDCreditorReportingSystem", + "label": "OECD Creditor Reporting System (CRS)", + "source": { + "ref": "dc/s/OrganisationForEconomicCo-operationAndDevelopmentOecd", + "label": "Organisation for Economic Co-operation and Development (OECD)" + }, + "data_commons": { + "id": "dfo", + "label": "Development Finance Observatory" + }, + "documentation": "/api/graph/documentation/provenance/OECDCreditorReportingSystem", + "account": "provider" + } + }, + "slot_options": [ { "key": { "axis": "how", @@ -3993,382 +4977,502 @@ "ref": "crsPurpose", "label": "CRS purpose" }, - "label": "sector" - }, - "binding": { - "kind": "set", - "values": [ - { + "label": "sector" + }, + "options": [ + { + "value": { + "ref": { + "ref": "CRSPurposeCode998", + "label": "unallocated and unspecified" + }, + "value_kind": "enum_value" + }, + "relation": "root", + "member_count": 76, + "served_rows": 74, + "served_rows_exact": true + }, + { + "value": { + "ref": { + "ref": "CRSPurposeCode99810", + "label": "sectors not specified" + }, + "value_kind": "enum_value" + }, + "relation": "child", + "parent": "CRSPurposeCode998", + "member_count": 255, + "served_rows": 71, + "served_rows_exact": true + }, + { + "value": { + "ref": { + "ref": "CRSPurposeCode99820", + "label": "non-sector allocable promotion of development awareness" + }, + "value_kind": "enum_value" + }, + "relation": "child", + "parent": "CRSPurposeCode998", + "member_count": 77, + "served_rows": 3, + "served_rows_exact": true + }, + { + "value": { + "ref": { + "ref": "CRSPurposeCode600", + "label": "action relating to debt" + }, + "value_kind": "enum_value" + }, + "relation": "root", + "member_count": 21, + "served_rows": 9, + "served_rows_exact": true + }, + { + "value": { + "ref": { + "ref": "CRSPurposeCode60020", + "label": "debt forgiveness" + }, + "value_kind": "enum_value" + }, + "relation": "child", + "parent": "CRSPurposeCode600", + "member_count": 75, + "served_rows": 4, + "served_rows_exact": true + }, + { + "value": { + "ref": { + "ref": "CRSPurposeCode60040", + "label": "rescheduling and refinancing" + }, + "value_kind": "enum_value" + }, + "relation": "child", + "parent": "CRSPurposeCode600", + "member_count": 54, + "served_rows": 5, + "served_rows_exact": true + }, + { + "value": { + "ref": { + "ref": "CRSPurposeCode100", + "label": "social infrastructure and services" + }, + "value_kind": "enum_value" + }, + "relation": "root", + "member_count": 13, + "served_rows": 1214, + "served_rows_exact": true + }, + { + "value": { + "ref": { + "ref": "CRSPurposeCode140", + "label": "water supply and sanitation" + }, + "value_kind": "enum_value" + }, + "relation": "child", + "parent": "CRSPurposeCode100", + "member_count": 10, + "served_rows": 275, + "served_rows_exact": true + }, + { + "value": { "ref": { "ref": "CRSPurposeCode110", "label": "education" }, "value_kind": "enum_value" }, - { + "relation": "child", + "parent": "CRSPurposeCode100", + "member_count": 9, + "served_rows": 318, + "served_rows_exact": true + }, + { + "value": { + "ref": { + "ref": "CRSPurposeCode160", + "label": "other social infrastructure and services" + }, + "value_kind": "enum_value" + }, + "relation": "child", + "parent": "CRSPurposeCode100", + "member_count": 7, + "served_rows": 102, + "served_rows_exact": true + }, + { + "value": { "ref": { "ref": "CRSPurposeCode120", "label": "health" }, "value_kind": "enum_value" - } - ] - }, - "expansion": { - "added": [ - { - "ref": "CRSPurposeCode121", - "label": "general health" - }, - { - "ref": "CRSPurposeCode122", - "label": "basic health" - }, - { - "ref": "CRSPurposeCode123", - "label": "noncommunicable disease" - }, - { - "ref": "CRSPurposeCode12110", - "label": "health policy and administrative management" - }, - { - "ref": "CRSPurposeCode12181", - "label": "medical education and training" - }, - { - "ref": "CRSPurposeCode12182", - "label": "medical research" - }, - { - "ref": "CRSPurposeCode12191", - "label": "medical service" }, - { - "ref": "CRSPurposeCode12220", - "label": "basic health care" + "relation": "child", + "parent": "CRSPurposeCode100", + "member_count": 6, + "served_rows": 194, + "served_rows_exact": true + }, + { + "value": { + "ref": { + "ref": "CRSPurposeCode130", + "label": "population policy, programme, and reproductive health" + }, + "value_kind": "enum_value" }, - { - "ref": "CRSPurposeCode12230", - "label": "basic health infrastructure" + "relation": "child", + "parent": "CRSPurposeCode100", + "member_count": 5, + "served_rows": 81, + "served_rows_exact": true + }, + { + "value": { + "ref": { + "ref": "CRSPurposeCode150", + "label": "government and civil society" + }, + "value_kind": "enum_value" }, - { - "ref": "CRSPurposeCode12240", - "label": "basic nutrition" + "relation": "child", + "parent": "CRSPurposeCode100", + "member_count": 4, + "served_rows": 244, + "served_rows_exact": true + }, + { + "value": { + "ref": { + "ref": "CRSPurposeCode200", + "label": "economic infrastructure and services" + }, + "value_kind": "enum_value" }, - { - "ref": "CRSPurposeCode12250", - "label": "infectious disease control" + "relation": "root", + "member_count": 13, + "served_rows": 286, + "served_rows_exact": true + }, + { + "value": { + "ref": { + "ref": "CRSPurposeCode240", + "label": "banking and financial services" + }, + "value_kind": "enum_value" }, - { - "ref": "CRSPurposeCode12261", - "label": "health education" + "relation": "child", + "parent": "CRSPurposeCode200", + "member_count": 16, + "served_rows": 30, + "served_rows_exact": true + }, + { + "value": { + "ref": { + "ref": "CRSPurposeCode220", + "label": "communication system and technology" + }, + "value_kind": "enum_value" }, - { - "ref": "CRSPurposeCode12262", - "label": "malaria control" + "relation": "child", + "parent": "CRSPurposeCode200", + "member_count": 13, + "served_rows": 23, + "served_rows_exact": true + }, + { + "value": { + "ref": { + "ref": "CRSPurposeCode250", + "label": "business environment and governance" + }, + "value_kind": "enum_value" }, - { - "ref": "CRSPurposeCode12263", - "label": "tuberculosis control" + "relation": "child", + "parent": "CRSPurposeCode200", + "member_count": 13, + "served_rows": 30, + "served_rows_exact": true + }, + { + "value": { + "ref": { + "ref": "CRSPurposeCode210", + "label": "transport and storage" + }, + "value_kind": "enum_value" }, - { - "ref": "CRSPurposeCode12264", - "label": "COVID-19 control" + "relation": "child", + "parent": "CRSPurposeCode200", + "member_count": 7, + "served_rows": 97, + "served_rows_exact": true + }, + { + "value": { + "ref": { + "ref": "CRSPurposeCode230", + "label": "energy" + }, + "value_kind": "enum_value" }, - { - "ref": "CRSPurposeCode12281", - "label": "health personnel development" + "relation": "child", + "parent": "CRSPurposeCode200", + "member_count": 7, + "served_rows": 106, + "served_rows_exact": true + }, + { + "value": { + "ref": { + "ref": "CRSPurposeCode300", + "label": "productive sector" + }, + "value_kind": "enum_value" }, - { - "ref": "CRSPurposeCode12310", - "label": "general noncommunicable disease control" + "relation": "root", + "member_count": 13, + "served_rows": 493, + "served_rows_exact": true + }, + { + "value": { + "ref": { + "ref": "CRSPurposeCode310", + "label": "agriculture, forestry and fishing" + }, + "value_kind": "enum_value" }, - { - "ref": "CRSPurposeCode12320", - "label": "tobacco use control" + "relation": "child", + "parent": "CRSPurposeCode300", + "member_count": 12, + "served_rows": 405, + "served_rows_exact": true + }, + { + "value": { + "ref": { + "ref": "CRSPurposeCode320", + "label": "industry, mining and construction" + }, + "value_kind": "enum_value" }, - { - "ref": "CRSPurposeCode12330", - "label": "control of harmful use of alcohol and drugs" + "relation": "child", + "parent": "CRSPurposeCode300", + "member_count": 9, + "served_rows": 66, + "served_rows_exact": true + }, + { + "value": { + "ref": { + "ref": "CRSPurposeCode331", + "label": "trade policies and regulations" + }, + "value_kind": "enum_value" }, - { - "ref": "CRSPurposeCode12340", - "label": "mental health and well-being promotion" + "relation": "child", + "parent": "CRSPurposeCode300", + "member_count": 7, + "served_rows": 22, + "served_rows_exact": true + }, + { + "value": { + "ref": { + "ref": "CRSPurposeCode400", + "label": "multisector" + }, + "value_kind": "enum_value" }, - { - "ref": "CRSPurposeCode12350", - "label": "other noncommunicable disease prevention and treatment" + "relation": "root", + "member_count": 7, + "served_rows": 206, + "served_rows_exact": true + }, + { + "value": { + "ref": { + "ref": "CRSPurposeCode430", + "label": "other multisector" + }, + "value_kind": "enum_value" }, - { - "ref": "CRSPurposeCode12382", - "label": "research for noncommunicable disease prevention and control" - } - ] - }, - "summable": true - }, - { - "key": { - "axis": "how", - "property": { - "ref": "crsTypeOfFinance", - "label": "CRS type of finance" + "relation": "child", + "parent": "CRSPurposeCode400", + "member_count": 10, + "served_rows": 162, + "served_rows_exact": true + }, + { + "value": { + "ref": { + "ref": "CRSPurposeCode410", + "label": "general environment protection" + }, + "value_kind": "enum_value" + }, + "relation": "child", + "parent": "CRSPurposeCode400", + "member_count": 7, + "served_rows": 44, + "served_rows_exact": true }, - "label": "instrument" - }, - "binding": { - "kind": "unbound" - }, - "summable": true - }, - { - "key": { - "axis": "how", - "property": { - "ref": "crsTypeOfFlow", - "label": "CRS type of flow" + { + "value": { + "ref": { + "ref": "CRSPurposeCode500", + "label": "commodity aid and general programme assistance" + }, + "value_kind": "enum_value" + }, + "relation": "root", + "member_count": 5, + "served_rows": 70, + "served_rows_exact": true }, - "label": "flow" - }, - "binding": { - "kind": "value", - "value": { - "ref": { - "ref": "CRSTypeOfFlow10", - "label": "official development assistance" + { + "value": { + "ref": { + "ref": "CRSPurposeCode510", + "label": "budget support" + }, + "value_kind": "enum_value" }, - "value_kind": "enum_value" - } - }, - "summable": true - }, - { - "key": { - "axis": "how", - "property": { - "ref": "financialFlowType", - "label": "financial flow type" + "relation": "child", + "parent": "CRSPurposeCode500", + "member_count": 3, + "served_rows": 10, + "served_rows_exact": true }, - "label": "financial flow type" - }, - "binding": { - "kind": "value", - "value": { - "ref": { - "ref": "Disbursement", - "label": "disbursement" + { + "value": { + "ref": { + "ref": "CRSPurposeCode520", + "label": "food assistance" + }, + "value_kind": "enum_value" }, - "value_kind": "enum_value" - } - }, - "summable": false - }, - { - "key": { - "axis": "how", - "property": { - "ref": "nettingBasis", - "label": "netting basis" + "relation": "child", + "parent": "CRSPurposeCode500", + "member_count": 3, + "served_rows": 19, + "served_rows_exact": true }, - "label": "netting basis" - }, - "binding": { - "kind": "value", - "value": { - "ref": { - "ref": "Gross", - "label": "gross" + { + "value": { + "ref": { + "ref": "CRSPurposeCode530", + "label": "other commodity assistance" + }, + "value_kind": "enum_value" }, - "value_kind": "enum_value" - } - }, - "summable": false - }, - { - "key": { - "axis": "how", - "property": { - "ref": "crsCooperationModality", - "label": "CRS cooperation modality" + "relation": "child", + "parent": "CRSPurposeCode500", + "member_count": 3, + "served_rows": 41, + "served_rows_exact": true }, - "label": "modality" - }, - "binding": { - "kind": "unbound" - }, - "summable": true - }, - { - "key": { - "axis": "where", - "label": "place" - }, - "binding": { - "kind": "value", - "value": { - "ref": { - "ref": "country/KEN", - "label": "Kenya" + { + "value": { + "ref": { + "ref": "CRSPurposeCode700", + "label": "humanitarian aid" + }, + "value_kind": "enum_value" }, - "value_kind": "entity" - } - }, - "summable": false - }, - { - "key": { - "axis": "when", - "label": "time window" - }, - "binding": { - "kind": "unbound" - }, - "summable": false - }, - { - "key": { - "axis": "source", - "label": "data source" - }, - "binding": { - "kind": "unbound" - }, - "summable": false - } - ], - "inapplicable_slots": [ - "financialObligationType" - ], - "unresolved_slots": [], - "stat_vars": { - "member_count": 108, - "member_count_exact": true, - "served_count": 545, - "data_date_range": { - "start": "1997", - "end": "2024" - } - }, - "entities": [ - { - "ref": "country/KEN", - "label": "Kenya", - "entity_type": "Country", - "role": "destination" - }, - { - "ref": "country/DEU", - "label": "Germany", - "entity_type": "Country", - "role": "origin" - } - ], - "coverage": { - "kind": "breadth", - "has_data": true, - "dimensions": [ - { - "label": "sources", - "count": 1 - }, - { - "label": "observations", - "count": 12 - }, - { - "label": "variables", - "count": 51 - } - ] - }, - "facets": { - "provenance": { - "basis": "fallback", - "ref": "provenance/OECDCreditorReportingSystem", - "label": "OECD Creditor Reporting System (CRS)", - "source": { - "ref": "dc/s/OrganisationForEconomicCo-operationAndDevelopmentOecd", - "label": "Organisation for Economic Co-operation and Development (OECD)" - }, - "data_commons": { - "id": "dfo", - "label": "Development Finance Observatory" - }, - "documentation": "/api/graph/documentation/provenance/OECDCreditorReportingSystem", - "account": "provider" - }, - "unit": { - "basis": "fallback", - "ref": "CurrencyUSD", - "label": "US Dollar", - "currency": "USD" - } - }, - "slot_options": [ - { - "key": { - "axis": "how", - "property": { - "ref": "crsPurpose", - "label": "CRS purpose" + "relation": "root", + "member_count": 5, + "served_rows": 68, + "served_rows_exact": true }, - "label": "sector" - }, - "options": [ { "value": { "ref": { - "ref": "CRSPurposeCode121", - "label": "general health" + "ref": "CRSPurposeCode720", + "label": "emergency response" }, "value_kind": "enum_value" }, "relation": "child", - "parent": "CRSPurposeCode120", + "parent": "CRSPurposeCode700", "member_count": 6, - "served_rows": 82, + "served_rows": 46, "served_rows_exact": true }, { "value": { "ref": { - "ref": "CRSPurposeCode122", - "label": "basic health" + "ref": "CRSPurposeCode730", + "label": "reconstruction and rehabilitation" }, "value_kind": "enum_value" }, "relation": "child", - "parent": "CRSPurposeCode120", - "member_count": 4, - "served_rows": 108, + "parent": "CRSPurposeCode700", + "member_count": 3, + "served_rows": 14, "served_rows_exact": true }, { "value": { "ref": { - "ref": "CRSPurposeCode123", - "label": "noncommunicable disease" + "ref": "CRSPurposeCode740", + "label": "disaster preparedness" }, "value_kind": "enum_value" }, "relation": "child", - "parent": "CRSPurposeCode120", - "member_count": 3, - "served_rows": 4, + "parent": "CRSPurposeCode700", + "member_count": 0, + "served_rows": 8, "served_rows_exact": true }, { "value": { "ref": { - "ref": "CRSPurposeCode100", - "label": "social infrastructure and services" + "ref": "CRSPurposeCode930", + "label": "support for refugees and asylum seekers in donor countries" }, "value_kind": "enum_value" }, - "relation": "parent", - "member_count": 13, - "served_rows": 1214, + "relation": "root", + "member_count": 3, + "served_rows": 6, + "served_rows_exact": true + }, + { + "value": { + "ref": { + "ref": "CRSPurposeCode93010", + "label": "general support for refugees and asylum seekers in donor countries" + }, + "value_kind": "enum_value" + }, + "relation": "child", + "parent": "CRSPurposeCode930", + "member_count": 57, + "served_rows": 6, "served_rows_exact": true }, { @@ -4451,7 +5555,7 @@ }, "relation": "root", "member_count": 0, - "served_rows": 501, + "served_rows": 582, "served_rows_exact": true }, { @@ -4464,8 +5568,8 @@ }, "relation": "child", "parent": "CRSTypeOfFinance100", - "member_count": 12672, - "served_rows": 501, + "member_count": 12745, + "served_rows": 582, "served_rows_exact": true }, { @@ -4518,8 +5622,8 @@ "value_kind": "enum_value" }, "relation": "root", - "member_count": 14098, - "served_rows": 512, + "member_count": 14146, + "served_rows": 593, "served_rows_exact": true } ], @@ -4546,7 +5650,7 @@ }, "relation": "root", "member_count": 0, - "served_rows": 104, + "served_rows": 118, "served_rows_exact": true }, { @@ -4559,8 +5663,8 @@ }, "relation": "child", "parent": "CRSCooperationModalityB", - "member_count": 1606, - "served_rows": 21, + "member_count": 1614, + "served_rows": 25, "served_rows_exact": true }, { @@ -4573,8 +5677,8 @@ }, "relation": "child", "parent": "CRSCooperationModalityB", - "member_count": 1331, - "served_rows": 83, + "member_count": 1337, + "served_rows": 93, "served_rows_exact": true }, { @@ -4587,7 +5691,7 @@ }, "relation": "root", "member_count": 0, - "served_rows": 136, + "served_rows": 173, "served_rows_exact": true }, { @@ -4600,8 +5704,8 @@ }, "relation": "child", "parent": "CRSCooperationModalityC", - "member_count": 7005, - "served_rows": 136, + "member_count": 7041, + "served_rows": 173, "served_rows_exact": true }, { @@ -4614,7 +5718,7 @@ }, "relation": "root", "member_count": 0, - "served_rows": 111, + "served_rows": 116, "served_rows_exact": true }, { @@ -4628,7 +5732,7 @@ "relation": "child", "parent": "CRSCooperationModalityD", "member_count": 1600, - "served_rows": 84, + "served_rows": 87, "served_rows_exact": true }, { @@ -4641,8 +5745,8 @@ }, "relation": "child", "parent": "CRSCooperationModalityD", - "member_count": 976, - "served_rows": 27, + "member_count": 980, + "served_rows": 29, "served_rows_exact": true }, { @@ -4726,7 +5830,7 @@ "source": "observed" } ], - "rendered_sentence": "Germany's gross ODA disbursements to Kenya for education and health, 1997 to 2024. Current US dollars · OECD Creditor Reporting System (CRS).", + "rendered_sentence": "Germany's gross ODA disbursements to Kenya for education, health, and population policy, programme, and reproductive health, 1997 to 2024. Current US dollars · OECD Creditor Reporting System (CRS).", "sentence_plan": [ { "kind": "slot", @@ -4799,7 +5903,7 @@ }, { "kind": "slot", - "text": "education and health", + "text": "education, health, and population policy, programme, and reproductive health", "axis": "how", "segment": "heading", "property_dcid": "crsPurpose", @@ -4973,6 +6077,10 @@ { "ref": "CRSPurposeCode120", "label": "health" + }, + { + "ref": "CRSPurposeCode130", + "label": "population policy, programme, and reproductive health" } ], "provenance": "text_recognized" @@ -5128,226 +6236,13 @@ "selected": [] } ], - "capability_version": "cap_765c9d2a0c7529b9", + "capability_version": "cap_4913302d7a6b6435", "default_reading": { "applied": true, "removed_stat_vars": [] } }, - "alternative_measures": [ - { - "definition": { - "schema_version": 1, - "spec_id": "spec_b438dc000255d174bcc13eb675e603f7", - "identity": { - "identity_version": "spec1", - "shape": { - "kind": "statvar_schema", - "population_type": "FinancialFlow", - "measured_property": "amount", - "stat_type": "measuredValue", - "measurement_qualifier": "Nominal" - }, - "slots": [ - { - "property": "crsCooperationModality", - "binding": { - "state": "unbound" - } - }, - { - "property": "crsPurpose", - "binding": { - "state": "set", - "refs": [ - "CRSPurposeCode110", - "CRSPurposeCode120" - ] - } - }, - { - "property": "crsTypeOfFinance", - "binding": { - "state": "unbound" - } - }, - { - "property": "crsTypeOfFlow", - "binding": { - "state": "value", - "ref": "CRSTypeOfFlow10" - } - }, - { - "property": "financialFlowType", - "binding": { - "state": "value", - "ref": "Disbursement" - } - }, - { - "property": "nettingBasis", - "binding": { - "state": "value", - "ref": "Net" - } - } - ], - "entities": { - "destination": [ - "country/KEN" - ], - "origin": [ - "country/DEU" - ] - }, - "requested_window": { - "kind": "all" - } - } - }, - "label": "net disbursements", - "axis": "what", - "measure_axis_values": [ - { - "axis": "populationType", - "value": { - "ref": "FinancialFlow", - "label": "financial flow" - } - }, - { - "axis": "measuredProperty", - "value": { - "ref": "amount", - "label": "amount" - } - }, - { - "axis": "measurementQualifier", - "value": { - "ref": "Nominal", - "label": "nominal" - } - }, - { - "axis": "financialFlowType", - "value": { - "ref": "Disbursement", - "label": "disbursement" - } - }, - { - "axis": "nettingBasis", - "value": { - "ref": "Net", - "label": "net" - } - } - ], - "served_rows": 512, - "served_rows_exact": true - }, - { - "definition": { - "schema_version": 1, - "spec_id": "spec_e348565295de394da8ddaa23ec5fa475", - "identity": { - "identity_version": "spec1", - "shape": { - "kind": "statvar_schema", - "population_type": "FinancialObligation", - "measured_property": "amount", - "stat_type": "measuredValue", - "measurement_qualifier": "Nominal" - }, - "slots": [ - { - "property": "crsCooperationModality", - "binding": { - "state": "unbound" - } - }, - { - "property": "crsPurpose", - "binding": { - "state": "set", - "refs": [ - "CRSPurposeCode110", - "CRSPurposeCode120" - ] - } - }, - { - "property": "crsTypeOfFinance", - "binding": { - "state": "unbound" - } - }, - { - "property": "crsTypeOfFlow", - "binding": { - "state": "value", - "ref": "CRSTypeOfFlow10" - } - }, - { - "property": "financialObligationType", - "binding": { - "state": "value", - "ref": "Commitment" - } - } - ], - "entities": { - "destination": [ - "country/KEN" - ], - "origin": [ - "country/DEU" - ] - }, - "requested_window": { - "kind": "all" - } - } - }, - "label": "commitments", - "axis": "what", - "measure_axis_values": [ - { - "axis": "populationType", - "value": { - "ref": "FinancialObligation", - "label": "financial obligation" - } - }, - { - "axis": "measuredProperty", - "value": { - "ref": "amount", - "label": "amount" - } - }, - { - "axis": "measurementQualifier", - "value": { - "ref": "Nominal", - "label": "nominal" - } - }, - { - "axis": "financialObligationType", - "value": { - "ref": "Commitment", - "label": "commitment" - } - } - ], - "served_rows": 519, - "served_rows_exact": true - } - ], + "alternative_measures": [], "measure_label": "gross disbursements", "measure_label_axes": [ "populationType", @@ -5393,6 +6288,8 @@ } } ], + "concept_label": "education, health, and population policy, programme, and reproductive health", + "published_tables": "OECD Creditor Reporting System (CRS)", "open_axis_facts": [ { "property": "crsTypeOfFinance", @@ -5405,7 +6302,7 @@ "ref": "CRSTypeOfFinance110", "label": "standard grant" }, - "count": 105 + "count": 120 }, { "value": { @@ -5420,42 +6317,42 @@ "property": "crsCooperationModality", "varies": true, "distinct_count": 7, - "undeclared_count": 19, + "undeclared_count": 22, "values": [ { "value": { "ref": "CRSCooperationModalityC01", "label": "project-type intervention" }, - "count": 27 + "count": 30 }, { "value": { "ref": "CRSCooperationModalityB03", "label": "contribution to specific-purpose programme and fund managed by an international organisation" }, - "count": 21 + "count": 24 }, { "value": { - "ref": "CRSCooperationModalityD02", - "label": "other technical assistance" + "ref": "CRSCooperationModalityB01", + "label": "core support to non-governmental organisations, other private bodies, public-private partnerships, and research institutes" }, - "count": 16 + "count": 18 }, { "value": { - "ref": "CRSCooperationModalityB01", - "label": "core support to non-governmental organisations, other private bodies, public-private partnerships, and research institutes" + "ref": "CRSCooperationModalityD02", + "label": "other technical assistance" }, - "count": 15 + "count": 18 }, { "value": { "ref": "CRSCooperationModalityD01", "label": "donor country personnel" }, - "count": 8 + "count": 9 }, { "value": { @@ -7423,25 +8320,396 @@ "base_year_max": 2025 }, { - "code": "ZMW", - "noun": "Zambian kwachas", - "current_years": { - "start_year": 1980, - "end_year": 2025 - }, - "constant_years": { - "start_year": 1960, - "end_year": 2025 - }, - "base_year_min": 1980, - "base_year_max": 2025 + "code": "ZMW", + "noun": "Zambian kwachas", + "current_years": { + "start_year": 1980, + "end_year": 2025 + }, + "constant_years": { + "start_year": 1960, + "end_year": 2025 + }, + "base_year_min": 1980, + "base_year_max": 2025 + } + ], + "default_base_year": 2024, + "role_currencies": { + "destination": "KES", + "origin": "EUR" + } + }, + "scope_choices": { + "id": "spec_7a02b6facd2dc17b5d0d7c35c11bf5d2", + "base": { + "schema_version": 1, + "spec_id": "spec_7a02b6facd2dc17b5d0d7c35c11bf5d2", + "identity": { + "identity_version": "spec1", + "shape": { + "kind": "statvar_schema", + "population_type": "FinancialFlow", + "measured_property": "amount", + "stat_type": "measuredValue", + "measurement_qualifier": "Nominal" + }, + "slots": [ + { + "property": "crsCooperationModality", + "binding": { + "state": "unbound" + } + }, + { + "property": "crsPurpose", + "binding": { + "state": "set", + "refs": [ + "CRSPurposeCode110", + "CRSPurposeCode120", + "CRSPurposeCode130" + ] + } + }, + { + "property": "crsTypeOfFinance", + "binding": { + "state": "unbound" + } + }, + { + "property": "crsTypeOfFlow", + "binding": { + "state": "value", + "ref": "CRSTypeOfFlow10" + } + }, + { + "property": "financialFlowType", + "binding": { + "state": "value", + "ref": "Disbursement" + } + }, + { + "property": "nettingBasis", + "binding": { + "state": "value", + "ref": "Gross" + } + } + ], + "entities": { + "destination": [ + "country/KEN" + ], + "origin": [ + "country/DEU" + ] + }, + "requested_window": { + "kind": "all" + } + } + }, + "rule_version": "scope1:3eef00a928eedd463ee48d02b79730da", + "entries": [], + "dropped_entries": [ + { + "entry": { + "axis": "sector", + "option_id": "sector:110", + "provenance": "explicit", + "origin": { + "kind": "text", + "text": "education", + "start": 0, + "end": 9 + } + }, + "code": "stated_choice_not_applied", + "cause": "option_unknown" + } + ], + "choices": [ + { + "id": "spec_7a02b6facd2dc17b5d0d7c35c11bf5d2:sector", + "axis": "sector", + "rule": "sector_code", + "provenance": "default", + "active": "sector:110+120+130", + "options": [ + { + "option_id": "sector:110+120+130", + "label": "education (CRS 110) + health (CRS 120) + population policy, programme, and reproductive health (CRS 130)", + "binding": { + "kind": "slot", + "slot": "crsPurpose", + "state": "set", + "refs": [ + "CRSPurposeCode110", + "CRSPurposeCode120", + "CRSPurposeCode130" + ] + }, + "availability": { + "status": "available", + "detail": {} + } + } + ] + }, + { + "id": "spec_7a02b6facd2dc17b5d0d7c35c11bf5d2:measure_basis", + "axis": "measure_basis", + "rule": "measure_basis_convention", + "provenance": "default", + "active": "measure_basis:gross", + "options": [ + { + "option_id": "measure_basis:gross", + "label": "gross disbursements, current USD", + "binding": { + "kind": "shape", + "measured_property": "amount", + "netting_basis": "Gross" + }, + "availability": { + "status": "available", + "detail": {} + } + }, + { + "option_id": "measure_basis:net", + "label": "net disbursements, current USD", + "binding": { + "kind": "shape", + "measured_property": "amount", + "netting_basis": "Net" + }, + "availability": { + "status": "available", + "detail": {} + } + }, + { + "option_id": "measure_basis:grant_equivalent", + "label": "grant equivalents (OECD headline), current USD", + "binding": { + "kind": "shape", + "measured_property": "grantEquivalent", + "netting_basis": null + }, + "availability": { + "status": "available", + "detail": {} + } + }, + { + "option_id": "measure_basis:commitments", + "label": "commitments, current USD", + "binding": { + "kind": "shape", + "measured_property": "amount", + "netting_basis": null + }, + "availability": { + "status": "available", + "detail": {} + } + } + ] + }, + { + "id": "spec_7a02b6facd2dc17b5d0d7c35c11bf5d2:provider", + "axis": "provider", + "rule": "bilateral_flows", + "provenance": "default", + "active": "provider:bilateral", + "options": [ + { + "option_id": "provider:bilateral", + "label": "bilateral flows only", + "binding": { + "kind": "provider", + "scope": "bilateral" + }, + "availability": { + "status": "available", + "detail": {} + } + }, + { + "option_id": "provider:inclusive", + "label": "bilateral plus imputed multilateral, 2011 to 2024", + "binding": { + "kind": "provider", + "scope": "inclusive", + "window": [ + 2011, + 2024 + ], + "provenance": "provenance/ONEBilateralAndImputedMultilateral" + }, + "availability": { + "status": "partial", + "years": [ + [ + 2011, + 2024 + ] + ], + "code": "imputed_coverage", + "detail": {} + } + } + ] } ], - "default_base_year": 2024, - "role_currencies": { - "destination": "KES", - "origin": "EUR" - } + "compiled": { + "spec_id": "spec_7a02b6facd2dc17b5d0d7c35c11bf5d2", + "identity": { + "identity_version": "spec1", + "shape": { + "kind": "statvar_schema", + "population_type": "FinancialFlow", + "measured_property": "amount", + "stat_type": "measuredValue", + "measurement_qualifier": "Nominal" + }, + "slots": [ + { + "property": "crsCooperationModality", + "binding": { + "state": "unbound" + } + }, + { + "property": "crsPurpose", + "binding": { + "state": "set", + "refs": [ + "CRSPurposeCode110", + "CRSPurposeCode120", + "CRSPurposeCode130" + ] + } + }, + { + "property": "crsTypeOfFinance", + "binding": { + "state": "unbound" + } + }, + { + "property": "crsTypeOfFlow", + "binding": { + "state": "value", + "ref": "CRSTypeOfFlow10" + } + }, + { + "property": "financialFlowType", + "binding": { + "state": "value", + "ref": "Disbursement" + } + }, + { + "property": "nettingBasis", + "binding": { + "state": "value", + "ref": "Gross" + } + } + ], + "entities": { + "destination": [ + "country/KEN" + ], + "origin": [ + "country/DEU" + ] + }, + "requested_window": { + "kind": "all" + } + }, + "components": [ + { + "role": "whole", + "identity": { + "identity_version": "spec1", + "shape": { + "kind": "statvar_schema", + "population_type": "FinancialFlow", + "measured_property": "amount", + "stat_type": "measuredValue", + "measurement_qualifier": "Nominal" + }, + "slots": [ + { + "property": "crsCooperationModality", + "binding": { + "state": "unbound" + } + }, + { + "property": "crsPurpose", + "binding": { + "state": "set", + "refs": [ + "CRSPurposeCode110", + "CRSPurposeCode120", + "CRSPurposeCode130" + ] + } + }, + { + "property": "crsTypeOfFinance", + "binding": { + "state": "unbound" + } + }, + { + "property": "crsTypeOfFlow", + "binding": { + "state": "value", + "ref": "CRSTypeOfFlow10" + } + }, + { + "property": "financialFlowType", + "binding": { + "state": "value", + "ref": "Disbursement" + } + }, + { + "property": "nettingBasis", + "binding": { + "state": "value", + "ref": "Gross" + } + } + ], + "entities": { + "destination": [ + "country/KEN" + ], + "origin": [ + "country/DEU" + ] + }, + "requested_window": { + "kind": "all" + } + } + } + ] + }, + "ledger": [] } } } @@ -7461,30 +8729,30 @@ } ], "timing_ms": { - "total": 2851, + "total": 5202, "by_step": { - "recall": 360, + "recall": 1145, "phase_resolve_places": 0, "phase_check_entities": 0, - "shape_arcs": 4, - "shape_probe_coverage": 2, - "shape_probe": 121, - "shape_groups": 841, - "shape_labels": 17, - "shape_admission": 4, + "shape_arcs": 5, + "shape_probe_coverage": 4, + "shape_probe": 1327, + "shape_groups": 85, + "shape_labels": 11, + "shape_admission": 2, "phase_derive_shapes": 0, - "shape": 1100, + "shape": 1663, "phase_prune_and_rank": 0, - "bind": 261, - "phase_bind": 16, - "phase_settle": 7, - "phase_place_bindings": 554, + "bind": 216, + "phase_bind": 39, + "phase_settle": 18, + "phase_place_bindings": 1429, "phase_facet_requests": 0, - "materialise": 96, - "phase_materialise": 17, - "answer": 239, - "options": 188, - "phase_outcome": 13 + "materialise": 147, + "phase_materialise": 19, + "answer": 102, + "options": 400, + "phase_outcome": 24 } }, "restatement": { @@ -8921,7 +10189,7 @@ } ], "query_qualifiers": [], - "capability_version": "cap_765c9d2a0c7529b9", + "capability_version": "cap_4913302d7a6b6435", "default_reading": { "applied": true, "removed_stat_vars": [ @@ -9454,7 +10722,7 @@ } ], "query_qualifiers": [], - "capability_version": "cap_765c9d2a0c7529b9", + "capability_version": "cap_4913302d7a6b6435", "default_reading": { "applied": true, "removed_stat_vars": [ @@ -9493,12 +10761,14 @@ "confidence": "high", "available_at_place": true, "measure_label_axes": [], - "measure_axis_values": [] + "measure_axis_values": [], + "published_tables": "IMF World Economic Outlook (WEO)" } } ], "measure_label_axes": [], "measure_axis_values": [], + "published_tables": "World Development Indicators", "related_group": { "ref": "dc/g/EconomicActivity_ActivitySource-GrossDomesticProduction", "label": "Economic Activity With Activity Source = Gross Domestic Production" @@ -9546,7 +10816,7 @@ } } ], - "rendered_sentence": "Germany's gross ODA disbursements to Kenya for education and health, 1997 to 2024. Current US dollars · OECD Creditor Reporting System (CRS). GDP in Germany and Kenya, 1960 to 2025. Current US dollars · World Development Indicators. You named Germany as a provider. This measure has no providers, so this shows the place itself. You named Kenya as a recipient. This measure has no recipients, so this shows the place itself.", + "rendered_sentence": "Germany's gross ODA disbursements to Kenya for education, health, and population policy, programme, and reproductive health, 1997 to 2024. Current US dollars · OECD Creditor Reporting System (CRS). GDP in Germany and Kenya, 1960 to 2025. Current US dollars · World Development Indicators. You named Germany as a provider. This measure has no providers, so this shows the place itself. You named Kenya as a recipient. This measure has no recipients, so this shows the place itself.", "sentence_plan": [ { "kind": "slot", @@ -9619,7 +10889,7 @@ }, { "kind": "slot", - "text": "education and health", + "text": "education, health, and population policy, programme, and reproductive health", "axis": "how", "segment": "heading", "property_dcid": "crsPurpose", @@ -9953,10 +11223,10 @@ "schema_version": 1, "input": { "kind": "spec_id", - "spec_id": "spec_25f482395c5d012ec278118f38dff29c", + "spec_id": "spec_7a02b6facd2dc17b5d0d7c35c11bf5d2", "definition": { "schema_version": 1, - "spec_id": "spec_25f482395c5d012ec278118f38dff29c", + "spec_id": "spec_7a02b6facd2dc17b5d0d7c35c11bf5d2", "identity": { "identity_version": "spec1", "shape": { @@ -9979,7 +11249,8 @@ "state": "set", "refs": [ "CRSPurposeCode110", - "CRSPurposeCode120" + "CRSPurposeCode120", + "CRSPurposeCode130" ] } }, @@ -10036,13 +11307,13 @@ "status": 200, "headers": { "content-type": "application/json", - "x-dfo-trace-id": "9b2918c16ee54353a38b2401d62c118a" + "x-dfo-trace-id": "557550d777fb412fa5e6e590fb30997c" }, "json": { "schema_version": 1, "definition": { "schema_version": 1, - "spec_id": "spec_25f482395c5d012ec278118f38dff29c", + "spec_id": "spec_7a02b6facd2dc17b5d0d7c35c11bf5d2", "identity": { "shape": { "kind": "statvar_schema", @@ -10062,7 +11333,8 @@ "binding": { "refs": [ "CRSPurposeCode110", - "CRSPurposeCode120" + "CRSPurposeCode120", + "CRSPurposeCode130" ], "state": "set" }, @@ -10110,10 +11382,10 @@ } } }, - "content_version": "cv_d6ce435ea267b46680c94eae9423d420", - "prepared_at": "2026-10-20T15:55:47Z", + "content_version": "cv_b600e3429190c07d98f8d59720cde7ba", + "prepared_at": "2026-10-29T22:25:13Z", "coverage": { - "rows": 512, + "rows": 593, "dimensions": [ { "label": "financingProvider", @@ -10169,8 +11441,8 @@ "source_data_url": "https://webfs-dcd.oecd.org/files/dotStat/DSD_CRS/CRS.parquet", "attribution": "OECD (2026), Creditor Reporting System (CRS), OECD Data Explorer, https://webfs-dcd.oecd.org/files/dotStat/DSD_CRS/CRS.parquet (accessed on 2026-10-15)", "update_cadence": "Quarterly", - "last_update": "2026-10-15", - "years_covered": "1973-2024", + "last_update": "2026-10-29", + "years_covered": "1973-2025", "granularity": "Annual, by provider and recipient", "currencies": [ "USD" @@ -10181,8 +11453,8 @@ "description": "The complete CRS file is downloaded from the OECD each time the pipeline runs, and replaces the previous copy, so the data reflects the OECD's latest release." }, { - "transformation": "Exclude the partial preliminary year", - "description": "Before each full release, the OECD publishes preliminary data for the year that release covers, as reporters submit it. Until then, that year is partial, so the pipeline excludes it. Support for partial years is in development. Partial years will be marked incomplete, so they don't lead to incorrect or confusing analyses." + "transformation": "Mark the partial year", + "description": "The OECD publishes data for a year as donors report it, and its final release in December of the following year covers every donor. Until then, the year is partial. The pipeline publishes it, and the import's provenance names it in `partialObservationDate`." }, { "transformation": "Exclude donor core contributions to multilaterals", @@ -10202,13 +11474,23 @@ } ], "version_history": [ + { + "date": "2026-10-29", + "title": "Partial year published, marked as partial", + "changes": [ + { + "kind": "changed", + "note": "The partial year, which only some donors have reported ahead of the OECD's final release in December, is included, and the import's provenance marks it with `partialObservationDate`." + } + ] + }, { "date": "2026-10-15", - "title": "Partial preliminary year excluded", + "title": "Partial year excluded", "changes": [ { "kind": "changed", - "note": "The partial preliminary year published ahead of the next full release is excluded." + "note": "The partial year, which only some donors have reported ahead of the OECD's final release in December, is excluded." } ] }, @@ -10254,21 +11536,21 @@ "end_year": 2024, "start_year": 1997 }, - "graph_revision": "dfo-dev-dc-datacommons-service-00259-rpx", + "graph_revision": "dfo-dev-dc-datacommons-service-00280-hww", "normalisations": [], "code_index_stamp": { - "exported_at": "2026-10-20T13:18:18Z", - "content_hash": "602c7022fc21c17540a6873d93196ad6b967eaae3e71f9dce6dec178a735daf4", + "exported_at": "2026-10-29T17:06:13Z", + "content_hash": "000e2f88c4c71cf9ae60911d71c97dbc43c13ccb291ef9ca3584d75157b97e9e", "graph_endpoint": "graph_release" }, "source_revisions": [ { "source": "provenance/OECDCreditorReportingSystem", - "revision": "2026-10-15" + "revision": "2026-10-29" } ], - "capability_version": "dset_1e6cd9546fac19e9", - "materialiser_build": "8408f1f95c622223f8fa6e9ba55826ee8e22a852", + "capability_version": "dset_9ab17ec0e311a676", + "materialiser_build": "822036e7baafeec121646d059962f75762f849db", "resolved_stat_vars": [ { "ref": "dcid:Amount_FinancialFlow_Gross_Disbursement_CRSTypeOfFlow10_CRSTypeOfFinance110_CRSCooperationModalityA01_CRSPurposeCode11330_Nominal", @@ -10502,6 +11784,46 @@ ], "observation_count": 0 }, + { + "ref": "dcid:Amount_FinancialFlow_Gross_Disbursement_CRSTypeOfFlow10_CRSTypeOfFinance110_CRSCooperationModalityA02_CRSPurposeCode13010_Nominal", + "roles": [ + "financingProvider", + "financingRecipient" + ], + "observation_count": 0 + }, + { + "ref": "dcid:Amount_FinancialFlow_Gross_Disbursement_CRSTypeOfFlow10_CRSTypeOfFinance110_CRSCooperationModalityA02_CRSPurposeCode13020_Nominal", + "roles": [ + "financingProvider", + "financingRecipient" + ], + "observation_count": 0 + }, + { + "ref": "dcid:Amount_FinancialFlow_Gross_Disbursement_CRSTypeOfFlow10_CRSTypeOfFinance110_CRSCooperationModalityA02_CRSPurposeCode13030_Nominal", + "roles": [ + "financingProvider", + "financingRecipient" + ], + "observation_count": 0 + }, + { + "ref": "dcid:Amount_FinancialFlow_Gross_Disbursement_CRSTypeOfFlow10_CRSTypeOfFinance110_CRSCooperationModalityA02_CRSPurposeCode13040_Nominal", + "roles": [ + "financingProvider", + "financingRecipient" + ], + "observation_count": 0 + }, + { + "ref": "dcid:Amount_FinancialFlow_Gross_Disbursement_CRSTypeOfFlow10_CRSTypeOfFinance110_CRSCooperationModalityA02_CRSPurposeCode13081_Nominal", + "roles": [ + "financingProvider", + "financingRecipient" + ], + "observation_count": 0 + }, { "ref": "dcid:Amount_FinancialFlow_Gross_Disbursement_CRSTypeOfFlow10_CRSTypeOfFinance110_CRSCooperationModalityB01_CRSPurposeCode11110_Nominal", "roles": [ @@ -10774,6 +12096,46 @@ ], "observation_count": 0 }, + { + "ref": "dcid:Amount_FinancialFlow_Gross_Disbursement_CRSTypeOfFlow10_CRSTypeOfFinance110_CRSCooperationModalityB01_CRSPurposeCode13010_Nominal", + "roles": [ + "financingProvider", + "financingRecipient" + ], + "observation_count": 0 + }, + { + "ref": "dcid:Amount_FinancialFlow_Gross_Disbursement_CRSTypeOfFlow10_CRSTypeOfFinance110_CRSCooperationModalityB01_CRSPurposeCode13020_Nominal", + "roles": [ + "financingProvider", + "financingRecipient" + ], + "observation_count": 3 + }, + { + "ref": "dcid:Amount_FinancialFlow_Gross_Disbursement_CRSTypeOfFlow10_CRSTypeOfFinance110_CRSCooperationModalityB01_CRSPurposeCode13030_Nominal", + "roles": [ + "financingProvider", + "financingRecipient" + ], + "observation_count": 3 + }, + { + "ref": "dcid:Amount_FinancialFlow_Gross_Disbursement_CRSTypeOfFlow10_CRSTypeOfFinance110_CRSCooperationModalityB01_CRSPurposeCode13040_Nominal", + "roles": [ + "financingProvider", + "financingRecipient" + ], + "observation_count": 4 + }, + { + "ref": "dcid:Amount_FinancialFlow_Gross_Disbursement_CRSTypeOfFlow10_CRSTypeOfFinance110_CRSCooperationModalityB01_CRSPurposeCode13081_Nominal", + "roles": [ + "financingProvider", + "financingRecipient" + ], + "observation_count": 0 + }, { "ref": "dcid:Amount_FinancialFlow_Gross_Disbursement_CRSTypeOfFlow10_CRSTypeOfFinance110_CRSCooperationModalityB031_CRSPurposeCode11110_Nominal", "roles": [ @@ -10958,6 +12320,46 @@ ], "observation_count": 0 }, + { + "ref": "dcid:Amount_FinancialFlow_Gross_Disbursement_CRSTypeOfFlow10_CRSTypeOfFinance110_CRSCooperationModalityB031_CRSPurposeCode13010_Nominal", + "roles": [ + "financingProvider", + "financingRecipient" + ], + "observation_count": 0 + }, + { + "ref": "dcid:Amount_FinancialFlow_Gross_Disbursement_CRSTypeOfFlow10_CRSTypeOfFinance110_CRSCooperationModalityB031_CRSPurposeCode13020_Nominal", + "roles": [ + "financingProvider", + "financingRecipient" + ], + "observation_count": 0 + }, + { + "ref": "dcid:Amount_FinancialFlow_Gross_Disbursement_CRSTypeOfFlow10_CRSTypeOfFinance110_CRSCooperationModalityB031_CRSPurposeCode13030_Nominal", + "roles": [ + "financingProvider", + "financingRecipient" + ], + "observation_count": 0 + }, + { + "ref": "dcid:Amount_FinancialFlow_Gross_Disbursement_CRSTypeOfFlow10_CRSTypeOfFinance110_CRSCooperationModalityB031_CRSPurposeCode13040_Nominal", + "roles": [ + "financingProvider", + "financingRecipient" + ], + "observation_count": 0 + }, + { + "ref": "dcid:Amount_FinancialFlow_Gross_Disbursement_CRSTypeOfFlow10_CRSTypeOfFinance110_CRSCooperationModalityB031_CRSPurposeCode13081_Nominal", + "roles": [ + "financingProvider", + "financingRecipient" + ], + "observation_count": 0 + }, { "ref": "dcid:Amount_FinancialFlow_Gross_Disbursement_CRSTypeOfFlow10_CRSTypeOfFinance110_CRSCooperationModalityB032_CRSPurposeCode11110_Nominal", "roles": [ @@ -11151,7 +12553,47 @@ "observation_count": 0 }, { - "ref": "dcid:Amount_FinancialFlow_Gross_Disbursement_CRSTypeOfFlow10_CRSTypeOfFinance110_CRSCooperationModalityB032_CRSPurposeCode12263_Nominal", + "ref": "dcid:Amount_FinancialFlow_Gross_Disbursement_CRSTypeOfFlow10_CRSTypeOfFinance110_CRSCooperationModalityB032_CRSPurposeCode12263_Nominal", + "roles": [ + "financingProvider", + "financingRecipient" + ], + "observation_count": 0 + }, + { + "ref": "dcid:Amount_FinancialFlow_Gross_Disbursement_CRSTypeOfFlow10_CRSTypeOfFinance110_CRSCooperationModalityB032_CRSPurposeCode12264_Nominal", + "roles": [ + "financingProvider", + "financingRecipient" + ], + "observation_count": 0 + }, + { + "ref": "dcid:Amount_FinancialFlow_Gross_Disbursement_CRSTypeOfFlow10_CRSTypeOfFinance110_CRSCooperationModalityB032_CRSPurposeCode12281_Nominal", + "roles": [ + "financingProvider", + "financingRecipient" + ], + "observation_count": 0 + }, + { + "ref": "dcid:Amount_FinancialFlow_Gross_Disbursement_CRSTypeOfFlow10_CRSTypeOfFinance110_CRSCooperationModalityB032_CRSPurposeCode12310_Nominal", + "roles": [ + "financingProvider", + "financingRecipient" + ], + "observation_count": 0 + }, + { + "ref": "dcid:Amount_FinancialFlow_Gross_Disbursement_CRSTypeOfFlow10_CRSTypeOfFinance110_CRSCooperationModalityB032_CRSPurposeCode12320_Nominal", + "roles": [ + "financingProvider", + "financingRecipient" + ], + "observation_count": 0 + }, + { + "ref": "dcid:Amount_FinancialFlow_Gross_Disbursement_CRSTypeOfFlow10_CRSTypeOfFinance110_CRSCooperationModalityB032_CRSPurposeCode12330_Nominal", "roles": [ "financingProvider", "financingRecipient" @@ -11159,7 +12601,7 @@ "observation_count": 0 }, { - "ref": "dcid:Amount_FinancialFlow_Gross_Disbursement_CRSTypeOfFlow10_CRSTypeOfFinance110_CRSCooperationModalityB032_CRSPurposeCode12264_Nominal", + "ref": "dcid:Amount_FinancialFlow_Gross_Disbursement_CRSTypeOfFlow10_CRSTypeOfFinance110_CRSCooperationModalityB032_CRSPurposeCode12340_Nominal", "roles": [ "financingProvider", "financingRecipient" @@ -11167,7 +12609,7 @@ "observation_count": 0 }, { - "ref": "dcid:Amount_FinancialFlow_Gross_Disbursement_CRSTypeOfFlow10_CRSTypeOfFinance110_CRSCooperationModalityB032_CRSPurposeCode12281_Nominal", + "ref": "dcid:Amount_FinancialFlow_Gross_Disbursement_CRSTypeOfFlow10_CRSTypeOfFinance110_CRSCooperationModalityB032_CRSPurposeCode12350_Nominal", "roles": [ "financingProvider", "financingRecipient" @@ -11175,7 +12617,7 @@ "observation_count": 0 }, { - "ref": "dcid:Amount_FinancialFlow_Gross_Disbursement_CRSTypeOfFlow10_CRSTypeOfFinance110_CRSCooperationModalityB032_CRSPurposeCode12310_Nominal", + "ref": "dcid:Amount_FinancialFlow_Gross_Disbursement_CRSTypeOfFlow10_CRSTypeOfFinance110_CRSCooperationModalityB032_CRSPurposeCode12382_Nominal", "roles": [ "financingProvider", "financingRecipient" @@ -11183,7 +12625,7 @@ "observation_count": 0 }, { - "ref": "dcid:Amount_FinancialFlow_Gross_Disbursement_CRSTypeOfFlow10_CRSTypeOfFinance110_CRSCooperationModalityB032_CRSPurposeCode12320_Nominal", + "ref": "dcid:Amount_FinancialFlow_Gross_Disbursement_CRSTypeOfFlow10_CRSTypeOfFinance110_CRSCooperationModalityB032_CRSPurposeCode13010_Nominal", "roles": [ "financingProvider", "financingRecipient" @@ -11191,7 +12633,7 @@ "observation_count": 0 }, { - "ref": "dcid:Amount_FinancialFlow_Gross_Disbursement_CRSTypeOfFlow10_CRSTypeOfFinance110_CRSCooperationModalityB032_CRSPurposeCode12330_Nominal", + "ref": "dcid:Amount_FinancialFlow_Gross_Disbursement_CRSTypeOfFlow10_CRSTypeOfFinance110_CRSCooperationModalityB032_CRSPurposeCode13020_Nominal", "roles": [ "financingProvider", "financingRecipient" @@ -11199,7 +12641,7 @@ "observation_count": 0 }, { - "ref": "dcid:Amount_FinancialFlow_Gross_Disbursement_CRSTypeOfFlow10_CRSTypeOfFinance110_CRSCooperationModalityB032_CRSPurposeCode12340_Nominal", + "ref": "dcid:Amount_FinancialFlow_Gross_Disbursement_CRSTypeOfFlow10_CRSTypeOfFinance110_CRSCooperationModalityB032_CRSPurposeCode13030_Nominal", "roles": [ "financingProvider", "financingRecipient" @@ -11207,7 +12649,7 @@ "observation_count": 0 }, { - "ref": "dcid:Amount_FinancialFlow_Gross_Disbursement_CRSTypeOfFlow10_CRSTypeOfFinance110_CRSCooperationModalityB032_CRSPurposeCode12350_Nominal", + "ref": "dcid:Amount_FinancialFlow_Gross_Disbursement_CRSTypeOfFlow10_CRSTypeOfFinance110_CRSCooperationModalityB032_CRSPurposeCode13040_Nominal", "roles": [ "financingProvider", "financingRecipient" @@ -11215,7 +12657,7 @@ "observation_count": 0 }, { - "ref": "dcid:Amount_FinancialFlow_Gross_Disbursement_CRSTypeOfFlow10_CRSTypeOfFinance110_CRSCooperationModalityB032_CRSPurposeCode12382_Nominal", + "ref": "dcid:Amount_FinancialFlow_Gross_Disbursement_CRSTypeOfFlow10_CRSTypeOfFinance110_CRSCooperationModalityB032_CRSPurposeCode13081_Nominal", "roles": [ "financingProvider", "financingRecipient" @@ -11462,6 +12904,38 @@ ], "observation_count": 0 }, + { + "ref": "dcid:Amount_FinancialFlow_Gross_Disbursement_CRSTypeOfFlow10_CRSTypeOfFinance110_CRSCooperationModalityB033_CRSPurposeCode13010_Nominal", + "roles": [ + "financingProvider", + "financingRecipient" + ], + "observation_count": 0 + }, + { + "ref": "dcid:Amount_FinancialFlow_Gross_Disbursement_CRSTypeOfFlow10_CRSTypeOfFinance110_CRSCooperationModalityB033_CRSPurposeCode13020_Nominal", + "roles": [ + "financingProvider", + "financingRecipient" + ], + "observation_count": 0 + }, + { + "ref": "dcid:Amount_FinancialFlow_Gross_Disbursement_CRSTypeOfFlow10_CRSTypeOfFinance110_CRSCooperationModalityB033_CRSPurposeCode13030_Nominal", + "roles": [ + "financingProvider", + "financingRecipient" + ], + "observation_count": 0 + }, + { + "ref": "dcid:Amount_FinancialFlow_Gross_Disbursement_CRSTypeOfFlow10_CRSTypeOfFinance110_CRSCooperationModalityB033_CRSPurposeCode13040_Nominal", + "roles": [ + "financingProvider", + "financingRecipient" + ], + "observation_count": 0 + }, { "ref": "dcid:Amount_FinancialFlow_Gross_Disbursement_CRSTypeOfFlow10_CRSTypeOfFinance110_CRSCooperationModalityB03_CRSPurposeCode11110_Nominal", "roles": [ @@ -11734,6 +13208,46 @@ ], "observation_count": 0 }, + { + "ref": "dcid:Amount_FinancialFlow_Gross_Disbursement_CRSTypeOfFlow10_CRSTypeOfFinance110_CRSCooperationModalityB03_CRSPurposeCode13010_Nominal", + "roles": [ + "financingProvider", + "financingRecipient" + ], + "observation_count": 0 + }, + { + "ref": "dcid:Amount_FinancialFlow_Gross_Disbursement_CRSTypeOfFlow10_CRSTypeOfFinance110_CRSCooperationModalityB03_CRSPurposeCode13020_Nominal", + "roles": [ + "financingProvider", + "financingRecipient" + ], + "observation_count": 1 + }, + { + "ref": "dcid:Amount_FinancialFlow_Gross_Disbursement_CRSTypeOfFlow10_CRSTypeOfFinance110_CRSCooperationModalityB03_CRSPurposeCode13030_Nominal", + "roles": [ + "financingProvider", + "financingRecipient" + ], + "observation_count": 0 + }, + { + "ref": "dcid:Amount_FinancialFlow_Gross_Disbursement_CRSTypeOfFlow10_CRSTypeOfFinance110_CRSCooperationModalityB03_CRSPurposeCode13040_Nominal", + "roles": [ + "financingProvider", + "financingRecipient" + ], + "observation_count": 2 + }, + { + "ref": "dcid:Amount_FinancialFlow_Gross_Disbursement_CRSTypeOfFlow10_CRSTypeOfFinance110_CRSCooperationModalityB03_CRSPurposeCode13081_Nominal", + "roles": [ + "financingProvider", + "financingRecipient" + ], + "observation_count": 1 + }, { "ref": "dcid:Amount_FinancialFlow_Gross_Disbursement_CRSTypeOfFlow10_CRSTypeOfFinance110_CRSCooperationModalityB04_CRSPurposeCode11110_Nominal", "roles": [ @@ -11958,6 +13472,46 @@ ], "observation_count": 0 }, + { + "ref": "dcid:Amount_FinancialFlow_Gross_Disbursement_CRSTypeOfFlow10_CRSTypeOfFinance110_CRSCooperationModalityB04_CRSPurposeCode13010_Nominal", + "roles": [ + "financingProvider", + "financingRecipient" + ], + "observation_count": 0 + }, + { + "ref": "dcid:Amount_FinancialFlow_Gross_Disbursement_CRSTypeOfFlow10_CRSTypeOfFinance110_CRSCooperationModalityB04_CRSPurposeCode13020_Nominal", + "roles": [ + "financingProvider", + "financingRecipient" + ], + "observation_count": 0 + }, + { + "ref": "dcid:Amount_FinancialFlow_Gross_Disbursement_CRSTypeOfFlow10_CRSTypeOfFinance110_CRSCooperationModalityB04_CRSPurposeCode13030_Nominal", + "roles": [ + "financingProvider", + "financingRecipient" + ], + "observation_count": 0 + }, + { + "ref": "dcid:Amount_FinancialFlow_Gross_Disbursement_CRSTypeOfFlow10_CRSTypeOfFinance110_CRSCooperationModalityB04_CRSPurposeCode13040_Nominal", + "roles": [ + "financingProvider", + "financingRecipient" + ], + "observation_count": 0 + }, + { + "ref": "dcid:Amount_FinancialFlow_Gross_Disbursement_CRSTypeOfFlow10_CRSTypeOfFinance110_CRSCooperationModalityB04_CRSPurposeCode13081_Nominal", + "roles": [ + "financingProvider", + "financingRecipient" + ], + "observation_count": 0 + }, { "ref": "dcid:Amount_FinancialFlow_Gross_Disbursement_CRSTypeOfFlow10_CRSTypeOfFinance110_CRSCooperationModalityC01_CRSPurposeCode11110_Nominal", "roles": [ @@ -12230,6 +13784,46 @@ ], "observation_count": 0 }, + { + "ref": "dcid:Amount_FinancialFlow_Gross_Disbursement_CRSTypeOfFlow10_CRSTypeOfFinance110_CRSCooperationModalityC01_CRSPurposeCode13010_Nominal", + "roles": [ + "financingProvider", + "financingRecipient" + ], + "observation_count": 0 + }, + { + "ref": "dcid:Amount_FinancialFlow_Gross_Disbursement_CRSTypeOfFlow10_CRSTypeOfFinance110_CRSCooperationModalityC01_CRSPurposeCode13020_Nominal", + "roles": [ + "financingProvider", + "financingRecipient" + ], + "observation_count": 19 + }, + { + "ref": "dcid:Amount_FinancialFlow_Gross_Disbursement_CRSTypeOfFlow10_CRSTypeOfFinance110_CRSCooperationModalityC01_CRSPurposeCode13030_Nominal", + "roles": [ + "financingProvider", + "financingRecipient" + ], + "observation_count": 8 + }, + { + "ref": "dcid:Amount_FinancialFlow_Gross_Disbursement_CRSTypeOfFlow10_CRSTypeOfFinance110_CRSCooperationModalityC01_CRSPurposeCode13040_Nominal", + "roles": [ + "financingProvider", + "financingRecipient" + ], + "observation_count": 10 + }, + { + "ref": "dcid:Amount_FinancialFlow_Gross_Disbursement_CRSTypeOfFlow10_CRSTypeOfFinance110_CRSCooperationModalityC01_CRSPurposeCode13081_Nominal", + "roles": [ + "financingProvider", + "financingRecipient" + ], + "observation_count": 0 + }, { "ref": "dcid:Amount_FinancialFlow_Gross_Disbursement_CRSTypeOfFlow10_CRSTypeOfFinance110_CRSCooperationModalityD01_CRSPurposeCode11110_Nominal", "roles": [ @@ -12502,6 +14096,46 @@ ], "observation_count": 0 }, + { + "ref": "dcid:Amount_FinancialFlow_Gross_Disbursement_CRSTypeOfFlow10_CRSTypeOfFinance110_CRSCooperationModalityD01_CRSPurposeCode13010_Nominal", + "roles": [ + "financingProvider", + "financingRecipient" + ], + "observation_count": 0 + }, + { + "ref": "dcid:Amount_FinancialFlow_Gross_Disbursement_CRSTypeOfFlow10_CRSTypeOfFinance110_CRSCooperationModalityD01_CRSPurposeCode13020_Nominal", + "roles": [ + "financingProvider", + "financingRecipient" + ], + "observation_count": 0 + }, + { + "ref": "dcid:Amount_FinancialFlow_Gross_Disbursement_CRSTypeOfFlow10_CRSTypeOfFinance110_CRSCooperationModalityD01_CRSPurposeCode13030_Nominal", + "roles": [ + "financingProvider", + "financingRecipient" + ], + "observation_count": 0 + }, + { + "ref": "dcid:Amount_FinancialFlow_Gross_Disbursement_CRSTypeOfFlow10_CRSTypeOfFinance110_CRSCooperationModalityD01_CRSPurposeCode13040_Nominal", + "roles": [ + "financingProvider", + "financingRecipient" + ], + "observation_count": 2 + }, + { + "ref": "dcid:Amount_FinancialFlow_Gross_Disbursement_CRSTypeOfFlow10_CRSTypeOfFinance110_CRSCooperationModalityD01_CRSPurposeCode13081_Nominal", + "roles": [ + "financingProvider", + "financingRecipient" + ], + "observation_count": 0 + }, { "ref": "dcid:Amount_FinancialFlow_Gross_Disbursement_CRSTypeOfFlow10_CRSTypeOfFinance110_CRSCooperationModalityD02_CRSPurposeCode11110_Nominal", "roles": [ @@ -12774,6 +14408,46 @@ ], "observation_count": 0 }, + { + "ref": "dcid:Amount_FinancialFlow_Gross_Disbursement_CRSTypeOfFlow10_CRSTypeOfFinance110_CRSCooperationModalityD02_CRSPurposeCode13010_Nominal", + "roles": [ + "financingProvider", + "financingRecipient" + ], + "observation_count": 0 + }, + { + "ref": "dcid:Amount_FinancialFlow_Gross_Disbursement_CRSTypeOfFlow10_CRSTypeOfFinance110_CRSCooperationModalityD02_CRSPurposeCode13020_Nominal", + "roles": [ + "financingProvider", + "financingRecipient" + ], + "observation_count": 1 + }, + { + "ref": "dcid:Amount_FinancialFlow_Gross_Disbursement_CRSTypeOfFlow10_CRSTypeOfFinance110_CRSCooperationModalityD02_CRSPurposeCode13030_Nominal", + "roles": [ + "financingProvider", + "financingRecipient" + ], + "observation_count": 0 + }, + { + "ref": "dcid:Amount_FinancialFlow_Gross_Disbursement_CRSTypeOfFlow10_CRSTypeOfFinance110_CRSCooperationModalityD02_CRSPurposeCode13040_Nominal", + "roles": [ + "financingProvider", + "financingRecipient" + ], + "observation_count": 2 + }, + { + "ref": "dcid:Amount_FinancialFlow_Gross_Disbursement_CRSTypeOfFlow10_CRSTypeOfFinance110_CRSCooperationModalityD02_CRSPurposeCode13081_Nominal", + "roles": [ + "financingProvider", + "financingRecipient" + ], + "observation_count": 0 + }, { "ref": "dcid:Amount_FinancialFlow_Gross_Disbursement_CRSTypeOfFlow10_CRSTypeOfFinance110_CRSCooperationModalityE01_CRSPurposeCode11110_Nominal", "roles": [ @@ -12943,7 +14617,47 @@ "observation_count": 0 }, { - "ref": "dcid:Amount_FinancialFlow_Gross_Disbursement_CRSTypeOfFlow10_CRSTypeOfFinance110_CRSCooperationModalityE01_CRSPurposeCode12261_Nominal", + "ref": "dcid:Amount_FinancialFlow_Gross_Disbursement_CRSTypeOfFlow10_CRSTypeOfFinance110_CRSCooperationModalityE01_CRSPurposeCode12261_Nominal", + "roles": [ + "financingProvider", + "financingRecipient" + ], + "observation_count": 0 + }, + { + "ref": "dcid:Amount_FinancialFlow_Gross_Disbursement_CRSTypeOfFlow10_CRSTypeOfFinance110_CRSCooperationModalityE01_CRSPurposeCode12262_Nominal", + "roles": [ + "financingProvider", + "financingRecipient" + ], + "observation_count": 0 + }, + { + "ref": "dcid:Amount_FinancialFlow_Gross_Disbursement_CRSTypeOfFlow10_CRSTypeOfFinance110_CRSCooperationModalityE01_CRSPurposeCode12264_Nominal", + "roles": [ + "financingProvider", + "financingRecipient" + ], + "observation_count": 0 + }, + { + "ref": "dcid:Amount_FinancialFlow_Gross_Disbursement_CRSTypeOfFlow10_CRSTypeOfFinance110_CRSCooperationModalityE01_CRSPurposeCode12281_Nominal", + "roles": [ + "financingProvider", + "financingRecipient" + ], + "observation_count": 0 + }, + { + "ref": "dcid:Amount_FinancialFlow_Gross_Disbursement_CRSTypeOfFlow10_CRSTypeOfFinance110_CRSCooperationModalityE01_CRSPurposeCode12310_Nominal", + "roles": [ + "financingProvider", + "financingRecipient" + ], + "observation_count": 0 + }, + { + "ref": "dcid:Amount_FinancialFlow_Gross_Disbursement_CRSTypeOfFlow10_CRSTypeOfFinance110_CRSCooperationModalityE01_CRSPurposeCode12340_Nominal", "roles": [ "financingProvider", "financingRecipient" @@ -12951,7 +14665,7 @@ "observation_count": 0 }, { - "ref": "dcid:Amount_FinancialFlow_Gross_Disbursement_CRSTypeOfFlow10_CRSTypeOfFinance110_CRSCooperationModalityE01_CRSPurposeCode12262_Nominal", + "ref": "dcid:Amount_FinancialFlow_Gross_Disbursement_CRSTypeOfFlow10_CRSTypeOfFinance110_CRSCooperationModalityE01_CRSPurposeCode12382_Nominal", "roles": [ "financingProvider", "financingRecipient" @@ -12959,7 +14673,7 @@ "observation_count": 0 }, { - "ref": "dcid:Amount_FinancialFlow_Gross_Disbursement_CRSTypeOfFlow10_CRSTypeOfFinance110_CRSCooperationModalityE01_CRSPurposeCode12264_Nominal", + "ref": "dcid:Amount_FinancialFlow_Gross_Disbursement_CRSTypeOfFlow10_CRSTypeOfFinance110_CRSCooperationModalityE01_CRSPurposeCode13010_Nominal", "roles": [ "financingProvider", "financingRecipient" @@ -12967,7 +14681,7 @@ "observation_count": 0 }, { - "ref": "dcid:Amount_FinancialFlow_Gross_Disbursement_CRSTypeOfFlow10_CRSTypeOfFinance110_CRSCooperationModalityE01_CRSPurposeCode12281_Nominal", + "ref": "dcid:Amount_FinancialFlow_Gross_Disbursement_CRSTypeOfFlow10_CRSTypeOfFinance110_CRSCooperationModalityE01_CRSPurposeCode13020_Nominal", "roles": [ "financingProvider", "financingRecipient" @@ -12975,7 +14689,7 @@ "observation_count": 0 }, { - "ref": "dcid:Amount_FinancialFlow_Gross_Disbursement_CRSTypeOfFlow10_CRSTypeOfFinance110_CRSCooperationModalityE01_CRSPurposeCode12310_Nominal", + "ref": "dcid:Amount_FinancialFlow_Gross_Disbursement_CRSTypeOfFlow10_CRSTypeOfFinance110_CRSCooperationModalityE01_CRSPurposeCode13030_Nominal", "roles": [ "financingProvider", "financingRecipient" @@ -12983,7 +14697,7 @@ "observation_count": 0 }, { - "ref": "dcid:Amount_FinancialFlow_Gross_Disbursement_CRSTypeOfFlow10_CRSTypeOfFinance110_CRSCooperationModalityE01_CRSPurposeCode12340_Nominal", + "ref": "dcid:Amount_FinancialFlow_Gross_Disbursement_CRSTypeOfFlow10_CRSTypeOfFinance110_CRSCooperationModalityE01_CRSPurposeCode13040_Nominal", "roles": [ "financingProvider", "financingRecipient" @@ -12991,7 +14705,7 @@ "observation_count": 0 }, { - "ref": "dcid:Amount_FinancialFlow_Gross_Disbursement_CRSTypeOfFlow10_CRSTypeOfFinance110_CRSCooperationModalityE01_CRSPurposeCode12382_Nominal", + "ref": "dcid:Amount_FinancialFlow_Gross_Disbursement_CRSTypeOfFlow10_CRSTypeOfFinance110_CRSCooperationModalityE01_CRSPurposeCode13081_Nominal", "roles": [ "financingProvider", "financingRecipient" @@ -13318,6 +15032,30 @@ ], "observation_count": 0 }, + { + "ref": "dcid:Amount_FinancialFlow_Gross_Disbursement_CRSTypeOfFlow10_CRSTypeOfFinance110_CRSCooperationModalityG01_CRSPurposeCode13010_Nominal", + "roles": [ + "financingProvider", + "financingRecipient" + ], + "observation_count": 0 + }, + { + "ref": "dcid:Amount_FinancialFlow_Gross_Disbursement_CRSTypeOfFlow10_CRSTypeOfFinance110_CRSCooperationModalityG01_CRSPurposeCode13020_Nominal", + "roles": [ + "financingProvider", + "financingRecipient" + ], + "observation_count": 0 + }, + { + "ref": "dcid:Amount_FinancialFlow_Gross_Disbursement_CRSTypeOfFlow10_CRSTypeOfFinance110_CRSCooperationModalityG01_CRSPurposeCode13040_Nominal", + "roles": [ + "financingProvider", + "financingRecipient" + ], + "observation_count": 0 + }, { "ref": "dcid:Amount_FinancialFlow_Gross_Disbursement_CRSTypeOfFlow10_CRSTypeOfFinance110_CRSCooperationModalityH01_CRSPurposeCode11110_Nominal", "roles": [ @@ -13454,6 +15192,38 @@ ], "observation_count": 0 }, + { + "ref": "dcid:Amount_FinancialFlow_Gross_Disbursement_CRSTypeOfFlow10_CRSTypeOfFinance110_CRSCooperationModalityH01_CRSPurposeCode13010_Nominal", + "roles": [ + "financingProvider", + "financingRecipient" + ], + "observation_count": 0 + }, + { + "ref": "dcid:Amount_FinancialFlow_Gross_Disbursement_CRSTypeOfFlow10_CRSTypeOfFinance110_CRSCooperationModalityH01_CRSPurposeCode13020_Nominal", + "roles": [ + "financingProvider", + "financingRecipient" + ], + "observation_count": 0 + }, + { + "ref": "dcid:Amount_FinancialFlow_Gross_Disbursement_CRSTypeOfFlow10_CRSTypeOfFinance110_CRSCooperationModalityH01_CRSPurposeCode13030_Nominal", + "roles": [ + "financingProvider", + "financingRecipient" + ], + "observation_count": 0 + }, + { + "ref": "dcid:Amount_FinancialFlow_Gross_Disbursement_CRSTypeOfFlow10_CRSTypeOfFinance110_CRSCooperationModalityH01_CRSPurposeCode13040_Nominal", + "roles": [ + "financingProvider", + "financingRecipient" + ], + "observation_count": 0 + }, { "ref": "dcid:Amount_FinancialFlow_Gross_Disbursement_CRSTypeOfFlow10_CRSTypeOfFinance110_CRSCooperationModalityH02_CRSPurposeCode12191_Nominal", "roles": [ @@ -13462,6 +15232,22 @@ ], "observation_count": 0 }, + { + "ref": "dcid:Amount_FinancialFlow_Gross_Disbursement_CRSTypeOfFlow10_CRSTypeOfFinance110_CRSCooperationModalityJ01_CRSPurposeCode12191_Nominal", + "roles": [ + "financingProvider", + "financingRecipient" + ], + "observation_count": 0 + }, + { + "ref": "dcid:Amount_FinancialFlow_Gross_Disbursement_CRSTypeOfFlow10_CRSTypeOfFinance110_CRSCooperationModalityJ01_CRSPurposeCode12264_Nominal", + "roles": [ + "financingProvider", + "financingRecipient" + ], + "observation_count": 0 + }, { "ref": "dcid:Amount_FinancialFlow_Gross_Disbursement_CRSTypeOfFlow10_CRSTypeOfFinance110_CRSPurposeCode11110_Nominal", "roles": [ @@ -13646,6 +15432,46 @@ ], "observation_count": 6 }, + { + "ref": "dcid:Amount_FinancialFlow_Gross_Disbursement_CRSTypeOfFlow10_CRSTypeOfFinance110_CRSPurposeCode13010_Nominal", + "roles": [ + "financingProvider", + "financingRecipient" + ], + "observation_count": 0 + }, + { + "ref": "dcid:Amount_FinancialFlow_Gross_Disbursement_CRSTypeOfFlow10_CRSTypeOfFinance110_CRSPurposeCode13020_Nominal", + "roles": [ + "financingProvider", + "financingRecipient" + ], + "observation_count": 7 + }, + { + "ref": "dcid:Amount_FinancialFlow_Gross_Disbursement_CRSTypeOfFlow10_CRSTypeOfFinance110_CRSPurposeCode13030_Nominal", + "roles": [ + "financingProvider", + "financingRecipient" + ], + "observation_count": 5 + }, + { + "ref": "dcid:Amount_FinancialFlow_Gross_Disbursement_CRSTypeOfFlow10_CRSTypeOfFinance110_CRSPurposeCode13040_Nominal", + "roles": [ + "financingProvider", + "financingRecipient" + ], + "observation_count": 13 + }, + { + "ref": "dcid:Amount_FinancialFlow_Gross_Disbursement_CRSTypeOfFlow10_CRSTypeOfFinance110_CRSPurposeCode13081_Nominal", + "roles": [ + "financingProvider", + "financingRecipient" + ], + "observation_count": 0 + }, { "ref": "dcid:Amount_FinancialFlow_Gross_Disbursement_CRSTypeOfFlow10_CRSTypeOfFinance210_CRSCooperationModalityC01_CRSPurposeCode11120_Nominal", "roles": [ @@ -13758,6 +15584,30 @@ ], "observation_count": 0 }, + { + "ref": "dcid:Amount_FinancialFlow_Gross_Disbursement_CRSTypeOfFlow10_CRSTypeOfFinance210_CRSCooperationModalityC01_CRSPurposeCode13010_Nominal", + "roles": [ + "financingProvider", + "financingRecipient" + ], + "observation_count": 0 + }, + { + "ref": "dcid:Amount_FinancialFlow_Gross_Disbursement_CRSTypeOfFlow10_CRSTypeOfFinance210_CRSCooperationModalityC01_CRSPurposeCode13020_Nominal", + "roles": [ + "financingProvider", + "financingRecipient" + ], + "observation_count": 0 + }, + { + "ref": "dcid:Amount_FinancialFlow_Gross_Disbursement_CRSTypeOfFlow10_CRSTypeOfFinance210_CRSCooperationModalityC01_CRSPurposeCode13030_Nominal", + "roles": [ + "financingProvider", + "financingRecipient" + ], + "observation_count": 0 + }, { "ref": "dcid:Amount_FinancialFlow_Gross_Disbursement_CRSTypeOfFlow10_CRSTypeOfFinance421_CRSCooperationModalityA01_CRSPurposeCode11110_Nominal", "roles": [ @@ -13830,6 +15680,22 @@ ], "observation_count": 0 }, + { + "ref": "dcid:Amount_FinancialFlow_Gross_Disbursement_CRSTypeOfFlow10_CRSTypeOfFinance421_CRSCooperationModalityA01_CRSPurposeCode13020_Nominal", + "roles": [ + "financingProvider", + "financingRecipient" + ], + "observation_count": 0 + }, + { + "ref": "dcid:Amount_FinancialFlow_Gross_Disbursement_CRSTypeOfFlow10_CRSTypeOfFinance421_CRSCooperationModalityA01_CRSPurposeCode13040_Nominal", + "roles": [ + "financingProvider", + "financingRecipient" + ], + "observation_count": 0 + }, { "ref": "dcid:Amount_FinancialFlow_Gross_Disbursement_CRSTypeOfFlow10_CRSTypeOfFinance421_CRSCooperationModalityA02_CRSPurposeCode11110_Nominal", "roles": [ @@ -13998,6 +15864,38 @@ ], "observation_count": 0 }, + { + "ref": "dcid:Amount_FinancialFlow_Gross_Disbursement_CRSTypeOfFlow10_CRSTypeOfFinance421_CRSCooperationModalityA02_CRSPurposeCode13010_Nominal", + "roles": [ + "financingProvider", + "financingRecipient" + ], + "observation_count": 0 + }, + { + "ref": "dcid:Amount_FinancialFlow_Gross_Disbursement_CRSTypeOfFlow10_CRSTypeOfFinance421_CRSCooperationModalityA02_CRSPurposeCode13020_Nominal", + "roles": [ + "financingProvider", + "financingRecipient" + ], + "observation_count": 0 + }, + { + "ref": "dcid:Amount_FinancialFlow_Gross_Disbursement_CRSTypeOfFlow10_CRSTypeOfFinance421_CRSCooperationModalityA02_CRSPurposeCode13030_Nominal", + "roles": [ + "financingProvider", + "financingRecipient" + ], + "observation_count": 0 + }, + { + "ref": "dcid:Amount_FinancialFlow_Gross_Disbursement_CRSTypeOfFlow10_CRSTypeOfFinance421_CRSCooperationModalityA02_CRSPurposeCode13040_Nominal", + "roles": [ + "financingProvider", + "financingRecipient" + ], + "observation_count": 0 + }, { "ref": "dcid:Amount_FinancialFlow_Gross_Disbursement_CRSTypeOfFlow10_CRSTypeOfFinance421_CRSCooperationModalityB031_CRSPurposeCode12110_Nominal", "roles": [ @@ -14278,6 +16176,46 @@ ], "observation_count": 0 }, + { + "ref": "dcid:Amount_FinancialFlow_Gross_Disbursement_CRSTypeOfFlow10_CRSTypeOfFinance421_CRSCooperationModalityC01_CRSPurposeCode13010_Nominal", + "roles": [ + "financingProvider", + "financingRecipient" + ], + "observation_count": 0 + }, + { + "ref": "dcid:Amount_FinancialFlow_Gross_Disbursement_CRSTypeOfFlow10_CRSTypeOfFinance421_CRSCooperationModalityC01_CRSPurposeCode13020_Nominal", + "roles": [ + "financingProvider", + "financingRecipient" + ], + "observation_count": 0 + }, + { + "ref": "dcid:Amount_FinancialFlow_Gross_Disbursement_CRSTypeOfFlow10_CRSTypeOfFinance421_CRSCooperationModalityC01_CRSPurposeCode13030_Nominal", + "roles": [ + "financingProvider", + "financingRecipient" + ], + "observation_count": 0 + }, + { + "ref": "dcid:Amount_FinancialFlow_Gross_Disbursement_CRSTypeOfFlow10_CRSTypeOfFinance421_CRSCooperationModalityC01_CRSPurposeCode13040_Nominal", + "roles": [ + "financingProvider", + "financingRecipient" + ], + "observation_count": 0 + }, + { + "ref": "dcid:Amount_FinancialFlow_Gross_Disbursement_CRSTypeOfFlow10_CRSTypeOfFinance421_CRSCooperationModalityC01_CRSPurposeCode13081_Nominal", + "roles": [ + "financingProvider", + "financingRecipient" + ], + "observation_count": 0 + }, { "ref": "dcid:Amount_FinancialFlow_Gross_Disbursement_CRSTypeOfFlow10_CRSTypeOfFinance421_CRSCooperationModalityE01_CRSPurposeCode11420_Nominal", "roles": [ @@ -14454,6 +16392,38 @@ ], "observation_count": 0 }, + { + "ref": "dcid:Amount_FinancialFlow_Gross_Disbursement_CRSTypeOfFlow10_CRSTypeOfFinance421_CRSPurposeCode13010_Nominal", + "roles": [ + "financingProvider", + "financingRecipient" + ], + "observation_count": 0 + }, + { + "ref": "dcid:Amount_FinancialFlow_Gross_Disbursement_CRSTypeOfFlow10_CRSTypeOfFinance421_CRSPurposeCode13020_Nominal", + "roles": [ + "financingProvider", + "financingRecipient" + ], + "observation_count": 0 + }, + { + "ref": "dcid:Amount_FinancialFlow_Gross_Disbursement_CRSTypeOfFlow10_CRSTypeOfFinance421_CRSPurposeCode13030_Nominal", + "roles": [ + "financingProvider", + "financingRecipient" + ], + "observation_count": 0 + }, + { + "ref": "dcid:Amount_FinancialFlow_Gross_Disbursement_CRSTypeOfFlow10_CRSTypeOfFinance421_CRSPurposeCode13040_Nominal", + "roles": [ + "financingProvider", + "financingRecipient" + ], + "observation_count": 0 + }, { "ref": "dcid:Amount_FinancialFlow_Gross_Disbursement_CRSTypeOfFlow10_CRSTypeOfFinance422_CRSCooperationModalityE01_CRSPurposeCode11420_Nominal", "roles": [ @@ -14550,6 +16520,30 @@ ], "observation_count": 0 }, + { + "ref": "dcid:Amount_FinancialFlow_Gross_Disbursement_CRSTypeOfFlow10_CRSTypeOfFinance510_CRSCooperationModalityC01_CRSPurposeCode13020_Nominal", + "roles": [ + "financingProvider", + "financingRecipient" + ], + "observation_count": 0 + }, + { + "ref": "dcid:Amount_FinancialFlow_Gross_Disbursement_CRSTypeOfFlow10_CRSTypeOfFinance510_CRSCooperationModalityC01_CRSPurposeCode13030_Nominal", + "roles": [ + "financingProvider", + "financingRecipient" + ], + "observation_count": 0 + }, + { + "ref": "dcid:Amount_FinancialFlow_Gross_Disbursement_CRSTypeOfFlow10_CRSTypeOfFinance510_CRSCooperationModalityC01_CRSPurposeCode13040_Nominal", + "roles": [ + "financingProvider", + "financingRecipient" + ], + "observation_count": 0 + }, { "ref": "dcid:Amount_FinancialFlow_Gross_Disbursement_CRSTypeOfFlow10_CRSTypeOfFinance510_CRSPurposeCode11110_Nominal", "roles": [ @@ -14631,12 +16625,12 @@ "observation_count": 0 } ], - "family_member_count": 545, - "family_member_digest": "0c7508fd1997d6cdc896f2eab0f092a4915cfca9e2400eb9577bb22b527fe882", + "family_member_count": 634, + "family_member_digest": "5c91c0a8d90f4619a1ff7122cacdc8b0bc48b22c70516d7673aec42caf6da0d4", "frame_grammar_version": "1.1.0", - "origin_catalogue_build_id": "20261019T174519Z-2e5e8cfd", - "served_from": "head", - "confirmed_at": "2026-10-26T09:18:03.336477+00:00" + "origin_catalogue_build_id": "20261029T171521Z-7d0a5854", + "served_from": "materialise", + "confirmed_at": "2026-11-01T07:37:38.826442+00:00" }, "warnings": [], "diagnostics": [ @@ -14648,41 +16642,41 @@ ], "artifacts": [ { - "artifact_digest": "sha256:a189b171faab41729ddc1317add46add9b5eefb5fcac62a98cb735cb5f20f0f8", + "artifact_digest": "sha256:228f4a6d447c0e6a811c951c10522dda47f68ae38efede7be384c4c7e7d6f2d2", "rendering": { "bundle": false, "format": "parquet", "layout": 4, "without_party_totals": true }, - "bytes": 16208, + "bytes": 17220, "media_type": "application/vnd.apache.parquet", - "created_at": "2026-10-23T16:58:41.714148+00:00", + "created_at": "2026-10-29T22:25:13.591902+00:00", "tier": "working", - "url": "/api/datasets/spec_25f482395c5d012ec278118f38dff29c/cv_d6ce435ea267b46680c94eae9423d420/files/sha256:a189b171faab41729ddc1317add46add9b5eefb5fcac62a98cb735cb5f20f0f8", - "enrichment_stamp": "08ed6c734fc69ea2204a21f4e1dd8b963f14dd1e03a2484c618049ac2e2d93d8" + "url": "/api/datasets/spec_7a02b6facd2dc17b5d0d7c35c11bf5d2/cv_b600e3429190c07d98f8d59720cde7ba/files/sha256:228f4a6d447c0e6a811c951c10522dda47f68ae38efede7be384c4c7e7d6f2d2", + "enrichment_stamp": "55887b871f7aa1c5d120cb2bee97086605351d5acfbec645ab027f562d0f65c5" }, { - "artifact_digest": "sha256:a5d2d7627c8fe1357519ca0ac021c791182ab08c76f44e8055b4bb50a6059179", + "artifact_digest": "sha256:46ec27bbc997b14d9d27305b59ebea27b24147358398f60652b1383a4a3da043", "rendering": { "statistics": "series" }, - "bytes": 11612, + "bytes": 12381, "media_type": "application/vnd.apache.parquet", - "created_at": "2026-10-20T15:55:47.734234+00:00", + "created_at": "2026-10-29T22:25:13.591902+00:00", "tier": "working", - "url": "/api/datasets/spec_25f482395c5d012ec278118f38dff29c/cv_d6ce435ea267b46680c94eae9423d420/files/sha256:a5d2d7627c8fe1357519ca0ac021c791182ab08c76f44e8055b4bb50a6059179" + "url": "/api/datasets/spec_7a02b6facd2dc17b5d0d7c35c11bf5d2/cv_b600e3429190c07d98f8d59720cde7ba/files/sha256:46ec27bbc997b14d9d27305b59ebea27b24147358398f60652b1383a4a3da043" } ], - "series_count": 108, + "series_count": 123, "output_options": { - "capability_version": "dset_76f5fa7244511c58", + "capability_version": "dset_5282a0674178a233", "columns": [ { "name": "stat_var", "kind": "grain", "droppable": false, - "distinct": 108 + "distinct": 123 }, { "name": "financingProvider", @@ -14759,7 +16753,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": false }, { "column": "financingProvider", @@ -14771,7 +16766,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": false }, { "column": "financingProvider", @@ -14783,7 +16779,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true }, { "column": "financingProvider", @@ -14795,7 +16792,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": false }, { "column": "financingProvider", @@ -14807,7 +16805,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true }, { "column": "financingProvider", @@ -14819,7 +16818,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true }, { "column": "financingProvider", @@ -14831,7 +16831,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true }, { "column": "financingRecipient", @@ -14843,7 +16844,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": false }, { "column": "financingRecipient", @@ -14855,7 +16857,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": false }, { "column": "financingRecipient", @@ -14867,7 +16870,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true }, { "column": "financingRecipient", @@ -14879,7 +16883,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": false }, { "column": "financingRecipient", @@ -14891,7 +16896,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true }, { "column": "financingRecipient", @@ -14903,7 +16909,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true }, { "column": "financingRecipient", @@ -14915,7 +16922,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true } ], "long_layout_defaults": [ @@ -14931,14 +16939,14 @@ "columns": "time_period", "state": "available", "width": 29, - "cells": 3132 + "cells": 3567 }, { "index": "time_period", "columns": "stat_var", "state": "available", - "width": 109, - "cells": 3052 + "width": 124, + "cells": 3472 } ], "groupby": { @@ -14959,10 +16967,10 @@ ] } }, - "series_coverage_stamp": "e6e717ab8c77e84d010915893ede5809e9ecec67929a07cfafbcc2210edfa1eb", + "series_coverage_stamp": "ad27fd11738abb03d2d84dc214e223f04781609636cf678d0d08c385fb863d99", "retention": { "pinned": false, - "held_until": "2026-11-19T15:55:47.734809Z" + "held_until": "2026-11-28T22:25:13.592229Z" } } } @@ -14970,21 +16978,21 @@ { "request": { "method": "GET", - "origin_path": "/api/datasets/spec_25f482395c5d012ec278118f38dff29c/cv_d6ce435ea267b46680c94eae9423d420/files/sha256:a189b171faab41729ddc1317add46add9b5eefb5fcac62a98cb735cb5f20f0f8" + "origin_path": "/api/datasets/spec_7a02b6facd2dc17b5d0d7c35c11bf5d2/cv_b600e3429190c07d98f8d59720cde7ba/files/sha256:228f4a6d447c0e6a811c951c10522dda47f68ae38efede7be384c4c7e7d6f2d2" }, "response": { "status": 302, "headers": { "content-type": "text/html", - "location": "https://storage.googleapis.com/dev-fin-observatory-datasets-working/sha256%3Aa189b171faab41729ddc1317add46add9b5eefb5fcac62a98cb735cb5f20f0f8?X-Goog-Signature=redacted", - "x-dfo-trace-id": "b06362d84bb845e786735d92808b1b48" + "location": "https://storage.googleapis.com/dev-fin-observatory-datasets-working/sha256%3A228f4a6d447c0e6a811c951c10522dda47f68ae38efede7be384c4c7e7d6f2d2?X-Goog-Signature=redacted", + "x-dfo-trace-id": "ba92a42f29eb49f5bdb4cbdd7c047cb4" } } }, { "request": { "method": "GET", - "url": "https://storage.googleapis.com/dev-fin-observatory-datasets-working/sha256%3Aa189b171faab41729ddc1317add46add9b5eefb5fcac62a98cb735cb5f20f0f8?X-Goog-Signature=redacted" + "url": "https://storage.googleapis.com/dev-fin-observatory-datasets-working/sha256%3A228f4a6d447c0e6a811c951c10522dda47f68ae38efede7be384c4c7e7d6f2d2?X-Goog-Signature=redacted" }, "response": { "status": 200, @@ -15071,7 +17079,7 @@ "status": 200, "headers": { "content-type": "application/json", - "x-dfo-trace-id": "4e3b97d6e0814dc7ae89509dcb63b46b" + "x-dfo-trace-id": "39917f146e6b4935a6200e27d0cd672b" }, "json": { "schema_version": 1, @@ -15248,7 +17256,7 @@ "frame_grammar_version": "1.1.0", "origin_catalogue_build_id": "20261019T174519Z-2e5e8cfd", "served_from": "head", - "confirmed_at": "2026-10-26T09:18:05.070107+00:00" + "confirmed_at": "2026-11-01T07:37:40.580774+00:00" }, "warnings": [], "diagnostics": [ @@ -15287,7 +17295,7 @@ ], "series_count": 2, "output_options": { - "capability_version": "dset_76f5fa7244511c58", + "capability_version": "dset_5282a0674178a233", "columns": [ { "name": "stat_var", @@ -15364,7 +17372,8 @@ "covered": 2 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": false }, { "column": "observationAbout", @@ -15376,7 +17385,8 @@ "covered": 2 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": false }, { "column": "observationAbout", @@ -15388,7 +17398,8 @@ "covered": 2 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true }, { "column": "observationAbout", @@ -15400,7 +17411,8 @@ "covered": 2 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": false } ], "long_layout_defaults": [ @@ -15441,7 +17453,7 @@ ] } }, - "series_coverage_stamp": "e6e717ab8c77e84d010915893ede5809e9ecec67929a07cfafbcc2210edfa1eb", + "series_coverage_stamp": "ad27fd11738abb03d2d84dc214e223f04781609636cf678d0d08c385fb863d99", "retention": { "pinned": false, "held_until": "2026-11-19T15:55:49.978519Z" @@ -15459,7 +17471,7 @@ "headers": { "content-type": "text/html", "location": "https://storage.googleapis.com/dev-fin-observatory-datasets-working/sha256%3A9ff8d7d0df398e2b298b22f54828fb187c705888db1816d223137c950d037839?X-Goog-Signature=redacted", - "x-dfo-trace-id": "dd6c261d3d2e4566bdc4071ef3834710" + "x-dfo-trace-id": "d5e8dafe390347b39afb2f285e3ce682" } } }, @@ -15482,10 +17494,10 @@ "answer": { "kind": "resolution", "status": "definite", - "sentence": "Germany's gross ODA disbursements to Kenya for education and health, 1997 to 2024. Current US dollars · OECD Creditor Reporting System (CRS). GDP in Germany and Kenya, 1960 to 2025. Current US dollars · World Development Indicators. You named Germany as a provider. This measure has no providers, so this shows the place itself. You named Kenya as a recipient. This measure has no recipients, so this shows the place itself.", + "sentence": "Germany's gross ODA disbursements to Kenya for education, health, and population policy, programme, and reproductive health, 1997 to 2024. Current US dollars · OECD Creditor Reporting System (CRS). GDP in Germany and Kenya, 1960 to 2025. Current US dollars · World Development Indicators. You named Germany as a provider. This measure has no providers, so this shows the place itself. You named Kenya as a recipient. This measure has no recipients, so this shows the place itself.", "complete": true, "specs": [ - "spec_25f482395c5d012ec278118f38dff29c", + "spec_7a02b6facd2dc17b5d0d7c35c11bf5d2", "spec_f8dea3052d1ef6ba5667628815d1a663" ], "gaps": [] @@ -15493,7 +17505,7 @@ }, { "dataset": { - "rows": 644, + "rows": 725, "columns": [ "part", "time_period", @@ -15528,8 +17540,8 @@ ], "part_rows": [ { - "part": "Germany's gross ODA disbursements to Kenya for education and health, 1997 to 2024. Current US dollars · OECD Creditor Reporting System (CRS).", - "rows": 512 + "part": "Germany's gross ODA disbursements to Kenya for education, health, and population policy, programme, and reproductive health, 1997 to 2024. Current US dollars · OECD Creditor Reporting System (CRS).", + "rows": 593 }, { "part": "GDP", @@ -15540,9 +17552,9 @@ "members": [ { "parts": [], - "spec_id": "spec_25f482395c5d012ec278118f38dff29c", - "content_version": "cv_d6ce435ea267b46680c94eae9423d420", - "sentence": "Germany's gross ODA disbursements to Kenya for education and health, 1997 to 2024. Current US dollars · OECD Creditor Reporting System (CRS)." + "spec_id": "spec_7a02b6facd2dc17b5d0d7c35c11bf5d2", + "content_version": "cv_b600e3429190c07d98f8d59720cde7ba", + "sentence": "Germany's gross ODA disbursements to Kenya for education, health, and population policy, programme, and reproductive health, 1997 to 2024. Current US dollars · OECD Creditor Reporting System (CRS)." }, { "parts": [ diff --git a/python/client-contract/src/dfo_client_contract/scenarios/answer-mixed-fetch-partial.json b/python/client-contract/src/dfo_client_contract/scenarios/answer-mixed-fetch-partial.json index e20fbd8..a504e7f 100644 --- a/python/client-contract/src/dfo_client_contract/scenarios/answer-mixed-fetch-partial.json +++ b/python/client-contract/src/dfo_client_contract/scenarios/answer-mixed-fetch-partial.json @@ -5,8 +5,8 @@ "origin": { "kind": "recorded", "base_url": "https://dfo-dev-apis-zms5lj4zhq-nn.a.run.app/api", - "dfo_commit": "d80df9f5fd598b7345255470932d202ee5d49942", - "recorded_at": "2026-10-26T09:22:08Z" + "dfo_commit": "ccb6617922c839ce3cd5615a3bbb65c70bfe1bde", + "recorded_at": "2026-11-01T07:37:01Z" }, "call": [ { @@ -35,7 +35,7 @@ "status": 200, "headers": { "content-type": "application/json", - "x-dfo-trace-id": "bffd660858754e239446c0e2c32a7593" + "x-dfo-trace-id": "cd24811ee0094a8cb5d3ad0fce91ee17" }, "json": { "schema_version": 1, @@ -46,14 +46,15 @@ "extract_skipped": false }, "diagnostics": { - "engine_build": "d80df9f5fd598b7345255470932d202ee5d49942", - "trace_id": "bffd660858754e239446c0e2c32a7593", + "engine_build": "ccb6617922c839ce3cd5615a3bbb65c70bfe1bde", + "trace_id": "cd24811ee0094a8cb5d3ad0fce91ee17", "warnings": [], "timing_ms": { - "total": 389, + "total": 3351, "by_step": { - "coverage": 0, - "extract": 0, + "coverage": 1, + "extract": 1, + "exclusion_read": 0, "cache_lookup": 0 } }, @@ -72,30 +73,30 @@ "variable_text": "debt service", "warnings": [], "timing_ms": { - "total": 385, + "total": 3321, "by_step": { "recall": 1, "phase_resolve_places": 0, "phase_check_entities": 0, - "shape_arcs": 3, - "shape_probe_coverage": 20, - "shape_probe": 22, - "shape_groups": 6, - "shape_labels": 11, + "shape_arcs": 1, + "shape_probe_coverage": 110, + "shape_probe": 113, + "shape_groups": 22, + "shape_labels": 44, "shape_admission": 1, "phase_derive_shapes": 0, - "shape": 127, + "shape": 998, "phase_prune_and_rank": 0, - "bind": 102, - "phase_bind": 15, - "phase_settle": 6, - "phase_place_bindings": 13, + "bind": 474, + "phase_bind": 34, + "phase_settle": 9, + "phase_place_bindings": 904, "phase_facet_requests": 0, - "materialise": 11, - "phase_materialise": 37, - "answer": 3, - "options": 9, - "phase_outcome": 61 + "materialise": 317, + "phase_materialise": 68, + "answer": 118, + "options": 100, + "phase_outcome": 298 } }, "restatement": { @@ -570,7 +571,7 @@ "label": "Creative Commons Attribution License" } }, - "coverage_stamp": "e6e717ab8c77e84d010915893ede5809e9ecec67929a07cfafbcc2210edfa1eb", + "coverage_stamp": "ad27fd11738abb03d2d84dc214e223f04781609636cf678d0d08c385fb863d99", "facets": { "provenance": { "basis": "fallback", @@ -1288,7 +1289,7 @@ } ], "query_qualifiers": [], - "capability_version": "cap_765c9d2a0c7529b9", + "capability_version": "cap_4913302d7a6b6435", "default_reading": { "applied": true, "removed_stat_vars": [] @@ -1298,6 +1299,7 @@ "available_at_place": true, "measure_label_axes": [], "measure_axis_values": [], + "published_tables": "World Bank International Debt Statistics (IDS)", "unit_conversion": { "currencies": [ { @@ -3273,18 +3275,18 @@ "variable_text": "price of tea", "warnings": [], "timing_ms": { - "total": 18, + "total": 758, "by_step": { - "recall": 0, + "recall": 1, "phase_resolve_places": 0, "phase_check_entities": 0, - "shape_arcs": 1, - "shape_probe": 2, - "shape_groups": 1, + "shape_arcs": 0, + "shape_probe": 52, + "shape_groups": 18, "shape_labels": 0, - "shape_admission": 0, + "shape_admission": 1, "phase_derive_shapes": 0, - "shape": 18, + "shape": 757, "phase_prune_and_rank": 0 } }, @@ -3724,7 +3726,7 @@ "status": 200, "headers": { "content-type": "application/json", - "x-dfo-trace-id": "a6a95e93a4134cbca3ef315e6bb5c6fb" + "x-dfo-trace-id": "6e30427c5eee45e0a58fcf56c8ecdfee" }, "json": { "schema_version": 1, @@ -3960,11 +3962,11 @@ } ], "family_member_count": 65, - "family_member_digest": "ef0365e0d7395767fee6210ec02c809839d0e28516031bf225d2cef2acc5e6d5", + "family_member_digest": "b66541c53125ee32113e51b4f52a3a428043b5506e15f96277f37b89547fc1c4", "frame_grammar_version": "1.1.0", "origin_catalogue_build_id": "20261012T000033Z-84777283", - "served_from": "head", - "confirmed_at": "2026-10-26T09:17:55.468442+00:00" + "served_from": "materialise", + "confirmed_at": "2026-11-01T07:37:22.576667+00:00" }, "warnings": [ { @@ -3994,7 +3996,7 @@ "created_at": "2026-10-23T16:58:25.889079+00:00", "tier": "working", "url": "/api/datasets/spec_78d04fefc3b3f1ef71acd622957e4995/cv_2c981b422e8f8bdf5dee6067837cff13/files/sha256:ab0bfec276a23aaefea6dbc3f1b57854ea520b3a7ae5feeade202f292446ed2c", - "enrichment_stamp": "08ed6c734fc69ea2204a21f4e1dd8b963f14dd1e03a2484c618049ac2e2d93d8" + "enrichment_stamp": "55887b871f7aa1c5d120cb2bee97086605351d5acfbec645ab027f562d0f65c5" }, { "artifact_digest": "sha256:8da8a5b081cc06acba677ac2c668e4bcafb796bf040bede5de00740acda9c9ee", @@ -4010,7 +4012,7 @@ ], "series_count": 1, "output_options": { - "capability_version": "dset_76f5fa7244511c58", + "capability_version": "dset_5282a0674178a233", "columns": [ { "name": "stat_var", @@ -4087,7 +4089,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": false }, { "column": "financingRecipient", @@ -4099,7 +4102,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": false }, { "column": "financingRecipient", @@ -4111,7 +4115,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true }, { "column": "financingRecipient", @@ -4123,7 +4128,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": false }, { "column": "financingRecipient", @@ -4135,7 +4141,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true }, { "column": "financingRecipient", @@ -4147,7 +4154,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true }, { "column": "financingRecipient", @@ -4159,7 +4167,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true } ], "long_layout_defaults": [ @@ -4186,7 +4195,7 @@ ] } }, - "series_coverage_stamp": "e6e717ab8c77e84d010915893ede5809e9ecec67929a07cfafbcc2210edfa1eb", + "series_coverage_stamp": "ad27fd11738abb03d2d84dc214e223f04781609636cf678d0d08c385fb863d99", "retention": { "pinned": true } @@ -4203,7 +4212,7 @@ "headers": { "content-type": "text/html", "location": "https://storage.googleapis.com/dev-fin-observatory-datasets-working/sha256%3Aab0bfec276a23aaefea6dbc3f1b57854ea520b3a7ae5feeade202f292446ed2c?X-Goog-Signature=redacted", - "x-dfo-trace-id": "a835d2fa775c43b181cc16faf6a63b45" + "x-dfo-trace-id": "84c07114ba074f60a408cfa7e808186a" } } }, diff --git a/python/client-contract/src/dfo_client_contract/scenarios/answer-mixed-fetch-raises.json b/python/client-contract/src/dfo_client_contract/scenarios/answer-mixed-fetch-raises.json index b5cb905..e8c3460 100644 --- a/python/client-contract/src/dfo_client_contract/scenarios/answer-mixed-fetch-raises.json +++ b/python/client-contract/src/dfo_client_contract/scenarios/answer-mixed-fetch-raises.json @@ -5,8 +5,8 @@ "origin": { "kind": "recorded", "base_url": "https://dfo-dev-apis-zms5lj4zhq-nn.a.run.app/api", - "dfo_commit": "d80df9f5fd598b7345255470932d202ee5d49942", - "recorded_at": "2026-10-26T09:22:08Z" + "dfo_commit": "ccb6617922c839ce3cd5615a3bbb65c70bfe1bde", + "recorded_at": "2026-11-01T07:36:36Z" }, "call": [ { @@ -34,7 +34,7 @@ "status": 200, "headers": { "content-type": "application/json", - "x-dfo-trace-id": "86b361f85db44a29b3d711350962ca73" + "x-dfo-trace-id": "cf40b66c70a74f34af1ea479ba67e11f" }, "json": { "schema_version": 1, @@ -45,20 +45,21 @@ "extract_skipped": false }, "diagnostics": { - "engine_build": "d80df9f5fd598b7345255470932d202ee5d49942", - "trace_id": "86b361f85db44a29b3d711350962ca73", + "engine_build": "ccb6617922c839ce3cd5615a3bbb65c70bfe1bde", + "trace_id": "cf40b66c70a74f34af1ea479ba67e11f", "warnings": [], "timing_ms": { - "total": 456, + "total": 3122, "by_step": { "coverage": 0, - "extract": 0, - "cache_lookup": 0 + "extract": 921, + "exclusion_read": 781, + "cache_lookup": 1 } }, "llm_usage": { - "input_tokens": 0, - "output_tokens": 0, + "input_tokens": 2786, + "output_tokens": 112, "cached_tokens": 0, "jev_input_tokens": 5250, "jev_output_tokens": 1104 @@ -71,30 +72,30 @@ "variable_text": "debt service", "warnings": [], "timing_ms": { - "total": 452, + "total": 2193, "by_step": { - "recall": 1, + "recall": 1640, "phase_resolve_places": 0, "phase_check_entities": 0, - "shape_arcs": 2, - "shape_probe_coverage": 17, - "shape_probe": 101, - "shape_groups": 8, - "shape_labels": 14, + "shape_arcs": 4, + "shape_probe_coverage": 12, + "shape_probe": 98, + "shape_groups": 6, + "shape_labels": 11, "shape_admission": 0, "phase_derive_shapes": 0, - "shape": 225, + "shape": 232, "phase_prune_and_rank": 0, - "bind": 77, - "phase_bind": 17, - "phase_settle": 5, + "bind": 91, + "phase_bind": 19, + "phase_settle": 8, "phase_place_bindings": 14, "phase_facet_requests": 0, - "materialise": 11, - "phase_materialise": 23, - "answer": 2, - "options": 9, - "phase_outcome": 68 + "materialise": 13, + "phase_materialise": 31, + "answer": 3, + "options": 78, + "phase_outcome": 64 } }, "restatement": { @@ -569,7 +570,7 @@ "label": "Creative Commons Attribution License" } }, - "coverage_stamp": "e6e717ab8c77e84d010915893ede5809e9ecec67929a07cfafbcc2210edfa1eb", + "coverage_stamp": "ad27fd11738abb03d2d84dc214e223f04781609636cf678d0d08c385fb863d99", "facets": { "provenance": { "basis": "fallback", @@ -1287,7 +1288,7 @@ } ], "query_qualifiers": [], - "capability_version": "cap_765c9d2a0c7529b9", + "capability_version": "cap_4913302d7a6b6435", "default_reading": { "applied": true, "removed_stat_vars": [] @@ -1297,6 +1298,7 @@ "available_at_place": true, "measure_label_axes": [], "measure_axis_values": [], + "published_tables": "World Bank International Debt Statistics (IDS)", "unit_conversion": { "currencies": [ { @@ -3272,18 +3274,18 @@ "variable_text": "price of tea", "warnings": [], "timing_ms": { - "total": 121, + "total": 1545, "by_step": { - "recall": 0, + "recall": 1436, "phase_resolve_places": 0, "phase_check_entities": 0, - "shape_arcs": 1, - "shape_probe": 96, + "shape_arcs": 3, + "shape_probe": 101, "shape_groups": 1, "shape_labels": 0, - "shape_admission": 0, + "shape_admission": 1, "phase_derive_shapes": 0, - "shape": 121, + "shape": 109, "phase_prune_and_rank": 0 } }, @@ -3653,7 +3655,7 @@ "error": { "class": "IncompleteAnswerError", "code": "answer_incomplete", - "trace_id": "86b361f85db44a29b3d711350962ca73" + "trace_id": "cf40b66c70a74f34af1ea479ba67e11f" } } ] diff --git a/python/client-contract/src/dfo_client_contract/scenarios/answer-nested-specs-unchecked.json b/python/client-contract/src/dfo_client_contract/scenarios/answer-nested-specs-unchecked.json index 29aeeb4..89bc406 100644 --- a/python/client-contract/src/dfo_client_contract/scenarios/answer-nested-specs-unchecked.json +++ b/python/client-contract/src/dfo_client_contract/scenarios/answer-nested-specs-unchecked.json @@ -34,7 +34,7 @@ "status": 200, "headers": { "content-type": "application/json", - "x-dfo-trace-id": "989481cf76744b4cbddf1aff890cda9c" + "x-dfo-trace-id": "96a2cbe778b34b8695d7cdf943243a76" }, "json": { "schema_version": 1, @@ -45,11 +45,11 @@ "extract_skipped": true }, "diagnostics": { - "engine_build": "d80df9f5fd598b7345255470932d202ee5d49942", - "trace_id": "989481cf76744b4cbddf1aff890cda9c", + "engine_build": "ccb6617922c839ce3cd5615a3bbb65c70bfe1bde", + "trace_id": "96a2cbe778b34b8695d7cdf943243a76", "warnings": [], "timing_ms": { - "total": 1, + "total": 2, "by_step": { "coverage": 0, "response_cache_layer1": 1 @@ -68,10 +68,10 @@ "variable_text": "ODA disbursements", "warnings": [], "timing_ms": { - "total": 117, + "total": 871, "by_step": { - "recall": 117, - "phase_resolve_places": 0, + "recall": 870, + "phase_resolve_places": 1, "phase_check_entities": 0 } }, @@ -121,7 +121,9 @@ "entity_refs": [ { "text": "Germany", - "refs": [] + "refs": [ + "country/DEU" + ] }, { "text": "Congo", @@ -222,17 +224,17 @@ } ], "flagged_match": { - "spec_id": "spec_6b3a93b7bdf9a3dd1d4976a7e7eac4ee", + "spec_id": "spec_8435999aa7036a9ab5ff61e26cc18069", "definition": { "schema_version": 1, - "spec_id": "spec_6b3a93b7bdf9a3dd1d4976a7e7eac4ee" + "spec_id": "spec_8435999aa7036a9ab5ff61e26cc18069" } }, "alternate_match": { - "spec_id": "spec_6b3a93b7bdf9a3dd1d4976a7e7eac4ee", + "spec_id": "spec_8435999aa7036a9ab5ff61e26cc18069", "definition": { "schema_version": 1, - "spec_id": "spec_6b3a93b7bdf9a3dd1d4976a7e7eac4ee" + "spec_id": "spec_8435999aa7036a9ab5ff61e26cc18069" } } } @@ -307,7 +309,7 @@ "status": 200, "headers": { "content-type": "application/json", - "x-dfo-trace-id": "7cbd24b2c1a0457da3df6702b8caf3aa" + "x-dfo-trace-id": "2cab3a3cbf0149de99fb1c73aa2688f5" }, "json": { "schema_version": 1, @@ -316,11 +318,11 @@ "extract_skipped": true }, "diagnostics": { - "engine_build": "d80df9f5fd598b7345255470932d202ee5d49942", - "trace_id": "7cbd24b2c1a0457da3df6702b8caf3aa", + "engine_build": "ccb6617922c839ce3cd5615a3bbb65c70bfe1bde", + "trace_id": "2cab3a3cbf0149de99fb1c73aa2688f5", "warnings": [], "timing_ms": { - "total": 1050, + "total": 1127, "by_step": { "coverage": 0 } @@ -329,8 +331,8 @@ "input_tokens": 0, "output_tokens": 0, "cached_tokens": 0, - "jev_input_tokens": 7365, - "jev_output_tokens": 1646 + "jev_input_tokens": 7477, + "jev_output_tokens": 1674 }, "timed_out": false }, @@ -346,30 +348,30 @@ } ], "timing_ms": { - "total": 1045, + "total": 1121, "by_step": { "recall": 0, "phase_resolve_places": 0, "phase_check_entities": 0, "shape_arcs": 1, - "shape_probe_coverage": 10, - "shape_probe": 104, - "shape_groups": 56, + "shape_probe_coverage": 13, + "shape_probe": 241, + "shape_groups": 57, "shape_labels": 1, "shape_admission": 1, "phase_derive_shapes": 0, - "shape": 473, + "shape": 589, "phase_prune_and_rank": 0, - "bind": 105, - "phase_bind": 185, - "phase_settle": 8, - "phase_place_bindings": 77, + "bind": 115, + "phase_bind": 111, + "phase_settle": 5, + "phase_place_bindings": 79, "phase_facet_requests": 0, - "materialise": 17, - "phase_materialise": 5, - "answer": 9, - "options": 26, - "phase_outcome": 140 + "materialise": 19, + "phase_materialise": 6, + "answer": 10, + "options": 58, + "phase_outcome": 129 } }, "restatement": { @@ -409,10 +411,10 @@ "assumptions": [], "status": "definite", "spec": { - "spec_id": "spec_6b3a93b7bdf9a3dd1d4976a7e7eac4ee", + "spec_id": "spec_8435999aa7036a9ab5ff61e26cc18069", "definition": { "schema_version": 1, - "spec_id": "spec_6b3a93b7bdf9a3dd1d4976a7e7eac4ee", + "spec_id": "spec_8435999aa7036a9ab5ff61e26cc18069", "identity": { "identity_version": "spec1", "shape": { @@ -447,7 +449,7 @@ "property": "nettingBasis", "binding": { "state": "value", - "ref": "Gross" + "ref": "Net" } } ], @@ -469,7 +471,7 @@ "resolved": { "shape": { "shape_id": "financialflow_amount_measuredvalue_nominal_family_f096b1ba", - "label": "gross disbursements (official development assistance)", + "label": "net disbursements (official development assistance)", "population_type": { "ref": "FinancialFlow", "label": "financial flow" @@ -534,7 +536,7 @@ } ], "member_count": 1, - "member_digest": "1a36e1a7292b1bfff95a5415de0be74cac7bb033217ed50e79faa8ce51a224c0", + "member_digest": "c2d373442ac21a31377df76cd343f156c72a530649757c399c6661cbf56c9a71", "refine_supported": true, "data_commons": [ { @@ -613,8 +615,8 @@ "kind": "value", "value": { "ref": { - "ref": "Gross", - "label": "gross" + "ref": "Net", + "label": "net" }, "value_kind": "enum_value" } @@ -773,7 +775,7 @@ "label": "OECD Terms and Conditions" } }, - "coverage_stamp": "e6e717ab8c77e84d010915893ede5809e9ecec67929a07cfafbcc2210edfa1eb", + "coverage_stamp": "ad27fd11738abb03d2d84dc214e223f04781609636cf678d0d08c385fb863d99", "facets": { "provenance": { "basis": "fallback", @@ -811,48 +813,8 @@ { "value": { "ref": { - "ref": "DAC2aAidType201", - "label": "ODA grant" - }, - "value_kind": "enum_value" - }, - "relation": "child", - "parent": "DAC2aAidType206", - "member_count": 1, - "served_rows": 1, - "served_rows_exact": true - }, - { - "value": { - "ref": { - "ref": "DAC2aAidType207", - "label": "free-standing technical co-operation" - }, - "value_kind": "enum_value" - }, - "relation": "root", - "member_count": 1, - "served_rows": 1, - "served_rows_exact": true - }, - { - "value": { - "ref": { - "ref": "DAC2aAidType213", - "label": "developmental food aid" - }, - "value_kind": "enum_value" - }, - "relation": "root", - "member_count": 1, - "served_rows": 1, - "served_rows_exact": true - }, - { - "value": { - "ref": { - "ref": "DAC2aAidType216", - "label": "humanitarian aid" + "ref": "DAC2aAidType250", + "label": "official development assistance excluding debt relief" }, "value_kind": "enum_value" }, @@ -901,7 +863,7 @@ "source": "observed" } ], - "rendered_sentence": "Germany's gross disbursements to Democratic Republic of the Congo for official development assistance in 2018. Current US dollars · OECD DAC2a.", + "rendered_sentence": "Germany's net disbursements to Democratic Republic of the Congo for official development assistance in 2018. Current US dollars · OECD DAC2a.", "sentence_plan": [ { "kind": "slot", @@ -932,7 +894,7 @@ }, { "kind": "slot", - "text": "gross disbursements", + "text": "net disbursements", "axis": "what", "segment": "heading", "entity_refs": [], @@ -1170,8 +1132,8 @@ "binding_kind": "value", "refs": [ { - "ref": "Gross", - "label": "gross" + "ref": "Net", + "label": "net" } ], "provenance": "measure_elected" @@ -1227,7 +1189,7 @@ "start_year": 2018, "end_year": 2018 }, - "capability_version": "cap_765c9d2a0c7529b9", + "capability_version": "cap_4913302d7a6b6435", "default_reading": { "applied": true, "removed_stat_vars": [] @@ -1235,108 +1197,8 @@ }, "confidence": "high", "available_at_place": true, - "alternative_measures": [ - { - "definition": { - "schema_version": 1, - "spec_id": "spec_8435999aa7036a9ab5ff61e26cc18069", - "identity": { - "identity_version": "spec1", - "shape": { - "kind": "statvar_schema", - "population_type": "FinancialFlow", - "measured_property": "amount", - "stat_type": "measuredValue", - "measurement_qualifier": "Nominal" - }, - "slots": [ - { - "property": "dac2aAidType", - "binding": { - "state": "value", - "ref": "DAC2aAidType206" - } - }, - { - "property": "dacTypeOfFinance", - "binding": { - "state": "unbound" - } - }, - { - "property": "financialFlowType", - "binding": { - "state": "value", - "ref": "Disbursement" - } - }, - { - "property": "nettingBasis", - "binding": { - "state": "value", - "ref": "Net" - } - } - ], - "entities": { - "destination": [ - "country/COD" - ], - "origin": [ - "country/DEU" - ] - }, - "requested_window": { - "kind": "range", - "start_year": 2018, - "end_year": 2018 - } - } - }, - "label": "net disbursements", - "axis": "what", - "measure_axis_values": [ - { - "axis": "populationType", - "value": { - "ref": "FinancialFlow", - "label": "financial flow" - } - }, - { - "axis": "measuredProperty", - "value": { - "ref": "amount", - "label": "amount" - } - }, - { - "axis": "measurementQualifier", - "value": { - "ref": "Nominal", - "label": "nominal" - } - }, - { - "axis": "financialFlowType", - "value": { - "ref": "Disbursement", - "label": "disbursement" - } - }, - { - "axis": "nettingBasis", - "value": { - "ref": "Net", - "label": "net" - } - } - ], - "served_rows": 1, - "served_rows_exact": true - } - ], - "measure_label": "gross disbursements", + "alternative_measures": [], + "measure_label": "net disbursements", "measure_label_axes": [ "populationType", "measuredProperty", @@ -1376,11 +1238,13 @@ { "axis": "nettingBasis", "value": { - "ref": "Gross", - "label": "gross" + "ref": "Net", + "label": "net" } } ], + "concept_label": "official development assistance", + "published_tables": "OECD DAC2a", "unit_conversion": { "currencies": [ { @@ -3344,12 +3208,290 @@ "origin": "EUR" } }, + "scope_choices": { + "id": "spec_8435999aa7036a9ab5ff61e26cc18069", + "base": { + "schema_version": 1, + "spec_id": "spec_8435999aa7036a9ab5ff61e26cc18069", + "identity": { + "identity_version": "spec1", + "shape": { + "kind": "statvar_schema", + "population_type": "FinancialFlow", + "measured_property": "amount", + "stat_type": "measuredValue", + "measurement_qualifier": "Nominal" + }, + "slots": [ + { + "property": "dac2aAidType", + "binding": { + "state": "value", + "ref": "DAC2aAidType206" + } + }, + { + "property": "dacTypeOfFinance", + "binding": { + "state": "unbound" + } + }, + { + "property": "financialFlowType", + "binding": { + "state": "value", + "ref": "Disbursement" + } + }, + { + "property": "nettingBasis", + "binding": { + "state": "value", + "ref": "Net" + } + } + ], + "entities": { + "destination": [ + "country/COD" + ], + "origin": [ + "country/DEU" + ] + }, + "requested_window": { + "kind": "range", + "start_year": 2018, + "end_year": 2018 + } + } + }, + "rule_version": "scope1:3eef00a928eedd463ee48d02b79730da", + "entries": [], + "dropped_entries": [], + "choices": [ + { + "id": "spec_8435999aa7036a9ab5ff61e26cc18069:measure_basis", + "axis": "measure_basis", + "rule": "measure_basis_convention", + "provenance": "default", + "active": "measure_basis:net", + "options": [ + { + "option_id": "measure_basis:gross", + "label": "gross disbursements, current USD", + "binding": { + "kind": "shape", + "measured_property": "amount", + "netting_basis": "Gross" + }, + "availability": { + "status": "available", + "detail": {} + } + }, + { + "option_id": "measure_basis:net", + "label": "net disbursements, current USD", + "binding": { + "kind": "shape", + "measured_property": "amount", + "netting_basis": "Net" + }, + "availability": { + "status": "available", + "detail": {} + } + }, + { + "option_id": "measure_basis:grant_equivalent", + "label": "grant equivalents (OECD headline), current USD", + "binding": { + "kind": "shape", + "measured_property": "grantEquivalent", + "netting_basis": null + }, + "availability": { + "status": "unavailable", + "code": "basis_not_published", + "detail": { + "dataset": "provenance/OECDDAC2A" + } + } + }, + { + "option_id": "measure_basis:commitments", + "label": "commitments, current USD", + "binding": { + "kind": "shape", + "measured_property": "amount", + "netting_basis": null + }, + "availability": { + "status": "unavailable", + "code": "basis_not_published", + "detail": { + "dataset": "provenance/OECDDAC2A" + } + } + } + ] + }, + { + "id": "spec_8435999aa7036a9ab5ff61e26cc18069:provider", + "axis": "provider", + "rule": "bilateral_recipient_total", + "provenance": "default", + "active": "provider:bilateral", + "options": [ + { + "option_id": "provider:bilateral", + "label": "bilateral flows only", + "binding": { + "kind": "provider", + "scope": "bilateral" + }, + "availability": { + "status": "available", + "detail": {} + } + }, + { + "option_id": "provider:inclusive", + "label": "net bilateral plus imputed multilateral as published, by convention", + "binding": { + "kind": "provider", + "scope": "inclusive", + "provenance": "provenance/ONEDAC2aBilateralAndImputedMultilateral" + }, + "availability": { + "status": "available", + "detail": {} + } + } + ] + } + ], + "compiled": { + "spec_id": "spec_8435999aa7036a9ab5ff61e26cc18069", + "identity": { + "identity_version": "spec1", + "shape": { + "kind": "statvar_schema", + "population_type": "FinancialFlow", + "measured_property": "amount", + "stat_type": "measuredValue", + "measurement_qualifier": "Nominal" + }, + "slots": [ + { + "property": "dac2aAidType", + "binding": { + "state": "value", + "ref": "DAC2aAidType206" + } + }, + { + "property": "dacTypeOfFinance", + "binding": { + "state": "unbound" + } + }, + { + "property": "financialFlowType", + "binding": { + "state": "value", + "ref": "Disbursement" + } + }, + { + "property": "nettingBasis", + "binding": { + "state": "value", + "ref": "Net" + } + } + ], + "entities": { + "destination": [ + "country/COD" + ], + "origin": [ + "country/DEU" + ] + }, + "requested_window": { + "kind": "range", + "start_year": 2018, + "end_year": 2018 + } + }, + "components": [ + { + "role": "whole", + "identity": { + "identity_version": "spec1", + "shape": { + "kind": "statvar_schema", + "population_type": "FinancialFlow", + "measured_property": "amount", + "stat_type": "measuredValue", + "measurement_qualifier": "Nominal" + }, + "slots": [ + { + "property": "dac2aAidType", + "binding": { + "state": "value", + "ref": "DAC2aAidType206" + } + }, + { + "property": "dacTypeOfFinance", + "binding": { + "state": "unbound" + } + }, + { + "property": "financialFlowType", + "binding": { + "state": "value", + "ref": "Disbursement" + } + }, + { + "property": "nettingBasis", + "binding": { + "state": "value", + "ref": "Net" + } + } + ], + "entities": { + "destination": [ + "country/COD" + ], + "origin": [ + "country/DEU" + ] + }, + "requested_window": { + "kind": "range", + "start_year": 2018, + "end_year": 2018 + } + } + } + ] + }, + "ledger": [] + }, "equivalent_readings": [ { - "spec_id": "spec_6b3a93b7bdf9a3dd1d4976a7e7eac4ee", + "spec_id": "spec_8435999aa7036a9ab5ff61e26cc18069", "definition": { "schema_version": 1, - "spec_id": "spec_6b3a93b7bdf9a3dd1d4976a7e7eac4ee" + "spec_id": "spec_8435999aa7036a9ab5ff61e26cc18069" } } ] @@ -3357,7 +3499,7 @@ } } ], - "rendered_sentence": "Germany's gross disbursements to Democratic Republic of the Congo for official development assistance in 2018. Current US dollars · OECD DAC2a.", + "rendered_sentence": "Germany's net disbursements to Democratic Republic of the Congo for official development assistance in 2018. Current US dollars · OECD DAC2a.", "sentence_plan": [ { "kind": "slot", @@ -3391,7 +3533,7 @@ }, { "kind": "slot", - "text": "gross disbursements", + "text": "net disbursements", "axis": "what", "segment": "heading", "entity_refs": [], @@ -3575,10 +3717,10 @@ "answer": { "kind": "resolution", "status": "definite", - "sentence": "Germany's gross disbursements to Democratic Republic of the Congo for official development assistance in 2018. Current US dollars · OECD DAC2a.", + "sentence": "Germany's net disbursements to Democratic Republic of the Congo for official development assistance in 2018. Current US dollars · OECD DAC2a.", "complete": true, "specs": [ - "spec_6b3a93b7bdf9a3dd1d4976a7e7eac4ee" + "spec_8435999aa7036a9ab5ff61e26cc18069" ], "gaps": [] } diff --git a/python/client-contract/src/dfo_client_contract/scenarios/answer-operations-not-a-list.json b/python/client-contract/src/dfo_client_contract/scenarios/answer-operations-not-a-list.json index 8ca97a3..57e2d2f 100644 --- a/python/client-contract/src/dfo_client_contract/scenarios/answer-operations-not-a-list.json +++ b/python/client-contract/src/dfo_client_contract/scenarios/answer-operations-not-a-list.json @@ -33,7 +33,7 @@ "status": 200, "headers": { "content-type": "application/json", - "x-dfo-trace-id": "c7cb40f3790f4a15a0ddcad0cc93c9bb" + "x-dfo-trace-id": "92a325e77a854c5daafa875164b5e23e" }, "json": { "schema_version": 1, @@ -41,23 +41,27 @@ "entry_path": "raw_text", "raw_query": "ODA disbursements from Germany to Nigeria for basic health care", "normalized_query": "ODA disbursements from Germany to Nigeria for basic health care", - "extract_skipped": true + "extract_skipped": false }, "diagnostics": { - "engine_build": "d80df9f5fd598b7345255470932d202ee5d49942", - "trace_id": "c7cb40f3790f4a15a0ddcad0cc93c9bb", + "engine_build": "ccb6617922c839ce3cd5615a3bbb65c70bfe1bde", + "trace_id": "92a325e77a854c5daafa875164b5e23e", "warnings": [], "timing_ms": { - "total": 3, + "total": 17540, "by_step": { "coverage": 0, - "response_cache_layer1": 1 + "extract": 1239, + "exclusion_read": 719, + "cache_lookup": 0 } }, "llm_usage": { - "input_tokens": 0, - "output_tokens": 0, - "cached_tokens": 0 + "input_tokens": 2784, + "output_tokens": 111, + "cached_tokens": 0, + "jev_input_tokens": 6695, + "jev_output_tokens": 2088 }, "timed_out": false }, @@ -67,30 +71,30 @@ "variable_text": "ODA disbursements for basic health care", "warnings": [], "timing_ms": { - "total": 3011, + "total": 16265, "by_step": { - "recall": 457, + "recall": 2821, "phase_resolve_places": 0, "phase_check_entities": 0, "shape_arcs": 2, - "shape_probe_coverage": 8, - "shape_probe": 114, - "shape_groups": 579, + "shape_probe_coverage": 104, + "shape_probe": 352, + "shape_groups": 109, "shape_labels": 1, - "shape_admission": 2, + "shape_admission": 0, "phase_derive_shapes": 0, - "shape": 1247, + "shape": 1134, "phase_prune_and_rank": 0, - "bind": 266, - "phase_bind": 327, - "phase_settle": 46, - "phase_place_bindings": 57, + "bind": 5473, + "phase_bind": 345, + "phase_settle": 105, + "phase_place_bindings": 1078, "phase_facet_requests": 0, - "materialise": 44, - "phase_materialise": 200, - "answer": 220, - "options": 55, - "phase_outcome": 92 + "materialise": 2132, + "phase_materialise": 313, + "answer": 1829, + "options": 872, + "phase_outcome": 163 } }, "restatement": { @@ -541,7 +545,7 @@ "label": "OECD Terms and Conditions" } }, - "coverage_stamp": "e6e717ab8c77e84d010915893ede5809e9ecec67929a07cfafbcc2210edfa1eb", + "coverage_stamp": "ad27fd11738abb03d2d84dc214e223f04781609636cf678d0d08c385fb863d99", "facets": { "provenance": { "basis": "fallback", @@ -599,7 +603,7 @@ }, "relation": "child", "parent": "CRSCooperationModalityB", - "member_count": 1606, + "member_count": 1614, "served_rows": 1, "served_rows_exact": true }, @@ -613,7 +617,7 @@ }, "relation": "child", "parent": "CRSCooperationModalityB", - "member_count": 1331, + "member_count": 1337, "served_rows": 6, "served_rows_exact": true }, @@ -640,7 +644,7 @@ }, "relation": "child", "parent": "CRSCooperationModalityC", - "member_count": 7005, + "member_count": 7041, "served_rows": 7, "served_rows_exact": true }, @@ -736,7 +740,7 @@ }, "relation": "child", "parent": "CRSTypeOfFinance100", - "member_count": 12672, + "member_count": 12745, "served_rows": 30, "served_rows_exact": true } @@ -763,7 +767,7 @@ "value_kind": "enum_value" }, "relation": "root", - "member_count": 14098, + "member_count": 14146, "served_rows": 30, "served_rows_exact": true } @@ -1194,7 +1198,7 @@ "selected": [] } ], - "capability_version": "cap_765c9d2a0c7529b9", + "capability_version": "cap_4913302d7a6b6435", "default_reading": { "applied": true, "removed_stat_vars": [] @@ -1202,214 +1206,7 @@ }, "confidence": "high", "available_at_place": true, - "alternative_measures": [ - { - "definition": { - "schema_version": 1, - "spec_id": "spec_80b92ca1ba1114b426eb5e79b84361d4", - "identity": { - "identity_version": "spec1", - "shape": { - "kind": "statvar_schema", - "population_type": "FinancialFlow", - "measured_property": "amount", - "stat_type": "measuredValue", - "measurement_qualifier": "Nominal" - }, - "slots": [ - { - "property": "crsCooperationModality", - "binding": { - "state": "unbound" - } - }, - { - "property": "crsPurpose", - "binding": { - "state": "value", - "ref": "CRSPurposeCode12220" - } - }, - { - "property": "crsTypeOfFinance", - "binding": { - "state": "unbound" - } - }, - { - "property": "crsTypeOfFlow", - "binding": { - "state": "value", - "ref": "CRSTypeOfFlow10" - } - }, - { - "property": "financialFlowType", - "binding": { - "state": "value", - "ref": "Disbursement" - } - }, - { - "property": "nettingBasis", - "binding": { - "state": "value", - "ref": "Net" - } - } - ], - "entities": { - "destination": [ - "country/NGA" - ], - "origin": [ - "country/DEU" - ] - }, - "requested_window": { - "kind": "all" - } - } - }, - "label": "net disbursements", - "axis": "what", - "measure_axis_values": [ - { - "axis": "populationType", - "value": { - "ref": "FinancialFlow", - "label": "financial flow" - } - }, - { - "axis": "measuredProperty", - "value": { - "ref": "amount", - "label": "amount" - } - }, - { - "axis": "measurementQualifier", - "value": { - "ref": "Nominal", - "label": "nominal" - } - }, - { - "axis": "financialFlowType", - "value": { - "ref": "Disbursement", - "label": "disbursement" - } - }, - { - "axis": "nettingBasis", - "value": { - "ref": "Net", - "label": "net" - } - } - ], - "served_rows": 30, - "served_rows_exact": true - }, - { - "definition": { - "schema_version": 1, - "spec_id": "spec_c394f9108db2100f1c8e4532d8d1c804", - "identity": { - "identity_version": "spec1", - "shape": { - "kind": "statvar_schema", - "population_type": "FinancialObligation", - "measured_property": "amount", - "stat_type": "measuredValue", - "measurement_qualifier": "Nominal" - }, - "slots": [ - { - "property": "crsCooperationModality", - "binding": { - "state": "unbound" - } - }, - { - "property": "crsPurpose", - "binding": { - "state": "value", - "ref": "CRSPurposeCode12220" - } - }, - { - "property": "crsTypeOfFinance", - "binding": { - "state": "unbound" - } - }, - { - "property": "crsTypeOfFlow", - "binding": { - "state": "value", - "ref": "CRSTypeOfFlow10" - } - }, - { - "property": "financialObligationType", - "binding": { - "state": "value", - "ref": "Commitment" - } - } - ], - "entities": { - "destination": [ - "country/NGA" - ], - "origin": [ - "country/DEU" - ] - }, - "requested_window": { - "kind": "all" - } - } - }, - "label": "commitments", - "axis": "what", - "measure_axis_values": [ - { - "axis": "populationType", - "value": { - "ref": "FinancialObligation", - "label": "financial obligation" - } - }, - { - "axis": "measuredProperty", - "value": { - "ref": "amount", - "label": "amount" - } - }, - { - "axis": "measurementQualifier", - "value": { - "ref": "Nominal", - "label": "nominal" - } - }, - { - "axis": "financialObligationType", - "value": { - "ref": "Commitment", - "label": "commitment" - } - } - ], - "served_rows": 24, - "served_rows_exact": true - } - ], + "alternative_measures": [], "measure_label": "gross disbursements", "measure_label_axes": [ "populationType", @@ -1455,6 +1252,8 @@ } } ], + "concept_label": "basic health care", + "published_tables": "OECD Creditor Reporting System (CRS)", "open_axis_facts": [ { "property": "crsTypeOfFinance", @@ -3480,6 +3279,363 @@ "destination": "NGN", "origin": "EUR" } + }, + "scope_choices": { + "id": "spec_774d6c001a6250aa67ca676ab067895e", + "base": { + "schema_version": 1, + "spec_id": "spec_774d6c001a6250aa67ca676ab067895e", + "identity": { + "identity_version": "spec1", + "shape": { + "kind": "statvar_schema", + "population_type": "FinancialFlow", + "measured_property": "amount", + "stat_type": "measuredValue", + "measurement_qualifier": "Nominal" + }, + "slots": [ + { + "property": "crsCooperationModality", + "binding": { + "state": "unbound" + } + }, + { + "property": "crsPurpose", + "binding": { + "state": "value", + "ref": "CRSPurposeCode12220" + } + }, + { + "property": "crsTypeOfFinance", + "binding": { + "state": "unbound" + } + }, + { + "property": "crsTypeOfFlow", + "binding": { + "state": "value", + "ref": "CRSTypeOfFlow10" + } + }, + { + "property": "financialFlowType", + "binding": { + "state": "value", + "ref": "Disbursement" + } + }, + { + "property": "nettingBasis", + "binding": { + "state": "value", + "ref": "Gross" + } + } + ], + "entities": { + "destination": [ + "country/NGA" + ], + "origin": [ + "country/DEU" + ] + }, + "requested_window": { + "kind": "all" + } + } + }, + "rule_version": "scope1:3eef00a928eedd463ee48d02b79730da", + "entries": [ + { + "axis": "sector", + "option_id": "sector:12220", + "provenance": "explicit", + "origin": { + "kind": "text", + "text": "basic health care", + "start": 46, + "end": 63 + } + } + ], + "dropped_entries": [], + "choices": [ + { + "id": "spec_774d6c001a6250aa67ca676ab067895e:sector", + "axis": "sector", + "rule": "sector_code", + "provenance": "explicit", + "active": "sector:12220", + "options": [ + { + "option_id": "sector:12220", + "label": "basic health care (CRS 12220)", + "binding": { + "kind": "slot", + "slot": "crsPurpose", + "state": "value", + "refs": [ + "CRSPurposeCode12220" + ] + }, + "availability": { + "status": "available", + "detail": {} + } + } + ] + }, + { + "id": "spec_774d6c001a6250aa67ca676ab067895e:measure_basis", + "axis": "measure_basis", + "rule": "measure_basis_convention", + "provenance": "default", + "active": "measure_basis:gross", + "options": [ + { + "option_id": "measure_basis:gross", + "label": "gross disbursements, current USD", + "binding": { + "kind": "shape", + "measured_property": "amount", + "netting_basis": "Gross" + }, + "availability": { + "status": "available", + "detail": {} + } + }, + { + "option_id": "measure_basis:net", + "label": "net disbursements, current USD", + "binding": { + "kind": "shape", + "measured_property": "amount", + "netting_basis": "Net" + }, + "availability": { + "status": "available", + "detail": {} + } + }, + { + "option_id": "measure_basis:grant_equivalent", + "label": "grant equivalents (OECD headline), current USD", + "binding": { + "kind": "shape", + "measured_property": "grantEquivalent", + "netting_basis": null + }, + "availability": { + "status": "available", + "detail": {} + } + }, + { + "option_id": "measure_basis:commitments", + "label": "commitments, current USD", + "binding": { + "kind": "shape", + "measured_property": "amount", + "netting_basis": null + }, + "availability": { + "status": "available", + "detail": {} + } + } + ] + }, + { + "id": "spec_774d6c001a6250aa67ca676ab067895e:provider", + "axis": "provider", + "rule": "bilateral_flows", + "provenance": "default", + "active": "provider:bilateral", + "options": [ + { + "option_id": "provider:bilateral", + "label": "bilateral flows only", + "binding": { + "kind": "provider", + "scope": "bilateral" + }, + "availability": { + "status": "available", + "detail": {} + } + }, + { + "option_id": "provider:inclusive", + "label": "bilateral plus imputed multilateral, 2020 to 2024", + "binding": { + "kind": "provider", + "scope": "inclusive", + "window": [ + 2020, + 2024 + ], + "provenance": "provenance/ONEBilateralAndImputedMultilateral" + }, + "availability": { + "status": "partial", + "years": [ + [ + 2011, + 2016 + ], + [ + 2020, + 2024 + ] + ], + "code": "imputed_coverage", + "detail": {} + } + } + ] + } + ], + "compiled": { + "spec_id": "spec_774d6c001a6250aa67ca676ab067895e", + "identity": { + "identity_version": "spec1", + "shape": { + "kind": "statvar_schema", + "population_type": "FinancialFlow", + "measured_property": "amount", + "stat_type": "measuredValue", + "measurement_qualifier": "Nominal" + }, + "slots": [ + { + "property": "crsCooperationModality", + "binding": { + "state": "unbound" + } + }, + { + "property": "crsPurpose", + "binding": { + "state": "value", + "ref": "CRSPurposeCode12220" + } + }, + { + "property": "crsTypeOfFinance", + "binding": { + "state": "unbound" + } + }, + { + "property": "crsTypeOfFlow", + "binding": { + "state": "value", + "ref": "CRSTypeOfFlow10" + } + }, + { + "property": "financialFlowType", + "binding": { + "state": "value", + "ref": "Disbursement" + } + }, + { + "property": "nettingBasis", + "binding": { + "state": "value", + "ref": "Gross" + } + } + ], + "entities": { + "destination": [ + "country/NGA" + ], + "origin": [ + "country/DEU" + ] + }, + "requested_window": { + "kind": "all" + } + }, + "components": [ + { + "role": "whole", + "identity": { + "identity_version": "spec1", + "shape": { + "kind": "statvar_schema", + "population_type": "FinancialFlow", + "measured_property": "amount", + "stat_type": "measuredValue", + "measurement_qualifier": "Nominal" + }, + "slots": [ + { + "property": "crsCooperationModality", + "binding": { + "state": "unbound" + } + }, + { + "property": "crsPurpose", + "binding": { + "state": "value", + "ref": "CRSPurposeCode12220" + } + }, + { + "property": "crsTypeOfFinance", + "binding": { + "state": "unbound" + } + }, + { + "property": "crsTypeOfFlow", + "binding": { + "state": "value", + "ref": "CRSTypeOfFlow10" + } + }, + { + "property": "financialFlowType", + "binding": { + "state": "value", + "ref": "Disbursement" + } + }, + { + "property": "nettingBasis", + "binding": { + "state": "value", + "ref": "Gross" + } + } + ], + "entities": { + "destination": [ + "country/NGA" + ], + "origin": [ + "country/DEU" + ] + }, + "requested_window": { + "kind": "all" + } + } + } + ] + }, + "ledger": [] } } } @@ -3793,7 +3949,7 @@ "status": 200, "headers": { "content-type": "application/json", - "x-dfo-trace-id": "4c3f35c8c0d44b99941a73a9519b41d2" + "x-dfo-trace-id": "fff69a3d23f5431c8a34da1b72c9e034" }, "json": { "schema_version": 1, @@ -4193,8 +4349,8 @@ "family_member_digest": "9fd3643bbde505d9542fd3d090ddd549349765d12b6bad95b17271cbf297ea8c", "frame_grammar_version": "1.1.0", "origin_catalogue_build_id": "20261011T194155Z-80081f08", - "served_from": "head", - "confirmed_at": "2026-10-26T09:17:22.037029+00:00" + "served_from": "materialise", + "confirmed_at": "2026-11-01T07:35:51.549820+00:00" }, "warnings": [ { @@ -4224,7 +4380,7 @@ "created_at": "2026-10-23T16:56:32.058938+00:00", "tier": "working", "url": "/api/datasets/spec_774d6c001a6250aa67ca676ab067895e/cv_b92d94774702c7f05f2075d0b03dd756/files/sha256:421efacc2dc010af38112a087b0b49ff5539f61d2afd12a88272b27e99b5f5db", - "enrichment_stamp": "08ed6c734fc69ea2204a21f4e1dd8b963f14dd1e03a2484c618049ac2e2d93d8" + "enrichment_stamp": "55887b871f7aa1c5d120cb2bee97086605351d5acfbec645ab027f562d0f65c5" }, { "artifact_digest": "sha256:07984a96eaf8ee637fe15bf13f2b0d9160a6378d3fa1efae2e71cf0e20115dff", @@ -4240,7 +4396,7 @@ ], "series_count": 5, "output_options": { - "capability_version": "dset_76f5fa7244511c58", + "capability_version": "dset_5282a0674178a233", "columns": [ { "name": "stat_var", @@ -4323,7 +4479,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": false }, { "column": "financingProvider", @@ -4335,7 +4492,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": false }, { "column": "financingProvider", @@ -4347,7 +4505,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true }, { "column": "financingProvider", @@ -4359,7 +4518,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": false }, { "column": "financingProvider", @@ -4371,7 +4531,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true }, { "column": "financingProvider", @@ -4383,7 +4544,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true }, { "column": "financingProvider", @@ -4395,7 +4557,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true }, { "column": "financingRecipient", @@ -4407,7 +4570,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": false }, { "column": "financingRecipient", @@ -4419,7 +4583,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": false }, { "column": "financingRecipient", @@ -4431,7 +4596,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true }, { "column": "financingRecipient", @@ -4443,7 +4609,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": false }, { "column": "financingRecipient", @@ -4455,7 +4622,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true }, { "column": "financingRecipient", @@ -4467,7 +4635,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true }, { "column": "financingRecipient", @@ -4479,7 +4648,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true } ], "long_layout_defaults": [ @@ -4523,7 +4693,7 @@ ] } }, - "series_coverage_stamp": "e6e717ab8c77e84d010915893ede5809e9ecec67929a07cfafbcc2210edfa1eb", + "series_coverage_stamp": "ad27fd11738abb03d2d84dc214e223f04781609636cf678d0d08c385fb863d99", "retention": { "pinned": true } @@ -4540,7 +4710,7 @@ "headers": { "content-type": "text/html", "location": "https://storage.googleapis.com/dev-fin-observatory-datasets-working/sha256%3A421efacc2dc010af38112a087b0b49ff5539f61d2afd12a88272b27e99b5f5db?X-Goog-Signature=redacted", - "x-dfo-trace-id": "333ab72de55449ed8288a5f458406a4c" + "x-dfo-trace-id": "815c18c3e59945d6ade9f99db58f2960" } } }, diff --git a/python/client-contract/src/dfo_client_contract/scenarios/answer-part-status-not-a-string.json b/python/client-contract/src/dfo_client_contract/scenarios/answer-part-status-not-a-string.json index 7f3c983..9e58845 100644 --- a/python/client-contract/src/dfo_client_contract/scenarios/answer-part-status-not-a-string.json +++ b/python/client-contract/src/dfo_client_contract/scenarios/answer-part-status-not-a-string.json @@ -30,7 +30,7 @@ "status": 200, "headers": { "content-type": "application/json", - "x-dfo-trace-id": "86b361f85db44a29b3d711350962ca73" + "x-dfo-trace-id": "cf40b66c70a74f34af1ea479ba67e11f" }, "json": { "schema_version": 1, @@ -41,20 +41,21 @@ "extract_skipped": false }, "diagnostics": { - "engine_build": "d80df9f5fd598b7345255470932d202ee5d49942", - "trace_id": "86b361f85db44a29b3d711350962ca73", + "engine_build": "ccb6617922c839ce3cd5615a3bbb65c70bfe1bde", + "trace_id": "cf40b66c70a74f34af1ea479ba67e11f", "warnings": [], "timing_ms": { - "total": 456, + "total": 3122, "by_step": { "coverage": 0, - "extract": 0, - "cache_lookup": 0 + "extract": 921, + "exclusion_read": 781, + "cache_lookup": 1 } }, "llm_usage": { - "input_tokens": 0, - "output_tokens": 0, + "input_tokens": 2786, + "output_tokens": 112, "cached_tokens": 0, "jev_input_tokens": 5250, "jev_output_tokens": 1104 @@ -67,30 +68,30 @@ "variable_text": "debt service", "warnings": [], "timing_ms": { - "total": 452, + "total": 2193, "by_step": { - "recall": 1, + "recall": 1640, "phase_resolve_places": 0, "phase_check_entities": 0, - "shape_arcs": 2, - "shape_probe_coverage": 17, - "shape_probe": 101, - "shape_groups": 8, - "shape_labels": 14, + "shape_arcs": 4, + "shape_probe_coverage": 12, + "shape_probe": 98, + "shape_groups": 6, + "shape_labels": 11, "shape_admission": 0, "phase_derive_shapes": 0, - "shape": 225, + "shape": 232, "phase_prune_and_rank": 0, - "bind": 77, - "phase_bind": 17, - "phase_settle": 5, + "bind": 91, + "phase_bind": 19, + "phase_settle": 8, "phase_place_bindings": 14, "phase_facet_requests": 0, - "materialise": 11, - "phase_materialise": 23, - "answer": 2, - "options": 9, - "phase_outcome": 68 + "materialise": 13, + "phase_materialise": 31, + "answer": 3, + "options": 78, + "phase_outcome": 64 } }, "restatement": { @@ -565,7 +566,7 @@ "label": "Creative Commons Attribution License" } }, - "coverage_stamp": "e6e717ab8c77e84d010915893ede5809e9ecec67929a07cfafbcc2210edfa1eb", + "coverage_stamp": "ad27fd11738abb03d2d84dc214e223f04781609636cf678d0d08c385fb863d99", "facets": { "provenance": { "basis": "fallback", @@ -1283,7 +1284,7 @@ } ], "query_qualifiers": [], - "capability_version": "cap_765c9d2a0c7529b9", + "capability_version": "cap_4913302d7a6b6435", "default_reading": { "applied": true, "removed_stat_vars": [] @@ -1293,6 +1294,7 @@ "available_at_place": true, "measure_label_axes": [], "measure_axis_values": [], + "published_tables": "World Bank International Debt Statistics (IDS)", "unit_conversion": { "currencies": [ { @@ -3268,18 +3270,18 @@ "variable_text": "price of tea", "warnings": [], "timing_ms": { - "total": 121, + "total": 1545, "by_step": { - "recall": 0, + "recall": 1436, "phase_resolve_places": 0, "phase_check_entities": 0, - "shape_arcs": 1, - "shape_probe": 96, + "shape_arcs": 3, + "shape_probe": 101, "shape_groups": 1, "shape_labels": 0, - "shape_admission": 0, + "shape_admission": 1, "phase_derive_shapes": 0, - "shape": 121, + "shape": 109, "phase_prune_and_rank": 0 } }, @@ -3631,7 +3633,7 @@ "error": { "class": "ContractError", "code": "contract_violation", - "trace_id": "86b361f85db44a29b3d711350962ca73" + "trace_id": "cf40b66c70a74f34af1ea479ba67e11f" } } ] diff --git a/python/client-contract/src/dfo_client_contract/scenarios/answer-several-readings-folded.json b/python/client-contract/src/dfo_client_contract/scenarios/answer-several-readings-folded.json index 66e1e7f..67e6d20 100644 --- a/python/client-contract/src/dfo_client_contract/scenarios/answer-several-readings-folded.json +++ b/python/client-contract/src/dfo_client_contract/scenarios/answer-several-readings-folded.json @@ -5,8 +5,8 @@ "origin": { "kind": "recorded", "base_url": "https://dfo-dev-apis-zms5lj4zhq-nn.a.run.app/api", - "dfo_commit": "d80df9f5fd598b7345255470932d202ee5d49942", - "recorded_at": "2026-10-26T09:22:10Z" + "dfo_commit": "ccb6617922c839ce3cd5615a3bbb65c70bfe1bde", + "recorded_at": "2026-11-01T07:37:26Z" }, "call": [ { @@ -34,7 +34,7 @@ "status": 200, "headers": { "content-type": "application/json", - "x-dfo-trace-id": "5e0f0d6a5a6442a38932b02d7f72ed6c" + "x-dfo-trace-id": "c58dd2d53f1d4340a3f1fcb4c72681c5" }, "json": { "schema_version": 1, @@ -42,23 +42,27 @@ "entry_path": "raw_text", "raw_query": "ODA disbursements for health and for education from Germany to Kenya, and GDP of Kenya", "normalized_query": "ODA disbursements for health and for education from Germany to Kenya, and GDP of Kenya", - "extract_skipped": true + "extract_skipped": false }, "diagnostics": { - "engine_build": "d80df9f5fd598b7345255470932d202ee5d49942", - "trace_id": "5e0f0d6a5a6442a38932b02d7f72ed6c", + "engine_build": "ccb6617922c839ce3cd5615a3bbb65c70bfe1bde", + "trace_id": "c58dd2d53f1d4340a3f1fcb4c72681c5", "warnings": [], "timing_ms": { - "total": 8, + "total": 6877, "by_step": { "coverage": 0, - "response_cache_layer1": 1 + "extract": 1225, + "exclusion_read": 636, + "cache_lookup": 0 } }, "llm_usage": { - "input_tokens": 0, - "output_tokens": 0, - "cached_tokens": 0 + "input_tokens": 2796, + "output_tokens": 224, + "cached_tokens": 0, + "jev_input_tokens": 25826, + "jev_output_tokens": 5796 }, "timed_out": false }, @@ -68,30 +72,30 @@ "variable_text": "health ODA disbursements", "warnings": [], "timing_ms": { - "total": 4401, + "total": 4245, "by_step": { - "recall": 1271, + "recall": 1975, "phase_resolve_places": 0, "phase_check_entities": 0, - "shape_arcs": 108, - "shape_probe_coverage": 4, - "shape_probe": 113, - "shape_groups": 72, - "shape_labels": 12, - "shape_admission": 0, + "shape_arcs": 1, + "shape_probe_coverage": 5, + "shape_probe": 116, + "shape_groups": 62, + "shape_labels": 11, + "shape_admission": 1, "phase_derive_shapes": 0, - "shape": 524, + "shape": 280, "phase_prune_and_rank": 0, - "bind": 482, - "phase_bind": 205, - "phase_settle": 57, - "phase_place_bindings": 34, + "bind": 227, + "phase_bind": 195, + "phase_settle": 82, + "phase_place_bindings": 31, "phase_facet_requests": 0, - "materialise": 686, - "phase_materialise": 225, - "answer": 28, - "options": 685, - "phase_outcome": 204 + "materialise": 858, + "phase_materialise": 171, + "answer": 78, + "options": 214, + "phase_outcome": 134 } }, "restatement": { @@ -128,10 +132,10 @@ "assumptions": [], "status": "definite", "spec": { - "spec_id": "spec_25f482395c5d012ec278118f38dff29c", + "spec_id": "spec_7a02b6facd2dc17b5d0d7c35c11bf5d2", "definition": { "schema_version": 1, - "spec_id": "spec_25f482395c5d012ec278118f38dff29c", + "spec_id": "spec_7a02b6facd2dc17b5d0d7c35c11bf5d2", "identity": { "identity_version": "spec1", "shape": { @@ -154,7 +158,8 @@ "state": "set", "refs": [ "CRSPurposeCode110", - "CRSPurposeCode120" + "CRSPurposeCode120", + "CRSPurposeCode130" ] } }, @@ -202,7 +207,7 @@ "resolved": { "shape": { "shape_id": "financialflow_amount_measuredvalue_nominal", - "label": "gross disbursements (official development assistance)", + "label": "gross disbursements (education, health and population policy, programme, and reproductive health, official development assistance)", "population_type": { "ref": "FinancialFlow", "label": "financial flow" @@ -282,8 +287,8 @@ "label": "data source" } ], - "member_count": 545, - "member_digest": "0c7508fd1997d6cdc896f2eab0f092a4915cfca9e2400eb9577bb22b527fe882", + "member_count": 634, + "member_digest": "5c91c0a8d90f4619a1ff7122cacdc8b0bc48b22c70516d7673aec42caf6da0d4", "refine_supported": true, "data_commons": [ { @@ -318,6 +323,13 @@ "label": "health" }, "value_kind": "enum_value" + }, + { + "ref": { + "ref": "CRSPurposeCode130", + "label": "population policy, programme, and reproductive health" + }, + "value_kind": "enum_value" } ] }, @@ -410,6 +422,26 @@ { "ref": "CRSPurposeCode12382", "label": "research for noncommunicable disease prevention and control" + }, + { + "ref": "CRSPurposeCode13010", + "label": "population policy and administrative management" + }, + { + "ref": "CRSPurposeCode13020", + "label": "reproductive health care" + }, + { + "ref": "CRSPurposeCode13030", + "label": "family planning" + }, + { + "ref": "CRSPurposeCode13040", + "label": "sexually transmitted disease control" + }, + { + "ref": "CRSPurposeCode13081", + "label": "personnel development for population and reproductive health" } ] }, @@ -549,9 +581,9 @@ ], "unresolved_slots": [], "stat_vars": { - "member_count": 108, + "member_count": 123, "member_count_exact": true, - "served_count": 545, + "served_count": 634, "data_date_range": { "start": "1997", "end": "2024" @@ -581,15 +613,21 @@ }, { "label": "observations", - "count": 12 + "count": 19 }, { "label": "variables", - "count": 51 + "count": 66 } ] }, "facets": { + "unit": { + "basis": "fallback", + "ref": "CurrencyUSD", + "label": "US Dollar", + "currency": "USD" + }, "provenance": { "basis": "fallback", "ref": "provenance/OECDCreditorReportingSystem", @@ -604,12 +642,6 @@ }, "documentation": "/api/graph/documentation/provenance/OECDCreditorReportingSystem", "account": "provider" - }, - "unit": { - "basis": "fallback", - "ref": "CurrencyUSD", - "label": "US Dollar", - "currency": "USD" } }, "slot_options": [ @@ -626,45 +658,85 @@ { "value": { "ref": { - "ref": "CRSPurposeCode121", - "label": "general health" + "ref": "CRSPurposeCode998", + "label": "unallocated and unspecified" + }, + "value_kind": "enum_value" + }, + "relation": "root", + "member_count": 76, + "served_rows": 74, + "served_rows_exact": true + }, + { + "value": { + "ref": { + "ref": "CRSPurposeCode99810", + "label": "sectors not specified" }, "value_kind": "enum_value" }, "relation": "child", - "parent": "CRSPurposeCode120", - "member_count": 6, - "served_rows": 82, + "parent": "CRSPurposeCode998", + "member_count": 255, + "served_rows": 71, "served_rows_exact": true }, { "value": { "ref": { - "ref": "CRSPurposeCode122", - "label": "basic health" + "ref": "CRSPurposeCode99820", + "label": "non-sector allocable promotion of development awareness" }, "value_kind": "enum_value" }, "relation": "child", - "parent": "CRSPurposeCode120", - "member_count": 4, - "served_rows": 108, + "parent": "CRSPurposeCode998", + "member_count": 77, + "served_rows": 3, + "served_rows_exact": true + }, + { + "value": { + "ref": { + "ref": "CRSPurposeCode600", + "label": "action relating to debt" + }, + "value_kind": "enum_value" + }, + "relation": "root", + "member_count": 21, + "served_rows": 9, "served_rows_exact": true }, { "value": { "ref": { - "ref": "CRSPurposeCode123", - "label": "noncommunicable disease" + "ref": "CRSPurposeCode60020", + "label": "debt forgiveness" }, "value_kind": "enum_value" }, "relation": "child", - "parent": "CRSPurposeCode120", - "member_count": 3, + "parent": "CRSPurposeCode600", + "member_count": 75, "served_rows": 4, "served_rows_exact": true }, + { + "value": { + "ref": { + "ref": "CRSPurposeCode60040", + "label": "rescheduling and refinancing" + }, + "value_kind": "enum_value" + }, + "relation": "child", + "parent": "CRSPurposeCode600", + "member_count": 54, + "served_rows": 5, + "served_rows_exact": true + }, { "value": { "ref": { @@ -673,7 +745,7 @@ }, "value_kind": "enum_value" }, - "relation": "parent", + "relation": "root", "member_count": 13, "served_rows": 1214, "served_rows_exact": true @@ -681,360 +753,760 @@ { "value": { "ref": { - "ref": "CRSPurposeCode111", - "label": "unspecified-level education" + "ref": "CRSPurposeCode140", + "label": "water supply and sanitation" }, "value_kind": "enum_value" }, "relation": "child", - "parent": "CRSPurposeCode110", - "member_count": 6, - "served_rows": 78, + "parent": "CRSPurposeCode100", + "member_count": 10, + "served_rows": 275, "served_rows_exact": true }, { "value": { "ref": { - "ref": "CRSPurposeCode112", - "label": "basic education" + "ref": "CRSPurposeCode110", + "label": "education" }, "value_kind": "enum_value" }, "relation": "child", - "parent": "CRSPurposeCode110", + "parent": "CRSPurposeCode100", + "member_count": 9, + "served_rows": 318, + "served_rows_exact": true + }, + { + "value": { + "ref": { + "ref": "CRSPurposeCode160", + "label": "other social infrastructure and services" + }, + "value_kind": "enum_value" + }, + "relation": "child", + "parent": "CRSPurposeCode100", + "member_count": 7, + "served_rows": 102, + "served_rows_exact": true + }, + { + "value": { + "ref": { + "ref": "CRSPurposeCode120", + "label": "health" + }, + "value_kind": "enum_value" + }, + "relation": "child", + "parent": "CRSPurposeCode100", "member_count": 6, - "served_rows": 77, + "served_rows": 194, "served_rows_exact": true }, { "value": { "ref": { - "ref": "CRSPurposeCode113", - "label": "upper secondary education" + "ref": "CRSPurposeCode130", + "label": "population policy, programme, and reproductive health" }, "value_kind": "enum_value" }, "relation": "child", - "parent": "CRSPurposeCode110", + "parent": "CRSPurposeCode100", "member_count": 5, - "served_rows": 69, + "served_rows": 81, "served_rows_exact": true }, { "value": { "ref": { - "ref": "CRSPurposeCode114", - "label": "post-secondary education" + "ref": "CRSPurposeCode150", + "label": "government and civil society" }, "value_kind": "enum_value" }, "relation": "child", - "parent": "CRSPurposeCode110", + "parent": "CRSPurposeCode100", "member_count": 4, - "served_rows": 94, + "served_rows": 244, "served_rows_exact": true - } - ], - "truncated": false, - "source": "observed" - }, - { - "key": { - "axis": "how", - "property": { - "ref": "crsTypeOfFinance", - "label": "CRS type of finance" }, - "label": "instrument" - }, - "options": [ { "value": { "ref": { - "ref": "CRSTypeOfFinance100", - "label": "grant" + "ref": "CRSPurposeCode200", + "label": "economic infrastructure and services" }, "value_kind": "enum_value" }, "relation": "root", - "member_count": 0, - "served_rows": 501, + "member_count": 13, + "served_rows": 286, "served_rows_exact": true }, { "value": { "ref": { - "ref": "CRSTypeOfFinance110", - "label": "standard grant" + "ref": "CRSPurposeCode240", + "label": "banking and financial services" }, "value_kind": "enum_value" }, "relation": "child", - "parent": "CRSTypeOfFinance100", - "member_count": 12672, - "served_rows": 501, + "parent": "CRSPurposeCode200", + "member_count": 16, + "served_rows": 30, "served_rows_exact": true }, { "value": { "ref": { - "ref": "CRSTypeOfFinance420", - "label": "debt instrument" + "ref": "CRSPurposeCode220", + "label": "communication system and technology" }, "value_kind": "enum_value" }, - "relation": "root", - "member_count": 0, - "served_rows": 11, + "relation": "child", + "parent": "CRSPurposeCode200", + "member_count": 13, + "served_rows": 23, "served_rows_exact": true }, { "value": { "ref": { - "ref": "CRSTypeOfFinance421", - "label": "standard loan" + "ref": "CRSPurposeCode250", + "label": "business environment and governance" }, "value_kind": "enum_value" }, "relation": "child", - "parent": "CRSTypeOfFinance420", - "member_count": 4620, - "served_rows": 11, + "parent": "CRSPurposeCode200", + "member_count": 13, + "served_rows": 30, "served_rows_exact": true - } - ], - "truncated": false, - "source": "observed" - }, - { - "key": { - "axis": "how", - "property": { - "ref": "crsTypeOfFlow", - "label": "CRS type of flow" }, - "label": "flow" - }, - "options": [ { "value": { "ref": { - "ref": "CRSTypeOfFlow10", - "label": "official development assistance" + "ref": "CRSPurposeCode210", + "label": "transport and storage" }, "value_kind": "enum_value" }, - "relation": "root", - "member_count": 14098, - "served_rows": 512, + "relation": "child", + "parent": "CRSPurposeCode200", + "member_count": 7, + "served_rows": 97, "served_rows_exact": true - } - ], - "truncated": false, - "source": "observed" - }, - { - "key": { - "axis": "how", - "property": { - "ref": "crsCooperationModality", - "label": "CRS cooperation modality" }, - "label": "modality" - }, - "options": [ { "value": { "ref": { - "ref": "CRSCooperationModalityB", - "label": "core contribution and pooled programme and fund" + "ref": "CRSPurposeCode230", + "label": "energy" }, "value_kind": "enum_value" }, - "relation": "root", - "member_count": 0, - "served_rows": 104, + "relation": "child", + "parent": "CRSPurposeCode200", + "member_count": 7, + "served_rows": 106, "served_rows_exact": true }, { "value": { "ref": { - "ref": "CRSCooperationModalityB03", - "label": "contribution to specific-purpose programme and fund managed by an international organisation" + "ref": "CRSPurposeCode300", + "label": "productive sector" }, "value_kind": "enum_value" }, - "relation": "child", - "parent": "CRSCooperationModalityB", - "member_count": 1606, - "served_rows": 21, + "relation": "root", + "member_count": 13, + "served_rows": 493, "served_rows_exact": true }, { "value": { "ref": { - "ref": "CRSCooperationModalityB01", - "label": "core support to non-governmental organisations, other private bodies, public-private partnerships, and research institutes" + "ref": "CRSPurposeCode310", + "label": "agriculture, forestry and fishing" }, "value_kind": "enum_value" }, "relation": "child", - "parent": "CRSCooperationModalityB", - "member_count": 1331, - "served_rows": 83, + "parent": "CRSPurposeCode300", + "member_count": 12, + "served_rows": 405, "served_rows_exact": true }, { "value": { "ref": { - "ref": "CRSCooperationModalityC", - "label": "project-type intervention (group)" + "ref": "CRSPurposeCode320", + "label": "industry, mining and construction" }, "value_kind": "enum_value" }, - "relation": "root", - "member_count": 0, - "served_rows": 136, + "relation": "child", + "parent": "CRSPurposeCode300", + "member_count": 9, + "served_rows": 66, "served_rows_exact": true }, { "value": { "ref": { - "ref": "CRSCooperationModalityC01", - "label": "project-type intervention" + "ref": "CRSPurposeCode331", + "label": "trade policies and regulations" }, "value_kind": "enum_value" }, "relation": "child", - "parent": "CRSCooperationModalityC", - "member_count": 7005, - "served_rows": 136, + "parent": "CRSPurposeCode300", + "member_count": 7, + "served_rows": 22, "served_rows_exact": true }, { "value": { "ref": { - "ref": "CRSCooperationModalityD", - "label": "expert and other technical assistance" + "ref": "CRSPurposeCode400", + "label": "multisector" }, "value_kind": "enum_value" }, "relation": "root", - "member_count": 0, - "served_rows": 111, + "member_count": 7, + "served_rows": 206, "served_rows_exact": true }, { "value": { "ref": { - "ref": "CRSCooperationModalityD02", - "label": "other technical assistance" + "ref": "CRSPurposeCode430", + "label": "other multisector" }, "value_kind": "enum_value" }, "relation": "child", - "parent": "CRSCooperationModalityD", - "member_count": 1600, - "served_rows": 84, + "parent": "CRSPurposeCode400", + "member_count": 10, + "served_rows": 162, "served_rows_exact": true }, { "value": { "ref": { - "ref": "CRSCooperationModalityD01", - "label": "donor country personnel" + "ref": "CRSPurposeCode410", + "label": "general environment protection" }, "value_kind": "enum_value" }, "relation": "child", - "parent": "CRSCooperationModalityD", - "member_count": 976, - "served_rows": 27, + "parent": "CRSPurposeCode400", + "member_count": 7, + "served_rows": 44, "served_rows_exact": true }, { "value": { "ref": { - "ref": "CRSCooperationModalityE", - "label": "scholarship and student cost in donor country" + "ref": "CRSPurposeCode500", + "label": "commodity aid and general programme assistance" }, "value_kind": "enum_value" }, "relation": "root", - "member_count": 0, - "served_rows": 38, + "member_count": 5, + "served_rows": 70, "served_rows_exact": true }, { "value": { "ref": { - "ref": "CRSCooperationModalityE01", - "label": "scholarship and training in donor country" + "ref": "CRSPurposeCode510", + "label": "budget support" }, "value_kind": "enum_value" }, "relation": "child", - "parent": "CRSCooperationModalityE", - "member_count": 819, - "served_rows": 19, + "parent": "CRSPurposeCode500", + "member_count": 3, + "served_rows": 10, "served_rows_exact": true }, { "value": { "ref": { - "ref": "CRSCooperationModalityE02", - "label": "imputed student cost" + "ref": "CRSPurposeCode520", + "label": "food assistance" }, "value_kind": "enum_value" }, "relation": "child", - "parent": "CRSCooperationModalityE", - "member_count": 315, + "parent": "CRSPurposeCode500", + "member_count": 3, "served_rows": 19, "served_rows_exact": true - } - ], - "truncated": false, - "source": "observed" - } - ], - "entity_options": [], - "facet_options": [ - { - "axis": "provenance", - "options": [ + }, { "value": { "ref": { - "ref": "provenance/OECDCreditorReportingSystem", - "label": "OECD Creditor Reporting System (CRS)" + "ref": "CRSPurposeCode530", + "label": "other commodity assistance" }, - "value_kind": "source" - } - } - ], - "truncated": false, - "source": "observed" - }, - { - "axis": "unit", - "options": [ + "value_kind": "enum_value" + }, + "relation": "child", + "parent": "CRSPurposeCode500", + "member_count": 3, + "served_rows": 41, + "served_rows_exact": true + }, { "value": { "ref": { - "ref": "CurrencyUSD", - "label": "US Dollar" + "ref": "CRSPurposeCode700", + "label": "humanitarian aid" }, "value_kind": "enum_value" - } - } - ], - "truncated": false, - "source": "observed" - } - ], - "rendered_sentence": "Germany's gross ODA disbursements to Kenya for education and health, 1997 to 2024. Current US dollars · OECD Creditor Reporting System (CRS).", - "sentence_plan": [ + }, + "relation": "root", + "member_count": 5, + "served_rows": 68, + "served_rows_exact": true + }, + { + "value": { + "ref": { + "ref": "CRSPurposeCode720", + "label": "emergency response" + }, + "value_kind": "enum_value" + }, + "relation": "child", + "parent": "CRSPurposeCode700", + "member_count": 6, + "served_rows": 46, + "served_rows_exact": true + }, + { + "value": { + "ref": { + "ref": "CRSPurposeCode730", + "label": "reconstruction and rehabilitation" + }, + "value_kind": "enum_value" + }, + "relation": "child", + "parent": "CRSPurposeCode700", + "member_count": 3, + "served_rows": 14, + "served_rows_exact": true + }, + { + "value": { + "ref": { + "ref": "CRSPurposeCode740", + "label": "disaster preparedness" + }, + "value_kind": "enum_value" + }, + "relation": "child", + "parent": "CRSPurposeCode700", + "member_count": 0, + "served_rows": 8, + "served_rows_exact": true + }, + { + "value": { + "ref": { + "ref": "CRSPurposeCode930", + "label": "support for refugees and asylum seekers in donor countries" + }, + "value_kind": "enum_value" + }, + "relation": "root", + "member_count": 3, + "served_rows": 6, + "served_rows_exact": true + }, + { + "value": { + "ref": { + "ref": "CRSPurposeCode93010", + "label": "general support for refugees and asylum seekers in donor countries" + }, + "value_kind": "enum_value" + }, + "relation": "child", + "parent": "CRSPurposeCode930", + "member_count": 57, + "served_rows": 6, + "served_rows_exact": true + }, + { + "value": { + "ref": { + "ref": "CRSPurposeCode111", + "label": "unspecified-level education" + }, + "value_kind": "enum_value" + }, + "relation": "child", + "parent": "CRSPurposeCode110", + "member_count": 6, + "served_rows": 78, + "served_rows_exact": true + }, + { + "value": { + "ref": { + "ref": "CRSPurposeCode112", + "label": "basic education" + }, + "value_kind": "enum_value" + }, + "relation": "child", + "parent": "CRSPurposeCode110", + "member_count": 6, + "served_rows": 77, + "served_rows_exact": true + }, + { + "value": { + "ref": { + "ref": "CRSPurposeCode113", + "label": "upper secondary education" + }, + "value_kind": "enum_value" + }, + "relation": "child", + "parent": "CRSPurposeCode110", + "member_count": 5, + "served_rows": 69, + "served_rows_exact": true + }, + { + "value": { + "ref": { + "ref": "CRSPurposeCode114", + "label": "post-secondary education" + }, + "value_kind": "enum_value" + }, + "relation": "child", + "parent": "CRSPurposeCode110", + "member_count": 4, + "served_rows": 94, + "served_rows_exact": true + } + ], + "truncated": false, + "source": "observed" + }, + { + "key": { + "axis": "how", + "property": { + "ref": "crsTypeOfFinance", + "label": "CRS type of finance" + }, + "label": "instrument" + }, + "options": [ + { + "value": { + "ref": { + "ref": "CRSTypeOfFinance100", + "label": "grant" + }, + "value_kind": "enum_value" + }, + "relation": "root", + "member_count": 0, + "served_rows": 582, + "served_rows_exact": true + }, + { + "value": { + "ref": { + "ref": "CRSTypeOfFinance110", + "label": "standard grant" + }, + "value_kind": "enum_value" + }, + "relation": "child", + "parent": "CRSTypeOfFinance100", + "member_count": 12745, + "served_rows": 582, + "served_rows_exact": true + }, + { + "value": { + "ref": { + "ref": "CRSTypeOfFinance420", + "label": "debt instrument" + }, + "value_kind": "enum_value" + }, + "relation": "root", + "member_count": 0, + "served_rows": 11, + "served_rows_exact": true + }, + { + "value": { + "ref": { + "ref": "CRSTypeOfFinance421", + "label": "standard loan" + }, + "value_kind": "enum_value" + }, + "relation": "child", + "parent": "CRSTypeOfFinance420", + "member_count": 4620, + "served_rows": 11, + "served_rows_exact": true + } + ], + "truncated": false, + "source": "observed" + }, + { + "key": { + "axis": "how", + "property": { + "ref": "crsTypeOfFlow", + "label": "CRS type of flow" + }, + "label": "flow" + }, + "options": [ + { + "value": { + "ref": { + "ref": "CRSTypeOfFlow10", + "label": "official development assistance" + }, + "value_kind": "enum_value" + }, + "relation": "root", + "member_count": 14146, + "served_rows": 593, + "served_rows_exact": true + } + ], + "truncated": false, + "source": "observed" + }, + { + "key": { + "axis": "how", + "property": { + "ref": "crsCooperationModality", + "label": "CRS cooperation modality" + }, + "label": "modality" + }, + "options": [ + { + "value": { + "ref": { + "ref": "CRSCooperationModalityB", + "label": "core contribution and pooled programme and fund" + }, + "value_kind": "enum_value" + }, + "relation": "root", + "member_count": 0, + "served_rows": 118, + "served_rows_exact": true + }, + { + "value": { + "ref": { + "ref": "CRSCooperationModalityB03", + "label": "contribution to specific-purpose programme and fund managed by an international organisation" + }, + "value_kind": "enum_value" + }, + "relation": "child", + "parent": "CRSCooperationModalityB", + "member_count": 1614, + "served_rows": 25, + "served_rows_exact": true + }, + { + "value": { + "ref": { + "ref": "CRSCooperationModalityB01", + "label": "core support to non-governmental organisations, other private bodies, public-private partnerships, and research institutes" + }, + "value_kind": "enum_value" + }, + "relation": "child", + "parent": "CRSCooperationModalityB", + "member_count": 1337, + "served_rows": 93, + "served_rows_exact": true + }, + { + "value": { + "ref": { + "ref": "CRSCooperationModalityC", + "label": "project-type intervention (group)" + }, + "value_kind": "enum_value" + }, + "relation": "root", + "member_count": 0, + "served_rows": 173, + "served_rows_exact": true + }, + { + "value": { + "ref": { + "ref": "CRSCooperationModalityC01", + "label": "project-type intervention" + }, + "value_kind": "enum_value" + }, + "relation": "child", + "parent": "CRSCooperationModalityC", + "member_count": 7041, + "served_rows": 173, + "served_rows_exact": true + }, + { + "value": { + "ref": { + "ref": "CRSCooperationModalityD", + "label": "expert and other technical assistance" + }, + "value_kind": "enum_value" + }, + "relation": "root", + "member_count": 0, + "served_rows": 116, + "served_rows_exact": true + }, + { + "value": { + "ref": { + "ref": "CRSCooperationModalityD02", + "label": "other technical assistance" + }, + "value_kind": "enum_value" + }, + "relation": "child", + "parent": "CRSCooperationModalityD", + "member_count": 1600, + "served_rows": 87, + "served_rows_exact": true + }, + { + "value": { + "ref": { + "ref": "CRSCooperationModalityD01", + "label": "donor country personnel" + }, + "value_kind": "enum_value" + }, + "relation": "child", + "parent": "CRSCooperationModalityD", + "member_count": 980, + "served_rows": 29, + "served_rows_exact": true + }, + { + "value": { + "ref": { + "ref": "CRSCooperationModalityE", + "label": "scholarship and student cost in donor country" + }, + "value_kind": "enum_value" + }, + "relation": "root", + "member_count": 0, + "served_rows": 38, + "served_rows_exact": true + }, + { + "value": { + "ref": { + "ref": "CRSCooperationModalityE01", + "label": "scholarship and training in donor country" + }, + "value_kind": "enum_value" + }, + "relation": "child", + "parent": "CRSCooperationModalityE", + "member_count": 819, + "served_rows": 19, + "served_rows_exact": true + }, + { + "value": { + "ref": { + "ref": "CRSCooperationModalityE02", + "label": "imputed student cost" + }, + "value_kind": "enum_value" + }, + "relation": "child", + "parent": "CRSCooperationModalityE", + "member_count": 315, + "served_rows": 19, + "served_rows_exact": true + } + ], + "truncated": false, + "source": "observed" + } + ], + "entity_options": [], + "facet_options": [ + { + "axis": "provenance", + "options": [ + { + "value": { + "ref": { + "ref": "provenance/OECDCreditorReportingSystem", + "label": "OECD Creditor Reporting System (CRS)" + }, + "value_kind": "source" + } + } + ], + "truncated": false, + "source": "observed" + }, + { + "axis": "unit", + "options": [ + { + "value": { + "ref": { + "ref": "CurrencyUSD", + "label": "US Dollar" + }, + "value_kind": "enum_value" + } + } + ], + "truncated": false, + "source": "observed" + } + ], + "rendered_sentence": "Germany's gross ODA disbursements to Kenya for education, health, and population policy, programme, and reproductive health, 1997 to 2024. Current US dollars · OECD Creditor Reporting System (CRS).", + "sentence_plan": [ { "kind": "slot", "text": "Germany", @@ -1106,7 +1578,7 @@ }, { "kind": "slot", - "text": "education and health", + "text": "education, health, and population policy, programme, and reproductive health", "axis": "how", "segment": "heading", "property_dcid": "crsPurpose", @@ -1280,6 +1752,10 @@ { "ref": "CRSPurposeCode120", "label": "health" + }, + { + "ref": "CRSPurposeCode130", + "label": "population policy, programme, and reproductive health" } ], "provenance": "text_recognized" @@ -1317,344 +1793,131 @@ }, { "key": { - "axis": "how", - "property": { - "ref": "financialFlowType", - "label": "financial flow type" - }, - "label": "financial flow type" - }, - "binding_kind": "value", - "refs": [ - { - "ref": "Disbursement", - "label": "disbursement" - } - ], - "provenance": "text_recognized" - }, - { - "key": { - "axis": "how", - "property": { - "ref": "nettingBasis", - "label": "netting basis" - }, - "label": "netting basis" - }, - "binding_kind": "value", - "refs": [ - { - "ref": "Gross", - "label": "gross" - } - ], - "provenance": "measure_elected" - }, - { - "key": { - "axis": "how", - "property": { - "ref": "crsCooperationModality", - "label": "CRS cooperation modality" - }, - "label": "modality" - }, - "binding_kind": "unbound", - "refs": [], - "provenance": "binder" - }, - { - "key": { - "axis": "where", - "label": "place" - }, - "binding_kind": "value", - "refs": [ - { - "ref": "country/KEN", - "label": "Kenya" - } - ], - "provenance": "binder" - }, - { - "key": { - "axis": "when", - "label": "time window" - }, - "binding_kind": "unbound", - "refs": [], - "provenance": "binder" - }, - { - "key": { - "axis": "source", - "label": "data source" - }, - "binding_kind": "unbound", - "refs": [], - "provenance": "binder" - } - ], - "query_qualifiers": [ - { - "text": "health", - "named": [ - { - "ref": "CRSPurposeCode120", - "label": "health" - } - ], - "slot": "crsPurpose", - "disposition": "bound", - "selected": [] - }, - { - "text": "ODA", - "named": [ - { - "ref": "CRSTypeOfFlow10", - "label": "official development assistance" - } - ], - "slot": "crsTypeOfFlow", - "disposition": "bound", - "selected": [] - }, - { - "text": "education", - "named": [ - { - "ref": "CRSPurposeCode110", - "label": "education" - } - ], - "slot": "crsPurpose", - "disposition": "bound", - "selected": [] - } - ], - "capability_version": "cap_765c9d2a0c7529b9", - "default_reading": { - "applied": true, - "removed_stat_vars": [] - } - }, - "alternative_measures": [ - { - "definition": { - "schema_version": 1, - "spec_id": "spec_b438dc000255d174bcc13eb675e603f7", - "identity": { - "identity_version": "spec1", - "shape": { - "kind": "statvar_schema", - "population_type": "FinancialFlow", - "measured_property": "amount", - "stat_type": "measuredValue", - "measurement_qualifier": "Nominal" - }, - "slots": [ - { - "property": "crsCooperationModality", - "binding": { - "state": "unbound" - } - }, - { - "property": "crsPurpose", - "binding": { - "state": "set", - "refs": [ - "CRSPurposeCode110", - "CRSPurposeCode120" - ] - } - }, - { - "property": "crsTypeOfFinance", - "binding": { - "state": "unbound" - } - }, - { - "property": "crsTypeOfFlow", - "binding": { - "state": "value", - "ref": "CRSTypeOfFlow10" - } - }, - { - "property": "financialFlowType", - "binding": { - "state": "value", - "ref": "Disbursement" - } - }, - { - "property": "nettingBasis", - "binding": { - "state": "value", - "ref": "Net" - } - } - ], - "entities": { - "destination": [ - "country/KEN" - ], - "origin": [ - "country/DEU" - ] - }, - "requested_window": { - "kind": "all" - } - } - }, - "label": "net disbursements", - "axis": "what", - "measure_axis_values": [ - { - "axis": "populationType", - "value": { - "ref": "FinancialFlow", - "label": "financial flow" - } - }, - { - "axis": "measuredProperty", - "value": { - "ref": "amount", - "label": "amount" - } - }, - { - "axis": "measurementQualifier", - "value": { - "ref": "Nominal", - "label": "nominal" - } - }, - { - "axis": "financialFlowType", - "value": { - "ref": "Disbursement", - "label": "disbursement" - } - }, - { - "axis": "nettingBasis", - "value": { - "ref": "Net", - "label": "net" - } - } - ], - "served_rows": 512, - "served_rows_exact": true - }, - { - "definition": { - "schema_version": 1, - "spec_id": "spec_e348565295de394da8ddaa23ec5fa475", - "identity": { - "identity_version": "spec1", - "shape": { - "kind": "statvar_schema", - "population_type": "FinancialObligation", - "measured_property": "amount", - "stat_type": "measuredValue", - "measurement_qualifier": "Nominal" - }, - "slots": [ - { - "property": "crsCooperationModality", - "binding": { - "state": "unbound" - } - }, - { - "property": "crsPurpose", - "binding": { - "state": "set", - "refs": [ - "CRSPurposeCode110", - "CRSPurposeCode120" - ] - } - }, - { - "property": "crsTypeOfFinance", - "binding": { - "state": "unbound" - } - }, - { - "property": "crsTypeOfFlow", - "binding": { - "state": "value", - "ref": "CRSTypeOfFlow10" - } - }, - { - "property": "financialObligationType", - "binding": { - "state": "value", - "ref": "Commitment" - } - } - ], - "entities": { - "destination": [ - "country/KEN" - ], - "origin": [ - "country/DEU" - ] + "axis": "how", + "property": { + "ref": "financialFlowType", + "label": "financial flow type" }, - "requested_window": { - "kind": "all" + "label": "financial flow type" + }, + "binding_kind": "value", + "refs": [ + { + "ref": "Disbursement", + "label": "disbursement" } - } + ], + "provenance": "text_recognized" }, - "label": "commitments", - "axis": "what", - "measure_axis_values": [ - { - "axis": "populationType", - "value": { - "ref": "FinancialObligation", - "label": "financial obligation" - } + { + "key": { + "axis": "how", + "property": { + "ref": "nettingBasis", + "label": "netting basis" + }, + "label": "netting basis" }, - { - "axis": "measuredProperty", - "value": { - "ref": "amount", - "label": "amount" + "binding_kind": "value", + "refs": [ + { + "ref": "Gross", + "label": "gross" } + ], + "provenance": "measure_elected" + }, + { + "key": { + "axis": "how", + "property": { + "ref": "crsCooperationModality", + "label": "CRS cooperation modality" + }, + "label": "modality" }, - { - "axis": "measurementQualifier", - "value": { - "ref": "Nominal", - "label": "nominal" + "binding_kind": "unbound", + "refs": [], + "provenance": "binder" + }, + { + "key": { + "axis": "where", + "label": "place" + }, + "binding_kind": "value", + "refs": [ + { + "ref": "country/KEN", + "label": "Kenya" } + ], + "provenance": "binder" + }, + { + "key": { + "axis": "when", + "label": "time window" }, - { - "axis": "financialObligationType", - "value": { - "ref": "Commitment", - "label": "commitment" + "binding_kind": "unbound", + "refs": [], + "provenance": "binder" + }, + { + "key": { + "axis": "source", + "label": "data source" + }, + "binding_kind": "unbound", + "refs": [], + "provenance": "binder" + } + ], + "query_qualifiers": [ + { + "text": "health", + "named": [ + { + "ref": "CRSPurposeCode120", + "label": "health" } - } - ], - "served_rows": 519, - "served_rows_exact": true + ], + "slot": "crsPurpose", + "disposition": "bound", + "selected": [] + }, + { + "text": "ODA", + "named": [ + { + "ref": "CRSTypeOfFlow10", + "label": "official development assistance" + } + ], + "slot": "crsTypeOfFlow", + "disposition": "bound", + "selected": [] + }, + { + "text": "education", + "named": [ + { + "ref": "CRSPurposeCode110", + "label": "education" + } + ], + "slot": "crsPurpose", + "disposition": "bound", + "selected": [] + } + ], + "capability_version": "cap_4913302d7a6b6435", + "default_reading": { + "applied": true, + "removed_stat_vars": [] } - ], + }, + "alternative_measures": [], "measure_label": "gross disbursements", "measure_label_axes": [ "populationType", @@ -1700,6 +1963,8 @@ } } ], + "concept_label": "education, health, and population policy, programme, and reproductive health", + "published_tables": "OECD Creditor Reporting System (CRS)", "open_axis_facts": [ { "property": "crsTypeOfFinance", @@ -1712,7 +1977,7 @@ "ref": "CRSTypeOfFinance110", "label": "standard grant" }, - "count": 105 + "count": 120 }, { "value": { @@ -1727,42 +1992,42 @@ "property": "crsCooperationModality", "varies": true, "distinct_count": 7, - "undeclared_count": 19, + "undeclared_count": 22, "values": [ { "value": { "ref": "CRSCooperationModalityC01", "label": "project-type intervention" }, - "count": 27 + "count": 30 }, { "value": { "ref": "CRSCooperationModalityB03", "label": "contribution to specific-purpose programme and fund managed by an international organisation" }, - "count": 21 + "count": 24 }, { "value": { - "ref": "CRSCooperationModalityD02", - "label": "other technical assistance" + "ref": "CRSCooperationModalityB01", + "label": "core support to non-governmental organisations, other private bodies, public-private partnerships, and research institutes" }, - "count": 16 + "count": 18 }, { "value": { - "ref": "CRSCooperationModalityB01", - "label": "core support to non-governmental organisations, other private bodies, public-private partnerships, and research institutes" + "ref": "CRSCooperationModalityD02", + "label": "other technical assistance" }, - "count": 15 + "count": 18 }, { "value": { "ref": "CRSCooperationModalityD01", "label": "donor country personnel" }, - "count": 8 + "count": 9 }, { "value": { @@ -3722,33 +3987,404 @@ "start_year": 1980, "end_year": 2025 }, - "constant_years": { - "start_year": 1960, - "end_year": 2025 + "constant_years": { + "start_year": 1960, + "end_year": 2025 + }, + "base_year_min": 1980, + "base_year_max": 2025 + }, + { + "code": "ZMW", + "noun": "Zambian kwachas", + "current_years": { + "start_year": 1980, + "end_year": 2025 + }, + "constant_years": { + "start_year": 1960, + "end_year": 2025 + }, + "base_year_min": 1980, + "base_year_max": 2025 + } + ], + "default_base_year": 2024, + "role_currencies": { + "destination": "KES", + "origin": "EUR" + } + }, + "scope_choices": { + "id": "spec_7a02b6facd2dc17b5d0d7c35c11bf5d2", + "base": { + "schema_version": 1, + "spec_id": "spec_7a02b6facd2dc17b5d0d7c35c11bf5d2", + "identity": { + "identity_version": "spec1", + "shape": { + "kind": "statvar_schema", + "population_type": "FinancialFlow", + "measured_property": "amount", + "stat_type": "measuredValue", + "measurement_qualifier": "Nominal" + }, + "slots": [ + { + "property": "crsCooperationModality", + "binding": { + "state": "unbound" + } + }, + { + "property": "crsPurpose", + "binding": { + "state": "set", + "refs": [ + "CRSPurposeCode110", + "CRSPurposeCode120", + "CRSPurposeCode130" + ] + } + }, + { + "property": "crsTypeOfFinance", + "binding": { + "state": "unbound" + } + }, + { + "property": "crsTypeOfFlow", + "binding": { + "state": "value", + "ref": "CRSTypeOfFlow10" + } + }, + { + "property": "financialFlowType", + "binding": { + "state": "value", + "ref": "Disbursement" + } + }, + { + "property": "nettingBasis", + "binding": { + "state": "value", + "ref": "Gross" + } + } + ], + "entities": { + "destination": [ + "country/KEN" + ], + "origin": [ + "country/DEU" + ] + }, + "requested_window": { + "kind": "all" + } + } + }, + "rule_version": "scope1:3eef00a928eedd463ee48d02b79730da", + "entries": [], + "dropped_entries": [ + { + "entry": { + "axis": "sector", + "option_id": "sector:110", + "provenance": "explicit", + "origin": { + "kind": "text", + "text": "education", + "start": 0, + "end": 9 + } + }, + "code": "stated_choice_not_applied", + "cause": "option_unknown" + } + ], + "choices": [ + { + "id": "spec_7a02b6facd2dc17b5d0d7c35c11bf5d2:sector", + "axis": "sector", + "rule": "sector_code", + "provenance": "default", + "active": "sector:110+120+130", + "options": [ + { + "option_id": "sector:110+120+130", + "label": "education (CRS 110) + health (CRS 120) + population policy, programme, and reproductive health (CRS 130)", + "binding": { + "kind": "slot", + "slot": "crsPurpose", + "state": "set", + "refs": [ + "CRSPurposeCode110", + "CRSPurposeCode120", + "CRSPurposeCode130" + ] + }, + "availability": { + "status": "available", + "detail": {} + } + } + ] + }, + { + "id": "spec_7a02b6facd2dc17b5d0d7c35c11bf5d2:measure_basis", + "axis": "measure_basis", + "rule": "measure_basis_convention", + "provenance": "default", + "active": "measure_basis:gross", + "options": [ + { + "option_id": "measure_basis:gross", + "label": "gross disbursements, current USD", + "binding": { + "kind": "shape", + "measured_property": "amount", + "netting_basis": "Gross" + }, + "availability": { + "status": "available", + "detail": {} + } + }, + { + "option_id": "measure_basis:net", + "label": "net disbursements, current USD", + "binding": { + "kind": "shape", + "measured_property": "amount", + "netting_basis": "Net" + }, + "availability": { + "status": "available", + "detail": {} + } + }, + { + "option_id": "measure_basis:grant_equivalent", + "label": "grant equivalents (OECD headline), current USD", + "binding": { + "kind": "shape", + "measured_property": "grantEquivalent", + "netting_basis": null + }, + "availability": { + "status": "available", + "detail": {} + } + }, + { + "option_id": "measure_basis:commitments", + "label": "commitments, current USD", + "binding": { + "kind": "shape", + "measured_property": "amount", + "netting_basis": null + }, + "availability": { + "status": "available", + "detail": {} + } + } + ] + }, + { + "id": "spec_7a02b6facd2dc17b5d0d7c35c11bf5d2:provider", + "axis": "provider", + "rule": "bilateral_flows", + "provenance": "default", + "active": "provider:bilateral", + "options": [ + { + "option_id": "provider:bilateral", + "label": "bilateral flows only", + "binding": { + "kind": "provider", + "scope": "bilateral" + }, + "availability": { + "status": "available", + "detail": {} + } + }, + { + "option_id": "provider:inclusive", + "label": "bilateral plus imputed multilateral, 2011 to 2024", + "binding": { + "kind": "provider", + "scope": "inclusive", + "window": [ + 2011, + 2024 + ], + "provenance": "provenance/ONEBilateralAndImputedMultilateral" + }, + "availability": { + "status": "partial", + "years": [ + [ + 2011, + 2024 + ] + ], + "code": "imputed_coverage", + "detail": {} + } + } + ] + } + ], + "compiled": { + "spec_id": "spec_7a02b6facd2dc17b5d0d7c35c11bf5d2", + "identity": { + "identity_version": "spec1", + "shape": { + "kind": "statvar_schema", + "population_type": "FinancialFlow", + "measured_property": "amount", + "stat_type": "measuredValue", + "measurement_qualifier": "Nominal" + }, + "slots": [ + { + "property": "crsCooperationModality", + "binding": { + "state": "unbound" + } + }, + { + "property": "crsPurpose", + "binding": { + "state": "set", + "refs": [ + "CRSPurposeCode110", + "CRSPurposeCode120", + "CRSPurposeCode130" + ] + } + }, + { + "property": "crsTypeOfFinance", + "binding": { + "state": "unbound" + } + }, + { + "property": "crsTypeOfFlow", + "binding": { + "state": "value", + "ref": "CRSTypeOfFlow10" + } + }, + { + "property": "financialFlowType", + "binding": { + "state": "value", + "ref": "Disbursement" + } + }, + { + "property": "nettingBasis", + "binding": { + "state": "value", + "ref": "Gross" + } + } + ], + "entities": { + "destination": [ + "country/KEN" + ], + "origin": [ + "country/DEU" + ] }, - "base_year_min": 1980, - "base_year_max": 2025 + "requested_window": { + "kind": "all" + } }, - { - "code": "ZMW", - "noun": "Zambian kwachas", - "current_years": { - "start_year": 1980, - "end_year": 2025 - }, - "constant_years": { - "start_year": 1960, - "end_year": 2025 - }, - "base_year_min": 1980, - "base_year_max": 2025 - } - ], - "default_base_year": 2024, - "role_currencies": { - "destination": "KES", - "origin": "EUR" - } + "components": [ + { + "role": "whole", + "identity": { + "identity_version": "spec1", + "shape": { + "kind": "statvar_schema", + "population_type": "FinancialFlow", + "measured_property": "amount", + "stat_type": "measuredValue", + "measurement_qualifier": "Nominal" + }, + "slots": [ + { + "property": "crsCooperationModality", + "binding": { + "state": "unbound" + } + }, + { + "property": "crsPurpose", + "binding": { + "state": "set", + "refs": [ + "CRSPurposeCode110", + "CRSPurposeCode120", + "CRSPurposeCode130" + ] + } + }, + { + "property": "crsTypeOfFinance", + "binding": { + "state": "unbound" + } + }, + { + "property": "crsTypeOfFlow", + "binding": { + "state": "value", + "ref": "CRSTypeOfFlow10" + } + }, + { + "property": "financialFlowType", + "binding": { + "state": "value", + "ref": "Disbursement" + } + }, + { + "property": "nettingBasis", + "binding": { + "state": "value", + "ref": "Gross" + } + } + ], + "entities": { + "destination": [ + "country/KEN" + ], + "origin": [ + "country/DEU" + ] + }, + "requested_window": { + "kind": "all" + } + } + } + ] + }, + "ledger": [] } } } @@ -3763,30 +4399,30 @@ } ], "timing_ms": { - "total": 4561, + "total": 5452, "by_step": { - "recall": 1310, + "recall": 2999, "phase_resolve_places": 0, "phase_check_entities": 0, - "shape_arcs": 117, - "shape_probe_coverage": 28, - "shape_probe": 126, - "shape_groups": 83, + "shape_arcs": 1, + "shape_probe_coverage": 46, + "shape_probe": 144, + "shape_groups": 96, "shape_labels": 12, "shape_admission": 1, "phase_derive_shapes": 0, - "shape": 753, + "shape": 450, "phase_prune_and_rank": 0, - "bind": 309, - "phase_bind": 209, - "phase_settle": 82, + "bind": 646, + "phase_bind": 157, + "phase_settle": 101, "phase_place_bindings": 25, "phase_facet_requests": 0, - "materialise": 1061, - "phase_materialise": 233, - "answer": 29, - "options": 385, - "phase_outcome": 165 + "materialise": 602, + "phase_materialise": 196, + "answer": 45, + "options": 138, + "phase_outcome": 93 } }, "restatement": { @@ -3823,10 +4459,10 @@ "assumptions": [], "status": "definite", "spec": { - "spec_id": "spec_25f482395c5d012ec278118f38dff29c", + "spec_id": "spec_7a02b6facd2dc17b5d0d7c35c11bf5d2", "definition": { "schema_version": 1, - "spec_id": "spec_25f482395c5d012ec278118f38dff29c", + "spec_id": "spec_7a02b6facd2dc17b5d0d7c35c11bf5d2", "identity": { "identity_version": "spec1", "shape": { @@ -3849,7 +4485,8 @@ "state": "set", "refs": [ "CRSPurposeCode110", - "CRSPurposeCode120" + "CRSPurposeCode120", + "CRSPurposeCode130" ] } }, @@ -3897,7 +4534,7 @@ "resolved": { "shape": { "shape_id": "financialflow_amount_measuredvalue_nominal", - "label": "gross disbursements (official development assistance)", + "label": "gross disbursements (education, health and population policy, programme, and reproductive health, official development assistance)", "population_type": { "ref": "FinancialFlow", "label": "financial flow" @@ -3924,7 +4561,221 @@ }, "label": "sector" }, - { + { + "axis": "how", + "property": { + "ref": "crsTypeOfFinance", + "label": "CRS type of finance" + }, + "label": "instrument" + }, + { + "axis": "how", + "property": { + "ref": "crsTypeOfFlow", + "label": "CRS type of flow" + }, + "label": "flow" + }, + { + "axis": "how", + "property": { + "ref": "financialFlowType", + "label": "financial flow type" + }, + "label": "financial flow type" + }, + { + "axis": "how", + "property": { + "ref": "nettingBasis", + "label": "netting basis" + }, + "label": "netting basis" + }, + { + "axis": "how", + "property": { + "ref": "crsCooperationModality", + "label": "CRS cooperation modality" + }, + "label": "modality" + }, + { + "axis": "where", + "label": "place" + }, + { + "axis": "when", + "label": "time window" + }, + { + "axis": "source", + "label": "data source" + } + ], + "member_count": 634, + "member_digest": "5c91c0a8d90f4619a1ff7122cacdc8b0bc48b22c70516d7673aec42caf6da0d4", + "refine_supported": true, + "data_commons": [ + { + "id": "dfo", + "label": "Development Finance Observatory" + } + ] + }, + "slots": [ + { + "key": { + "axis": "how", + "property": { + "ref": "crsPurpose", + "label": "CRS purpose" + }, + "label": "sector" + }, + "binding": { + "kind": "set", + "values": [ + { + "ref": { + "ref": "CRSPurposeCode110", + "label": "education" + }, + "value_kind": "enum_value" + }, + { + "ref": { + "ref": "CRSPurposeCode120", + "label": "health" + }, + "value_kind": "enum_value" + }, + { + "ref": { + "ref": "CRSPurposeCode130", + "label": "population policy, programme, and reproductive health" + }, + "value_kind": "enum_value" + } + ] + }, + "expansion": { + "added": [ + { + "ref": "CRSPurposeCode121", + "label": "general health" + }, + { + "ref": "CRSPurposeCode122", + "label": "basic health" + }, + { + "ref": "CRSPurposeCode123", + "label": "noncommunicable disease" + }, + { + "ref": "CRSPurposeCode12110", + "label": "health policy and administrative management" + }, + { + "ref": "CRSPurposeCode12181", + "label": "medical education and training" + }, + { + "ref": "CRSPurposeCode12182", + "label": "medical research" + }, + { + "ref": "CRSPurposeCode12191", + "label": "medical service" + }, + { + "ref": "CRSPurposeCode12220", + "label": "basic health care" + }, + { + "ref": "CRSPurposeCode12230", + "label": "basic health infrastructure" + }, + { + "ref": "CRSPurposeCode12240", + "label": "basic nutrition" + }, + { + "ref": "CRSPurposeCode12250", + "label": "infectious disease control" + }, + { + "ref": "CRSPurposeCode12261", + "label": "health education" + }, + { + "ref": "CRSPurposeCode12262", + "label": "malaria control" + }, + { + "ref": "CRSPurposeCode12263", + "label": "tuberculosis control" + }, + { + "ref": "CRSPurposeCode12264", + "label": "COVID-19 control" + }, + { + "ref": "CRSPurposeCode12281", + "label": "health personnel development" + }, + { + "ref": "CRSPurposeCode12310", + "label": "general noncommunicable disease control" + }, + { + "ref": "CRSPurposeCode12320", + "label": "tobacco use control" + }, + { + "ref": "CRSPurposeCode12330", + "label": "control of harmful use of alcohol and drugs" + }, + { + "ref": "CRSPurposeCode12340", + "label": "mental health and well-being promotion" + }, + { + "ref": "CRSPurposeCode12350", + "label": "other noncommunicable disease prevention and treatment" + }, + { + "ref": "CRSPurposeCode12382", + "label": "research for noncommunicable disease prevention and control" + }, + { + "ref": "CRSPurposeCode13010", + "label": "population policy and administrative management" + }, + { + "ref": "CRSPurposeCode13020", + "label": "reproductive health care" + }, + { + "ref": "CRSPurposeCode13030", + "label": "family planning" + }, + { + "ref": "CRSPurposeCode13040", + "label": "sexually transmitted disease control" + }, + { + "ref": "CRSPurposeCode13081", + "label": "personnel development for population and reproductive health" + } + ] + }, + "summable": true + }, + { + "key": { "axis": "how", "property": { "ref": "crsTypeOfFinance", @@ -3932,7 +4783,13 @@ }, "label": "instrument" }, - { + "binding": { + "kind": "unbound" + }, + "summable": true + }, + { + "key": { "axis": "how", "property": { "ref": "crsTypeOfFlow", @@ -3940,7 +4797,20 @@ }, "label": "flow" }, - { + "binding": { + "kind": "value", + "value": { + "ref": { + "ref": "CRSTypeOfFlow10", + "label": "official development assistance" + }, + "value_kind": "enum_value" + } + }, + "summable": true + }, + { + "key": { "axis": "how", "property": { "ref": "financialFlowType", @@ -3948,7 +4818,20 @@ }, "label": "financial flow type" }, - { + "binding": { + "kind": "value", + "value": { + "ref": { + "ref": "Disbursement", + "label": "disbursement" + }, + "value_kind": "enum_value" + } + }, + "summable": false + }, + { + "key": { "axis": "how", "property": { "ref": "nettingBasis", @@ -3956,7 +4839,20 @@ }, "label": "netting basis" }, - { + "binding": { + "kind": "value", + "value": { + "ref": { + "ref": "Gross", + "label": "gross" + }, + "value_kind": "enum_value" + } + }, + "summable": false + }, + { + "key": { "axis": "how", "property": { "ref": "crsCooperationModality", @@ -3964,30 +4860,118 @@ }, "label": "modality" }, - { + "binding": { + "kind": "unbound" + }, + "summable": true + }, + { + "key": { "axis": "where", "label": "place" }, - { + "binding": { + "kind": "value", + "value": { + "ref": { + "ref": "country/KEN", + "label": "Kenya" + }, + "value_kind": "entity" + } + }, + "summable": false + }, + { + "key": { "axis": "when", "label": "time window" }, - { + "binding": { + "kind": "unbound" + }, + "summable": false + }, + { + "key": { "axis": "source", "label": "data source" - } - ], - "member_count": 545, - "member_digest": "0c7508fd1997d6cdc896f2eab0f092a4915cfca9e2400eb9577bb22b527fe882", - "refine_supported": true, - "data_commons": [ + }, + "binding": { + "kind": "unbound" + }, + "summable": false + } + ], + "inapplicable_slots": [ + "financialObligationType" + ], + "unresolved_slots": [], + "stat_vars": { + "member_count": 123, + "member_count_exact": true, + "served_count": 634, + "data_date_range": { + "start": "1997", + "end": "2024" + } + }, + "entities": [ + { + "ref": "country/KEN", + "label": "Kenya", + "entity_type": "Country", + "role": "destination" + }, + { + "ref": "country/DEU", + "label": "Germany", + "entity_type": "Country", + "role": "origin" + } + ], + "coverage": { + "kind": "breadth", + "has_data": true, + "dimensions": [ { - "id": "dfo", - "label": "Development Finance Observatory" + "label": "sources", + "count": 1 + }, + { + "label": "observations", + "count": 19 + }, + { + "label": "variables", + "count": 66 } ] }, - "slots": [ + "facets": { + "unit": { + "basis": "fallback", + "ref": "CurrencyUSD", + "label": "US Dollar", + "currency": "USD" + }, + "provenance": { + "basis": "fallback", + "ref": "provenance/OECDCreditorReportingSystem", + "label": "OECD Creditor Reporting System (CRS)", + "source": { + "ref": "dc/s/OrganisationForEconomicCo-operationAndDevelopmentOecd", + "label": "Organisation for Economic Co-operation and Development (OECD)" + }, + "data_commons": { + "id": "dfo", + "label": "Development Finance Observatory" + }, + "documentation": "/api/graph/documentation/provenance/OECDCreditorReportingSystem", + "account": "provider" + } + }, + "slot_options": [ { "key": { "axis": "how", @@ -3995,382 +4979,502 @@ "ref": "crsPurpose", "label": "CRS purpose" }, - "label": "sector" - }, - "binding": { - "kind": "set", - "values": [ - { + "label": "sector" + }, + "options": [ + { + "value": { + "ref": { + "ref": "CRSPurposeCode998", + "label": "unallocated and unspecified" + }, + "value_kind": "enum_value" + }, + "relation": "root", + "member_count": 76, + "served_rows": 74, + "served_rows_exact": true + }, + { + "value": { + "ref": { + "ref": "CRSPurposeCode99810", + "label": "sectors not specified" + }, + "value_kind": "enum_value" + }, + "relation": "child", + "parent": "CRSPurposeCode998", + "member_count": 255, + "served_rows": 71, + "served_rows_exact": true + }, + { + "value": { + "ref": { + "ref": "CRSPurposeCode99820", + "label": "non-sector allocable promotion of development awareness" + }, + "value_kind": "enum_value" + }, + "relation": "child", + "parent": "CRSPurposeCode998", + "member_count": 77, + "served_rows": 3, + "served_rows_exact": true + }, + { + "value": { + "ref": { + "ref": "CRSPurposeCode600", + "label": "action relating to debt" + }, + "value_kind": "enum_value" + }, + "relation": "root", + "member_count": 21, + "served_rows": 9, + "served_rows_exact": true + }, + { + "value": { + "ref": { + "ref": "CRSPurposeCode60020", + "label": "debt forgiveness" + }, + "value_kind": "enum_value" + }, + "relation": "child", + "parent": "CRSPurposeCode600", + "member_count": 75, + "served_rows": 4, + "served_rows_exact": true + }, + { + "value": { + "ref": { + "ref": "CRSPurposeCode60040", + "label": "rescheduling and refinancing" + }, + "value_kind": "enum_value" + }, + "relation": "child", + "parent": "CRSPurposeCode600", + "member_count": 54, + "served_rows": 5, + "served_rows_exact": true + }, + { + "value": { + "ref": { + "ref": "CRSPurposeCode100", + "label": "social infrastructure and services" + }, + "value_kind": "enum_value" + }, + "relation": "root", + "member_count": 13, + "served_rows": 1214, + "served_rows_exact": true + }, + { + "value": { + "ref": { + "ref": "CRSPurposeCode140", + "label": "water supply and sanitation" + }, + "value_kind": "enum_value" + }, + "relation": "child", + "parent": "CRSPurposeCode100", + "member_count": 10, + "served_rows": 275, + "served_rows_exact": true + }, + { + "value": { "ref": { "ref": "CRSPurposeCode110", "label": "education" }, "value_kind": "enum_value" }, - { + "relation": "child", + "parent": "CRSPurposeCode100", + "member_count": 9, + "served_rows": 318, + "served_rows_exact": true + }, + { + "value": { + "ref": { + "ref": "CRSPurposeCode160", + "label": "other social infrastructure and services" + }, + "value_kind": "enum_value" + }, + "relation": "child", + "parent": "CRSPurposeCode100", + "member_count": 7, + "served_rows": 102, + "served_rows_exact": true + }, + { + "value": { "ref": { "ref": "CRSPurposeCode120", "label": "health" }, "value_kind": "enum_value" - } - ] - }, - "expansion": { - "added": [ - { - "ref": "CRSPurposeCode121", - "label": "general health" - }, - { - "ref": "CRSPurposeCode122", - "label": "basic health" - }, - { - "ref": "CRSPurposeCode123", - "label": "noncommunicable disease" - }, - { - "ref": "CRSPurposeCode12110", - "label": "health policy and administrative management" - }, - { - "ref": "CRSPurposeCode12181", - "label": "medical education and training" - }, - { - "ref": "CRSPurposeCode12182", - "label": "medical research" - }, - { - "ref": "CRSPurposeCode12191", - "label": "medical service" }, - { - "ref": "CRSPurposeCode12220", - "label": "basic health care" + "relation": "child", + "parent": "CRSPurposeCode100", + "member_count": 6, + "served_rows": 194, + "served_rows_exact": true + }, + { + "value": { + "ref": { + "ref": "CRSPurposeCode130", + "label": "population policy, programme, and reproductive health" + }, + "value_kind": "enum_value" }, - { - "ref": "CRSPurposeCode12230", - "label": "basic health infrastructure" + "relation": "child", + "parent": "CRSPurposeCode100", + "member_count": 5, + "served_rows": 81, + "served_rows_exact": true + }, + { + "value": { + "ref": { + "ref": "CRSPurposeCode150", + "label": "government and civil society" + }, + "value_kind": "enum_value" }, - { - "ref": "CRSPurposeCode12240", - "label": "basic nutrition" + "relation": "child", + "parent": "CRSPurposeCode100", + "member_count": 4, + "served_rows": 244, + "served_rows_exact": true + }, + { + "value": { + "ref": { + "ref": "CRSPurposeCode200", + "label": "economic infrastructure and services" + }, + "value_kind": "enum_value" }, - { - "ref": "CRSPurposeCode12250", - "label": "infectious disease control" + "relation": "root", + "member_count": 13, + "served_rows": 286, + "served_rows_exact": true + }, + { + "value": { + "ref": { + "ref": "CRSPurposeCode240", + "label": "banking and financial services" + }, + "value_kind": "enum_value" }, - { - "ref": "CRSPurposeCode12261", - "label": "health education" + "relation": "child", + "parent": "CRSPurposeCode200", + "member_count": 16, + "served_rows": 30, + "served_rows_exact": true + }, + { + "value": { + "ref": { + "ref": "CRSPurposeCode220", + "label": "communication system and technology" + }, + "value_kind": "enum_value" }, - { - "ref": "CRSPurposeCode12262", - "label": "malaria control" + "relation": "child", + "parent": "CRSPurposeCode200", + "member_count": 13, + "served_rows": 23, + "served_rows_exact": true + }, + { + "value": { + "ref": { + "ref": "CRSPurposeCode250", + "label": "business environment and governance" + }, + "value_kind": "enum_value" }, - { - "ref": "CRSPurposeCode12263", - "label": "tuberculosis control" + "relation": "child", + "parent": "CRSPurposeCode200", + "member_count": 13, + "served_rows": 30, + "served_rows_exact": true + }, + { + "value": { + "ref": { + "ref": "CRSPurposeCode210", + "label": "transport and storage" + }, + "value_kind": "enum_value" }, - { - "ref": "CRSPurposeCode12264", - "label": "COVID-19 control" + "relation": "child", + "parent": "CRSPurposeCode200", + "member_count": 7, + "served_rows": 97, + "served_rows_exact": true + }, + { + "value": { + "ref": { + "ref": "CRSPurposeCode230", + "label": "energy" + }, + "value_kind": "enum_value" }, - { - "ref": "CRSPurposeCode12281", - "label": "health personnel development" + "relation": "child", + "parent": "CRSPurposeCode200", + "member_count": 7, + "served_rows": 106, + "served_rows_exact": true + }, + { + "value": { + "ref": { + "ref": "CRSPurposeCode300", + "label": "productive sector" + }, + "value_kind": "enum_value" }, - { - "ref": "CRSPurposeCode12310", - "label": "general noncommunicable disease control" + "relation": "root", + "member_count": 13, + "served_rows": 493, + "served_rows_exact": true + }, + { + "value": { + "ref": { + "ref": "CRSPurposeCode310", + "label": "agriculture, forestry and fishing" + }, + "value_kind": "enum_value" }, - { - "ref": "CRSPurposeCode12320", - "label": "tobacco use control" + "relation": "child", + "parent": "CRSPurposeCode300", + "member_count": 12, + "served_rows": 405, + "served_rows_exact": true + }, + { + "value": { + "ref": { + "ref": "CRSPurposeCode320", + "label": "industry, mining and construction" + }, + "value_kind": "enum_value" }, - { - "ref": "CRSPurposeCode12330", - "label": "control of harmful use of alcohol and drugs" + "relation": "child", + "parent": "CRSPurposeCode300", + "member_count": 9, + "served_rows": 66, + "served_rows_exact": true + }, + { + "value": { + "ref": { + "ref": "CRSPurposeCode331", + "label": "trade policies and regulations" + }, + "value_kind": "enum_value" }, - { - "ref": "CRSPurposeCode12340", - "label": "mental health and well-being promotion" + "relation": "child", + "parent": "CRSPurposeCode300", + "member_count": 7, + "served_rows": 22, + "served_rows_exact": true + }, + { + "value": { + "ref": { + "ref": "CRSPurposeCode400", + "label": "multisector" + }, + "value_kind": "enum_value" }, - { - "ref": "CRSPurposeCode12350", - "label": "other noncommunicable disease prevention and treatment" + "relation": "root", + "member_count": 7, + "served_rows": 206, + "served_rows_exact": true + }, + { + "value": { + "ref": { + "ref": "CRSPurposeCode430", + "label": "other multisector" + }, + "value_kind": "enum_value" }, - { - "ref": "CRSPurposeCode12382", - "label": "research for noncommunicable disease prevention and control" - } - ] - }, - "summable": true - }, - { - "key": { - "axis": "how", - "property": { - "ref": "crsTypeOfFinance", - "label": "CRS type of finance" + "relation": "child", + "parent": "CRSPurposeCode400", + "member_count": 10, + "served_rows": 162, + "served_rows_exact": true + }, + { + "value": { + "ref": { + "ref": "CRSPurposeCode410", + "label": "general environment protection" + }, + "value_kind": "enum_value" + }, + "relation": "child", + "parent": "CRSPurposeCode400", + "member_count": 7, + "served_rows": 44, + "served_rows_exact": true }, - "label": "instrument" - }, - "binding": { - "kind": "unbound" - }, - "summable": true - }, - { - "key": { - "axis": "how", - "property": { - "ref": "crsTypeOfFlow", - "label": "CRS type of flow" + { + "value": { + "ref": { + "ref": "CRSPurposeCode500", + "label": "commodity aid and general programme assistance" + }, + "value_kind": "enum_value" + }, + "relation": "root", + "member_count": 5, + "served_rows": 70, + "served_rows_exact": true }, - "label": "flow" - }, - "binding": { - "kind": "value", - "value": { - "ref": { - "ref": "CRSTypeOfFlow10", - "label": "official development assistance" + { + "value": { + "ref": { + "ref": "CRSPurposeCode510", + "label": "budget support" + }, + "value_kind": "enum_value" }, - "value_kind": "enum_value" - } - }, - "summable": true - }, - { - "key": { - "axis": "how", - "property": { - "ref": "financialFlowType", - "label": "financial flow type" + "relation": "child", + "parent": "CRSPurposeCode500", + "member_count": 3, + "served_rows": 10, + "served_rows_exact": true }, - "label": "financial flow type" - }, - "binding": { - "kind": "value", - "value": { - "ref": { - "ref": "Disbursement", - "label": "disbursement" + { + "value": { + "ref": { + "ref": "CRSPurposeCode520", + "label": "food assistance" + }, + "value_kind": "enum_value" }, - "value_kind": "enum_value" - } - }, - "summable": false - }, - { - "key": { - "axis": "how", - "property": { - "ref": "nettingBasis", - "label": "netting basis" + "relation": "child", + "parent": "CRSPurposeCode500", + "member_count": 3, + "served_rows": 19, + "served_rows_exact": true }, - "label": "netting basis" - }, - "binding": { - "kind": "value", - "value": { - "ref": { - "ref": "Gross", - "label": "gross" + { + "value": { + "ref": { + "ref": "CRSPurposeCode530", + "label": "other commodity assistance" + }, + "value_kind": "enum_value" }, - "value_kind": "enum_value" - } - }, - "summable": false - }, - { - "key": { - "axis": "how", - "property": { - "ref": "crsCooperationModality", - "label": "CRS cooperation modality" + "relation": "child", + "parent": "CRSPurposeCode500", + "member_count": 3, + "served_rows": 41, + "served_rows_exact": true }, - "label": "modality" - }, - "binding": { - "kind": "unbound" - }, - "summable": true - }, - { - "key": { - "axis": "where", - "label": "place" - }, - "binding": { - "kind": "value", - "value": { - "ref": { - "ref": "country/KEN", - "label": "Kenya" + { + "value": { + "ref": { + "ref": "CRSPurposeCode700", + "label": "humanitarian aid" + }, + "value_kind": "enum_value" }, - "value_kind": "entity" - } - }, - "summable": false - }, - { - "key": { - "axis": "when", - "label": "time window" - }, - "binding": { - "kind": "unbound" - }, - "summable": false - }, - { - "key": { - "axis": "source", - "label": "data source" - }, - "binding": { - "kind": "unbound" - }, - "summable": false - } - ], - "inapplicable_slots": [ - "financialObligationType" - ], - "unresolved_slots": [], - "stat_vars": { - "member_count": 108, - "member_count_exact": true, - "served_count": 545, - "data_date_range": { - "start": "1997", - "end": "2024" - } - }, - "entities": [ - { - "ref": "country/KEN", - "label": "Kenya", - "entity_type": "Country", - "role": "destination" - }, - { - "ref": "country/DEU", - "label": "Germany", - "entity_type": "Country", - "role": "origin" - } - ], - "coverage": { - "kind": "breadth", - "has_data": true, - "dimensions": [ - { - "label": "sources", - "count": 1 - }, - { - "label": "observations", - "count": 12 - }, - { - "label": "variables", - "count": 51 - } - ] - }, - "facets": { - "provenance": { - "basis": "fallback", - "ref": "provenance/OECDCreditorReportingSystem", - "label": "OECD Creditor Reporting System (CRS)", - "source": { - "ref": "dc/s/OrganisationForEconomicCo-operationAndDevelopmentOecd", - "label": "Organisation for Economic Co-operation and Development (OECD)" - }, - "data_commons": { - "id": "dfo", - "label": "Development Finance Observatory" - }, - "documentation": "/api/graph/documentation/provenance/OECDCreditorReportingSystem", - "account": "provider" - }, - "unit": { - "basis": "fallback", - "ref": "CurrencyUSD", - "label": "US Dollar", - "currency": "USD" - } - }, - "slot_options": [ - { - "key": { - "axis": "how", - "property": { - "ref": "crsPurpose", - "label": "CRS purpose" + "relation": "root", + "member_count": 5, + "served_rows": 68, + "served_rows_exact": true }, - "label": "sector" - }, - "options": [ { "value": { "ref": { - "ref": "CRSPurposeCode121", - "label": "general health" + "ref": "CRSPurposeCode720", + "label": "emergency response" }, "value_kind": "enum_value" }, "relation": "child", - "parent": "CRSPurposeCode120", + "parent": "CRSPurposeCode700", "member_count": 6, - "served_rows": 82, + "served_rows": 46, "served_rows_exact": true }, { "value": { "ref": { - "ref": "CRSPurposeCode122", - "label": "basic health" + "ref": "CRSPurposeCode730", + "label": "reconstruction and rehabilitation" }, "value_kind": "enum_value" }, "relation": "child", - "parent": "CRSPurposeCode120", - "member_count": 4, - "served_rows": 108, + "parent": "CRSPurposeCode700", + "member_count": 3, + "served_rows": 14, "served_rows_exact": true }, { "value": { "ref": { - "ref": "CRSPurposeCode123", - "label": "noncommunicable disease" + "ref": "CRSPurposeCode740", + "label": "disaster preparedness" }, "value_kind": "enum_value" }, "relation": "child", - "parent": "CRSPurposeCode120", - "member_count": 3, - "served_rows": 4, + "parent": "CRSPurposeCode700", + "member_count": 0, + "served_rows": 8, "served_rows_exact": true }, { "value": { "ref": { - "ref": "CRSPurposeCode100", - "label": "social infrastructure and services" + "ref": "CRSPurposeCode930", + "label": "support for refugees and asylum seekers in donor countries" }, "value_kind": "enum_value" }, - "relation": "parent", - "member_count": 13, - "served_rows": 1214, + "relation": "root", + "member_count": 3, + "served_rows": 6, + "served_rows_exact": true + }, + { + "value": { + "ref": { + "ref": "CRSPurposeCode93010", + "label": "general support for refugees and asylum seekers in donor countries" + }, + "value_kind": "enum_value" + }, + "relation": "child", + "parent": "CRSPurposeCode930", + "member_count": 57, + "served_rows": 6, "served_rows_exact": true }, { @@ -4453,7 +5557,7 @@ }, "relation": "root", "member_count": 0, - "served_rows": 501, + "served_rows": 582, "served_rows_exact": true }, { @@ -4466,8 +5570,8 @@ }, "relation": "child", "parent": "CRSTypeOfFinance100", - "member_count": 12672, - "served_rows": 501, + "member_count": 12745, + "served_rows": 582, "served_rows_exact": true }, { @@ -4520,8 +5624,8 @@ "value_kind": "enum_value" }, "relation": "root", - "member_count": 14098, - "served_rows": 512, + "member_count": 14146, + "served_rows": 593, "served_rows_exact": true } ], @@ -4548,7 +5652,7 @@ }, "relation": "root", "member_count": 0, - "served_rows": 104, + "served_rows": 118, "served_rows_exact": true }, { @@ -4561,8 +5665,8 @@ }, "relation": "child", "parent": "CRSCooperationModalityB", - "member_count": 1606, - "served_rows": 21, + "member_count": 1614, + "served_rows": 25, "served_rows_exact": true }, { @@ -4575,8 +5679,8 @@ }, "relation": "child", "parent": "CRSCooperationModalityB", - "member_count": 1331, - "served_rows": 83, + "member_count": 1337, + "served_rows": 93, "served_rows_exact": true }, { @@ -4589,7 +5693,7 @@ }, "relation": "root", "member_count": 0, - "served_rows": 136, + "served_rows": 173, "served_rows_exact": true }, { @@ -4602,8 +5706,8 @@ }, "relation": "child", "parent": "CRSCooperationModalityC", - "member_count": 7005, - "served_rows": 136, + "member_count": 7041, + "served_rows": 173, "served_rows_exact": true }, { @@ -4616,7 +5720,7 @@ }, "relation": "root", "member_count": 0, - "served_rows": 111, + "served_rows": 116, "served_rows_exact": true }, { @@ -4630,7 +5734,7 @@ "relation": "child", "parent": "CRSCooperationModalityD", "member_count": 1600, - "served_rows": 84, + "served_rows": 87, "served_rows_exact": true }, { @@ -4643,8 +5747,8 @@ }, "relation": "child", "parent": "CRSCooperationModalityD", - "member_count": 976, - "served_rows": 27, + "member_count": 980, + "served_rows": 29, "served_rows_exact": true }, { @@ -4728,7 +5832,7 @@ "source": "observed" } ], - "rendered_sentence": "Germany's gross ODA disbursements to Kenya for education and health, 1997 to 2024. Current US dollars · OECD Creditor Reporting System (CRS).", + "rendered_sentence": "Germany's gross ODA disbursements to Kenya for education, health, and population policy, programme, and reproductive health, 1997 to 2024. Current US dollars · OECD Creditor Reporting System (CRS).", "sentence_plan": [ { "kind": "slot", @@ -4801,7 +5905,7 @@ }, { "kind": "slot", - "text": "education and health", + "text": "education, health, and population policy, programme, and reproductive health", "axis": "how", "segment": "heading", "property_dcid": "crsPurpose", @@ -4975,6 +6079,10 @@ { "ref": "CRSPurposeCode120", "label": "health" + }, + { + "ref": "CRSPurposeCode130", + "label": "population policy, programme, and reproductive health" } ], "provenance": "text_recognized" @@ -5130,226 +6238,13 @@ "selected": [] } ], - "capability_version": "cap_765c9d2a0c7529b9", + "capability_version": "cap_4913302d7a6b6435", "default_reading": { "applied": true, "removed_stat_vars": [] } }, - "alternative_measures": [ - { - "definition": { - "schema_version": 1, - "spec_id": "spec_b438dc000255d174bcc13eb675e603f7", - "identity": { - "identity_version": "spec1", - "shape": { - "kind": "statvar_schema", - "population_type": "FinancialFlow", - "measured_property": "amount", - "stat_type": "measuredValue", - "measurement_qualifier": "Nominal" - }, - "slots": [ - { - "property": "crsCooperationModality", - "binding": { - "state": "unbound" - } - }, - { - "property": "crsPurpose", - "binding": { - "state": "set", - "refs": [ - "CRSPurposeCode110", - "CRSPurposeCode120" - ] - } - }, - { - "property": "crsTypeOfFinance", - "binding": { - "state": "unbound" - } - }, - { - "property": "crsTypeOfFlow", - "binding": { - "state": "value", - "ref": "CRSTypeOfFlow10" - } - }, - { - "property": "financialFlowType", - "binding": { - "state": "value", - "ref": "Disbursement" - } - }, - { - "property": "nettingBasis", - "binding": { - "state": "value", - "ref": "Net" - } - } - ], - "entities": { - "destination": [ - "country/KEN" - ], - "origin": [ - "country/DEU" - ] - }, - "requested_window": { - "kind": "all" - } - } - }, - "label": "net disbursements", - "axis": "what", - "measure_axis_values": [ - { - "axis": "populationType", - "value": { - "ref": "FinancialFlow", - "label": "financial flow" - } - }, - { - "axis": "measuredProperty", - "value": { - "ref": "amount", - "label": "amount" - } - }, - { - "axis": "measurementQualifier", - "value": { - "ref": "Nominal", - "label": "nominal" - } - }, - { - "axis": "financialFlowType", - "value": { - "ref": "Disbursement", - "label": "disbursement" - } - }, - { - "axis": "nettingBasis", - "value": { - "ref": "Net", - "label": "net" - } - } - ], - "served_rows": 512, - "served_rows_exact": true - }, - { - "definition": { - "schema_version": 1, - "spec_id": "spec_e348565295de394da8ddaa23ec5fa475", - "identity": { - "identity_version": "spec1", - "shape": { - "kind": "statvar_schema", - "population_type": "FinancialObligation", - "measured_property": "amount", - "stat_type": "measuredValue", - "measurement_qualifier": "Nominal" - }, - "slots": [ - { - "property": "crsCooperationModality", - "binding": { - "state": "unbound" - } - }, - { - "property": "crsPurpose", - "binding": { - "state": "set", - "refs": [ - "CRSPurposeCode110", - "CRSPurposeCode120" - ] - } - }, - { - "property": "crsTypeOfFinance", - "binding": { - "state": "unbound" - } - }, - { - "property": "crsTypeOfFlow", - "binding": { - "state": "value", - "ref": "CRSTypeOfFlow10" - } - }, - { - "property": "financialObligationType", - "binding": { - "state": "value", - "ref": "Commitment" - } - } - ], - "entities": { - "destination": [ - "country/KEN" - ], - "origin": [ - "country/DEU" - ] - }, - "requested_window": { - "kind": "all" - } - } - }, - "label": "commitments", - "axis": "what", - "measure_axis_values": [ - { - "axis": "populationType", - "value": { - "ref": "FinancialObligation", - "label": "financial obligation" - } - }, - { - "axis": "measuredProperty", - "value": { - "ref": "amount", - "label": "amount" - } - }, - { - "axis": "measurementQualifier", - "value": { - "ref": "Nominal", - "label": "nominal" - } - }, - { - "axis": "financialObligationType", - "value": { - "ref": "Commitment", - "label": "commitment" - } - } - ], - "served_rows": 519, - "served_rows_exact": true - } - ], + "alternative_measures": [], "measure_label": "gross disbursements", "measure_label_axes": [ "populationType", @@ -5395,6 +6290,8 @@ } } ], + "concept_label": "education, health, and population policy, programme, and reproductive health", + "published_tables": "OECD Creditor Reporting System (CRS)", "open_axis_facts": [ { "property": "crsTypeOfFinance", @@ -5407,7 +6304,7 @@ "ref": "CRSTypeOfFinance110", "label": "standard grant" }, - "count": 105 + "count": 120 }, { "value": { @@ -5422,42 +6319,42 @@ "property": "crsCooperationModality", "varies": true, "distinct_count": 7, - "undeclared_count": 19, + "undeclared_count": 22, "values": [ { "value": { "ref": "CRSCooperationModalityC01", "label": "project-type intervention" }, - "count": 27 + "count": 30 }, { "value": { "ref": "CRSCooperationModalityB03", "label": "contribution to specific-purpose programme and fund managed by an international organisation" }, - "count": 21 + "count": 24 }, { "value": { - "ref": "CRSCooperationModalityD02", - "label": "other technical assistance" + "ref": "CRSCooperationModalityB01", + "label": "core support to non-governmental organisations, other private bodies, public-private partnerships, and research institutes" }, - "count": 16 + "count": 18 }, { "value": { - "ref": "CRSCooperationModalityB01", - "label": "core support to non-governmental organisations, other private bodies, public-private partnerships, and research institutes" + "ref": "CRSCooperationModalityD02", + "label": "other technical assistance" }, - "count": 15 + "count": 18 }, { "value": { "ref": "CRSCooperationModalityD01", "label": "donor country personnel" }, - "count": 8 + "count": 9 }, { "value": { @@ -7425,25 +8322,396 @@ "base_year_max": 2025 }, { - "code": "ZMW", - "noun": "Zambian kwachas", - "current_years": { - "start_year": 1980, - "end_year": 2025 - }, - "constant_years": { - "start_year": 1960, - "end_year": 2025 - }, - "base_year_min": 1980, - "base_year_max": 2025 + "code": "ZMW", + "noun": "Zambian kwachas", + "current_years": { + "start_year": 1980, + "end_year": 2025 + }, + "constant_years": { + "start_year": 1960, + "end_year": 2025 + }, + "base_year_min": 1980, + "base_year_max": 2025 + } + ], + "default_base_year": 2024, + "role_currencies": { + "destination": "KES", + "origin": "EUR" + } + }, + "scope_choices": { + "id": "spec_7a02b6facd2dc17b5d0d7c35c11bf5d2", + "base": { + "schema_version": 1, + "spec_id": "spec_7a02b6facd2dc17b5d0d7c35c11bf5d2", + "identity": { + "identity_version": "spec1", + "shape": { + "kind": "statvar_schema", + "population_type": "FinancialFlow", + "measured_property": "amount", + "stat_type": "measuredValue", + "measurement_qualifier": "Nominal" + }, + "slots": [ + { + "property": "crsCooperationModality", + "binding": { + "state": "unbound" + } + }, + { + "property": "crsPurpose", + "binding": { + "state": "set", + "refs": [ + "CRSPurposeCode110", + "CRSPurposeCode120", + "CRSPurposeCode130" + ] + } + }, + { + "property": "crsTypeOfFinance", + "binding": { + "state": "unbound" + } + }, + { + "property": "crsTypeOfFlow", + "binding": { + "state": "value", + "ref": "CRSTypeOfFlow10" + } + }, + { + "property": "financialFlowType", + "binding": { + "state": "value", + "ref": "Disbursement" + } + }, + { + "property": "nettingBasis", + "binding": { + "state": "value", + "ref": "Gross" + } + } + ], + "entities": { + "destination": [ + "country/KEN" + ], + "origin": [ + "country/DEU" + ] + }, + "requested_window": { + "kind": "all" + } + } + }, + "rule_version": "scope1:3eef00a928eedd463ee48d02b79730da", + "entries": [], + "dropped_entries": [ + { + "entry": { + "axis": "sector", + "option_id": "sector:110", + "provenance": "explicit", + "origin": { + "kind": "text", + "text": "education", + "start": 0, + "end": 9 + } + }, + "code": "stated_choice_not_applied", + "cause": "option_unknown" + } + ], + "choices": [ + { + "id": "spec_7a02b6facd2dc17b5d0d7c35c11bf5d2:sector", + "axis": "sector", + "rule": "sector_code", + "provenance": "default", + "active": "sector:110+120+130", + "options": [ + { + "option_id": "sector:110+120+130", + "label": "education (CRS 110) + health (CRS 120) + population policy, programme, and reproductive health (CRS 130)", + "binding": { + "kind": "slot", + "slot": "crsPurpose", + "state": "set", + "refs": [ + "CRSPurposeCode110", + "CRSPurposeCode120", + "CRSPurposeCode130" + ] + }, + "availability": { + "status": "available", + "detail": {} + } + } + ] + }, + { + "id": "spec_7a02b6facd2dc17b5d0d7c35c11bf5d2:measure_basis", + "axis": "measure_basis", + "rule": "measure_basis_convention", + "provenance": "default", + "active": "measure_basis:gross", + "options": [ + { + "option_id": "measure_basis:gross", + "label": "gross disbursements, current USD", + "binding": { + "kind": "shape", + "measured_property": "amount", + "netting_basis": "Gross" + }, + "availability": { + "status": "available", + "detail": {} + } + }, + { + "option_id": "measure_basis:net", + "label": "net disbursements, current USD", + "binding": { + "kind": "shape", + "measured_property": "amount", + "netting_basis": "Net" + }, + "availability": { + "status": "available", + "detail": {} + } + }, + { + "option_id": "measure_basis:grant_equivalent", + "label": "grant equivalents (OECD headline), current USD", + "binding": { + "kind": "shape", + "measured_property": "grantEquivalent", + "netting_basis": null + }, + "availability": { + "status": "available", + "detail": {} + } + }, + { + "option_id": "measure_basis:commitments", + "label": "commitments, current USD", + "binding": { + "kind": "shape", + "measured_property": "amount", + "netting_basis": null + }, + "availability": { + "status": "available", + "detail": {} + } + } + ] + }, + { + "id": "spec_7a02b6facd2dc17b5d0d7c35c11bf5d2:provider", + "axis": "provider", + "rule": "bilateral_flows", + "provenance": "default", + "active": "provider:bilateral", + "options": [ + { + "option_id": "provider:bilateral", + "label": "bilateral flows only", + "binding": { + "kind": "provider", + "scope": "bilateral" + }, + "availability": { + "status": "available", + "detail": {} + } + }, + { + "option_id": "provider:inclusive", + "label": "bilateral plus imputed multilateral, 2011 to 2024", + "binding": { + "kind": "provider", + "scope": "inclusive", + "window": [ + 2011, + 2024 + ], + "provenance": "provenance/ONEBilateralAndImputedMultilateral" + }, + "availability": { + "status": "partial", + "years": [ + [ + 2011, + 2024 + ] + ], + "code": "imputed_coverage", + "detail": {} + } + } + ] } ], - "default_base_year": 2024, - "role_currencies": { - "destination": "KES", - "origin": "EUR" - } + "compiled": { + "spec_id": "spec_7a02b6facd2dc17b5d0d7c35c11bf5d2", + "identity": { + "identity_version": "spec1", + "shape": { + "kind": "statvar_schema", + "population_type": "FinancialFlow", + "measured_property": "amount", + "stat_type": "measuredValue", + "measurement_qualifier": "Nominal" + }, + "slots": [ + { + "property": "crsCooperationModality", + "binding": { + "state": "unbound" + } + }, + { + "property": "crsPurpose", + "binding": { + "state": "set", + "refs": [ + "CRSPurposeCode110", + "CRSPurposeCode120", + "CRSPurposeCode130" + ] + } + }, + { + "property": "crsTypeOfFinance", + "binding": { + "state": "unbound" + } + }, + { + "property": "crsTypeOfFlow", + "binding": { + "state": "value", + "ref": "CRSTypeOfFlow10" + } + }, + { + "property": "financialFlowType", + "binding": { + "state": "value", + "ref": "Disbursement" + } + }, + { + "property": "nettingBasis", + "binding": { + "state": "value", + "ref": "Gross" + } + } + ], + "entities": { + "destination": [ + "country/KEN" + ], + "origin": [ + "country/DEU" + ] + }, + "requested_window": { + "kind": "all" + } + }, + "components": [ + { + "role": "whole", + "identity": { + "identity_version": "spec1", + "shape": { + "kind": "statvar_schema", + "population_type": "FinancialFlow", + "measured_property": "amount", + "stat_type": "measuredValue", + "measurement_qualifier": "Nominal" + }, + "slots": [ + { + "property": "crsCooperationModality", + "binding": { + "state": "unbound" + } + }, + { + "property": "crsPurpose", + "binding": { + "state": "set", + "refs": [ + "CRSPurposeCode110", + "CRSPurposeCode120", + "CRSPurposeCode130" + ] + } + }, + { + "property": "crsTypeOfFinance", + "binding": { + "state": "unbound" + } + }, + { + "property": "crsTypeOfFlow", + "binding": { + "state": "value", + "ref": "CRSTypeOfFlow10" + } + }, + { + "property": "financialFlowType", + "binding": { + "state": "value", + "ref": "Disbursement" + } + }, + { + "property": "nettingBasis", + "binding": { + "state": "value", + "ref": "Gross" + } + } + ], + "entities": { + "destination": [ + "country/KEN" + ], + "origin": [ + "country/DEU" + ] + }, + "requested_window": { + "kind": "all" + } + } + } + ] + }, + "ledger": [] } } } @@ -7463,30 +8731,30 @@ } ], "timing_ms": { - "total": 2851, + "total": 5202, "by_step": { - "recall": 360, + "recall": 1145, "phase_resolve_places": 0, "phase_check_entities": 0, - "shape_arcs": 4, - "shape_probe_coverage": 2, - "shape_probe": 121, - "shape_groups": 841, - "shape_labels": 17, - "shape_admission": 4, + "shape_arcs": 5, + "shape_probe_coverage": 4, + "shape_probe": 1327, + "shape_groups": 85, + "shape_labels": 11, + "shape_admission": 2, "phase_derive_shapes": 0, - "shape": 1100, + "shape": 1663, "phase_prune_and_rank": 0, - "bind": 261, - "phase_bind": 16, - "phase_settle": 7, - "phase_place_bindings": 554, + "bind": 216, + "phase_bind": 39, + "phase_settle": 18, + "phase_place_bindings": 1429, "phase_facet_requests": 0, - "materialise": 96, - "phase_materialise": 17, - "answer": 239, - "options": 188, - "phase_outcome": 13 + "materialise": 147, + "phase_materialise": 19, + "answer": 102, + "options": 400, + "phase_outcome": 24 } }, "restatement": { @@ -8923,7 +10191,7 @@ } ], "query_qualifiers": [], - "capability_version": "cap_765c9d2a0c7529b9", + "capability_version": "cap_4913302d7a6b6435", "default_reading": { "applied": true, "removed_stat_vars": [ @@ -9456,7 +10724,7 @@ } ], "query_qualifiers": [], - "capability_version": "cap_765c9d2a0c7529b9", + "capability_version": "cap_4913302d7a6b6435", "default_reading": { "applied": true, "removed_stat_vars": [ @@ -9495,12 +10763,14 @@ "confidence": "high", "available_at_place": true, "measure_label_axes": [], - "measure_axis_values": [] + "measure_axis_values": [], + "published_tables": "IMF World Economic Outlook (WEO)" } } ], "measure_label_axes": [], "measure_axis_values": [], + "published_tables": "World Development Indicators", "related_group": { "ref": "dc/g/EconomicActivity_ActivitySource-GrossDomesticProduction", "label": "Economic Activity With Activity Source = Gross Domestic Production" @@ -9548,7 +10818,7 @@ } } ], - "rendered_sentence": "Germany's gross ODA disbursements to Kenya for education and health, 1997 to 2024. Current US dollars · OECD Creditor Reporting System (CRS). GDP in Germany and Kenya, 1960 to 2025. Current US dollars · World Development Indicators. You named Germany as a provider. This measure has no providers, so this shows the place itself. You named Kenya as a recipient. This measure has no recipients, so this shows the place itself.", + "rendered_sentence": "Germany's gross ODA disbursements to Kenya for education, health, and population policy, programme, and reproductive health, 1997 to 2024. Current US dollars · OECD Creditor Reporting System (CRS). GDP in Germany and Kenya, 1960 to 2025. Current US dollars · World Development Indicators. You named Germany as a provider. This measure has no providers, so this shows the place itself. You named Kenya as a recipient. This measure has no recipients, so this shows the place itself.", "sentence_plan": [ { "kind": "slot", @@ -9621,7 +10891,7 @@ }, { "kind": "slot", - "text": "education and health", + "text": "education, health, and population policy, programme, and reproductive health", "axis": "how", "segment": "heading", "property_dcid": "crsPurpose", @@ -9955,10 +11225,10 @@ "schema_version": 1, "input": { "kind": "spec_id", - "spec_id": "spec_25f482395c5d012ec278118f38dff29c", + "spec_id": "spec_7a02b6facd2dc17b5d0d7c35c11bf5d2", "definition": { "schema_version": 1, - "spec_id": "spec_25f482395c5d012ec278118f38dff29c", + "spec_id": "spec_7a02b6facd2dc17b5d0d7c35c11bf5d2", "identity": { "identity_version": "spec1", "shape": { @@ -9981,7 +11251,8 @@ "state": "set", "refs": [ "CRSPurposeCode110", - "CRSPurposeCode120" + "CRSPurposeCode120", + "CRSPurposeCode130" ] } }, @@ -10038,13 +11309,13 @@ "status": 200, "headers": { "content-type": "application/json", - "x-dfo-trace-id": "9b2918c16ee54353a38b2401d62c118a" + "x-dfo-trace-id": "557550d777fb412fa5e6e590fb30997c" }, "json": { "schema_version": 1, "definition": { "schema_version": 1, - "spec_id": "spec_25f482395c5d012ec278118f38dff29c", + "spec_id": "spec_7a02b6facd2dc17b5d0d7c35c11bf5d2", "identity": { "shape": { "kind": "statvar_schema", @@ -10064,7 +11335,8 @@ "binding": { "refs": [ "CRSPurposeCode110", - "CRSPurposeCode120" + "CRSPurposeCode120", + "CRSPurposeCode130" ], "state": "set" }, @@ -10112,10 +11384,10 @@ } } }, - "content_version": "cv_d6ce435ea267b46680c94eae9423d420", - "prepared_at": "2026-10-20T15:55:47Z", + "content_version": "cv_b600e3429190c07d98f8d59720cde7ba", + "prepared_at": "2026-10-29T22:25:13Z", "coverage": { - "rows": 512, + "rows": 593, "dimensions": [ { "label": "financingProvider", @@ -10171,8 +11443,8 @@ "source_data_url": "https://webfs-dcd.oecd.org/files/dotStat/DSD_CRS/CRS.parquet", "attribution": "OECD (2026), Creditor Reporting System (CRS), OECD Data Explorer, https://webfs-dcd.oecd.org/files/dotStat/DSD_CRS/CRS.parquet (accessed on 2026-10-15)", "update_cadence": "Quarterly", - "last_update": "2026-10-15", - "years_covered": "1973-2024", + "last_update": "2026-10-29", + "years_covered": "1973-2025", "granularity": "Annual, by provider and recipient", "currencies": [ "USD" @@ -10183,8 +11455,8 @@ "description": "The complete CRS file is downloaded from the OECD each time the pipeline runs, and replaces the previous copy, so the data reflects the OECD's latest release." }, { - "transformation": "Exclude the partial preliminary year", - "description": "Before each full release, the OECD publishes preliminary data for the year that release covers, as reporters submit it. Until then, that year is partial, so the pipeline excludes it. Support for partial years is in development. Partial years will be marked incomplete, so they don't lead to incorrect or confusing analyses." + "transformation": "Mark the partial year", + "description": "The OECD publishes data for a year as donors report it, and its final release in December of the following year covers every donor. Until then, the year is partial. The pipeline publishes it, and the import's provenance names it in `partialObservationDate`." }, { "transformation": "Exclude donor core contributions to multilaterals", @@ -10204,13 +11476,23 @@ } ], "version_history": [ + { + "date": "2026-10-29", + "title": "Partial year published, marked as partial", + "changes": [ + { + "kind": "changed", + "note": "The partial year, which only some donors have reported ahead of the OECD's final release in December, is included, and the import's provenance marks it with `partialObservationDate`." + } + ] + }, { "date": "2026-10-15", - "title": "Partial preliminary year excluded", + "title": "Partial year excluded", "changes": [ { "kind": "changed", - "note": "The partial preliminary year published ahead of the next full release is excluded." + "note": "The partial year, which only some donors have reported ahead of the OECD's final release in December, is excluded." } ] }, @@ -10256,21 +11538,21 @@ "end_year": 2024, "start_year": 1997 }, - "graph_revision": "dfo-dev-dc-datacommons-service-00259-rpx", + "graph_revision": "dfo-dev-dc-datacommons-service-00280-hww", "normalisations": [], "code_index_stamp": { - "exported_at": "2026-10-20T13:18:18Z", - "content_hash": "602c7022fc21c17540a6873d93196ad6b967eaae3e71f9dce6dec178a735daf4", + "exported_at": "2026-10-29T17:06:13Z", + "content_hash": "000e2f88c4c71cf9ae60911d71c97dbc43c13ccb291ef9ca3584d75157b97e9e", "graph_endpoint": "graph_release" }, "source_revisions": [ { "source": "provenance/OECDCreditorReportingSystem", - "revision": "2026-10-15" + "revision": "2026-10-29" } ], - "capability_version": "dset_1e6cd9546fac19e9", - "materialiser_build": "8408f1f95c622223f8fa6e9ba55826ee8e22a852", + "capability_version": "dset_9ab17ec0e311a676", + "materialiser_build": "822036e7baafeec121646d059962f75762f849db", "resolved_stat_vars": [ { "ref": "dcid:Amount_FinancialFlow_Gross_Disbursement_CRSTypeOfFlow10_CRSTypeOfFinance110_CRSCooperationModalityA01_CRSPurposeCode11330_Nominal", @@ -10504,6 +11786,46 @@ ], "observation_count": 0 }, + { + "ref": "dcid:Amount_FinancialFlow_Gross_Disbursement_CRSTypeOfFlow10_CRSTypeOfFinance110_CRSCooperationModalityA02_CRSPurposeCode13010_Nominal", + "roles": [ + "financingProvider", + "financingRecipient" + ], + "observation_count": 0 + }, + { + "ref": "dcid:Amount_FinancialFlow_Gross_Disbursement_CRSTypeOfFlow10_CRSTypeOfFinance110_CRSCooperationModalityA02_CRSPurposeCode13020_Nominal", + "roles": [ + "financingProvider", + "financingRecipient" + ], + "observation_count": 0 + }, + { + "ref": "dcid:Amount_FinancialFlow_Gross_Disbursement_CRSTypeOfFlow10_CRSTypeOfFinance110_CRSCooperationModalityA02_CRSPurposeCode13030_Nominal", + "roles": [ + "financingProvider", + "financingRecipient" + ], + "observation_count": 0 + }, + { + "ref": "dcid:Amount_FinancialFlow_Gross_Disbursement_CRSTypeOfFlow10_CRSTypeOfFinance110_CRSCooperationModalityA02_CRSPurposeCode13040_Nominal", + "roles": [ + "financingProvider", + "financingRecipient" + ], + "observation_count": 0 + }, + { + "ref": "dcid:Amount_FinancialFlow_Gross_Disbursement_CRSTypeOfFlow10_CRSTypeOfFinance110_CRSCooperationModalityA02_CRSPurposeCode13081_Nominal", + "roles": [ + "financingProvider", + "financingRecipient" + ], + "observation_count": 0 + }, { "ref": "dcid:Amount_FinancialFlow_Gross_Disbursement_CRSTypeOfFlow10_CRSTypeOfFinance110_CRSCooperationModalityB01_CRSPurposeCode11110_Nominal", "roles": [ @@ -10776,6 +12098,46 @@ ], "observation_count": 0 }, + { + "ref": "dcid:Amount_FinancialFlow_Gross_Disbursement_CRSTypeOfFlow10_CRSTypeOfFinance110_CRSCooperationModalityB01_CRSPurposeCode13010_Nominal", + "roles": [ + "financingProvider", + "financingRecipient" + ], + "observation_count": 0 + }, + { + "ref": "dcid:Amount_FinancialFlow_Gross_Disbursement_CRSTypeOfFlow10_CRSTypeOfFinance110_CRSCooperationModalityB01_CRSPurposeCode13020_Nominal", + "roles": [ + "financingProvider", + "financingRecipient" + ], + "observation_count": 3 + }, + { + "ref": "dcid:Amount_FinancialFlow_Gross_Disbursement_CRSTypeOfFlow10_CRSTypeOfFinance110_CRSCooperationModalityB01_CRSPurposeCode13030_Nominal", + "roles": [ + "financingProvider", + "financingRecipient" + ], + "observation_count": 3 + }, + { + "ref": "dcid:Amount_FinancialFlow_Gross_Disbursement_CRSTypeOfFlow10_CRSTypeOfFinance110_CRSCooperationModalityB01_CRSPurposeCode13040_Nominal", + "roles": [ + "financingProvider", + "financingRecipient" + ], + "observation_count": 4 + }, + { + "ref": "dcid:Amount_FinancialFlow_Gross_Disbursement_CRSTypeOfFlow10_CRSTypeOfFinance110_CRSCooperationModalityB01_CRSPurposeCode13081_Nominal", + "roles": [ + "financingProvider", + "financingRecipient" + ], + "observation_count": 0 + }, { "ref": "dcid:Amount_FinancialFlow_Gross_Disbursement_CRSTypeOfFlow10_CRSTypeOfFinance110_CRSCooperationModalityB031_CRSPurposeCode11110_Nominal", "roles": [ @@ -10960,6 +12322,46 @@ ], "observation_count": 0 }, + { + "ref": "dcid:Amount_FinancialFlow_Gross_Disbursement_CRSTypeOfFlow10_CRSTypeOfFinance110_CRSCooperationModalityB031_CRSPurposeCode13010_Nominal", + "roles": [ + "financingProvider", + "financingRecipient" + ], + "observation_count": 0 + }, + { + "ref": "dcid:Amount_FinancialFlow_Gross_Disbursement_CRSTypeOfFlow10_CRSTypeOfFinance110_CRSCooperationModalityB031_CRSPurposeCode13020_Nominal", + "roles": [ + "financingProvider", + "financingRecipient" + ], + "observation_count": 0 + }, + { + "ref": "dcid:Amount_FinancialFlow_Gross_Disbursement_CRSTypeOfFlow10_CRSTypeOfFinance110_CRSCooperationModalityB031_CRSPurposeCode13030_Nominal", + "roles": [ + "financingProvider", + "financingRecipient" + ], + "observation_count": 0 + }, + { + "ref": "dcid:Amount_FinancialFlow_Gross_Disbursement_CRSTypeOfFlow10_CRSTypeOfFinance110_CRSCooperationModalityB031_CRSPurposeCode13040_Nominal", + "roles": [ + "financingProvider", + "financingRecipient" + ], + "observation_count": 0 + }, + { + "ref": "dcid:Amount_FinancialFlow_Gross_Disbursement_CRSTypeOfFlow10_CRSTypeOfFinance110_CRSCooperationModalityB031_CRSPurposeCode13081_Nominal", + "roles": [ + "financingProvider", + "financingRecipient" + ], + "observation_count": 0 + }, { "ref": "dcid:Amount_FinancialFlow_Gross_Disbursement_CRSTypeOfFlow10_CRSTypeOfFinance110_CRSCooperationModalityB032_CRSPurposeCode11110_Nominal", "roles": [ @@ -11153,7 +12555,47 @@ "observation_count": 0 }, { - "ref": "dcid:Amount_FinancialFlow_Gross_Disbursement_CRSTypeOfFlow10_CRSTypeOfFinance110_CRSCooperationModalityB032_CRSPurposeCode12263_Nominal", + "ref": "dcid:Amount_FinancialFlow_Gross_Disbursement_CRSTypeOfFlow10_CRSTypeOfFinance110_CRSCooperationModalityB032_CRSPurposeCode12263_Nominal", + "roles": [ + "financingProvider", + "financingRecipient" + ], + "observation_count": 0 + }, + { + "ref": "dcid:Amount_FinancialFlow_Gross_Disbursement_CRSTypeOfFlow10_CRSTypeOfFinance110_CRSCooperationModalityB032_CRSPurposeCode12264_Nominal", + "roles": [ + "financingProvider", + "financingRecipient" + ], + "observation_count": 0 + }, + { + "ref": "dcid:Amount_FinancialFlow_Gross_Disbursement_CRSTypeOfFlow10_CRSTypeOfFinance110_CRSCooperationModalityB032_CRSPurposeCode12281_Nominal", + "roles": [ + "financingProvider", + "financingRecipient" + ], + "observation_count": 0 + }, + { + "ref": "dcid:Amount_FinancialFlow_Gross_Disbursement_CRSTypeOfFlow10_CRSTypeOfFinance110_CRSCooperationModalityB032_CRSPurposeCode12310_Nominal", + "roles": [ + "financingProvider", + "financingRecipient" + ], + "observation_count": 0 + }, + { + "ref": "dcid:Amount_FinancialFlow_Gross_Disbursement_CRSTypeOfFlow10_CRSTypeOfFinance110_CRSCooperationModalityB032_CRSPurposeCode12320_Nominal", + "roles": [ + "financingProvider", + "financingRecipient" + ], + "observation_count": 0 + }, + { + "ref": "dcid:Amount_FinancialFlow_Gross_Disbursement_CRSTypeOfFlow10_CRSTypeOfFinance110_CRSCooperationModalityB032_CRSPurposeCode12330_Nominal", "roles": [ "financingProvider", "financingRecipient" @@ -11161,7 +12603,7 @@ "observation_count": 0 }, { - "ref": "dcid:Amount_FinancialFlow_Gross_Disbursement_CRSTypeOfFlow10_CRSTypeOfFinance110_CRSCooperationModalityB032_CRSPurposeCode12264_Nominal", + "ref": "dcid:Amount_FinancialFlow_Gross_Disbursement_CRSTypeOfFlow10_CRSTypeOfFinance110_CRSCooperationModalityB032_CRSPurposeCode12340_Nominal", "roles": [ "financingProvider", "financingRecipient" @@ -11169,7 +12611,7 @@ "observation_count": 0 }, { - "ref": "dcid:Amount_FinancialFlow_Gross_Disbursement_CRSTypeOfFlow10_CRSTypeOfFinance110_CRSCooperationModalityB032_CRSPurposeCode12281_Nominal", + "ref": "dcid:Amount_FinancialFlow_Gross_Disbursement_CRSTypeOfFlow10_CRSTypeOfFinance110_CRSCooperationModalityB032_CRSPurposeCode12350_Nominal", "roles": [ "financingProvider", "financingRecipient" @@ -11177,7 +12619,7 @@ "observation_count": 0 }, { - "ref": "dcid:Amount_FinancialFlow_Gross_Disbursement_CRSTypeOfFlow10_CRSTypeOfFinance110_CRSCooperationModalityB032_CRSPurposeCode12310_Nominal", + "ref": "dcid:Amount_FinancialFlow_Gross_Disbursement_CRSTypeOfFlow10_CRSTypeOfFinance110_CRSCooperationModalityB032_CRSPurposeCode12382_Nominal", "roles": [ "financingProvider", "financingRecipient" @@ -11185,7 +12627,7 @@ "observation_count": 0 }, { - "ref": "dcid:Amount_FinancialFlow_Gross_Disbursement_CRSTypeOfFlow10_CRSTypeOfFinance110_CRSCooperationModalityB032_CRSPurposeCode12320_Nominal", + "ref": "dcid:Amount_FinancialFlow_Gross_Disbursement_CRSTypeOfFlow10_CRSTypeOfFinance110_CRSCooperationModalityB032_CRSPurposeCode13010_Nominal", "roles": [ "financingProvider", "financingRecipient" @@ -11193,7 +12635,7 @@ "observation_count": 0 }, { - "ref": "dcid:Amount_FinancialFlow_Gross_Disbursement_CRSTypeOfFlow10_CRSTypeOfFinance110_CRSCooperationModalityB032_CRSPurposeCode12330_Nominal", + "ref": "dcid:Amount_FinancialFlow_Gross_Disbursement_CRSTypeOfFlow10_CRSTypeOfFinance110_CRSCooperationModalityB032_CRSPurposeCode13020_Nominal", "roles": [ "financingProvider", "financingRecipient" @@ -11201,7 +12643,7 @@ "observation_count": 0 }, { - "ref": "dcid:Amount_FinancialFlow_Gross_Disbursement_CRSTypeOfFlow10_CRSTypeOfFinance110_CRSCooperationModalityB032_CRSPurposeCode12340_Nominal", + "ref": "dcid:Amount_FinancialFlow_Gross_Disbursement_CRSTypeOfFlow10_CRSTypeOfFinance110_CRSCooperationModalityB032_CRSPurposeCode13030_Nominal", "roles": [ "financingProvider", "financingRecipient" @@ -11209,7 +12651,7 @@ "observation_count": 0 }, { - "ref": "dcid:Amount_FinancialFlow_Gross_Disbursement_CRSTypeOfFlow10_CRSTypeOfFinance110_CRSCooperationModalityB032_CRSPurposeCode12350_Nominal", + "ref": "dcid:Amount_FinancialFlow_Gross_Disbursement_CRSTypeOfFlow10_CRSTypeOfFinance110_CRSCooperationModalityB032_CRSPurposeCode13040_Nominal", "roles": [ "financingProvider", "financingRecipient" @@ -11217,7 +12659,7 @@ "observation_count": 0 }, { - "ref": "dcid:Amount_FinancialFlow_Gross_Disbursement_CRSTypeOfFlow10_CRSTypeOfFinance110_CRSCooperationModalityB032_CRSPurposeCode12382_Nominal", + "ref": "dcid:Amount_FinancialFlow_Gross_Disbursement_CRSTypeOfFlow10_CRSTypeOfFinance110_CRSCooperationModalityB032_CRSPurposeCode13081_Nominal", "roles": [ "financingProvider", "financingRecipient" @@ -11464,6 +12906,38 @@ ], "observation_count": 0 }, + { + "ref": "dcid:Amount_FinancialFlow_Gross_Disbursement_CRSTypeOfFlow10_CRSTypeOfFinance110_CRSCooperationModalityB033_CRSPurposeCode13010_Nominal", + "roles": [ + "financingProvider", + "financingRecipient" + ], + "observation_count": 0 + }, + { + "ref": "dcid:Amount_FinancialFlow_Gross_Disbursement_CRSTypeOfFlow10_CRSTypeOfFinance110_CRSCooperationModalityB033_CRSPurposeCode13020_Nominal", + "roles": [ + "financingProvider", + "financingRecipient" + ], + "observation_count": 0 + }, + { + "ref": "dcid:Amount_FinancialFlow_Gross_Disbursement_CRSTypeOfFlow10_CRSTypeOfFinance110_CRSCooperationModalityB033_CRSPurposeCode13030_Nominal", + "roles": [ + "financingProvider", + "financingRecipient" + ], + "observation_count": 0 + }, + { + "ref": "dcid:Amount_FinancialFlow_Gross_Disbursement_CRSTypeOfFlow10_CRSTypeOfFinance110_CRSCooperationModalityB033_CRSPurposeCode13040_Nominal", + "roles": [ + "financingProvider", + "financingRecipient" + ], + "observation_count": 0 + }, { "ref": "dcid:Amount_FinancialFlow_Gross_Disbursement_CRSTypeOfFlow10_CRSTypeOfFinance110_CRSCooperationModalityB03_CRSPurposeCode11110_Nominal", "roles": [ @@ -11736,6 +13210,46 @@ ], "observation_count": 0 }, + { + "ref": "dcid:Amount_FinancialFlow_Gross_Disbursement_CRSTypeOfFlow10_CRSTypeOfFinance110_CRSCooperationModalityB03_CRSPurposeCode13010_Nominal", + "roles": [ + "financingProvider", + "financingRecipient" + ], + "observation_count": 0 + }, + { + "ref": "dcid:Amount_FinancialFlow_Gross_Disbursement_CRSTypeOfFlow10_CRSTypeOfFinance110_CRSCooperationModalityB03_CRSPurposeCode13020_Nominal", + "roles": [ + "financingProvider", + "financingRecipient" + ], + "observation_count": 1 + }, + { + "ref": "dcid:Amount_FinancialFlow_Gross_Disbursement_CRSTypeOfFlow10_CRSTypeOfFinance110_CRSCooperationModalityB03_CRSPurposeCode13030_Nominal", + "roles": [ + "financingProvider", + "financingRecipient" + ], + "observation_count": 0 + }, + { + "ref": "dcid:Amount_FinancialFlow_Gross_Disbursement_CRSTypeOfFlow10_CRSTypeOfFinance110_CRSCooperationModalityB03_CRSPurposeCode13040_Nominal", + "roles": [ + "financingProvider", + "financingRecipient" + ], + "observation_count": 2 + }, + { + "ref": "dcid:Amount_FinancialFlow_Gross_Disbursement_CRSTypeOfFlow10_CRSTypeOfFinance110_CRSCooperationModalityB03_CRSPurposeCode13081_Nominal", + "roles": [ + "financingProvider", + "financingRecipient" + ], + "observation_count": 1 + }, { "ref": "dcid:Amount_FinancialFlow_Gross_Disbursement_CRSTypeOfFlow10_CRSTypeOfFinance110_CRSCooperationModalityB04_CRSPurposeCode11110_Nominal", "roles": [ @@ -11960,6 +13474,46 @@ ], "observation_count": 0 }, + { + "ref": "dcid:Amount_FinancialFlow_Gross_Disbursement_CRSTypeOfFlow10_CRSTypeOfFinance110_CRSCooperationModalityB04_CRSPurposeCode13010_Nominal", + "roles": [ + "financingProvider", + "financingRecipient" + ], + "observation_count": 0 + }, + { + "ref": "dcid:Amount_FinancialFlow_Gross_Disbursement_CRSTypeOfFlow10_CRSTypeOfFinance110_CRSCooperationModalityB04_CRSPurposeCode13020_Nominal", + "roles": [ + "financingProvider", + "financingRecipient" + ], + "observation_count": 0 + }, + { + "ref": "dcid:Amount_FinancialFlow_Gross_Disbursement_CRSTypeOfFlow10_CRSTypeOfFinance110_CRSCooperationModalityB04_CRSPurposeCode13030_Nominal", + "roles": [ + "financingProvider", + "financingRecipient" + ], + "observation_count": 0 + }, + { + "ref": "dcid:Amount_FinancialFlow_Gross_Disbursement_CRSTypeOfFlow10_CRSTypeOfFinance110_CRSCooperationModalityB04_CRSPurposeCode13040_Nominal", + "roles": [ + "financingProvider", + "financingRecipient" + ], + "observation_count": 0 + }, + { + "ref": "dcid:Amount_FinancialFlow_Gross_Disbursement_CRSTypeOfFlow10_CRSTypeOfFinance110_CRSCooperationModalityB04_CRSPurposeCode13081_Nominal", + "roles": [ + "financingProvider", + "financingRecipient" + ], + "observation_count": 0 + }, { "ref": "dcid:Amount_FinancialFlow_Gross_Disbursement_CRSTypeOfFlow10_CRSTypeOfFinance110_CRSCooperationModalityC01_CRSPurposeCode11110_Nominal", "roles": [ @@ -12232,6 +13786,46 @@ ], "observation_count": 0 }, + { + "ref": "dcid:Amount_FinancialFlow_Gross_Disbursement_CRSTypeOfFlow10_CRSTypeOfFinance110_CRSCooperationModalityC01_CRSPurposeCode13010_Nominal", + "roles": [ + "financingProvider", + "financingRecipient" + ], + "observation_count": 0 + }, + { + "ref": "dcid:Amount_FinancialFlow_Gross_Disbursement_CRSTypeOfFlow10_CRSTypeOfFinance110_CRSCooperationModalityC01_CRSPurposeCode13020_Nominal", + "roles": [ + "financingProvider", + "financingRecipient" + ], + "observation_count": 19 + }, + { + "ref": "dcid:Amount_FinancialFlow_Gross_Disbursement_CRSTypeOfFlow10_CRSTypeOfFinance110_CRSCooperationModalityC01_CRSPurposeCode13030_Nominal", + "roles": [ + "financingProvider", + "financingRecipient" + ], + "observation_count": 8 + }, + { + "ref": "dcid:Amount_FinancialFlow_Gross_Disbursement_CRSTypeOfFlow10_CRSTypeOfFinance110_CRSCooperationModalityC01_CRSPurposeCode13040_Nominal", + "roles": [ + "financingProvider", + "financingRecipient" + ], + "observation_count": 10 + }, + { + "ref": "dcid:Amount_FinancialFlow_Gross_Disbursement_CRSTypeOfFlow10_CRSTypeOfFinance110_CRSCooperationModalityC01_CRSPurposeCode13081_Nominal", + "roles": [ + "financingProvider", + "financingRecipient" + ], + "observation_count": 0 + }, { "ref": "dcid:Amount_FinancialFlow_Gross_Disbursement_CRSTypeOfFlow10_CRSTypeOfFinance110_CRSCooperationModalityD01_CRSPurposeCode11110_Nominal", "roles": [ @@ -12504,6 +14098,46 @@ ], "observation_count": 0 }, + { + "ref": "dcid:Amount_FinancialFlow_Gross_Disbursement_CRSTypeOfFlow10_CRSTypeOfFinance110_CRSCooperationModalityD01_CRSPurposeCode13010_Nominal", + "roles": [ + "financingProvider", + "financingRecipient" + ], + "observation_count": 0 + }, + { + "ref": "dcid:Amount_FinancialFlow_Gross_Disbursement_CRSTypeOfFlow10_CRSTypeOfFinance110_CRSCooperationModalityD01_CRSPurposeCode13020_Nominal", + "roles": [ + "financingProvider", + "financingRecipient" + ], + "observation_count": 0 + }, + { + "ref": "dcid:Amount_FinancialFlow_Gross_Disbursement_CRSTypeOfFlow10_CRSTypeOfFinance110_CRSCooperationModalityD01_CRSPurposeCode13030_Nominal", + "roles": [ + "financingProvider", + "financingRecipient" + ], + "observation_count": 0 + }, + { + "ref": "dcid:Amount_FinancialFlow_Gross_Disbursement_CRSTypeOfFlow10_CRSTypeOfFinance110_CRSCooperationModalityD01_CRSPurposeCode13040_Nominal", + "roles": [ + "financingProvider", + "financingRecipient" + ], + "observation_count": 2 + }, + { + "ref": "dcid:Amount_FinancialFlow_Gross_Disbursement_CRSTypeOfFlow10_CRSTypeOfFinance110_CRSCooperationModalityD01_CRSPurposeCode13081_Nominal", + "roles": [ + "financingProvider", + "financingRecipient" + ], + "observation_count": 0 + }, { "ref": "dcid:Amount_FinancialFlow_Gross_Disbursement_CRSTypeOfFlow10_CRSTypeOfFinance110_CRSCooperationModalityD02_CRSPurposeCode11110_Nominal", "roles": [ @@ -12776,6 +14410,46 @@ ], "observation_count": 0 }, + { + "ref": "dcid:Amount_FinancialFlow_Gross_Disbursement_CRSTypeOfFlow10_CRSTypeOfFinance110_CRSCooperationModalityD02_CRSPurposeCode13010_Nominal", + "roles": [ + "financingProvider", + "financingRecipient" + ], + "observation_count": 0 + }, + { + "ref": "dcid:Amount_FinancialFlow_Gross_Disbursement_CRSTypeOfFlow10_CRSTypeOfFinance110_CRSCooperationModalityD02_CRSPurposeCode13020_Nominal", + "roles": [ + "financingProvider", + "financingRecipient" + ], + "observation_count": 1 + }, + { + "ref": "dcid:Amount_FinancialFlow_Gross_Disbursement_CRSTypeOfFlow10_CRSTypeOfFinance110_CRSCooperationModalityD02_CRSPurposeCode13030_Nominal", + "roles": [ + "financingProvider", + "financingRecipient" + ], + "observation_count": 0 + }, + { + "ref": "dcid:Amount_FinancialFlow_Gross_Disbursement_CRSTypeOfFlow10_CRSTypeOfFinance110_CRSCooperationModalityD02_CRSPurposeCode13040_Nominal", + "roles": [ + "financingProvider", + "financingRecipient" + ], + "observation_count": 2 + }, + { + "ref": "dcid:Amount_FinancialFlow_Gross_Disbursement_CRSTypeOfFlow10_CRSTypeOfFinance110_CRSCooperationModalityD02_CRSPurposeCode13081_Nominal", + "roles": [ + "financingProvider", + "financingRecipient" + ], + "observation_count": 0 + }, { "ref": "dcid:Amount_FinancialFlow_Gross_Disbursement_CRSTypeOfFlow10_CRSTypeOfFinance110_CRSCooperationModalityE01_CRSPurposeCode11110_Nominal", "roles": [ @@ -12945,7 +14619,47 @@ "observation_count": 0 }, { - "ref": "dcid:Amount_FinancialFlow_Gross_Disbursement_CRSTypeOfFlow10_CRSTypeOfFinance110_CRSCooperationModalityE01_CRSPurposeCode12261_Nominal", + "ref": "dcid:Amount_FinancialFlow_Gross_Disbursement_CRSTypeOfFlow10_CRSTypeOfFinance110_CRSCooperationModalityE01_CRSPurposeCode12261_Nominal", + "roles": [ + "financingProvider", + "financingRecipient" + ], + "observation_count": 0 + }, + { + "ref": "dcid:Amount_FinancialFlow_Gross_Disbursement_CRSTypeOfFlow10_CRSTypeOfFinance110_CRSCooperationModalityE01_CRSPurposeCode12262_Nominal", + "roles": [ + "financingProvider", + "financingRecipient" + ], + "observation_count": 0 + }, + { + "ref": "dcid:Amount_FinancialFlow_Gross_Disbursement_CRSTypeOfFlow10_CRSTypeOfFinance110_CRSCooperationModalityE01_CRSPurposeCode12264_Nominal", + "roles": [ + "financingProvider", + "financingRecipient" + ], + "observation_count": 0 + }, + { + "ref": "dcid:Amount_FinancialFlow_Gross_Disbursement_CRSTypeOfFlow10_CRSTypeOfFinance110_CRSCooperationModalityE01_CRSPurposeCode12281_Nominal", + "roles": [ + "financingProvider", + "financingRecipient" + ], + "observation_count": 0 + }, + { + "ref": "dcid:Amount_FinancialFlow_Gross_Disbursement_CRSTypeOfFlow10_CRSTypeOfFinance110_CRSCooperationModalityE01_CRSPurposeCode12310_Nominal", + "roles": [ + "financingProvider", + "financingRecipient" + ], + "observation_count": 0 + }, + { + "ref": "dcid:Amount_FinancialFlow_Gross_Disbursement_CRSTypeOfFlow10_CRSTypeOfFinance110_CRSCooperationModalityE01_CRSPurposeCode12340_Nominal", "roles": [ "financingProvider", "financingRecipient" @@ -12953,7 +14667,7 @@ "observation_count": 0 }, { - "ref": "dcid:Amount_FinancialFlow_Gross_Disbursement_CRSTypeOfFlow10_CRSTypeOfFinance110_CRSCooperationModalityE01_CRSPurposeCode12262_Nominal", + "ref": "dcid:Amount_FinancialFlow_Gross_Disbursement_CRSTypeOfFlow10_CRSTypeOfFinance110_CRSCooperationModalityE01_CRSPurposeCode12382_Nominal", "roles": [ "financingProvider", "financingRecipient" @@ -12961,7 +14675,7 @@ "observation_count": 0 }, { - "ref": "dcid:Amount_FinancialFlow_Gross_Disbursement_CRSTypeOfFlow10_CRSTypeOfFinance110_CRSCooperationModalityE01_CRSPurposeCode12264_Nominal", + "ref": "dcid:Amount_FinancialFlow_Gross_Disbursement_CRSTypeOfFlow10_CRSTypeOfFinance110_CRSCooperationModalityE01_CRSPurposeCode13010_Nominal", "roles": [ "financingProvider", "financingRecipient" @@ -12969,7 +14683,7 @@ "observation_count": 0 }, { - "ref": "dcid:Amount_FinancialFlow_Gross_Disbursement_CRSTypeOfFlow10_CRSTypeOfFinance110_CRSCooperationModalityE01_CRSPurposeCode12281_Nominal", + "ref": "dcid:Amount_FinancialFlow_Gross_Disbursement_CRSTypeOfFlow10_CRSTypeOfFinance110_CRSCooperationModalityE01_CRSPurposeCode13020_Nominal", "roles": [ "financingProvider", "financingRecipient" @@ -12977,7 +14691,7 @@ "observation_count": 0 }, { - "ref": "dcid:Amount_FinancialFlow_Gross_Disbursement_CRSTypeOfFlow10_CRSTypeOfFinance110_CRSCooperationModalityE01_CRSPurposeCode12310_Nominal", + "ref": "dcid:Amount_FinancialFlow_Gross_Disbursement_CRSTypeOfFlow10_CRSTypeOfFinance110_CRSCooperationModalityE01_CRSPurposeCode13030_Nominal", "roles": [ "financingProvider", "financingRecipient" @@ -12985,7 +14699,7 @@ "observation_count": 0 }, { - "ref": "dcid:Amount_FinancialFlow_Gross_Disbursement_CRSTypeOfFlow10_CRSTypeOfFinance110_CRSCooperationModalityE01_CRSPurposeCode12340_Nominal", + "ref": "dcid:Amount_FinancialFlow_Gross_Disbursement_CRSTypeOfFlow10_CRSTypeOfFinance110_CRSCooperationModalityE01_CRSPurposeCode13040_Nominal", "roles": [ "financingProvider", "financingRecipient" @@ -12993,7 +14707,7 @@ "observation_count": 0 }, { - "ref": "dcid:Amount_FinancialFlow_Gross_Disbursement_CRSTypeOfFlow10_CRSTypeOfFinance110_CRSCooperationModalityE01_CRSPurposeCode12382_Nominal", + "ref": "dcid:Amount_FinancialFlow_Gross_Disbursement_CRSTypeOfFlow10_CRSTypeOfFinance110_CRSCooperationModalityE01_CRSPurposeCode13081_Nominal", "roles": [ "financingProvider", "financingRecipient" @@ -13320,6 +15034,30 @@ ], "observation_count": 0 }, + { + "ref": "dcid:Amount_FinancialFlow_Gross_Disbursement_CRSTypeOfFlow10_CRSTypeOfFinance110_CRSCooperationModalityG01_CRSPurposeCode13010_Nominal", + "roles": [ + "financingProvider", + "financingRecipient" + ], + "observation_count": 0 + }, + { + "ref": "dcid:Amount_FinancialFlow_Gross_Disbursement_CRSTypeOfFlow10_CRSTypeOfFinance110_CRSCooperationModalityG01_CRSPurposeCode13020_Nominal", + "roles": [ + "financingProvider", + "financingRecipient" + ], + "observation_count": 0 + }, + { + "ref": "dcid:Amount_FinancialFlow_Gross_Disbursement_CRSTypeOfFlow10_CRSTypeOfFinance110_CRSCooperationModalityG01_CRSPurposeCode13040_Nominal", + "roles": [ + "financingProvider", + "financingRecipient" + ], + "observation_count": 0 + }, { "ref": "dcid:Amount_FinancialFlow_Gross_Disbursement_CRSTypeOfFlow10_CRSTypeOfFinance110_CRSCooperationModalityH01_CRSPurposeCode11110_Nominal", "roles": [ @@ -13456,6 +15194,38 @@ ], "observation_count": 0 }, + { + "ref": "dcid:Amount_FinancialFlow_Gross_Disbursement_CRSTypeOfFlow10_CRSTypeOfFinance110_CRSCooperationModalityH01_CRSPurposeCode13010_Nominal", + "roles": [ + "financingProvider", + "financingRecipient" + ], + "observation_count": 0 + }, + { + "ref": "dcid:Amount_FinancialFlow_Gross_Disbursement_CRSTypeOfFlow10_CRSTypeOfFinance110_CRSCooperationModalityH01_CRSPurposeCode13020_Nominal", + "roles": [ + "financingProvider", + "financingRecipient" + ], + "observation_count": 0 + }, + { + "ref": "dcid:Amount_FinancialFlow_Gross_Disbursement_CRSTypeOfFlow10_CRSTypeOfFinance110_CRSCooperationModalityH01_CRSPurposeCode13030_Nominal", + "roles": [ + "financingProvider", + "financingRecipient" + ], + "observation_count": 0 + }, + { + "ref": "dcid:Amount_FinancialFlow_Gross_Disbursement_CRSTypeOfFlow10_CRSTypeOfFinance110_CRSCooperationModalityH01_CRSPurposeCode13040_Nominal", + "roles": [ + "financingProvider", + "financingRecipient" + ], + "observation_count": 0 + }, { "ref": "dcid:Amount_FinancialFlow_Gross_Disbursement_CRSTypeOfFlow10_CRSTypeOfFinance110_CRSCooperationModalityH02_CRSPurposeCode12191_Nominal", "roles": [ @@ -13464,6 +15234,22 @@ ], "observation_count": 0 }, + { + "ref": "dcid:Amount_FinancialFlow_Gross_Disbursement_CRSTypeOfFlow10_CRSTypeOfFinance110_CRSCooperationModalityJ01_CRSPurposeCode12191_Nominal", + "roles": [ + "financingProvider", + "financingRecipient" + ], + "observation_count": 0 + }, + { + "ref": "dcid:Amount_FinancialFlow_Gross_Disbursement_CRSTypeOfFlow10_CRSTypeOfFinance110_CRSCooperationModalityJ01_CRSPurposeCode12264_Nominal", + "roles": [ + "financingProvider", + "financingRecipient" + ], + "observation_count": 0 + }, { "ref": "dcid:Amount_FinancialFlow_Gross_Disbursement_CRSTypeOfFlow10_CRSTypeOfFinance110_CRSPurposeCode11110_Nominal", "roles": [ @@ -13648,6 +15434,46 @@ ], "observation_count": 6 }, + { + "ref": "dcid:Amount_FinancialFlow_Gross_Disbursement_CRSTypeOfFlow10_CRSTypeOfFinance110_CRSPurposeCode13010_Nominal", + "roles": [ + "financingProvider", + "financingRecipient" + ], + "observation_count": 0 + }, + { + "ref": "dcid:Amount_FinancialFlow_Gross_Disbursement_CRSTypeOfFlow10_CRSTypeOfFinance110_CRSPurposeCode13020_Nominal", + "roles": [ + "financingProvider", + "financingRecipient" + ], + "observation_count": 7 + }, + { + "ref": "dcid:Amount_FinancialFlow_Gross_Disbursement_CRSTypeOfFlow10_CRSTypeOfFinance110_CRSPurposeCode13030_Nominal", + "roles": [ + "financingProvider", + "financingRecipient" + ], + "observation_count": 5 + }, + { + "ref": "dcid:Amount_FinancialFlow_Gross_Disbursement_CRSTypeOfFlow10_CRSTypeOfFinance110_CRSPurposeCode13040_Nominal", + "roles": [ + "financingProvider", + "financingRecipient" + ], + "observation_count": 13 + }, + { + "ref": "dcid:Amount_FinancialFlow_Gross_Disbursement_CRSTypeOfFlow10_CRSTypeOfFinance110_CRSPurposeCode13081_Nominal", + "roles": [ + "financingProvider", + "financingRecipient" + ], + "observation_count": 0 + }, { "ref": "dcid:Amount_FinancialFlow_Gross_Disbursement_CRSTypeOfFlow10_CRSTypeOfFinance210_CRSCooperationModalityC01_CRSPurposeCode11120_Nominal", "roles": [ @@ -13760,6 +15586,30 @@ ], "observation_count": 0 }, + { + "ref": "dcid:Amount_FinancialFlow_Gross_Disbursement_CRSTypeOfFlow10_CRSTypeOfFinance210_CRSCooperationModalityC01_CRSPurposeCode13010_Nominal", + "roles": [ + "financingProvider", + "financingRecipient" + ], + "observation_count": 0 + }, + { + "ref": "dcid:Amount_FinancialFlow_Gross_Disbursement_CRSTypeOfFlow10_CRSTypeOfFinance210_CRSCooperationModalityC01_CRSPurposeCode13020_Nominal", + "roles": [ + "financingProvider", + "financingRecipient" + ], + "observation_count": 0 + }, + { + "ref": "dcid:Amount_FinancialFlow_Gross_Disbursement_CRSTypeOfFlow10_CRSTypeOfFinance210_CRSCooperationModalityC01_CRSPurposeCode13030_Nominal", + "roles": [ + "financingProvider", + "financingRecipient" + ], + "observation_count": 0 + }, { "ref": "dcid:Amount_FinancialFlow_Gross_Disbursement_CRSTypeOfFlow10_CRSTypeOfFinance421_CRSCooperationModalityA01_CRSPurposeCode11110_Nominal", "roles": [ @@ -13832,6 +15682,22 @@ ], "observation_count": 0 }, + { + "ref": "dcid:Amount_FinancialFlow_Gross_Disbursement_CRSTypeOfFlow10_CRSTypeOfFinance421_CRSCooperationModalityA01_CRSPurposeCode13020_Nominal", + "roles": [ + "financingProvider", + "financingRecipient" + ], + "observation_count": 0 + }, + { + "ref": "dcid:Amount_FinancialFlow_Gross_Disbursement_CRSTypeOfFlow10_CRSTypeOfFinance421_CRSCooperationModalityA01_CRSPurposeCode13040_Nominal", + "roles": [ + "financingProvider", + "financingRecipient" + ], + "observation_count": 0 + }, { "ref": "dcid:Amount_FinancialFlow_Gross_Disbursement_CRSTypeOfFlow10_CRSTypeOfFinance421_CRSCooperationModalityA02_CRSPurposeCode11110_Nominal", "roles": [ @@ -14000,6 +15866,38 @@ ], "observation_count": 0 }, + { + "ref": "dcid:Amount_FinancialFlow_Gross_Disbursement_CRSTypeOfFlow10_CRSTypeOfFinance421_CRSCooperationModalityA02_CRSPurposeCode13010_Nominal", + "roles": [ + "financingProvider", + "financingRecipient" + ], + "observation_count": 0 + }, + { + "ref": "dcid:Amount_FinancialFlow_Gross_Disbursement_CRSTypeOfFlow10_CRSTypeOfFinance421_CRSCooperationModalityA02_CRSPurposeCode13020_Nominal", + "roles": [ + "financingProvider", + "financingRecipient" + ], + "observation_count": 0 + }, + { + "ref": "dcid:Amount_FinancialFlow_Gross_Disbursement_CRSTypeOfFlow10_CRSTypeOfFinance421_CRSCooperationModalityA02_CRSPurposeCode13030_Nominal", + "roles": [ + "financingProvider", + "financingRecipient" + ], + "observation_count": 0 + }, + { + "ref": "dcid:Amount_FinancialFlow_Gross_Disbursement_CRSTypeOfFlow10_CRSTypeOfFinance421_CRSCooperationModalityA02_CRSPurposeCode13040_Nominal", + "roles": [ + "financingProvider", + "financingRecipient" + ], + "observation_count": 0 + }, { "ref": "dcid:Amount_FinancialFlow_Gross_Disbursement_CRSTypeOfFlow10_CRSTypeOfFinance421_CRSCooperationModalityB031_CRSPurposeCode12110_Nominal", "roles": [ @@ -14280,6 +16178,46 @@ ], "observation_count": 0 }, + { + "ref": "dcid:Amount_FinancialFlow_Gross_Disbursement_CRSTypeOfFlow10_CRSTypeOfFinance421_CRSCooperationModalityC01_CRSPurposeCode13010_Nominal", + "roles": [ + "financingProvider", + "financingRecipient" + ], + "observation_count": 0 + }, + { + "ref": "dcid:Amount_FinancialFlow_Gross_Disbursement_CRSTypeOfFlow10_CRSTypeOfFinance421_CRSCooperationModalityC01_CRSPurposeCode13020_Nominal", + "roles": [ + "financingProvider", + "financingRecipient" + ], + "observation_count": 0 + }, + { + "ref": "dcid:Amount_FinancialFlow_Gross_Disbursement_CRSTypeOfFlow10_CRSTypeOfFinance421_CRSCooperationModalityC01_CRSPurposeCode13030_Nominal", + "roles": [ + "financingProvider", + "financingRecipient" + ], + "observation_count": 0 + }, + { + "ref": "dcid:Amount_FinancialFlow_Gross_Disbursement_CRSTypeOfFlow10_CRSTypeOfFinance421_CRSCooperationModalityC01_CRSPurposeCode13040_Nominal", + "roles": [ + "financingProvider", + "financingRecipient" + ], + "observation_count": 0 + }, + { + "ref": "dcid:Amount_FinancialFlow_Gross_Disbursement_CRSTypeOfFlow10_CRSTypeOfFinance421_CRSCooperationModalityC01_CRSPurposeCode13081_Nominal", + "roles": [ + "financingProvider", + "financingRecipient" + ], + "observation_count": 0 + }, { "ref": "dcid:Amount_FinancialFlow_Gross_Disbursement_CRSTypeOfFlow10_CRSTypeOfFinance421_CRSCooperationModalityE01_CRSPurposeCode11420_Nominal", "roles": [ @@ -14456,6 +16394,38 @@ ], "observation_count": 0 }, + { + "ref": "dcid:Amount_FinancialFlow_Gross_Disbursement_CRSTypeOfFlow10_CRSTypeOfFinance421_CRSPurposeCode13010_Nominal", + "roles": [ + "financingProvider", + "financingRecipient" + ], + "observation_count": 0 + }, + { + "ref": "dcid:Amount_FinancialFlow_Gross_Disbursement_CRSTypeOfFlow10_CRSTypeOfFinance421_CRSPurposeCode13020_Nominal", + "roles": [ + "financingProvider", + "financingRecipient" + ], + "observation_count": 0 + }, + { + "ref": "dcid:Amount_FinancialFlow_Gross_Disbursement_CRSTypeOfFlow10_CRSTypeOfFinance421_CRSPurposeCode13030_Nominal", + "roles": [ + "financingProvider", + "financingRecipient" + ], + "observation_count": 0 + }, + { + "ref": "dcid:Amount_FinancialFlow_Gross_Disbursement_CRSTypeOfFlow10_CRSTypeOfFinance421_CRSPurposeCode13040_Nominal", + "roles": [ + "financingProvider", + "financingRecipient" + ], + "observation_count": 0 + }, { "ref": "dcid:Amount_FinancialFlow_Gross_Disbursement_CRSTypeOfFlow10_CRSTypeOfFinance422_CRSCooperationModalityE01_CRSPurposeCode11420_Nominal", "roles": [ @@ -14552,6 +16522,30 @@ ], "observation_count": 0 }, + { + "ref": "dcid:Amount_FinancialFlow_Gross_Disbursement_CRSTypeOfFlow10_CRSTypeOfFinance510_CRSCooperationModalityC01_CRSPurposeCode13020_Nominal", + "roles": [ + "financingProvider", + "financingRecipient" + ], + "observation_count": 0 + }, + { + "ref": "dcid:Amount_FinancialFlow_Gross_Disbursement_CRSTypeOfFlow10_CRSTypeOfFinance510_CRSCooperationModalityC01_CRSPurposeCode13030_Nominal", + "roles": [ + "financingProvider", + "financingRecipient" + ], + "observation_count": 0 + }, + { + "ref": "dcid:Amount_FinancialFlow_Gross_Disbursement_CRSTypeOfFlow10_CRSTypeOfFinance510_CRSCooperationModalityC01_CRSPurposeCode13040_Nominal", + "roles": [ + "financingProvider", + "financingRecipient" + ], + "observation_count": 0 + }, { "ref": "dcid:Amount_FinancialFlow_Gross_Disbursement_CRSTypeOfFlow10_CRSTypeOfFinance510_CRSPurposeCode11110_Nominal", "roles": [ @@ -14633,12 +16627,12 @@ "observation_count": 0 } ], - "family_member_count": 545, - "family_member_digest": "0c7508fd1997d6cdc896f2eab0f092a4915cfca9e2400eb9577bb22b527fe882", + "family_member_count": 634, + "family_member_digest": "5c91c0a8d90f4619a1ff7122cacdc8b0bc48b22c70516d7673aec42caf6da0d4", "frame_grammar_version": "1.1.0", - "origin_catalogue_build_id": "20261019T174519Z-2e5e8cfd", - "served_from": "head", - "confirmed_at": "2026-10-26T09:18:03.336477+00:00" + "origin_catalogue_build_id": "20261029T171521Z-7d0a5854", + "served_from": "materialise", + "confirmed_at": "2026-11-01T07:37:38.826442+00:00" }, "warnings": [], "diagnostics": [ @@ -14650,41 +16644,41 @@ ], "artifacts": [ { - "artifact_digest": "sha256:a189b171faab41729ddc1317add46add9b5eefb5fcac62a98cb735cb5f20f0f8", + "artifact_digest": "sha256:228f4a6d447c0e6a811c951c10522dda47f68ae38efede7be384c4c7e7d6f2d2", "rendering": { "bundle": false, "format": "parquet", "layout": 4, "without_party_totals": true }, - "bytes": 16208, + "bytes": 17220, "media_type": "application/vnd.apache.parquet", - "created_at": "2026-10-23T16:58:41.714148+00:00", + "created_at": "2026-10-29T22:25:13.591902+00:00", "tier": "working", - "url": "/api/datasets/spec_25f482395c5d012ec278118f38dff29c/cv_d6ce435ea267b46680c94eae9423d420/files/sha256:a189b171faab41729ddc1317add46add9b5eefb5fcac62a98cb735cb5f20f0f8", - "enrichment_stamp": "08ed6c734fc69ea2204a21f4e1dd8b963f14dd1e03a2484c618049ac2e2d93d8" + "url": "/api/datasets/spec_7a02b6facd2dc17b5d0d7c35c11bf5d2/cv_b600e3429190c07d98f8d59720cde7ba/files/sha256:228f4a6d447c0e6a811c951c10522dda47f68ae38efede7be384c4c7e7d6f2d2", + "enrichment_stamp": "55887b871f7aa1c5d120cb2bee97086605351d5acfbec645ab027f562d0f65c5" }, { - "artifact_digest": "sha256:a5d2d7627c8fe1357519ca0ac021c791182ab08c76f44e8055b4bb50a6059179", + "artifact_digest": "sha256:46ec27bbc997b14d9d27305b59ebea27b24147358398f60652b1383a4a3da043", "rendering": { "statistics": "series" }, - "bytes": 11612, + "bytes": 12381, "media_type": "application/vnd.apache.parquet", - "created_at": "2026-10-20T15:55:47.734234+00:00", + "created_at": "2026-10-29T22:25:13.591902+00:00", "tier": "working", - "url": "/api/datasets/spec_25f482395c5d012ec278118f38dff29c/cv_d6ce435ea267b46680c94eae9423d420/files/sha256:a5d2d7627c8fe1357519ca0ac021c791182ab08c76f44e8055b4bb50a6059179" + "url": "/api/datasets/spec_7a02b6facd2dc17b5d0d7c35c11bf5d2/cv_b600e3429190c07d98f8d59720cde7ba/files/sha256:46ec27bbc997b14d9d27305b59ebea27b24147358398f60652b1383a4a3da043" } ], - "series_count": 108, + "series_count": 123, "output_options": { - "capability_version": "dset_76f5fa7244511c58", + "capability_version": "dset_5282a0674178a233", "columns": [ { "name": "stat_var", "kind": "grain", "droppable": false, - "distinct": 108 + "distinct": 123 }, { "name": "financingProvider", @@ -14761,7 +16755,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": false }, { "column": "financingProvider", @@ -14773,7 +16768,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": false }, { "column": "financingProvider", @@ -14785,7 +16781,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true }, { "column": "financingProvider", @@ -14797,7 +16794,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": false }, { "column": "financingProvider", @@ -14809,7 +16807,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true }, { "column": "financingProvider", @@ -14821,7 +16820,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true }, { "column": "financingProvider", @@ -14833,7 +16833,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true }, { "column": "financingRecipient", @@ -14845,7 +16846,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": false }, { "column": "financingRecipient", @@ -14857,7 +16859,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": false }, { "column": "financingRecipient", @@ -14869,7 +16872,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true }, { "column": "financingRecipient", @@ -14881,7 +16885,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": false }, { "column": "financingRecipient", @@ -14893,7 +16898,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true }, { "column": "financingRecipient", @@ -14905,7 +16911,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true }, { "column": "financingRecipient", @@ -14917,7 +16924,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true } ], "long_layout_defaults": [ @@ -14933,14 +16941,14 @@ "columns": "time_period", "state": "available", "width": 29, - "cells": 3132 + "cells": 3567 }, { "index": "time_period", "columns": "stat_var", "state": "available", - "width": 109, - "cells": 3052 + "width": 124, + "cells": 3472 } ], "groupby": { @@ -14961,10 +16969,10 @@ ] } }, - "series_coverage_stamp": "e6e717ab8c77e84d010915893ede5809e9ecec67929a07cfafbcc2210edfa1eb", + "series_coverage_stamp": "ad27fd11738abb03d2d84dc214e223f04781609636cf678d0d08c385fb863d99", "retention": { "pinned": false, - "held_until": "2026-11-19T15:55:47.734809Z" + "held_until": "2026-11-28T22:25:13.592229Z" } } } @@ -14972,21 +16980,21 @@ { "request": { "method": "GET", - "origin_path": "/api/datasets/spec_25f482395c5d012ec278118f38dff29c/cv_d6ce435ea267b46680c94eae9423d420/files/sha256:a189b171faab41729ddc1317add46add9b5eefb5fcac62a98cb735cb5f20f0f8" + "origin_path": "/api/datasets/spec_7a02b6facd2dc17b5d0d7c35c11bf5d2/cv_b600e3429190c07d98f8d59720cde7ba/files/sha256:228f4a6d447c0e6a811c951c10522dda47f68ae38efede7be384c4c7e7d6f2d2" }, "response": { "status": 302, "headers": { "content-type": "text/html", - "location": "https://storage.googleapis.com/dev-fin-observatory-datasets-working/sha256%3Aa189b171faab41729ddc1317add46add9b5eefb5fcac62a98cb735cb5f20f0f8?X-Goog-Signature=redacted", - "x-dfo-trace-id": "b06362d84bb845e786735d92808b1b48" + "location": "https://storage.googleapis.com/dev-fin-observatory-datasets-working/sha256%3A228f4a6d447c0e6a811c951c10522dda47f68ae38efede7be384c4c7e7d6f2d2?X-Goog-Signature=redacted", + "x-dfo-trace-id": "ba92a42f29eb49f5bdb4cbdd7c047cb4" } } }, { "request": { "method": "GET", - "url": "https://storage.googleapis.com/dev-fin-observatory-datasets-working/sha256%3Aa189b171faab41729ddc1317add46add9b5eefb5fcac62a98cb735cb5f20f0f8?X-Goog-Signature=redacted" + "url": "https://storage.googleapis.com/dev-fin-observatory-datasets-working/sha256%3A228f4a6d447c0e6a811c951c10522dda47f68ae38efede7be384c4c7e7d6f2d2?X-Goog-Signature=redacted" }, "response": { "status": 200, @@ -15073,7 +17081,7 @@ "status": 200, "headers": { "content-type": "application/json", - "x-dfo-trace-id": "4e3b97d6e0814dc7ae89509dcb63b46b" + "x-dfo-trace-id": "39917f146e6b4935a6200e27d0cd672b" }, "json": { "schema_version": 1, @@ -15250,7 +17258,7 @@ "frame_grammar_version": "1.1.0", "origin_catalogue_build_id": "20261019T174519Z-2e5e8cfd", "served_from": "head", - "confirmed_at": "2026-10-26T09:18:05.070107+00:00" + "confirmed_at": "2026-11-01T07:37:40.580774+00:00" }, "warnings": [], "diagnostics": [ @@ -15289,7 +17297,7 @@ ], "series_count": 2, "output_options": { - "capability_version": "dset_76f5fa7244511c58", + "capability_version": "dset_5282a0674178a233", "columns": [ { "name": "stat_var", @@ -15366,7 +17374,8 @@ "covered": 2 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": false }, { "column": "observationAbout", @@ -15378,7 +17387,8 @@ "covered": 2 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": false }, { "column": "observationAbout", @@ -15390,7 +17400,8 @@ "covered": 2 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true }, { "column": "observationAbout", @@ -15402,7 +17413,8 @@ "covered": 2 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": false } ], "long_layout_defaults": [ @@ -15443,7 +17455,7 @@ ] } }, - "series_coverage_stamp": "e6e717ab8c77e84d010915893ede5809e9ecec67929a07cfafbcc2210edfa1eb", + "series_coverage_stamp": "ad27fd11738abb03d2d84dc214e223f04781609636cf678d0d08c385fb863d99", "retention": { "pinned": false, "held_until": "2026-11-19T15:55:49.978519Z" @@ -15461,7 +17473,7 @@ "headers": { "content-type": "text/html", "location": "https://storage.googleapis.com/dev-fin-observatory-datasets-working/sha256%3A9ff8d7d0df398e2b298b22f54828fb187c705888db1816d223137c950d037839?X-Goog-Signature=redacted", - "x-dfo-trace-id": "dd6c261d3d2e4566bdc4071ef3834710" + "x-dfo-trace-id": "d5e8dafe390347b39afb2f285e3ce682" } } }, @@ -15484,10 +17496,10 @@ "answer": { "kind": "resolution", "status": "definite", - "sentence": "Germany's gross ODA disbursements to Kenya for education and health, 1997 to 2024. Current US dollars · OECD Creditor Reporting System (CRS). GDP in Germany and Kenya, 1960 to 2025. Current US dollars · World Development Indicators. You named Germany as a provider. This measure has no providers, so this shows the place itself. You named Kenya as a recipient. This measure has no recipients, so this shows the place itself.", + "sentence": "Germany's gross ODA disbursements to Kenya for education, health, and population policy, programme, and reproductive health, 1997 to 2024. Current US dollars · OECD Creditor Reporting System (CRS). GDP in Germany and Kenya, 1960 to 2025. Current US dollars · World Development Indicators. You named Germany as a provider. This measure has no providers, so this shows the place itself. You named Kenya as a recipient. This measure has no recipients, so this shows the place itself.", "complete": true, "specs": [ - "spec_25f482395c5d012ec278118f38dff29c", + "spec_7a02b6facd2dc17b5d0d7c35c11bf5d2", "spec_f8dea3052d1ef6ba5667628815d1a663" ], "gaps": [] @@ -15495,7 +17507,7 @@ }, { "dataset": { - "rows": 644, + "rows": 725, "columns": [ "part", "time_period", @@ -15531,7 +17543,7 @@ "part_rows": [ { "part": "health ODA disbursements; education ODA disbursements", - "rows": 512 + "rows": 593 }, { "part": "GDP", @@ -15545,9 +17557,9 @@ "health ODA disbursements", "education ODA disbursements" ], - "spec_id": "spec_25f482395c5d012ec278118f38dff29c", - "content_version": "cv_d6ce435ea267b46680c94eae9423d420", - "sentence": "Germany's gross ODA disbursements to Kenya for education and health, 1997 to 2024. Current US dollars · OECD Creditor Reporting System (CRS)." + "spec_id": "spec_7a02b6facd2dc17b5d0d7c35c11bf5d2", + "content_version": "cv_b600e3429190c07d98f8d59720cde7ba", + "sentence": "Germany's gross ODA disbursements to Kenya for education, health, and population policy, programme, and reproductive health, 1997 to 2024. Current US dollars · OECD Creditor Reporting System (CRS)." }, { "parts": [ diff --git a/python/client-contract/src/dfo_client_contract/scenarios/answer-several-readings-folded.parquet b/python/client-contract/src/dfo_client_contract/scenarios/answer-several-readings-folded.parquet index 25ade33..3fe002e 100644 Binary files a/python/client-contract/src/dfo_client_contract/scenarios/answer-several-readings-folded.parquet and b/python/client-contract/src/dfo_client_contract/scenarios/answer-several-readings-folded.parquet differ diff --git a/python/client-contract/src/dfo_client_contract/scenarios/answer-spec-without-identity.json b/python/client-contract/src/dfo_client_contract/scenarios/answer-spec-without-identity.json index 14974bf..37f0ecd 100644 --- a/python/client-contract/src/dfo_client_contract/scenarios/answer-spec-without-identity.json +++ b/python/client-contract/src/dfo_client_contract/scenarios/answer-spec-without-identity.json @@ -30,7 +30,7 @@ "status": 200, "headers": { "content-type": "application/json", - "x-dfo-trace-id": "c7cb40f3790f4a15a0ddcad0cc93c9bb" + "x-dfo-trace-id": "92a325e77a854c5daafa875164b5e23e" }, "json": { "schema_version": 1, @@ -38,23 +38,27 @@ "entry_path": "raw_text", "raw_query": "ODA disbursements from Germany to Nigeria for basic health care", "normalized_query": "ODA disbursements from Germany to Nigeria for basic health care", - "extract_skipped": true + "extract_skipped": false }, "diagnostics": { - "engine_build": "d80df9f5fd598b7345255470932d202ee5d49942", - "trace_id": "c7cb40f3790f4a15a0ddcad0cc93c9bb", + "engine_build": "ccb6617922c839ce3cd5615a3bbb65c70bfe1bde", + "trace_id": "92a325e77a854c5daafa875164b5e23e", "warnings": [], "timing_ms": { - "total": 3, + "total": 17540, "by_step": { "coverage": 0, - "response_cache_layer1": 1 + "extract": 1239, + "exclusion_read": 719, + "cache_lookup": 0 } }, "llm_usage": { - "input_tokens": 0, - "output_tokens": 0, - "cached_tokens": 0 + "input_tokens": 2784, + "output_tokens": 111, + "cached_tokens": 0, + "jev_input_tokens": 6695, + "jev_output_tokens": 2088 }, "timed_out": false }, @@ -64,30 +68,30 @@ "variable_text": "ODA disbursements for basic health care", "warnings": [], "timing_ms": { - "total": 3011, + "total": 16265, "by_step": { - "recall": 457, + "recall": 2821, "phase_resolve_places": 0, "phase_check_entities": 0, "shape_arcs": 2, - "shape_probe_coverage": 8, - "shape_probe": 114, - "shape_groups": 579, + "shape_probe_coverage": 104, + "shape_probe": 352, + "shape_groups": 109, "shape_labels": 1, - "shape_admission": 2, + "shape_admission": 0, "phase_derive_shapes": 0, - "shape": 1247, + "shape": 1134, "phase_prune_and_rank": 0, - "bind": 266, - "phase_bind": 327, - "phase_settle": 46, - "phase_place_bindings": 57, + "bind": 5473, + "phase_bind": 345, + "phase_settle": 105, + "phase_place_bindings": 1078, "phase_facet_requests": 0, - "materialise": 44, - "phase_materialise": 200, - "answer": 220, - "options": 55, - "phase_outcome": 92 + "materialise": 2132, + "phase_materialise": 313, + "answer": 1829, + "options": 872, + "phase_outcome": 163 } }, "restatement": { @@ -471,7 +475,7 @@ "label": "OECD Terms and Conditions" } }, - "coverage_stamp": "e6e717ab8c77e84d010915893ede5809e9ecec67929a07cfafbcc2210edfa1eb", + "coverage_stamp": "ad27fd11738abb03d2d84dc214e223f04781609636cf678d0d08c385fb863d99", "facets": { "provenance": { "basis": "fallback", @@ -529,7 +533,7 @@ }, "relation": "child", "parent": "CRSCooperationModalityB", - "member_count": 1606, + "member_count": 1614, "served_rows": 1, "served_rows_exact": true }, @@ -543,7 +547,7 @@ }, "relation": "child", "parent": "CRSCooperationModalityB", - "member_count": 1331, + "member_count": 1337, "served_rows": 6, "served_rows_exact": true }, @@ -570,7 +574,7 @@ }, "relation": "child", "parent": "CRSCooperationModalityC", - "member_count": 7005, + "member_count": 7041, "served_rows": 7, "served_rows_exact": true }, @@ -666,7 +670,7 @@ }, "relation": "child", "parent": "CRSTypeOfFinance100", - "member_count": 12672, + "member_count": 12745, "served_rows": 30, "served_rows_exact": true } @@ -693,7 +697,7 @@ "value_kind": "enum_value" }, "relation": "root", - "member_count": 14098, + "member_count": 14146, "served_rows": 30, "served_rows_exact": true } @@ -1124,7 +1128,7 @@ "selected": [] } ], - "capability_version": "cap_765c9d2a0c7529b9", + "capability_version": "cap_4913302d7a6b6435", "default_reading": { "applied": true, "removed_stat_vars": [] @@ -1132,214 +1136,7 @@ }, "confidence": "high", "available_at_place": true, - "alternative_measures": [ - { - "definition": { - "schema_version": 1, - "spec_id": "spec_80b92ca1ba1114b426eb5e79b84361d4", - "identity": { - "identity_version": "spec1", - "shape": { - "kind": "statvar_schema", - "population_type": "FinancialFlow", - "measured_property": "amount", - "stat_type": "measuredValue", - "measurement_qualifier": "Nominal" - }, - "slots": [ - { - "property": "crsCooperationModality", - "binding": { - "state": "unbound" - } - }, - { - "property": "crsPurpose", - "binding": { - "state": "value", - "ref": "CRSPurposeCode12220" - } - }, - { - "property": "crsTypeOfFinance", - "binding": { - "state": "unbound" - } - }, - { - "property": "crsTypeOfFlow", - "binding": { - "state": "value", - "ref": "CRSTypeOfFlow10" - } - }, - { - "property": "financialFlowType", - "binding": { - "state": "value", - "ref": "Disbursement" - } - }, - { - "property": "nettingBasis", - "binding": { - "state": "value", - "ref": "Net" - } - } - ], - "entities": { - "destination": [ - "country/NGA" - ], - "origin": [ - "country/DEU" - ] - }, - "requested_window": { - "kind": "all" - } - } - }, - "label": "net disbursements", - "axis": "what", - "measure_axis_values": [ - { - "axis": "populationType", - "value": { - "ref": "FinancialFlow", - "label": "financial flow" - } - }, - { - "axis": "measuredProperty", - "value": { - "ref": "amount", - "label": "amount" - } - }, - { - "axis": "measurementQualifier", - "value": { - "ref": "Nominal", - "label": "nominal" - } - }, - { - "axis": "financialFlowType", - "value": { - "ref": "Disbursement", - "label": "disbursement" - } - }, - { - "axis": "nettingBasis", - "value": { - "ref": "Net", - "label": "net" - } - } - ], - "served_rows": 30, - "served_rows_exact": true - }, - { - "definition": { - "schema_version": 1, - "spec_id": "spec_c394f9108db2100f1c8e4532d8d1c804", - "identity": { - "identity_version": "spec1", - "shape": { - "kind": "statvar_schema", - "population_type": "FinancialObligation", - "measured_property": "amount", - "stat_type": "measuredValue", - "measurement_qualifier": "Nominal" - }, - "slots": [ - { - "property": "crsCooperationModality", - "binding": { - "state": "unbound" - } - }, - { - "property": "crsPurpose", - "binding": { - "state": "value", - "ref": "CRSPurposeCode12220" - } - }, - { - "property": "crsTypeOfFinance", - "binding": { - "state": "unbound" - } - }, - { - "property": "crsTypeOfFlow", - "binding": { - "state": "value", - "ref": "CRSTypeOfFlow10" - } - }, - { - "property": "financialObligationType", - "binding": { - "state": "value", - "ref": "Commitment" - } - } - ], - "entities": { - "destination": [ - "country/NGA" - ], - "origin": [ - "country/DEU" - ] - }, - "requested_window": { - "kind": "all" - } - } - }, - "label": "commitments", - "axis": "what", - "measure_axis_values": [ - { - "axis": "populationType", - "value": { - "ref": "FinancialObligation", - "label": "financial obligation" - } - }, - { - "axis": "measuredProperty", - "value": { - "ref": "amount", - "label": "amount" - } - }, - { - "axis": "measurementQualifier", - "value": { - "ref": "Nominal", - "label": "nominal" - } - }, - { - "axis": "financialObligationType", - "value": { - "ref": "Commitment", - "label": "commitment" - } - } - ], - "served_rows": 24, - "served_rows_exact": true - } - ], + "alternative_measures": [], "measure_label": "gross disbursements", "measure_label_axes": [ "populationType", @@ -1385,6 +1182,8 @@ } } ], + "concept_label": "basic health care", + "published_tables": "OECD Creditor Reporting System (CRS)", "open_axis_facts": [ { "property": "crsTypeOfFinance", @@ -3410,6 +3209,363 @@ "destination": "NGN", "origin": "EUR" } + }, + "scope_choices": { + "id": "spec_774d6c001a6250aa67ca676ab067895e", + "base": { + "schema_version": 1, + "spec_id": "spec_774d6c001a6250aa67ca676ab067895e", + "identity": { + "identity_version": "spec1", + "shape": { + "kind": "statvar_schema", + "population_type": "FinancialFlow", + "measured_property": "amount", + "stat_type": "measuredValue", + "measurement_qualifier": "Nominal" + }, + "slots": [ + { + "property": "crsCooperationModality", + "binding": { + "state": "unbound" + } + }, + { + "property": "crsPurpose", + "binding": { + "state": "value", + "ref": "CRSPurposeCode12220" + } + }, + { + "property": "crsTypeOfFinance", + "binding": { + "state": "unbound" + } + }, + { + "property": "crsTypeOfFlow", + "binding": { + "state": "value", + "ref": "CRSTypeOfFlow10" + } + }, + { + "property": "financialFlowType", + "binding": { + "state": "value", + "ref": "Disbursement" + } + }, + { + "property": "nettingBasis", + "binding": { + "state": "value", + "ref": "Gross" + } + } + ], + "entities": { + "destination": [ + "country/NGA" + ], + "origin": [ + "country/DEU" + ] + }, + "requested_window": { + "kind": "all" + } + } + }, + "rule_version": "scope1:3eef00a928eedd463ee48d02b79730da", + "entries": [ + { + "axis": "sector", + "option_id": "sector:12220", + "provenance": "explicit", + "origin": { + "kind": "text", + "text": "basic health care", + "start": 46, + "end": 63 + } + } + ], + "dropped_entries": [], + "choices": [ + { + "id": "spec_774d6c001a6250aa67ca676ab067895e:sector", + "axis": "sector", + "rule": "sector_code", + "provenance": "explicit", + "active": "sector:12220", + "options": [ + { + "option_id": "sector:12220", + "label": "basic health care (CRS 12220)", + "binding": { + "kind": "slot", + "slot": "crsPurpose", + "state": "value", + "refs": [ + "CRSPurposeCode12220" + ] + }, + "availability": { + "status": "available", + "detail": {} + } + } + ] + }, + { + "id": "spec_774d6c001a6250aa67ca676ab067895e:measure_basis", + "axis": "measure_basis", + "rule": "measure_basis_convention", + "provenance": "default", + "active": "measure_basis:gross", + "options": [ + { + "option_id": "measure_basis:gross", + "label": "gross disbursements, current USD", + "binding": { + "kind": "shape", + "measured_property": "amount", + "netting_basis": "Gross" + }, + "availability": { + "status": "available", + "detail": {} + } + }, + { + "option_id": "measure_basis:net", + "label": "net disbursements, current USD", + "binding": { + "kind": "shape", + "measured_property": "amount", + "netting_basis": "Net" + }, + "availability": { + "status": "available", + "detail": {} + } + }, + { + "option_id": "measure_basis:grant_equivalent", + "label": "grant equivalents (OECD headline), current USD", + "binding": { + "kind": "shape", + "measured_property": "grantEquivalent", + "netting_basis": null + }, + "availability": { + "status": "available", + "detail": {} + } + }, + { + "option_id": "measure_basis:commitments", + "label": "commitments, current USD", + "binding": { + "kind": "shape", + "measured_property": "amount", + "netting_basis": null + }, + "availability": { + "status": "available", + "detail": {} + } + } + ] + }, + { + "id": "spec_774d6c001a6250aa67ca676ab067895e:provider", + "axis": "provider", + "rule": "bilateral_flows", + "provenance": "default", + "active": "provider:bilateral", + "options": [ + { + "option_id": "provider:bilateral", + "label": "bilateral flows only", + "binding": { + "kind": "provider", + "scope": "bilateral" + }, + "availability": { + "status": "available", + "detail": {} + } + }, + { + "option_id": "provider:inclusive", + "label": "bilateral plus imputed multilateral, 2020 to 2024", + "binding": { + "kind": "provider", + "scope": "inclusive", + "window": [ + 2020, + 2024 + ], + "provenance": "provenance/ONEBilateralAndImputedMultilateral" + }, + "availability": { + "status": "partial", + "years": [ + [ + 2011, + 2016 + ], + [ + 2020, + 2024 + ] + ], + "code": "imputed_coverage", + "detail": {} + } + } + ] + } + ], + "compiled": { + "spec_id": "spec_774d6c001a6250aa67ca676ab067895e", + "identity": { + "identity_version": "spec1", + "shape": { + "kind": "statvar_schema", + "population_type": "FinancialFlow", + "measured_property": "amount", + "stat_type": "measuredValue", + "measurement_qualifier": "Nominal" + }, + "slots": [ + { + "property": "crsCooperationModality", + "binding": { + "state": "unbound" + } + }, + { + "property": "crsPurpose", + "binding": { + "state": "value", + "ref": "CRSPurposeCode12220" + } + }, + { + "property": "crsTypeOfFinance", + "binding": { + "state": "unbound" + } + }, + { + "property": "crsTypeOfFlow", + "binding": { + "state": "value", + "ref": "CRSTypeOfFlow10" + } + }, + { + "property": "financialFlowType", + "binding": { + "state": "value", + "ref": "Disbursement" + } + }, + { + "property": "nettingBasis", + "binding": { + "state": "value", + "ref": "Gross" + } + } + ], + "entities": { + "destination": [ + "country/NGA" + ], + "origin": [ + "country/DEU" + ] + }, + "requested_window": { + "kind": "all" + } + }, + "components": [ + { + "role": "whole", + "identity": { + "identity_version": "spec1", + "shape": { + "kind": "statvar_schema", + "population_type": "FinancialFlow", + "measured_property": "amount", + "stat_type": "measuredValue", + "measurement_qualifier": "Nominal" + }, + "slots": [ + { + "property": "crsCooperationModality", + "binding": { + "state": "unbound" + } + }, + { + "property": "crsPurpose", + "binding": { + "state": "value", + "ref": "CRSPurposeCode12220" + } + }, + { + "property": "crsTypeOfFinance", + "binding": { + "state": "unbound" + } + }, + { + "property": "crsTypeOfFlow", + "binding": { + "state": "value", + "ref": "CRSTypeOfFlow10" + } + }, + { + "property": "financialFlowType", + "binding": { + "state": "value", + "ref": "Disbursement" + } + }, + { + "property": "nettingBasis", + "binding": { + "state": "value", + "ref": "Gross" + } + } + ], + "entities": { + "destination": [ + "country/NGA" + ], + "origin": [ + "country/DEU" + ] + }, + "requested_window": { + "kind": "all" + } + } + } + ] + }, + "ledger": [] } } } @@ -3641,7 +3797,7 @@ "error": { "class": "ContractError", "code": "contract_violation", - "trace_id": "c7cb40f3790f4a15a0ddcad0cc93c9bb" + "trace_id": "92a325e77a854c5daafa875164b5e23e" } } ] diff --git a/python/client-contract/src/dfo_client_contract/scenarios/answer-spec-without-resolved.json b/python/client-contract/src/dfo_client_contract/scenarios/answer-spec-without-resolved.json index 6056087..647a51f 100644 --- a/python/client-contract/src/dfo_client_contract/scenarios/answer-spec-without-resolved.json +++ b/python/client-contract/src/dfo_client_contract/scenarios/answer-spec-without-resolved.json @@ -30,7 +30,7 @@ "status": 200, "headers": { "content-type": "application/json", - "x-dfo-trace-id": "c7cb40f3790f4a15a0ddcad0cc93c9bb" + "x-dfo-trace-id": "92a325e77a854c5daafa875164b5e23e" }, "json": { "schema_version": 1, @@ -38,23 +38,27 @@ "entry_path": "raw_text", "raw_query": "ODA disbursements from Germany to Nigeria for basic health care", "normalized_query": "ODA disbursements from Germany to Nigeria for basic health care", - "extract_skipped": true + "extract_skipped": false }, "diagnostics": { - "engine_build": "d80df9f5fd598b7345255470932d202ee5d49942", - "trace_id": "c7cb40f3790f4a15a0ddcad0cc93c9bb", + "engine_build": "ccb6617922c839ce3cd5615a3bbb65c70bfe1bde", + "trace_id": "92a325e77a854c5daafa875164b5e23e", "warnings": [], "timing_ms": { - "total": 3, + "total": 17540, "by_step": { "coverage": 0, - "response_cache_layer1": 1 + "extract": 1239, + "exclusion_read": 719, + "cache_lookup": 0 } }, "llm_usage": { - "input_tokens": 0, - "output_tokens": 0, - "cached_tokens": 0 + "input_tokens": 2784, + "output_tokens": 111, + "cached_tokens": 0, + "jev_input_tokens": 6695, + "jev_output_tokens": 2088 }, "timed_out": false }, @@ -64,30 +68,30 @@ "variable_text": "ODA disbursements for basic health care", "warnings": [], "timing_ms": { - "total": 3011, + "total": 16265, "by_step": { - "recall": 457, + "recall": 2821, "phase_resolve_places": 0, "phase_check_entities": 0, "shape_arcs": 2, - "shape_probe_coverage": 8, - "shape_probe": 114, - "shape_groups": 579, + "shape_probe_coverage": 104, + "shape_probe": 352, + "shape_groups": 109, "shape_labels": 1, - "shape_admission": 2, + "shape_admission": 0, "phase_derive_shapes": 0, - "shape": 1247, + "shape": 1134, "phase_prune_and_rank": 0, - "bind": 266, - "phase_bind": 327, - "phase_settle": 46, - "phase_place_bindings": 57, + "bind": 5473, + "phase_bind": 345, + "phase_settle": 105, + "phase_place_bindings": 1078, "phase_facet_requests": 0, - "materialise": 44, - "phase_materialise": 200, - "answer": 220, - "options": 55, - "phase_outcome": 92 + "materialise": 2132, + "phase_materialise": 313, + "answer": 1829, + "options": 872, + "phase_outcome": 163 } }, "restatement": { @@ -421,7 +425,7 @@ "error": { "class": "ContractError", "code": "contract_violation", - "trace_id": "c7cb40f3790f4a15a0ddcad0cc93c9bb" + "trace_id": "92a325e77a854c5daafa875164b5e23e" } } ] diff --git a/python/client-contract/src/dfo_client_contract/scenarios/answer-timed-out-keeps-reasons.json b/python/client-contract/src/dfo_client_contract/scenarios/answer-timed-out-keeps-reasons.json index 6a320eb..c6d7a4b 100644 --- a/python/client-contract/src/dfo_client_contract/scenarios/answer-timed-out-keeps-reasons.json +++ b/python/client-contract/src/dfo_client_contract/scenarios/answer-timed-out-keeps-reasons.json @@ -44,20 +44,21 @@ "extract_skipped": false }, "diagnostics": { - "engine_build": "d80df9f5fd598b7345255470932d202ee5d49942", - "trace_id": "86b361f85db44a29b3d711350962ca73", + "engine_build": "ccb6617922c839ce3cd5615a3bbb65c70bfe1bde", + "trace_id": "cf40b66c70a74f34af1ea479ba67e11f", "warnings": [], "timing_ms": { - "total": 456, + "total": 3122, "by_step": { "coverage": 0, - "extract": 0, - "cache_lookup": 0 + "extract": 921, + "exclusion_read": 781, + "cache_lookup": 1 } }, "llm_usage": { - "input_tokens": 0, - "output_tokens": 0, + "input_tokens": 2786, + "output_tokens": 112, "cached_tokens": 0, "jev_input_tokens": 5250, "jev_output_tokens": 1104 @@ -70,30 +71,30 @@ "variable_text": "debt service", "warnings": [], "timing_ms": { - "total": 452, + "total": 2193, "by_step": { - "recall": 1, + "recall": 1640, "phase_resolve_places": 0, "phase_check_entities": 0, - "shape_arcs": 2, - "shape_probe_coverage": 17, - "shape_probe": 101, - "shape_groups": 8, - "shape_labels": 14, + "shape_arcs": 4, + "shape_probe_coverage": 12, + "shape_probe": 98, + "shape_groups": 6, + "shape_labels": 11, "shape_admission": 0, "phase_derive_shapes": 0, - "shape": 225, + "shape": 232, "phase_prune_and_rank": 0, - "bind": 77, - "phase_bind": 17, - "phase_settle": 5, + "bind": 91, + "phase_bind": 19, + "phase_settle": 8, "phase_place_bindings": 14, "phase_facet_requests": 0, - "materialise": 11, - "phase_materialise": 23, - "answer": 2, - "options": 9, - "phase_outcome": 68 + "materialise": 13, + "phase_materialise": 31, + "answer": 3, + "options": 78, + "phase_outcome": 64 } }, "restatement": { @@ -568,7 +569,7 @@ "label": "Creative Commons Attribution License" } }, - "coverage_stamp": "e6e717ab8c77e84d010915893ede5809e9ecec67929a07cfafbcc2210edfa1eb", + "coverage_stamp": "ad27fd11738abb03d2d84dc214e223f04781609636cf678d0d08c385fb863d99", "facets": { "provenance": { "basis": "fallback", @@ -1286,7 +1287,7 @@ } ], "query_qualifiers": [], - "capability_version": "cap_765c9d2a0c7529b9", + "capability_version": "cap_4913302d7a6b6435", "default_reading": { "applied": true, "removed_stat_vars": [] @@ -1296,6 +1297,7 @@ "available_at_place": true, "measure_label_axes": [], "measure_axis_values": [], + "published_tables": "World Bank International Debt Statistics (IDS)", "unit_conversion": { "currencies": [ { @@ -3271,18 +3273,18 @@ "variable_text": "price of tea", "warnings": [], "timing_ms": { - "total": 121, + "total": 1545, "by_step": { - "recall": 0, + "recall": 1436, "phase_resolve_places": 0, "phase_check_entities": 0, - "shape_arcs": 1, - "shape_probe": 96, + "shape_arcs": 3, + "shape_probe": 101, "shape_groups": 1, "shape_labels": 0, - "shape_admission": 0, + "shape_admission": 1, "phase_derive_shapes": 0, - "shape": 121, + "shape": 109, "phase_prune_and_rank": 0 } }, diff --git a/python/client-contract/src/dfo_client_contract/scenarios/answer-timed-out.json b/python/client-contract/src/dfo_client_contract/scenarios/answer-timed-out.json index f1593e9..38ee851 100644 --- a/python/client-contract/src/dfo_client_contract/scenarios/answer-timed-out.json +++ b/python/client-contract/src/dfo_client_contract/scenarios/answer-timed-out.json @@ -44,20 +44,21 @@ "extract_skipped": false }, "diagnostics": { - "engine_build": "d80df9f5fd598b7345255470932d202ee5d49942", - "trace_id": "86b361f85db44a29b3d711350962ca73", + "engine_build": "ccb6617922c839ce3cd5615a3bbb65c70bfe1bde", + "trace_id": "cf40b66c70a74f34af1ea479ba67e11f", "warnings": [], "timing_ms": { - "total": 456, + "total": 3122, "by_step": { "coverage": 0, - "extract": 0, - "cache_lookup": 0 + "extract": 921, + "exclusion_read": 781, + "cache_lookup": 1 } }, "llm_usage": { - "input_tokens": 0, - "output_tokens": 0, + "input_tokens": 2786, + "output_tokens": 112, "cached_tokens": 0, "jev_input_tokens": 5250, "jev_output_tokens": 1104 @@ -70,30 +71,30 @@ "variable_text": "debt service", "warnings": [], "timing_ms": { - "total": 452, + "total": 2193, "by_step": { - "recall": 1, + "recall": 1640, "phase_resolve_places": 0, "phase_check_entities": 0, - "shape_arcs": 2, - "shape_probe_coverage": 17, - "shape_probe": 101, - "shape_groups": 8, - "shape_labels": 14, + "shape_arcs": 4, + "shape_probe_coverage": 12, + "shape_probe": 98, + "shape_groups": 6, + "shape_labels": 11, "shape_admission": 0, "phase_derive_shapes": 0, - "shape": 225, + "shape": 232, "phase_prune_and_rank": 0, - "bind": 77, - "phase_bind": 17, - "phase_settle": 5, + "bind": 91, + "phase_bind": 19, + "phase_settle": 8, "phase_place_bindings": 14, "phase_facet_requests": 0, - "materialise": 11, - "phase_materialise": 23, - "answer": 2, - "options": 9, - "phase_outcome": 68 + "materialise": 13, + "phase_materialise": 31, + "answer": 3, + "options": 78, + "phase_outcome": 64 } }, "restatement": { @@ -568,7 +569,7 @@ "label": "Creative Commons Attribution License" } }, - "coverage_stamp": "e6e717ab8c77e84d010915893ede5809e9ecec67929a07cfafbcc2210edfa1eb", + "coverage_stamp": "ad27fd11738abb03d2d84dc214e223f04781609636cf678d0d08c385fb863d99", "facets": { "provenance": { "basis": "fallback", @@ -1286,7 +1287,7 @@ } ], "query_qualifiers": [], - "capability_version": "cap_765c9d2a0c7529b9", + "capability_version": "cap_4913302d7a6b6435", "default_reading": { "applied": true, "removed_stat_vars": [] @@ -1296,6 +1297,7 @@ "available_at_place": true, "measure_label_axes": [], "measure_axis_values": [], + "published_tables": "World Bank International Debt Statistics (IDS)", "unit_conversion": { "currencies": [ { @@ -3271,18 +3273,18 @@ "variable_text": "price of tea", "warnings": [], "timing_ms": { - "total": 121, + "total": 1545, "by_step": { - "recall": 0, + "recall": 1436, "phase_resolve_places": 0, "phase_check_entities": 0, - "shape_arcs": 1, - "shape_probe": 96, + "shape_arcs": 3, + "shape_probe": 101, "shape_groups": 1, "shape_labels": 0, - "shape_admission": 0, + "shape_admission": 1, "phase_derive_shapes": 0, - "shape": 121, + "shape": 109, "phase_prune_and_rank": 0 } }, diff --git a/python/client-contract/src/dfo_client_contract/scenarios/answer-unknown-enum-value.json b/python/client-contract/src/dfo_client_contract/scenarios/answer-unknown-enum-value.json index ba5c570..690019f 100644 --- a/python/client-contract/src/dfo_client_contract/scenarios/answer-unknown-enum-value.json +++ b/python/client-contract/src/dfo_client_contract/scenarios/answer-unknown-enum-value.json @@ -30,7 +30,7 @@ "status": 200, "headers": { "content-type": "application/json", - "x-dfo-trace-id": "01cf4a9623c449759f24d249f8783de1" + "x-dfo-trace-id": "1d05424fb2784068acf168d73a67c0d0" }, "json": { "schema_version": 1, @@ -41,21 +41,22 @@ "extract_skipped": false }, "diagnostics": { - "engine_build": "d80df9f5fd598b7345255470932d202ee5d49942", - "trace_id": "01cf4a9623c449759f24d249f8783de1", + "engine_build": "ccb6617922c839ce3cd5615a3bbb65c70bfe1bde", + "trace_id": "1d05424fb2784068acf168d73a67c0d0", "warnings": [], "timing_ms": { - "total": 1162, + "total": 1946, "by_step": { "coverage": 0, - "extract": 1040, + "extract": 1070, + "exclusion_read": 606, "cache_lookup": 0 } }, "llm_usage": { - "input_tokens": 2233, - "output_tokens": 193, - "cached_tokens": 841 + "input_tokens": 2788, + "output_tokens": 202, + "cached_tokens": 0 }, "timed_out": false }, @@ -65,10 +66,10 @@ "variable_text": "ODA disbursements", "warnings": [], "timing_ms": { - "total": 117, + "total": 871, "by_step": { - "recall": 117, - "phase_resolve_places": 0, + "recall": 870, + "phase_resolve_places": 1, "phase_check_entities": 0 } }, @@ -118,7 +119,9 @@ "entity_refs": [ { "text": "Germany", - "refs": [] + "refs": [ + "country/DEU" + ] }, { "text": "Congo", diff --git a/python/client-contract/src/dfo_client_contract/scenarios/answer-unknown-kind.json b/python/client-contract/src/dfo_client_contract/scenarios/answer-unknown-kind.json index 3f2cee4..cad38d0 100644 --- a/python/client-contract/src/dfo_client_contract/scenarios/answer-unknown-kind.json +++ b/python/client-contract/src/dfo_client_contract/scenarios/answer-unknown-kind.json @@ -30,7 +30,7 @@ "status": 200, "headers": { "content-type": "application/json", - "x-dfo-trace-id": "01cf4a9623c449759f24d249f8783de1" + "x-dfo-trace-id": "1d05424fb2784068acf168d73a67c0d0" }, "json": { "schema_version": 1, @@ -41,21 +41,22 @@ "extract_skipped": false }, "diagnostics": { - "engine_build": "d80df9f5fd598b7345255470932d202ee5d49942", - "trace_id": "01cf4a9623c449759f24d249f8783de1", + "engine_build": "ccb6617922c839ce3cd5615a3bbb65c70bfe1bde", + "trace_id": "1d05424fb2784068acf168d73a67c0d0", "warnings": [], "timing_ms": { - "total": 1162, + "total": 1946, "by_step": { "coverage": 0, - "extract": 1040, + "extract": 1070, + "exclusion_read": 606, "cache_lookup": 0 } }, "llm_usage": { - "input_tokens": 2233, - "output_tokens": 193, - "cached_tokens": 841 + "input_tokens": 2788, + "output_tokens": 202, + "cached_tokens": 0 }, "timed_out": false }, @@ -65,10 +66,10 @@ "variable_text": "ODA disbursements", "warnings": [], "timing_ms": { - "total": 117, + "total": 871, "by_step": { - "recall": 117, - "phase_resolve_places": 0, + "recall": 870, + "phase_resolve_places": 1, "phase_check_entities": 0 } }, @@ -118,7 +119,9 @@ "entity_refs": [ { "text": "Germany", - "refs": [] + "refs": [ + "country/DEU" + ] }, { "text": "Congo", @@ -261,7 +264,7 @@ "error": { "class": "ContractError", "code": "contract_violation", - "trace_id": "01cf4a9623c449759f24d249f8783de1" + "trace_id": "1d05424fb2784068acf168d73a67c0d0" } } ] diff --git a/python/client-contract/src/dfo_client_contract/scenarios/answer-unknown-part-status.json b/python/client-contract/src/dfo_client_contract/scenarios/answer-unknown-part-status.json index ff7c4f0..5376d73 100644 --- a/python/client-contract/src/dfo_client_contract/scenarios/answer-unknown-part-status.json +++ b/python/client-contract/src/dfo_client_contract/scenarios/answer-unknown-part-status.json @@ -33,7 +33,7 @@ "status": 200, "headers": { "content-type": "application/json", - "x-dfo-trace-id": "86b361f85db44a29b3d711350962ca73" + "x-dfo-trace-id": "cf40b66c70a74f34af1ea479ba67e11f" }, "json": { "schema_version": 1, @@ -44,20 +44,21 @@ "extract_skipped": false }, "diagnostics": { - "engine_build": "d80df9f5fd598b7345255470932d202ee5d49942", - "trace_id": "86b361f85db44a29b3d711350962ca73", + "engine_build": "ccb6617922c839ce3cd5615a3bbb65c70bfe1bde", + "trace_id": "cf40b66c70a74f34af1ea479ba67e11f", "warnings": [], "timing_ms": { - "total": 456, + "total": 3122, "by_step": { "coverage": 0, - "extract": 0, - "cache_lookup": 0 + "extract": 921, + "exclusion_read": 781, + "cache_lookup": 1 } }, "llm_usage": { - "input_tokens": 0, - "output_tokens": 0, + "input_tokens": 2786, + "output_tokens": 112, "cached_tokens": 0, "jev_input_tokens": 5250, "jev_output_tokens": 1104 @@ -70,30 +71,30 @@ "variable_text": "debt service", "warnings": [], "timing_ms": { - "total": 452, + "total": 2193, "by_step": { - "recall": 1, + "recall": 1640, "phase_resolve_places": 0, "phase_check_entities": 0, - "shape_arcs": 2, - "shape_probe_coverage": 17, - "shape_probe": 101, - "shape_groups": 8, - "shape_labels": 14, + "shape_arcs": 4, + "shape_probe_coverage": 12, + "shape_probe": 98, + "shape_groups": 6, + "shape_labels": 11, "shape_admission": 0, "phase_derive_shapes": 0, - "shape": 225, + "shape": 232, "phase_prune_and_rank": 0, - "bind": 77, - "phase_bind": 17, - "phase_settle": 5, + "bind": 91, + "phase_bind": 19, + "phase_settle": 8, "phase_place_bindings": 14, "phase_facet_requests": 0, - "materialise": 11, - "phase_materialise": 23, - "answer": 2, - "options": 9, - "phase_outcome": 68 + "materialise": 13, + "phase_materialise": 31, + "answer": 3, + "options": 78, + "phase_outcome": 64 } }, "restatement": { @@ -568,7 +569,7 @@ "label": "Creative Commons Attribution License" } }, - "coverage_stamp": "e6e717ab8c77e84d010915893ede5809e9ecec67929a07cfafbcc2210edfa1eb", + "coverage_stamp": "ad27fd11738abb03d2d84dc214e223f04781609636cf678d0d08c385fb863d99", "facets": { "provenance": { "basis": "fallback", @@ -1286,7 +1287,7 @@ } ], "query_qualifiers": [], - "capability_version": "cap_765c9d2a0c7529b9", + "capability_version": "cap_4913302d7a6b6435", "default_reading": { "applied": true, "removed_stat_vars": [] @@ -1296,6 +1297,7 @@ "available_at_place": true, "measure_label_axes": [], "measure_axis_values": [], + "published_tables": "World Bank International Debt Statistics (IDS)", "unit_conversion": { "currencies": [ { @@ -3271,18 +3273,18 @@ "variable_text": "price of tea", "warnings": [], "timing_ms": { - "total": 121, + "total": 1545, "by_step": { - "recall": 0, + "recall": 1436, "phase_resolve_places": 0, "phase_check_entities": 0, - "shape_arcs": 1, - "shape_probe": 96, + "shape_arcs": 3, + "shape_probe": 101, "shape_groups": 1, "shape_labels": 0, - "shape_admission": 0, + "shape_admission": 1, "phase_derive_shapes": 0, - "shape": 121, + "shape": 109, "phase_prune_and_rank": 0 } }, @@ -3652,7 +3654,7 @@ "error": { "class": "IncompleteAnswerError", "code": "answer_incomplete", - "trace_id": "86b361f85db44a29b3d711350962ca73" + "trace_id": "cf40b66c70a74f34af1ea479ba67e11f" } } ] diff --git a/python/client-contract/src/dfo_client_contract/scenarios/answer-unsupported-part.json b/python/client-contract/src/dfo_client_contract/scenarios/answer-unsupported-part.json index 26eaf48..52e920e 100644 --- a/python/client-contract/src/dfo_client_contract/scenarios/answer-unsupported-part.json +++ b/python/client-contract/src/dfo_client_contract/scenarios/answer-unsupported-part.json @@ -33,7 +33,7 @@ "status": 200, "headers": { "content-type": "application/json", - "x-dfo-trace-id": "86b361f85db44a29b3d711350962ca73" + "x-dfo-trace-id": "cf40b66c70a74f34af1ea479ba67e11f" }, "json": { "schema_version": 1, @@ -44,20 +44,21 @@ "extract_skipped": false }, "diagnostics": { - "engine_build": "d80df9f5fd598b7345255470932d202ee5d49942", - "trace_id": "86b361f85db44a29b3d711350962ca73", + "engine_build": "ccb6617922c839ce3cd5615a3bbb65c70bfe1bde", + "trace_id": "cf40b66c70a74f34af1ea479ba67e11f", "warnings": [], "timing_ms": { - "total": 456, + "total": 3122, "by_step": { "coverage": 0, - "extract": 0, - "cache_lookup": 0 + "extract": 921, + "exclusion_read": 781, + "cache_lookup": 1 } }, "llm_usage": { - "input_tokens": 0, - "output_tokens": 0, + "input_tokens": 2786, + "output_tokens": 112, "cached_tokens": 0, "jev_input_tokens": 5250, "jev_output_tokens": 1104 @@ -70,30 +71,30 @@ "variable_text": "debt service", "warnings": [], "timing_ms": { - "total": 452, + "total": 2193, "by_step": { - "recall": 1, + "recall": 1640, "phase_resolve_places": 0, "phase_check_entities": 0, - "shape_arcs": 2, - "shape_probe_coverage": 17, - "shape_probe": 101, - "shape_groups": 8, - "shape_labels": 14, + "shape_arcs": 4, + "shape_probe_coverage": 12, + "shape_probe": 98, + "shape_groups": 6, + "shape_labels": 11, "shape_admission": 0, "phase_derive_shapes": 0, - "shape": 225, + "shape": 232, "phase_prune_and_rank": 0, - "bind": 77, - "phase_bind": 17, - "phase_settle": 5, + "bind": 91, + "phase_bind": 19, + "phase_settle": 8, "phase_place_bindings": 14, "phase_facet_requests": 0, - "materialise": 11, - "phase_materialise": 23, - "answer": 2, - "options": 9, - "phase_outcome": 68 + "materialise": 13, + "phase_materialise": 31, + "answer": 3, + "options": 78, + "phase_outcome": 64 } }, "restatement": { @@ -568,7 +569,7 @@ "label": "Creative Commons Attribution License" } }, - "coverage_stamp": "e6e717ab8c77e84d010915893ede5809e9ecec67929a07cfafbcc2210edfa1eb", + "coverage_stamp": "ad27fd11738abb03d2d84dc214e223f04781609636cf678d0d08c385fb863d99", "facets": { "provenance": { "basis": "fallback", @@ -1286,7 +1287,7 @@ } ], "query_qualifiers": [], - "capability_version": "cap_765c9d2a0c7529b9", + "capability_version": "cap_4913302d7a6b6435", "default_reading": { "applied": true, "removed_stat_vars": [] @@ -1296,6 +1297,7 @@ "available_at_place": true, "measure_label_axes": [], "measure_axis_values": [], + "published_tables": "World Bank International Debt Statistics (IDS)", "unit_conversion": { "currencies": [ { @@ -3271,18 +3273,18 @@ "variable_text": "price of tea", "warnings": [], "timing_ms": { - "total": 121, + "total": 1545, "by_step": { - "recall": 0, + "recall": 1436, "phase_resolve_places": 0, "phase_check_entities": 0, - "shape_arcs": 1, - "shape_probe": 96, + "shape_arcs": 3, + "shape_probe": 101, "shape_groups": 1, "shape_labels": 0, - "shape_admission": 0, + "shape_admission": 1, "phase_derive_shapes": 0, - "shape": 121, + "shape": 109, "phase_prune_and_rank": 0 } }, @@ -3646,7 +3648,7 @@ "error": { "class": "IncompleteAnswerError", "code": "answer_incomplete", - "trace_id": "86b361f85db44a29b3d711350962ca73" + "trace_id": "cf40b66c70a74f34af1ea479ba67e11f" } } ] diff --git a/python/client-contract/src/dfo_client_contract/scenarios/choose-candidate-assumed-reading.json b/python/client-contract/src/dfo_client_contract/scenarios/choose-candidate-assumed-reading.json index 0888ccb..cbb26d5 100644 --- a/python/client-contract/src/dfo_client_contract/scenarios/choose-candidate-assumed-reading.json +++ b/python/client-contract/src/dfo_client_contract/scenarios/choose-candidate-assumed-reading.json @@ -34,7 +34,7 @@ "status": 200, "headers": { "content-type": "application/json", - "x-dfo-trace-id": "2de415a9f27d4ce69e4f1eb97b5951af" + "x-dfo-trace-id": "b250c3db1b784b9fa66b8173b78a6c0f" }, "json": { "schema_version": 1, @@ -45,20 +45,21 @@ "extract_skipped": false }, "diagnostics": { - "engine_build": "d80df9f5fd598b7345255470932d202ee5d49942", - "trace_id": "2de415a9f27d4ce69e4f1eb97b5951af", + "engine_build": "ccb6617922c839ce3cd5615a3bbb65c70bfe1bde", + "trace_id": "b250c3db1b784b9fa66b8173b78a6c0f", "warnings": [], "timing_ms": { - "total": 4676, + "total": 28220, "by_step": { - "coverage": 1, - "extract": 1, - "cache_lookup": 0 + "coverage": 0, + "extract": 957, + "exclusion_read": 667, + "cache_lookup": 1 } }, "llm_usage": { - "input_tokens": 0, - "output_tokens": 0, + "input_tokens": 2796, + "output_tokens": 152, "cached_tokens": 0, "jev_input_tokens": 13359, "jev_output_tokens": 2855 @@ -69,33 +70,39 @@ "parts": [ { "variable_text": "mortality", - "warnings": [], + "warnings": [ + { + "code": "membership_unverified", + "severity": "warn", + "message": "the full set of series behind this answer could not be confirmed, so it uses the series the search found; a dataset made from it may hold different series." + } + ], "timing_ms": { - "total": 4672, + "total": 26613, "by_step": { - "recall": 1, + "recall": 4404, "phase_resolve_places": 0, "phase_check_entities": 0, "shape_arcs": 6, - "shape_probe": 120, + "shape_probe": 126, "shape_groups": 6, "shape_labels": 2, - "shape_admission": 1, + "shape_admission": 2, "phase_derive_shapes": 0, - "shape": 258, + "shape": 238, "phase_prune_and_rank": 0, - "bind": 154, - "phase_bind": 18, + "bind": 145, + "phase_bind": 25, "phase_settle": 1, - "phase_place_bindings": 39, + "phase_place_bindings": 7249, "phase_facet_requests": 0, - "materialise": 202, - "phase_materialise": 33, - "answer": 30, - "phase_outcome": 3936 + "materialise": 1955, + "phase_materialise": 113, + "answer": 1043, + "phase_outcome": 11440 } }, - "rendered_sentence": "2 readings. Kenya's deaths rate per capita. World Development Indicators · 2013 to 2022. Kenya's number of deaths. Kenya Census · 2018 to 2022.", + "rendered_sentence": "2 readings. Kenya's deaths rate per 1,000 people. World Development Indicators · 2013 to 2022. Kenya's number of deaths. Kenya Census · 2018 to 2022.", "sentence_plan": [ { "kind": "text", @@ -148,7 +155,7 @@ }, { "kind": "text", - "text": "per capita", + "text": "per 1,000 people", "segment": "heading", "entity_refs": [], "states": [] @@ -627,7 +634,7 @@ "source": "observed" } ], - "rendered_sentence": "Kenya's deaths rate per capita, 2013 to 2022. World Development Indicators.", + "rendered_sentence": "Kenya's deaths rate per 1,000 people, 2013 to 2022. World Development Indicators.", "sentence_plan": [ { "kind": "slot", @@ -672,11 +679,14 @@ }, { "kind": "slot", - "text": "per capita", + "text": "per 1,000 people", "axis": "unit", "segment": "heading", + "binding_ref": "unit:", "entity_refs": [], - "states": [] + "states": [ + "unit:" + ] }, { "kind": "slot", @@ -814,7 +824,7 @@ "start_year": 2013, "end_year": 2022 }, - "capability_version": "cap_765c9d2a0c7529b9", + "capability_version": "cap_4913302d7a6b6435", "default_reading": { "applied": true, "removed_stat_vars": [] @@ -823,7 +833,8 @@ "confidence": "high", "available_at_place": true, "measure_label_axes": [], - "measure_axis_values": [] + "measure_axis_values": [], + "published_tables": "World Development Indicators" } }, { @@ -996,7 +1007,7 @@ "label": "data source" } ], - "member_count": 2978, + "member_count": 10, "refine_supported": true, "data_commons": [ { @@ -1175,9 +1186,8 @@ ], "unresolved_slots": [], "stat_vars": { - "member_count": 37, + "member_count": 1, "member_count_exact": false, - "served_count": 1, "data_date_range": { "start": "2018", "end": "2022" @@ -2366,7 +2376,7 @@ "start_year": 2013, "end_year": 2022 }, - "capability_version": "cap_765c9d2a0c7529b9", + "capability_version": "cap_4913302d7a6b6435", "default_reading": { "applied": true, "removed_stat_vars": [] @@ -2376,7 +2386,8 @@ "basis": "structural", "available_at_place": true, "measure_label_axes": [], - "measure_axis_values": [] + "measure_axis_values": [], + "published_tables": "Kenya Census" } } ], @@ -2397,7 +2408,7 @@ } } ], - "rendered_sentence": "2 readings. Kenya's deaths rate per capita. World Development Indicators · 2013 to 2022. Kenya's number of deaths. Kenya Census · 2018 to 2022.", + "rendered_sentence": "2 readings. Kenya's deaths rate per 1,000 people. World Development Indicators · 2013 to 2022. Kenya's number of deaths. Kenya Census · 2018 to 2022.", "sentence_plan": [ { "kind": "text", @@ -2457,7 +2468,7 @@ }, { "kind": "text", - "text": "per capita", + "text": "per 1,000 people", "segment": "heading", "entity_refs": [], "states": [], @@ -2665,7 +2676,7 @@ "status": 200, "headers": { "content-type": "application/json", - "x-dfo-trace-id": "97f100748b194ca09afc06c9dc1ac81d" + "x-dfo-trace-id": "50796872852647b9830003fca9213a89" }, "json": { "schema_version": 1, @@ -2674,11 +2685,11 @@ "extract_skipped": true }, "diagnostics": { - "engine_build": "d80df9f5fd598b7345255470932d202ee5d49942", - "trace_id": "97f100748b194ca09afc06c9dc1ac81d", + "engine_build": "ccb6617922c839ce3cd5615a3bbb65c70bfe1bde", + "trace_id": "50796872852647b9830003fca9213a89", "warnings": [], "timing_ms": { - "total": 345, + "total": 1601, "by_step": { "coverage": 0 } @@ -2691,19 +2702,39 @@ "variable_text": "mortality", "warnings": [], "timing_ms": { - "total": 284, + "total": 1298, "by_step": { - "validate": 0, - "walk": 0, + "validate": 1, + "phase_validate": 0, + "walk": 510, "reread_arcs": 0, + "phase_reread_arcs": 0, "detect_edits": 0, + "phase_detect_edits": 0, "resolve_survivors": 0, - "shape": 174, + "phase_resolve_survivors": 0, + "shape": 651, + "phase_build_shape": 0, "bind": 0, + "phase_build_bindings": 0, "where_places": 0, - "materialise": 107, - "answer": 2, - "options": 1 + "phase_where_places": 0, + "materialise": 10, + "phase_materialise": 0, + "ground_related": 12, + "ground_units": 0, + "ground_facets": 0, + "ground_convert": 0, + "answer": 1, + "ground_gates": 0, + "phase_ground_build": 2, + "finalize_preview": 0, + "options": 1, + "finalize_related": 110, + "finalize_wholes": 0, + "finalize_relaunch": 0, + "phase_finalize": 0, + "served_entry": 0 } }, "entity_refs": [], @@ -3047,7 +3078,7 @@ "source": "observed" } ], - "rendered_sentence": "Kenya's deaths rate per capita, 2013 to 2022. World Development Indicators.", + "rendered_sentence": "Kenya's deaths rate per 1,000 people, 2013 to 2022. World Development Indicators.", "sentence_plan": [ { "kind": "slot", @@ -3091,11 +3122,14 @@ }, { "kind": "slot", - "text": "per capita", + "text": "per 1,000 people", "axis": "unit", "segment": "heading", + "binding_ref": "unit:", "entity_refs": [], - "states": [] + "states": [ + "unit:" + ] }, { "kind": "slot", @@ -3231,12 +3265,13 @@ "start_year": 2013, "end_year": 2022 }, - "capability_version": "cap_765c9d2a0c7529b9" + "capability_version": "cap_4913302d7a6b6435" }, "confidence": "high", "available_at_place": true, "measure_label_axes": [], "measure_axis_values": [], + "published_tables": "World Development Indicators", "related_group": { "ref": "dc/g/MortalityEvent", "label": "Mortality Event" @@ -3277,7 +3312,7 @@ } } ], - "rendered_sentence": "Kenya's deaths rate per capita, 2013 to 2022. World Development Indicators. Assumed: official development assistance.", + "rendered_sentence": "Kenya's deaths rate per 1,000 people, 2013 to 2022. World Development Indicators. Assumed: official development assistance.", "sentence_plan": [ { "kind": "slot", @@ -3326,11 +3361,14 @@ }, { "kind": "slot", - "text": "per capita", + "text": "per 1,000 people", "axis": "unit", "segment": "heading", + "binding_ref": "unit:", "entity_refs": [], - "states": [], + "states": [ + "unit:" + ], "part_index": 0 }, { @@ -3436,7 +3474,7 @@ "answer": { "kind": "resolution", "status": "candidates", - "sentence": "2 readings. Kenya's deaths rate per capita. World Development Indicators · 2013 to 2022. Kenya's number of deaths. Kenya Census · 2018 to 2022.", + "sentence": "2 readings. Kenya's deaths rate per 1,000 people. World Development Indicators · 2013 to 2022. Kenya's number of deaths. Kenya Census · 2018 to 2022.", "complete": false, "specs": [], "gaps": [ @@ -3452,7 +3490,7 @@ "answer": { "kind": "resolution", "status": "definite", - "sentence": "Kenya's deaths rate per capita, 2013 to 2022. World Development Indicators. Assumed: official development assistance.", + "sentence": "Kenya's deaths rate per 1,000 people, 2013 to 2022. World Development Indicators. Assumed: official development assistance.", "complete": true, "specs": [ "spec_10bf62f9687154286b463d206f03a086" diff --git a/python/client-contract/src/dfo_client_contract/scenarios/choose-candidate-by-label.json b/python/client-contract/src/dfo_client_contract/scenarios/choose-candidate-by-label.json index 39aad61..8b99703 100644 --- a/python/client-contract/src/dfo_client_contract/scenarios/choose-candidate-by-label.json +++ b/python/client-contract/src/dfo_client_contract/scenarios/choose-candidate-by-label.json @@ -14,7 +14,7 @@ }, { "op": "choose", - "option": "Kenya's deaths rate per capita, 2013 to 2022." + "option": "Kenya's deaths rate per 1,000 people, 2013 to 2022." } ], "exchanges": [ @@ -34,7 +34,7 @@ "status": 200, "headers": { "content-type": "application/json", - "x-dfo-trace-id": "2de415a9f27d4ce69e4f1eb97b5951af" + "x-dfo-trace-id": "b250c3db1b784b9fa66b8173b78a6c0f" }, "json": { "schema_version": 1, @@ -45,20 +45,21 @@ "extract_skipped": false }, "diagnostics": { - "engine_build": "d80df9f5fd598b7345255470932d202ee5d49942", - "trace_id": "2de415a9f27d4ce69e4f1eb97b5951af", + "engine_build": "ccb6617922c839ce3cd5615a3bbb65c70bfe1bde", + "trace_id": "b250c3db1b784b9fa66b8173b78a6c0f", "warnings": [], "timing_ms": { - "total": 4676, + "total": 28220, "by_step": { - "coverage": 1, - "extract": 1, - "cache_lookup": 0 + "coverage": 0, + "extract": 957, + "exclusion_read": 667, + "cache_lookup": 1 } }, "llm_usage": { - "input_tokens": 0, - "output_tokens": 0, + "input_tokens": 2796, + "output_tokens": 152, "cached_tokens": 0, "jev_input_tokens": 13359, "jev_output_tokens": 2855 @@ -69,33 +70,39 @@ "parts": [ { "variable_text": "mortality", - "warnings": [], + "warnings": [ + { + "code": "membership_unverified", + "severity": "warn", + "message": "the full set of series behind this answer could not be confirmed, so it uses the series the search found; a dataset made from it may hold different series." + } + ], "timing_ms": { - "total": 4672, + "total": 26613, "by_step": { - "recall": 1, + "recall": 4404, "phase_resolve_places": 0, "phase_check_entities": 0, "shape_arcs": 6, - "shape_probe": 120, + "shape_probe": 126, "shape_groups": 6, "shape_labels": 2, - "shape_admission": 1, + "shape_admission": 2, "phase_derive_shapes": 0, - "shape": 258, + "shape": 238, "phase_prune_and_rank": 0, - "bind": 154, - "phase_bind": 18, + "bind": 145, + "phase_bind": 25, "phase_settle": 1, - "phase_place_bindings": 39, + "phase_place_bindings": 7249, "phase_facet_requests": 0, - "materialise": 202, - "phase_materialise": 33, - "answer": 30, - "phase_outcome": 3936 + "materialise": 1955, + "phase_materialise": 113, + "answer": 1043, + "phase_outcome": 11440 } }, - "rendered_sentence": "2 readings. Kenya's deaths rate per capita. World Development Indicators · 2013 to 2022. Kenya's number of deaths. Kenya Census · 2018 to 2022.", + "rendered_sentence": "2 readings. Kenya's deaths rate per 1,000 people. World Development Indicators · 2013 to 2022. Kenya's number of deaths. Kenya Census · 2018 to 2022.", "sentence_plan": [ { "kind": "text", @@ -148,7 +155,7 @@ }, { "kind": "text", - "text": "per capita", + "text": "per 1,000 people", "segment": "heading", "entity_refs": [], "states": [] @@ -627,7 +634,7 @@ "source": "observed" } ], - "rendered_sentence": "Kenya's deaths rate per capita, 2013 to 2022. World Development Indicators.", + "rendered_sentence": "Kenya's deaths rate per 1,000 people, 2013 to 2022. World Development Indicators.", "sentence_plan": [ { "kind": "slot", @@ -672,11 +679,14 @@ }, { "kind": "slot", - "text": "per capita", + "text": "per 1,000 people", "axis": "unit", "segment": "heading", + "binding_ref": "unit:", "entity_refs": [], - "states": [] + "states": [ + "unit:" + ] }, { "kind": "slot", @@ -814,7 +824,7 @@ "start_year": 2013, "end_year": 2022 }, - "capability_version": "cap_765c9d2a0c7529b9", + "capability_version": "cap_4913302d7a6b6435", "default_reading": { "applied": true, "removed_stat_vars": [] @@ -823,7 +833,8 @@ "confidence": "high", "available_at_place": true, "measure_label_axes": [], - "measure_axis_values": [] + "measure_axis_values": [], + "published_tables": "World Development Indicators" } }, { @@ -996,7 +1007,7 @@ "label": "data source" } ], - "member_count": 2978, + "member_count": 10, "refine_supported": true, "data_commons": [ { @@ -1175,9 +1186,8 @@ ], "unresolved_slots": [], "stat_vars": { - "member_count": 37, + "member_count": 1, "member_count_exact": false, - "served_count": 1, "data_date_range": { "start": "2018", "end": "2022" @@ -2366,7 +2376,7 @@ "start_year": 2013, "end_year": 2022 }, - "capability_version": "cap_765c9d2a0c7529b9", + "capability_version": "cap_4913302d7a6b6435", "default_reading": { "applied": true, "removed_stat_vars": [] @@ -2376,7 +2386,8 @@ "basis": "structural", "available_at_place": true, "measure_label_axes": [], - "measure_axis_values": [] + "measure_axis_values": [], + "published_tables": "Kenya Census" } } ], @@ -2388,7 +2399,7 @@ } } ], - "rendered_sentence": "2 readings. Kenya's deaths rate per capita. World Development Indicators · 2013 to 2022. Kenya's number of deaths. Kenya Census · 2018 to 2022.", + "rendered_sentence": "2 readings. Kenya's deaths rate per 1,000 people. World Development Indicators · 2013 to 2022. Kenya's number of deaths. Kenya Census · 2018 to 2022.", "sentence_plan": [ { "kind": "text", @@ -2448,7 +2459,7 @@ }, { "kind": "text", - "text": "per capita", + "text": "per 1,000 people", "segment": "heading", "entity_refs": [], "states": [], @@ -2647,7 +2658,7 @@ "status": 200, "headers": { "content-type": "application/json", - "x-dfo-trace-id": "97f100748b194ca09afc06c9dc1ac81d" + "x-dfo-trace-id": "50796872852647b9830003fca9213a89" }, "json": { "schema_version": 1, @@ -2656,11 +2667,11 @@ "extract_skipped": true }, "diagnostics": { - "engine_build": "d80df9f5fd598b7345255470932d202ee5d49942", - "trace_id": "97f100748b194ca09afc06c9dc1ac81d", + "engine_build": "ccb6617922c839ce3cd5615a3bbb65c70bfe1bde", + "trace_id": "50796872852647b9830003fca9213a89", "warnings": [], "timing_ms": { - "total": 345, + "total": 1601, "by_step": { "coverage": 0 } @@ -2673,19 +2684,39 @@ "variable_text": "mortality", "warnings": [], "timing_ms": { - "total": 284, + "total": 1298, "by_step": { - "validate": 0, - "walk": 0, + "validate": 1, + "phase_validate": 0, + "walk": 510, "reread_arcs": 0, + "phase_reread_arcs": 0, "detect_edits": 0, + "phase_detect_edits": 0, "resolve_survivors": 0, - "shape": 174, + "phase_resolve_survivors": 0, + "shape": 651, + "phase_build_shape": 0, "bind": 0, + "phase_build_bindings": 0, "where_places": 0, - "materialise": 107, - "answer": 2, - "options": 1 + "phase_where_places": 0, + "materialise": 10, + "phase_materialise": 0, + "ground_related": 12, + "ground_units": 0, + "ground_facets": 0, + "ground_convert": 0, + "answer": 1, + "ground_gates": 0, + "phase_ground_build": 2, + "finalize_preview": 0, + "options": 1, + "finalize_related": 110, + "finalize_wholes": 0, + "finalize_relaunch": 0, + "phase_finalize": 0, + "served_entry": 0 } }, "entity_refs": [], @@ -3020,7 +3051,7 @@ "source": "observed" } ], - "rendered_sentence": "Kenya's deaths rate per capita, 2013 to 2022. World Development Indicators.", + "rendered_sentence": "Kenya's deaths rate per 1,000 people, 2013 to 2022. World Development Indicators.", "sentence_plan": [ { "kind": "slot", @@ -3064,11 +3095,14 @@ }, { "kind": "slot", - "text": "per capita", + "text": "per 1,000 people", "axis": "unit", "segment": "heading", + "binding_ref": "unit:", "entity_refs": [], - "states": [] + "states": [ + "unit:" + ] }, { "kind": "slot", @@ -3204,12 +3238,13 @@ "start_year": 2013, "end_year": 2022 }, - "capability_version": "cap_765c9d2a0c7529b9" + "capability_version": "cap_4913302d7a6b6435" }, "confidence": "high", "available_at_place": true, "measure_label_axes": [], "measure_axis_values": [], + "published_tables": "World Development Indicators", "related_group": { "ref": "dc/g/MortalityEvent", "label": "Mortality Event" @@ -3250,7 +3285,7 @@ } } ], - "rendered_sentence": "Kenya's deaths rate per capita, 2013 to 2022. World Development Indicators.", + "rendered_sentence": "Kenya's deaths rate per 1,000 people, 2013 to 2022. World Development Indicators.", "sentence_plan": [ { "kind": "slot", @@ -3299,11 +3334,14 @@ }, { "kind": "slot", - "text": "per capita", + "text": "per 1,000 people", "axis": "unit", "segment": "heading", + "binding_ref": "unit:", "entity_refs": [], - "states": [], + "states": [ + "unit:" + ], "part_index": 0 }, { @@ -3377,7 +3415,7 @@ "answer": { "kind": "resolution", "status": "candidates", - "sentence": "2 readings. Kenya's deaths rate per capita. World Development Indicators · 2013 to 2022. Kenya's number of deaths. Kenya Census · 2018 to 2022.", + "sentence": "2 readings. Kenya's deaths rate per 1,000 people. World Development Indicators · 2013 to 2022. Kenya's number of deaths. Kenya Census · 2018 to 2022.", "complete": false, "specs": [], "gaps": [ @@ -3393,7 +3431,7 @@ "answer": { "kind": "resolution", "status": "definite", - "sentence": "Kenya's deaths rate per capita, 2013 to 2022. World Development Indicators.", + "sentence": "Kenya's deaths rate per 1,000 people, 2013 to 2022. World Development Indicators.", "complete": true, "specs": [ "spec_10bf62f9687154286b463d206f03a086" diff --git a/python/client-contract/src/dfo_client_contract/scenarios/choose-candidate-echoes-assumptions.json b/python/client-contract/src/dfo_client_contract/scenarios/choose-candidate-echoes-assumptions.json index 9c99077..07b7354 100644 --- a/python/client-contract/src/dfo_client_contract/scenarios/choose-candidate-echoes-assumptions.json +++ b/python/client-contract/src/dfo_client_contract/scenarios/choose-candidate-echoes-assumptions.json @@ -5,8 +5,8 @@ "origin": { "kind": "recorded", "base_url": "https://dfo-dev-apis-zms5lj4zhq-nn.a.run.app/api", - "dfo_commit": "d80df9f5fd598b7345255470932d202ee5d49942", - "recorded_at": "2026-10-26T09:23:52Z" + "dfo_commit": "ccb6617922c839ce3cd5615a3bbb65c70bfe1bde", + "recorded_at": "2026-11-01T07:39:53Z" }, "call": [ { @@ -36,7 +36,7 @@ "status": 200, "headers": { "content-type": "application/json", - "x-dfo-trace-id": "77333f3756d7434fa7476addd497eff0" + "x-dfo-trace-id": "e819d7601d9e41d89c4792cae76ea34a" }, "json": { "schema_version": 1, @@ -47,23 +47,24 @@ "extract_skipped": false }, "diagnostics": { - "engine_build": "d80df9f5fd598b7345255470932d202ee5d49942", - "trace_id": "77333f3756d7434fa7476addd497eff0", + "engine_build": "ccb6617922c839ce3cd5615a3bbb65c70bfe1bde", + "trace_id": "e819d7601d9e41d89c4792cae76ea34a", "warnings": [], "timing_ms": { - "total": 4076, + "total": 6019, "by_step": { "coverage": 0, - "extract": 1095, - "cache_lookup": 0 + "extract": 964, + "exclusion_read": 691, + "cache_lookup": 1 } }, "llm_usage": { - "input_tokens": 2242, - "output_tokens": 197, + "input_tokens": 2806, + "output_tokens": 206, "cached_tokens": 843, - "jev_input_tokens": 21368, - "jev_output_tokens": 4607 + "jev_input_tokens": 21477, + "jev_output_tokens": 4635 }, "timed_out": false }, @@ -79,31 +80,31 @@ } ], "timing_ms": { - "total": 2673, + "total": 3654, "by_step": { "recall": 1, "phase_resolve_places": 0, "phase_check_entities": 0, - "shape_arcs": 5, - "shape_probe": 91, - "shape_groups": 6, + "shape_arcs": 2, + "shape_probe": 72, + "shape_groups": 7, "shape_labels": 1, - "shape_admission": 1, + "shape_admission": 2, "phase_derive_shapes": 0, - "shape": 214, + "shape": 216, "phase_prune_and_rank": 0, - "bind": 134, - "phase_bind": 13, + "bind": 168, + "phase_bind": 17, "phase_settle": 1, - "phase_place_bindings": 34, + "phase_place_bindings": 43, "phase_facet_requests": 0, - "materialise": 106, - "phase_materialise": 29, - "answer": 54, - "phase_outcome": 2087 + "materialise": 95, + "phase_materialise": 26, + "answer": 72, + "phase_outcome": 3015 } }, - "rendered_sentence": "2 readings. Kenya's deaths rate per capita. World Development Indicators · 2013 to 2022. Kenya's number of deaths. Kenya Census · 2018 to 2022. You named Kenya as a recipient. This measure has no recipients, so this shows the place itself.", + "rendered_sentence": "2 readings. Kenya's deaths rate per 1,000 people. World Development Indicators · 2013 to 2022. Kenya's number of deaths. Kenya Census · 2018 to 2022. You named Kenya as a recipient. This measure has no recipients, so this shows the place itself.", "sentence_plan": [ { "kind": "text", @@ -156,7 +157,7 @@ }, { "kind": "text", - "text": "per capita", + "text": "per 1,000 people", "segment": "heading", "entity_refs": [], "states": [] @@ -657,7 +658,7 @@ "source": "observed" } ], - "rendered_sentence": "Kenya's deaths rate per capita, 2013 to 2022. World Development Indicators.", + "rendered_sentence": "Kenya's deaths rate per 1,000 people, 2013 to 2022. World Development Indicators.", "sentence_plan": [ { "kind": "slot", @@ -702,11 +703,14 @@ }, { "kind": "slot", - "text": "per capita", + "text": "per 1,000 people", "axis": "unit", "segment": "heading", + "binding_ref": "unit:", "entity_refs": [], - "states": [] + "states": [ + "unit:" + ] }, { "kind": "slot", @@ -844,7 +848,7 @@ "start_year": 2013, "end_year": 2022 }, - "capability_version": "cap_765c9d2a0c7529b9", + "capability_version": "cap_4913302d7a6b6435", "default_reading": { "applied": true, "removed_stat_vars": [] @@ -853,7 +857,8 @@ "confidence": "high", "available_at_place": true, "measure_label_axes": [], - "measure_axis_values": [] + "measure_axis_values": [], + "published_tables": "World Development Indicators" } }, { @@ -1026,7 +1031,7 @@ "label": "data source" } ], - "member_count": 2978, + "member_count": 2979, "refine_supported": true, "data_commons": [ { @@ -2396,7 +2401,7 @@ "start_year": 2013, "end_year": 2022 }, - "capability_version": "cap_765c9d2a0c7529b9", + "capability_version": "cap_4913302d7a6b6435", "default_reading": { "applied": true, "removed_stat_vars": [] @@ -2406,7 +2411,8 @@ "basis": "structural", "available_at_place": true, "measure_label_axes": [], - "measure_axis_values": [] + "measure_axis_values": [], + "published_tables": "Kenya Census" } } ], @@ -2432,30 +2438,30 @@ } ], "timing_ms": { - "total": 2976, + "total": 5044, "by_step": { - "recall": 771, - "phase_resolve_places": 1, + "recall": 2521, + "phase_resolve_places": 0, "phase_check_entities": 0, - "shape_arcs": 2, - "shape_probe_coverage": 21, - "shape_probe": 111, - "shape_groups": 66, + "shape_arcs": 1, + "shape_probe_coverage": 1006, + "shape_probe": 1131, + "shape_groups": 152, "shape_labels": 0, "shape_admission": 0, "phase_derive_shapes": 0, - "shape": 621, + "shape": 1733, "phase_prune_and_rank": 0, - "bind": 681, - "phase_bind": 341, - "phase_settle": 11, - "phase_place_bindings": 111, + "bind": 171, + "phase_bind": 320, + "phase_settle": 7, + "phase_place_bindings": 98, "phase_facet_requests": 0, - "materialise": 20, + "materialise": 17, "phase_materialise": 4, - "answer": 257, - "options": 11, - "phase_outcome": 147 + "answer": 10, + "options": 31, + "phase_outcome": 132 } }, "restatement": { @@ -2483,8 +2489,8 @@ { "code": "closest_match", "asked": "aid flows", - "shown": "gross disbursements", - "text": "You asked for aid flows. This shows gross disbursements, the closest measure the data holds." + "shown": "net disbursements", + "text": "You asked for aid flows. This shows net disbursements, the closest measure the data holds." }, { "code": "whole_total_read", @@ -2504,10 +2510,10 @@ ], "status": "definite", "spec": { - "spec_id": "spec_f24e46ae9854884308fc0f33d154361e", + "spec_id": "spec_f025379e211db08849c7f98c627e025c", "definition": { "schema_version": 1, - "spec_id": "spec_f24e46ae9854884308fc0f33d154361e", + "spec_id": "spec_f025379e211db08849c7f98c627e025c", "identity": { "identity_version": "spec1", "shape": { @@ -2542,7 +2548,7 @@ "property": "nettingBasis", "binding": { "state": "value", - "ref": "Gross" + "ref": "Net" } } ], @@ -2564,7 +2570,7 @@ "resolved": { "shape": { "shape_id": "financialflow_amount_measuredvalue_nominal_family_f096b1ba", - "label": "gross disbursements (official development assistance)", + "label": "net disbursements (official development assistance)", "population_type": { "ref": "FinancialFlow", "label": "financial flow" @@ -2629,7 +2635,7 @@ } ], "member_count": 1, - "member_digest": "1a36e1a7292b1bfff95a5415de0be74cac7bb033217ed50e79faa8ce51a224c0", + "member_digest": "c2d373442ac21a31377df76cd343f156c72a530649757c399c6661cbf56c9a71", "refine_supported": true, "data_commons": [ { @@ -2694,8 +2700,8 @@ "kind": "value", "value": { "ref": { - "ref": "Gross", - "label": "gross" + "ref": "Net", + "label": "net" }, "value_kind": "enum_value" } @@ -2796,6 +2802,7 @@ "whole_of": [ "official" ], + "holds_multilaterals": true, "side_classes": [ "official", "private", @@ -2882,7 +2889,7 @@ "label": "OECD Terms and Conditions" } }, - "coverage_stamp": "e6e717ab8c77e84d010915893ede5809e9ecec67929a07cfafbcc2210edfa1eb", + "coverage_stamp": "ad27fd11738abb03d2d84dc214e223f04781609636cf678d0d08c385fb863d99", "facets": { "provenance": { "basis": "fallback", @@ -2934,8 +2941,8 @@ { "value": { "ref": { - "ref": "DAC2aAidType201", - "label": "ODA grant" + "ref": "DAC2aAidType219", + "label": "recovery on ODA grants and capital subscriptions" }, "value_kind": "enum_value" }, @@ -2948,8 +2955,8 @@ { "value": { "ref": { - "ref": "DAC2aAidType207", - "label": "free-standing technical co-operation" + "ref": "DAC2aAidType209", + "label": "interest received on ODA lending" }, "value_kind": "enum_value" }, @@ -2961,8 +2968,8 @@ { "value": { "ref": { - "ref": "DAC2aAidType213", - "label": "developmental food aid" + "ref": "DAC2aAidType250", + "label": "official development assistance excluding debt relief" }, "value_kind": "enum_value" }, @@ -2974,14 +2981,14 @@ { "value": { "ref": { - "ref": "DAC2aAidType216", - "label": "humanitarian aid" + "ref": "DAC2aAidType255", + "label": "debt relief" }, "value_kind": "enum_value" }, "relation": "root", "member_count": 1, - "served_rows": 10, + "served_rows": 7, "served_rows_exact": true } ], @@ -3024,11 +3031,11 @@ "source": "observed" } ], - "rendered_sentence": "Gross disbursements to Kenya from official donors (DAC) for official development assistance, 2013 to 2022. Current US dollars · OECD DAC2a.", + "rendered_sentence": "Net disbursements to Kenya from official donors (DAC) for official development assistance, 2013 to 2022. Current US dollars · OECD DAC2a.", "sentence_plan": [ { "kind": "slot", - "text": "Gross disbursements", + "text": "Net disbursements", "axis": "what", "segment": "heading", "entity_refs": [], @@ -3273,8 +3280,8 @@ "binding_kind": "value", "refs": [ { - "ref": "Gross", - "label": "gross" + "ref": "Net", + "label": "net" } ], "provenance": "measure_elected" @@ -3330,7 +3337,7 @@ "start_year": 2013, "end_year": 2022 }, - "capability_version": "cap_765c9d2a0c7529b9", + "capability_version": "cap_4913302d7a6b6435", "default_reading": { "applied": true, "removed_stat_vars": [] @@ -3338,108 +3345,8 @@ }, "confidence": "high", "available_at_place": true, - "alternative_measures": [ - { - "definition": { - "schema_version": 1, - "spec_id": "spec_f025379e211db08849c7f98c627e025c", - "identity": { - "identity_version": "spec1", - "shape": { - "kind": "statvar_schema", - "population_type": "FinancialFlow", - "measured_property": "amount", - "stat_type": "measuredValue", - "measurement_qualifier": "Nominal" - }, - "slots": [ - { - "property": "dac2aAidType", - "binding": { - "state": "value", - "ref": "DAC2aAidType206" - } - }, - { - "property": "dacTypeOfFinance", - "binding": { - "state": "unbound" - } - }, - { - "property": "financialFlowType", - "binding": { - "state": "value", - "ref": "Disbursement" - } - }, - { - "property": "nettingBasis", - "binding": { - "state": "value", - "ref": "Net" - } - } - ], - "entities": { - "destination": [ - "country/KEN" - ], - "origin": [ - "DACOfficialDonors" - ] - }, - "requested_window": { - "kind": "range", - "start_year": 2013, - "end_year": 2022 - } - } - }, - "label": "net disbursements", - "axis": "what", - "measure_axis_values": [ - { - "axis": "populationType", - "value": { - "ref": "FinancialFlow", - "label": "financial flow" - } - }, - { - "axis": "measuredProperty", - "value": { - "ref": "amount", - "label": "amount" - } - }, - { - "axis": "measurementQualifier", - "value": { - "ref": "Nominal", - "label": "nominal" - } - }, - { - "axis": "financialFlowType", - "value": { - "ref": "Disbursement", - "label": "disbursement" - } - }, - { - "axis": "nettingBasis", - "value": { - "ref": "Net", - "label": "net" - } - } - ], - "served_rows": 10, - "served_rows_exact": true - } - ], - "measure_label": "gross disbursements", + "alternative_measures": [], + "measure_label": "net disbursements", "measure_label_axes": [ "populationType", "measuredProperty", @@ -3479,11 +3386,13 @@ { "axis": "nettingBasis", "value": { - "ref": "Gross", - "label": "gross" + "ref": "Net", + "label": "net" } } ], + "concept_label": "official development assistance", + "published_tables": "OECD DAC2a", "unit_conversion": { "currencies": [ { @@ -5448,12 +5357,256 @@ "role_currencies": { "destination": "KES" } + }, + "scope_choices": { + "id": "spec_f025379e211db08849c7f98c627e025c", + "base": { + "schema_version": 1, + "spec_id": "spec_f025379e211db08849c7f98c627e025c", + "identity": { + "identity_version": "spec1", + "shape": { + "kind": "statvar_schema", + "population_type": "FinancialFlow", + "measured_property": "amount", + "stat_type": "measuredValue", + "measurement_qualifier": "Nominal" + }, + "slots": [ + { + "property": "dac2aAidType", + "binding": { + "state": "value", + "ref": "DAC2aAidType206" + } + }, + { + "property": "dacTypeOfFinance", + "binding": { + "state": "unbound" + } + }, + { + "property": "financialFlowType", + "binding": { + "state": "value", + "ref": "Disbursement" + } + }, + { + "property": "nettingBasis", + "binding": { + "state": "value", + "ref": "Net" + } + } + ], + "entities": { + "destination": [ + "country/KEN" + ], + "origin": [ + "DACOfficialDonors" + ] + }, + "requested_window": { + "kind": "range", + "start_year": 2013, + "end_year": 2022 + } + } + }, + "rule_version": "scope1:3eef00a928eedd463ee48d02b79730da", + "entries": [], + "dropped_entries": [], + "choices": [ + { + "id": "spec_f025379e211db08849c7f98c627e025c:measure_basis", + "axis": "measure_basis", + "rule": "measure_basis_convention", + "provenance": "default", + "active": "measure_basis:net", + "options": [ + { + "option_id": "measure_basis:gross", + "label": "gross disbursements, current USD", + "binding": { + "kind": "shape", + "measured_property": "amount", + "netting_basis": "Gross" + }, + "availability": { + "status": "available", + "detail": {} + } + }, + { + "option_id": "measure_basis:net", + "label": "net disbursements, current USD", + "binding": { + "kind": "shape", + "measured_property": "amount", + "netting_basis": "Net" + }, + "availability": { + "status": "available", + "detail": {} + } + }, + { + "option_id": "measure_basis:grant_equivalent", + "label": "grant equivalents (OECD headline), current USD", + "binding": { + "kind": "shape", + "measured_property": "grantEquivalent", + "netting_basis": null + }, + "availability": { + "status": "unavailable", + "code": "basis_not_published", + "detail": { + "dataset": "provenance/OECDDAC2A" + } + } + }, + { + "option_id": "measure_basis:commitments", + "label": "commitments, current USD", + "binding": { + "kind": "shape", + "measured_property": "amount", + "netting_basis": null + }, + "availability": { + "status": "unavailable", + "code": "basis_not_published", + "detail": { + "dataset": "provenance/OECDDAC2A" + } + } + } + ] + } + ], + "compiled": { + "spec_id": "spec_f025379e211db08849c7f98c627e025c", + "identity": { + "identity_version": "spec1", + "shape": { + "kind": "statvar_schema", + "population_type": "FinancialFlow", + "measured_property": "amount", + "stat_type": "measuredValue", + "measurement_qualifier": "Nominal" + }, + "slots": [ + { + "property": "dac2aAidType", + "binding": { + "state": "value", + "ref": "DAC2aAidType206" + } + }, + { + "property": "dacTypeOfFinance", + "binding": { + "state": "unbound" + } + }, + { + "property": "financialFlowType", + "binding": { + "state": "value", + "ref": "Disbursement" + } + }, + { + "property": "nettingBasis", + "binding": { + "state": "value", + "ref": "Net" + } + } + ], + "entities": { + "destination": [ + "country/KEN" + ], + "origin": [ + "DACOfficialDonors" + ] + }, + "requested_window": { + "kind": "range", + "start_year": 2013, + "end_year": 2022 + } + }, + "components": [ + { + "role": "whole", + "identity": { + "identity_version": "spec1", + "shape": { + "kind": "statvar_schema", + "population_type": "FinancialFlow", + "measured_property": "amount", + "stat_type": "measuredValue", + "measurement_qualifier": "Nominal" + }, + "slots": [ + { + "property": "dac2aAidType", + "binding": { + "state": "value", + "ref": "DAC2aAidType206" + } + }, + { + "property": "dacTypeOfFinance", + "binding": { + "state": "unbound" + } + }, + { + "property": "financialFlowType", + "binding": { + "state": "value", + "ref": "Disbursement" + } + }, + { + "property": "nettingBasis", + "binding": { + "state": "value", + "ref": "Net" + } + } + ], + "entities": { + "destination": [ + "country/KEN" + ], + "origin": [ + "DACOfficialDonors" + ] + }, + "requested_window": { + "kind": "range", + "start_year": 2013, + "end_year": 2022 + } + } + } + ] + }, + "ledger": [] } } } } ], - "rendered_sentence": "Answered 1 of 2 parts. Mortality has 2 readings. Kenya's deaths rate per capita. World Development Indicators · 2013 to 2022. Kenya's number of deaths. Kenya Census · 2018 to 2022. You named Kenya as a recipient. This measure has no recipients, so this shows the place itself. Gross disbursements to Kenya from official donors (DAC) for official development assistance, 2013 to 2022. Current US dollars · OECD DAC2a. You asked for aid flows. This shows gross disbursements, the closest measure the data holds. No donor was named, so this shows official donors (DAC), the source's total for every official donor. Private donors are outside it. To list each donor, add \"for each donor\" to the question. Assumed: official development assistance.", + "rendered_sentence": "Answered 1 of 2 parts. Mortality has 2 readings. Kenya's deaths rate per 1,000 people. World Development Indicators · 2013 to 2022. Kenya's number of deaths. Kenya Census · 2018 to 2022. You named Kenya as a recipient. This measure has no recipients, so this shows the place itself. Net disbursements to Kenya from official donors (DAC) for official development assistance, 2013 to 2022. Current US dollars · OECD DAC2a. You asked for aid flows. This shows net disbursements, the closest measure the data holds. No donor was named, so this shows official donors (DAC), the source's total for every official donor. Private donors are outside it. To list each donor, add \"for each donor\" to the question. Assumed: official development assistance.", "sentence_plan": [ { "kind": "text", @@ -5536,7 +5689,7 @@ }, { "kind": "text", - "text": "per capita", + "text": "per 1,000 people", "segment": "heading", "entity_refs": [], "states": [], @@ -5703,7 +5856,7 @@ }, { "kind": "slot", - "text": "Gross disbursements", + "text": "Net disbursements", "axis": "what", "segment": "heading", "entity_refs": [], @@ -5900,7 +6053,7 @@ }, { "kind": "text", - "text": "You asked for aid flows. This shows gross disbursements, the closest measure the data holds.", + "text": "You asked for aid flows. This shows net disbursements, the closest measure the data holds.", "segment": "departure", "entity_refs": [], "states": [], @@ -6039,7 +6192,7 @@ "property": "nettingBasis", "binding": { "state": "value", - "ref": "Gross" + "ref": "Net" } } ], @@ -6064,6 +6217,7 @@ "whole_of": [ "official" ], + "holds_multilaterals": true, "side_classes": [ "official", "private", @@ -6091,7 +6245,7 @@ "status": 200, "headers": { "content-type": "application/json", - "x-dfo-trace-id": "73fbf797c20a40a4851f5d88882cf25a" + "x-dfo-trace-id": "a6b35269243c45939a1edd0882f75263" }, "json": { "schema_version": 1, @@ -6100,11 +6254,11 @@ "extract_skipped": true }, "diagnostics": { - "engine_build": "d80df9f5fd598b7345255470932d202ee5d49942", - "trace_id": "73fbf797c20a40a4851f5d88882cf25a", + "engine_build": "ccb6617922c839ce3cd5615a3bbb65c70bfe1bde", + "trace_id": "a6b35269243c45939a1edd0882f75263", "warnings": [], "timing_ms": { - "total": 1963, + "total": 817, "by_step": { "coverage": 0 } @@ -6117,19 +6271,39 @@ "variable_text": "mortality", "warnings": [], "timing_ms": { - "total": 277, + "total": 757, "by_step": { - "validate": 0, - "walk": 0, + "validate": 1, + "phase_validate": 0, + "walk": 230, "reread_arcs": 0, + "phase_reread_arcs": 0, "detect_edits": 0, + "phase_detect_edits": 0, "resolve_survivors": 0, - "shape": 178, - "bind": 1, + "phase_resolve_survivors": 0, + "shape": 262, + "phase_build_shape": 0, + "bind": 0, + "phase_build_bindings": 0, "where_places": 0, - "materialise": 96, - "answer": 1, - "options": 1 + "phase_where_places": 0, + "materialise": 95, + "phase_materialise": 0, + "ground_related": 1, + "ground_units": 0, + "ground_facets": 0, + "ground_convert": 0, + "answer": 75, + "ground_gates": 0, + "phase_ground_build": 2, + "finalize_preview": 0, + "options": 0, + "finalize_related": 91, + "finalize_wholes": 0, + "finalize_relaunch": 0, + "phase_finalize": 0, + "served_entry": 0 } }, "entity_refs": [], @@ -6464,7 +6638,7 @@ "source": "observed" } ], - "rendered_sentence": "Kenya's deaths rate per capita, 2013 to 2022. World Development Indicators.", + "rendered_sentence": "Kenya's deaths rate per 1,000 people, 2013 to 2022. World Development Indicators.", "sentence_plan": [ { "kind": "slot", @@ -6508,11 +6682,14 @@ }, { "kind": "slot", - "text": "per capita", + "text": "per 1,000 people", "axis": "unit", "segment": "heading", + "binding_ref": "unit:", "entity_refs": [], - "states": [] + "states": [ + "unit:" + ] }, { "kind": "slot", @@ -6648,12 +6825,13 @@ "start_year": 2013, "end_year": 2022 }, - "capability_version": "cap_765c9d2a0c7529b9" + "capability_version": "cap_4913302d7a6b6435" }, "confidence": "high", "available_at_place": true, "measure_label_axes": [], "measure_axis_values": [], + "published_tables": "World Development Indicators", "related_group": { "ref": "dc/g/MortalityEvent", "label": "Mortality Event" @@ -6697,19 +6875,39 @@ "variable_text": "aid flows", "warnings": [], "timing_ms": { - "total": 1896, + "total": 108, "by_step": { "validate": 0, - "walk": 13, - "reread_arcs": 1, + "phase_validate": 0, + "walk": 14, + "reread_arcs": 0, + "phase_reread_arcs": 0, "detect_edits": 0, + "phase_detect_edits": 0, "resolve_survivors": 0, - "shape": 1838, - "bind": 1, + "phase_resolve_survivors": 0, + "shape": 1, + "phase_build_shape": 0, + "bind": 0, + "phase_build_bindings": 0, "where_places": 0, - "materialise": 18, - "answer": 8, - "options": 17 + "phase_where_places": 0, + "materialise": 19, + "phase_materialise": 0, + "ground_related": 0, + "ground_units": 0, + "ground_facets": 0, + "ground_convert": 0, + "answer": 9, + "ground_gates": 4, + "phase_ground_build": 58, + "finalize_preview": 0, + "options": 3, + "finalize_related": 0, + "finalize_wholes": 0, + "finalize_relaunch": 0, + "phase_finalize": 0, + "served_entry": 0 } }, "entity_refs": [], @@ -6733,10 +6931,10 @@ ], "status": "definite", "spec": { - "spec_id": "spec_f24e46ae9854884308fc0f33d154361e", + "spec_id": "spec_f025379e211db08849c7f98c627e025c", "definition": { "schema_version": 1, - "spec_id": "spec_f24e46ae9854884308fc0f33d154361e", + "spec_id": "spec_f025379e211db08849c7f98c627e025c", "identity": { "identity_version": "spec1", "shape": { @@ -6771,7 +6969,7 @@ "property": "nettingBasis", "binding": { "state": "value", - "ref": "Gross" + "ref": "Net" } } ], @@ -6793,7 +6991,7 @@ "resolved": { "shape": { "shape_id": "financialflow_amount_measuredvalue_nominal_family_f096b1ba", - "label": "gross disbursements (official development assistance)", + "label": "net disbursements (official development assistance)", "population_type": { "ref": "FinancialFlow", "label": "financial flow" @@ -6858,7 +7056,7 @@ } ], "member_count": 1, - "member_digest": "1a36e1a7292b1bfff95a5415de0be74cac7bb033217ed50e79faa8ce51a224c0", + "member_digest": "c2d373442ac21a31377df76cd343f156c72a530649757c399c6661cbf56c9a71", "refine_supported": true, "data_commons": [ { @@ -6923,8 +7121,8 @@ "kind": "value", "value": { "ref": { - "ref": "Gross", - "label": "gross" + "ref": "Net", + "label": "net" }, "value_kind": "enum_value" } @@ -7024,6 +7222,7 @@ "whole_of": [ "official" ], + "holds_multilaterals": true, "side_classes": [ "official", "private", @@ -7110,7 +7309,7 @@ "label": "OECD Terms and Conditions" } }, - "coverage_stamp": "e6e717ab8c77e84d010915893ede5809e9ecec67929a07cfafbcc2210edfa1eb", + "coverage_stamp": "ad27fd11738abb03d2d84dc214e223f04781609636cf678d0d08c385fb863d99", "facets": { "provenance": { "basis": "fallback", @@ -7162,8 +7361,8 @@ { "value": { "ref": { - "ref": "DAC2aAidType201", - "label": "ODA grant" + "ref": "DAC2aAidType219", + "label": "recovery on ODA grants and capital subscriptions" }, "value_kind": "enum_value" }, @@ -7176,8 +7375,8 @@ { "value": { "ref": { - "ref": "DAC2aAidType207", - "label": "free-standing technical co-operation" + "ref": "DAC2aAidType209", + "label": "interest received on ODA lending" }, "value_kind": "enum_value" }, @@ -7189,8 +7388,8 @@ { "value": { "ref": { - "ref": "DAC2aAidType213", - "label": "developmental food aid" + "ref": "DAC2aAidType250", + "label": "official development assistance excluding debt relief" }, "value_kind": "enum_value" }, @@ -7202,14 +7401,14 @@ { "value": { "ref": { - "ref": "DAC2aAidType216", - "label": "humanitarian aid" + "ref": "DAC2aAidType255", + "label": "debt relief" }, "value_kind": "enum_value" }, "relation": "root", "member_count": 1, - "served_rows": 10, + "served_rows": 7, "served_rows_exact": true } ], @@ -7252,11 +7451,11 @@ "source": "observed" } ], - "rendered_sentence": "Gross disbursements to Kenya from official donors (DAC) for official development assistance, 2013 to 2022. Current US dollars · OECD DAC2a.", + "rendered_sentence": "Net disbursements to Kenya from official donors (DAC) for official development assistance, 2013 to 2022. Current US dollars · OECD DAC2a.", "sentence_plan": [ { "kind": "slot", - "text": "Gross disbursements", + "text": "Net disbursements", "axis": "what", "segment": "heading", "entity_refs": [], @@ -7501,8 +7700,8 @@ "binding_kind": "value", "refs": [ { - "ref": "Gross", - "label": "gross" + "ref": "Net", + "label": "net" } ], "provenance": "binder" @@ -7558,7 +7757,7 @@ "start_year": 2013, "end_year": 2022 }, - "capability_version": "cap_765c9d2a0c7529b9" + "capability_version": "cap_4913302d7a6b6435" }, "confidence": "high", "available_at_place": true, @@ -7566,7 +7765,7 @@ { "definition": { "schema_version": 1, - "spec_id": "spec_f025379e211db08849c7f98c627e025c", + "spec_id": "spec_f24e46ae9854884308fc0f33d154361e", "identity": { "identity_version": "spec1", "shape": { @@ -7601,7 +7800,7 @@ "property": "nettingBasis", "binding": { "state": "value", - "ref": "Net" + "ref": "Gross" } } ], @@ -7620,7 +7819,7 @@ } } }, - "label": "net disbursements", + "label": "gross disbursements", "axis": "what", "measure_axis_values": [ { @@ -7654,8 +7853,8 @@ { "axis": "nettingBasis", "value": { - "ref": "Net", - "label": "net" + "ref": "Gross", + "label": "gross" } } ], @@ -7663,7 +7862,7 @@ "served_rows_exact": true } ], - "measure_label": "gross disbursements", + "measure_label": "net disbursements", "measure_label_axes": [ "populationType", "measuredProperty", @@ -7703,11 +7902,13 @@ { "axis": "nettingBasis", "value": { - "ref": "Gross", - "label": "gross" + "ref": "Net", + "label": "net" } } ], + "concept_label": "official development assistance", + "published_tables": "OECD DAC2a", "unit_conversion": { "currencies": [ { @@ -9677,7 +9878,7 @@ } } ], - "rendered_sentence": "Kenya's deaths rate per capita, 2013 to 2022. World Development Indicators. Gross disbursements to Kenya from official donors (DAC) for official development assistance, 2013 to 2022. Current US dollars · OECD DAC2a. This shows official donors (DAC), the source's total for every official donor. Private donors are outside it. To list each donor, search again with open_roles ['donor']. Assumed: official development assistance.", + "rendered_sentence": "Kenya's deaths rate per 1,000 people, 2013 to 2022. World Development Indicators. Net disbursements to Kenya from official donors (DAC) for official development assistance, 2013 to 2022. Current US dollars · OECD DAC2a. This shows official donors (DAC), the source's total for every official donor. Private donors are outside it. To list each donor, search again with open_roles ['donor']. Assumed: official development assistance.", "sentence_plan": [ { "kind": "slot", @@ -9726,11 +9927,14 @@ }, { "kind": "slot", - "text": "per capita", + "text": "per 1,000 people", "axis": "unit", "segment": "heading", + "binding_ref": "unit:", "entity_refs": [], - "states": [], + "states": [ + "unit:" + ], "part_index": 0 }, { @@ -9808,7 +10012,7 @@ }, { "kind": "slot", - "text": "Gross disbursements", + "text": "Net disbursements", "axis": "what", "segment": "heading", "entity_refs": [], @@ -10054,10 +10258,10 @@ "answer": { "kind": "resolution", "status": "mixed", - "sentence": "Answered 1 of 2 parts. Mortality has 2 readings. Kenya's deaths rate per capita. World Development Indicators · 2013 to 2022. Kenya's number of deaths. Kenya Census · 2018 to 2022. You named Kenya as a recipient. This measure has no recipients, so this shows the place itself. Gross disbursements to Kenya from official donors (DAC) for official development assistance, 2013 to 2022. Current US dollars · OECD DAC2a. You asked for aid flows. This shows gross disbursements, the closest measure the data holds. No donor was named, so this shows official donors (DAC), the source's total for every official donor. Private donors are outside it. To list each donor, add \"for each donor\" to the question. Assumed: official development assistance.", + "sentence": "Answered 1 of 2 parts. Mortality has 2 readings. Kenya's deaths rate per 1,000 people. World Development Indicators · 2013 to 2022. Kenya's number of deaths. Kenya Census · 2018 to 2022. You named Kenya as a recipient. This measure has no recipients, so this shows the place itself. Net disbursements to Kenya from official donors (DAC) for official development assistance, 2013 to 2022. Current US dollars · OECD DAC2a. You asked for aid flows. This shows net disbursements, the closest measure the data holds. No donor was named, so this shows official donors (DAC), the source's total for every official donor. Private donors are outside it. To list each donor, add \"for each donor\" to the question. Assumed: official development assistance.", "complete": false, "specs": [ - "spec_f24e46ae9854884308fc0f33d154361e" + "spec_f025379e211db08849c7f98c627e025c" ], "gaps": [ { @@ -10072,11 +10276,11 @@ "answer": { "kind": "resolution", "status": "definite", - "sentence": "Kenya's deaths rate per capita, 2013 to 2022. World Development Indicators. Gross disbursements to Kenya from official donors (DAC) for official development assistance, 2013 to 2022. Current US dollars · OECD DAC2a. This shows official donors (DAC), the source's total for every official donor. Private donors are outside it. To list each donor, search again with open_roles ['donor']. Assumed: official development assistance.", + "sentence": "Kenya's deaths rate per 1,000 people, 2013 to 2022. World Development Indicators. Net disbursements to Kenya from official donors (DAC) for official development assistance, 2013 to 2022. Current US dollars · OECD DAC2a. This shows official donors (DAC), the source's total for every official donor. Private donors are outside it. To list each donor, search again with open_roles ['donor']. Assumed: official development assistance.", "complete": true, "specs": [ "spec_10bf62f9687154286b463d206f03a086", - "spec_f24e46ae9854884308fc0f33d154361e" + "spec_f025379e211db08849c7f98c627e025c" ], "gaps": [] } diff --git a/python/client-contract/src/dfo_client_contract/scenarios/choose-candidate-two-parts.json b/python/client-contract/src/dfo_client_contract/scenarios/choose-candidate-two-parts.json index 2b3c0e5..547a47c 100644 --- a/python/client-contract/src/dfo_client_contract/scenarios/choose-candidate-two-parts.json +++ b/python/client-contract/src/dfo_client_contract/scenarios/choose-candidate-two-parts.json @@ -5,8 +5,8 @@ "origin": { "kind": "recorded", "base_url": "https://dfo-dev-apis-zms5lj4zhq-nn.a.run.app/api", - "dfo_commit": "d80df9f5fd598b7345255470932d202ee5d49942", - "recorded_at": "2026-10-26T09:23:24Z" + "dfo_commit": "ccb6617922c839ce3cd5615a3bbb65c70bfe1bde", + "recorded_at": "2026-11-01T07:39:17Z" }, "call": [ { @@ -39,7 +39,7 @@ "status": 200, "headers": { "content-type": "application/json", - "x-dfo-trace-id": "94058d9236554b299cad827b56912349" + "x-dfo-trace-id": "f6547394c0934d9a84db20459acc4b96" }, "json": { "schema_version": 1, @@ -50,21 +50,22 @@ "extract_skipped": false }, "diagnostics": { - "engine_build": "d80df9f5fd598b7345255470932d202ee5d49942", - "trace_id": "94058d9236554b299cad827b56912349", + "engine_build": "ccb6617922c839ce3cd5615a3bbb65c70bfe1bde", + "trace_id": "f6547394c0934d9a84db20459acc4b96", "warnings": [], "timing_ms": { - "total": 10762, + "total": 14723, "by_step": { - "coverage": 0, - "extract": 1197, + "coverage": 1, + "extract": 1031, + "exclusion_read": 533, "cache_lookup": 0 } }, "llm_usage": { - "input_tokens": 2245, - "output_tokens": 202, - "cached_tokens": 844, + "input_tokens": 2812, + "output_tokens": 211, + "cached_tokens": 0, "jev_input_tokens": 26837, "jev_output_tokens": 5603 }, @@ -76,31 +77,31 @@ "variable_text": "mortality", "warnings": [], "timing_ms": { - "total": 9466, + "total": 13605, "by_step": { "recall": 1, - "phase_resolve_places": 72, + "phase_resolve_places": 67, "phase_check_entities": 0, - "shape_arcs": 4, - "shape_probe": 94, + "shape_arcs": 3, + "shape_probe": 89, "shape_groups": 6, "shape_labels": 1, - "shape_admission": 91, - "phase_derive_shapes": 0, - "shape": 456, + "shape_admission": 74, + "phase_derive_shapes": 1, + "shape": 470, "phase_prune_and_rank": 0, - "bind": 131, - "phase_bind": 19, + "bind": 156, + "phase_bind": 16, "phase_settle": 1, - "phase_place_bindings": 34, + "phase_place_bindings": 39, "phase_facet_requests": 0, - "materialise": 434, - "phase_materialise": 50, + "materialise": 875, + "phase_materialise": 31, "answer": 78, - "phase_outcome": 8190 + "phase_outcome": 11870 } }, - "rendered_sentence": "3 readings. Deaths rate per capita in the 48 countries in Sub-Saharan Africa. World Development Indicators · 2013 to 2022. Number of deaths in the 48 countries in Sub-Saharan Africa. Kenya Census · 2018 to 2022. Count of mortality event (as fraction of count birth event live birth) in the 48 countries in Sub-Saharan Africa. Nigeria Statistics · 2014.", + "rendered_sentence": "3 readings. Deaths rate per 1,000 people in the 48 countries in Sub-Saharan Africa. World Development Indicators · 2013 to 2022. Number of deaths in the 48 countries in Sub-Saharan Africa. Kenya Census · 2018 to 2022. Count of mortality event (as fraction of count birth event live birth) in the 48 countries in Sub-Saharan Africa. Nigeria Statistics · 2014.", "sentence_plan": [ { "kind": "text", @@ -132,7 +133,7 @@ }, { "kind": "text", - "text": "per capita", + "text": "per 1,000 people", "segment": "heading", "entity_refs": [], "states": [] @@ -1421,7 +1422,7 @@ "source": "observed" } ], - "rendered_sentence": "Deaths rate per capita in the 48 countries in Sub-Saharan Africa, 2013 to 2022. World Development Indicators.", + "rendered_sentence": "Deaths rate per 1,000 people in the 48 countries in Sub-Saharan Africa, 2013 to 2022. World Development Indicators.", "sentence_plan": [ { "kind": "slot", @@ -1441,11 +1442,14 @@ }, { "kind": "slot", - "text": "per capita", + "text": "per 1,000 people", "axis": "unit", "segment": "heading", + "binding_ref": "unit:", "entity_refs": [], - "states": [] + "states": [ + "unit:" + ] }, { "kind": "slot", @@ -1977,7 +1981,7 @@ "start_year": 2013, "end_year": 2022 }, - "capability_version": "cap_765c9d2a0c7529b9", + "capability_version": "cap_4913302d7a6b6435", "default_reading": { "applied": true, "removed_stat_vars": [] @@ -1986,7 +1990,8 @@ "confidence": "high", "available_at_place": true, "measure_label_axes": [], - "measure_axis_values": [] + "measure_axis_values": [], + "published_tables": "World Development Indicators" } }, { @@ -2206,7 +2211,7 @@ "label": "data source" } ], - "member_count": 2978, + "member_count": 2979, "refine_supported": true, "data_commons": [ { @@ -4565,7 +4570,7 @@ "start_year": 2013, "end_year": 2022 }, - "capability_version": "cap_765c9d2a0c7529b9", + "capability_version": "cap_4913302d7a6b6435", "default_reading": { "applied": true, "removed_stat_vars": [] @@ -4575,7 +4580,8 @@ "basis": "structural", "available_at_place": true, "measure_label_axes": [], - "measure_axis_values": [] + "measure_axis_values": [], + "published_tables": "Kenya Census" } }, { @@ -6163,7 +6169,7 @@ "start_year": 2013, "end_year": 2022 }, - "capability_version": "cap_765c9d2a0c7529b9", + "capability_version": "cap_4913302d7a6b6435", "default_reading": { "applied": true, "removed_stat_vars": [] @@ -6173,7 +6179,8 @@ "basis": "structural", "available_at_place": true, "measure_label_axes": [], - "measure_axis_values": [] + "measure_axis_values": [], + "published_tables": "Nigeria Statistics" } } ], @@ -6189,30 +6196,30 @@ "variable_text": "GDP", "warnings": [], "timing_ms": { - "total": 1533, + "total": 2061, "by_step": { "recall": 1, - "phase_resolve_places": 92, + "phase_resolve_places": 80, "phase_check_entities": 0, - "shape_arcs": 4, + "shape_arcs": 1, "shape_probe_coverage": 1, - "shape_probe": 107, - "shape_groups": 78, - "shape_labels": 14, - "shape_admission": 2, + "shape_probe": 173, + "shape_groups": 62, + "shape_labels": 11, + "shape_admission": 23, "phase_derive_shapes": 0, - "shape": 503, + "shape": 612, "phase_prune_and_rank": 0, - "bind": 145, - "phase_bind": 14, - "phase_settle": 8, - "phase_place_bindings": 20, + "bind": 140, + "phase_bind": 15, + "phase_settle": 51, + "phase_place_bindings": 26, "phase_facet_requests": 0, - "materialise": 199, - "phase_materialise": 19, - "answer": 61, - "options": 144, - "phase_outcome": 327 + "materialise": 396, + "phase_materialise": 18, + "answer": 92, + "options": 165, + "phase_outcome": 465 } }, "restatement": { @@ -8714,7 +8721,7 @@ "start_year": 2013, "end_year": 2022 }, - "capability_version": "cap_765c9d2a0c7529b9", + "capability_version": "cap_4913302d7a6b6435", "default_reading": { "applied": true, "removed_stat_vars": [ @@ -10283,7 +10290,7 @@ "start_year": 2013, "end_year": 2022 }, - "capability_version": "cap_765c9d2a0c7529b9", + "capability_version": "cap_4913302d7a6b6435", "default_reading": { "applied": true, "removed_stat_vars": [ @@ -10322,18 +10329,20 @@ "confidence": "high", "available_at_place": true, "measure_label_axes": [], - "measure_axis_values": [] + "measure_axis_values": [], + "published_tables": "IMF World Economic Outlook (WEO)" } } ], "measure_label_axes": [], "measure_axis_values": [], + "published_tables": "World Development Indicators", "related_measures": [] } } } ], - "rendered_sentence": "Answered 1 of 2 parts. Mortality has 3 readings. Deaths rate per capita in the 48 countries in Sub-Saharan Africa. World Development Indicators · 2013 to 2022. Number of deaths in the 48 countries in Sub-Saharan Africa. Kenya Census · 2018 to 2022. Count of mortality event (as fraction of count birth event live birth) in the 48 countries in Sub-Saharan Africa. Nigeria Statistics · 2014. GDP in the 48 countries in Sub-Saharan Africa, 2013 to 2022. Current US dollars · World Development Indicators. The data holds no values for 1 of the 48 countries in Sub-Saharan Africa. You asked for sub-Saharan Africa. This shows the countries in it, each on its own.", + "rendered_sentence": "Answered 1 of 2 parts. Mortality has 3 readings. Deaths rate per 1,000 people in the 48 countries in Sub-Saharan Africa. World Development Indicators · 2013 to 2022. Number of deaths in the 48 countries in Sub-Saharan Africa. Kenya Census · 2018 to 2022. Count of mortality event (as fraction of count birth event live birth) in the 48 countries in Sub-Saharan Africa. Nigeria Statistics · 2014. GDP in the 48 countries in Sub-Saharan Africa, 2013 to 2022. Current US dollars · World Development Indicators. The data holds no values for 1 of the 48 countries in Sub-Saharan Africa. You asked for sub-Saharan Africa. This shows the countries in it, each on its own.", "sentence_plan": [ { "kind": "text", @@ -10392,7 +10401,7 @@ }, { "kind": "text", - "text": "per capita", + "text": "per 1,000 people", "segment": "heading", "entity_refs": [], "states": [], @@ -11038,7 +11047,7 @@ "status": 200, "headers": { "content-type": "application/json", - "x-dfo-trace-id": "600d857b0d8d4a1396104f5a8b22da07" + "x-dfo-trace-id": "cf12157f030c4aaa8fdd0e90fffa40fa" }, "json": { "schema_version": 1, @@ -11047,11 +11056,11 @@ "extract_skipped": true }, "diagnostics": { - "engine_build": "d80df9f5fd598b7345255470932d202ee5d49942", - "trace_id": "600d857b0d8d4a1396104f5a8b22da07", + "engine_build": "ccb6617922c839ce3cd5615a3bbb65c70bfe1bde", + "trace_id": "cf12157f030c4aaa8fdd0e90fffa40fa", "warnings": [], "timing_ms": { - "total": 1385, + "total": 1433, "by_step": { "coverage": 0 } @@ -11064,19 +11073,39 @@ "variable_text": "mortality", "warnings": [], "timing_ms": { - "total": 565, + "total": 689, "by_step": { - "validate": 0, - "walk": 1, + "validate": 1, + "phase_validate": 0, + "walk": 0, "reread_arcs": 0, + "phase_reread_arcs": 0, "detect_edits": 0, + "phase_detect_edits": 0, "resolve_survivors": 0, - "shape": 187, + "phase_resolve_survivors": 0, + "shape": 141, + "phase_build_shape": 0, "bind": 0, - "where_places": 0, - "materialise": 240, + "phase_build_bindings": 0, + "where_places": 1, + "phase_where_places": 0, + "materialise": 338, + "phase_materialise": 0, + "ground_related": 1, + "ground_units": 0, + "ground_facets": 0, + "ground_convert": 0, "answer": 9, - "options": 128 + "ground_gates": 0, + "phase_ground_build": 86, + "finalize_preview": 0, + "options": 110, + "finalize_related": 0, + "finalize_wholes": 0, + "finalize_relaunch": 0, + "phase_finalize": 2, + "served_entry": 0 } }, "entity_refs": [], @@ -12093,7 +12122,7 @@ "source": "observed" } ], - "rendered_sentence": "Deaths rate per capita in the 48 countries in Sub-Saharan Africa, 2013 to 2022. World Development Indicators.", + "rendered_sentence": "Deaths rate per 1,000 people in the 48 countries in Sub-Saharan Africa, 2013 to 2022. World Development Indicators.", "sentence_plan": [ { "kind": "slot", @@ -12112,11 +12141,14 @@ }, { "kind": "slot", - "text": "per capita", + "text": "per 1,000 people", "axis": "unit", "segment": "heading", + "binding_ref": "unit:", "entity_refs": [], - "states": [] + "states": [ + "unit:" + ] }, { "kind": "slot", @@ -12646,12 +12678,13 @@ "start_year": 2013, "end_year": 2022 }, - "capability_version": "cap_765c9d2a0c7529b9" + "capability_version": "cap_4913302d7a6b6435" }, "confidence": "high", "available_at_place": true, "measure_label_axes": [], "measure_axis_values": [], + "published_tables": "World Development Indicators", "related_measures": [] } } @@ -12660,19 +12693,39 @@ "variable_text": "GDP", "warnings": [], "timing_ms": { - "total": 1244, + "total": 1409, "by_step": { "validate": 0, + "phase_validate": 0, "walk": 0, - "reread_arcs": 0, + "reread_arcs": 1, + "phase_reread_arcs": 0, "detect_edits": 0, + "phase_detect_edits": 0, "resolve_survivors": 0, - "shape": 915, + "phase_resolve_survivors": 0, + "shape": 649, + "phase_build_shape": 0, "bind": 0, - "where_places": 0, - "materialise": 204, + "phase_build_bindings": 0, + "where_places": 1, + "phase_where_places": 0, + "materialise": 490, + "phase_materialise": 0, + "ground_related": 1, + "ground_units": 0, + "ground_facets": 8, + "ground_convert": 0, "answer": 8, - "options": 117 + "ground_gates": 123, + "phase_ground_build": 17, + "finalize_preview": 0, + "options": 109, + "finalize_related": 0, + "finalize_wholes": 0, + "finalize_relaunch": 1, + "phase_finalize": 1, + "served_entry": 0 } }, "entity_refs": [], @@ -14804,18 +14857,19 @@ "start_year": 2013, "end_year": 2022 }, - "capability_version": "cap_765c9d2a0c7529b9" + "capability_version": "cap_4913302d7a6b6435" }, "confidence": "high", "available_at_place": true, "measure_label_axes": [], "measure_axis_values": [], + "published_tables": "World Development Indicators", "related_measures": [] } } } ], - "rendered_sentence": "Deaths rate per capita in the 48 countries in Sub-Saharan Africa, 2013 to 2022. World Development Indicators. This shows the 48 countries in Sub-Saharan Africa, each on its own. GDP in the 48 countries in Sub-Saharan Africa, 2013 to 2022. Current US dollars · World Development Indicators. The data holds no values for 1 of the 48 countries in Sub-Saharan Africa. This shows the 48 countries in Sub-Saharan Africa, each on its own.", + "rendered_sentence": "Deaths rate per 1,000 people in the 48 countries in Sub-Saharan Africa, 2013 to 2022. World Development Indicators. This shows the 48 countries in Sub-Saharan Africa, each on its own. GDP in the 48 countries in Sub-Saharan Africa, 2013 to 2022. Current US dollars · World Development Indicators. The data holds no values for 1 of the 48 countries in Sub-Saharan Africa. This shows the 48 countries in Sub-Saharan Africa, each on its own.", "sentence_plan": [ { "kind": "slot", @@ -14836,11 +14890,14 @@ }, { "kind": "slot", - "text": "per capita", + "text": "per 1,000 people", "axis": "unit", "segment": "heading", + "binding_ref": "unit:", "entity_refs": [], - "states": [], + "states": [ + "unit:" + ], "part_index": 0 }, { @@ -15245,7 +15302,7 @@ "status": 200, "headers": { "content-type": "application/json", - "x-dfo-trace-id": "eda4b58fea364fa8b3fbbdd89e20714d" + "x-dfo-trace-id": "1f520b00e9454fa69ea28d6f12d3da3b" }, "json": { "schema_version": 1, @@ -15505,8 +15562,8 @@ "family_member_digest": "c090b56d31a596a8be16dafb518382db666c6b100a80534c3cb81dbfe3111c5d", "frame_grammar_version": "1.1.0", "origin_catalogue_build_id": "20261023T061534Z-06fa7b89", - "served_from": "head", - "confirmed_at": "2026-10-26T09:23:37.491397+00:00" + "served_from": "materialise", + "confirmed_at": "2026-11-01T07:39:35.304269+00:00" }, "warnings": [], "diagnostics": [ @@ -15545,7 +15602,7 @@ ], "series_count": 48, "output_options": { - "capability_version": "dset_76f5fa7244511c58", + "capability_version": "dset_5282a0674178a233", "columns": [ { "name": "stat_var", @@ -15622,7 +15679,8 @@ "covered": 48 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": false }, { "column": "observationAbout", @@ -15640,7 +15698,8 @@ "label": "South Sudan" } ], - "truncated": false + "truncated": false, + "in_long_layout": false }, { "column": "observationAbout", @@ -15652,7 +15711,8 @@ "covered": 48 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true }, { "column": "observationAbout", @@ -15664,7 +15724,8 @@ "covered": 48 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": false } ], "long_layout_defaults": [ @@ -15705,7 +15766,7 @@ ] } }, - "series_coverage_stamp": "e6e717ab8c77e84d010915893ede5809e9ecec67929a07cfafbcc2210edfa1eb", + "series_coverage_stamp": "ad27fd11738abb03d2d84dc214e223f04781609636cf678d0d08c385fb863d99", "retention": { "pinned": false, "held_until": "2026-11-22T17:40:52.293692Z" @@ -15723,7 +15784,7 @@ "headers": { "content-type": "text/html", "location": "https://storage.googleapis.com/dev-fin-observatory-datasets-working/sha256%3Ab8b53c89363b53919fb9d1501ad052892123e12fb4e788f67af0513b6e938937?X-Goog-Signature=redacted", - "x-dfo-trace-id": "26ade94d58da490982f1d8f48d45f655" + "x-dfo-trace-id": "27abe047ff8441acaf9e7100a7ecf3af" } } }, @@ -15865,7 +15926,7 @@ "status": 200, "headers": { "content-type": "application/json", - "x-dfo-trace-id": "bccfe916299a4c878ffd63c2ab263027" + "x-dfo-trace-id": "c87605f55b0d45e4b7a650c892df69c6" }, "json": { "schema_version": 1, @@ -16089,8 +16150,8 @@ "family_member_digest": "73519eeb75639bdae33042fc844830cd46becc08e4f9122dfcd0886e9875f657", "frame_grammar_version": "1.1.0", "origin_catalogue_build_id": "20261023T061534Z-06fa7b89", - "served_from": "head", - "confirmed_at": "2026-10-26T09:23:38.856824+00:00" + "served_from": "materialise", + "confirmed_at": "2026-11-01T07:39:37.502297+00:00" }, "warnings": [ { @@ -16135,7 +16196,7 @@ ], "series_count": 47, "output_options": { - "capability_version": "dset_76f5fa7244511c58", + "capability_version": "dset_5282a0674178a233", "columns": [ { "name": "stat_var", @@ -16212,7 +16273,8 @@ "covered": 47 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": false }, { "column": "observationAbout", @@ -16230,7 +16292,8 @@ "label": "South Sudan" } ], - "truncated": false + "truncated": false, + "in_long_layout": false }, { "column": "observationAbout", @@ -16242,7 +16305,8 @@ "covered": 47 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true }, { "column": "observationAbout", @@ -16254,7 +16318,8 @@ "covered": 47 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": false } ], "long_layout_defaults": [ @@ -16295,7 +16360,7 @@ ] } }, - "series_coverage_stamp": "e6e717ab8c77e84d010915893ede5809e9ecec67929a07cfafbcc2210edfa1eb", + "series_coverage_stamp": "ad27fd11738abb03d2d84dc214e223f04781609636cf678d0d08c385fb863d99", "retention": { "pinned": false, "held_until": "2026-11-22T17:40:54.208730Z" @@ -16313,7 +16378,7 @@ "headers": { "content-type": "text/html", "location": "https://storage.googleapis.com/dev-fin-observatory-datasets-working/sha256%3Aaf952b05a7ac047731b039b51f8876806d9c89beba61b9e94c5f552a75f175ef?X-Goog-Signature=redacted", - "x-dfo-trace-id": "c85bcbaef6224ecb95aedae047d77704" + "x-dfo-trace-id": "adf27fe296e640c786428aa9f335936e" } } }, @@ -16336,7 +16401,7 @@ "answer": { "kind": "resolution", "status": "mixed", - "sentence": "Answered 1 of 2 parts. Mortality has 3 readings. Deaths rate per capita in the 48 countries in Sub-Saharan Africa. World Development Indicators · 2013 to 2022. Number of deaths in the 48 countries in Sub-Saharan Africa. Kenya Census · 2018 to 2022. Count of mortality event (as fraction of count birth event live birth) in the 48 countries in Sub-Saharan Africa. Nigeria Statistics · 2014. GDP in the 48 countries in Sub-Saharan Africa, 2013 to 2022. Current US dollars · World Development Indicators. The data holds no values for 1 of the 48 countries in Sub-Saharan Africa. You asked for sub-Saharan Africa. This shows the countries in it, each on its own.", + "sentence": "Answered 1 of 2 parts. Mortality has 3 readings. Deaths rate per 1,000 people in the 48 countries in Sub-Saharan Africa. World Development Indicators · 2013 to 2022. Number of deaths in the 48 countries in Sub-Saharan Africa. Kenya Census · 2018 to 2022. Count of mortality event (as fraction of count birth event live birth) in the 48 countries in Sub-Saharan Africa. Nigeria Statistics · 2014. GDP in the 48 countries in Sub-Saharan Africa, 2013 to 2022. Current US dollars · World Development Indicators. The data holds no values for 1 of the 48 countries in Sub-Saharan Africa. You asked for sub-Saharan Africa. This shows the countries in it, each on its own.", "complete": false, "specs": [ "spec_310c03c5f99c73c41d12226098714f81" @@ -16354,7 +16419,7 @@ "answer": { "kind": "resolution", "status": "definite", - "sentence": "Deaths rate per capita in the 48 countries in Sub-Saharan Africa, 2013 to 2022. World Development Indicators. This shows the 48 countries in Sub-Saharan Africa, each on its own. GDP in the 48 countries in Sub-Saharan Africa, 2013 to 2022. Current US dollars · World Development Indicators. The data holds no values for 1 of the 48 countries in Sub-Saharan Africa. This shows the 48 countries in Sub-Saharan Africa, each on its own.", + "sentence": "Deaths rate per 1,000 people in the 48 countries in Sub-Saharan Africa, 2013 to 2022. World Development Indicators. This shows the 48 countries in Sub-Saharan Africa, each on its own. GDP in the 48 countries in Sub-Saharan Africa, 2013 to 2022. Current US dollars · World Development Indicators. The data holds no values for 1 of the 48 countries in Sub-Saharan Africa. This shows the 48 countries in Sub-Saharan Africa, each on its own.", "complete": true, "specs": [ "spec_176fd5e63bb2a122c4ad00831497b863", @@ -16402,7 +16467,7 @@ ], "spec_id": "spec_176fd5e63bb2a122c4ad00831497b863", "content_version": "cv_6c43e754af661c87eb22e7a21595a732", - "sentence": "Deaths rate per capita in the 48 countries in Sub-Saharan Africa, 2013 to 2022. World Development Indicators." + "sentence": "Deaths rate per 1,000 people in the 48 countries in Sub-Saharan Africa, 2013 to 2022. World Development Indicators." }, { "parts": [ diff --git a/python/client-contract/src/dfo_client_contract/scenarios/choose-echo-drops-malformed-items.json b/python/client-contract/src/dfo_client_contract/scenarios/choose-echo-drops-malformed-items.json index 52fe91d..2c792ae 100644 --- a/python/client-contract/src/dfo_client_contract/scenarios/choose-echo-drops-malformed-items.json +++ b/python/client-contract/src/dfo_client_contract/scenarios/choose-echo-drops-malformed-items.json @@ -35,7 +35,7 @@ "status": 200, "headers": { "content-type": "application/json", - "x-dfo-trace-id": "77333f3756d7434fa7476addd497eff0" + "x-dfo-trace-id": "e819d7601d9e41d89c4792cae76ea34a" }, "json": { "schema_version": 1, @@ -46,23 +46,24 @@ "extract_skipped": false }, "diagnostics": { - "engine_build": "d80df9f5fd598b7345255470932d202ee5d49942", - "trace_id": "77333f3756d7434fa7476addd497eff0", + "engine_build": "ccb6617922c839ce3cd5615a3bbb65c70bfe1bde", + "trace_id": "e819d7601d9e41d89c4792cae76ea34a", "warnings": [], "timing_ms": { - "total": 4076, + "total": 6019, "by_step": { "coverage": 0, - "extract": 1095, - "cache_lookup": 0 + "extract": 964, + "exclusion_read": 691, + "cache_lookup": 1 } }, "llm_usage": { - "input_tokens": 2242, - "output_tokens": 197, + "input_tokens": 2806, + "output_tokens": 206, "cached_tokens": 843, - "jev_input_tokens": 21368, - "jev_output_tokens": 4607 + "jev_input_tokens": 21477, + "jev_output_tokens": 4635 }, "timed_out": false }, @@ -78,31 +79,31 @@ } ], "timing_ms": { - "total": 2673, + "total": 3654, "by_step": { "recall": 1, "phase_resolve_places": 0, "phase_check_entities": 0, - "shape_arcs": 5, - "shape_probe": 91, - "shape_groups": 6, + "shape_arcs": 2, + "shape_probe": 72, + "shape_groups": 7, "shape_labels": 1, - "shape_admission": 1, + "shape_admission": 2, "phase_derive_shapes": 0, - "shape": 214, + "shape": 216, "phase_prune_and_rank": 0, - "bind": 134, - "phase_bind": 13, + "bind": 168, + "phase_bind": 17, "phase_settle": 1, - "phase_place_bindings": 34, + "phase_place_bindings": 43, "phase_facet_requests": 0, - "materialise": 106, - "phase_materialise": 29, - "answer": 54, - "phase_outcome": 2087 + "materialise": 95, + "phase_materialise": 26, + "answer": 72, + "phase_outcome": 3015 } }, - "rendered_sentence": "2 readings. Kenya's deaths rate per capita. World Development Indicators · 2013 to 2022. Kenya's number of deaths. Kenya Census · 2018 to 2022. You named Kenya as a recipient. This measure has no recipients, so this shows the place itself.", + "rendered_sentence": "2 readings. Kenya's deaths rate per 1,000 people. World Development Indicators · 2013 to 2022. Kenya's number of deaths. Kenya Census · 2018 to 2022. You named Kenya as a recipient. This measure has no recipients, so this shows the place itself.", "sentence_plan": [ { "kind": "text", @@ -155,7 +156,7 @@ }, { "kind": "text", - "text": "per capita", + "text": "per 1,000 people", "segment": "heading", "entity_refs": [], "states": [] @@ -656,7 +657,7 @@ "source": "observed" } ], - "rendered_sentence": "Kenya's deaths rate per capita, 2013 to 2022. World Development Indicators.", + "rendered_sentence": "Kenya's deaths rate per 1,000 people, 2013 to 2022. World Development Indicators.", "sentence_plan": [ { "kind": "slot", @@ -701,11 +702,14 @@ }, { "kind": "slot", - "text": "per capita", + "text": "per 1,000 people", "axis": "unit", "segment": "heading", + "binding_ref": "unit:", "entity_refs": [], - "states": [] + "states": [ + "unit:" + ] }, { "kind": "slot", @@ -843,7 +847,7 @@ "start_year": 2013, "end_year": 2022 }, - "capability_version": "cap_765c9d2a0c7529b9", + "capability_version": "cap_4913302d7a6b6435", "default_reading": { "applied": true, "removed_stat_vars": [] @@ -852,7 +856,8 @@ "confidence": "high", "available_at_place": true, "measure_label_axes": [], - "measure_axis_values": [] + "measure_axis_values": [], + "published_tables": "World Development Indicators" } }, { @@ -1025,7 +1030,7 @@ "label": "data source" } ], - "member_count": 2978, + "member_count": 2979, "refine_supported": true, "data_commons": [ { @@ -2395,7 +2400,7 @@ "start_year": 2013, "end_year": 2022 }, - "capability_version": "cap_765c9d2a0c7529b9", + "capability_version": "cap_4913302d7a6b6435", "default_reading": { "applied": true, "removed_stat_vars": [] @@ -2405,7 +2410,8 @@ "basis": "structural", "available_at_place": true, "measure_label_axes": [], - "measure_axis_values": [] + "measure_axis_values": [], + "published_tables": "Kenya Census" } } ], @@ -2438,30 +2444,30 @@ } ], "timing_ms": { - "total": 2976, + "total": 5044, "by_step": { - "recall": 771, - "phase_resolve_places": 1, + "recall": 2521, + "phase_resolve_places": 0, "phase_check_entities": 0, - "shape_arcs": 2, - "shape_probe_coverage": 21, - "shape_probe": 111, - "shape_groups": 66, + "shape_arcs": 1, + "shape_probe_coverage": 1006, + "shape_probe": 1131, + "shape_groups": 152, "shape_labels": 0, "shape_admission": 0, "phase_derive_shapes": 0, - "shape": 621, + "shape": 1733, "phase_prune_and_rank": 0, - "bind": 681, - "phase_bind": 341, - "phase_settle": 11, - "phase_place_bindings": 111, + "bind": 171, + "phase_bind": 320, + "phase_settle": 7, + "phase_place_bindings": 98, "phase_facet_requests": 0, - "materialise": 20, + "materialise": 17, "phase_materialise": 4, - "answer": 257, - "options": 11, - "phase_outcome": 147 + "answer": 10, + "options": 31, + "phase_outcome": 132 } }, "restatement": { @@ -2506,8 +2512,8 @@ { "code": "closest_match", "asked": "aid flows", - "shown": "gross disbursements", - "text": "You asked for aid flows. This shows gross disbursements, the closest measure the data holds." + "shown": "net disbursements", + "text": "You asked for aid flows. This shows net disbursements, the closest measure the data holds." }, { "code": "whole_total_read", @@ -2543,10 +2549,10 @@ ], "status": "definite", "spec": { - "spec_id": "spec_f24e46ae9854884308fc0f33d154361e", + "spec_id": "spec_f025379e211db08849c7f98c627e025c", "definition": { "schema_version": 1, - "spec_id": "spec_f24e46ae9854884308fc0f33d154361e", + "spec_id": "spec_f025379e211db08849c7f98c627e025c", "identity": { "identity_version": "spec1", "shape": { @@ -2581,7 +2587,7 @@ "property": "nettingBasis", "binding": { "state": "value", - "ref": "Gross" + "ref": "Net" } } ], @@ -2603,7 +2609,7 @@ "resolved": { "shape": { "shape_id": "financialflow_amount_measuredvalue_nominal_family_f096b1ba", - "label": "gross disbursements (official development assistance)", + "label": "net disbursements (official development assistance)", "population_type": { "ref": "FinancialFlow", "label": "financial flow" @@ -2668,7 +2674,7 @@ } ], "member_count": 1, - "member_digest": "1a36e1a7292b1bfff95a5415de0be74cac7bb033217ed50e79faa8ce51a224c0", + "member_digest": "c2d373442ac21a31377df76cd343f156c72a530649757c399c6661cbf56c9a71", "refine_supported": true, "data_commons": [ { @@ -2733,8 +2739,8 @@ "kind": "value", "value": { "ref": { - "ref": "Gross", - "label": "gross" + "ref": "Net", + "label": "net" }, "value_kind": "enum_value" } @@ -2835,6 +2841,7 @@ "whole_of": [ "official" ], + "holds_multilaterals": true, "side_classes": [ "official", "private", @@ -2921,7 +2928,7 @@ "label": "OECD Terms and Conditions" } }, - "coverage_stamp": "e6e717ab8c77e84d010915893ede5809e9ecec67929a07cfafbcc2210edfa1eb", + "coverage_stamp": "ad27fd11738abb03d2d84dc214e223f04781609636cf678d0d08c385fb863d99", "facets": { "provenance": { "basis": "fallback", @@ -2973,8 +2980,8 @@ { "value": { "ref": { - "ref": "DAC2aAidType201", - "label": "ODA grant" + "ref": "DAC2aAidType219", + "label": "recovery on ODA grants and capital subscriptions" }, "value_kind": "enum_value" }, @@ -2987,8 +2994,8 @@ { "value": { "ref": { - "ref": "DAC2aAidType207", - "label": "free-standing technical co-operation" + "ref": "DAC2aAidType209", + "label": "interest received on ODA lending" }, "value_kind": "enum_value" }, @@ -3000,8 +3007,8 @@ { "value": { "ref": { - "ref": "DAC2aAidType213", - "label": "developmental food aid" + "ref": "DAC2aAidType250", + "label": "official development assistance excluding debt relief" }, "value_kind": "enum_value" }, @@ -3013,14 +3020,14 @@ { "value": { "ref": { - "ref": "DAC2aAidType216", - "label": "humanitarian aid" + "ref": "DAC2aAidType255", + "label": "debt relief" }, "value_kind": "enum_value" }, "relation": "root", "member_count": 1, - "served_rows": 10, + "served_rows": 7, "served_rows_exact": true } ], @@ -3063,11 +3070,11 @@ "source": "observed" } ], - "rendered_sentence": "Gross disbursements to Kenya from official donors (DAC) for official development assistance, 2013 to 2022. Current US dollars · OECD DAC2a.", + "rendered_sentence": "Net disbursements to Kenya from official donors (DAC) for official development assistance, 2013 to 2022. Current US dollars · OECD DAC2a.", "sentence_plan": [ { "kind": "slot", - "text": "Gross disbursements", + "text": "Net disbursements", "axis": "what", "segment": "heading", "entity_refs": [], @@ -3312,8 +3319,8 @@ "binding_kind": "value", "refs": [ { - "ref": "Gross", - "label": "gross" + "ref": "Net", + "label": "net" } ], "provenance": "measure_elected" @@ -3369,7 +3376,7 @@ "start_year": 2013, "end_year": 2022 }, - "capability_version": "cap_765c9d2a0c7529b9", + "capability_version": "cap_4913302d7a6b6435", "default_reading": { "applied": true, "removed_stat_vars": [] @@ -3377,108 +3384,8 @@ }, "confidence": "high", "available_at_place": true, - "alternative_measures": [ - { - "definition": { - "schema_version": 1, - "spec_id": "spec_f025379e211db08849c7f98c627e025c", - "identity": { - "identity_version": "spec1", - "shape": { - "kind": "statvar_schema", - "population_type": "FinancialFlow", - "measured_property": "amount", - "stat_type": "measuredValue", - "measurement_qualifier": "Nominal" - }, - "slots": [ - { - "property": "dac2aAidType", - "binding": { - "state": "value", - "ref": "DAC2aAidType206" - } - }, - { - "property": "dacTypeOfFinance", - "binding": { - "state": "unbound" - } - }, - { - "property": "financialFlowType", - "binding": { - "state": "value", - "ref": "Disbursement" - } - }, - { - "property": "nettingBasis", - "binding": { - "state": "value", - "ref": "Net" - } - } - ], - "entities": { - "destination": [ - "country/KEN" - ], - "origin": [ - "DACOfficialDonors" - ] - }, - "requested_window": { - "kind": "range", - "start_year": 2013, - "end_year": 2022 - } - } - }, - "label": "net disbursements", - "axis": "what", - "measure_axis_values": [ - { - "axis": "populationType", - "value": { - "ref": "FinancialFlow", - "label": "financial flow" - } - }, - { - "axis": "measuredProperty", - "value": { - "ref": "amount", - "label": "amount" - } - }, - { - "axis": "measurementQualifier", - "value": { - "ref": "Nominal", - "label": "nominal" - } - }, - { - "axis": "financialFlowType", - "value": { - "ref": "Disbursement", - "label": "disbursement" - } - }, - { - "axis": "nettingBasis", - "value": { - "ref": "Net", - "label": "net" - } - } - ], - "served_rows": 10, - "served_rows_exact": true - } - ], - "measure_label": "gross disbursements", + "alternative_measures": [], + "measure_label": "net disbursements", "measure_label_axes": [ "populationType", "measuredProperty", @@ -3518,11 +3425,13 @@ { "axis": "nettingBasis", "value": { - "ref": "Gross", - "label": "gross" + "ref": "Net", + "label": "net" } } ], + "concept_label": "official development assistance", + "published_tables": "OECD DAC2a", "unit_conversion": { "currencies": [ { @@ -5487,12 +5396,256 @@ "role_currencies": { "destination": "KES" } + }, + "scope_choices": { + "id": "spec_f025379e211db08849c7f98c627e025c", + "base": { + "schema_version": 1, + "spec_id": "spec_f025379e211db08849c7f98c627e025c", + "identity": { + "identity_version": "spec1", + "shape": { + "kind": "statvar_schema", + "population_type": "FinancialFlow", + "measured_property": "amount", + "stat_type": "measuredValue", + "measurement_qualifier": "Nominal" + }, + "slots": [ + { + "property": "dac2aAidType", + "binding": { + "state": "value", + "ref": "DAC2aAidType206" + } + }, + { + "property": "dacTypeOfFinance", + "binding": { + "state": "unbound" + } + }, + { + "property": "financialFlowType", + "binding": { + "state": "value", + "ref": "Disbursement" + } + }, + { + "property": "nettingBasis", + "binding": { + "state": "value", + "ref": "Net" + } + } + ], + "entities": { + "destination": [ + "country/KEN" + ], + "origin": [ + "DACOfficialDonors" + ] + }, + "requested_window": { + "kind": "range", + "start_year": 2013, + "end_year": 2022 + } + } + }, + "rule_version": "scope1:3eef00a928eedd463ee48d02b79730da", + "entries": [], + "dropped_entries": [], + "choices": [ + { + "id": "spec_f025379e211db08849c7f98c627e025c:measure_basis", + "axis": "measure_basis", + "rule": "measure_basis_convention", + "provenance": "default", + "active": "measure_basis:net", + "options": [ + { + "option_id": "measure_basis:gross", + "label": "gross disbursements, current USD", + "binding": { + "kind": "shape", + "measured_property": "amount", + "netting_basis": "Gross" + }, + "availability": { + "status": "available", + "detail": {} + } + }, + { + "option_id": "measure_basis:net", + "label": "net disbursements, current USD", + "binding": { + "kind": "shape", + "measured_property": "amount", + "netting_basis": "Net" + }, + "availability": { + "status": "available", + "detail": {} + } + }, + { + "option_id": "measure_basis:grant_equivalent", + "label": "grant equivalents (OECD headline), current USD", + "binding": { + "kind": "shape", + "measured_property": "grantEquivalent", + "netting_basis": null + }, + "availability": { + "status": "unavailable", + "code": "basis_not_published", + "detail": { + "dataset": "provenance/OECDDAC2A" + } + } + }, + { + "option_id": "measure_basis:commitments", + "label": "commitments, current USD", + "binding": { + "kind": "shape", + "measured_property": "amount", + "netting_basis": null + }, + "availability": { + "status": "unavailable", + "code": "basis_not_published", + "detail": { + "dataset": "provenance/OECDDAC2A" + } + } + } + ] + } + ], + "compiled": { + "spec_id": "spec_f025379e211db08849c7f98c627e025c", + "identity": { + "identity_version": "spec1", + "shape": { + "kind": "statvar_schema", + "population_type": "FinancialFlow", + "measured_property": "amount", + "stat_type": "measuredValue", + "measurement_qualifier": "Nominal" + }, + "slots": [ + { + "property": "dac2aAidType", + "binding": { + "state": "value", + "ref": "DAC2aAidType206" + } + }, + { + "property": "dacTypeOfFinance", + "binding": { + "state": "unbound" + } + }, + { + "property": "financialFlowType", + "binding": { + "state": "value", + "ref": "Disbursement" + } + }, + { + "property": "nettingBasis", + "binding": { + "state": "value", + "ref": "Net" + } + } + ], + "entities": { + "destination": [ + "country/KEN" + ], + "origin": [ + "DACOfficialDonors" + ] + }, + "requested_window": { + "kind": "range", + "start_year": 2013, + "end_year": 2022 + } + }, + "components": [ + { + "role": "whole", + "identity": { + "identity_version": "spec1", + "shape": { + "kind": "statvar_schema", + "population_type": "FinancialFlow", + "measured_property": "amount", + "stat_type": "measuredValue", + "measurement_qualifier": "Nominal" + }, + "slots": [ + { + "property": "dac2aAidType", + "binding": { + "state": "value", + "ref": "DAC2aAidType206" + } + }, + { + "property": "dacTypeOfFinance", + "binding": { + "state": "unbound" + } + }, + { + "property": "financialFlowType", + "binding": { + "state": "value", + "ref": "Disbursement" + } + }, + { + "property": "nettingBasis", + "binding": { + "state": "value", + "ref": "Net" + } + } + ], + "entities": { + "destination": [ + "country/KEN" + ], + "origin": [ + "DACOfficialDonors" + ] + }, + "requested_window": { + "kind": "range", + "start_year": 2013, + "end_year": 2022 + } + } + } + ] + }, + "ledger": [] } } } } ], - "rendered_sentence": "Answered 1 of 2 parts. Mortality has 2 readings. Kenya's deaths rate per capita. World Development Indicators · 2013 to 2022. Kenya's number of deaths. Kenya Census · 2018 to 2022. You named Kenya as a recipient. This measure has no recipients, so this shows the place itself. Gross disbursements to Kenya from official donors (DAC) for official development assistance, 2013 to 2022. Current US dollars · OECD DAC2a. You asked for aid flows. This shows gross disbursements, the closest measure the data holds. No donor was named, so this shows official donors (DAC), the source's total for every official donor. Private donors are outside it. To list each donor, add \"for each donor\" to the question. Assumed: official development assistance.", + "rendered_sentence": "Answered 1 of 2 parts. Mortality has 2 readings. Kenya's deaths rate per 1,000 people. World Development Indicators · 2013 to 2022. Kenya's number of deaths. Kenya Census · 2018 to 2022. You named Kenya as a recipient. This measure has no recipients, so this shows the place itself. Net disbursements to Kenya from official donors (DAC) for official development assistance, 2013 to 2022. Current US dollars · OECD DAC2a. You asked for aid flows. This shows net disbursements, the closest measure the data holds. No donor was named, so this shows official donors (DAC), the source's total for every official donor. Private donors are outside it. To list each donor, add \"for each donor\" to the question. Assumed: official development assistance.", "sentence_plan": [ { "kind": "text", @@ -5575,7 +5728,7 @@ }, { "kind": "text", - "text": "per capita", + "text": "per 1,000 people", "segment": "heading", "entity_refs": [], "states": [], @@ -5742,7 +5895,7 @@ }, { "kind": "slot", - "text": "Gross disbursements", + "text": "Net disbursements", "axis": "what", "segment": "heading", "entity_refs": [], @@ -5939,7 +6092,7 @@ }, { "kind": "text", - "text": "You asked for aid flows. This shows gross disbursements, the closest measure the data holds.", + "text": "You asked for aid flows. This shows net disbursements, the closest measure the data holds.", "segment": "departure", "entity_refs": [], "states": [], @@ -6078,7 +6231,7 @@ "property": "nettingBasis", "binding": { "state": "value", - "ref": "Gross" + "ref": "Net" } } ], @@ -6103,6 +6256,7 @@ "whole_of": [ "official" ], + "holds_multilaterals": true, "side_classes": [ "official", "private", @@ -6149,7 +6303,7 @@ "status": 200, "headers": { "content-type": "application/json", - "x-dfo-trace-id": "73fbf797c20a40a4851f5d88882cf25a" + "x-dfo-trace-id": "a6b35269243c45939a1edd0882f75263" }, "json": { "schema_version": 1, @@ -6158,11 +6312,11 @@ "extract_skipped": true }, "diagnostics": { - "engine_build": "d80df9f5fd598b7345255470932d202ee5d49942", - "trace_id": "73fbf797c20a40a4851f5d88882cf25a", + "engine_build": "ccb6617922c839ce3cd5615a3bbb65c70bfe1bde", + "trace_id": "a6b35269243c45939a1edd0882f75263", "warnings": [], "timing_ms": { - "total": 1963, + "total": 817, "by_step": { "coverage": 0 } @@ -6175,19 +6329,39 @@ "variable_text": "mortality", "warnings": [], "timing_ms": { - "total": 277, + "total": 757, "by_step": { - "validate": 0, - "walk": 0, + "validate": 1, + "phase_validate": 0, + "walk": 230, "reread_arcs": 0, + "phase_reread_arcs": 0, "detect_edits": 0, + "phase_detect_edits": 0, "resolve_survivors": 0, - "shape": 178, - "bind": 1, + "phase_resolve_survivors": 0, + "shape": 262, + "phase_build_shape": 0, + "bind": 0, + "phase_build_bindings": 0, "where_places": 0, - "materialise": 96, - "answer": 1, - "options": 1 + "phase_where_places": 0, + "materialise": 95, + "phase_materialise": 0, + "ground_related": 1, + "ground_units": 0, + "ground_facets": 0, + "ground_convert": 0, + "answer": 75, + "ground_gates": 0, + "phase_ground_build": 2, + "finalize_preview": 0, + "options": 0, + "finalize_related": 91, + "finalize_wholes": 0, + "finalize_relaunch": 0, + "phase_finalize": 0, + "served_entry": 0 } }, "entity_refs": [], @@ -6522,7 +6696,7 @@ "source": "observed" } ], - "rendered_sentence": "Kenya's deaths rate per capita, 2013 to 2022. World Development Indicators.", + "rendered_sentence": "Kenya's deaths rate per 1,000 people, 2013 to 2022. World Development Indicators.", "sentence_plan": [ { "kind": "slot", @@ -6566,11 +6740,14 @@ }, { "kind": "slot", - "text": "per capita", + "text": "per 1,000 people", "axis": "unit", "segment": "heading", + "binding_ref": "unit:", "entity_refs": [], - "states": [] + "states": [ + "unit:" + ] }, { "kind": "slot", @@ -6706,12 +6883,13 @@ "start_year": 2013, "end_year": 2022 }, - "capability_version": "cap_765c9d2a0c7529b9" + "capability_version": "cap_4913302d7a6b6435" }, "confidence": "high", "available_at_place": true, "measure_label_axes": [], "measure_axis_values": [], + "published_tables": "World Development Indicators", "related_group": { "ref": "dc/g/MortalityEvent", "label": "Mortality Event" @@ -6755,19 +6933,39 @@ "variable_text": "aid flows", "warnings": [], "timing_ms": { - "total": 1896, + "total": 108, "by_step": { "validate": 0, - "walk": 13, - "reread_arcs": 1, + "phase_validate": 0, + "walk": 14, + "reread_arcs": 0, + "phase_reread_arcs": 0, "detect_edits": 0, + "phase_detect_edits": 0, "resolve_survivors": 0, - "shape": 1838, - "bind": 1, + "phase_resolve_survivors": 0, + "shape": 1, + "phase_build_shape": 0, + "bind": 0, + "phase_build_bindings": 0, "where_places": 0, - "materialise": 18, - "answer": 8, - "options": 17 + "phase_where_places": 0, + "materialise": 19, + "phase_materialise": 0, + "ground_related": 0, + "ground_units": 0, + "ground_facets": 0, + "ground_convert": 0, + "answer": 9, + "ground_gates": 4, + "phase_ground_build": 58, + "finalize_preview": 0, + "options": 3, + "finalize_related": 0, + "finalize_wholes": 0, + "finalize_relaunch": 0, + "phase_finalize": 0, + "served_entry": 0 } }, "entity_refs": [], @@ -6791,10 +6989,10 @@ ], "status": "definite", "spec": { - "spec_id": "spec_f24e46ae9854884308fc0f33d154361e", + "spec_id": "spec_f025379e211db08849c7f98c627e025c", "definition": { "schema_version": 1, - "spec_id": "spec_f24e46ae9854884308fc0f33d154361e", + "spec_id": "spec_f025379e211db08849c7f98c627e025c", "identity": { "identity_version": "spec1", "shape": { @@ -6829,7 +7027,7 @@ "property": "nettingBasis", "binding": { "state": "value", - "ref": "Gross" + "ref": "Net" } } ], @@ -6851,7 +7049,7 @@ "resolved": { "shape": { "shape_id": "financialflow_amount_measuredvalue_nominal_family_f096b1ba", - "label": "gross disbursements (official development assistance)", + "label": "net disbursements (official development assistance)", "population_type": { "ref": "FinancialFlow", "label": "financial flow" @@ -6916,7 +7114,7 @@ } ], "member_count": 1, - "member_digest": "1a36e1a7292b1bfff95a5415de0be74cac7bb033217ed50e79faa8ce51a224c0", + "member_digest": "c2d373442ac21a31377df76cd343f156c72a530649757c399c6661cbf56c9a71", "refine_supported": true, "data_commons": [ { @@ -6981,8 +7179,8 @@ "kind": "value", "value": { "ref": { - "ref": "Gross", - "label": "gross" + "ref": "Net", + "label": "net" }, "value_kind": "enum_value" } @@ -7082,6 +7280,7 @@ "whole_of": [ "official" ], + "holds_multilaterals": true, "side_classes": [ "official", "private", @@ -7168,7 +7367,7 @@ "label": "OECD Terms and Conditions" } }, - "coverage_stamp": "e6e717ab8c77e84d010915893ede5809e9ecec67929a07cfafbcc2210edfa1eb", + "coverage_stamp": "ad27fd11738abb03d2d84dc214e223f04781609636cf678d0d08c385fb863d99", "facets": { "provenance": { "basis": "fallback", @@ -7220,8 +7419,8 @@ { "value": { "ref": { - "ref": "DAC2aAidType201", - "label": "ODA grant" + "ref": "DAC2aAidType219", + "label": "recovery on ODA grants and capital subscriptions" }, "value_kind": "enum_value" }, @@ -7234,8 +7433,8 @@ { "value": { "ref": { - "ref": "DAC2aAidType207", - "label": "free-standing technical co-operation" + "ref": "DAC2aAidType209", + "label": "interest received on ODA lending" }, "value_kind": "enum_value" }, @@ -7247,8 +7446,8 @@ { "value": { "ref": { - "ref": "DAC2aAidType213", - "label": "developmental food aid" + "ref": "DAC2aAidType250", + "label": "official development assistance excluding debt relief" }, "value_kind": "enum_value" }, @@ -7260,14 +7459,14 @@ { "value": { "ref": { - "ref": "DAC2aAidType216", - "label": "humanitarian aid" + "ref": "DAC2aAidType255", + "label": "debt relief" }, "value_kind": "enum_value" }, "relation": "root", "member_count": 1, - "served_rows": 10, + "served_rows": 7, "served_rows_exact": true } ], @@ -7310,11 +7509,11 @@ "source": "observed" } ], - "rendered_sentence": "Gross disbursements to Kenya from official donors (DAC) for official development assistance, 2013 to 2022. Current US dollars · OECD DAC2a.", + "rendered_sentence": "Net disbursements to Kenya from official donors (DAC) for official development assistance, 2013 to 2022. Current US dollars · OECD DAC2a.", "sentence_plan": [ { "kind": "slot", - "text": "Gross disbursements", + "text": "Net disbursements", "axis": "what", "segment": "heading", "entity_refs": [], @@ -7559,8 +7758,8 @@ "binding_kind": "value", "refs": [ { - "ref": "Gross", - "label": "gross" + "ref": "Net", + "label": "net" } ], "provenance": "binder" @@ -7616,7 +7815,7 @@ "start_year": 2013, "end_year": 2022 }, - "capability_version": "cap_765c9d2a0c7529b9" + "capability_version": "cap_4913302d7a6b6435" }, "confidence": "high", "available_at_place": true, @@ -7624,7 +7823,7 @@ { "definition": { "schema_version": 1, - "spec_id": "spec_f025379e211db08849c7f98c627e025c", + "spec_id": "spec_f24e46ae9854884308fc0f33d154361e", "identity": { "identity_version": "spec1", "shape": { @@ -7659,7 +7858,7 @@ "property": "nettingBasis", "binding": { "state": "value", - "ref": "Net" + "ref": "Gross" } } ], @@ -7678,7 +7877,7 @@ } } }, - "label": "net disbursements", + "label": "gross disbursements", "axis": "what", "measure_axis_values": [ { @@ -7712,8 +7911,8 @@ { "axis": "nettingBasis", "value": { - "ref": "Net", - "label": "net" + "ref": "Gross", + "label": "gross" } } ], @@ -7721,7 +7920,7 @@ "served_rows_exact": true } ], - "measure_label": "gross disbursements", + "measure_label": "net disbursements", "measure_label_axes": [ "populationType", "measuredProperty", @@ -7761,11 +7960,13 @@ { "axis": "nettingBasis", "value": { - "ref": "Gross", - "label": "gross" + "ref": "Net", + "label": "net" } } ], + "concept_label": "official development assistance", + "published_tables": "OECD DAC2a", "unit_conversion": { "currencies": [ { @@ -9735,7 +9936,7 @@ } } ], - "rendered_sentence": "Kenya's deaths rate per capita, 2013 to 2022. World Development Indicators. Gross disbursements to Kenya from official donors (DAC) for official development assistance, 2013 to 2022. Current US dollars · OECD DAC2a. This shows official donors (DAC), the source's total for every official donor. Private donors are outside it. To list each donor, search again with open_roles ['donor']. Assumed: official development assistance.", + "rendered_sentence": "Kenya's deaths rate per 1,000 people, 2013 to 2022. World Development Indicators. Net disbursements to Kenya from official donors (DAC) for official development assistance, 2013 to 2022. Current US dollars · OECD DAC2a. This shows official donors (DAC), the source's total for every official donor. Private donors are outside it. To list each donor, search again with open_roles ['donor']. Assumed: official development assistance.", "sentence_plan": [ { "kind": "slot", @@ -9784,11 +9985,14 @@ }, { "kind": "slot", - "text": "per capita", + "text": "per 1,000 people", "axis": "unit", "segment": "heading", + "binding_ref": "unit:", "entity_refs": [], - "states": [], + "states": [ + "unit:" + ], "part_index": 0 }, { @@ -9866,7 +10070,7 @@ }, { "kind": "slot", - "text": "Gross disbursements", + "text": "Net disbursements", "axis": "what", "segment": "heading", "entity_refs": [], @@ -10112,10 +10316,10 @@ "answer": { "kind": "resolution", "status": "mixed", - "sentence": "Answered 1 of 2 parts. Mortality has 2 readings. Kenya's deaths rate per capita. World Development Indicators · 2013 to 2022. Kenya's number of deaths. Kenya Census · 2018 to 2022. You named Kenya as a recipient. This measure has no recipients, so this shows the place itself. Gross disbursements to Kenya from official donors (DAC) for official development assistance, 2013 to 2022. Current US dollars · OECD DAC2a. You asked for aid flows. This shows gross disbursements, the closest measure the data holds. No donor was named, so this shows official donors (DAC), the source's total for every official donor. Private donors are outside it. To list each donor, add \"for each donor\" to the question. Assumed: official development assistance.", + "sentence": "Answered 1 of 2 parts. Mortality has 2 readings. Kenya's deaths rate per 1,000 people. World Development Indicators · 2013 to 2022. Kenya's number of deaths. Kenya Census · 2018 to 2022. You named Kenya as a recipient. This measure has no recipients, so this shows the place itself. Net disbursements to Kenya from official donors (DAC) for official development assistance, 2013 to 2022. Current US dollars · OECD DAC2a. You asked for aid flows. This shows net disbursements, the closest measure the data holds. No donor was named, so this shows official donors (DAC), the source's total for every official donor. Private donors are outside it. To list each donor, add \"for each donor\" to the question. Assumed: official development assistance.", "complete": false, "specs": [ - "spec_f24e46ae9854884308fc0f33d154361e" + "spec_f025379e211db08849c7f98c627e025c" ], "gaps": [ { @@ -10130,11 +10334,11 @@ "answer": { "kind": "resolution", "status": "definite", - "sentence": "Kenya's deaths rate per capita, 2013 to 2022. World Development Indicators. Gross disbursements to Kenya from official donors (DAC) for official development assistance, 2013 to 2022. Current US dollars · OECD DAC2a. This shows official donors (DAC), the source's total for every official donor. Private donors are outside it. To list each donor, search again with open_roles ['donor']. Assumed: official development assistance.", + "sentence": "Kenya's deaths rate per 1,000 people, 2013 to 2022. World Development Indicators. Net disbursements to Kenya from official donors (DAC) for official development assistance, 2013 to 2022. Current US dollars · OECD DAC2a. This shows official donors (DAC), the source's total for every official donor. Private donors are outside it. To list each donor, search again with open_roles ['donor']. Assumed: official development assistance.", "complete": true, "specs": [ "spec_10bf62f9687154286b463d206f03a086", - "spec_f24e46ae9854884308fc0f33d154361e" + "spec_f025379e211db08849c7f98c627e025c" ], "gaps": [] } diff --git a/python/client-contract/src/dfo_client_contract/scenarios/choose-echoes-separate-and-operations.json b/python/client-contract/src/dfo_client_contract/scenarios/choose-echoes-separate-and-operations.json index 355b698..ffde8a6 100644 --- a/python/client-contract/src/dfo_client_contract/scenarios/choose-echoes-separate-and-operations.json +++ b/python/client-contract/src/dfo_client_contract/scenarios/choose-echoes-separate-and-operations.json @@ -35,7 +35,7 @@ "status": 200, "headers": { "content-type": "application/json", - "x-dfo-trace-id": "44089cedfffd4c0ca025f3d8faba0ca7" + "x-dfo-trace-id": "0912e47dd13a455fb52bce86cfcffbe0" }, "json": { "schema_version": 1, @@ -46,21 +46,22 @@ "extract_skipped": false }, "diagnostics": { - "engine_build": "d80df9f5fd598b7345255470932d202ee5d49942", - "trace_id": "44089cedfffd4c0ca025f3d8faba0ca7", + "engine_build": "ccb6617922c839ce3cd5615a3bbb65c70bfe1bde", + "trace_id": "0912e47dd13a455fb52bce86cfcffbe0", "warnings": [], "timing_ms": { - "total": 2666, + "total": 2781, "by_step": { "coverage": 0, - "extract": 1154, + "extract": 994, + "exclusion_read": 654, "cache_lookup": 0 } }, "llm_usage": { - "input_tokens": 2239, - "output_tokens": 164, - "cached_tokens": 842, + "input_tokens": 2800, + "output_tokens": 173, + "cached_tokens": 0, "jev_input_tokens": 17398, "jev_output_tokens": 3500 }, @@ -72,30 +73,30 @@ "variable_text": "GDP", "warnings": [], "timing_ms": { - "total": 1283, + "total": 1308, "by_step": { "recall": 2, - "phase_resolve_places": 0, + "phase_resolve_places": 1, "phase_check_entities": 0, - "shape_arcs": 4, - "shape_probe_coverage": 5, - "shape_probe": 116, - "shape_groups": 64, + "shape_arcs": 2, + "shape_probe_coverage": 4, + "shape_probe": 125, + "shape_groups": 68, "shape_labels": 12, - "shape_admission": 1, + "shape_admission": 2, "phase_derive_shapes": 0, - "shape": 463, + "shape": 539, "phase_prune_and_rank": 0, - "bind": 125, - "phase_bind": 12, - "phase_settle": 6, - "phase_place_bindings": 10, + "bind": 124, + "phase_bind": 14, + "phase_settle": 10, + "phase_place_bindings": 8, "phase_facet_requests": 0, - "materialise": 173, + "materialise": 178, "phase_materialise": 18, - "answer": 207, - "options": 140, - "phase_outcome": 127 + "answer": 161, + "options": 134, + "phase_outcome": 119 } }, "restatement": { @@ -1965,7 +1966,7 @@ "start_year": 2015, "end_year": 2015 }, - "capability_version": "cap_765c9d2a0c7529b9", + "capability_version": "cap_4913302d7a6b6435", "default_reading": { "applied": true, "removed_stat_vars": [ @@ -2884,7 +2885,7 @@ "start_year": 2015, "end_year": 2015 }, - "capability_version": "cap_765c9d2a0c7529b9", + "capability_version": "cap_4913302d7a6b6435", "default_reading": { "applied": true, "removed_stat_vars": [ @@ -2912,12 +2913,14 @@ "confidence": "high", "available_at_place": true, "measure_label_axes": [], - "measure_axis_values": [] + "measure_axis_values": [], + "published_tables": "IMF World Economic Outlook (WEO)" } } ], "measure_label_axes": [], "measure_axis_values": [], + "published_tables": "World Development Indicators", "related_group": { "ref": "dc/g/EconomicActivity_ActivitySource-GrossDomesticProduction", "label": "Economic Activity With Activity Source = Gross Domestic Production" @@ -2988,24 +2991,24 @@ "variable_text": "ODA", "warnings": [], "timing_ms": { - "total": 598, + "total": 1498, "by_step": { - "recall": 301, + "recall": 1140, "phase_resolve_places": 0, "phase_check_entities": 0, "shape_arcs": 2, - "shape_probe_coverage": 6, - "shape_probe": 99, - "shape_groups": 3, + "shape_probe_coverage": 13, + "shape_probe": 149, + "shape_groups": 4, "shape_labels": 0, - "shape_admission": 0, + "shape_admission": 1, "phase_derive_shapes": 0, - "shape": 189, + "shape": 247, "phase_prune_and_rank": 0, - "bind": 91, - "phase_bind": 3, - "phase_settle": 7, - "phase_place_bindings": 7 + "bind": 102, + "phase_bind": 2, + "phase_settle": 2, + "phase_place_bindings": 5 } }, "rendered_sentence": "Could not tell who is giving and who is receiving among \"G20\", \"Germany\", and \"India\". Put \"from\" or \"to\" before a name.", @@ -3575,7 +3578,7 @@ "status": 200, "headers": { "content-type": "application/json", - "x-dfo-trace-id": "4f781d285d73459fa3f2f981f5828776" + "x-dfo-trace-id": "ab13cf77e5df4732bf48243677977f40" }, "json": { "schema_version": 1, @@ -3584,11 +3587,11 @@ "extract_skipped": true }, "diagnostics": { - "engine_build": "d80df9f5fd598b7345255470932d202ee5d49942", - "trace_id": "4f781d285d73459fa3f2f981f5828776", + "engine_build": "ccb6617922c839ce3cd5615a3bbb65c70bfe1bde", + "trace_id": "ab13cf77e5df4732bf48243677977f40", "warnings": [], "timing_ms": { - "total": 1276, + "total": 800, "by_step": { "coverage": 0 } @@ -3608,19 +3611,39 @@ "variable_text": "GDP", "warnings": [], "timing_ms": { - "total": 1161, + "total": 784, "by_step": { "validate": 0, + "phase_validate": 0, "walk": 1, "reread_arcs": 0, + "phase_reread_arcs": 0, "detect_edits": 0, + "phase_detect_edits": 0, "resolve_survivors": 0, - "shape": 921, - "bind": 1, + "phase_resolve_survivors": 0, + "shape": 412, + "phase_build_shape": 0, + "bind": 0, + "phase_build_bindings": 0, "where_places": 0, - "materialise": 120, + "phase_where_places": 0, + "materialise": 132, + "phase_materialise": 0, + "ground_related": 0, + "ground_units": 0, + "ground_facets": 5, + "ground_convert": 0, "answer": 4, - "options": 114 + "ground_gates": 133, + "phase_ground_build": 7, + "finalize_preview": 0, + "options": 88, + "finalize_related": 0, + "finalize_wholes": 1, + "finalize_relaunch": 0, + "phase_finalize": 0, + "served_entry": 1 } }, "entity_refs": [], @@ -5135,12 +5158,13 @@ "start_year": 2015, "end_year": 2015 }, - "capability_version": "cap_765c9d2a0c7529b9" + "capability_version": "cap_4913302d7a6b6435" }, "confidence": "high", "available_at_place": true, "measure_label_axes": [], "measure_axis_values": [], + "published_tables": "World Development Indicators", "related_group": { "ref": "dc/g/EconomicActivity_ActivitySource-GrossDomesticProduction", "label": "Economic Activity With Activity Source = Gross Domestic Production" @@ -5210,30 +5234,30 @@ "variable_text": "ODA", "warnings": [], "timing_ms": { - "total": 399, + "total": 337, "by_step": { - "recall": 0, + "recall": 3, "phase_resolve_places": 0, "phase_check_entities": 0, - "shape_arcs": 2, - "shape_probe_coverage": 6, - "shape_probe": 97, + "shape_arcs": 1, + "shape_probe_coverage": 9, + "shape_probe": 11, "shape_groups": 3, "shape_labels": 0, "shape_admission": 1, "phase_derive_shapes": 0, - "shape": 181, + "shape": 95, "phase_prune_and_rank": 0, - "bind": 100, - "phase_bind": 12, - "phase_settle": 8, + "bind": 117, + "phase_bind": 23, + "phase_settle": 6, "phase_place_bindings": 1, "phase_facet_requests": 0, - "materialise": 20, - "phase_materialise": 5, - "answer": 15, - "options": 7, - "phase_outcome": 50 + "materialise": 21, + "phase_materialise": 4, + "answer": 12, + "options": 16, + "phase_outcome": 39 } }, "restatement": { @@ -5313,10 +5337,10 @@ "assumptions": [], "status": "definite", "spec": { - "spec_id": "spec_4587fc4776526af697f28532c9876980", + "spec_id": "spec_6d9c18873c6fea5004f84c3e92f33310", "definition": { "schema_version": 1, - "spec_id": "spec_4587fc4776526af697f28532c9876980", + "spec_id": "spec_6d9c18873c6fea5004f84c3e92f33310", "identity": { "identity_version": "spec1", "shape": { @@ -5351,7 +5375,7 @@ "property": "nettingBasis", "binding": { "state": "value", - "ref": "Gross" + "ref": "Net" } } ], @@ -5391,7 +5415,7 @@ "resolved": { "shape": { "shape_id": "financialflow_amount_measuredvalue_nominal_family_f096b1ba", - "label": "gross disbursements (official development assistance)", + "label": "net disbursements (official development assistance)", "population_type": { "ref": "FinancialFlow", "label": "financial flow" @@ -5456,7 +5480,7 @@ } ], "member_count": 1, - "member_digest": "1a36e1a7292b1bfff95a5415de0be74cac7bb033217ed50e79faa8ce51a224c0", + "member_digest": "c2d373442ac21a31377df76cd343f156c72a530649757c399c6661cbf56c9a71", "refine_supported": true, "data_commons": [ { @@ -5535,8 +5559,8 @@ "kind": "value", "value": { "ref": { - "ref": "Gross", - "label": "gross" + "ref": "Net", + "label": "net" }, "value_kind": "enum_value" } @@ -5809,7 +5833,7 @@ "label": "OECD Terms and Conditions" } }, - "coverage_stamp": "e6e717ab8c77e84d010915893ede5809e9ecec67929a07cfafbcc2210edfa1eb", + "coverage_stamp": "ad27fd11738abb03d2d84dc214e223f04781609636cf678d0d08c385fb863d99", "facets": { "provenance": { "basis": "fallback", @@ -5855,47 +5879,47 @@ "relation": "child", "parent": "DAC2aAidType206", "member_count": 2, - "served_rows": 4, + "served_rows": 7, "served_rows_exact": true }, { "value": { "ref": { - "ref": "DAC2aAidType201", - "label": "ODA grant" + "ref": "DAC2aAidType219", + "label": "recovery on ODA grants and capital subscriptions" }, "value_kind": "enum_value" }, "relation": "child", "parent": "DAC2aAidType206", "member_count": 1, - "served_rows": 10, + "served_rows": 3, "served_rows_exact": true }, { "value": { "ref": { - "ref": "DAC2aAidType207", - "label": "free-standing technical co-operation" + "ref": "DAC2aAidType209", + "label": "interest received on ODA lending" }, "value_kind": "enum_value" }, "relation": "root", "member_count": 1, - "served_rows": 10, + "served_rows": 5, "served_rows_exact": true }, { "value": { "ref": { - "ref": "DAC2aAidType216", - "label": "humanitarian aid" + "ref": "DAC2aAidType250", + "label": "official development assistance excluding debt relief" }, "value_kind": "enum_value" }, "relation": "root", "member_count": 1, - "served_rows": 6, + "served_rows": 10, "served_rows_exact": true } ], @@ -5938,11 +5962,11 @@ "source": "observed" } ], - "rendered_sentence": "Gross disbursements to India from the 19 G20 members for official development assistance in 2015. Current US dollars · OECD DAC2a.", + "rendered_sentence": "Net disbursements to India from the 19 G20 members for official development assistance in 2015. Current US dollars · OECD DAC2a.", "sentence_plan": [ { "kind": "slot", - "text": "Gross disbursements", + "text": "Net disbursements", "axis": "what", "segment": "heading", "entity_refs": [], @@ -6290,8 +6314,8 @@ "binding_kind": "value", "refs": [ { - "ref": "Gross", - "label": "gross" + "ref": "Net", + "label": "net" } ], "provenance": "measure_elected" @@ -6347,7 +6371,7 @@ "start_year": 2015, "end_year": 2015 }, - "capability_version": "cap_765c9d2a0c7529b9", + "capability_version": "cap_4913302d7a6b6435", "default_reading": { "applied": true, "removed_stat_vars": [] @@ -6355,126 +6379,8 @@ }, "confidence": "high", "available_at_place": true, - "alternative_measures": [ - { - "definition": { - "schema_version": 1, - "spec_id": "spec_6d9c18873c6fea5004f84c3e92f33310", - "identity": { - "identity_version": "spec1", - "shape": { - "kind": "statvar_schema", - "population_type": "FinancialFlow", - "measured_property": "amount", - "stat_type": "measuredValue", - "measurement_qualifier": "Nominal" - }, - "slots": [ - { - "property": "dac2aAidType", - "binding": { - "state": "value", - "ref": "DAC2aAidType206" - } - }, - { - "property": "dacTypeOfFinance", - "binding": { - "state": "unbound" - } - }, - { - "property": "financialFlowType", - "binding": { - "state": "value", - "ref": "Disbursement" - } - }, - { - "property": "nettingBasis", - "binding": { - "state": "value", - "ref": "Net" - } - } - ], - "entities": { - "destination": [ - "country/IND" - ], - "origin": [ - "country/ARG", - "country/AUS", - "country/BRA", - "country/CAN", - "country/CHN", - "country/DEU", - "country/FRA", - "country/GBR", - "country/IDN", - "country/IND", - "country/ITA", - "country/JPN", - "country/KOR", - "country/MEX", - "country/RUS", - "country/SAU", - "country/TUR", - "country/USA", - "country/ZAF" - ] - }, - "requested_window": { - "kind": "range", - "start_year": 2015, - "end_year": 2015 - } - } - }, - "label": "net disbursements", - "axis": "what", - "measure_axis_values": [ - { - "axis": "populationType", - "value": { - "ref": "FinancialFlow", - "label": "financial flow" - } - }, - { - "axis": "measuredProperty", - "value": { - "ref": "amount", - "label": "amount" - } - }, - { - "axis": "measurementQualifier", - "value": { - "ref": "Nominal", - "label": "nominal" - } - }, - { - "axis": "financialFlowType", - "value": { - "ref": "Disbursement", - "label": "disbursement" - } - }, - { - "axis": "nettingBasis", - "value": { - "ref": "Net", - "label": "net" - } - } - ], - "served_rows": 10, - "served_rows_exact": true - } - ], - "measure_label": "gross disbursements", + "alternative_measures": [], + "measure_label": "net disbursements", "measure_label_axes": [ "populationType", "measuredProperty", @@ -6514,11 +6420,13 @@ { "axis": "nettingBasis", "value": { - "ref": "Gross", - "label": "gross" + "ref": "Net", + "label": "net" } } ], + "concept_label": "official development assistance", + "published_tables": "OECD DAC2a", "unit_conversion": { "currencies": [ { @@ -8477,12 +8385,346 @@ "role_currencies": { "destination": "INR" } + }, + "scope_choices": { + "id": "spec_6d9c18873c6fea5004f84c3e92f33310", + "base": { + "schema_version": 1, + "spec_id": "spec_6d9c18873c6fea5004f84c3e92f33310", + "identity": { + "identity_version": "spec1", + "shape": { + "kind": "statvar_schema", + "population_type": "FinancialFlow", + "measured_property": "amount", + "stat_type": "measuredValue", + "measurement_qualifier": "Nominal" + }, + "slots": [ + { + "property": "dac2aAidType", + "binding": { + "state": "value", + "ref": "DAC2aAidType206" + } + }, + { + "property": "dacTypeOfFinance", + "binding": { + "state": "unbound" + } + }, + { + "property": "financialFlowType", + "binding": { + "state": "value", + "ref": "Disbursement" + } + }, + { + "property": "nettingBasis", + "binding": { + "state": "value", + "ref": "Net" + } + } + ], + "entities": { + "destination": [ + "country/IND" + ], + "origin": [ + "country/ARG", + "country/AUS", + "country/BRA", + "country/CAN", + "country/CHN", + "country/DEU", + "country/FRA", + "country/GBR", + "country/IDN", + "country/IND", + "country/ITA", + "country/JPN", + "country/KOR", + "country/MEX", + "country/RUS", + "country/SAU", + "country/TUR", + "country/USA", + "country/ZAF" + ] + }, + "requested_window": { + "kind": "range", + "start_year": 2015, + "end_year": 2015 + } + } + }, + "rule_version": "scope1:3eef00a928eedd463ee48d02b79730da", + "entries": [], + "dropped_entries": [], + "choices": [ + { + "id": "spec_6d9c18873c6fea5004f84c3e92f33310:measure_basis", + "axis": "measure_basis", + "rule": "measure_basis_convention", + "provenance": "default", + "active": "measure_basis:net", + "options": [ + { + "option_id": "measure_basis:gross", + "label": "gross disbursements, current USD", + "binding": { + "kind": "shape", + "measured_property": "amount", + "netting_basis": "Gross" + }, + "availability": { + "status": "available", + "detail": {} + } + }, + { + "option_id": "measure_basis:net", + "label": "net disbursements, current USD", + "binding": { + "kind": "shape", + "measured_property": "amount", + "netting_basis": "Net" + }, + "availability": { + "status": "available", + "detail": {} + } + }, + { + "option_id": "measure_basis:grant_equivalent", + "label": "grant equivalents (OECD headline), current USD", + "binding": { + "kind": "shape", + "measured_property": "grantEquivalent", + "netting_basis": null + }, + "availability": { + "status": "unavailable", + "code": "basis_not_published", + "detail": { + "dataset": "provenance/OECDDAC2A" + } + } + }, + { + "option_id": "measure_basis:commitments", + "label": "commitments, current USD", + "binding": { + "kind": "shape", + "measured_property": "amount", + "netting_basis": null + }, + "availability": { + "status": "unavailable", + "code": "basis_not_published", + "detail": { + "dataset": "provenance/OECDDAC2A" + } + } + } + ] + }, + { + "id": "spec_6d9c18873c6fea5004f84c3e92f33310:provider", + "axis": "provider", + "rule": "bilateral_recipient_total", + "provenance": "default", + "active": "provider:bilateral", + "options": [ + { + "option_id": "provider:bilateral", + "label": "bilateral flows only", + "binding": { + "kind": "provider", + "scope": "bilateral" + }, + "availability": { + "status": "available", + "detail": {} + } + }, + { + "option_id": "provider:inclusive", + "label": "bilateral plus imputed multilateral", + "binding": { + "kind": "provider", + "scope": "inclusive" + }, + "availability": { + "status": "unavailable", + "code": "provider_not_offered", + "detail": { + "why": "pooled_providers" + } + } + } + ] + } + ], + "compiled": { + "spec_id": "spec_6d9c18873c6fea5004f84c3e92f33310", + "identity": { + "identity_version": "spec1", + "shape": { + "kind": "statvar_schema", + "population_type": "FinancialFlow", + "measured_property": "amount", + "stat_type": "measuredValue", + "measurement_qualifier": "Nominal" + }, + "slots": [ + { + "property": "dac2aAidType", + "binding": { + "state": "value", + "ref": "DAC2aAidType206" + } + }, + { + "property": "dacTypeOfFinance", + "binding": { + "state": "unbound" + } + }, + { + "property": "financialFlowType", + "binding": { + "state": "value", + "ref": "Disbursement" + } + }, + { + "property": "nettingBasis", + "binding": { + "state": "value", + "ref": "Net" + } + } + ], + "entities": { + "destination": [ + "country/IND" + ], + "origin": [ + "country/ARG", + "country/AUS", + "country/BRA", + "country/CAN", + "country/CHN", + "country/DEU", + "country/FRA", + "country/GBR", + "country/IDN", + "country/IND", + "country/ITA", + "country/JPN", + "country/KOR", + "country/MEX", + "country/RUS", + "country/SAU", + "country/TUR", + "country/USA", + "country/ZAF" + ] + }, + "requested_window": { + "kind": "range", + "start_year": 2015, + "end_year": 2015 + } + }, + "components": [ + { + "role": "whole", + "identity": { + "identity_version": "spec1", + "shape": { + "kind": "statvar_schema", + "population_type": "FinancialFlow", + "measured_property": "amount", + "stat_type": "measuredValue", + "measurement_qualifier": "Nominal" + }, + "slots": [ + { + "property": "dac2aAidType", + "binding": { + "state": "value", + "ref": "DAC2aAidType206" + } + }, + { + "property": "dacTypeOfFinance", + "binding": { + "state": "unbound" + } + }, + { + "property": "financialFlowType", + "binding": { + "state": "value", + "ref": "Disbursement" + } + }, + { + "property": "nettingBasis", + "binding": { + "state": "value", + "ref": "Net" + } + } + ], + "entities": { + "destination": [ + "country/IND" + ], + "origin": [ + "country/ARG", + "country/AUS", + "country/BRA", + "country/CAN", + "country/CHN", + "country/DEU", + "country/FRA", + "country/GBR", + "country/IDN", + "country/IND", + "country/ITA", + "country/JPN", + "country/KOR", + "country/MEX", + "country/RUS", + "country/SAU", + "country/TUR", + "country/USA", + "country/ZAF" + ] + }, + "requested_window": { + "kind": "range", + "start_year": 2015, + "end_year": 2015 + } + } + } + ] + }, + "ledger": [] } } } } ], - "rendered_sentence": "GDP in the 19 G20 members in 2015. Current US dollars · World Development Indicators. This shows the 19 G20 members, each on its own. Gross disbursements to India from the 19 G20 members for official development assistance in 2015. Current US dollars · OECD DAC2a. The data holds no values for 9 of the 19 G20 members. You asked for G20. This shows its members, each on its own.", + "rendered_sentence": "GDP in the 19 G20 members in 2015. Current US dollars · World Development Indicators. This shows the 19 G20 members, each on its own. Net disbursements to India from the 19 G20 members for official development assistance in 2015. Current US dollars · OECD DAC2a. The data holds no values for 9 of the 19 G20 members. You asked for G20. This shows its members, each on its own.", "sentence_plan": [ { "kind": "slot", @@ -8663,7 +8905,7 @@ }, { "kind": "slot", - "text": "Gross disbursements", + "text": "Net disbursements", "axis": "what", "segment": "heading", "entity_refs": [], @@ -8929,11 +9171,11 @@ "answer": { "kind": "resolution", "status": "definite", - "sentence": "GDP in the 19 G20 members in 2015. Current US dollars · World Development Indicators. This shows the 19 G20 members, each on its own. Gross disbursements to India from the 19 G20 members for official development assistance in 2015. Current US dollars · OECD DAC2a. The data holds no values for 9 of the 19 G20 members. You asked for G20. This shows its members, each on its own.", + "sentence": "GDP in the 19 G20 members in 2015. Current US dollars · World Development Indicators. This shows the 19 G20 members, each on its own. Net disbursements to India from the 19 G20 members for official development assistance in 2015. Current US dollars · OECD DAC2a. The data holds no values for 9 of the 19 G20 members. You asked for G20. This shows its members, each on its own.", "complete": true, "specs": [ "spec_66fdfe785d6a2bc455d49daaf76d6f89", - "spec_4587fc4776526af697f28532c9876980" + "spec_6d9c18873c6fea5004f84c3e92f33310" ], "gaps": [] } diff --git a/python/client-contract/src/dfo_client_contract/scenarios/choose-option-beside-definite.json b/python/client-contract/src/dfo_client_contract/scenarios/choose-option-beside-definite.json index 6e9c25a..a050092 100644 --- a/python/client-contract/src/dfo_client_contract/scenarios/choose-option-beside-definite.json +++ b/python/client-contract/src/dfo_client_contract/scenarios/choose-option-beside-definite.json @@ -5,8 +5,8 @@ "origin": { "kind": "recorded", "base_url": "https://dfo-dev-apis-zms5lj4zhq-nn.a.run.app/api", - "dfo_commit": "d80df9f5fd598b7345255470932d202ee5d49942", - "recorded_at": "2026-10-26T09:23:47Z" + "dfo_commit": "ccb6617922c839ce3cd5615a3bbb65c70bfe1bde", + "recorded_at": "2026-11-01T07:39:49Z" }, "call": [ { @@ -36,7 +36,7 @@ "status": 200, "headers": { "content-type": "application/json", - "x-dfo-trace-id": "44089cedfffd4c0ca025f3d8faba0ca7" + "x-dfo-trace-id": "0912e47dd13a455fb52bce86cfcffbe0" }, "json": { "schema_version": 1, @@ -47,21 +47,22 @@ "extract_skipped": false }, "diagnostics": { - "engine_build": "d80df9f5fd598b7345255470932d202ee5d49942", - "trace_id": "44089cedfffd4c0ca025f3d8faba0ca7", + "engine_build": "ccb6617922c839ce3cd5615a3bbb65c70bfe1bde", + "trace_id": "0912e47dd13a455fb52bce86cfcffbe0", "warnings": [], "timing_ms": { - "total": 2666, + "total": 2781, "by_step": { "coverage": 0, - "extract": 1154, + "extract": 994, + "exclusion_read": 654, "cache_lookup": 0 } }, "llm_usage": { - "input_tokens": 2239, - "output_tokens": 164, - "cached_tokens": 842, + "input_tokens": 2800, + "output_tokens": 173, + "cached_tokens": 0, "jev_input_tokens": 17398, "jev_output_tokens": 3500 }, @@ -73,30 +74,30 @@ "variable_text": "GDP", "warnings": [], "timing_ms": { - "total": 1283, + "total": 1308, "by_step": { "recall": 2, - "phase_resolve_places": 0, + "phase_resolve_places": 1, "phase_check_entities": 0, - "shape_arcs": 4, - "shape_probe_coverage": 5, - "shape_probe": 116, - "shape_groups": 64, + "shape_arcs": 2, + "shape_probe_coverage": 4, + "shape_probe": 125, + "shape_groups": 68, "shape_labels": 12, - "shape_admission": 1, + "shape_admission": 2, "phase_derive_shapes": 0, - "shape": 463, + "shape": 539, "phase_prune_and_rank": 0, - "bind": 125, - "phase_bind": 12, - "phase_settle": 6, - "phase_place_bindings": 10, + "bind": 124, + "phase_bind": 14, + "phase_settle": 10, + "phase_place_bindings": 8, "phase_facet_requests": 0, - "materialise": 173, + "materialise": 178, "phase_materialise": 18, - "answer": 207, - "options": 140, - "phase_outcome": 127 + "answer": 161, + "options": 134, + "phase_outcome": 119 } }, "restatement": { @@ -1960,7 +1961,7 @@ "start_year": 2015, "end_year": 2015 }, - "capability_version": "cap_765c9d2a0c7529b9", + "capability_version": "cap_4913302d7a6b6435", "default_reading": { "applied": true, "removed_stat_vars": [ @@ -2879,7 +2880,7 @@ "start_year": 2015, "end_year": 2015 }, - "capability_version": "cap_765c9d2a0c7529b9", + "capability_version": "cap_4913302d7a6b6435", "default_reading": { "applied": true, "removed_stat_vars": [ @@ -2907,12 +2908,14 @@ "confidence": "high", "available_at_place": true, "measure_label_axes": [], - "measure_axis_values": [] + "measure_axis_values": [], + "published_tables": "IMF World Economic Outlook (WEO)" } } ], "measure_label_axes": [], "measure_axis_values": [], + "published_tables": "World Development Indicators", "related_group": { "ref": "dc/g/EconomicActivity_ActivitySource-GrossDomesticProduction", "label": "Economic Activity With Activity Source = Gross Domestic Production" @@ -2982,24 +2985,24 @@ "variable_text": "ODA", "warnings": [], "timing_ms": { - "total": 598, + "total": 1498, "by_step": { - "recall": 301, + "recall": 1140, "phase_resolve_places": 0, "phase_check_entities": 0, "shape_arcs": 2, - "shape_probe_coverage": 6, - "shape_probe": 99, - "shape_groups": 3, + "shape_probe_coverage": 13, + "shape_probe": 149, + "shape_groups": 4, "shape_labels": 0, - "shape_admission": 0, + "shape_admission": 1, "phase_derive_shapes": 0, - "shape": 189, + "shape": 247, "phase_prune_and_rank": 0, - "bind": 91, - "phase_bind": 3, - "phase_settle": 7, - "phase_place_bindings": 7 + "bind": 102, + "phase_bind": 2, + "phase_settle": 2, + "phase_place_bindings": 5 } }, "rendered_sentence": "Could not tell who is giving and who is receiving among \"G20\", \"Germany\", and \"India\". Put \"from\" or \"to\" before a name.", @@ -3561,7 +3564,7 @@ "status": 200, "headers": { "content-type": "application/json", - "x-dfo-trace-id": "4f781d285d73459fa3f2f981f5828776" + "x-dfo-trace-id": "ab13cf77e5df4732bf48243677977f40" }, "json": { "schema_version": 1, @@ -3570,11 +3573,11 @@ "extract_skipped": true }, "diagnostics": { - "engine_build": "d80df9f5fd598b7345255470932d202ee5d49942", - "trace_id": "4f781d285d73459fa3f2f981f5828776", + "engine_build": "ccb6617922c839ce3cd5615a3bbb65c70bfe1bde", + "trace_id": "ab13cf77e5df4732bf48243677977f40", "warnings": [], "timing_ms": { - "total": 1276, + "total": 800, "by_step": { "coverage": 0 } @@ -3594,19 +3597,39 @@ "variable_text": "GDP", "warnings": [], "timing_ms": { - "total": 1161, + "total": 784, "by_step": { "validate": 0, + "phase_validate": 0, "walk": 1, "reread_arcs": 0, + "phase_reread_arcs": 0, "detect_edits": 0, + "phase_detect_edits": 0, "resolve_survivors": 0, - "shape": 921, - "bind": 1, + "phase_resolve_survivors": 0, + "shape": 412, + "phase_build_shape": 0, + "bind": 0, + "phase_build_bindings": 0, "where_places": 0, - "materialise": 120, + "phase_where_places": 0, + "materialise": 132, + "phase_materialise": 0, + "ground_related": 0, + "ground_units": 0, + "ground_facets": 5, + "ground_convert": 0, "answer": 4, - "options": 114 + "ground_gates": 133, + "phase_ground_build": 7, + "finalize_preview": 0, + "options": 88, + "finalize_related": 0, + "finalize_wholes": 1, + "finalize_relaunch": 0, + "phase_finalize": 0, + "served_entry": 1 } }, "entity_refs": [], @@ -5121,12 +5144,13 @@ "start_year": 2015, "end_year": 2015 }, - "capability_version": "cap_765c9d2a0c7529b9" + "capability_version": "cap_4913302d7a6b6435" }, "confidence": "high", "available_at_place": true, "measure_label_axes": [], "measure_axis_values": [], + "published_tables": "World Development Indicators", "related_group": { "ref": "dc/g/EconomicActivity_ActivitySource-GrossDomesticProduction", "label": "Economic Activity With Activity Source = Gross Domestic Production" @@ -5196,30 +5220,30 @@ "variable_text": "ODA", "warnings": [], "timing_ms": { - "total": 399, + "total": 337, "by_step": { - "recall": 0, + "recall": 3, "phase_resolve_places": 0, "phase_check_entities": 0, - "shape_arcs": 2, - "shape_probe_coverage": 6, - "shape_probe": 97, + "shape_arcs": 1, + "shape_probe_coverage": 9, + "shape_probe": 11, "shape_groups": 3, "shape_labels": 0, "shape_admission": 1, "phase_derive_shapes": 0, - "shape": 181, + "shape": 95, "phase_prune_and_rank": 0, - "bind": 100, - "phase_bind": 12, - "phase_settle": 8, + "bind": 117, + "phase_bind": 23, + "phase_settle": 6, "phase_place_bindings": 1, "phase_facet_requests": 0, - "materialise": 20, - "phase_materialise": 5, - "answer": 15, - "options": 7, - "phase_outcome": 50 + "materialise": 21, + "phase_materialise": 4, + "answer": 12, + "options": 16, + "phase_outcome": 39 } }, "restatement": { @@ -5299,10 +5323,10 @@ "assumptions": [], "status": "definite", "spec": { - "spec_id": "spec_4587fc4776526af697f28532c9876980", + "spec_id": "spec_6d9c18873c6fea5004f84c3e92f33310", "definition": { "schema_version": 1, - "spec_id": "spec_4587fc4776526af697f28532c9876980", + "spec_id": "spec_6d9c18873c6fea5004f84c3e92f33310", "identity": { "identity_version": "spec1", "shape": { @@ -5337,7 +5361,7 @@ "property": "nettingBasis", "binding": { "state": "value", - "ref": "Gross" + "ref": "Net" } } ], @@ -5377,7 +5401,7 @@ "resolved": { "shape": { "shape_id": "financialflow_amount_measuredvalue_nominal_family_f096b1ba", - "label": "gross disbursements (official development assistance)", + "label": "net disbursements (official development assistance)", "population_type": { "ref": "FinancialFlow", "label": "financial flow" @@ -5442,7 +5466,7 @@ } ], "member_count": 1, - "member_digest": "1a36e1a7292b1bfff95a5415de0be74cac7bb033217ed50e79faa8ce51a224c0", + "member_digest": "c2d373442ac21a31377df76cd343f156c72a530649757c399c6661cbf56c9a71", "refine_supported": true, "data_commons": [ { @@ -5521,8 +5545,8 @@ "kind": "value", "value": { "ref": { - "ref": "Gross", - "label": "gross" + "ref": "Net", + "label": "net" }, "value_kind": "enum_value" } @@ -5795,7 +5819,7 @@ "label": "OECD Terms and Conditions" } }, - "coverage_stamp": "e6e717ab8c77e84d010915893ede5809e9ecec67929a07cfafbcc2210edfa1eb", + "coverage_stamp": "ad27fd11738abb03d2d84dc214e223f04781609636cf678d0d08c385fb863d99", "facets": { "provenance": { "basis": "fallback", @@ -5841,47 +5865,47 @@ "relation": "child", "parent": "DAC2aAidType206", "member_count": 2, - "served_rows": 4, + "served_rows": 7, "served_rows_exact": true }, { "value": { "ref": { - "ref": "DAC2aAidType201", - "label": "ODA grant" + "ref": "DAC2aAidType219", + "label": "recovery on ODA grants and capital subscriptions" }, "value_kind": "enum_value" }, "relation": "child", "parent": "DAC2aAidType206", "member_count": 1, - "served_rows": 10, + "served_rows": 3, "served_rows_exact": true }, { "value": { "ref": { - "ref": "DAC2aAidType207", - "label": "free-standing technical co-operation" + "ref": "DAC2aAidType209", + "label": "interest received on ODA lending" }, "value_kind": "enum_value" }, "relation": "root", "member_count": 1, - "served_rows": 10, + "served_rows": 5, "served_rows_exact": true }, { "value": { "ref": { - "ref": "DAC2aAidType216", - "label": "humanitarian aid" + "ref": "DAC2aAidType250", + "label": "official development assistance excluding debt relief" }, "value_kind": "enum_value" }, "relation": "root", "member_count": 1, - "served_rows": 6, + "served_rows": 10, "served_rows_exact": true } ], @@ -5924,11 +5948,11 @@ "source": "observed" } ], - "rendered_sentence": "Gross disbursements to India from the 19 G20 members for official development assistance in 2015. Current US dollars · OECD DAC2a.", + "rendered_sentence": "Net disbursements to India from the 19 G20 members for official development assistance in 2015. Current US dollars · OECD DAC2a.", "sentence_plan": [ { "kind": "slot", - "text": "Gross disbursements", + "text": "Net disbursements", "axis": "what", "segment": "heading", "entity_refs": [], @@ -6276,8 +6300,8 @@ "binding_kind": "value", "refs": [ { - "ref": "Gross", - "label": "gross" + "ref": "Net", + "label": "net" } ], "provenance": "measure_elected" @@ -6333,7 +6357,7 @@ "start_year": 2015, "end_year": 2015 }, - "capability_version": "cap_765c9d2a0c7529b9", + "capability_version": "cap_4913302d7a6b6435", "default_reading": { "applied": true, "removed_stat_vars": [] @@ -6341,126 +6365,8 @@ }, "confidence": "high", "available_at_place": true, - "alternative_measures": [ - { - "definition": { - "schema_version": 1, - "spec_id": "spec_6d9c18873c6fea5004f84c3e92f33310", - "identity": { - "identity_version": "spec1", - "shape": { - "kind": "statvar_schema", - "population_type": "FinancialFlow", - "measured_property": "amount", - "stat_type": "measuredValue", - "measurement_qualifier": "Nominal" - }, - "slots": [ - { - "property": "dac2aAidType", - "binding": { - "state": "value", - "ref": "DAC2aAidType206" - } - }, - { - "property": "dacTypeOfFinance", - "binding": { - "state": "unbound" - } - }, - { - "property": "financialFlowType", - "binding": { - "state": "value", - "ref": "Disbursement" - } - }, - { - "property": "nettingBasis", - "binding": { - "state": "value", - "ref": "Net" - } - } - ], - "entities": { - "destination": [ - "country/IND" - ], - "origin": [ - "country/ARG", - "country/AUS", - "country/BRA", - "country/CAN", - "country/CHN", - "country/DEU", - "country/FRA", - "country/GBR", - "country/IDN", - "country/IND", - "country/ITA", - "country/JPN", - "country/KOR", - "country/MEX", - "country/RUS", - "country/SAU", - "country/TUR", - "country/USA", - "country/ZAF" - ] - }, - "requested_window": { - "kind": "range", - "start_year": 2015, - "end_year": 2015 - } - } - }, - "label": "net disbursements", - "axis": "what", - "measure_axis_values": [ - { - "axis": "populationType", - "value": { - "ref": "FinancialFlow", - "label": "financial flow" - } - }, - { - "axis": "measuredProperty", - "value": { - "ref": "amount", - "label": "amount" - } - }, - { - "axis": "measurementQualifier", - "value": { - "ref": "Nominal", - "label": "nominal" - } - }, - { - "axis": "financialFlowType", - "value": { - "ref": "Disbursement", - "label": "disbursement" - } - }, - { - "axis": "nettingBasis", - "value": { - "ref": "Net", - "label": "net" - } - } - ], - "served_rows": 10, - "served_rows_exact": true - } - ], - "measure_label": "gross disbursements", + "alternative_measures": [], + "measure_label": "net disbursements", "measure_label_axes": [ "populationType", "measuredProperty", @@ -6500,11 +6406,13 @@ { "axis": "nettingBasis", "value": { - "ref": "Gross", - "label": "gross" + "ref": "Net", + "label": "net" } } ], + "concept_label": "official development assistance", + "published_tables": "OECD DAC2a", "unit_conversion": { "currencies": [ { @@ -8463,12 +8371,346 @@ "role_currencies": { "destination": "INR" } + }, + "scope_choices": { + "id": "spec_6d9c18873c6fea5004f84c3e92f33310", + "base": { + "schema_version": 1, + "spec_id": "spec_6d9c18873c6fea5004f84c3e92f33310", + "identity": { + "identity_version": "spec1", + "shape": { + "kind": "statvar_schema", + "population_type": "FinancialFlow", + "measured_property": "amount", + "stat_type": "measuredValue", + "measurement_qualifier": "Nominal" + }, + "slots": [ + { + "property": "dac2aAidType", + "binding": { + "state": "value", + "ref": "DAC2aAidType206" + } + }, + { + "property": "dacTypeOfFinance", + "binding": { + "state": "unbound" + } + }, + { + "property": "financialFlowType", + "binding": { + "state": "value", + "ref": "Disbursement" + } + }, + { + "property": "nettingBasis", + "binding": { + "state": "value", + "ref": "Net" + } + } + ], + "entities": { + "destination": [ + "country/IND" + ], + "origin": [ + "country/ARG", + "country/AUS", + "country/BRA", + "country/CAN", + "country/CHN", + "country/DEU", + "country/FRA", + "country/GBR", + "country/IDN", + "country/IND", + "country/ITA", + "country/JPN", + "country/KOR", + "country/MEX", + "country/RUS", + "country/SAU", + "country/TUR", + "country/USA", + "country/ZAF" + ] + }, + "requested_window": { + "kind": "range", + "start_year": 2015, + "end_year": 2015 + } + } + }, + "rule_version": "scope1:3eef00a928eedd463ee48d02b79730da", + "entries": [], + "dropped_entries": [], + "choices": [ + { + "id": "spec_6d9c18873c6fea5004f84c3e92f33310:measure_basis", + "axis": "measure_basis", + "rule": "measure_basis_convention", + "provenance": "default", + "active": "measure_basis:net", + "options": [ + { + "option_id": "measure_basis:gross", + "label": "gross disbursements, current USD", + "binding": { + "kind": "shape", + "measured_property": "amount", + "netting_basis": "Gross" + }, + "availability": { + "status": "available", + "detail": {} + } + }, + { + "option_id": "measure_basis:net", + "label": "net disbursements, current USD", + "binding": { + "kind": "shape", + "measured_property": "amount", + "netting_basis": "Net" + }, + "availability": { + "status": "available", + "detail": {} + } + }, + { + "option_id": "measure_basis:grant_equivalent", + "label": "grant equivalents (OECD headline), current USD", + "binding": { + "kind": "shape", + "measured_property": "grantEquivalent", + "netting_basis": null + }, + "availability": { + "status": "unavailable", + "code": "basis_not_published", + "detail": { + "dataset": "provenance/OECDDAC2A" + } + } + }, + { + "option_id": "measure_basis:commitments", + "label": "commitments, current USD", + "binding": { + "kind": "shape", + "measured_property": "amount", + "netting_basis": null + }, + "availability": { + "status": "unavailable", + "code": "basis_not_published", + "detail": { + "dataset": "provenance/OECDDAC2A" + } + } + } + ] + }, + { + "id": "spec_6d9c18873c6fea5004f84c3e92f33310:provider", + "axis": "provider", + "rule": "bilateral_recipient_total", + "provenance": "default", + "active": "provider:bilateral", + "options": [ + { + "option_id": "provider:bilateral", + "label": "bilateral flows only", + "binding": { + "kind": "provider", + "scope": "bilateral" + }, + "availability": { + "status": "available", + "detail": {} + } + }, + { + "option_id": "provider:inclusive", + "label": "bilateral plus imputed multilateral", + "binding": { + "kind": "provider", + "scope": "inclusive" + }, + "availability": { + "status": "unavailable", + "code": "provider_not_offered", + "detail": { + "why": "pooled_providers" + } + } + } + ] + } + ], + "compiled": { + "spec_id": "spec_6d9c18873c6fea5004f84c3e92f33310", + "identity": { + "identity_version": "spec1", + "shape": { + "kind": "statvar_schema", + "population_type": "FinancialFlow", + "measured_property": "amount", + "stat_type": "measuredValue", + "measurement_qualifier": "Nominal" + }, + "slots": [ + { + "property": "dac2aAidType", + "binding": { + "state": "value", + "ref": "DAC2aAidType206" + } + }, + { + "property": "dacTypeOfFinance", + "binding": { + "state": "unbound" + } + }, + { + "property": "financialFlowType", + "binding": { + "state": "value", + "ref": "Disbursement" + } + }, + { + "property": "nettingBasis", + "binding": { + "state": "value", + "ref": "Net" + } + } + ], + "entities": { + "destination": [ + "country/IND" + ], + "origin": [ + "country/ARG", + "country/AUS", + "country/BRA", + "country/CAN", + "country/CHN", + "country/DEU", + "country/FRA", + "country/GBR", + "country/IDN", + "country/IND", + "country/ITA", + "country/JPN", + "country/KOR", + "country/MEX", + "country/RUS", + "country/SAU", + "country/TUR", + "country/USA", + "country/ZAF" + ] + }, + "requested_window": { + "kind": "range", + "start_year": 2015, + "end_year": 2015 + } + }, + "components": [ + { + "role": "whole", + "identity": { + "identity_version": "spec1", + "shape": { + "kind": "statvar_schema", + "population_type": "FinancialFlow", + "measured_property": "amount", + "stat_type": "measuredValue", + "measurement_qualifier": "Nominal" + }, + "slots": [ + { + "property": "dac2aAidType", + "binding": { + "state": "value", + "ref": "DAC2aAidType206" + } + }, + { + "property": "dacTypeOfFinance", + "binding": { + "state": "unbound" + } + }, + { + "property": "financialFlowType", + "binding": { + "state": "value", + "ref": "Disbursement" + } + }, + { + "property": "nettingBasis", + "binding": { + "state": "value", + "ref": "Net" + } + } + ], + "entities": { + "destination": [ + "country/IND" + ], + "origin": [ + "country/ARG", + "country/AUS", + "country/BRA", + "country/CAN", + "country/CHN", + "country/DEU", + "country/FRA", + "country/GBR", + "country/IDN", + "country/IND", + "country/ITA", + "country/JPN", + "country/KOR", + "country/MEX", + "country/RUS", + "country/SAU", + "country/TUR", + "country/USA", + "country/ZAF" + ] + }, + "requested_window": { + "kind": "range", + "start_year": 2015, + "end_year": 2015 + } + } + } + ] + }, + "ledger": [] } } } } ], - "rendered_sentence": "GDP in the 19 G20 members in 2015. Current US dollars · World Development Indicators. This shows the 19 G20 members, each on its own. Gross disbursements to India from the 19 G20 members for official development assistance in 2015. Current US dollars · OECD DAC2a. The data holds no values for 9 of the 19 G20 members. You asked for G20. This shows its members, each on its own.", + "rendered_sentence": "GDP in the 19 G20 members in 2015. Current US dollars · World Development Indicators. This shows the 19 G20 members, each on its own. Net disbursements to India from the 19 G20 members for official development assistance in 2015. Current US dollars · OECD DAC2a. The data holds no values for 9 of the 19 G20 members. You asked for G20. This shows its members, each on its own.", "sentence_plan": [ { "kind": "slot", @@ -8649,7 +8891,7 @@ }, { "kind": "slot", - "text": "Gross disbursements", + "text": "Net disbursements", "axis": "what", "segment": "heading", "entity_refs": [], @@ -8915,11 +9157,11 @@ "answer": { "kind": "resolution", "status": "definite", - "sentence": "GDP in the 19 G20 members in 2015. Current US dollars · World Development Indicators. This shows the 19 G20 members, each on its own. Gross disbursements to India from the 19 G20 members for official development assistance in 2015. Current US dollars · OECD DAC2a. The data holds no values for 9 of the 19 G20 members. You asked for G20. This shows its members, each on its own.", + "sentence": "GDP in the 19 G20 members in 2015. Current US dollars · World Development Indicators. This shows the 19 G20 members, each on its own. Net disbursements to India from the 19 G20 members for official development assistance in 2015. Current US dollars · OECD DAC2a. The data holds no values for 9 of the 19 G20 members. You asked for G20. This shows its members, each on its own.", "complete": true, "specs": [ "spec_66fdfe785d6a2bc455d49daaf76d6f89", - "spec_4587fc4776526af697f28532c9876980" + "spec_6d9c18873c6fea5004f84c3e92f33310" ], "gaps": [] } diff --git a/python/client-contract/src/dfo_client_contract/scenarios/choose-option-two-part-query.json b/python/client-contract/src/dfo_client_contract/scenarios/choose-option-two-part-query.json index 73b992c..c5e2af4 100644 --- a/python/client-contract/src/dfo_client_contract/scenarios/choose-option-two-part-query.json +++ b/python/client-contract/src/dfo_client_contract/scenarios/choose-option-two-part-query.json @@ -34,7 +34,7 @@ "status": 200, "headers": { "content-type": "application/json", - "x-dfo-trace-id": "989481cf76744b4cbddf1aff890cda9c" + "x-dfo-trace-id": "96a2cbe778b34b8695d7cdf943243a76" }, "json": { "schema_version": 1, @@ -45,11 +45,11 @@ "extract_skipped": true }, "diagnostics": { - "engine_build": "d80df9f5fd598b7345255470932d202ee5d49942", - "trace_id": "989481cf76744b4cbddf1aff890cda9c", + "engine_build": "ccb6617922c839ce3cd5615a3bbb65c70bfe1bde", + "trace_id": "96a2cbe778b34b8695d7cdf943243a76", "warnings": [], "timing_ms": { - "total": 1, + "total": 2, "by_step": { "coverage": 0, "response_cache_layer1": 1 @@ -68,10 +68,10 @@ "variable_text": "ODA disbursements", "warnings": [], "timing_ms": { - "total": 117, + "total": 871, "by_step": { - "recall": 117, - "phase_resolve_places": 0, + "recall": 870, + "phase_resolve_places": 1, "phase_check_entities": 0 } }, @@ -121,7 +121,9 @@ "entity_refs": [ { "text": "Germany", - "refs": [] + "refs": [ + "country/DEU" + ] }, { "text": "Congo", @@ -298,7 +300,7 @@ "error": { "class": "ContractError", "code": "contract_violation", - "trace_id": "989481cf76744b4cbddf1aff890cda9c" + "trace_id": "96a2cbe778b34b8695d7cdf943243a76" } } ] diff --git a/python/client-contract/src/dfo_client_contract/scenarios/choose-option-without-data-query.json b/python/client-contract/src/dfo_client_contract/scenarios/choose-option-without-data-query.json index 85140b0..734dda3 100644 --- a/python/client-contract/src/dfo_client_contract/scenarios/choose-option-without-data-query.json +++ b/python/client-contract/src/dfo_client_contract/scenarios/choose-option-without-data-query.json @@ -34,7 +34,7 @@ "status": 200, "headers": { "content-type": "application/json", - "x-dfo-trace-id": "989481cf76744b4cbddf1aff890cda9c" + "x-dfo-trace-id": "96a2cbe778b34b8695d7cdf943243a76" }, "json": { "schema_version": 1, @@ -45,11 +45,11 @@ "extract_skipped": true }, "diagnostics": { - "engine_build": "d80df9f5fd598b7345255470932d202ee5d49942", - "trace_id": "989481cf76744b4cbddf1aff890cda9c", + "engine_build": "ccb6617922c839ce3cd5615a3bbb65c70bfe1bde", + "trace_id": "96a2cbe778b34b8695d7cdf943243a76", "warnings": [], "timing_ms": { - "total": 1, + "total": 2, "by_step": { "coverage": 0, "response_cache_layer1": 1 @@ -68,10 +68,10 @@ "variable_text": "ODA disbursements", "warnings": [], "timing_ms": { - "total": 117, + "total": 871, "by_step": { - "recall": 117, - "phase_resolve_places": 0, + "recall": 870, + "phase_resolve_places": 1, "phase_check_entities": 0 } }, @@ -121,7 +121,9 @@ "entity_refs": [ { "text": "Germany", - "refs": [] + "refs": [ + "country/DEU" + ] }, { "text": "Congo", @@ -257,7 +259,7 @@ "error": { "class": "ContractError", "code": "contract_violation", - "trace_id": "989481cf76744b4cbddf1aff890cda9c" + "trace_id": "96a2cbe778b34b8695d7cdf943243a76" } } ] diff --git a/python/client-contract/src/dfo_client_contract/scenarios/choose-part-by-mention.json b/python/client-contract/src/dfo_client_contract/scenarios/choose-part-by-mention.json index 2224c1f..362fe62 100644 --- a/python/client-contract/src/dfo_client_contract/scenarios/choose-part-by-mention.json +++ b/python/client-contract/src/dfo_client_contract/scenarios/choose-part-by-mention.json @@ -5,8 +5,8 @@ "origin": { "kind": "recorded", "base_url": "https://dfo-dev-apis-zms5lj4zhq-nn.a.run.app/api", - "dfo_commit": "d80df9f5fd598b7345255470932d202ee5d49942", - "recorded_at": "2026-10-26T09:23:17Z" + "dfo_commit": "ccb6617922c839ce3cd5615a3bbb65c70bfe1bde", + "recorded_at": "2026-11-01T07:39:10Z" }, "call": [ { @@ -36,7 +36,7 @@ "status": 200, "headers": { "content-type": "application/json", - "x-dfo-trace-id": "b303ed69d4a54228aadf721bfa9f73c1" + "x-dfo-trace-id": "41996c770a1a42d091237803b5eeed31" }, "json": { "schema_version": 1, @@ -47,14 +47,14 @@ "extract_skipped": true }, "diagnostics": { - "engine_build": "d80df9f5fd598b7345255470932d202ee5d49942", - "trace_id": "b303ed69d4a54228aadf721bfa9f73c1", + "engine_build": "ccb6617922c839ce3cd5615a3bbb65c70bfe1bde", + "trace_id": "41996c770a1a42d091237803b5eeed31", "warnings": [], "timing_ms": { - "total": 1, + "total": 2, "by_step": { - "coverage": 0, - "response_cache_layer1": 0 + "coverage": 1, + "response_cache_layer1": 1 } }, "llm_usage": { @@ -70,10 +70,10 @@ "variable_text": "ODA disbursements", "warnings": [], "timing_ms": { - "total": 117, + "total": 871, "by_step": { - "recall": 117, - "phase_resolve_places": 0, + "recall": 870, + "phase_resolve_places": 1, "phase_check_entities": 0 } }, @@ -123,7 +123,9 @@ "entity_refs": [ { "text": "Germany", - "refs": [] + "refs": [ + "country/DEU" + ] }, { "text": "Congo", @@ -295,7 +297,7 @@ "status": 200, "headers": { "content-type": "application/json", - "x-dfo-trace-id": "a94d701882c9454da1459e8f957b8309" + "x-dfo-trace-id": "26c1a910c8a34c56a95e2e6c42ef6d11" }, "json": { "schema_version": 1, @@ -304,8 +306,8 @@ "extract_skipped": true }, "diagnostics": { - "engine_build": "d80df9f5fd598b7345255470932d202ee5d49942", - "trace_id": "a94d701882c9454da1459e8f957b8309", + "engine_build": "ccb6617922c839ce3cd5615a3bbb65c70bfe1bde", + "trace_id": "26c1a910c8a34c56a95e2e6c42ef6d11", "warnings": [], "timing_ms": { "total": 3, @@ -333,30 +335,30 @@ } ], "timing_ms": { - "total": 1045, + "total": 1121, "by_step": { "recall": 0, "phase_resolve_places": 0, "phase_check_entities": 0, "shape_arcs": 1, - "shape_probe_coverage": 10, - "shape_probe": 104, - "shape_groups": 56, + "shape_probe_coverage": 13, + "shape_probe": 241, + "shape_groups": 57, "shape_labels": 1, "shape_admission": 1, "phase_derive_shapes": 0, - "shape": 473, + "shape": 589, "phase_prune_and_rank": 0, - "bind": 105, - "phase_bind": 185, - "phase_settle": 8, - "phase_place_bindings": 77, + "bind": 115, + "phase_bind": 111, + "phase_settle": 5, + "phase_place_bindings": 79, "phase_facet_requests": 0, - "materialise": 17, - "phase_materialise": 5, - "answer": 9, - "options": 26, - "phase_outcome": 140 + "materialise": 19, + "phase_materialise": 6, + "answer": 10, + "options": 58, + "phase_outcome": 129 } }, "restatement": { @@ -396,10 +398,10 @@ "assumptions": [], "status": "definite", "spec": { - "spec_id": "spec_6b3a93b7bdf9a3dd1d4976a7e7eac4ee", + "spec_id": "spec_8435999aa7036a9ab5ff61e26cc18069", "definition": { "schema_version": 1, - "spec_id": "spec_6b3a93b7bdf9a3dd1d4976a7e7eac4ee", + "spec_id": "spec_8435999aa7036a9ab5ff61e26cc18069", "identity": { "identity_version": "spec1", "shape": { @@ -434,7 +436,7 @@ "property": "nettingBasis", "binding": { "state": "value", - "ref": "Gross" + "ref": "Net" } } ], @@ -456,7 +458,7 @@ "resolved": { "shape": { "shape_id": "financialflow_amount_measuredvalue_nominal_family_f096b1ba", - "label": "gross disbursements (official development assistance)", + "label": "net disbursements (official development assistance)", "population_type": { "ref": "FinancialFlow", "label": "financial flow" @@ -521,7 +523,7 @@ } ], "member_count": 1, - "member_digest": "1a36e1a7292b1bfff95a5415de0be74cac7bb033217ed50e79faa8ce51a224c0", + "member_digest": "c2d373442ac21a31377df76cd343f156c72a530649757c399c6661cbf56c9a71", "refine_supported": true, "data_commons": [ { @@ -600,8 +602,8 @@ "kind": "value", "value": { "ref": { - "ref": "Gross", - "label": "gross" + "ref": "Net", + "label": "net" }, "value_kind": "enum_value" } @@ -760,7 +762,7 @@ "label": "OECD Terms and Conditions" } }, - "coverage_stamp": "e6e717ab8c77e84d010915893ede5809e9ecec67929a07cfafbcc2210edfa1eb", + "coverage_stamp": "ad27fd11738abb03d2d84dc214e223f04781609636cf678d0d08c385fb863d99", "facets": { "provenance": { "basis": "fallback", @@ -798,48 +800,8 @@ { "value": { "ref": { - "ref": "DAC2aAidType201", - "label": "ODA grant" - }, - "value_kind": "enum_value" - }, - "relation": "child", - "parent": "DAC2aAidType206", - "member_count": 1, - "served_rows": 1, - "served_rows_exact": true - }, - { - "value": { - "ref": { - "ref": "DAC2aAidType207", - "label": "free-standing technical co-operation" - }, - "value_kind": "enum_value" - }, - "relation": "root", - "member_count": 1, - "served_rows": 1, - "served_rows_exact": true - }, - { - "value": { - "ref": { - "ref": "DAC2aAidType213", - "label": "developmental food aid" - }, - "value_kind": "enum_value" - }, - "relation": "root", - "member_count": 1, - "served_rows": 1, - "served_rows_exact": true - }, - { - "value": { - "ref": { - "ref": "DAC2aAidType216", - "label": "humanitarian aid" + "ref": "DAC2aAidType250", + "label": "official development assistance excluding debt relief" }, "value_kind": "enum_value" }, @@ -888,7 +850,7 @@ "source": "observed" } ], - "rendered_sentence": "Germany's gross disbursements to Democratic Republic of the Congo for official development assistance in 2018. Current US dollars · OECD DAC2a.", + "rendered_sentence": "Germany's net disbursements to Democratic Republic of the Congo for official development assistance in 2018. Current US dollars · OECD DAC2a.", "sentence_plan": [ { "kind": "slot", @@ -919,7 +881,7 @@ }, { "kind": "slot", - "text": "gross disbursements", + "text": "net disbursements", "axis": "what", "segment": "heading", "entity_refs": [], @@ -1157,8 +1119,8 @@ "binding_kind": "value", "refs": [ { - "ref": "Gross", - "label": "gross" + "ref": "Net", + "label": "net" } ], "provenance": "measure_elected" @@ -1214,7 +1176,7 @@ "start_year": 2018, "end_year": 2018 }, - "capability_version": "cap_765c9d2a0c7529b9", + "capability_version": "cap_4913302d7a6b6435", "default_reading": { "applied": true, "removed_stat_vars": [] @@ -1222,108 +1184,8 @@ }, "confidence": "high", "available_at_place": true, - "alternative_measures": [ - { - "definition": { - "schema_version": 1, - "spec_id": "spec_8435999aa7036a9ab5ff61e26cc18069", - "identity": { - "identity_version": "spec1", - "shape": { - "kind": "statvar_schema", - "population_type": "FinancialFlow", - "measured_property": "amount", - "stat_type": "measuredValue", - "measurement_qualifier": "Nominal" - }, - "slots": [ - { - "property": "dac2aAidType", - "binding": { - "state": "value", - "ref": "DAC2aAidType206" - } - }, - { - "property": "dacTypeOfFinance", - "binding": { - "state": "unbound" - } - }, - { - "property": "financialFlowType", - "binding": { - "state": "value", - "ref": "Disbursement" - } - }, - { - "property": "nettingBasis", - "binding": { - "state": "value", - "ref": "Net" - } - } - ], - "entities": { - "destination": [ - "country/COD" - ], - "origin": [ - "country/DEU" - ] - }, - "requested_window": { - "kind": "range", - "start_year": 2018, - "end_year": 2018 - } - } - }, - "label": "net disbursements", - "axis": "what", - "measure_axis_values": [ - { - "axis": "populationType", - "value": { - "ref": "FinancialFlow", - "label": "financial flow" - } - }, - { - "axis": "measuredProperty", - "value": { - "ref": "amount", - "label": "amount" - } - }, - { - "axis": "measurementQualifier", - "value": { - "ref": "Nominal", - "label": "nominal" - } - }, - { - "axis": "financialFlowType", - "value": { - "ref": "Disbursement", - "label": "disbursement" - } - }, - { - "axis": "nettingBasis", - "value": { - "ref": "Net", - "label": "net" - } - } - ], - "served_rows": 1, - "served_rows_exact": true - } - ], - "measure_label": "gross disbursements", + "alternative_measures": [], + "measure_label": "net disbursements", "measure_label_axes": [ "populationType", "measuredProperty", @@ -1363,11 +1225,13 @@ { "axis": "nettingBasis", "value": { - "ref": "Gross", - "label": "gross" + "ref": "Net", + "label": "net" } } ], + "concept_label": "official development assistance", + "published_tables": "OECD DAC2a", "unit_conversion": { "currencies": [ { @@ -3330,12 +3194,290 @@ "destination": "CDF", "origin": "EUR" } + }, + "scope_choices": { + "id": "spec_8435999aa7036a9ab5ff61e26cc18069", + "base": { + "schema_version": 1, + "spec_id": "spec_8435999aa7036a9ab5ff61e26cc18069", + "identity": { + "identity_version": "spec1", + "shape": { + "kind": "statvar_schema", + "population_type": "FinancialFlow", + "measured_property": "amount", + "stat_type": "measuredValue", + "measurement_qualifier": "Nominal" + }, + "slots": [ + { + "property": "dac2aAidType", + "binding": { + "state": "value", + "ref": "DAC2aAidType206" + } + }, + { + "property": "dacTypeOfFinance", + "binding": { + "state": "unbound" + } + }, + { + "property": "financialFlowType", + "binding": { + "state": "value", + "ref": "Disbursement" + } + }, + { + "property": "nettingBasis", + "binding": { + "state": "value", + "ref": "Net" + } + } + ], + "entities": { + "destination": [ + "country/COD" + ], + "origin": [ + "country/DEU" + ] + }, + "requested_window": { + "kind": "range", + "start_year": 2018, + "end_year": 2018 + } + } + }, + "rule_version": "scope1:3eef00a928eedd463ee48d02b79730da", + "entries": [], + "dropped_entries": [], + "choices": [ + { + "id": "spec_8435999aa7036a9ab5ff61e26cc18069:measure_basis", + "axis": "measure_basis", + "rule": "measure_basis_convention", + "provenance": "default", + "active": "measure_basis:net", + "options": [ + { + "option_id": "measure_basis:gross", + "label": "gross disbursements, current USD", + "binding": { + "kind": "shape", + "measured_property": "amount", + "netting_basis": "Gross" + }, + "availability": { + "status": "available", + "detail": {} + } + }, + { + "option_id": "measure_basis:net", + "label": "net disbursements, current USD", + "binding": { + "kind": "shape", + "measured_property": "amount", + "netting_basis": "Net" + }, + "availability": { + "status": "available", + "detail": {} + } + }, + { + "option_id": "measure_basis:grant_equivalent", + "label": "grant equivalents (OECD headline), current USD", + "binding": { + "kind": "shape", + "measured_property": "grantEquivalent", + "netting_basis": null + }, + "availability": { + "status": "unavailable", + "code": "basis_not_published", + "detail": { + "dataset": "provenance/OECDDAC2A" + } + } + }, + { + "option_id": "measure_basis:commitments", + "label": "commitments, current USD", + "binding": { + "kind": "shape", + "measured_property": "amount", + "netting_basis": null + }, + "availability": { + "status": "unavailable", + "code": "basis_not_published", + "detail": { + "dataset": "provenance/OECDDAC2A" + } + } + } + ] + }, + { + "id": "spec_8435999aa7036a9ab5ff61e26cc18069:provider", + "axis": "provider", + "rule": "bilateral_recipient_total", + "provenance": "default", + "active": "provider:bilateral", + "options": [ + { + "option_id": "provider:bilateral", + "label": "bilateral flows only", + "binding": { + "kind": "provider", + "scope": "bilateral" + }, + "availability": { + "status": "available", + "detail": {} + } + }, + { + "option_id": "provider:inclusive", + "label": "net bilateral plus imputed multilateral as published, by convention", + "binding": { + "kind": "provider", + "scope": "inclusive", + "provenance": "provenance/ONEDAC2aBilateralAndImputedMultilateral" + }, + "availability": { + "status": "available", + "detail": {} + } + } + ] + } + ], + "compiled": { + "spec_id": "spec_8435999aa7036a9ab5ff61e26cc18069", + "identity": { + "identity_version": "spec1", + "shape": { + "kind": "statvar_schema", + "population_type": "FinancialFlow", + "measured_property": "amount", + "stat_type": "measuredValue", + "measurement_qualifier": "Nominal" + }, + "slots": [ + { + "property": "dac2aAidType", + "binding": { + "state": "value", + "ref": "DAC2aAidType206" + } + }, + { + "property": "dacTypeOfFinance", + "binding": { + "state": "unbound" + } + }, + { + "property": "financialFlowType", + "binding": { + "state": "value", + "ref": "Disbursement" + } + }, + { + "property": "nettingBasis", + "binding": { + "state": "value", + "ref": "Net" + } + } + ], + "entities": { + "destination": [ + "country/COD" + ], + "origin": [ + "country/DEU" + ] + }, + "requested_window": { + "kind": "range", + "start_year": 2018, + "end_year": 2018 + } + }, + "components": [ + { + "role": "whole", + "identity": { + "identity_version": "spec1", + "shape": { + "kind": "statvar_schema", + "population_type": "FinancialFlow", + "measured_property": "amount", + "stat_type": "measuredValue", + "measurement_qualifier": "Nominal" + }, + "slots": [ + { + "property": "dac2aAidType", + "binding": { + "state": "value", + "ref": "DAC2aAidType206" + } + }, + { + "property": "dacTypeOfFinance", + "binding": { + "state": "unbound" + } + }, + { + "property": "financialFlowType", + "binding": { + "state": "value", + "ref": "Disbursement" + } + }, + { + "property": "nettingBasis", + "binding": { + "state": "value", + "ref": "Net" + } + } + ], + "entities": { + "destination": [ + "country/COD" + ], + "origin": [ + "country/DEU" + ] + }, + "requested_window": { + "kind": "range", + "start_year": 2018, + "end_year": 2018 + } + } + } + ] + }, + "ledger": [] } } } } ], - "rendered_sentence": "Germany's gross disbursements to Democratic Republic of the Congo for official development assistance in 2018. Current US dollars · OECD DAC2a.", + "rendered_sentence": "Germany's net disbursements to Democratic Republic of the Congo for official development assistance in 2018. Current US dollars · OECD DAC2a.", "sentence_plan": [ { "kind": "slot", @@ -3369,7 +3511,7 @@ }, { "kind": "slot", - "text": "gross disbursements", + "text": "net disbursements", "axis": "what", "segment": "heading", "entity_refs": [], @@ -3553,10 +3695,10 @@ "answer": { "kind": "resolution", "status": "definite", - "sentence": "Germany's gross disbursements to Democratic Republic of the Congo for official development assistance in 2018. Current US dollars · OECD DAC2a.", + "sentence": "Germany's net disbursements to Democratic Republic of the Congo for official development assistance in 2018. Current US dollars · OECD DAC2a.", "complete": true, "specs": [ - "spec_6b3a93b7bdf9a3dd1d4976a7e7eac4ee" + "spec_8435999aa7036a9ab5ff61e26cc18069" ], "gaps": [] } diff --git a/python/client-contract/src/dfo_client_contract/scenarios/choose-place-one-part.json b/python/client-contract/src/dfo_client_contract/scenarios/choose-place-one-part.json index 64b25c4..de73827 100644 --- a/python/client-contract/src/dfo_client_contract/scenarios/choose-place-one-part.json +++ b/python/client-contract/src/dfo_client_contract/scenarios/choose-place-one-part.json @@ -5,8 +5,8 @@ "origin": { "kind": "recorded", "base_url": "https://dfo-dev-apis-zms5lj4zhq-nn.a.run.app/api", - "dfo_commit": "d80df9f5fd598b7345255470932d202ee5d49942", - "recorded_at": "2026-10-26T09:23:16Z" + "dfo_commit": "ccb6617922c839ce3cd5615a3bbb65c70bfe1bde", + "recorded_at": "2026-11-01T07:39:09Z" }, "call": [ { @@ -35,7 +35,7 @@ "status": 200, "headers": { "content-type": "application/json", - "x-dfo-trace-id": "989481cf76744b4cbddf1aff890cda9c" + "x-dfo-trace-id": "96a2cbe778b34b8695d7cdf943243a76" }, "json": { "schema_version": 1, @@ -46,11 +46,11 @@ "extract_skipped": true }, "diagnostics": { - "engine_build": "d80df9f5fd598b7345255470932d202ee5d49942", - "trace_id": "989481cf76744b4cbddf1aff890cda9c", + "engine_build": "ccb6617922c839ce3cd5615a3bbb65c70bfe1bde", + "trace_id": "96a2cbe778b34b8695d7cdf943243a76", "warnings": [], "timing_ms": { - "total": 1, + "total": 2, "by_step": { "coverage": 0, "response_cache_layer1": 1 @@ -69,10 +69,10 @@ "variable_text": "ODA disbursements", "warnings": [], "timing_ms": { - "total": 117, + "total": 871, "by_step": { - "recall": 117, - "phase_resolve_places": 0, + "recall": 870, + "phase_resolve_places": 1, "phase_check_entities": 0 } }, @@ -122,7 +122,9 @@ "entity_refs": [ { "text": "Germany", - "refs": [] + "refs": [ + "country/DEU" + ] }, { "text": "Congo", @@ -294,7 +296,7 @@ "status": 200, "headers": { "content-type": "application/json", - "x-dfo-trace-id": "7cbd24b2c1a0457da3df6702b8caf3aa" + "x-dfo-trace-id": "2cab3a3cbf0149de99fb1c73aa2688f5" }, "json": { "schema_version": 1, @@ -303,11 +305,11 @@ "extract_skipped": true }, "diagnostics": { - "engine_build": "d80df9f5fd598b7345255470932d202ee5d49942", - "trace_id": "7cbd24b2c1a0457da3df6702b8caf3aa", + "engine_build": "ccb6617922c839ce3cd5615a3bbb65c70bfe1bde", + "trace_id": "2cab3a3cbf0149de99fb1c73aa2688f5", "warnings": [], "timing_ms": { - "total": 1050, + "total": 1127, "by_step": { "coverage": 0 } @@ -316,8 +318,8 @@ "input_tokens": 0, "output_tokens": 0, "cached_tokens": 0, - "jev_input_tokens": 7365, - "jev_output_tokens": 1646 + "jev_input_tokens": 7477, + "jev_output_tokens": 1674 }, "timed_out": false }, @@ -333,30 +335,30 @@ } ], "timing_ms": { - "total": 1045, + "total": 1121, "by_step": { "recall": 0, "phase_resolve_places": 0, "phase_check_entities": 0, "shape_arcs": 1, - "shape_probe_coverage": 10, - "shape_probe": 104, - "shape_groups": 56, + "shape_probe_coverage": 13, + "shape_probe": 241, + "shape_groups": 57, "shape_labels": 1, "shape_admission": 1, "phase_derive_shapes": 0, - "shape": 473, + "shape": 589, "phase_prune_and_rank": 0, - "bind": 105, - "phase_bind": 185, - "phase_settle": 8, - "phase_place_bindings": 77, + "bind": 115, + "phase_bind": 111, + "phase_settle": 5, + "phase_place_bindings": 79, "phase_facet_requests": 0, - "materialise": 17, - "phase_materialise": 5, - "answer": 9, - "options": 26, - "phase_outcome": 140 + "materialise": 19, + "phase_materialise": 6, + "answer": 10, + "options": 58, + "phase_outcome": 129 } }, "restatement": { @@ -396,10 +398,10 @@ "assumptions": [], "status": "definite", "spec": { - "spec_id": "spec_6b3a93b7bdf9a3dd1d4976a7e7eac4ee", + "spec_id": "spec_8435999aa7036a9ab5ff61e26cc18069", "definition": { "schema_version": 1, - "spec_id": "spec_6b3a93b7bdf9a3dd1d4976a7e7eac4ee", + "spec_id": "spec_8435999aa7036a9ab5ff61e26cc18069", "identity": { "identity_version": "spec1", "shape": { @@ -434,7 +436,7 @@ "property": "nettingBasis", "binding": { "state": "value", - "ref": "Gross" + "ref": "Net" } } ], @@ -456,7 +458,7 @@ "resolved": { "shape": { "shape_id": "financialflow_amount_measuredvalue_nominal_family_f096b1ba", - "label": "gross disbursements (official development assistance)", + "label": "net disbursements (official development assistance)", "population_type": { "ref": "FinancialFlow", "label": "financial flow" @@ -521,7 +523,7 @@ } ], "member_count": 1, - "member_digest": "1a36e1a7292b1bfff95a5415de0be74cac7bb033217ed50e79faa8ce51a224c0", + "member_digest": "c2d373442ac21a31377df76cd343f156c72a530649757c399c6661cbf56c9a71", "refine_supported": true, "data_commons": [ { @@ -600,8 +602,8 @@ "kind": "value", "value": { "ref": { - "ref": "Gross", - "label": "gross" + "ref": "Net", + "label": "net" }, "value_kind": "enum_value" } @@ -760,7 +762,7 @@ "label": "OECD Terms and Conditions" } }, - "coverage_stamp": "e6e717ab8c77e84d010915893ede5809e9ecec67929a07cfafbcc2210edfa1eb", + "coverage_stamp": "ad27fd11738abb03d2d84dc214e223f04781609636cf678d0d08c385fb863d99", "facets": { "provenance": { "basis": "fallback", @@ -798,48 +800,8 @@ { "value": { "ref": { - "ref": "DAC2aAidType201", - "label": "ODA grant" - }, - "value_kind": "enum_value" - }, - "relation": "child", - "parent": "DAC2aAidType206", - "member_count": 1, - "served_rows": 1, - "served_rows_exact": true - }, - { - "value": { - "ref": { - "ref": "DAC2aAidType207", - "label": "free-standing technical co-operation" - }, - "value_kind": "enum_value" - }, - "relation": "root", - "member_count": 1, - "served_rows": 1, - "served_rows_exact": true - }, - { - "value": { - "ref": { - "ref": "DAC2aAidType213", - "label": "developmental food aid" - }, - "value_kind": "enum_value" - }, - "relation": "root", - "member_count": 1, - "served_rows": 1, - "served_rows_exact": true - }, - { - "value": { - "ref": { - "ref": "DAC2aAidType216", - "label": "humanitarian aid" + "ref": "DAC2aAidType250", + "label": "official development assistance excluding debt relief" }, "value_kind": "enum_value" }, @@ -888,7 +850,7 @@ "source": "observed" } ], - "rendered_sentence": "Germany's gross disbursements to Democratic Republic of the Congo for official development assistance in 2018. Current US dollars · OECD DAC2a.", + "rendered_sentence": "Germany's net disbursements to Democratic Republic of the Congo for official development assistance in 2018. Current US dollars · OECD DAC2a.", "sentence_plan": [ { "kind": "slot", @@ -919,7 +881,7 @@ }, { "kind": "slot", - "text": "gross disbursements", + "text": "net disbursements", "axis": "what", "segment": "heading", "entity_refs": [], @@ -1157,8 +1119,8 @@ "binding_kind": "value", "refs": [ { - "ref": "Gross", - "label": "gross" + "ref": "Net", + "label": "net" } ], "provenance": "measure_elected" @@ -1214,7 +1176,7 @@ "start_year": 2018, "end_year": 2018 }, - "capability_version": "cap_765c9d2a0c7529b9", + "capability_version": "cap_4913302d7a6b6435", "default_reading": { "applied": true, "removed_stat_vars": [] @@ -1222,108 +1184,8 @@ }, "confidence": "high", "available_at_place": true, - "alternative_measures": [ - { - "definition": { - "schema_version": 1, - "spec_id": "spec_8435999aa7036a9ab5ff61e26cc18069", - "identity": { - "identity_version": "spec1", - "shape": { - "kind": "statvar_schema", - "population_type": "FinancialFlow", - "measured_property": "amount", - "stat_type": "measuredValue", - "measurement_qualifier": "Nominal" - }, - "slots": [ - { - "property": "dac2aAidType", - "binding": { - "state": "value", - "ref": "DAC2aAidType206" - } - }, - { - "property": "dacTypeOfFinance", - "binding": { - "state": "unbound" - } - }, - { - "property": "financialFlowType", - "binding": { - "state": "value", - "ref": "Disbursement" - } - }, - { - "property": "nettingBasis", - "binding": { - "state": "value", - "ref": "Net" - } - } - ], - "entities": { - "destination": [ - "country/COD" - ], - "origin": [ - "country/DEU" - ] - }, - "requested_window": { - "kind": "range", - "start_year": 2018, - "end_year": 2018 - } - } - }, - "label": "net disbursements", - "axis": "what", - "measure_axis_values": [ - { - "axis": "populationType", - "value": { - "ref": "FinancialFlow", - "label": "financial flow" - } - }, - { - "axis": "measuredProperty", - "value": { - "ref": "amount", - "label": "amount" - } - }, - { - "axis": "measurementQualifier", - "value": { - "ref": "Nominal", - "label": "nominal" - } - }, - { - "axis": "financialFlowType", - "value": { - "ref": "Disbursement", - "label": "disbursement" - } - }, - { - "axis": "nettingBasis", - "value": { - "ref": "Net", - "label": "net" - } - } - ], - "served_rows": 1, - "served_rows_exact": true - } - ], - "measure_label": "gross disbursements", + "alternative_measures": [], + "measure_label": "net disbursements", "measure_label_axes": [ "populationType", "measuredProperty", @@ -1363,11 +1225,13 @@ { "axis": "nettingBasis", "value": { - "ref": "Gross", - "label": "gross" + "ref": "Net", + "label": "net" } } ], + "concept_label": "official development assistance", + "published_tables": "OECD DAC2a", "unit_conversion": { "currencies": [ { @@ -3330,12 +3194,290 @@ "destination": "CDF", "origin": "EUR" } + }, + "scope_choices": { + "id": "spec_8435999aa7036a9ab5ff61e26cc18069", + "base": { + "schema_version": 1, + "spec_id": "spec_8435999aa7036a9ab5ff61e26cc18069", + "identity": { + "identity_version": "spec1", + "shape": { + "kind": "statvar_schema", + "population_type": "FinancialFlow", + "measured_property": "amount", + "stat_type": "measuredValue", + "measurement_qualifier": "Nominal" + }, + "slots": [ + { + "property": "dac2aAidType", + "binding": { + "state": "value", + "ref": "DAC2aAidType206" + } + }, + { + "property": "dacTypeOfFinance", + "binding": { + "state": "unbound" + } + }, + { + "property": "financialFlowType", + "binding": { + "state": "value", + "ref": "Disbursement" + } + }, + { + "property": "nettingBasis", + "binding": { + "state": "value", + "ref": "Net" + } + } + ], + "entities": { + "destination": [ + "country/COD" + ], + "origin": [ + "country/DEU" + ] + }, + "requested_window": { + "kind": "range", + "start_year": 2018, + "end_year": 2018 + } + } + }, + "rule_version": "scope1:3eef00a928eedd463ee48d02b79730da", + "entries": [], + "dropped_entries": [], + "choices": [ + { + "id": "spec_8435999aa7036a9ab5ff61e26cc18069:measure_basis", + "axis": "measure_basis", + "rule": "measure_basis_convention", + "provenance": "default", + "active": "measure_basis:net", + "options": [ + { + "option_id": "measure_basis:gross", + "label": "gross disbursements, current USD", + "binding": { + "kind": "shape", + "measured_property": "amount", + "netting_basis": "Gross" + }, + "availability": { + "status": "available", + "detail": {} + } + }, + { + "option_id": "measure_basis:net", + "label": "net disbursements, current USD", + "binding": { + "kind": "shape", + "measured_property": "amount", + "netting_basis": "Net" + }, + "availability": { + "status": "available", + "detail": {} + } + }, + { + "option_id": "measure_basis:grant_equivalent", + "label": "grant equivalents (OECD headline), current USD", + "binding": { + "kind": "shape", + "measured_property": "grantEquivalent", + "netting_basis": null + }, + "availability": { + "status": "unavailable", + "code": "basis_not_published", + "detail": { + "dataset": "provenance/OECDDAC2A" + } + } + }, + { + "option_id": "measure_basis:commitments", + "label": "commitments, current USD", + "binding": { + "kind": "shape", + "measured_property": "amount", + "netting_basis": null + }, + "availability": { + "status": "unavailable", + "code": "basis_not_published", + "detail": { + "dataset": "provenance/OECDDAC2A" + } + } + } + ] + }, + { + "id": "spec_8435999aa7036a9ab5ff61e26cc18069:provider", + "axis": "provider", + "rule": "bilateral_recipient_total", + "provenance": "default", + "active": "provider:bilateral", + "options": [ + { + "option_id": "provider:bilateral", + "label": "bilateral flows only", + "binding": { + "kind": "provider", + "scope": "bilateral" + }, + "availability": { + "status": "available", + "detail": {} + } + }, + { + "option_id": "provider:inclusive", + "label": "net bilateral plus imputed multilateral as published, by convention", + "binding": { + "kind": "provider", + "scope": "inclusive", + "provenance": "provenance/ONEDAC2aBilateralAndImputedMultilateral" + }, + "availability": { + "status": "available", + "detail": {} + } + } + ] + } + ], + "compiled": { + "spec_id": "spec_8435999aa7036a9ab5ff61e26cc18069", + "identity": { + "identity_version": "spec1", + "shape": { + "kind": "statvar_schema", + "population_type": "FinancialFlow", + "measured_property": "amount", + "stat_type": "measuredValue", + "measurement_qualifier": "Nominal" + }, + "slots": [ + { + "property": "dac2aAidType", + "binding": { + "state": "value", + "ref": "DAC2aAidType206" + } + }, + { + "property": "dacTypeOfFinance", + "binding": { + "state": "unbound" + } + }, + { + "property": "financialFlowType", + "binding": { + "state": "value", + "ref": "Disbursement" + } + }, + { + "property": "nettingBasis", + "binding": { + "state": "value", + "ref": "Net" + } + } + ], + "entities": { + "destination": [ + "country/COD" + ], + "origin": [ + "country/DEU" + ] + }, + "requested_window": { + "kind": "range", + "start_year": 2018, + "end_year": 2018 + } + }, + "components": [ + { + "role": "whole", + "identity": { + "identity_version": "spec1", + "shape": { + "kind": "statvar_schema", + "population_type": "FinancialFlow", + "measured_property": "amount", + "stat_type": "measuredValue", + "measurement_qualifier": "Nominal" + }, + "slots": [ + { + "property": "dac2aAidType", + "binding": { + "state": "value", + "ref": "DAC2aAidType206" + } + }, + { + "property": "dacTypeOfFinance", + "binding": { + "state": "unbound" + } + }, + { + "property": "financialFlowType", + "binding": { + "state": "value", + "ref": "Disbursement" + } + }, + { + "property": "nettingBasis", + "binding": { + "state": "value", + "ref": "Net" + } + } + ], + "entities": { + "destination": [ + "country/COD" + ], + "origin": [ + "country/DEU" + ] + }, + "requested_window": { + "kind": "range", + "start_year": 2018, + "end_year": 2018 + } + } + } + ] + }, + "ledger": [] } } } } ], - "rendered_sentence": "Germany's gross disbursements to Democratic Republic of the Congo for official development assistance in 2018. Current US dollars · OECD DAC2a.", + "rendered_sentence": "Germany's net disbursements to Democratic Republic of the Congo for official development assistance in 2018. Current US dollars · OECD DAC2a.", "sentence_plan": [ { "kind": "slot", @@ -3369,7 +3511,7 @@ }, { "kind": "slot", - "text": "gross disbursements", + "text": "net disbursements", "axis": "what", "segment": "heading", "entity_refs": [], @@ -3553,10 +3695,10 @@ "answer": { "kind": "resolution", "status": "definite", - "sentence": "Germany's gross disbursements to Democratic Republic of the Congo for official development assistance in 2018. Current US dollars · OECD DAC2a.", + "sentence": "Germany's net disbursements to Democratic Republic of the Congo for official development assistance in 2018. Current US dollars · OECD DAC2a.", "complete": true, "specs": [ - "spec_6b3a93b7bdf9a3dd1d4976a7e7eac4ee" + "spec_8435999aa7036a9ab5ff61e26cc18069" ], "gaps": [] } diff --git a/python/client-contract/src/dfo_client_contract/scenarios/choose-place-two-parts.json b/python/client-contract/src/dfo_client_contract/scenarios/choose-place-two-parts.json index 3b9e216..345f4f6 100644 --- a/python/client-contract/src/dfo_client_contract/scenarios/choose-place-two-parts.json +++ b/python/client-contract/src/dfo_client_contract/scenarios/choose-place-two-parts.json @@ -5,8 +5,8 @@ "origin": { "kind": "recorded", "base_url": "https://dfo-dev-apis-zms5lj4zhq-nn.a.run.app/api", - "dfo_commit": "d80df9f5fd598b7345255470932d202ee5d49942", - "recorded_at": "2026-10-26T09:23:18Z" + "dfo_commit": "ccb6617922c839ce3cd5615a3bbb65c70bfe1bde", + "recorded_at": "2026-11-01T07:39:11Z" }, "call": [ { @@ -36,7 +36,7 @@ "status": 200, "headers": { "content-type": "application/json", - "x-dfo-trace-id": "2e930444ceab49e29354b073af99327e" + "x-dfo-trace-id": "a9baaef4ff644315aaf8b737eefaf840" }, "json": { "schema_version": 1, @@ -47,14 +47,14 @@ "extract_skipped": true }, "diagnostics": { - "engine_build": "d80df9f5fd598b7345255470932d202ee5d49942", - "trace_id": "2e930444ceab49e29354b073af99327e", + "engine_build": "ccb6617922c839ce3cd5615a3bbb65c70bfe1bde", + "trace_id": "a9baaef4ff644315aaf8b737eefaf840", "warnings": [], "timing_ms": { "total": 1, "by_step": { "coverage": 0, - "response_cache_layer1": 0 + "response_cache_layer1": 1 } }, "llm_usage": { @@ -126,11 +126,15 @@ "entity_refs": [ { "text": "Kenya", - "refs": [] + "refs": [ + "country/KEN" + ] }, { "text": "Germany", - "refs": [] + "refs": [ + "country/DEU" + ] }, { "text": "Congo", @@ -244,9 +248,9 @@ "variable_text": "ODA disbursements", "warnings": [], "timing_ms": { - "total": 2, + "total": 1, "by_step": { - "recall": 2, + "recall": 1, "phase_resolve_places": 0, "phase_check_entities": 0 } @@ -300,11 +304,15 @@ "entity_refs": [ { "text": "Kenya", - "refs": [] + "refs": [ + "country/KEN" + ] }, { "text": "Germany", - "refs": [] + "refs": [ + "country/DEU" + ] }, { "text": "Congo", @@ -510,7 +518,7 @@ "status": 200, "headers": { "content-type": "application/json", - "x-dfo-trace-id": "729685f37628473f8bb70255010dc59a" + "x-dfo-trace-id": "825d68353b6f4b41bbc60bb978a03f57" }, "json": { "schema_version": 1, @@ -519,11 +527,11 @@ "extract_skipped": true }, "diagnostics": { - "engine_build": "d80df9f5fd598b7345255470932d202ee5d49942", - "trace_id": "729685f37628473f8bb70255010dc59a", + "engine_build": "ccb6617922c839ce3cd5615a3bbb65c70bfe1bde", + "trace_id": "825d68353b6f4b41bbc60bb978a03f57", "warnings": [], "timing_ms": { - "total": 1092, + "total": 1132, "by_step": { "coverage": 0 } @@ -532,8 +540,8 @@ "input_tokens": 0, "output_tokens": 0, "cached_tokens": 0, - "jev_input_tokens": 7367, - "jev_output_tokens": 1646 + "jev_input_tokens": 7479, + "jev_output_tokens": 1674 }, "timed_out": false }, @@ -551,8 +559,8 @@ "timing_ms": { "total": 1, "by_step": { - "recall": 0, - "phase_resolve_places": 1, + "recall": 1, + "phase_resolve_places": 0, "phase_check_entities": 0 } }, @@ -605,11 +613,15 @@ "entity_refs": [ { "text": "Kenya", - "refs": [] + "refs": [ + "country/KEN" + ] }, { "text": "Germany", - "refs": [] + "refs": [ + "country/DEU" + ] }, { "text": "Congo", @@ -734,30 +746,30 @@ } ], "timing_ms": { - "total": 1087, + "total": 1126, "by_step": { "recall": 1, "phase_resolve_places": 0, "phase_check_entities": 0, "shape_arcs": 1, - "shape_probe_coverage": 7, - "shape_probe": 104, - "shape_groups": 59, + "shape_probe_coverage": 12, + "shape_probe": 109, + "shape_groups": 56, "shape_labels": 1, - "shape_admission": 1, + "shape_admission": 0, "phase_derive_shapes": 0, - "shape": 451, + "shape": 519, "phase_prune_and_rank": 0, - "bind": 105, - "phase_bind": 247, - "phase_settle": 8, - "phase_place_bindings": 77, + "bind": 122, + "phase_bind": 174, + "phase_settle": 5, + "phase_place_bindings": 93, "phase_facet_requests": 0, "materialise": 16, - "phase_materialise": 5, - "answer": 9, - "options": 6, - "phase_outcome": 162 + "phase_materialise": 6, + "answer": 10, + "options": 48, + "phase_outcome": 132 } }, "restatement": { @@ -807,10 +819,10 @@ "assumptions": [], "status": "definite", "spec": { - "spec_id": "spec_4b8c1ba9efe879b10dc3fde2c24dc483", + "spec_id": "spec_9de5a8ccb2c8bd8f2ad793949b9c0222", "definition": { "schema_version": 1, - "spec_id": "spec_4b8c1ba9efe879b10dc3fde2c24dc483", + "spec_id": "spec_9de5a8ccb2c8bd8f2ad793949b9c0222", "identity": { "identity_version": "spec1", "shape": { @@ -845,7 +857,7 @@ "property": "nettingBasis", "binding": { "state": "value", - "ref": "Gross" + "ref": "Net" } } ], @@ -866,7 +878,7 @@ "resolved": { "shape": { "shape_id": "financialflow_amount_measuredvalue_nominal_family_f096b1ba", - "label": "gross disbursements (official development assistance)", + "label": "net disbursements (official development assistance)", "population_type": { "ref": "FinancialFlow", "label": "financial flow" @@ -931,7 +943,7 @@ } ], "member_count": 1, - "member_digest": "1a36e1a7292b1bfff95a5415de0be74cac7bb033217ed50e79faa8ce51a224c0", + "member_digest": "c2d373442ac21a31377df76cd343f156c72a530649757c399c6661cbf56c9a71", "refine_supported": true, "data_commons": [ { @@ -1010,8 +1022,8 @@ "kind": "value", "value": { "ref": { - "ref": "Gross", - "label": "gross" + "ref": "Net", + "label": "net" }, "value_kind": "enum_value" } @@ -1170,7 +1182,7 @@ "label": "OECD Terms and Conditions" } }, - "coverage_stamp": "e6e717ab8c77e84d010915893ede5809e9ecec67929a07cfafbcc2210edfa1eb", + "coverage_stamp": "ad27fd11738abb03d2d84dc214e223f04781609636cf678d0d08c385fb863d99", "facets": { "provenance": { "basis": "fallback", @@ -1216,60 +1228,60 @@ "relation": "child", "parent": "DAC2aAidType206", "member_count": 2, - "served_rows": 106, + "served_rows": 113, "served_rows_exact": true }, { "value": { "ref": { - "ref": "DAC2aAidType201", - "label": "ODA grant" + "ref": "DAC2aAidType219", + "label": "recovery on ODA grants and capital subscriptions" }, "value_kind": "enum_value" }, "relation": "child", "parent": "DAC2aAidType206", "member_count": 1, - "served_rows": 130, + "served_rows": 2, "served_rows_exact": true }, { "value": { "ref": { - "ref": "DAC2aAidType207", - "label": "free-standing technical co-operation" + "ref": "DAC2aAidType209", + "label": "interest received on ODA lending" }, "value_kind": "enum_value" }, "relation": "root", "member_count": 1, - "served_rows": 118, + "served_rows": 84, "served_rows_exact": true }, { "value": { "ref": { - "ref": "DAC2aAidType213", - "label": "developmental food aid" + "ref": "DAC2aAidType250", + "label": "official development assistance excluding debt relief" }, "value_kind": "enum_value" }, "relation": "root", "member_count": 1, - "served_rows": 71, + "served_rows": 130, "served_rows_exact": true }, { "value": { "ref": { - "ref": "DAC2aAidType216", - "label": "humanitarian aid" + "ref": "DAC2aAidType255", + "label": "debt relief" }, "value_kind": "enum_value" }, "relation": "root", "member_count": 1, - "served_rows": 58, + "served_rows": 12, "served_rows_exact": true } ], @@ -1312,7 +1324,7 @@ "source": "observed" } ], - "rendered_sentence": "Germany's gross disbursements to Democratic Republic of the Congo and Kenya for official development assistance, 1960 to 2024. Current US dollars · OECD DAC2a.", + "rendered_sentence": "Germany's net disbursements to Democratic Republic of the Congo and Kenya for official development assistance, 1960 to 2024. Current US dollars · OECD DAC2a.", "sentence_plan": [ { "kind": "slot", @@ -1343,7 +1355,7 @@ }, { "kind": "slot", - "text": "gross disbursements", + "text": "net disbursements", "axis": "what", "segment": "heading", "entity_refs": [], @@ -1586,8 +1598,8 @@ "binding_kind": "value", "refs": [ { - "ref": "Gross", - "label": "gross" + "ref": "Net", + "label": "net" } ], "provenance": "measure_elected" @@ -1643,7 +1655,7 @@ "selected": [] } ], - "capability_version": "cap_765c9d2a0c7529b9", + "capability_version": "cap_4913302d7a6b6435", "default_reading": { "applied": true, "removed_stat_vars": [] @@ -1651,107 +1663,8 @@ }, "confidence": "high", "available_at_place": true, - "alternative_measures": [ - { - "definition": { - "schema_version": 1, - "spec_id": "spec_9de5a8ccb2c8bd8f2ad793949b9c0222", - "identity": { - "identity_version": "spec1", - "shape": { - "kind": "statvar_schema", - "population_type": "FinancialFlow", - "measured_property": "amount", - "stat_type": "measuredValue", - "measurement_qualifier": "Nominal" - }, - "slots": [ - { - "property": "dac2aAidType", - "binding": { - "state": "value", - "ref": "DAC2aAidType206" - } - }, - { - "property": "dacTypeOfFinance", - "binding": { - "state": "unbound" - } - }, - { - "property": "financialFlowType", - "binding": { - "state": "value", - "ref": "Disbursement" - } - }, - { - "property": "nettingBasis", - "binding": { - "state": "value", - "ref": "Net" - } - } - ], - "entities": { - "destination": [ - "country/COD", - "country/KEN" - ], - "origin": [ - "country/DEU" - ] - }, - "requested_window": { - "kind": "all" - } - } - }, - "label": "net disbursements", - "axis": "what", - "measure_axis_values": [ - { - "axis": "populationType", - "value": { - "ref": "FinancialFlow", - "label": "financial flow" - } - }, - { - "axis": "measuredProperty", - "value": { - "ref": "amount", - "label": "amount" - } - }, - { - "axis": "measurementQualifier", - "value": { - "ref": "Nominal", - "label": "nominal" - } - }, - { - "axis": "financialFlowType", - "value": { - "ref": "Disbursement", - "label": "disbursement" - } - }, - { - "axis": "nettingBasis", - "value": { - "ref": "Net", - "label": "net" - } - } - ], - "served_rows": 130, - "served_rows_exact": true - } - ], - "measure_label": "gross disbursements", + "alternative_measures": [], + "measure_label": "net disbursements", "measure_label_axes": [ "populationType", "measuredProperty", @@ -1791,11 +1704,13 @@ { "axis": "nettingBasis", "value": { - "ref": "Gross", - "label": "gross" + "ref": "Net", + "label": "net" } } ], + "concept_label": "official development assistance", + "published_tables": "OECD DAC2a", "unit_conversion": { "currencies": [ { @@ -3763,12 +3678,302 @@ "role_currencies": { "origin": "EUR" } + }, + "scope_choices": { + "id": "spec_9de5a8ccb2c8bd8f2ad793949b9c0222", + "base": { + "schema_version": 1, + "spec_id": "spec_9de5a8ccb2c8bd8f2ad793949b9c0222", + "identity": { + "identity_version": "spec1", + "shape": { + "kind": "statvar_schema", + "population_type": "FinancialFlow", + "measured_property": "amount", + "stat_type": "measuredValue", + "measurement_qualifier": "Nominal" + }, + "slots": [ + { + "property": "dac2aAidType", + "binding": { + "state": "value", + "ref": "DAC2aAidType206" + } + }, + { + "property": "dacTypeOfFinance", + "binding": { + "state": "unbound" + } + }, + { + "property": "financialFlowType", + "binding": { + "state": "value", + "ref": "Disbursement" + } + }, + { + "property": "nettingBasis", + "binding": { + "state": "value", + "ref": "Net" + } + } + ], + "entities": { + "destination": [ + "country/COD", + "country/KEN" + ], + "origin": [ + "country/DEU" + ] + }, + "requested_window": { + "kind": "all" + } + } + }, + "rule_version": "scope1:3eef00a928eedd463ee48d02b79730da", + "entries": [], + "dropped_entries": [], + "choices": [ + { + "id": "spec_9de5a8ccb2c8bd8f2ad793949b9c0222:measure_basis", + "axis": "measure_basis", + "rule": "measure_basis_convention", + "provenance": "default", + "active": "measure_basis:net", + "options": [ + { + "option_id": "measure_basis:gross", + "label": "gross disbursements, current USD", + "binding": { + "kind": "shape", + "measured_property": "amount", + "netting_basis": "Gross" + }, + "availability": { + "status": "available", + "detail": {} + } + }, + { + "option_id": "measure_basis:net", + "label": "net disbursements, current USD", + "binding": { + "kind": "shape", + "measured_property": "amount", + "netting_basis": "Net" + }, + "availability": { + "status": "available", + "detail": {} + } + }, + { + "option_id": "measure_basis:grant_equivalent", + "label": "grant equivalents (OECD headline), current USD", + "binding": { + "kind": "shape", + "measured_property": "grantEquivalent", + "netting_basis": null + }, + "availability": { + "status": "unavailable", + "code": "basis_not_published", + "detail": { + "dataset": "provenance/OECDDAC2A" + } + } + }, + { + "option_id": "measure_basis:commitments", + "label": "commitments, current USD", + "binding": { + "kind": "shape", + "measured_property": "amount", + "netting_basis": null + }, + "availability": { + "status": "unavailable", + "code": "basis_not_published", + "detail": { + "dataset": "provenance/OECDDAC2A" + } + } + } + ] + }, + { + "id": "spec_9de5a8ccb2c8bd8f2ad793949b9c0222:provider", + "axis": "provider", + "rule": "bilateral_recipient_total", + "provenance": "default", + "active": "provider:bilateral", + "options": [ + { + "option_id": "provider:bilateral", + "label": "bilateral flows only", + "binding": { + "kind": "provider", + "scope": "bilateral" + }, + "availability": { + "status": "available", + "detail": {} + } + }, + { + "option_id": "provider:inclusive", + "label": "net bilateral plus imputed multilateral as published, by convention, 1989 to 2024", + "binding": { + "kind": "provider", + "scope": "inclusive", + "window": [ + 1989, + 2024 + ], + "provenance": "provenance/ONEDAC2aBilateralAndImputedMultilateral" + }, + "availability": { + "status": "partial", + "years": [ + [ + 1975, + 1987 + ], + [ + 1989, + 2024 + ] + ], + "code": "imputed_coverage", + "detail": {} + } + } + ] + } + ], + "compiled": { + "spec_id": "spec_9de5a8ccb2c8bd8f2ad793949b9c0222", + "identity": { + "identity_version": "spec1", + "shape": { + "kind": "statvar_schema", + "population_type": "FinancialFlow", + "measured_property": "amount", + "stat_type": "measuredValue", + "measurement_qualifier": "Nominal" + }, + "slots": [ + { + "property": "dac2aAidType", + "binding": { + "state": "value", + "ref": "DAC2aAidType206" + } + }, + { + "property": "dacTypeOfFinance", + "binding": { + "state": "unbound" + } + }, + { + "property": "financialFlowType", + "binding": { + "state": "value", + "ref": "Disbursement" + } + }, + { + "property": "nettingBasis", + "binding": { + "state": "value", + "ref": "Net" + } + } + ], + "entities": { + "destination": [ + "country/COD", + "country/KEN" + ], + "origin": [ + "country/DEU" + ] + }, + "requested_window": { + "kind": "all" + } + }, + "components": [ + { + "role": "whole", + "identity": { + "identity_version": "spec1", + "shape": { + "kind": "statvar_schema", + "population_type": "FinancialFlow", + "measured_property": "amount", + "stat_type": "measuredValue", + "measurement_qualifier": "Nominal" + }, + "slots": [ + { + "property": "dac2aAidType", + "binding": { + "state": "value", + "ref": "DAC2aAidType206" + } + }, + { + "property": "dacTypeOfFinance", + "binding": { + "state": "unbound" + } + }, + { + "property": "financialFlowType", + "binding": { + "state": "value", + "ref": "Disbursement" + } + }, + { + "property": "nettingBasis", + "binding": { + "state": "value", + "ref": "Net" + } + } + ], + "entities": { + "destination": [ + "country/COD", + "country/KEN" + ], + "origin": [ + "country/DEU" + ] + }, + "requested_window": { + "kind": "all" + } + } + } + ] + }, + "ledger": [] } } } } ], - "rendered_sentence": "Answered 1 of 2 parts. \"Congo\" matches more than one entity: \"Congo [DRC]\" and \"Congo [Republic]\". Be more specific. Germany's gross disbursements to Democratic Republic of the Congo and Kenya for official development assistance, 1960 to 2024. Current US dollars · OECD DAC2a.", + "rendered_sentence": "Answered 1 of 2 parts. \"Congo\" matches more than one entity: \"Congo [DRC]\" and \"Congo [Republic]\". Be more specific. Germany's net disbursements to Democratic Republic of the Congo and Kenya for official development assistance, 1960 to 2024. Current US dollars · OECD DAC2a.", "sentence_plan": [ { "kind": "text", @@ -3850,7 +4055,7 @@ }, { "kind": "slot", - "text": "gross disbursements", + "text": "net disbursements", "axis": "what", "segment": "heading", "entity_refs": [], @@ -4048,10 +4253,10 @@ "answer": { "kind": "resolution", "status": "mixed", - "sentence": "Answered 1 of 2 parts. \"Congo\" matches more than one entity: \"Congo [DRC]\" and \"Congo [Republic]\". Be more specific. Germany's gross disbursements to Democratic Republic of the Congo and Kenya for official development assistance, 1960 to 2024. Current US dollars · OECD DAC2a.", + "sentence": "Answered 1 of 2 parts. \"Congo\" matches more than one entity: \"Congo [DRC]\" and \"Congo [Republic]\". Be more specific. Germany's net disbursements to Democratic Republic of the Congo and Kenya for official development assistance, 1960 to 2024. Current US dollars · OECD DAC2a.", "complete": false, "specs": [ - "spec_4b8c1ba9efe879b10dc3fde2c24dc483" + "spec_9de5a8ccb2c8bd8f2ad793949b9c0222" ], "gaps": [ { diff --git a/python/client-contract/src/dfo_client_contract/scenarios/choose-posts-unsupported-placeholder.json b/python/client-contract/src/dfo_client_contract/scenarios/choose-posts-unsupported-placeholder.json index 22fb908..4eccd69 100644 --- a/python/client-contract/src/dfo_client_contract/scenarios/choose-posts-unsupported-placeholder.json +++ b/python/client-contract/src/dfo_client_contract/scenarios/choose-posts-unsupported-placeholder.json @@ -35,7 +35,7 @@ "status": 200, "headers": { "content-type": "application/json", - "x-dfo-trace-id": "44089cedfffd4c0ca025f3d8faba0ca7" + "x-dfo-trace-id": "0912e47dd13a455fb52bce86cfcffbe0" }, "json": { "schema_version": 1, @@ -46,21 +46,22 @@ "extract_skipped": false }, "diagnostics": { - "engine_build": "d80df9f5fd598b7345255470932d202ee5d49942", - "trace_id": "44089cedfffd4c0ca025f3d8faba0ca7", + "engine_build": "ccb6617922c839ce3cd5615a3bbb65c70bfe1bde", + "trace_id": "0912e47dd13a455fb52bce86cfcffbe0", "warnings": [], "timing_ms": { - "total": 2666, + "total": 2781, "by_step": { "coverage": 0, - "extract": 1154, + "extract": 994, + "exclusion_read": 654, "cache_lookup": 0 } }, "llm_usage": { - "input_tokens": 2239, - "output_tokens": 164, - "cached_tokens": 842, + "input_tokens": 2800, + "output_tokens": 173, + "cached_tokens": 0, "jev_input_tokens": 17398, "jev_output_tokens": 3500 }, @@ -72,30 +73,30 @@ "variable_text": "GDP", "warnings": [], "timing_ms": { - "total": 1283, + "total": 1308, "by_step": { "recall": 2, - "phase_resolve_places": 0, + "phase_resolve_places": 1, "phase_check_entities": 0, - "shape_arcs": 4, - "shape_probe_coverage": 5, - "shape_probe": 116, - "shape_groups": 64, + "shape_arcs": 2, + "shape_probe_coverage": 4, + "shape_probe": 125, + "shape_groups": 68, "shape_labels": 12, - "shape_admission": 1, + "shape_admission": 2, "phase_derive_shapes": 0, - "shape": 463, + "shape": 539, "phase_prune_and_rank": 0, - "bind": 125, - "phase_bind": 12, - "phase_settle": 6, - "phase_place_bindings": 10, + "bind": 124, + "phase_bind": 14, + "phase_settle": 10, + "phase_place_bindings": 8, "phase_facet_requests": 0, - "materialise": 173, + "materialise": 178, "phase_materialise": 18, - "answer": 207, - "options": 140, - "phase_outcome": 127 + "answer": 161, + "options": 134, + "phase_outcome": 119 } }, "entity_refs": [ @@ -157,24 +158,24 @@ "variable_text": "ODA", "warnings": [], "timing_ms": { - "total": 598, + "total": 1498, "by_step": { - "recall": 301, + "recall": 1140, "phase_resolve_places": 0, "phase_check_entities": 0, "shape_arcs": 2, - "shape_probe_coverage": 6, - "shape_probe": 99, - "shape_groups": 3, + "shape_probe_coverage": 13, + "shape_probe": 149, + "shape_groups": 4, "shape_labels": 0, - "shape_admission": 0, + "shape_admission": 1, "phase_derive_shapes": 0, - "shape": 189, + "shape": 247, "phase_prune_and_rank": 0, - "bind": 91, - "phase_bind": 3, - "phase_settle": 7, - "phase_place_bindings": 7 + "bind": 102, + "phase_bind": 2, + "phase_settle": 2, + "phase_place_bindings": 5 } }, "rendered_sentence": "Could not tell who is giving and who is receiving among \"G20\", \"Germany\", and \"India\". Put \"from\" or \"to\" before a name.", @@ -660,7 +661,7 @@ "status": 200, "headers": { "content-type": "application/json", - "x-dfo-trace-id": "4f781d285d73459fa3f2f981f5828776" + "x-dfo-trace-id": "ab13cf77e5df4732bf48243677977f40" }, "json": { "schema_version": 1, @@ -669,11 +670,11 @@ "extract_skipped": true }, "diagnostics": { - "engine_build": "d80df9f5fd598b7345255470932d202ee5d49942", - "trace_id": "4f781d285d73459fa3f2f981f5828776", + "engine_build": "ccb6617922c839ce3cd5615a3bbb65c70bfe1bde", + "trace_id": "ab13cf77e5df4732bf48243677977f40", "warnings": [], "timing_ms": { - "total": 1276, + "total": 800, "by_step": { "coverage": 0 } @@ -693,19 +694,39 @@ "variable_text": "GDP", "warnings": [], "timing_ms": { - "total": 1161, + "total": 784, "by_step": { "validate": 0, + "phase_validate": 0, "walk": 1, "reread_arcs": 0, + "phase_reread_arcs": 0, "detect_edits": 0, + "phase_detect_edits": 0, "resolve_survivors": 0, - "shape": 921, - "bind": 1, + "phase_resolve_survivors": 0, + "shape": 412, + "phase_build_shape": 0, + "bind": 0, + "phase_build_bindings": 0, "where_places": 0, - "materialise": 120, + "phase_where_places": 0, + "materialise": 132, + "phase_materialise": 0, + "ground_related": 0, + "ground_units": 0, + "ground_facets": 5, + "ground_convert": 0, "answer": 4, - "options": 114 + "ground_gates": 133, + "phase_ground_build": 7, + "finalize_preview": 0, + "options": 88, + "finalize_related": 0, + "finalize_wholes": 1, + "finalize_relaunch": 0, + "phase_finalize": 0, + "served_entry": 1 } }, "entity_refs": [], @@ -2220,12 +2241,13 @@ "start_year": 2015, "end_year": 2015 }, - "capability_version": "cap_765c9d2a0c7529b9" + "capability_version": "cap_4913302d7a6b6435" }, "confidence": "high", "available_at_place": true, "measure_label_axes": [], "measure_axis_values": [], + "published_tables": "World Development Indicators", "related_group": { "ref": "dc/g/EconomicActivity_ActivitySource-GrossDomesticProduction", "label": "Economic Activity With Activity Source = Gross Domestic Production" @@ -2295,30 +2317,30 @@ "variable_text": "ODA", "warnings": [], "timing_ms": { - "total": 399, + "total": 337, "by_step": { - "recall": 0, + "recall": 3, "phase_resolve_places": 0, "phase_check_entities": 0, - "shape_arcs": 2, - "shape_probe_coverage": 6, - "shape_probe": 97, + "shape_arcs": 1, + "shape_probe_coverage": 9, + "shape_probe": 11, "shape_groups": 3, "shape_labels": 0, "shape_admission": 1, "phase_derive_shapes": 0, - "shape": 181, + "shape": 95, "phase_prune_and_rank": 0, - "bind": 100, - "phase_bind": 12, - "phase_settle": 8, + "bind": 117, + "phase_bind": 23, + "phase_settle": 6, "phase_place_bindings": 1, "phase_facet_requests": 0, - "materialise": 20, - "phase_materialise": 5, - "answer": 15, - "options": 7, - "phase_outcome": 50 + "materialise": 21, + "phase_materialise": 4, + "answer": 12, + "options": 16, + "phase_outcome": 39 } }, "restatement": { @@ -2398,10 +2420,10 @@ "assumptions": [], "status": "definite", "spec": { - "spec_id": "spec_4587fc4776526af697f28532c9876980", + "spec_id": "spec_6d9c18873c6fea5004f84c3e92f33310", "definition": { "schema_version": 1, - "spec_id": "spec_4587fc4776526af697f28532c9876980", + "spec_id": "spec_6d9c18873c6fea5004f84c3e92f33310", "identity": { "identity_version": "spec1", "shape": { @@ -2436,7 +2458,7 @@ "property": "nettingBasis", "binding": { "state": "value", - "ref": "Gross" + "ref": "Net" } } ], @@ -2476,7 +2498,7 @@ "resolved": { "shape": { "shape_id": "financialflow_amount_measuredvalue_nominal_family_f096b1ba", - "label": "gross disbursements (official development assistance)", + "label": "net disbursements (official development assistance)", "population_type": { "ref": "FinancialFlow", "label": "financial flow" @@ -2541,7 +2563,7 @@ } ], "member_count": 1, - "member_digest": "1a36e1a7292b1bfff95a5415de0be74cac7bb033217ed50e79faa8ce51a224c0", + "member_digest": "c2d373442ac21a31377df76cd343f156c72a530649757c399c6661cbf56c9a71", "refine_supported": true, "data_commons": [ { @@ -2620,8 +2642,8 @@ "kind": "value", "value": { "ref": { - "ref": "Gross", - "label": "gross" + "ref": "Net", + "label": "net" }, "value_kind": "enum_value" } @@ -2894,7 +2916,7 @@ "label": "OECD Terms and Conditions" } }, - "coverage_stamp": "e6e717ab8c77e84d010915893ede5809e9ecec67929a07cfafbcc2210edfa1eb", + "coverage_stamp": "ad27fd11738abb03d2d84dc214e223f04781609636cf678d0d08c385fb863d99", "facets": { "provenance": { "basis": "fallback", @@ -2940,47 +2962,47 @@ "relation": "child", "parent": "DAC2aAidType206", "member_count": 2, - "served_rows": 4, + "served_rows": 7, "served_rows_exact": true }, { "value": { "ref": { - "ref": "DAC2aAidType201", - "label": "ODA grant" + "ref": "DAC2aAidType219", + "label": "recovery on ODA grants and capital subscriptions" }, "value_kind": "enum_value" }, "relation": "child", "parent": "DAC2aAidType206", "member_count": 1, - "served_rows": 10, + "served_rows": 3, "served_rows_exact": true }, { "value": { "ref": { - "ref": "DAC2aAidType207", - "label": "free-standing technical co-operation" + "ref": "DAC2aAidType209", + "label": "interest received on ODA lending" }, "value_kind": "enum_value" }, "relation": "root", "member_count": 1, - "served_rows": 10, + "served_rows": 5, "served_rows_exact": true }, { "value": { "ref": { - "ref": "DAC2aAidType216", - "label": "humanitarian aid" + "ref": "DAC2aAidType250", + "label": "official development assistance excluding debt relief" }, "value_kind": "enum_value" }, "relation": "root", "member_count": 1, - "served_rows": 6, + "served_rows": 10, "served_rows_exact": true } ], @@ -3023,11 +3045,11 @@ "source": "observed" } ], - "rendered_sentence": "Gross disbursements to India from the 19 G20 members for official development assistance in 2015. Current US dollars · OECD DAC2a.", + "rendered_sentence": "Net disbursements to India from the 19 G20 members for official development assistance in 2015. Current US dollars · OECD DAC2a.", "sentence_plan": [ { "kind": "slot", - "text": "Gross disbursements", + "text": "Net disbursements", "axis": "what", "segment": "heading", "entity_refs": [], @@ -3375,8 +3397,8 @@ "binding_kind": "value", "refs": [ { - "ref": "Gross", - "label": "gross" + "ref": "Net", + "label": "net" } ], "provenance": "measure_elected" @@ -3432,7 +3454,7 @@ "start_year": 2015, "end_year": 2015 }, - "capability_version": "cap_765c9d2a0c7529b9", + "capability_version": "cap_4913302d7a6b6435", "default_reading": { "applied": true, "removed_stat_vars": [] @@ -3440,126 +3462,8 @@ }, "confidence": "high", "available_at_place": true, - "alternative_measures": [ - { - "definition": { - "schema_version": 1, - "spec_id": "spec_6d9c18873c6fea5004f84c3e92f33310", - "identity": { - "identity_version": "spec1", - "shape": { - "kind": "statvar_schema", - "population_type": "FinancialFlow", - "measured_property": "amount", - "stat_type": "measuredValue", - "measurement_qualifier": "Nominal" - }, - "slots": [ - { - "property": "dac2aAidType", - "binding": { - "state": "value", - "ref": "DAC2aAidType206" - } - }, - { - "property": "dacTypeOfFinance", - "binding": { - "state": "unbound" - } - }, - { - "property": "financialFlowType", - "binding": { - "state": "value", - "ref": "Disbursement" - } - }, - { - "property": "nettingBasis", - "binding": { - "state": "value", - "ref": "Net" - } - } - ], - "entities": { - "destination": [ - "country/IND" - ], - "origin": [ - "country/ARG", - "country/AUS", - "country/BRA", - "country/CAN", - "country/CHN", - "country/DEU", - "country/FRA", - "country/GBR", - "country/IDN", - "country/IND", - "country/ITA", - "country/JPN", - "country/KOR", - "country/MEX", - "country/RUS", - "country/SAU", - "country/TUR", - "country/USA", - "country/ZAF" - ] - }, - "requested_window": { - "kind": "range", - "start_year": 2015, - "end_year": 2015 - } - } - }, - "label": "net disbursements", - "axis": "what", - "measure_axis_values": [ - { - "axis": "populationType", - "value": { - "ref": "FinancialFlow", - "label": "financial flow" - } - }, - { - "axis": "measuredProperty", - "value": { - "ref": "amount", - "label": "amount" - } - }, - { - "axis": "measurementQualifier", - "value": { - "ref": "Nominal", - "label": "nominal" - } - }, - { - "axis": "financialFlowType", - "value": { - "ref": "Disbursement", - "label": "disbursement" - } - }, - { - "axis": "nettingBasis", - "value": { - "ref": "Net", - "label": "net" - } - } - ], - "served_rows": 10, - "served_rows_exact": true - } - ], - "measure_label": "gross disbursements", + "alternative_measures": [], + "measure_label": "net disbursements", "measure_label_axes": [ "populationType", "measuredProperty", @@ -3599,11 +3503,13 @@ { "axis": "nettingBasis", "value": { - "ref": "Gross", - "label": "gross" + "ref": "Net", + "label": "net" } } ], + "concept_label": "official development assistance", + "published_tables": "OECD DAC2a", "unit_conversion": { "currencies": [ { @@ -5562,12 +5468,346 @@ "role_currencies": { "destination": "INR" } + }, + "scope_choices": { + "id": "spec_6d9c18873c6fea5004f84c3e92f33310", + "base": { + "schema_version": 1, + "spec_id": "spec_6d9c18873c6fea5004f84c3e92f33310", + "identity": { + "identity_version": "spec1", + "shape": { + "kind": "statvar_schema", + "population_type": "FinancialFlow", + "measured_property": "amount", + "stat_type": "measuredValue", + "measurement_qualifier": "Nominal" + }, + "slots": [ + { + "property": "dac2aAidType", + "binding": { + "state": "value", + "ref": "DAC2aAidType206" + } + }, + { + "property": "dacTypeOfFinance", + "binding": { + "state": "unbound" + } + }, + { + "property": "financialFlowType", + "binding": { + "state": "value", + "ref": "Disbursement" + } + }, + { + "property": "nettingBasis", + "binding": { + "state": "value", + "ref": "Net" + } + } + ], + "entities": { + "destination": [ + "country/IND" + ], + "origin": [ + "country/ARG", + "country/AUS", + "country/BRA", + "country/CAN", + "country/CHN", + "country/DEU", + "country/FRA", + "country/GBR", + "country/IDN", + "country/IND", + "country/ITA", + "country/JPN", + "country/KOR", + "country/MEX", + "country/RUS", + "country/SAU", + "country/TUR", + "country/USA", + "country/ZAF" + ] + }, + "requested_window": { + "kind": "range", + "start_year": 2015, + "end_year": 2015 + } + } + }, + "rule_version": "scope1:3eef00a928eedd463ee48d02b79730da", + "entries": [], + "dropped_entries": [], + "choices": [ + { + "id": "spec_6d9c18873c6fea5004f84c3e92f33310:measure_basis", + "axis": "measure_basis", + "rule": "measure_basis_convention", + "provenance": "default", + "active": "measure_basis:net", + "options": [ + { + "option_id": "measure_basis:gross", + "label": "gross disbursements, current USD", + "binding": { + "kind": "shape", + "measured_property": "amount", + "netting_basis": "Gross" + }, + "availability": { + "status": "available", + "detail": {} + } + }, + { + "option_id": "measure_basis:net", + "label": "net disbursements, current USD", + "binding": { + "kind": "shape", + "measured_property": "amount", + "netting_basis": "Net" + }, + "availability": { + "status": "available", + "detail": {} + } + }, + { + "option_id": "measure_basis:grant_equivalent", + "label": "grant equivalents (OECD headline), current USD", + "binding": { + "kind": "shape", + "measured_property": "grantEquivalent", + "netting_basis": null + }, + "availability": { + "status": "unavailable", + "code": "basis_not_published", + "detail": { + "dataset": "provenance/OECDDAC2A" + } + } + }, + { + "option_id": "measure_basis:commitments", + "label": "commitments, current USD", + "binding": { + "kind": "shape", + "measured_property": "amount", + "netting_basis": null + }, + "availability": { + "status": "unavailable", + "code": "basis_not_published", + "detail": { + "dataset": "provenance/OECDDAC2A" + } + } + } + ] + }, + { + "id": "spec_6d9c18873c6fea5004f84c3e92f33310:provider", + "axis": "provider", + "rule": "bilateral_recipient_total", + "provenance": "default", + "active": "provider:bilateral", + "options": [ + { + "option_id": "provider:bilateral", + "label": "bilateral flows only", + "binding": { + "kind": "provider", + "scope": "bilateral" + }, + "availability": { + "status": "available", + "detail": {} + } + }, + { + "option_id": "provider:inclusive", + "label": "bilateral plus imputed multilateral", + "binding": { + "kind": "provider", + "scope": "inclusive" + }, + "availability": { + "status": "unavailable", + "code": "provider_not_offered", + "detail": { + "why": "pooled_providers" + } + } + } + ] + } + ], + "compiled": { + "spec_id": "spec_6d9c18873c6fea5004f84c3e92f33310", + "identity": { + "identity_version": "spec1", + "shape": { + "kind": "statvar_schema", + "population_type": "FinancialFlow", + "measured_property": "amount", + "stat_type": "measuredValue", + "measurement_qualifier": "Nominal" + }, + "slots": [ + { + "property": "dac2aAidType", + "binding": { + "state": "value", + "ref": "DAC2aAidType206" + } + }, + { + "property": "dacTypeOfFinance", + "binding": { + "state": "unbound" + } + }, + { + "property": "financialFlowType", + "binding": { + "state": "value", + "ref": "Disbursement" + } + }, + { + "property": "nettingBasis", + "binding": { + "state": "value", + "ref": "Net" + } + } + ], + "entities": { + "destination": [ + "country/IND" + ], + "origin": [ + "country/ARG", + "country/AUS", + "country/BRA", + "country/CAN", + "country/CHN", + "country/DEU", + "country/FRA", + "country/GBR", + "country/IDN", + "country/IND", + "country/ITA", + "country/JPN", + "country/KOR", + "country/MEX", + "country/RUS", + "country/SAU", + "country/TUR", + "country/USA", + "country/ZAF" + ] + }, + "requested_window": { + "kind": "range", + "start_year": 2015, + "end_year": 2015 + } + }, + "components": [ + { + "role": "whole", + "identity": { + "identity_version": "spec1", + "shape": { + "kind": "statvar_schema", + "population_type": "FinancialFlow", + "measured_property": "amount", + "stat_type": "measuredValue", + "measurement_qualifier": "Nominal" + }, + "slots": [ + { + "property": "dac2aAidType", + "binding": { + "state": "value", + "ref": "DAC2aAidType206" + } + }, + { + "property": "dacTypeOfFinance", + "binding": { + "state": "unbound" + } + }, + { + "property": "financialFlowType", + "binding": { + "state": "value", + "ref": "Disbursement" + } + }, + { + "property": "nettingBasis", + "binding": { + "state": "value", + "ref": "Net" + } + } + ], + "entities": { + "destination": [ + "country/IND" + ], + "origin": [ + "country/ARG", + "country/AUS", + "country/BRA", + "country/CAN", + "country/CHN", + "country/DEU", + "country/FRA", + "country/GBR", + "country/IDN", + "country/IND", + "country/ITA", + "country/JPN", + "country/KOR", + "country/MEX", + "country/RUS", + "country/SAU", + "country/TUR", + "country/USA", + "country/ZAF" + ] + }, + "requested_window": { + "kind": "range", + "start_year": 2015, + "end_year": 2015 + } + } + } + ] + }, + "ledger": [] } } } } ], - "rendered_sentence": "GDP in the 19 G20 members in 2015. Current US dollars · World Development Indicators. This shows the 19 G20 members, each on its own. Gross disbursements to India from the 19 G20 members for official development assistance in 2015. Current US dollars · OECD DAC2a. The data holds no values for 9 of the 19 G20 members. You asked for G20. This shows its members, each on its own.", + "rendered_sentence": "GDP in the 19 G20 members in 2015. Current US dollars · World Development Indicators. This shows the 19 G20 members, each on its own. Net disbursements to India from the 19 G20 members for official development assistance in 2015. Current US dollars · OECD DAC2a. The data holds no values for 9 of the 19 G20 members. You asked for G20. This shows its members, each on its own.", "sentence_plan": [ { "kind": "slot", @@ -5748,7 +5988,7 @@ }, { "kind": "slot", - "text": "Gross disbursements", + "text": "Net disbursements", "axis": "what", "segment": "heading", "entity_refs": [], @@ -6017,11 +6257,11 @@ "answer": { "kind": "resolution", "status": "definite", - "sentence": "GDP in the 19 G20 members in 2015. Current US dollars · World Development Indicators. This shows the 19 G20 members, each on its own. Gross disbursements to India from the 19 G20 members for official development assistance in 2015. Current US dollars · OECD DAC2a. The data holds no values for 9 of the 19 G20 members. You asked for G20. This shows its members, each on its own.", + "sentence": "GDP in the 19 G20 members in 2015. Current US dollars · World Development Indicators. This shows the 19 G20 members, each on its own. Net disbursements to India from the 19 G20 members for official development assistance in 2015. Current US dollars · OECD DAC2a. The data holds no values for 9 of the 19 G20 members. You asked for G20. This shows its members, each on its own.", "complete": true, "specs": [ "spec_66fdfe785d6a2bc455d49daaf76d6f89", - "spec_4587fc4776526af697f28532c9876980" + "spec_6d9c18873c6fea5004f84c3e92f33310" ], "gaps": [] } diff --git a/python/client-contract/src/dfo_client_contract/scenarios/choose-refused-answered-part.json b/python/client-contract/src/dfo_client_contract/scenarios/choose-refused-answered-part.json index e5437b3..8acd871 100644 --- a/python/client-contract/src/dfo_client_contract/scenarios/choose-refused-answered-part.json +++ b/python/client-contract/src/dfo_client_contract/scenarios/choose-refused-answered-part.json @@ -35,7 +35,7 @@ "status": 200, "headers": { "content-type": "application/json", - "x-dfo-trace-id": "86b361f85db44a29b3d711350962ca73" + "x-dfo-trace-id": "cf40b66c70a74f34af1ea479ba67e11f" }, "json": { "schema_version": 1, @@ -46,20 +46,21 @@ "extract_skipped": false }, "diagnostics": { - "engine_build": "d80df9f5fd598b7345255470932d202ee5d49942", - "trace_id": "86b361f85db44a29b3d711350962ca73", + "engine_build": "ccb6617922c839ce3cd5615a3bbb65c70bfe1bde", + "trace_id": "cf40b66c70a74f34af1ea479ba67e11f", "warnings": [], "timing_ms": { - "total": 456, + "total": 3122, "by_step": { "coverage": 0, - "extract": 0, - "cache_lookup": 0 + "extract": 921, + "exclusion_read": 781, + "cache_lookup": 1 } }, "llm_usage": { - "input_tokens": 0, - "output_tokens": 0, + "input_tokens": 2786, + "output_tokens": 112, "cached_tokens": 0, "jev_input_tokens": 5250, "jev_output_tokens": 1104 @@ -72,30 +73,30 @@ "variable_text": "debt service", "warnings": [], "timing_ms": { - "total": 452, + "total": 2193, "by_step": { - "recall": 1, + "recall": 1640, "phase_resolve_places": 0, "phase_check_entities": 0, - "shape_arcs": 2, - "shape_probe_coverage": 17, - "shape_probe": 101, - "shape_groups": 8, - "shape_labels": 14, + "shape_arcs": 4, + "shape_probe_coverage": 12, + "shape_probe": 98, + "shape_groups": 6, + "shape_labels": 11, "shape_admission": 0, "phase_derive_shapes": 0, - "shape": 225, + "shape": 232, "phase_prune_and_rank": 0, - "bind": 77, - "phase_bind": 17, - "phase_settle": 5, + "bind": 91, + "phase_bind": 19, + "phase_settle": 8, "phase_place_bindings": 14, "phase_facet_requests": 0, - "materialise": 11, - "phase_materialise": 23, - "answer": 2, - "options": 9, - "phase_outcome": 68 + "materialise": 13, + "phase_materialise": 31, + "answer": 3, + "options": 78, + "phase_outcome": 64 } }, "restatement": { @@ -570,7 +571,7 @@ "label": "Creative Commons Attribution License" } }, - "coverage_stamp": "e6e717ab8c77e84d010915893ede5809e9ecec67929a07cfafbcc2210edfa1eb", + "coverage_stamp": "ad27fd11738abb03d2d84dc214e223f04781609636cf678d0d08c385fb863d99", "facets": { "provenance": { "basis": "fallback", @@ -1288,7 +1289,7 @@ } ], "query_qualifiers": [], - "capability_version": "cap_765c9d2a0c7529b9", + "capability_version": "cap_4913302d7a6b6435", "default_reading": { "applied": true, "removed_stat_vars": [] @@ -1298,6 +1299,7 @@ "available_at_place": true, "measure_label_axes": [], "measure_axis_values": [], + "published_tables": "World Bank International Debt Statistics (IDS)", "unit_conversion": { "currencies": [ { @@ -3273,18 +3275,18 @@ "variable_text": "price of tea", "warnings": [], "timing_ms": { - "total": 121, + "total": 1545, "by_step": { - "recall": 0, + "recall": 1436, "phase_resolve_places": 0, "phase_check_entities": 0, - "shape_arcs": 1, - "shape_probe": 96, + "shape_arcs": 3, + "shape_probe": 101, "shape_groups": 1, "shape_labels": 0, - "shape_admission": 0, + "shape_admission": 1, "phase_derive_shapes": 0, - "shape": 121, + "shape": 109, "phase_prune_and_rank": 0 } }, diff --git a/python/client-contract/src/dfo_client_contract/scenarios/choose-refused-label-in-two-groups.json b/python/client-contract/src/dfo_client_contract/scenarios/choose-refused-label-in-two-groups.json index fb234df..1968a09 100644 --- a/python/client-contract/src/dfo_client_contract/scenarios/choose-refused-label-in-two-groups.json +++ b/python/client-contract/src/dfo_client_contract/scenarios/choose-refused-label-in-two-groups.json @@ -34,7 +34,7 @@ "status": 200, "headers": { "content-type": "application/json", - "x-dfo-trace-id": "14c23c7a7a01430eb3f485e658ae7e51" + "x-dfo-trace-id": "c9d306b47a8e4b0a82b757bbe9e47469" }, "json": { "schema_version": 1, @@ -45,21 +45,22 @@ "extract_skipped": false }, "diagnostics": { - "engine_build": "d80df9f5fd598b7345255470932d202ee5d49942", - "trace_id": "14c23c7a7a01430eb3f485e658ae7e51", + "engine_build": "ccb6617922c839ce3cd5615a3bbb65c70bfe1bde", + "trace_id": "c9d306b47a8e4b0a82b757bbe9e47469", "warnings": [], "timing_ms": { - "total": 1535, + "total": 1059, "by_step": { "coverage": 0, - "extract": 1020, + "extract": 916, + "exclusion_read": 657, "cache_lookup": 0 } }, "llm_usage": { - "input_tokens": 2226, - "output_tokens": 106, - "cached_tokens": 840 + "input_tokens": 2774, + "output_tokens": 111, + "cached_tokens": 0 }, "timed_out": false }, @@ -69,9 +70,9 @@ "variable_text": "aid", "warnings": [], "timing_ms": { - "total": 377, + "total": 1, "by_step": { - "recall": 377, + "recall": 1, "phase_resolve_places": 0, "phase_check_entities": 0 } diff --git a/python/client-contract/src/dfo_client_contract/scenarios/choose-refused-mention-names-two-parts.json b/python/client-contract/src/dfo_client_contract/scenarios/choose-refused-mention-names-two-parts.json index a6964dc..5ac87f7 100644 --- a/python/client-contract/src/dfo_client_contract/scenarios/choose-refused-mention-names-two-parts.json +++ b/python/client-contract/src/dfo_client_contract/scenarios/choose-refused-mention-names-two-parts.json @@ -35,7 +35,7 @@ "status": 200, "headers": { "content-type": "application/json", - "x-dfo-trace-id": "5df79c87dd3c43589df5c2921f3c93e3" + "x-dfo-trace-id": "66ee9968495c4420baa91bae126c6a07" }, "json": { "schema_version": 1, @@ -46,21 +46,22 @@ "extract_skipped": false }, "diagnostics": { - "engine_build": "d80df9f5fd598b7345255470932d202ee5d49942", - "trace_id": "5df79c87dd3c43589df5c2921f3c93e3", + "engine_build": "ccb6617922c839ce3cd5615a3bbb65c70bfe1bde", + "trace_id": "66ee9968495c4420baa91bae126c6a07", "warnings": [], "timing_ms": { - "total": 1209, + "total": 1103, "by_step": { "coverage": 0, - "extract": 1202, + "extract": 1095, + "exclusion_read": 608, "cache_lookup": 0 } }, "llm_usage": { - "input_tokens": 2234, - "output_tokens": 207, - "cached_tokens": 841 + "input_tokens": 2790, + "output_tokens": 216, + "cached_tokens": 0 }, "timed_out": false }, @@ -126,11 +127,15 @@ "entity_refs": [ { "text": "Kenya", - "refs": [] + "refs": [ + "country/KEN" + ] }, { "text": "Germany", - "refs": [] + "refs": [ + "country/DEU" + ] }, { "text": "Congo", @@ -244,9 +249,9 @@ "variable_text": "ODA disbursements", "warnings": [], "timing_ms": { - "total": 2, + "total": 1, "by_step": { - "recall": 2, + "recall": 1, "phase_resolve_places": 0, "phase_check_entities": 0 } @@ -300,11 +305,15 @@ "entity_refs": [ { "text": "Kenya", - "refs": [] + "refs": [ + "country/KEN" + ] }, { "text": "Germany", - "refs": [] + "refs": [ + "country/DEU" + ] }, { "text": "Congo", diff --git a/python/client-contract/src/dfo_client_contract/scenarios/choose-refused-no-choice.json b/python/client-contract/src/dfo_client_contract/scenarios/choose-refused-no-choice.json index 6025dd5..5874d4d 100644 --- a/python/client-contract/src/dfo_client_contract/scenarios/choose-refused-no-choice.json +++ b/python/client-contract/src/dfo_client_contract/scenarios/choose-refused-no-choice.json @@ -34,7 +34,7 @@ "status": 200, "headers": { "content-type": "application/json", - "x-dfo-trace-id": "c7cb40f3790f4a15a0ddcad0cc93c9bb" + "x-dfo-trace-id": "92a325e77a854c5daafa875164b5e23e" }, "json": { "schema_version": 1, @@ -42,23 +42,27 @@ "entry_path": "raw_text", "raw_query": "ODA disbursements from Germany to Nigeria for basic health care", "normalized_query": "ODA disbursements from Germany to Nigeria for basic health care", - "extract_skipped": true + "extract_skipped": false }, "diagnostics": { - "engine_build": "d80df9f5fd598b7345255470932d202ee5d49942", - "trace_id": "c7cb40f3790f4a15a0ddcad0cc93c9bb", + "engine_build": "ccb6617922c839ce3cd5615a3bbb65c70bfe1bde", + "trace_id": "92a325e77a854c5daafa875164b5e23e", "warnings": [], "timing_ms": { - "total": 3, + "total": 17540, "by_step": { "coverage": 0, - "response_cache_layer1": 1 + "extract": 1239, + "exclusion_read": 719, + "cache_lookup": 0 } }, "llm_usage": { - "input_tokens": 0, - "output_tokens": 0, - "cached_tokens": 0 + "input_tokens": 2784, + "output_tokens": 111, + "cached_tokens": 0, + "jev_input_tokens": 6695, + "jev_output_tokens": 2088 }, "timed_out": false }, @@ -68,30 +72,30 @@ "variable_text": "ODA disbursements for basic health care", "warnings": [], "timing_ms": { - "total": 3011, + "total": 16265, "by_step": { - "recall": 457, + "recall": 2821, "phase_resolve_places": 0, "phase_check_entities": 0, "shape_arcs": 2, - "shape_probe_coverage": 8, - "shape_probe": 114, - "shape_groups": 579, + "shape_probe_coverage": 104, + "shape_probe": 352, + "shape_groups": 109, "shape_labels": 1, - "shape_admission": 2, + "shape_admission": 0, "phase_derive_shapes": 0, - "shape": 1247, + "shape": 1134, "phase_prune_and_rank": 0, - "bind": 266, - "phase_bind": 327, - "phase_settle": 46, - "phase_place_bindings": 57, + "bind": 5473, + "phase_bind": 345, + "phase_settle": 105, + "phase_place_bindings": 1078, "phase_facet_requests": 0, - "materialise": 44, - "phase_materialise": 200, - "answer": 220, - "options": 55, - "phase_outcome": 92 + "materialise": 2132, + "phase_materialise": 313, + "answer": 1829, + "options": 872, + "phase_outcome": 163 } }, "restatement": { @@ -538,7 +542,7 @@ "label": "OECD Terms and Conditions" } }, - "coverage_stamp": "e6e717ab8c77e84d010915893ede5809e9ecec67929a07cfafbcc2210edfa1eb", + "coverage_stamp": "ad27fd11738abb03d2d84dc214e223f04781609636cf678d0d08c385fb863d99", "facets": { "provenance": { "basis": "fallback", @@ -596,7 +600,7 @@ }, "relation": "child", "parent": "CRSCooperationModalityB", - "member_count": 1606, + "member_count": 1614, "served_rows": 1, "served_rows_exact": true }, @@ -610,7 +614,7 @@ }, "relation": "child", "parent": "CRSCooperationModalityB", - "member_count": 1331, + "member_count": 1337, "served_rows": 6, "served_rows_exact": true }, @@ -637,7 +641,7 @@ }, "relation": "child", "parent": "CRSCooperationModalityC", - "member_count": 7005, + "member_count": 7041, "served_rows": 7, "served_rows_exact": true }, @@ -733,7 +737,7 @@ }, "relation": "child", "parent": "CRSTypeOfFinance100", - "member_count": 12672, + "member_count": 12745, "served_rows": 30, "served_rows_exact": true } @@ -760,7 +764,7 @@ "value_kind": "enum_value" }, "relation": "root", - "member_count": 14098, + "member_count": 14146, "served_rows": 30, "served_rows_exact": true } @@ -1191,7 +1195,7 @@ "selected": [] } ], - "capability_version": "cap_765c9d2a0c7529b9", + "capability_version": "cap_4913302d7a6b6435", "default_reading": { "applied": true, "removed_stat_vars": [] @@ -1199,214 +1203,7 @@ }, "confidence": "high", "available_at_place": true, - "alternative_measures": [ - { - "definition": { - "schema_version": 1, - "spec_id": "spec_80b92ca1ba1114b426eb5e79b84361d4", - "identity": { - "identity_version": "spec1", - "shape": { - "kind": "statvar_schema", - "population_type": "FinancialFlow", - "measured_property": "amount", - "stat_type": "measuredValue", - "measurement_qualifier": "Nominal" - }, - "slots": [ - { - "property": "crsCooperationModality", - "binding": { - "state": "unbound" - } - }, - { - "property": "crsPurpose", - "binding": { - "state": "value", - "ref": "CRSPurposeCode12220" - } - }, - { - "property": "crsTypeOfFinance", - "binding": { - "state": "unbound" - } - }, - { - "property": "crsTypeOfFlow", - "binding": { - "state": "value", - "ref": "CRSTypeOfFlow10" - } - }, - { - "property": "financialFlowType", - "binding": { - "state": "value", - "ref": "Disbursement" - } - }, - { - "property": "nettingBasis", - "binding": { - "state": "value", - "ref": "Net" - } - } - ], - "entities": { - "destination": [ - "country/NGA" - ], - "origin": [ - "country/DEU" - ] - }, - "requested_window": { - "kind": "all" - } - } - }, - "label": "net disbursements", - "axis": "what", - "measure_axis_values": [ - { - "axis": "populationType", - "value": { - "ref": "FinancialFlow", - "label": "financial flow" - } - }, - { - "axis": "measuredProperty", - "value": { - "ref": "amount", - "label": "amount" - } - }, - { - "axis": "measurementQualifier", - "value": { - "ref": "Nominal", - "label": "nominal" - } - }, - { - "axis": "financialFlowType", - "value": { - "ref": "Disbursement", - "label": "disbursement" - } - }, - { - "axis": "nettingBasis", - "value": { - "ref": "Net", - "label": "net" - } - } - ], - "served_rows": 30, - "served_rows_exact": true - }, - { - "definition": { - "schema_version": 1, - "spec_id": "spec_c394f9108db2100f1c8e4532d8d1c804", - "identity": { - "identity_version": "spec1", - "shape": { - "kind": "statvar_schema", - "population_type": "FinancialObligation", - "measured_property": "amount", - "stat_type": "measuredValue", - "measurement_qualifier": "Nominal" - }, - "slots": [ - { - "property": "crsCooperationModality", - "binding": { - "state": "unbound" - } - }, - { - "property": "crsPurpose", - "binding": { - "state": "value", - "ref": "CRSPurposeCode12220" - } - }, - { - "property": "crsTypeOfFinance", - "binding": { - "state": "unbound" - } - }, - { - "property": "crsTypeOfFlow", - "binding": { - "state": "value", - "ref": "CRSTypeOfFlow10" - } - }, - { - "property": "financialObligationType", - "binding": { - "state": "value", - "ref": "Commitment" - } - } - ], - "entities": { - "destination": [ - "country/NGA" - ], - "origin": [ - "country/DEU" - ] - }, - "requested_window": { - "kind": "all" - } - } - }, - "label": "commitments", - "axis": "what", - "measure_axis_values": [ - { - "axis": "populationType", - "value": { - "ref": "FinancialObligation", - "label": "financial obligation" - } - }, - { - "axis": "measuredProperty", - "value": { - "ref": "amount", - "label": "amount" - } - }, - { - "axis": "measurementQualifier", - "value": { - "ref": "Nominal", - "label": "nominal" - } - }, - { - "axis": "financialObligationType", - "value": { - "ref": "Commitment", - "label": "commitment" - } - } - ], - "served_rows": 24, - "served_rows_exact": true - } - ], + "alternative_measures": [], "measure_label": "gross disbursements", "measure_label_axes": [ "populationType", @@ -1452,6 +1249,8 @@ } } ], + "concept_label": "basic health care", + "published_tables": "OECD Creditor Reporting System (CRS)", "open_axis_facts": [ { "property": "crsTypeOfFinance", @@ -3477,6 +3276,363 @@ "destination": "NGN", "origin": "EUR" } + }, + "scope_choices": { + "id": "spec_774d6c001a6250aa67ca676ab067895e", + "base": { + "schema_version": 1, + "spec_id": "spec_774d6c001a6250aa67ca676ab067895e", + "identity": { + "identity_version": "spec1", + "shape": { + "kind": "statvar_schema", + "population_type": "FinancialFlow", + "measured_property": "amount", + "stat_type": "measuredValue", + "measurement_qualifier": "Nominal" + }, + "slots": [ + { + "property": "crsCooperationModality", + "binding": { + "state": "unbound" + } + }, + { + "property": "crsPurpose", + "binding": { + "state": "value", + "ref": "CRSPurposeCode12220" + } + }, + { + "property": "crsTypeOfFinance", + "binding": { + "state": "unbound" + } + }, + { + "property": "crsTypeOfFlow", + "binding": { + "state": "value", + "ref": "CRSTypeOfFlow10" + } + }, + { + "property": "financialFlowType", + "binding": { + "state": "value", + "ref": "Disbursement" + } + }, + { + "property": "nettingBasis", + "binding": { + "state": "value", + "ref": "Gross" + } + } + ], + "entities": { + "destination": [ + "country/NGA" + ], + "origin": [ + "country/DEU" + ] + }, + "requested_window": { + "kind": "all" + } + } + }, + "rule_version": "scope1:3eef00a928eedd463ee48d02b79730da", + "entries": [ + { + "axis": "sector", + "option_id": "sector:12220", + "provenance": "explicit", + "origin": { + "kind": "text", + "text": "basic health care", + "start": 46, + "end": 63 + } + } + ], + "dropped_entries": [], + "choices": [ + { + "id": "spec_774d6c001a6250aa67ca676ab067895e:sector", + "axis": "sector", + "rule": "sector_code", + "provenance": "explicit", + "active": "sector:12220", + "options": [ + { + "option_id": "sector:12220", + "label": "basic health care (CRS 12220)", + "binding": { + "kind": "slot", + "slot": "crsPurpose", + "state": "value", + "refs": [ + "CRSPurposeCode12220" + ] + }, + "availability": { + "status": "available", + "detail": {} + } + } + ] + }, + { + "id": "spec_774d6c001a6250aa67ca676ab067895e:measure_basis", + "axis": "measure_basis", + "rule": "measure_basis_convention", + "provenance": "default", + "active": "measure_basis:gross", + "options": [ + { + "option_id": "measure_basis:gross", + "label": "gross disbursements, current USD", + "binding": { + "kind": "shape", + "measured_property": "amount", + "netting_basis": "Gross" + }, + "availability": { + "status": "available", + "detail": {} + } + }, + { + "option_id": "measure_basis:net", + "label": "net disbursements, current USD", + "binding": { + "kind": "shape", + "measured_property": "amount", + "netting_basis": "Net" + }, + "availability": { + "status": "available", + "detail": {} + } + }, + { + "option_id": "measure_basis:grant_equivalent", + "label": "grant equivalents (OECD headline), current USD", + "binding": { + "kind": "shape", + "measured_property": "grantEquivalent", + "netting_basis": null + }, + "availability": { + "status": "available", + "detail": {} + } + }, + { + "option_id": "measure_basis:commitments", + "label": "commitments, current USD", + "binding": { + "kind": "shape", + "measured_property": "amount", + "netting_basis": null + }, + "availability": { + "status": "available", + "detail": {} + } + } + ] + }, + { + "id": "spec_774d6c001a6250aa67ca676ab067895e:provider", + "axis": "provider", + "rule": "bilateral_flows", + "provenance": "default", + "active": "provider:bilateral", + "options": [ + { + "option_id": "provider:bilateral", + "label": "bilateral flows only", + "binding": { + "kind": "provider", + "scope": "bilateral" + }, + "availability": { + "status": "available", + "detail": {} + } + }, + { + "option_id": "provider:inclusive", + "label": "bilateral plus imputed multilateral, 2020 to 2024", + "binding": { + "kind": "provider", + "scope": "inclusive", + "window": [ + 2020, + 2024 + ], + "provenance": "provenance/ONEBilateralAndImputedMultilateral" + }, + "availability": { + "status": "partial", + "years": [ + [ + 2011, + 2016 + ], + [ + 2020, + 2024 + ] + ], + "code": "imputed_coverage", + "detail": {} + } + } + ] + } + ], + "compiled": { + "spec_id": "spec_774d6c001a6250aa67ca676ab067895e", + "identity": { + "identity_version": "spec1", + "shape": { + "kind": "statvar_schema", + "population_type": "FinancialFlow", + "measured_property": "amount", + "stat_type": "measuredValue", + "measurement_qualifier": "Nominal" + }, + "slots": [ + { + "property": "crsCooperationModality", + "binding": { + "state": "unbound" + } + }, + { + "property": "crsPurpose", + "binding": { + "state": "value", + "ref": "CRSPurposeCode12220" + } + }, + { + "property": "crsTypeOfFinance", + "binding": { + "state": "unbound" + } + }, + { + "property": "crsTypeOfFlow", + "binding": { + "state": "value", + "ref": "CRSTypeOfFlow10" + } + }, + { + "property": "financialFlowType", + "binding": { + "state": "value", + "ref": "Disbursement" + } + }, + { + "property": "nettingBasis", + "binding": { + "state": "value", + "ref": "Gross" + } + } + ], + "entities": { + "destination": [ + "country/NGA" + ], + "origin": [ + "country/DEU" + ] + }, + "requested_window": { + "kind": "all" + } + }, + "components": [ + { + "role": "whole", + "identity": { + "identity_version": "spec1", + "shape": { + "kind": "statvar_schema", + "population_type": "FinancialFlow", + "measured_property": "amount", + "stat_type": "measuredValue", + "measurement_qualifier": "Nominal" + }, + "slots": [ + { + "property": "crsCooperationModality", + "binding": { + "state": "unbound" + } + }, + { + "property": "crsPurpose", + "binding": { + "state": "value", + "ref": "CRSPurposeCode12220" + } + }, + { + "property": "crsTypeOfFinance", + "binding": { + "state": "unbound" + } + }, + { + "property": "crsTypeOfFlow", + "binding": { + "state": "value", + "ref": "CRSTypeOfFlow10" + } + }, + { + "property": "financialFlowType", + "binding": { + "state": "value", + "ref": "Disbursement" + } + }, + { + "property": "nettingBasis", + "binding": { + "state": "value", + "ref": "Gross" + } + } + ], + "entities": { + "destination": [ + "country/NGA" + ], + "origin": [ + "country/DEU" + ] + }, + "requested_window": { + "kind": "all" + } + } + } + ] + }, + "ledger": [] } } } diff --git a/python/client-contract/src/dfo_client_contract/scenarios/choose-refused-no-options.json b/python/client-contract/src/dfo_client_contract/scenarios/choose-refused-no-options.json index 0ea3c80..fa12b47 100644 --- a/python/client-contract/src/dfo_client_contract/scenarios/choose-refused-no-options.json +++ b/python/client-contract/src/dfo_client_contract/scenarios/choose-refused-no-options.json @@ -34,7 +34,7 @@ "status": 200, "headers": { "content-type": "application/json", - "x-dfo-trace-id": "01cf4a9623c449759f24d249f8783de1" + "x-dfo-trace-id": "1d05424fb2784068acf168d73a67c0d0" }, "json": { "schema_version": 1, @@ -45,21 +45,22 @@ "extract_skipped": false }, "diagnostics": { - "engine_build": "d80df9f5fd598b7345255470932d202ee5d49942", - "trace_id": "01cf4a9623c449759f24d249f8783de1", + "engine_build": "ccb6617922c839ce3cd5615a3bbb65c70bfe1bde", + "trace_id": "1d05424fb2784068acf168d73a67c0d0", "warnings": [], "timing_ms": { - "total": 1162, + "total": 1946, "by_step": { "coverage": 0, - "extract": 1040, + "extract": 1070, + "exclusion_read": 606, "cache_lookup": 0 } }, "llm_usage": { - "input_tokens": 2233, - "output_tokens": 193, - "cached_tokens": 841 + "input_tokens": 2788, + "output_tokens": 202, + "cached_tokens": 0 }, "timed_out": false }, @@ -69,10 +70,10 @@ "variable_text": "ODA disbursements", "warnings": [], "timing_ms": { - "total": 117, + "total": 871, "by_step": { - "recall": 117, - "phase_resolve_places": 0, + "recall": 870, + "phase_resolve_places": 1, "phase_check_entities": 0 } }, @@ -122,7 +123,9 @@ "entity_refs": [ { "text": "Germany", - "refs": [] + "refs": [ + "country/DEU" + ] }, { "text": "Congo", diff --git a/python/client-contract/src/dfo_client_contract/scenarios/choose-refused-option-out-of-range.json b/python/client-contract/src/dfo_client_contract/scenarios/choose-refused-option-out-of-range.json index 5900087..ac13433 100644 --- a/python/client-contract/src/dfo_client_contract/scenarios/choose-refused-option-out-of-range.json +++ b/python/client-contract/src/dfo_client_contract/scenarios/choose-refused-option-out-of-range.json @@ -34,7 +34,7 @@ "status": 200, "headers": { "content-type": "application/json", - "x-dfo-trace-id": "2de415a9f27d4ce69e4f1eb97b5951af" + "x-dfo-trace-id": "b250c3db1b784b9fa66b8173b78a6c0f" }, "json": { "schema_version": 1, @@ -45,20 +45,21 @@ "extract_skipped": false }, "diagnostics": { - "engine_build": "d80df9f5fd598b7345255470932d202ee5d49942", - "trace_id": "2de415a9f27d4ce69e4f1eb97b5951af", + "engine_build": "ccb6617922c839ce3cd5615a3bbb65c70bfe1bde", + "trace_id": "b250c3db1b784b9fa66b8173b78a6c0f", "warnings": [], "timing_ms": { - "total": 4676, + "total": 28220, "by_step": { - "coverage": 1, - "extract": 1, - "cache_lookup": 0 + "coverage": 0, + "extract": 957, + "exclusion_read": 667, + "cache_lookup": 1 } }, "llm_usage": { - "input_tokens": 0, - "output_tokens": 0, + "input_tokens": 2796, + "output_tokens": 152, "cached_tokens": 0, "jev_input_tokens": 13359, "jev_output_tokens": 2855 @@ -69,33 +70,39 @@ "parts": [ { "variable_text": "mortality", - "warnings": [], + "warnings": [ + { + "code": "membership_unverified", + "severity": "warn", + "message": "the full set of series behind this answer could not be confirmed, so it uses the series the search found; a dataset made from it may hold different series." + } + ], "timing_ms": { - "total": 4672, + "total": 26613, "by_step": { - "recall": 1, + "recall": 4404, "phase_resolve_places": 0, "phase_check_entities": 0, "shape_arcs": 6, - "shape_probe": 120, + "shape_probe": 126, "shape_groups": 6, "shape_labels": 2, - "shape_admission": 1, + "shape_admission": 2, "phase_derive_shapes": 0, - "shape": 258, + "shape": 238, "phase_prune_and_rank": 0, - "bind": 154, - "phase_bind": 18, + "bind": 145, + "phase_bind": 25, "phase_settle": 1, - "phase_place_bindings": 39, + "phase_place_bindings": 7249, "phase_facet_requests": 0, - "materialise": 202, - "phase_materialise": 33, - "answer": 30, - "phase_outcome": 3936 + "materialise": 1955, + "phase_materialise": 113, + "answer": 1043, + "phase_outcome": 11440 } }, - "rendered_sentence": "2 readings. Kenya's deaths rate per capita. World Development Indicators · 2013 to 2022. Kenya's number of deaths. Kenya Census · 2018 to 2022.", + "rendered_sentence": "2 readings. Kenya's deaths rate per 1,000 people. World Development Indicators · 2013 to 2022. Kenya's number of deaths. Kenya Census · 2018 to 2022.", "sentence_plan": [ { "kind": "text", @@ -148,7 +155,7 @@ }, { "kind": "text", - "text": "per capita", + "text": "per 1,000 people", "segment": "heading", "entity_refs": [], "states": [] @@ -627,7 +634,7 @@ "source": "observed" } ], - "rendered_sentence": "Kenya's deaths rate per capita, 2013 to 2022. World Development Indicators.", + "rendered_sentence": "Kenya's deaths rate per 1,000 people, 2013 to 2022. World Development Indicators.", "sentence_plan": [ { "kind": "slot", @@ -672,11 +679,14 @@ }, { "kind": "slot", - "text": "per capita", + "text": "per 1,000 people", "axis": "unit", "segment": "heading", + "binding_ref": "unit:", "entity_refs": [], - "states": [] + "states": [ + "unit:" + ] }, { "kind": "slot", @@ -814,7 +824,7 @@ "start_year": 2013, "end_year": 2022 }, - "capability_version": "cap_765c9d2a0c7529b9", + "capability_version": "cap_4913302d7a6b6435", "default_reading": { "applied": true, "removed_stat_vars": [] @@ -823,7 +833,8 @@ "confidence": "high", "available_at_place": true, "measure_label_axes": [], - "measure_axis_values": [] + "measure_axis_values": [], + "published_tables": "World Development Indicators" } }, { @@ -996,7 +1007,7 @@ "label": "data source" } ], - "member_count": 2978, + "member_count": 10, "refine_supported": true, "data_commons": [ { @@ -1175,9 +1186,8 @@ ], "unresolved_slots": [], "stat_vars": { - "member_count": 37, + "member_count": 1, "member_count_exact": false, - "served_count": 1, "data_date_range": { "start": "2018", "end": "2022" @@ -2366,7 +2376,7 @@ "start_year": 2013, "end_year": 2022 }, - "capability_version": "cap_765c9d2a0c7529b9", + "capability_version": "cap_4913302d7a6b6435", "default_reading": { "applied": true, "removed_stat_vars": [] @@ -2376,7 +2386,8 @@ "basis": "structural", "available_at_place": true, "measure_label_axes": [], - "measure_axis_values": [] + "measure_axis_values": [], + "published_tables": "Kenya Census" } } ], @@ -2388,7 +2399,7 @@ } } ], - "rendered_sentence": "2 readings. Kenya's deaths rate per capita. World Development Indicators · 2013 to 2022. Kenya's number of deaths. Kenya Census · 2018 to 2022.", + "rendered_sentence": "2 readings. Kenya's deaths rate per 1,000 people. World Development Indicators · 2013 to 2022. Kenya's number of deaths. Kenya Census · 2018 to 2022.", "sentence_plan": [ { "kind": "text", @@ -2448,7 +2459,7 @@ }, { "kind": "text", - "text": "per capita", + "text": "per 1,000 people", "segment": "heading", "entity_refs": [], "states": [], @@ -2601,7 +2612,7 @@ "answer": { "kind": "resolution", "status": "candidates", - "sentence": "2 readings. Kenya's deaths rate per capita. World Development Indicators · 2013 to 2022. Kenya's number of deaths. Kenya Census · 2018 to 2022.", + "sentence": "2 readings. Kenya's deaths rate per 1,000 people. World Development Indicators · 2013 to 2022. Kenya's number of deaths. Kenya Census · 2018 to 2022.", "complete": false, "specs": [], "gaps": [ diff --git a/python/client-contract/src/dfo_client_contract/scenarios/choose-refused-part-without-variable-text.json b/python/client-contract/src/dfo_client_contract/scenarios/choose-refused-part-without-variable-text.json index 31f75cf..4535e27 100644 --- a/python/client-contract/src/dfo_client_contract/scenarios/choose-refused-part-without-variable-text.json +++ b/python/client-contract/src/dfo_client_contract/scenarios/choose-refused-part-without-variable-text.json @@ -35,7 +35,7 @@ "status": 200, "headers": { "content-type": "application/json", - "x-dfo-trace-id": "44089cedfffd4c0ca025f3d8faba0ca7" + "x-dfo-trace-id": "0912e47dd13a455fb52bce86cfcffbe0" }, "json": { "schema_version": 1, @@ -46,21 +46,22 @@ "extract_skipped": false }, "diagnostics": { - "engine_build": "d80df9f5fd598b7345255470932d202ee5d49942", - "trace_id": "44089cedfffd4c0ca025f3d8faba0ca7", + "engine_build": "ccb6617922c839ce3cd5615a3bbb65c70bfe1bde", + "trace_id": "0912e47dd13a455fb52bce86cfcffbe0", "warnings": [], "timing_ms": { - "total": 2666, + "total": 2781, "by_step": { "coverage": 0, - "extract": 1154, + "extract": 994, + "exclusion_read": 654, "cache_lookup": 0 } }, "llm_usage": { - "input_tokens": 2239, - "output_tokens": 164, - "cached_tokens": 842, + "input_tokens": 2800, + "output_tokens": 173, + "cached_tokens": 0, "jev_input_tokens": 17398, "jev_output_tokens": 3500 }, @@ -71,30 +72,30 @@ { "warnings": [], "timing_ms": { - "total": 1283, + "total": 1308, "by_step": { "recall": 2, - "phase_resolve_places": 0, + "phase_resolve_places": 1, "phase_check_entities": 0, - "shape_arcs": 4, - "shape_probe_coverage": 5, - "shape_probe": 116, - "shape_groups": 64, + "shape_arcs": 2, + "shape_probe_coverage": 4, + "shape_probe": 125, + "shape_groups": 68, "shape_labels": 12, - "shape_admission": 1, + "shape_admission": 2, "phase_derive_shapes": 0, - "shape": 463, + "shape": 539, "phase_prune_and_rank": 0, - "bind": 125, - "phase_bind": 12, - "phase_settle": 6, - "phase_place_bindings": 10, + "bind": 124, + "phase_bind": 14, + "phase_settle": 10, + "phase_place_bindings": 8, "phase_facet_requests": 0, - "materialise": 173, + "materialise": 178, "phase_materialise": 18, - "answer": 207, - "options": 140, - "phase_outcome": 127 + "answer": 161, + "options": 134, + "phase_outcome": 119 } }, "restatement": { @@ -1958,7 +1959,7 @@ "start_year": 2015, "end_year": 2015 }, - "capability_version": "cap_765c9d2a0c7529b9", + "capability_version": "cap_4913302d7a6b6435", "default_reading": { "applied": true, "removed_stat_vars": [ @@ -2877,7 +2878,7 @@ "start_year": 2015, "end_year": 2015 }, - "capability_version": "cap_765c9d2a0c7529b9", + "capability_version": "cap_4913302d7a6b6435", "default_reading": { "applied": true, "removed_stat_vars": [ @@ -2905,12 +2906,14 @@ "confidence": "high", "available_at_place": true, "measure_label_axes": [], - "measure_axis_values": [] + "measure_axis_values": [], + "published_tables": "IMF World Economic Outlook (WEO)" } } ], "measure_label_axes": [], "measure_axis_values": [], + "published_tables": "World Development Indicators", "related_group": { "ref": "dc/g/EconomicActivity_ActivitySource-GrossDomesticProduction", "label": "Economic Activity With Activity Source = Gross Domestic Production" @@ -2980,24 +2983,24 @@ "variable_text": "ODA", "warnings": [], "timing_ms": { - "total": 598, + "total": 1498, "by_step": { - "recall": 301, + "recall": 1140, "phase_resolve_places": 0, "phase_check_entities": 0, "shape_arcs": 2, - "shape_probe_coverage": 6, - "shape_probe": 99, - "shape_groups": 3, + "shape_probe_coverage": 13, + "shape_probe": 149, + "shape_groups": 4, "shape_labels": 0, - "shape_admission": 0, + "shape_admission": 1, "phase_derive_shapes": 0, - "shape": 189, + "shape": 247, "phase_prune_and_rank": 0, - "bind": 91, - "phase_bind": 3, - "phase_settle": 7, - "phase_place_bindings": 7 + "bind": 102, + "phase_bind": 2, + "phase_settle": 2, + "phase_place_bindings": 5 } }, "rendered_sentence": "Could not tell who is giving and who is receiving among \"G20\", \"Germany\", and \"India\". Put \"from\" or \"to\" before a name.", diff --git a/python/client-contract/src/dfo_client_contract/scenarios/choose-refused-shared-candidate-label.json b/python/client-contract/src/dfo_client_contract/scenarios/choose-refused-shared-candidate-label.json index 85414ff..31cd6a4 100644 --- a/python/client-contract/src/dfo_client_contract/scenarios/choose-refused-shared-candidate-label.json +++ b/python/client-contract/src/dfo_client_contract/scenarios/choose-refused-shared-candidate-label.json @@ -14,7 +14,7 @@ }, { "op": "choose", - "option": "Kenya's deaths rate per capita, 2013 to 2022." + "option": "Kenya's deaths rate per 1,000 people, 2013 to 2022." } ], "exchanges": [ @@ -34,7 +34,7 @@ "status": 200, "headers": { "content-type": "application/json", - "x-dfo-trace-id": "2de415a9f27d4ce69e4f1eb97b5951af" + "x-dfo-trace-id": "b250c3db1b784b9fa66b8173b78a6c0f" }, "json": { "schema_version": 1, @@ -45,20 +45,21 @@ "extract_skipped": false }, "diagnostics": { - "engine_build": "d80df9f5fd598b7345255470932d202ee5d49942", - "trace_id": "2de415a9f27d4ce69e4f1eb97b5951af", + "engine_build": "ccb6617922c839ce3cd5615a3bbb65c70bfe1bde", + "trace_id": "b250c3db1b784b9fa66b8173b78a6c0f", "warnings": [], "timing_ms": { - "total": 4676, + "total": 28220, "by_step": { - "coverage": 1, - "extract": 1, - "cache_lookup": 0 + "coverage": 0, + "extract": 957, + "exclusion_read": 667, + "cache_lookup": 1 } }, "llm_usage": { - "input_tokens": 0, - "output_tokens": 0, + "input_tokens": 2796, + "output_tokens": 152, "cached_tokens": 0, "jev_input_tokens": 13359, "jev_output_tokens": 2855 @@ -69,33 +70,39 @@ "parts": [ { "variable_text": "mortality", - "warnings": [], + "warnings": [ + { + "code": "membership_unverified", + "severity": "warn", + "message": "the full set of series behind this answer could not be confirmed, so it uses the series the search found; a dataset made from it may hold different series." + } + ], "timing_ms": { - "total": 4672, + "total": 26613, "by_step": { - "recall": 1, + "recall": 4404, "phase_resolve_places": 0, "phase_check_entities": 0, "shape_arcs": 6, - "shape_probe": 120, + "shape_probe": 126, "shape_groups": 6, "shape_labels": 2, - "shape_admission": 1, + "shape_admission": 2, "phase_derive_shapes": 0, - "shape": 258, + "shape": 238, "phase_prune_and_rank": 0, - "bind": 154, - "phase_bind": 18, + "bind": 145, + "phase_bind": 25, "phase_settle": 1, - "phase_place_bindings": 39, + "phase_place_bindings": 7249, "phase_facet_requests": 0, - "materialise": 202, - "phase_materialise": 33, - "answer": 30, - "phase_outcome": 3936 + "materialise": 1955, + "phase_materialise": 113, + "answer": 1043, + "phase_outcome": 11440 } }, - "rendered_sentence": "2 readings. Kenya's deaths rate per capita. World Development Indicators · 2013 to 2022. Kenya's number of deaths. Kenya Census · 2018 to 2022.", + "rendered_sentence": "2 readings. Kenya's deaths rate per 1,000 people. World Development Indicators · 2013 to 2022. Kenya's number of deaths. Kenya Census · 2018 to 2022.", "sentence_plan": [ { "kind": "text", @@ -148,7 +155,7 @@ }, { "kind": "text", - "text": "per capita", + "text": "per 1,000 people", "segment": "heading", "entity_refs": [], "states": [] @@ -627,7 +634,7 @@ "source": "observed" } ], - "rendered_sentence": "Kenya's deaths rate per capita, 2013 to 2022. World Development Indicators.", + "rendered_sentence": "Kenya's deaths rate per 1,000 people, 2013 to 2022. World Development Indicators.", "sentence_plan": [ { "kind": "slot", @@ -672,11 +679,14 @@ }, { "kind": "slot", - "text": "per capita", + "text": "per 1,000 people", "axis": "unit", "segment": "heading", + "binding_ref": "unit:", "entity_refs": [], - "states": [] + "states": [ + "unit:" + ] }, { "kind": "slot", @@ -814,7 +824,7 @@ "start_year": 2013, "end_year": 2022 }, - "capability_version": "cap_765c9d2a0c7529b9", + "capability_version": "cap_4913302d7a6b6435", "default_reading": { "applied": true, "removed_stat_vars": [] @@ -823,7 +833,8 @@ "confidence": "high", "available_at_place": true, "measure_label_axes": [], - "measure_axis_values": [] + "measure_axis_values": [], + "published_tables": "World Development Indicators" } }, { @@ -996,7 +1007,7 @@ "label": "data source" } ], - "member_count": 2978, + "member_count": 10, "refine_supported": true, "data_commons": [ { @@ -1175,9 +1186,8 @@ ], "unresolved_slots": [], "stat_vars": { - "member_count": 37, + "member_count": 1, "member_count_exact": false, - "served_count": 1, "data_date_range": { "start": "2018", "end": "2022" @@ -2078,11 +2088,14 @@ }, { "kind": "slot", - "text": "per capita", + "text": "per 1,000 people", "axis": "unit", "segment": "heading", + "binding_ref": "unit:", "entity_refs": [], - "states": [] + "states": [ + "unit:" + ] }, { "kind": "slot", @@ -2311,7 +2324,7 @@ "start_year": 2013, "end_year": 2022 }, - "capability_version": "cap_765c9d2a0c7529b9", + "capability_version": "cap_4913302d7a6b6435", "default_reading": { "applied": true, "removed_stat_vars": [] @@ -2321,7 +2334,8 @@ "basis": "structural", "available_at_place": true, "measure_label_axes": [], - "measure_axis_values": [] + "measure_axis_values": [], + "published_tables": "Kenya Census" } } ], @@ -2333,7 +2347,7 @@ } } ], - "rendered_sentence": "2 readings. Kenya's deaths rate per capita. World Development Indicators · 2013 to 2022. Kenya's number of deaths. Kenya Census · 2018 to 2022.", + "rendered_sentence": "2 readings. Kenya's deaths rate per 1,000 people. World Development Indicators · 2013 to 2022. Kenya's number of deaths. Kenya Census · 2018 to 2022.", "sentence_plan": [ { "kind": "text", @@ -2393,7 +2407,7 @@ }, { "kind": "text", - "text": "per capita", + "text": "per 1,000 people", "segment": "heading", "entity_refs": [], "states": [], @@ -2546,7 +2560,7 @@ "answer": { "kind": "resolution", "status": "candidates", - "sentence": "2 readings. Kenya's deaths rate per capita. World Development Indicators · 2013 to 2022. Kenya's number of deaths. Kenya Census · 2018 to 2022.", + "sentence": "2 readings. Kenya's deaths rate per 1,000 people. World Development Indicators · 2013 to 2022. Kenya's number of deaths. Kenya Census · 2018 to 2022.", "complete": false, "specs": [], "gaps": [ diff --git a/python/client-contract/src/dfo_client_contract/scenarios/choose-refused-shared-label.json b/python/client-contract/src/dfo_client_contract/scenarios/choose-refused-shared-label.json index 6886548..62064a6 100644 --- a/python/client-contract/src/dfo_client_contract/scenarios/choose-refused-shared-label.json +++ b/python/client-contract/src/dfo_client_contract/scenarios/choose-refused-shared-label.json @@ -45,11 +45,11 @@ "extract_skipped": true }, "diagnostics": { - "engine_build": "d80df9f5fd598b7345255470932d202ee5d49942", - "trace_id": "989481cf76744b4cbddf1aff890cda9c", + "engine_build": "ccb6617922c839ce3cd5615a3bbb65c70bfe1bde", + "trace_id": "96a2cbe778b34b8695d7cdf943243a76", "warnings": [], "timing_ms": { - "total": 1, + "total": 2, "by_step": { "coverage": 0, "response_cache_layer1": 1 @@ -68,10 +68,10 @@ "variable_text": "ODA disbursements", "warnings": [], "timing_ms": { - "total": 117, + "total": 871, "by_step": { - "recall": 117, - "phase_resolve_places": 0, + "recall": 870, + "phase_resolve_places": 1, "phase_check_entities": 0 } }, @@ -121,7 +121,9 @@ "entity_refs": [ { "text": "Germany", - "refs": [] + "refs": [ + "country/DEU" + ] }, { "text": "Congo", diff --git a/python/client-contract/src/dfo_client_contract/scenarios/choose-refused-two-choices.json b/python/client-contract/src/dfo_client_contract/scenarios/choose-refused-two-choices.json index b078e79..d45c74a 100644 --- a/python/client-contract/src/dfo_client_contract/scenarios/choose-refused-two-choices.json +++ b/python/client-contract/src/dfo_client_contract/scenarios/choose-refused-two-choices.json @@ -34,7 +34,7 @@ "status": 200, "headers": { "content-type": "application/json", - "x-dfo-trace-id": "5df79c87dd3c43589df5c2921f3c93e3" + "x-dfo-trace-id": "66ee9968495c4420baa91bae126c6a07" }, "json": { "schema_version": 1, @@ -45,21 +45,22 @@ "extract_skipped": false }, "diagnostics": { - "engine_build": "d80df9f5fd598b7345255470932d202ee5d49942", - "trace_id": "5df79c87dd3c43589df5c2921f3c93e3", + "engine_build": "ccb6617922c839ce3cd5615a3bbb65c70bfe1bde", + "trace_id": "66ee9968495c4420baa91bae126c6a07", "warnings": [], "timing_ms": { - "total": 1209, + "total": 1103, "by_step": { "coverage": 0, - "extract": 1202, + "extract": 1095, + "exclusion_read": 608, "cache_lookup": 0 } }, "llm_usage": { - "input_tokens": 2234, - "output_tokens": 207, - "cached_tokens": 841 + "input_tokens": 2790, + "output_tokens": 216, + "cached_tokens": 0 }, "timed_out": false }, @@ -125,11 +126,15 @@ "entity_refs": [ { "text": "Kenya", - "refs": [] + "refs": [ + "country/KEN" + ] }, { "text": "Germany", - "refs": [] + "refs": [ + "country/DEU" + ] }, { "text": "Congo", @@ -243,9 +248,9 @@ "variable_text": "ODA disbursements", "warnings": [], "timing_ms": { - "total": 2, + "total": 1, "by_step": { - "recall": 2, + "recall": 1, "phase_resolve_places": 0, "phase_check_entities": 0 } @@ -299,11 +304,15 @@ "entity_refs": [ { "text": "Kenya", - "refs": [] + "refs": [ + "country/KEN" + ] }, { "text": "Germany", - "refs": [] + "refs": [ + "country/DEU" + ] }, { "text": "Congo", diff --git a/python/client-contract/src/dfo_client_contract/scenarios/choose-refused-unknown-candidate-label.json b/python/client-contract/src/dfo_client_contract/scenarios/choose-refused-unknown-candidate-label.json index 893fd5f..93f73de 100644 --- a/python/client-contract/src/dfo_client_contract/scenarios/choose-refused-unknown-candidate-label.json +++ b/python/client-contract/src/dfo_client_contract/scenarios/choose-refused-unknown-candidate-label.json @@ -34,7 +34,7 @@ "status": 200, "headers": { "content-type": "application/json", - "x-dfo-trace-id": "2de415a9f27d4ce69e4f1eb97b5951af" + "x-dfo-trace-id": "b250c3db1b784b9fa66b8173b78a6c0f" }, "json": { "schema_version": 1, @@ -45,20 +45,21 @@ "extract_skipped": false }, "diagnostics": { - "engine_build": "d80df9f5fd598b7345255470932d202ee5d49942", - "trace_id": "2de415a9f27d4ce69e4f1eb97b5951af", + "engine_build": "ccb6617922c839ce3cd5615a3bbb65c70bfe1bde", + "trace_id": "b250c3db1b784b9fa66b8173b78a6c0f", "warnings": [], "timing_ms": { - "total": 4676, + "total": 28220, "by_step": { - "coverage": 1, - "extract": 1, - "cache_lookup": 0 + "coverage": 0, + "extract": 957, + "exclusion_read": 667, + "cache_lookup": 1 } }, "llm_usage": { - "input_tokens": 0, - "output_tokens": 0, + "input_tokens": 2796, + "output_tokens": 152, "cached_tokens": 0, "jev_input_tokens": 13359, "jev_output_tokens": 2855 @@ -69,33 +70,39 @@ "parts": [ { "variable_text": "mortality", - "warnings": [], + "warnings": [ + { + "code": "membership_unverified", + "severity": "warn", + "message": "the full set of series behind this answer could not be confirmed, so it uses the series the search found; a dataset made from it may hold different series." + } + ], "timing_ms": { - "total": 4672, + "total": 26613, "by_step": { - "recall": 1, + "recall": 4404, "phase_resolve_places": 0, "phase_check_entities": 0, "shape_arcs": 6, - "shape_probe": 120, + "shape_probe": 126, "shape_groups": 6, "shape_labels": 2, - "shape_admission": 1, + "shape_admission": 2, "phase_derive_shapes": 0, - "shape": 258, + "shape": 238, "phase_prune_and_rank": 0, - "bind": 154, - "phase_bind": 18, + "bind": 145, + "phase_bind": 25, "phase_settle": 1, - "phase_place_bindings": 39, + "phase_place_bindings": 7249, "phase_facet_requests": 0, - "materialise": 202, - "phase_materialise": 33, - "answer": 30, - "phase_outcome": 3936 + "materialise": 1955, + "phase_materialise": 113, + "answer": 1043, + "phase_outcome": 11440 } }, - "rendered_sentence": "2 readings. Kenya's deaths rate per capita. World Development Indicators · 2013 to 2022. Kenya's number of deaths. Kenya Census · 2018 to 2022.", + "rendered_sentence": "2 readings. Kenya's deaths rate per 1,000 people. World Development Indicators · 2013 to 2022. Kenya's number of deaths. Kenya Census · 2018 to 2022.", "sentence_plan": [ { "kind": "text", @@ -148,7 +155,7 @@ }, { "kind": "text", - "text": "per capita", + "text": "per 1,000 people", "segment": "heading", "entity_refs": [], "states": [] @@ -627,7 +634,7 @@ "source": "observed" } ], - "rendered_sentence": "Kenya's deaths rate per capita, 2013 to 2022. World Development Indicators.", + "rendered_sentence": "Kenya's deaths rate per 1,000 people, 2013 to 2022. World Development Indicators.", "sentence_plan": [ { "kind": "slot", @@ -672,11 +679,14 @@ }, { "kind": "slot", - "text": "per capita", + "text": "per 1,000 people", "axis": "unit", "segment": "heading", + "binding_ref": "unit:", "entity_refs": [], - "states": [] + "states": [ + "unit:" + ] }, { "kind": "slot", @@ -814,7 +824,7 @@ "start_year": 2013, "end_year": 2022 }, - "capability_version": "cap_765c9d2a0c7529b9", + "capability_version": "cap_4913302d7a6b6435", "default_reading": { "applied": true, "removed_stat_vars": [] @@ -823,7 +833,8 @@ "confidence": "high", "available_at_place": true, "measure_label_axes": [], - "measure_axis_values": [] + "measure_axis_values": [], + "published_tables": "World Development Indicators" } }, { @@ -996,7 +1007,7 @@ "label": "data source" } ], - "member_count": 2978, + "member_count": 10, "refine_supported": true, "data_commons": [ { @@ -1175,9 +1186,8 @@ ], "unresolved_slots": [], "stat_vars": { - "member_count": 37, + "member_count": 1, "member_count_exact": false, - "served_count": 1, "data_date_range": { "start": "2018", "end": "2022" @@ -2366,7 +2376,7 @@ "start_year": 2013, "end_year": 2022 }, - "capability_version": "cap_765c9d2a0c7529b9", + "capability_version": "cap_4913302d7a6b6435", "default_reading": { "applied": true, "removed_stat_vars": [] @@ -2376,7 +2386,8 @@ "basis": "structural", "available_at_place": true, "measure_label_axes": [], - "measure_axis_values": [] + "measure_axis_values": [], + "published_tables": "Kenya Census" } } ], @@ -2388,7 +2399,7 @@ } } ], - "rendered_sentence": "2 readings. Kenya's deaths rate per capita. World Development Indicators · 2013 to 2022. Kenya's number of deaths. Kenya Census · 2018 to 2022.", + "rendered_sentence": "2 readings. Kenya's deaths rate per 1,000 people. World Development Indicators · 2013 to 2022. Kenya's number of deaths. Kenya Census · 2018 to 2022.", "sentence_plan": [ { "kind": "text", @@ -2448,7 +2459,7 @@ }, { "kind": "text", - "text": "per capita", + "text": "per 1,000 people", "segment": "heading", "entity_refs": [], "states": [], @@ -2601,7 +2612,7 @@ "answer": { "kind": "resolution", "status": "candidates", - "sentence": "2 readings. Kenya's deaths rate per capita. World Development Indicators · 2013 to 2022. Kenya's number of deaths. Kenya Census · 2018 to 2022.", + "sentence": "2 readings. Kenya's deaths rate per 1,000 people. World Development Indicators · 2013 to 2022. Kenya's number of deaths. Kenya Census · 2018 to 2022.", "complete": false, "specs": [], "gaps": [ diff --git a/python/client-contract/src/dfo_client_contract/scenarios/choose-refused-unknown-label.json b/python/client-contract/src/dfo_client_contract/scenarios/choose-refused-unknown-label.json index 49de559..864c265 100644 --- a/python/client-contract/src/dfo_client_contract/scenarios/choose-refused-unknown-label.json +++ b/python/client-contract/src/dfo_client_contract/scenarios/choose-refused-unknown-label.json @@ -34,7 +34,7 @@ "status": 200, "headers": { "content-type": "application/json", - "x-dfo-trace-id": "01cf4a9623c449759f24d249f8783de1" + "x-dfo-trace-id": "1d05424fb2784068acf168d73a67c0d0" }, "json": { "schema_version": 1, @@ -45,21 +45,22 @@ "extract_skipped": false }, "diagnostics": { - "engine_build": "d80df9f5fd598b7345255470932d202ee5d49942", - "trace_id": "01cf4a9623c449759f24d249f8783de1", + "engine_build": "ccb6617922c839ce3cd5615a3bbb65c70bfe1bde", + "trace_id": "1d05424fb2784068acf168d73a67c0d0", "warnings": [], "timing_ms": { - "total": 1162, + "total": 1946, "by_step": { "coverage": 0, - "extract": 1040, + "extract": 1070, + "exclusion_read": 606, "cache_lookup": 0 } }, "llm_usage": { - "input_tokens": 2233, - "output_tokens": 193, - "cached_tokens": 841 + "input_tokens": 2788, + "output_tokens": 202, + "cached_tokens": 0 }, "timed_out": false }, @@ -69,10 +70,10 @@ "variable_text": "ODA disbursements", "warnings": [], "timing_ms": { - "total": 117, + "total": 871, "by_step": { - "recall": 117, - "phase_resolve_places": 0, + "recall": 870, + "phase_resolve_places": 1, "phase_check_entities": 0 } }, @@ -122,7 +123,9 @@ "entity_refs": [ { "text": "Germany", - "refs": [] + "refs": [ + "country/DEU" + ] }, { "text": "Congo", diff --git a/python/client-contract/src/dfo_client_contract/scenarios/choose-refused-unknown-part.json b/python/client-contract/src/dfo_client_contract/scenarios/choose-refused-unknown-part.json index 57beb8e..dde9124 100644 --- a/python/client-contract/src/dfo_client_contract/scenarios/choose-refused-unknown-part.json +++ b/python/client-contract/src/dfo_client_contract/scenarios/choose-refused-unknown-part.json @@ -35,7 +35,7 @@ "status": 200, "headers": { "content-type": "application/json", - "x-dfo-trace-id": "86b361f85db44a29b3d711350962ca73" + "x-dfo-trace-id": "cf40b66c70a74f34af1ea479ba67e11f" }, "json": { "schema_version": 1, @@ -46,20 +46,21 @@ "extract_skipped": false }, "diagnostics": { - "engine_build": "d80df9f5fd598b7345255470932d202ee5d49942", - "trace_id": "86b361f85db44a29b3d711350962ca73", + "engine_build": "ccb6617922c839ce3cd5615a3bbb65c70bfe1bde", + "trace_id": "cf40b66c70a74f34af1ea479ba67e11f", "warnings": [], "timing_ms": { - "total": 456, + "total": 3122, "by_step": { "coverage": 0, - "extract": 0, - "cache_lookup": 0 + "extract": 921, + "exclusion_read": 781, + "cache_lookup": 1 } }, "llm_usage": { - "input_tokens": 0, - "output_tokens": 0, + "input_tokens": 2786, + "output_tokens": 112, "cached_tokens": 0, "jev_input_tokens": 5250, "jev_output_tokens": 1104 @@ -72,30 +73,30 @@ "variable_text": "debt service", "warnings": [], "timing_ms": { - "total": 452, + "total": 2193, "by_step": { - "recall": 1, + "recall": 1640, "phase_resolve_places": 0, "phase_check_entities": 0, - "shape_arcs": 2, - "shape_probe_coverage": 17, - "shape_probe": 101, - "shape_groups": 8, - "shape_labels": 14, + "shape_arcs": 4, + "shape_probe_coverage": 12, + "shape_probe": 98, + "shape_groups": 6, + "shape_labels": 11, "shape_admission": 0, "phase_derive_shapes": 0, - "shape": 225, + "shape": 232, "phase_prune_and_rank": 0, - "bind": 77, - "phase_bind": 17, - "phase_settle": 5, + "bind": 91, + "phase_bind": 19, + "phase_settle": 8, "phase_place_bindings": 14, "phase_facet_requests": 0, - "materialise": 11, - "phase_materialise": 23, - "answer": 2, - "options": 9, - "phase_outcome": 68 + "materialise": 13, + "phase_materialise": 31, + "answer": 3, + "options": 78, + "phase_outcome": 64 } }, "restatement": { @@ -570,7 +571,7 @@ "label": "Creative Commons Attribution License" } }, - "coverage_stamp": "e6e717ab8c77e84d010915893ede5809e9ecec67929a07cfafbcc2210edfa1eb", + "coverage_stamp": "ad27fd11738abb03d2d84dc214e223f04781609636cf678d0d08c385fb863d99", "facets": { "provenance": { "basis": "fallback", @@ -1288,7 +1289,7 @@ } ], "query_qualifiers": [], - "capability_version": "cap_765c9d2a0c7529b9", + "capability_version": "cap_4913302d7a6b6435", "default_reading": { "applied": true, "removed_stat_vars": [] @@ -1298,6 +1299,7 @@ "available_at_place": true, "measure_label_axes": [], "measure_axis_values": [], + "published_tables": "World Bank International Debt Statistics (IDS)", "unit_conversion": { "currencies": [ { @@ -3273,18 +3275,18 @@ "variable_text": "price of tea", "warnings": [], "timing_ms": { - "total": 121, + "total": 1545, "by_step": { - "recall": 0, + "recall": 1436, "phase_resolve_places": 0, "phase_check_entities": 0, - "shape_arcs": 1, - "shape_probe": 96, + "shape_arcs": 3, + "shape_probe": 101, "shape_groups": 1, "shape_labels": 0, - "shape_admission": 0, + "shape_admission": 1, "phase_derive_shapes": 0, - "shape": 121, + "shape": 109, "phase_prune_and_rank": 0 } }, diff --git a/python/client-contract/src/dfo_client_contract/scenarios/choose-refused-unknown-status.json b/python/client-contract/src/dfo_client_contract/scenarios/choose-refused-unknown-status.json index 151f531..639b6a0 100644 --- a/python/client-contract/src/dfo_client_contract/scenarios/choose-refused-unknown-status.json +++ b/python/client-contract/src/dfo_client_contract/scenarios/choose-refused-unknown-status.json @@ -35,7 +35,7 @@ "status": 200, "headers": { "content-type": "application/json", - "x-dfo-trace-id": "44089cedfffd4c0ca025f3d8faba0ca7" + "x-dfo-trace-id": "0912e47dd13a455fb52bce86cfcffbe0" }, "json": { "schema_version": 1, @@ -46,21 +46,22 @@ "extract_skipped": false }, "diagnostics": { - "engine_build": "d80df9f5fd598b7345255470932d202ee5d49942", - "trace_id": "44089cedfffd4c0ca025f3d8faba0ca7", + "engine_build": "ccb6617922c839ce3cd5615a3bbb65c70bfe1bde", + "trace_id": "0912e47dd13a455fb52bce86cfcffbe0", "warnings": [], "timing_ms": { - "total": 2666, + "total": 2781, "by_step": { "coverage": 0, - "extract": 1154, + "extract": 994, + "exclusion_read": 654, "cache_lookup": 0 } }, "llm_usage": { - "input_tokens": 2239, - "output_tokens": 164, - "cached_tokens": 842, + "input_tokens": 2800, + "output_tokens": 173, + "cached_tokens": 0, "jev_input_tokens": 17398, "jev_output_tokens": 3500 }, @@ -72,30 +73,30 @@ "variable_text": "GDP", "warnings": [], "timing_ms": { - "total": 1283, + "total": 1308, "by_step": { "recall": 2, - "phase_resolve_places": 0, + "phase_resolve_places": 1, "phase_check_entities": 0, - "shape_arcs": 4, - "shape_probe_coverage": 5, - "shape_probe": 116, - "shape_groups": 64, + "shape_arcs": 2, + "shape_probe_coverage": 4, + "shape_probe": 125, + "shape_groups": 68, "shape_labels": 12, - "shape_admission": 1, + "shape_admission": 2, "phase_derive_shapes": 0, - "shape": 463, + "shape": 539, "phase_prune_and_rank": 0, - "bind": 125, - "phase_bind": 12, - "phase_settle": 6, - "phase_place_bindings": 10, + "bind": 124, + "phase_bind": 14, + "phase_settle": 10, + "phase_place_bindings": 8, "phase_facet_requests": 0, - "materialise": 173, + "materialise": 178, "phase_materialise": 18, - "answer": 207, - "options": 140, - "phase_outcome": 127 + "answer": 161, + "options": 134, + "phase_outcome": 119 } }, "entity_refs": [ @@ -1942,7 +1943,7 @@ "start_year": 2015, "end_year": 2015 }, - "capability_version": "cap_765c9d2a0c7529b9", + "capability_version": "cap_4913302d7a6b6435", "default_reading": { "applied": true, "removed_stat_vars": [ @@ -2861,7 +2862,7 @@ "start_year": 2015, "end_year": 2015 }, - "capability_version": "cap_765c9d2a0c7529b9", + "capability_version": "cap_4913302d7a6b6435", "default_reading": { "applied": true, "removed_stat_vars": [ @@ -2889,12 +2890,14 @@ "confidence": "high", "available_at_place": true, "measure_label_axes": [], - "measure_axis_values": [] + "measure_axis_values": [], + "published_tables": "IMF World Economic Outlook (WEO)" } } ], "measure_label_axes": [], "measure_axis_values": [], + "published_tables": "World Development Indicators", "related_group": { "ref": "dc/g/EconomicActivity_ActivitySource-GrossDomesticProduction", "label": "Economic Activity With Activity Source = Gross Domestic Production" @@ -2964,24 +2967,24 @@ "variable_text": "ODA", "warnings": [], "timing_ms": { - "total": 598, + "total": 1498, "by_step": { - "recall": 301, + "recall": 1140, "phase_resolve_places": 0, "phase_check_entities": 0, "shape_arcs": 2, - "shape_probe_coverage": 6, - "shape_probe": 99, - "shape_groups": 3, + "shape_probe_coverage": 13, + "shape_probe": 149, + "shape_groups": 4, "shape_labels": 0, - "shape_admission": 0, + "shape_admission": 1, "phase_derive_shapes": 0, - "shape": 189, + "shape": 247, "phase_prune_and_rank": 0, - "bind": 91, - "phase_bind": 3, - "phase_settle": 7, - "phase_place_bindings": 7 + "bind": 102, + "phase_bind": 2, + "phase_settle": 2, + "phase_place_bindings": 5 } }, "rendered_sentence": "Could not tell who is giving and who is receiving among \"G20\", \"Germany\", and \"India\". Put \"from\" or \"to\" before a name.", diff --git a/python/client-contract/src/dfo_client_contract/scenarios/fetch-frame-several-readings.json b/python/client-contract/src/dfo_client_contract/scenarios/fetch-frame-several-readings.json index 775f678..38f7ac8 100644 --- a/python/client-contract/src/dfo_client_contract/scenarios/fetch-frame-several-readings.json +++ b/python/client-contract/src/dfo_client_contract/scenarios/fetch-frame-several-readings.json @@ -34,7 +34,7 @@ "status": 200, "headers": { "content-type": "application/json", - "x-dfo-trace-id": "5e0f0d6a5a6442a38932b02d7f72ed6c" + "x-dfo-trace-id": "c58dd2d53f1d4340a3f1fcb4c72681c5" }, "json": { "schema_version": 1, @@ -42,23 +42,27 @@ "entry_path": "raw_text", "raw_query": "ODA disbursements for health and for education from Germany to Kenya, and GDP of Kenya", "normalized_query": "ODA disbursements for health and for education from Germany to Kenya, and GDP of Kenya", - "extract_skipped": true + "extract_skipped": false }, "diagnostics": { - "engine_build": "d80df9f5fd598b7345255470932d202ee5d49942", - "trace_id": "5e0f0d6a5a6442a38932b02d7f72ed6c", + "engine_build": "ccb6617922c839ce3cd5615a3bbb65c70bfe1bde", + "trace_id": "c58dd2d53f1d4340a3f1fcb4c72681c5", "warnings": [], "timing_ms": { - "total": 8, + "total": 6877, "by_step": { "coverage": 0, - "response_cache_layer1": 1 + "extract": 1225, + "exclusion_read": 636, + "cache_lookup": 0 } }, "llm_usage": { - "input_tokens": 0, - "output_tokens": 0, - "cached_tokens": 0 + "input_tokens": 2796, + "output_tokens": 224, + "cached_tokens": 0, + "jev_input_tokens": 25826, + "jev_output_tokens": 5796 }, "timed_out": false }, @@ -68,30 +72,30 @@ "variable_text": "health ODA disbursements", "warnings": [], "timing_ms": { - "total": 4401, + "total": 4245, "by_step": { - "recall": 1271, + "recall": 1975, "phase_resolve_places": 0, "phase_check_entities": 0, - "shape_arcs": 108, - "shape_probe_coverage": 4, - "shape_probe": 113, - "shape_groups": 72, - "shape_labels": 12, - "shape_admission": 0, + "shape_arcs": 1, + "shape_probe_coverage": 5, + "shape_probe": 116, + "shape_groups": 62, + "shape_labels": 11, + "shape_admission": 1, "phase_derive_shapes": 0, - "shape": 524, + "shape": 280, "phase_prune_and_rank": 0, - "bind": 482, - "phase_bind": 205, - "phase_settle": 57, - "phase_place_bindings": 34, + "bind": 227, + "phase_bind": 195, + "phase_settle": 82, + "phase_place_bindings": 31, "phase_facet_requests": 0, - "materialise": 686, - "phase_materialise": 225, - "answer": 28, - "options": 685, - "phase_outcome": 204 + "materialise": 858, + "phase_materialise": 171, + "answer": 78, + "options": 214, + "phase_outcome": 134 } }, "restatement": { @@ -128,10 +132,10 @@ "assumptions": [], "status": "definite", "spec": { - "spec_id": "spec_25f482395c5d012ec278118f38dff29c", + "spec_id": "spec_7a02b6facd2dc17b5d0d7c35c11bf5d2", "definition": { "schema_version": 1, - "spec_id": "spec_25f482395c5d012ec278118f38dff29c", + "spec_id": "spec_7a02b6facd2dc17b5d0d7c35c11bf5d2", "identity": { "identity_version": "spec1", "shape": { @@ -154,7 +158,8 @@ "state": "set", "refs": [ "CRSPurposeCode110", - "CRSPurposeCode120" + "CRSPurposeCode120", + "CRSPurposeCode130" ] } }, @@ -202,7 +207,7 @@ "resolved": { "shape": { "shape_id": "financialflow_amount_measuredvalue_nominal", - "label": "gross disbursements (official development assistance)", + "label": "gross disbursements (education, health and population policy, programme, and reproductive health, official development assistance)", "population_type": { "ref": "FinancialFlow", "label": "financial flow" @@ -282,8 +287,8 @@ "label": "data source" } ], - "member_count": 545, - "member_digest": "0c7508fd1997d6cdc896f2eab0f092a4915cfca9e2400eb9577bb22b527fe882", + "member_count": 634, + "member_digest": "5c91c0a8d90f4619a1ff7122cacdc8b0bc48b22c70516d7673aec42caf6da0d4", "refine_supported": true, "data_commons": [ { @@ -318,6 +323,13 @@ "label": "health" }, "value_kind": "enum_value" + }, + { + "ref": { + "ref": "CRSPurposeCode130", + "label": "population policy, programme, and reproductive health" + }, + "value_kind": "enum_value" } ] }, @@ -410,6 +422,26 @@ { "ref": "CRSPurposeCode12382", "label": "research for noncommunicable disease prevention and control" + }, + { + "ref": "CRSPurposeCode13010", + "label": "population policy and administrative management" + }, + { + "ref": "CRSPurposeCode13020", + "label": "reproductive health care" + }, + { + "ref": "CRSPurposeCode13030", + "label": "family planning" + }, + { + "ref": "CRSPurposeCode13040", + "label": "sexually transmitted disease control" + }, + { + "ref": "CRSPurposeCode13081", + "label": "personnel development for population and reproductive health" } ] }, @@ -549,9 +581,9 @@ ], "unresolved_slots": [], "stat_vars": { - "member_count": 108, + "member_count": 123, "member_count_exact": true, - "served_count": 545, + "served_count": 634, "data_date_range": { "start": "1997", "end": "2024" @@ -581,15 +613,21 @@ }, { "label": "observations", - "count": 12 + "count": 19 }, { "label": "variables", - "count": 51 + "count": 66 } ] }, "facets": { + "unit": { + "basis": "fallback", + "ref": "CurrencyUSD", + "label": "US Dollar", + "currency": "USD" + }, "provenance": { "basis": "fallback", "ref": "provenance/OECDCreditorReportingSystem", @@ -604,12 +642,6 @@ }, "documentation": "/api/graph/documentation/provenance/OECDCreditorReportingSystem", "account": "provider" - }, - "unit": { - "basis": "fallback", - "ref": "CurrencyUSD", - "label": "US Dollar", - "currency": "USD" } }, "slot_options": [ @@ -626,45 +658,85 @@ { "value": { "ref": { - "ref": "CRSPurposeCode121", - "label": "general health" + "ref": "CRSPurposeCode998", + "label": "unallocated and unspecified" + }, + "value_kind": "enum_value" + }, + "relation": "root", + "member_count": 76, + "served_rows": 74, + "served_rows_exact": true + }, + { + "value": { + "ref": { + "ref": "CRSPurposeCode99810", + "label": "sectors not specified" }, "value_kind": "enum_value" }, "relation": "child", - "parent": "CRSPurposeCode120", - "member_count": 6, - "served_rows": 82, + "parent": "CRSPurposeCode998", + "member_count": 255, + "served_rows": 71, "served_rows_exact": true }, { "value": { "ref": { - "ref": "CRSPurposeCode122", - "label": "basic health" + "ref": "CRSPurposeCode99820", + "label": "non-sector allocable promotion of development awareness" }, "value_kind": "enum_value" }, "relation": "child", - "parent": "CRSPurposeCode120", - "member_count": 4, - "served_rows": 108, + "parent": "CRSPurposeCode998", + "member_count": 77, + "served_rows": 3, + "served_rows_exact": true + }, + { + "value": { + "ref": { + "ref": "CRSPurposeCode600", + "label": "action relating to debt" + }, + "value_kind": "enum_value" + }, + "relation": "root", + "member_count": 21, + "served_rows": 9, "served_rows_exact": true }, { "value": { "ref": { - "ref": "CRSPurposeCode123", - "label": "noncommunicable disease" + "ref": "CRSPurposeCode60020", + "label": "debt forgiveness" }, "value_kind": "enum_value" }, "relation": "child", - "parent": "CRSPurposeCode120", - "member_count": 3, + "parent": "CRSPurposeCode600", + "member_count": 75, "served_rows": 4, "served_rows_exact": true }, + { + "value": { + "ref": { + "ref": "CRSPurposeCode60040", + "label": "rescheduling and refinancing" + }, + "value_kind": "enum_value" + }, + "relation": "child", + "parent": "CRSPurposeCode600", + "member_count": 54, + "served_rows": 5, + "served_rows_exact": true + }, { "value": { "ref": { @@ -673,7 +745,7 @@ }, "value_kind": "enum_value" }, - "relation": "parent", + "relation": "root", "member_count": 13, "served_rows": 1214, "served_rows_exact": true @@ -681,360 +753,760 @@ { "value": { "ref": { - "ref": "CRSPurposeCode111", - "label": "unspecified-level education" + "ref": "CRSPurposeCode140", + "label": "water supply and sanitation" }, "value_kind": "enum_value" }, "relation": "child", - "parent": "CRSPurposeCode110", - "member_count": 6, - "served_rows": 78, + "parent": "CRSPurposeCode100", + "member_count": 10, + "served_rows": 275, "served_rows_exact": true }, { "value": { "ref": { - "ref": "CRSPurposeCode112", - "label": "basic education" + "ref": "CRSPurposeCode110", + "label": "education" }, "value_kind": "enum_value" }, "relation": "child", - "parent": "CRSPurposeCode110", + "parent": "CRSPurposeCode100", + "member_count": 9, + "served_rows": 318, + "served_rows_exact": true + }, + { + "value": { + "ref": { + "ref": "CRSPurposeCode160", + "label": "other social infrastructure and services" + }, + "value_kind": "enum_value" + }, + "relation": "child", + "parent": "CRSPurposeCode100", + "member_count": 7, + "served_rows": 102, + "served_rows_exact": true + }, + { + "value": { + "ref": { + "ref": "CRSPurposeCode120", + "label": "health" + }, + "value_kind": "enum_value" + }, + "relation": "child", + "parent": "CRSPurposeCode100", "member_count": 6, - "served_rows": 77, + "served_rows": 194, "served_rows_exact": true }, { "value": { "ref": { - "ref": "CRSPurposeCode113", - "label": "upper secondary education" + "ref": "CRSPurposeCode130", + "label": "population policy, programme, and reproductive health" }, "value_kind": "enum_value" }, "relation": "child", - "parent": "CRSPurposeCode110", + "parent": "CRSPurposeCode100", "member_count": 5, - "served_rows": 69, + "served_rows": 81, "served_rows_exact": true }, { "value": { "ref": { - "ref": "CRSPurposeCode114", - "label": "post-secondary education" + "ref": "CRSPurposeCode150", + "label": "government and civil society" }, "value_kind": "enum_value" }, "relation": "child", - "parent": "CRSPurposeCode110", + "parent": "CRSPurposeCode100", "member_count": 4, - "served_rows": 94, + "served_rows": 244, "served_rows_exact": true - } - ], - "truncated": false, - "source": "observed" - }, - { - "key": { - "axis": "how", - "property": { - "ref": "crsTypeOfFinance", - "label": "CRS type of finance" }, - "label": "instrument" - }, - "options": [ { "value": { "ref": { - "ref": "CRSTypeOfFinance100", - "label": "grant" + "ref": "CRSPurposeCode200", + "label": "economic infrastructure and services" }, "value_kind": "enum_value" }, "relation": "root", - "member_count": 0, - "served_rows": 501, + "member_count": 13, + "served_rows": 286, "served_rows_exact": true }, { "value": { "ref": { - "ref": "CRSTypeOfFinance110", - "label": "standard grant" + "ref": "CRSPurposeCode240", + "label": "banking and financial services" }, "value_kind": "enum_value" }, "relation": "child", - "parent": "CRSTypeOfFinance100", - "member_count": 12672, - "served_rows": 501, + "parent": "CRSPurposeCode200", + "member_count": 16, + "served_rows": 30, "served_rows_exact": true }, { "value": { "ref": { - "ref": "CRSTypeOfFinance420", - "label": "debt instrument" + "ref": "CRSPurposeCode220", + "label": "communication system and technology" }, "value_kind": "enum_value" }, - "relation": "root", - "member_count": 0, - "served_rows": 11, + "relation": "child", + "parent": "CRSPurposeCode200", + "member_count": 13, + "served_rows": 23, "served_rows_exact": true }, { "value": { "ref": { - "ref": "CRSTypeOfFinance421", - "label": "standard loan" + "ref": "CRSPurposeCode250", + "label": "business environment and governance" }, "value_kind": "enum_value" }, "relation": "child", - "parent": "CRSTypeOfFinance420", - "member_count": 4620, - "served_rows": 11, + "parent": "CRSPurposeCode200", + "member_count": 13, + "served_rows": 30, "served_rows_exact": true - } - ], - "truncated": false, - "source": "observed" - }, - { - "key": { - "axis": "how", - "property": { - "ref": "crsTypeOfFlow", - "label": "CRS type of flow" }, - "label": "flow" - }, - "options": [ { "value": { "ref": { - "ref": "CRSTypeOfFlow10", - "label": "official development assistance" + "ref": "CRSPurposeCode210", + "label": "transport and storage" }, "value_kind": "enum_value" }, - "relation": "root", - "member_count": 14098, - "served_rows": 512, + "relation": "child", + "parent": "CRSPurposeCode200", + "member_count": 7, + "served_rows": 97, "served_rows_exact": true - } - ], - "truncated": false, - "source": "observed" - }, - { - "key": { - "axis": "how", - "property": { - "ref": "crsCooperationModality", - "label": "CRS cooperation modality" }, - "label": "modality" - }, - "options": [ { "value": { "ref": { - "ref": "CRSCooperationModalityB", - "label": "core contribution and pooled programme and fund" + "ref": "CRSPurposeCode230", + "label": "energy" }, "value_kind": "enum_value" }, - "relation": "root", - "member_count": 0, - "served_rows": 104, + "relation": "child", + "parent": "CRSPurposeCode200", + "member_count": 7, + "served_rows": 106, "served_rows_exact": true }, { "value": { "ref": { - "ref": "CRSCooperationModalityB03", - "label": "contribution to specific-purpose programme and fund managed by an international organisation" + "ref": "CRSPurposeCode300", + "label": "productive sector" }, "value_kind": "enum_value" }, - "relation": "child", - "parent": "CRSCooperationModalityB", - "member_count": 1606, - "served_rows": 21, + "relation": "root", + "member_count": 13, + "served_rows": 493, "served_rows_exact": true }, { "value": { "ref": { - "ref": "CRSCooperationModalityB01", - "label": "core support to non-governmental organisations, other private bodies, public-private partnerships, and research institutes" + "ref": "CRSPurposeCode310", + "label": "agriculture, forestry and fishing" }, "value_kind": "enum_value" }, "relation": "child", - "parent": "CRSCooperationModalityB", - "member_count": 1331, - "served_rows": 83, + "parent": "CRSPurposeCode300", + "member_count": 12, + "served_rows": 405, "served_rows_exact": true }, { "value": { "ref": { - "ref": "CRSCooperationModalityC", - "label": "project-type intervention (group)" + "ref": "CRSPurposeCode320", + "label": "industry, mining and construction" }, "value_kind": "enum_value" }, - "relation": "root", - "member_count": 0, - "served_rows": 136, + "relation": "child", + "parent": "CRSPurposeCode300", + "member_count": 9, + "served_rows": 66, "served_rows_exact": true }, { "value": { "ref": { - "ref": "CRSCooperationModalityC01", - "label": "project-type intervention" + "ref": "CRSPurposeCode331", + "label": "trade policies and regulations" }, "value_kind": "enum_value" }, "relation": "child", - "parent": "CRSCooperationModalityC", - "member_count": 7005, - "served_rows": 136, + "parent": "CRSPurposeCode300", + "member_count": 7, + "served_rows": 22, "served_rows_exact": true }, { "value": { "ref": { - "ref": "CRSCooperationModalityD", - "label": "expert and other technical assistance" + "ref": "CRSPurposeCode400", + "label": "multisector" }, "value_kind": "enum_value" }, "relation": "root", - "member_count": 0, - "served_rows": 111, + "member_count": 7, + "served_rows": 206, "served_rows_exact": true }, { "value": { "ref": { - "ref": "CRSCooperationModalityD02", - "label": "other technical assistance" + "ref": "CRSPurposeCode430", + "label": "other multisector" }, "value_kind": "enum_value" }, "relation": "child", - "parent": "CRSCooperationModalityD", - "member_count": 1600, - "served_rows": 84, + "parent": "CRSPurposeCode400", + "member_count": 10, + "served_rows": 162, "served_rows_exact": true }, { "value": { "ref": { - "ref": "CRSCooperationModalityD01", - "label": "donor country personnel" + "ref": "CRSPurposeCode410", + "label": "general environment protection" }, "value_kind": "enum_value" }, "relation": "child", - "parent": "CRSCooperationModalityD", - "member_count": 976, - "served_rows": 27, + "parent": "CRSPurposeCode400", + "member_count": 7, + "served_rows": 44, "served_rows_exact": true }, { "value": { "ref": { - "ref": "CRSCooperationModalityE", - "label": "scholarship and student cost in donor country" + "ref": "CRSPurposeCode500", + "label": "commodity aid and general programme assistance" }, "value_kind": "enum_value" }, "relation": "root", - "member_count": 0, - "served_rows": 38, + "member_count": 5, + "served_rows": 70, "served_rows_exact": true }, { "value": { "ref": { - "ref": "CRSCooperationModalityE01", - "label": "scholarship and training in donor country" + "ref": "CRSPurposeCode510", + "label": "budget support" }, "value_kind": "enum_value" }, "relation": "child", - "parent": "CRSCooperationModalityE", - "member_count": 819, - "served_rows": 19, + "parent": "CRSPurposeCode500", + "member_count": 3, + "served_rows": 10, "served_rows_exact": true }, { "value": { "ref": { - "ref": "CRSCooperationModalityE02", - "label": "imputed student cost" + "ref": "CRSPurposeCode520", + "label": "food assistance" }, "value_kind": "enum_value" }, "relation": "child", - "parent": "CRSCooperationModalityE", - "member_count": 315, + "parent": "CRSPurposeCode500", + "member_count": 3, "served_rows": 19, "served_rows_exact": true - } - ], - "truncated": false, - "source": "observed" - } - ], - "entity_options": [], - "facet_options": [ - { - "axis": "provenance", - "options": [ + }, { "value": { "ref": { - "ref": "provenance/OECDCreditorReportingSystem", - "label": "OECD Creditor Reporting System (CRS)" + "ref": "CRSPurposeCode530", + "label": "other commodity assistance" }, - "value_kind": "source" - } - } - ], - "truncated": false, - "source": "observed" - }, - { - "axis": "unit", - "options": [ + "value_kind": "enum_value" + }, + "relation": "child", + "parent": "CRSPurposeCode500", + "member_count": 3, + "served_rows": 41, + "served_rows_exact": true + }, { "value": { "ref": { - "ref": "CurrencyUSD", - "label": "US Dollar" + "ref": "CRSPurposeCode700", + "label": "humanitarian aid" }, "value_kind": "enum_value" - } - } - ], - "truncated": false, - "source": "observed" - } - ], - "rendered_sentence": "Germany's gross ODA disbursements to Kenya for education and health, 1997 to 2024. Current US dollars · OECD Creditor Reporting System (CRS).", - "sentence_plan": [ + }, + "relation": "root", + "member_count": 5, + "served_rows": 68, + "served_rows_exact": true + }, + { + "value": { + "ref": { + "ref": "CRSPurposeCode720", + "label": "emergency response" + }, + "value_kind": "enum_value" + }, + "relation": "child", + "parent": "CRSPurposeCode700", + "member_count": 6, + "served_rows": 46, + "served_rows_exact": true + }, + { + "value": { + "ref": { + "ref": "CRSPurposeCode730", + "label": "reconstruction and rehabilitation" + }, + "value_kind": "enum_value" + }, + "relation": "child", + "parent": "CRSPurposeCode700", + "member_count": 3, + "served_rows": 14, + "served_rows_exact": true + }, + { + "value": { + "ref": { + "ref": "CRSPurposeCode740", + "label": "disaster preparedness" + }, + "value_kind": "enum_value" + }, + "relation": "child", + "parent": "CRSPurposeCode700", + "member_count": 0, + "served_rows": 8, + "served_rows_exact": true + }, + { + "value": { + "ref": { + "ref": "CRSPurposeCode930", + "label": "support for refugees and asylum seekers in donor countries" + }, + "value_kind": "enum_value" + }, + "relation": "root", + "member_count": 3, + "served_rows": 6, + "served_rows_exact": true + }, + { + "value": { + "ref": { + "ref": "CRSPurposeCode93010", + "label": "general support for refugees and asylum seekers in donor countries" + }, + "value_kind": "enum_value" + }, + "relation": "child", + "parent": "CRSPurposeCode930", + "member_count": 57, + "served_rows": 6, + "served_rows_exact": true + }, + { + "value": { + "ref": { + "ref": "CRSPurposeCode111", + "label": "unspecified-level education" + }, + "value_kind": "enum_value" + }, + "relation": "child", + "parent": "CRSPurposeCode110", + "member_count": 6, + "served_rows": 78, + "served_rows_exact": true + }, + { + "value": { + "ref": { + "ref": "CRSPurposeCode112", + "label": "basic education" + }, + "value_kind": "enum_value" + }, + "relation": "child", + "parent": "CRSPurposeCode110", + "member_count": 6, + "served_rows": 77, + "served_rows_exact": true + }, + { + "value": { + "ref": { + "ref": "CRSPurposeCode113", + "label": "upper secondary education" + }, + "value_kind": "enum_value" + }, + "relation": "child", + "parent": "CRSPurposeCode110", + "member_count": 5, + "served_rows": 69, + "served_rows_exact": true + }, + { + "value": { + "ref": { + "ref": "CRSPurposeCode114", + "label": "post-secondary education" + }, + "value_kind": "enum_value" + }, + "relation": "child", + "parent": "CRSPurposeCode110", + "member_count": 4, + "served_rows": 94, + "served_rows_exact": true + } + ], + "truncated": false, + "source": "observed" + }, + { + "key": { + "axis": "how", + "property": { + "ref": "crsTypeOfFinance", + "label": "CRS type of finance" + }, + "label": "instrument" + }, + "options": [ + { + "value": { + "ref": { + "ref": "CRSTypeOfFinance100", + "label": "grant" + }, + "value_kind": "enum_value" + }, + "relation": "root", + "member_count": 0, + "served_rows": 582, + "served_rows_exact": true + }, + { + "value": { + "ref": { + "ref": "CRSTypeOfFinance110", + "label": "standard grant" + }, + "value_kind": "enum_value" + }, + "relation": "child", + "parent": "CRSTypeOfFinance100", + "member_count": 12745, + "served_rows": 582, + "served_rows_exact": true + }, + { + "value": { + "ref": { + "ref": "CRSTypeOfFinance420", + "label": "debt instrument" + }, + "value_kind": "enum_value" + }, + "relation": "root", + "member_count": 0, + "served_rows": 11, + "served_rows_exact": true + }, + { + "value": { + "ref": { + "ref": "CRSTypeOfFinance421", + "label": "standard loan" + }, + "value_kind": "enum_value" + }, + "relation": "child", + "parent": "CRSTypeOfFinance420", + "member_count": 4620, + "served_rows": 11, + "served_rows_exact": true + } + ], + "truncated": false, + "source": "observed" + }, + { + "key": { + "axis": "how", + "property": { + "ref": "crsTypeOfFlow", + "label": "CRS type of flow" + }, + "label": "flow" + }, + "options": [ + { + "value": { + "ref": { + "ref": "CRSTypeOfFlow10", + "label": "official development assistance" + }, + "value_kind": "enum_value" + }, + "relation": "root", + "member_count": 14146, + "served_rows": 593, + "served_rows_exact": true + } + ], + "truncated": false, + "source": "observed" + }, + { + "key": { + "axis": "how", + "property": { + "ref": "crsCooperationModality", + "label": "CRS cooperation modality" + }, + "label": "modality" + }, + "options": [ + { + "value": { + "ref": { + "ref": "CRSCooperationModalityB", + "label": "core contribution and pooled programme and fund" + }, + "value_kind": "enum_value" + }, + "relation": "root", + "member_count": 0, + "served_rows": 118, + "served_rows_exact": true + }, + { + "value": { + "ref": { + "ref": "CRSCooperationModalityB03", + "label": "contribution to specific-purpose programme and fund managed by an international organisation" + }, + "value_kind": "enum_value" + }, + "relation": "child", + "parent": "CRSCooperationModalityB", + "member_count": 1614, + "served_rows": 25, + "served_rows_exact": true + }, + { + "value": { + "ref": { + "ref": "CRSCooperationModalityB01", + "label": "core support to non-governmental organisations, other private bodies, public-private partnerships, and research institutes" + }, + "value_kind": "enum_value" + }, + "relation": "child", + "parent": "CRSCooperationModalityB", + "member_count": 1337, + "served_rows": 93, + "served_rows_exact": true + }, + { + "value": { + "ref": { + "ref": "CRSCooperationModalityC", + "label": "project-type intervention (group)" + }, + "value_kind": "enum_value" + }, + "relation": "root", + "member_count": 0, + "served_rows": 173, + "served_rows_exact": true + }, + { + "value": { + "ref": { + "ref": "CRSCooperationModalityC01", + "label": "project-type intervention" + }, + "value_kind": "enum_value" + }, + "relation": "child", + "parent": "CRSCooperationModalityC", + "member_count": 7041, + "served_rows": 173, + "served_rows_exact": true + }, + { + "value": { + "ref": { + "ref": "CRSCooperationModalityD", + "label": "expert and other technical assistance" + }, + "value_kind": "enum_value" + }, + "relation": "root", + "member_count": 0, + "served_rows": 116, + "served_rows_exact": true + }, + { + "value": { + "ref": { + "ref": "CRSCooperationModalityD02", + "label": "other technical assistance" + }, + "value_kind": "enum_value" + }, + "relation": "child", + "parent": "CRSCooperationModalityD", + "member_count": 1600, + "served_rows": 87, + "served_rows_exact": true + }, + { + "value": { + "ref": { + "ref": "CRSCooperationModalityD01", + "label": "donor country personnel" + }, + "value_kind": "enum_value" + }, + "relation": "child", + "parent": "CRSCooperationModalityD", + "member_count": 980, + "served_rows": 29, + "served_rows_exact": true + }, + { + "value": { + "ref": { + "ref": "CRSCooperationModalityE", + "label": "scholarship and student cost in donor country" + }, + "value_kind": "enum_value" + }, + "relation": "root", + "member_count": 0, + "served_rows": 38, + "served_rows_exact": true + }, + { + "value": { + "ref": { + "ref": "CRSCooperationModalityE01", + "label": "scholarship and training in donor country" + }, + "value_kind": "enum_value" + }, + "relation": "child", + "parent": "CRSCooperationModalityE", + "member_count": 819, + "served_rows": 19, + "served_rows_exact": true + }, + { + "value": { + "ref": { + "ref": "CRSCooperationModalityE02", + "label": "imputed student cost" + }, + "value_kind": "enum_value" + }, + "relation": "child", + "parent": "CRSCooperationModalityE", + "member_count": 315, + "served_rows": 19, + "served_rows_exact": true + } + ], + "truncated": false, + "source": "observed" + } + ], + "entity_options": [], + "facet_options": [ + { + "axis": "provenance", + "options": [ + { + "value": { + "ref": { + "ref": "provenance/OECDCreditorReportingSystem", + "label": "OECD Creditor Reporting System (CRS)" + }, + "value_kind": "source" + } + } + ], + "truncated": false, + "source": "observed" + }, + { + "axis": "unit", + "options": [ + { + "value": { + "ref": { + "ref": "CurrencyUSD", + "label": "US Dollar" + }, + "value_kind": "enum_value" + } + } + ], + "truncated": false, + "source": "observed" + } + ], + "rendered_sentence": "Germany's gross ODA disbursements to Kenya for education, health, and population policy, programme, and reproductive health, 1997 to 2024. Current US dollars · OECD Creditor Reporting System (CRS).", + "sentence_plan": [ { "kind": "slot", "text": "Germany", @@ -1106,7 +1578,7 @@ }, { "kind": "slot", - "text": "education and health", + "text": "education, health, and population policy, programme, and reproductive health", "axis": "how", "segment": "heading", "property_dcid": "crsPurpose", @@ -1280,6 +1752,10 @@ { "ref": "CRSPurposeCode120", "label": "health" + }, + { + "ref": "CRSPurposeCode130", + "label": "population policy, programme, and reproductive health" } ], "provenance": "text_recognized" @@ -1330,331 +1806,118 @@ "ref": "Disbursement", "label": "disbursement" } - ], - "provenance": "text_recognized" - }, - { - "key": { - "axis": "how", - "property": { - "ref": "nettingBasis", - "label": "netting basis" - }, - "label": "netting basis" - }, - "binding_kind": "value", - "refs": [ - { - "ref": "Gross", - "label": "gross" - } - ], - "provenance": "measure_elected" - }, - { - "key": { - "axis": "how", - "property": { - "ref": "crsCooperationModality", - "label": "CRS cooperation modality" - }, - "label": "modality" - }, - "binding_kind": "unbound", - "refs": [], - "provenance": "binder" - }, - { - "key": { - "axis": "where", - "label": "place" - }, - "binding_kind": "value", - "refs": [ - { - "ref": "country/KEN", - "label": "Kenya" - } - ], - "provenance": "binder" - }, - { - "key": { - "axis": "when", - "label": "time window" - }, - "binding_kind": "unbound", - "refs": [], - "provenance": "binder" - }, - { - "key": { - "axis": "source", - "label": "data source" - }, - "binding_kind": "unbound", - "refs": [], - "provenance": "binder" - } - ], - "query_qualifiers": [ - { - "text": "health", - "named": [ - { - "ref": "CRSPurposeCode120", - "label": "health" - } - ], - "slot": "crsPurpose", - "disposition": "bound", - "selected": [] - }, - { - "text": "ODA", - "named": [ - { - "ref": "CRSTypeOfFlow10", - "label": "official development assistance" - } - ], - "slot": "crsTypeOfFlow", - "disposition": "bound", - "selected": [] - }, - { - "text": "education", - "named": [ - { - "ref": "CRSPurposeCode110", - "label": "education" - } - ], - "slot": "crsPurpose", - "disposition": "bound", - "selected": [] - } - ], - "capability_version": "cap_765c9d2a0c7529b9", - "default_reading": { - "applied": true, - "removed_stat_vars": [] - } - }, - "alternative_measures": [ - { - "definition": { - "schema_version": 1, - "spec_id": "spec_b438dc000255d174bcc13eb675e603f7", - "identity": { - "identity_version": "spec1", - "shape": { - "kind": "statvar_schema", - "population_type": "FinancialFlow", - "measured_property": "amount", - "stat_type": "measuredValue", - "measurement_qualifier": "Nominal" - }, - "slots": [ - { - "property": "crsCooperationModality", - "binding": { - "state": "unbound" - } - }, - { - "property": "crsPurpose", - "binding": { - "state": "set", - "refs": [ - "CRSPurposeCode110", - "CRSPurposeCode120" - ] - } - }, - { - "property": "crsTypeOfFinance", - "binding": { - "state": "unbound" - } - }, - { - "property": "crsTypeOfFlow", - "binding": { - "state": "value", - "ref": "CRSTypeOfFlow10" - } - }, - { - "property": "financialFlowType", - "binding": { - "state": "value", - "ref": "Disbursement" - } - }, - { - "property": "nettingBasis", - "binding": { - "state": "value", - "ref": "Net" - } - } - ], - "entities": { - "destination": [ - "country/KEN" - ], - "origin": [ - "country/DEU" - ] - }, - "requested_window": { - "kind": "all" - } - } - }, - "label": "net disbursements", - "axis": "what", - "measure_axis_values": [ - { - "axis": "populationType", - "value": { - "ref": "FinancialFlow", - "label": "financial flow" - } - }, - { - "axis": "measuredProperty", - "value": { - "ref": "amount", - "label": "amount" - } - }, - { - "axis": "measurementQualifier", - "value": { - "ref": "Nominal", - "label": "nominal" - } - }, - { - "axis": "financialFlowType", - "value": { - "ref": "Disbursement", - "label": "disbursement" - } - }, - { - "axis": "nettingBasis", - "value": { - "ref": "Net", - "label": "net" - } - } - ], - "served_rows": 512, - "served_rows_exact": true - }, - { - "definition": { - "schema_version": 1, - "spec_id": "spec_e348565295de394da8ddaa23ec5fa475", - "identity": { - "identity_version": "spec1", - "shape": { - "kind": "statvar_schema", - "population_type": "FinancialObligation", - "measured_property": "amount", - "stat_type": "measuredValue", - "measurement_qualifier": "Nominal" - }, - "slots": [ - { - "property": "crsCooperationModality", - "binding": { - "state": "unbound" - } - }, - { - "property": "crsPurpose", - "binding": { - "state": "set", - "refs": [ - "CRSPurposeCode110", - "CRSPurposeCode120" - ] - } - }, - { - "property": "crsTypeOfFinance", - "binding": { - "state": "unbound" - } - }, - { - "property": "crsTypeOfFlow", - "binding": { - "state": "value", - "ref": "CRSTypeOfFlow10" - } - }, - { - "property": "financialObligationType", - "binding": { - "state": "value", - "ref": "Commitment" - } - } - ], - "entities": { - "destination": [ - "country/KEN" - ], - "origin": [ - "country/DEU" - ] - }, - "requested_window": { - "kind": "all" - } - } + ], + "provenance": "text_recognized" }, - "label": "commitments", - "axis": "what", - "measure_axis_values": [ - { - "axis": "populationType", - "value": { - "ref": "FinancialObligation", - "label": "financial obligation" - } + { + "key": { + "axis": "how", + "property": { + "ref": "nettingBasis", + "label": "netting basis" + }, + "label": "netting basis" }, - { - "axis": "measuredProperty", - "value": { - "ref": "amount", - "label": "amount" + "binding_kind": "value", + "refs": [ + { + "ref": "Gross", + "label": "gross" } + ], + "provenance": "measure_elected" + }, + { + "key": { + "axis": "how", + "property": { + "ref": "crsCooperationModality", + "label": "CRS cooperation modality" + }, + "label": "modality" }, - { - "axis": "measurementQualifier", - "value": { - "ref": "Nominal", - "label": "nominal" + "binding_kind": "unbound", + "refs": [], + "provenance": "binder" + }, + { + "key": { + "axis": "where", + "label": "place" + }, + "binding_kind": "value", + "refs": [ + { + "ref": "country/KEN", + "label": "Kenya" } + ], + "provenance": "binder" + }, + { + "key": { + "axis": "when", + "label": "time window" }, - { - "axis": "financialObligationType", - "value": { - "ref": "Commitment", - "label": "commitment" + "binding_kind": "unbound", + "refs": [], + "provenance": "binder" + }, + { + "key": { + "axis": "source", + "label": "data source" + }, + "binding_kind": "unbound", + "refs": [], + "provenance": "binder" + } + ], + "query_qualifiers": [ + { + "text": "health", + "named": [ + { + "ref": "CRSPurposeCode120", + "label": "health" } - } - ], - "served_rows": 519, - "served_rows_exact": true + ], + "slot": "crsPurpose", + "disposition": "bound", + "selected": [] + }, + { + "text": "ODA", + "named": [ + { + "ref": "CRSTypeOfFlow10", + "label": "official development assistance" + } + ], + "slot": "crsTypeOfFlow", + "disposition": "bound", + "selected": [] + }, + { + "text": "education", + "named": [ + { + "ref": "CRSPurposeCode110", + "label": "education" + } + ], + "slot": "crsPurpose", + "disposition": "bound", + "selected": [] + } + ], + "capability_version": "cap_4913302d7a6b6435", + "default_reading": { + "applied": true, + "removed_stat_vars": [] } - ], + }, + "alternative_measures": [], "measure_label": "gross disbursements", "measure_label_axes": [ "populationType", @@ -1700,6 +1963,8 @@ } } ], + "concept_label": "education, health, and population policy, programme, and reproductive health", + "published_tables": "OECD Creditor Reporting System (CRS)", "open_axis_facts": [ { "property": "crsTypeOfFinance", @@ -1712,7 +1977,7 @@ "ref": "CRSTypeOfFinance110", "label": "standard grant" }, - "count": 105 + "count": 120 }, { "value": { @@ -1727,42 +1992,42 @@ "property": "crsCooperationModality", "varies": true, "distinct_count": 7, - "undeclared_count": 19, + "undeclared_count": 22, "values": [ { "value": { "ref": "CRSCooperationModalityC01", "label": "project-type intervention" }, - "count": 27 + "count": 30 }, { "value": { "ref": "CRSCooperationModalityB03", "label": "contribution to specific-purpose programme and fund managed by an international organisation" }, - "count": 21 + "count": 24 }, { "value": { - "ref": "CRSCooperationModalityD02", - "label": "other technical assistance" + "ref": "CRSCooperationModalityB01", + "label": "core support to non-governmental organisations, other private bodies, public-private partnerships, and research institutes" }, - "count": 16 + "count": 18 }, { "value": { - "ref": "CRSCooperationModalityB01", - "label": "core support to non-governmental organisations, other private bodies, public-private partnerships, and research institutes" + "ref": "CRSCooperationModalityD02", + "label": "other technical assistance" }, - "count": 15 + "count": 18 }, { "value": { "ref": "CRSCooperationModalityD01", "label": "donor country personnel" }, - "count": 8 + "count": 9 }, { "value": { @@ -3740,15 +4005,386 @@ "start_year": 1960, "end_year": 2025 }, - "base_year_min": 1980, - "base_year_max": 2025 - } - ], - "default_base_year": 2024, - "role_currencies": { - "destination": "KES", - "origin": "EUR" - } + "base_year_min": 1980, + "base_year_max": 2025 + } + ], + "default_base_year": 2024, + "role_currencies": { + "destination": "KES", + "origin": "EUR" + } + }, + "scope_choices": { + "id": "spec_7a02b6facd2dc17b5d0d7c35c11bf5d2", + "base": { + "schema_version": 1, + "spec_id": "spec_7a02b6facd2dc17b5d0d7c35c11bf5d2", + "identity": { + "identity_version": "spec1", + "shape": { + "kind": "statvar_schema", + "population_type": "FinancialFlow", + "measured_property": "amount", + "stat_type": "measuredValue", + "measurement_qualifier": "Nominal" + }, + "slots": [ + { + "property": "crsCooperationModality", + "binding": { + "state": "unbound" + } + }, + { + "property": "crsPurpose", + "binding": { + "state": "set", + "refs": [ + "CRSPurposeCode110", + "CRSPurposeCode120", + "CRSPurposeCode130" + ] + } + }, + { + "property": "crsTypeOfFinance", + "binding": { + "state": "unbound" + } + }, + { + "property": "crsTypeOfFlow", + "binding": { + "state": "value", + "ref": "CRSTypeOfFlow10" + } + }, + { + "property": "financialFlowType", + "binding": { + "state": "value", + "ref": "Disbursement" + } + }, + { + "property": "nettingBasis", + "binding": { + "state": "value", + "ref": "Gross" + } + } + ], + "entities": { + "destination": [ + "country/KEN" + ], + "origin": [ + "country/DEU" + ] + }, + "requested_window": { + "kind": "all" + } + } + }, + "rule_version": "scope1:3eef00a928eedd463ee48d02b79730da", + "entries": [], + "dropped_entries": [ + { + "entry": { + "axis": "sector", + "option_id": "sector:110", + "provenance": "explicit", + "origin": { + "kind": "text", + "text": "education", + "start": 0, + "end": 9 + } + }, + "code": "stated_choice_not_applied", + "cause": "option_unknown" + } + ], + "choices": [ + { + "id": "spec_7a02b6facd2dc17b5d0d7c35c11bf5d2:sector", + "axis": "sector", + "rule": "sector_code", + "provenance": "default", + "active": "sector:110+120+130", + "options": [ + { + "option_id": "sector:110+120+130", + "label": "education (CRS 110) + health (CRS 120) + population policy, programme, and reproductive health (CRS 130)", + "binding": { + "kind": "slot", + "slot": "crsPurpose", + "state": "set", + "refs": [ + "CRSPurposeCode110", + "CRSPurposeCode120", + "CRSPurposeCode130" + ] + }, + "availability": { + "status": "available", + "detail": {} + } + } + ] + }, + { + "id": "spec_7a02b6facd2dc17b5d0d7c35c11bf5d2:measure_basis", + "axis": "measure_basis", + "rule": "measure_basis_convention", + "provenance": "default", + "active": "measure_basis:gross", + "options": [ + { + "option_id": "measure_basis:gross", + "label": "gross disbursements, current USD", + "binding": { + "kind": "shape", + "measured_property": "amount", + "netting_basis": "Gross" + }, + "availability": { + "status": "available", + "detail": {} + } + }, + { + "option_id": "measure_basis:net", + "label": "net disbursements, current USD", + "binding": { + "kind": "shape", + "measured_property": "amount", + "netting_basis": "Net" + }, + "availability": { + "status": "available", + "detail": {} + } + }, + { + "option_id": "measure_basis:grant_equivalent", + "label": "grant equivalents (OECD headline), current USD", + "binding": { + "kind": "shape", + "measured_property": "grantEquivalent", + "netting_basis": null + }, + "availability": { + "status": "available", + "detail": {} + } + }, + { + "option_id": "measure_basis:commitments", + "label": "commitments, current USD", + "binding": { + "kind": "shape", + "measured_property": "amount", + "netting_basis": null + }, + "availability": { + "status": "available", + "detail": {} + } + } + ] + }, + { + "id": "spec_7a02b6facd2dc17b5d0d7c35c11bf5d2:provider", + "axis": "provider", + "rule": "bilateral_flows", + "provenance": "default", + "active": "provider:bilateral", + "options": [ + { + "option_id": "provider:bilateral", + "label": "bilateral flows only", + "binding": { + "kind": "provider", + "scope": "bilateral" + }, + "availability": { + "status": "available", + "detail": {} + } + }, + { + "option_id": "provider:inclusive", + "label": "bilateral plus imputed multilateral, 2011 to 2024", + "binding": { + "kind": "provider", + "scope": "inclusive", + "window": [ + 2011, + 2024 + ], + "provenance": "provenance/ONEBilateralAndImputedMultilateral" + }, + "availability": { + "status": "partial", + "years": [ + [ + 2011, + 2024 + ] + ], + "code": "imputed_coverage", + "detail": {} + } + } + ] + } + ], + "compiled": { + "spec_id": "spec_7a02b6facd2dc17b5d0d7c35c11bf5d2", + "identity": { + "identity_version": "spec1", + "shape": { + "kind": "statvar_schema", + "population_type": "FinancialFlow", + "measured_property": "amount", + "stat_type": "measuredValue", + "measurement_qualifier": "Nominal" + }, + "slots": [ + { + "property": "crsCooperationModality", + "binding": { + "state": "unbound" + } + }, + { + "property": "crsPurpose", + "binding": { + "state": "set", + "refs": [ + "CRSPurposeCode110", + "CRSPurposeCode120", + "CRSPurposeCode130" + ] + } + }, + { + "property": "crsTypeOfFinance", + "binding": { + "state": "unbound" + } + }, + { + "property": "crsTypeOfFlow", + "binding": { + "state": "value", + "ref": "CRSTypeOfFlow10" + } + }, + { + "property": "financialFlowType", + "binding": { + "state": "value", + "ref": "Disbursement" + } + }, + { + "property": "nettingBasis", + "binding": { + "state": "value", + "ref": "Gross" + } + } + ], + "entities": { + "destination": [ + "country/KEN" + ], + "origin": [ + "country/DEU" + ] + }, + "requested_window": { + "kind": "all" + } + }, + "components": [ + { + "role": "whole", + "identity": { + "identity_version": "spec1", + "shape": { + "kind": "statvar_schema", + "population_type": "FinancialFlow", + "measured_property": "amount", + "stat_type": "measuredValue", + "measurement_qualifier": "Nominal" + }, + "slots": [ + { + "property": "crsCooperationModality", + "binding": { + "state": "unbound" + } + }, + { + "property": "crsPurpose", + "binding": { + "state": "set", + "refs": [ + "CRSPurposeCode110", + "CRSPurposeCode120", + "CRSPurposeCode130" + ] + } + }, + { + "property": "crsTypeOfFinance", + "binding": { + "state": "unbound" + } + }, + { + "property": "crsTypeOfFlow", + "binding": { + "state": "value", + "ref": "CRSTypeOfFlow10" + } + }, + { + "property": "financialFlowType", + "binding": { + "state": "value", + "ref": "Disbursement" + } + }, + { + "property": "nettingBasis", + "binding": { + "state": "value", + "ref": "Gross" + } + } + ], + "entities": { + "destination": [ + "country/KEN" + ], + "origin": [ + "country/DEU" + ] + }, + "requested_window": { + "kind": "all" + } + } + } + ] + }, + "ledger": [] } } } @@ -3763,30 +4399,30 @@ } ], "timing_ms": { - "total": 4561, + "total": 5452, "by_step": { - "recall": 1310, + "recall": 2999, "phase_resolve_places": 0, "phase_check_entities": 0, - "shape_arcs": 117, - "shape_probe_coverage": 28, - "shape_probe": 126, - "shape_groups": 83, + "shape_arcs": 1, + "shape_probe_coverage": 46, + "shape_probe": 144, + "shape_groups": 96, "shape_labels": 12, "shape_admission": 1, "phase_derive_shapes": 0, - "shape": 753, + "shape": 450, "phase_prune_and_rank": 0, - "bind": 309, - "phase_bind": 209, - "phase_settle": 82, + "bind": 646, + "phase_bind": 157, + "phase_settle": 101, "phase_place_bindings": 25, "phase_facet_requests": 0, - "materialise": 1061, - "phase_materialise": 233, - "answer": 29, - "options": 385, - "phase_outcome": 165 + "materialise": 602, + "phase_materialise": 196, + "answer": 45, + "options": 138, + "phase_outcome": 93 } }, "restatement": { @@ -3823,10 +4459,10 @@ "assumptions": [], "status": "definite", "spec": { - "spec_id": "spec_25f482395c5d012ec278118f38dff29c", + "spec_id": "spec_7a02b6facd2dc17b5d0d7c35c11bf5d2", "definition": { "schema_version": 1, - "spec_id": "spec_25f482395c5d012ec278118f38dff29c", + "spec_id": "spec_7a02b6facd2dc17b5d0d7c35c11bf5d2", "identity": { "identity_version": "spec1", "shape": { @@ -3849,7 +4485,8 @@ "state": "set", "refs": [ "CRSPurposeCode110", - "CRSPurposeCode120" + "CRSPurposeCode120", + "CRSPurposeCode130" ] } }, @@ -3873,58 +4510,272 @@ "ref": "Disbursement" } }, - { - "property": "nettingBasis", - "binding": { - "state": "value", - "ref": "Gross" - } - } - ], - "entities": { - "destination": [ - "country/KEN" - ], - "origin": [ - "country/DEU" - ] - }, - "requested_window": { - "kind": "all" - } - } - }, - "resolved": { - "shape": { - "shape_id": "financialflow_amount_measuredvalue_nominal", - "label": "gross disbursements (official development assistance)", - "population_type": { - "ref": "FinancialFlow", - "label": "financial flow" - }, - "measured_property": { - "ref": "amount", - "label": "amount" - }, - "stat_type": { - "ref": "measuredValue", - "label": "measuredValue" - }, - "measurement_qualifier": { - "ref": "Nominal", - "label": "Nominal" + { + "property": "nettingBasis", + "binding": { + "state": "value", + "ref": "Gross" + } + } + ], + "entities": { + "destination": [ + "country/KEN" + ], + "origin": [ + "country/DEU" + ] + }, + "requested_window": { + "kind": "all" + } + } + }, + "resolved": { + "shape": { + "shape_id": "financialflow_amount_measuredvalue_nominal", + "label": "gross disbursements (education, health and population policy, programme, and reproductive health, official development assistance)", + "population_type": { + "ref": "FinancialFlow", + "label": "financial flow" + }, + "measured_property": { + "ref": "amount", + "label": "amount" + }, + "stat_type": { + "ref": "measuredValue", + "label": "measuredValue" + }, + "measurement_qualifier": { + "ref": "Nominal", + "label": "Nominal" + }, + "measurement_denominator_unresolved": false, + "slot_keys": [ + { + "axis": "how", + "property": { + "ref": "crsPurpose", + "label": "CRS purpose" + }, + "label": "sector" + }, + { + "axis": "how", + "property": { + "ref": "crsTypeOfFinance", + "label": "CRS type of finance" + }, + "label": "instrument" + }, + { + "axis": "how", + "property": { + "ref": "crsTypeOfFlow", + "label": "CRS type of flow" + }, + "label": "flow" + }, + { + "axis": "how", + "property": { + "ref": "financialFlowType", + "label": "financial flow type" + }, + "label": "financial flow type" + }, + { + "axis": "how", + "property": { + "ref": "nettingBasis", + "label": "netting basis" + }, + "label": "netting basis" + }, + { + "axis": "how", + "property": { + "ref": "crsCooperationModality", + "label": "CRS cooperation modality" + }, + "label": "modality" + }, + { + "axis": "where", + "label": "place" + }, + { + "axis": "when", + "label": "time window" + }, + { + "axis": "source", + "label": "data source" + } + ], + "member_count": 634, + "member_digest": "5c91c0a8d90f4619a1ff7122cacdc8b0bc48b22c70516d7673aec42caf6da0d4", + "refine_supported": true, + "data_commons": [ + { + "id": "dfo", + "label": "Development Finance Observatory" + } + ] + }, + "slots": [ + { + "key": { + "axis": "how", + "property": { + "ref": "crsPurpose", + "label": "CRS purpose" + }, + "label": "sector" + }, + "binding": { + "kind": "set", + "values": [ + { + "ref": { + "ref": "CRSPurposeCode110", + "label": "education" + }, + "value_kind": "enum_value" + }, + { + "ref": { + "ref": "CRSPurposeCode120", + "label": "health" + }, + "value_kind": "enum_value" + }, + { + "ref": { + "ref": "CRSPurposeCode130", + "label": "population policy, programme, and reproductive health" + }, + "value_kind": "enum_value" + } + ] + }, + "expansion": { + "added": [ + { + "ref": "CRSPurposeCode121", + "label": "general health" + }, + { + "ref": "CRSPurposeCode122", + "label": "basic health" + }, + { + "ref": "CRSPurposeCode123", + "label": "noncommunicable disease" + }, + { + "ref": "CRSPurposeCode12110", + "label": "health policy and administrative management" + }, + { + "ref": "CRSPurposeCode12181", + "label": "medical education and training" + }, + { + "ref": "CRSPurposeCode12182", + "label": "medical research" + }, + { + "ref": "CRSPurposeCode12191", + "label": "medical service" + }, + { + "ref": "CRSPurposeCode12220", + "label": "basic health care" + }, + { + "ref": "CRSPurposeCode12230", + "label": "basic health infrastructure" + }, + { + "ref": "CRSPurposeCode12240", + "label": "basic nutrition" + }, + { + "ref": "CRSPurposeCode12250", + "label": "infectious disease control" + }, + { + "ref": "CRSPurposeCode12261", + "label": "health education" + }, + { + "ref": "CRSPurposeCode12262", + "label": "malaria control" + }, + { + "ref": "CRSPurposeCode12263", + "label": "tuberculosis control" + }, + { + "ref": "CRSPurposeCode12264", + "label": "COVID-19 control" + }, + { + "ref": "CRSPurposeCode12281", + "label": "health personnel development" + }, + { + "ref": "CRSPurposeCode12310", + "label": "general noncommunicable disease control" + }, + { + "ref": "CRSPurposeCode12320", + "label": "tobacco use control" + }, + { + "ref": "CRSPurposeCode12330", + "label": "control of harmful use of alcohol and drugs" + }, + { + "ref": "CRSPurposeCode12340", + "label": "mental health and well-being promotion" + }, + { + "ref": "CRSPurposeCode12350", + "label": "other noncommunicable disease prevention and treatment" + }, + { + "ref": "CRSPurposeCode12382", + "label": "research for noncommunicable disease prevention and control" + }, + { + "ref": "CRSPurposeCode13010", + "label": "population policy and administrative management" + }, + { + "ref": "CRSPurposeCode13020", + "label": "reproductive health care" + }, + { + "ref": "CRSPurposeCode13030", + "label": "family planning" + }, + { + "ref": "CRSPurposeCode13040", + "label": "sexually transmitted disease control" + }, + { + "ref": "CRSPurposeCode13081", + "label": "personnel development for population and reproductive health" + } + ] + }, + "summable": true }, - "measurement_denominator_unresolved": false, - "slot_keys": [ - { - "axis": "how", - "property": { - "ref": "crsPurpose", - "label": "CRS purpose" - }, - "label": "sector" - }, - { + { + "key": { "axis": "how", "property": { "ref": "crsTypeOfFinance", @@ -3932,7 +4783,13 @@ }, "label": "instrument" }, - { + "binding": { + "kind": "unbound" + }, + "summable": true + }, + { + "key": { "axis": "how", "property": { "ref": "crsTypeOfFlow", @@ -3940,7 +4797,20 @@ }, "label": "flow" }, - { + "binding": { + "kind": "value", + "value": { + "ref": { + "ref": "CRSTypeOfFlow10", + "label": "official development assistance" + }, + "value_kind": "enum_value" + } + }, + "summable": true + }, + { + "key": { "axis": "how", "property": { "ref": "financialFlowType", @@ -3948,7 +4818,20 @@ }, "label": "financial flow type" }, - { + "binding": { + "kind": "value", + "value": { + "ref": { + "ref": "Disbursement", + "label": "disbursement" + }, + "value_kind": "enum_value" + } + }, + "summable": false + }, + { + "key": { "axis": "how", "property": { "ref": "nettingBasis", @@ -3956,7 +4839,20 @@ }, "label": "netting basis" }, - { + "binding": { + "kind": "value", + "value": { + "ref": { + "ref": "Gross", + "label": "gross" + }, + "value_kind": "enum_value" + } + }, + "summable": false + }, + { + "key": { "axis": "how", "property": { "ref": "crsCooperationModality", @@ -3964,30 +4860,118 @@ }, "label": "modality" }, - { + "binding": { + "kind": "unbound" + }, + "summable": true + }, + { + "key": { "axis": "where", "label": "place" }, - { + "binding": { + "kind": "value", + "value": { + "ref": { + "ref": "country/KEN", + "label": "Kenya" + }, + "value_kind": "entity" + } + }, + "summable": false + }, + { + "key": { "axis": "when", "label": "time window" }, - { + "binding": { + "kind": "unbound" + }, + "summable": false + }, + { + "key": { "axis": "source", "label": "data source" - } - ], - "member_count": 545, - "member_digest": "0c7508fd1997d6cdc896f2eab0f092a4915cfca9e2400eb9577bb22b527fe882", - "refine_supported": true, - "data_commons": [ + }, + "binding": { + "kind": "unbound" + }, + "summable": false + } + ], + "inapplicable_slots": [ + "financialObligationType" + ], + "unresolved_slots": [], + "stat_vars": { + "member_count": 123, + "member_count_exact": true, + "served_count": 634, + "data_date_range": { + "start": "1997", + "end": "2024" + } + }, + "entities": [ + { + "ref": "country/KEN", + "label": "Kenya", + "entity_type": "Country", + "role": "destination" + }, + { + "ref": "country/DEU", + "label": "Germany", + "entity_type": "Country", + "role": "origin" + } + ], + "coverage": { + "kind": "breadth", + "has_data": true, + "dimensions": [ { - "id": "dfo", - "label": "Development Finance Observatory" + "label": "sources", + "count": 1 + }, + { + "label": "observations", + "count": 19 + }, + { + "label": "variables", + "count": 66 } ] }, - "slots": [ + "facets": { + "unit": { + "basis": "fallback", + "ref": "CurrencyUSD", + "label": "US Dollar", + "currency": "USD" + }, + "provenance": { + "basis": "fallback", + "ref": "provenance/OECDCreditorReportingSystem", + "label": "OECD Creditor Reporting System (CRS)", + "source": { + "ref": "dc/s/OrganisationForEconomicCo-operationAndDevelopmentOecd", + "label": "Organisation for Economic Co-operation and Development (OECD)" + }, + "data_commons": { + "id": "dfo", + "label": "Development Finance Observatory" + }, + "documentation": "/api/graph/documentation/provenance/OECDCreditorReportingSystem", + "account": "provider" + } + }, + "slot_options": [ { "key": { "axis": "how", @@ -3995,382 +4979,502 @@ "ref": "crsPurpose", "label": "CRS purpose" }, - "label": "sector" - }, - "binding": { - "kind": "set", - "values": [ - { + "label": "sector" + }, + "options": [ + { + "value": { + "ref": { + "ref": "CRSPurposeCode998", + "label": "unallocated and unspecified" + }, + "value_kind": "enum_value" + }, + "relation": "root", + "member_count": 76, + "served_rows": 74, + "served_rows_exact": true + }, + { + "value": { "ref": { - "ref": "CRSPurposeCode110", - "label": "education" + "ref": "CRSPurposeCode99810", + "label": "sectors not specified" }, "value_kind": "enum_value" }, - { + "relation": "child", + "parent": "CRSPurposeCode998", + "member_count": 255, + "served_rows": 71, + "served_rows_exact": true + }, + { + "value": { "ref": { - "ref": "CRSPurposeCode120", - "label": "health" + "ref": "CRSPurposeCode99820", + "label": "non-sector allocable promotion of development awareness" }, "value_kind": "enum_value" - } - ] - }, - "expansion": { - "added": [ - { - "ref": "CRSPurposeCode121", - "label": "general health" }, - { - "ref": "CRSPurposeCode122", - "label": "basic health" + "relation": "child", + "parent": "CRSPurposeCode998", + "member_count": 77, + "served_rows": 3, + "served_rows_exact": true + }, + { + "value": { + "ref": { + "ref": "CRSPurposeCode600", + "label": "action relating to debt" + }, + "value_kind": "enum_value" }, - { - "ref": "CRSPurposeCode123", - "label": "noncommunicable disease" + "relation": "root", + "member_count": 21, + "served_rows": 9, + "served_rows_exact": true + }, + { + "value": { + "ref": { + "ref": "CRSPurposeCode60020", + "label": "debt forgiveness" + }, + "value_kind": "enum_value" }, - { - "ref": "CRSPurposeCode12110", - "label": "health policy and administrative management" + "relation": "child", + "parent": "CRSPurposeCode600", + "member_count": 75, + "served_rows": 4, + "served_rows_exact": true + }, + { + "value": { + "ref": { + "ref": "CRSPurposeCode60040", + "label": "rescheduling and refinancing" + }, + "value_kind": "enum_value" }, - { - "ref": "CRSPurposeCode12181", - "label": "medical education and training" + "relation": "child", + "parent": "CRSPurposeCode600", + "member_count": 54, + "served_rows": 5, + "served_rows_exact": true + }, + { + "value": { + "ref": { + "ref": "CRSPurposeCode100", + "label": "social infrastructure and services" + }, + "value_kind": "enum_value" }, - { - "ref": "CRSPurposeCode12182", - "label": "medical research" + "relation": "root", + "member_count": 13, + "served_rows": 1214, + "served_rows_exact": true + }, + { + "value": { + "ref": { + "ref": "CRSPurposeCode140", + "label": "water supply and sanitation" + }, + "value_kind": "enum_value" }, - { - "ref": "CRSPurposeCode12191", - "label": "medical service" + "relation": "child", + "parent": "CRSPurposeCode100", + "member_count": 10, + "served_rows": 275, + "served_rows_exact": true + }, + { + "value": { + "ref": { + "ref": "CRSPurposeCode110", + "label": "education" + }, + "value_kind": "enum_value" }, - { - "ref": "CRSPurposeCode12220", - "label": "basic health care" + "relation": "child", + "parent": "CRSPurposeCode100", + "member_count": 9, + "served_rows": 318, + "served_rows_exact": true + }, + { + "value": { + "ref": { + "ref": "CRSPurposeCode160", + "label": "other social infrastructure and services" + }, + "value_kind": "enum_value" }, - { - "ref": "CRSPurposeCode12230", - "label": "basic health infrastructure" + "relation": "child", + "parent": "CRSPurposeCode100", + "member_count": 7, + "served_rows": 102, + "served_rows_exact": true + }, + { + "value": { + "ref": { + "ref": "CRSPurposeCode120", + "label": "health" + }, + "value_kind": "enum_value" }, - { - "ref": "CRSPurposeCode12240", - "label": "basic nutrition" + "relation": "child", + "parent": "CRSPurposeCode100", + "member_count": 6, + "served_rows": 194, + "served_rows_exact": true + }, + { + "value": { + "ref": { + "ref": "CRSPurposeCode130", + "label": "population policy, programme, and reproductive health" + }, + "value_kind": "enum_value" }, - { - "ref": "CRSPurposeCode12250", - "label": "infectious disease control" + "relation": "child", + "parent": "CRSPurposeCode100", + "member_count": 5, + "served_rows": 81, + "served_rows_exact": true + }, + { + "value": { + "ref": { + "ref": "CRSPurposeCode150", + "label": "government and civil society" + }, + "value_kind": "enum_value" }, - { - "ref": "CRSPurposeCode12261", - "label": "health education" + "relation": "child", + "parent": "CRSPurposeCode100", + "member_count": 4, + "served_rows": 244, + "served_rows_exact": true + }, + { + "value": { + "ref": { + "ref": "CRSPurposeCode200", + "label": "economic infrastructure and services" + }, + "value_kind": "enum_value" }, - { - "ref": "CRSPurposeCode12262", - "label": "malaria control" + "relation": "root", + "member_count": 13, + "served_rows": 286, + "served_rows_exact": true + }, + { + "value": { + "ref": { + "ref": "CRSPurposeCode240", + "label": "banking and financial services" + }, + "value_kind": "enum_value" }, - { - "ref": "CRSPurposeCode12263", - "label": "tuberculosis control" + "relation": "child", + "parent": "CRSPurposeCode200", + "member_count": 16, + "served_rows": 30, + "served_rows_exact": true + }, + { + "value": { + "ref": { + "ref": "CRSPurposeCode220", + "label": "communication system and technology" + }, + "value_kind": "enum_value" }, - { - "ref": "CRSPurposeCode12264", - "label": "COVID-19 control" + "relation": "child", + "parent": "CRSPurposeCode200", + "member_count": 13, + "served_rows": 23, + "served_rows_exact": true + }, + { + "value": { + "ref": { + "ref": "CRSPurposeCode250", + "label": "business environment and governance" + }, + "value_kind": "enum_value" }, - { - "ref": "CRSPurposeCode12281", - "label": "health personnel development" + "relation": "child", + "parent": "CRSPurposeCode200", + "member_count": 13, + "served_rows": 30, + "served_rows_exact": true + }, + { + "value": { + "ref": { + "ref": "CRSPurposeCode210", + "label": "transport and storage" + }, + "value_kind": "enum_value" }, - { - "ref": "CRSPurposeCode12310", - "label": "general noncommunicable disease control" + "relation": "child", + "parent": "CRSPurposeCode200", + "member_count": 7, + "served_rows": 97, + "served_rows_exact": true + }, + { + "value": { + "ref": { + "ref": "CRSPurposeCode230", + "label": "energy" + }, + "value_kind": "enum_value" }, - { - "ref": "CRSPurposeCode12320", - "label": "tobacco use control" + "relation": "child", + "parent": "CRSPurposeCode200", + "member_count": 7, + "served_rows": 106, + "served_rows_exact": true + }, + { + "value": { + "ref": { + "ref": "CRSPurposeCode300", + "label": "productive sector" + }, + "value_kind": "enum_value" }, - { - "ref": "CRSPurposeCode12330", - "label": "control of harmful use of alcohol and drugs" + "relation": "root", + "member_count": 13, + "served_rows": 493, + "served_rows_exact": true + }, + { + "value": { + "ref": { + "ref": "CRSPurposeCode310", + "label": "agriculture, forestry and fishing" + }, + "value_kind": "enum_value" }, - { - "ref": "CRSPurposeCode12340", - "label": "mental health and well-being promotion" + "relation": "child", + "parent": "CRSPurposeCode300", + "member_count": 12, + "served_rows": 405, + "served_rows_exact": true + }, + { + "value": { + "ref": { + "ref": "CRSPurposeCode320", + "label": "industry, mining and construction" + }, + "value_kind": "enum_value" }, - { - "ref": "CRSPurposeCode12350", - "label": "other noncommunicable disease prevention and treatment" + "relation": "child", + "parent": "CRSPurposeCode300", + "member_count": 9, + "served_rows": 66, + "served_rows_exact": true + }, + { + "value": { + "ref": { + "ref": "CRSPurposeCode331", + "label": "trade policies and regulations" + }, + "value_kind": "enum_value" }, - { - "ref": "CRSPurposeCode12382", - "label": "research for noncommunicable disease prevention and control" - } - ] - }, - "summable": true - }, - { - "key": { - "axis": "how", - "property": { - "ref": "crsTypeOfFinance", - "label": "CRS type of finance" + "relation": "child", + "parent": "CRSPurposeCode300", + "member_count": 7, + "served_rows": 22, + "served_rows_exact": true }, - "label": "instrument" - }, - "binding": { - "kind": "unbound" - }, - "summable": true - }, - { - "key": { - "axis": "how", - "property": { - "ref": "crsTypeOfFlow", - "label": "CRS type of flow" + { + "value": { + "ref": { + "ref": "CRSPurposeCode400", + "label": "multisector" + }, + "value_kind": "enum_value" + }, + "relation": "root", + "member_count": 7, + "served_rows": 206, + "served_rows_exact": true }, - "label": "flow" - }, - "binding": { - "kind": "value", - "value": { - "ref": { - "ref": "CRSTypeOfFlow10", - "label": "official development assistance" + { + "value": { + "ref": { + "ref": "CRSPurposeCode430", + "label": "other multisector" + }, + "value_kind": "enum_value" }, - "value_kind": "enum_value" - } - }, - "summable": true - }, - { - "key": { - "axis": "how", - "property": { - "ref": "financialFlowType", - "label": "financial flow type" + "relation": "child", + "parent": "CRSPurposeCode400", + "member_count": 10, + "served_rows": 162, + "served_rows_exact": true }, - "label": "financial flow type" - }, - "binding": { - "kind": "value", - "value": { - "ref": { - "ref": "Disbursement", - "label": "disbursement" + { + "value": { + "ref": { + "ref": "CRSPurposeCode410", + "label": "general environment protection" + }, + "value_kind": "enum_value" }, - "value_kind": "enum_value" - } - }, - "summable": false - }, - { - "key": { - "axis": "how", - "property": { - "ref": "nettingBasis", - "label": "netting basis" + "relation": "child", + "parent": "CRSPurposeCode400", + "member_count": 7, + "served_rows": 44, + "served_rows_exact": true }, - "label": "netting basis" - }, - "binding": { - "kind": "value", - "value": { - "ref": { - "ref": "Gross", - "label": "gross" + { + "value": { + "ref": { + "ref": "CRSPurposeCode500", + "label": "commodity aid and general programme assistance" + }, + "value_kind": "enum_value" }, - "value_kind": "enum_value" - } - }, - "summable": false - }, - { - "key": { - "axis": "how", - "property": { - "ref": "crsCooperationModality", - "label": "CRS cooperation modality" + "relation": "root", + "member_count": 5, + "served_rows": 70, + "served_rows_exact": true }, - "label": "modality" - }, - "binding": { - "kind": "unbound" - }, - "summable": true - }, - { - "key": { - "axis": "where", - "label": "place" - }, - "binding": { - "kind": "value", - "value": { - "ref": { - "ref": "country/KEN", - "label": "Kenya" + { + "value": { + "ref": { + "ref": "CRSPurposeCode510", + "label": "budget support" + }, + "value_kind": "enum_value" }, - "value_kind": "entity" - } - }, - "summable": false - }, - { - "key": { - "axis": "when", - "label": "time window" - }, - "binding": { - "kind": "unbound" - }, - "summable": false - }, - { - "key": { - "axis": "source", - "label": "data source" - }, - "binding": { - "kind": "unbound" - }, - "summable": false - } - ], - "inapplicable_slots": [ - "financialObligationType" - ], - "unresolved_slots": [], - "stat_vars": { - "member_count": 108, - "member_count_exact": true, - "served_count": 545, - "data_date_range": { - "start": "1997", - "end": "2024" - } - }, - "entities": [ - { - "ref": "country/KEN", - "label": "Kenya", - "entity_type": "Country", - "role": "destination" - }, - { - "ref": "country/DEU", - "label": "Germany", - "entity_type": "Country", - "role": "origin" - } - ], - "coverage": { - "kind": "breadth", - "has_data": true, - "dimensions": [ - { - "label": "sources", - "count": 1 - }, - { - "label": "observations", - "count": 12 - }, - { - "label": "variables", - "count": 51 - } - ] - }, - "facets": { - "provenance": { - "basis": "fallback", - "ref": "provenance/OECDCreditorReportingSystem", - "label": "OECD Creditor Reporting System (CRS)", - "source": { - "ref": "dc/s/OrganisationForEconomicCo-operationAndDevelopmentOecd", - "label": "Organisation for Economic Co-operation and Development (OECD)" - }, - "data_commons": { - "id": "dfo", - "label": "Development Finance Observatory" - }, - "documentation": "/api/graph/documentation/provenance/OECDCreditorReportingSystem", - "account": "provider" - }, - "unit": { - "basis": "fallback", - "ref": "CurrencyUSD", - "label": "US Dollar", - "currency": "USD" - } - }, - "slot_options": [ - { - "key": { - "axis": "how", - "property": { - "ref": "crsPurpose", - "label": "CRS purpose" + "relation": "child", + "parent": "CRSPurposeCode500", + "member_count": 3, + "served_rows": 10, + "served_rows_exact": true + }, + { + "value": { + "ref": { + "ref": "CRSPurposeCode520", + "label": "food assistance" + }, + "value_kind": "enum_value" + }, + "relation": "child", + "parent": "CRSPurposeCode500", + "member_count": 3, + "served_rows": 19, + "served_rows_exact": true + }, + { + "value": { + "ref": { + "ref": "CRSPurposeCode530", + "label": "other commodity assistance" + }, + "value_kind": "enum_value" + }, + "relation": "child", + "parent": "CRSPurposeCode500", + "member_count": 3, + "served_rows": 41, + "served_rows_exact": true + }, + { + "value": { + "ref": { + "ref": "CRSPurposeCode700", + "label": "humanitarian aid" + }, + "value_kind": "enum_value" + }, + "relation": "root", + "member_count": 5, + "served_rows": 68, + "served_rows_exact": true }, - "label": "sector" - }, - "options": [ { "value": { "ref": { - "ref": "CRSPurposeCode121", - "label": "general health" + "ref": "CRSPurposeCode720", + "label": "emergency response" }, "value_kind": "enum_value" }, "relation": "child", - "parent": "CRSPurposeCode120", + "parent": "CRSPurposeCode700", "member_count": 6, - "served_rows": 82, + "served_rows": 46, "served_rows_exact": true }, { "value": { "ref": { - "ref": "CRSPurposeCode122", - "label": "basic health" + "ref": "CRSPurposeCode730", + "label": "reconstruction and rehabilitation" }, "value_kind": "enum_value" }, "relation": "child", - "parent": "CRSPurposeCode120", - "member_count": 4, - "served_rows": 108, + "parent": "CRSPurposeCode700", + "member_count": 3, + "served_rows": 14, "served_rows_exact": true }, { "value": { "ref": { - "ref": "CRSPurposeCode123", - "label": "noncommunicable disease" + "ref": "CRSPurposeCode740", + "label": "disaster preparedness" }, "value_kind": "enum_value" }, "relation": "child", - "parent": "CRSPurposeCode120", + "parent": "CRSPurposeCode700", + "member_count": 0, + "served_rows": 8, + "served_rows_exact": true + }, + { + "value": { + "ref": { + "ref": "CRSPurposeCode930", + "label": "support for refugees and asylum seekers in donor countries" + }, + "value_kind": "enum_value" + }, + "relation": "root", "member_count": 3, - "served_rows": 4, + "served_rows": 6, "served_rows_exact": true }, { "value": { "ref": { - "ref": "CRSPurposeCode100", - "label": "social infrastructure and services" + "ref": "CRSPurposeCode93010", + "label": "general support for refugees and asylum seekers in donor countries" }, "value_kind": "enum_value" }, - "relation": "parent", - "member_count": 13, - "served_rows": 1214, + "relation": "child", + "parent": "CRSPurposeCode930", + "member_count": 57, + "served_rows": 6, "served_rows_exact": true }, { @@ -4453,7 +5557,7 @@ }, "relation": "root", "member_count": 0, - "served_rows": 501, + "served_rows": 582, "served_rows_exact": true }, { @@ -4466,8 +5570,8 @@ }, "relation": "child", "parent": "CRSTypeOfFinance100", - "member_count": 12672, - "served_rows": 501, + "member_count": 12745, + "served_rows": 582, "served_rows_exact": true }, { @@ -4520,8 +5624,8 @@ "value_kind": "enum_value" }, "relation": "root", - "member_count": 14098, - "served_rows": 512, + "member_count": 14146, + "served_rows": 593, "served_rows_exact": true } ], @@ -4548,7 +5652,7 @@ }, "relation": "root", "member_count": 0, - "served_rows": 104, + "served_rows": 118, "served_rows_exact": true }, { @@ -4561,8 +5665,8 @@ }, "relation": "child", "parent": "CRSCooperationModalityB", - "member_count": 1606, - "served_rows": 21, + "member_count": 1614, + "served_rows": 25, "served_rows_exact": true }, { @@ -4575,8 +5679,8 @@ }, "relation": "child", "parent": "CRSCooperationModalityB", - "member_count": 1331, - "served_rows": 83, + "member_count": 1337, + "served_rows": 93, "served_rows_exact": true }, { @@ -4589,7 +5693,7 @@ }, "relation": "root", "member_count": 0, - "served_rows": 136, + "served_rows": 173, "served_rows_exact": true }, { @@ -4602,8 +5706,8 @@ }, "relation": "child", "parent": "CRSCooperationModalityC", - "member_count": 7005, - "served_rows": 136, + "member_count": 7041, + "served_rows": 173, "served_rows_exact": true }, { @@ -4616,7 +5720,7 @@ }, "relation": "root", "member_count": 0, - "served_rows": 111, + "served_rows": 116, "served_rows_exact": true }, { @@ -4630,7 +5734,7 @@ "relation": "child", "parent": "CRSCooperationModalityD", "member_count": 1600, - "served_rows": 84, + "served_rows": 87, "served_rows_exact": true }, { @@ -4643,8 +5747,8 @@ }, "relation": "child", "parent": "CRSCooperationModalityD", - "member_count": 976, - "served_rows": 27, + "member_count": 980, + "served_rows": 29, "served_rows_exact": true }, { @@ -4728,7 +5832,7 @@ "source": "observed" } ], - "rendered_sentence": "Germany's gross ODA disbursements to Kenya for education and health, 1997 to 2024. Current US dollars · OECD Creditor Reporting System (CRS).", + "rendered_sentence": "Germany's gross ODA disbursements to Kenya for education, health, and population policy, programme, and reproductive health, 1997 to 2024. Current US dollars · OECD Creditor Reporting System (CRS).", "sentence_plan": [ { "kind": "slot", @@ -4801,7 +5905,7 @@ }, { "kind": "slot", - "text": "education and health", + "text": "education, health, and population policy, programme, and reproductive health", "axis": "how", "segment": "heading", "property_dcid": "crsPurpose", @@ -4975,6 +6079,10 @@ { "ref": "CRSPurposeCode120", "label": "health" + }, + { + "ref": "CRSPurposeCode130", + "label": "population policy, programme, and reproductive health" } ], "provenance": "text_recognized" @@ -5053,303 +6161,90 @@ "ref": "crsCooperationModality", "label": "CRS cooperation modality" }, - "label": "modality" - }, - "binding_kind": "unbound", - "refs": [], - "provenance": "binder" - }, - { - "key": { - "axis": "where", - "label": "place" - }, - "binding_kind": "value", - "refs": [ - { - "ref": "country/KEN", - "label": "Kenya" - } - ], - "provenance": "binder" - }, - { - "key": { - "axis": "when", - "label": "time window" - }, - "binding_kind": "unbound", - "refs": [], - "provenance": "binder" - }, - { - "key": { - "axis": "source", - "label": "data source" - }, - "binding_kind": "unbound", - "refs": [], - "provenance": "binder" - } - ], - "query_qualifiers": [ - { - "text": "health", - "named": [ - { - "ref": "CRSPurposeCode120", - "label": "health" - } - ], - "slot": "crsPurpose", - "disposition": "bound", - "selected": [] - }, - { - "text": "ODA", - "named": [ - { - "ref": "CRSTypeOfFlow10", - "label": "official development assistance" - } - ], - "slot": "crsTypeOfFlow", - "disposition": "bound", - "selected": [] - }, - { - "text": "education", - "named": [ - { - "ref": "CRSPurposeCode110", - "label": "education" - } - ], - "slot": "crsPurpose", - "disposition": "bound", - "selected": [] - } - ], - "capability_version": "cap_765c9d2a0c7529b9", - "default_reading": { - "applied": true, - "removed_stat_vars": [] - } - }, - "alternative_measures": [ - { - "definition": { - "schema_version": 1, - "spec_id": "spec_b438dc000255d174bcc13eb675e603f7", - "identity": { - "identity_version": "spec1", - "shape": { - "kind": "statvar_schema", - "population_type": "FinancialFlow", - "measured_property": "amount", - "stat_type": "measuredValue", - "measurement_qualifier": "Nominal" - }, - "slots": [ - { - "property": "crsCooperationModality", - "binding": { - "state": "unbound" - } - }, - { - "property": "crsPurpose", - "binding": { - "state": "set", - "refs": [ - "CRSPurposeCode110", - "CRSPurposeCode120" - ] - } - }, - { - "property": "crsTypeOfFinance", - "binding": { - "state": "unbound" - } - }, - { - "property": "crsTypeOfFlow", - "binding": { - "state": "value", - "ref": "CRSTypeOfFlow10" - } - }, - { - "property": "financialFlowType", - "binding": { - "state": "value", - "ref": "Disbursement" - } - }, - { - "property": "nettingBasis", - "binding": { - "state": "value", - "ref": "Net" - } - } - ], - "entities": { - "destination": [ - "country/KEN" - ], - "origin": [ - "country/DEU" - ] - }, - "requested_window": { - "kind": "all" - } - } - }, - "label": "net disbursements", - "axis": "what", - "measure_axis_values": [ - { - "axis": "populationType", - "value": { - "ref": "FinancialFlow", - "label": "financial flow" - } - }, - { - "axis": "measuredProperty", - "value": { - "ref": "amount", - "label": "amount" - } - }, - { - "axis": "measurementQualifier", - "value": { - "ref": "Nominal", - "label": "nominal" - } - }, - { - "axis": "financialFlowType", - "value": { - "ref": "Disbursement", - "label": "disbursement" - } - }, - { - "axis": "nettingBasis", - "value": { - "ref": "Net", - "label": "net" - } - } - ], - "served_rows": 512, - "served_rows_exact": true - }, - { - "definition": { - "schema_version": 1, - "spec_id": "spec_e348565295de394da8ddaa23ec5fa475", - "identity": { - "identity_version": "spec1", - "shape": { - "kind": "statvar_schema", - "population_type": "FinancialObligation", - "measured_property": "amount", - "stat_type": "measuredValue", - "measurement_qualifier": "Nominal" - }, - "slots": [ - { - "property": "crsCooperationModality", - "binding": { - "state": "unbound" - } - }, - { - "property": "crsPurpose", - "binding": { - "state": "set", - "refs": [ - "CRSPurposeCode110", - "CRSPurposeCode120" - ] - } - }, - { - "property": "crsTypeOfFinance", - "binding": { - "state": "unbound" - } - }, - { - "property": "crsTypeOfFlow", - "binding": { - "state": "value", - "ref": "CRSTypeOfFlow10" - } - }, - { - "property": "financialObligationType", - "binding": { - "state": "value", - "ref": "Commitment" - } - } - ], - "entities": { - "destination": [ - "country/KEN" - ], - "origin": [ - "country/DEU" - ] - }, - "requested_window": { - "kind": "all" - } - } + "label": "modality" + }, + "binding_kind": "unbound", + "refs": [], + "provenance": "binder" }, - "label": "commitments", - "axis": "what", - "measure_axis_values": [ - { - "axis": "populationType", - "value": { - "ref": "FinancialObligation", - "label": "financial obligation" - } + { + "key": { + "axis": "where", + "label": "place" }, - { - "axis": "measuredProperty", - "value": { - "ref": "amount", - "label": "amount" + "binding_kind": "value", + "refs": [ + { + "ref": "country/KEN", + "label": "Kenya" } + ], + "provenance": "binder" + }, + { + "key": { + "axis": "when", + "label": "time window" }, - { - "axis": "measurementQualifier", - "value": { - "ref": "Nominal", - "label": "nominal" - } + "binding_kind": "unbound", + "refs": [], + "provenance": "binder" + }, + { + "key": { + "axis": "source", + "label": "data source" }, - { - "axis": "financialObligationType", - "value": { - "ref": "Commitment", - "label": "commitment" + "binding_kind": "unbound", + "refs": [], + "provenance": "binder" + } + ], + "query_qualifiers": [ + { + "text": "health", + "named": [ + { + "ref": "CRSPurposeCode120", + "label": "health" } - } - ], - "served_rows": 519, - "served_rows_exact": true + ], + "slot": "crsPurpose", + "disposition": "bound", + "selected": [] + }, + { + "text": "ODA", + "named": [ + { + "ref": "CRSTypeOfFlow10", + "label": "official development assistance" + } + ], + "slot": "crsTypeOfFlow", + "disposition": "bound", + "selected": [] + }, + { + "text": "education", + "named": [ + { + "ref": "CRSPurposeCode110", + "label": "education" + } + ], + "slot": "crsPurpose", + "disposition": "bound", + "selected": [] + } + ], + "capability_version": "cap_4913302d7a6b6435", + "default_reading": { + "applied": true, + "removed_stat_vars": [] } - ], + }, + "alternative_measures": [], "measure_label": "gross disbursements", "measure_label_axes": [ "populationType", @@ -5395,6 +6290,8 @@ } } ], + "concept_label": "education, health, and population policy, programme, and reproductive health", + "published_tables": "OECD Creditor Reporting System (CRS)", "open_axis_facts": [ { "property": "crsTypeOfFinance", @@ -5407,7 +6304,7 @@ "ref": "CRSTypeOfFinance110", "label": "standard grant" }, - "count": 105 + "count": 120 }, { "value": { @@ -5422,42 +6319,42 @@ "property": "crsCooperationModality", "varies": true, "distinct_count": 7, - "undeclared_count": 19, + "undeclared_count": 22, "values": [ { "value": { "ref": "CRSCooperationModalityC01", "label": "project-type intervention" }, - "count": 27 + "count": 30 }, { "value": { "ref": "CRSCooperationModalityB03", "label": "contribution to specific-purpose programme and fund managed by an international organisation" }, - "count": 21 + "count": 24 }, { "value": { - "ref": "CRSCooperationModalityD02", - "label": "other technical assistance" + "ref": "CRSCooperationModalityB01", + "label": "core support to non-governmental organisations, other private bodies, public-private partnerships, and research institutes" }, - "count": 16 + "count": 18 }, { "value": { - "ref": "CRSCooperationModalityB01", - "label": "core support to non-governmental organisations, other private bodies, public-private partnerships, and research institutes" + "ref": "CRSCooperationModalityD02", + "label": "other technical assistance" }, - "count": 15 + "count": 18 }, { "value": { "ref": "CRSCooperationModalityD01", "label": "donor country personnel" }, - "count": 8 + "count": 9 }, { "value": { @@ -7444,6 +8341,377 @@ "destination": "KES", "origin": "EUR" } + }, + "scope_choices": { + "id": "spec_7a02b6facd2dc17b5d0d7c35c11bf5d2", + "base": { + "schema_version": 1, + "spec_id": "spec_7a02b6facd2dc17b5d0d7c35c11bf5d2", + "identity": { + "identity_version": "spec1", + "shape": { + "kind": "statvar_schema", + "population_type": "FinancialFlow", + "measured_property": "amount", + "stat_type": "measuredValue", + "measurement_qualifier": "Nominal" + }, + "slots": [ + { + "property": "crsCooperationModality", + "binding": { + "state": "unbound" + } + }, + { + "property": "crsPurpose", + "binding": { + "state": "set", + "refs": [ + "CRSPurposeCode110", + "CRSPurposeCode120", + "CRSPurposeCode130" + ] + } + }, + { + "property": "crsTypeOfFinance", + "binding": { + "state": "unbound" + } + }, + { + "property": "crsTypeOfFlow", + "binding": { + "state": "value", + "ref": "CRSTypeOfFlow10" + } + }, + { + "property": "financialFlowType", + "binding": { + "state": "value", + "ref": "Disbursement" + } + }, + { + "property": "nettingBasis", + "binding": { + "state": "value", + "ref": "Gross" + } + } + ], + "entities": { + "destination": [ + "country/KEN" + ], + "origin": [ + "country/DEU" + ] + }, + "requested_window": { + "kind": "all" + } + } + }, + "rule_version": "scope1:3eef00a928eedd463ee48d02b79730da", + "entries": [], + "dropped_entries": [ + { + "entry": { + "axis": "sector", + "option_id": "sector:110", + "provenance": "explicit", + "origin": { + "kind": "text", + "text": "education", + "start": 0, + "end": 9 + } + }, + "code": "stated_choice_not_applied", + "cause": "option_unknown" + } + ], + "choices": [ + { + "id": "spec_7a02b6facd2dc17b5d0d7c35c11bf5d2:sector", + "axis": "sector", + "rule": "sector_code", + "provenance": "default", + "active": "sector:110+120+130", + "options": [ + { + "option_id": "sector:110+120+130", + "label": "education (CRS 110) + health (CRS 120) + population policy, programme, and reproductive health (CRS 130)", + "binding": { + "kind": "slot", + "slot": "crsPurpose", + "state": "set", + "refs": [ + "CRSPurposeCode110", + "CRSPurposeCode120", + "CRSPurposeCode130" + ] + }, + "availability": { + "status": "available", + "detail": {} + } + } + ] + }, + { + "id": "spec_7a02b6facd2dc17b5d0d7c35c11bf5d2:measure_basis", + "axis": "measure_basis", + "rule": "measure_basis_convention", + "provenance": "default", + "active": "measure_basis:gross", + "options": [ + { + "option_id": "measure_basis:gross", + "label": "gross disbursements, current USD", + "binding": { + "kind": "shape", + "measured_property": "amount", + "netting_basis": "Gross" + }, + "availability": { + "status": "available", + "detail": {} + } + }, + { + "option_id": "measure_basis:net", + "label": "net disbursements, current USD", + "binding": { + "kind": "shape", + "measured_property": "amount", + "netting_basis": "Net" + }, + "availability": { + "status": "available", + "detail": {} + } + }, + { + "option_id": "measure_basis:grant_equivalent", + "label": "grant equivalents (OECD headline), current USD", + "binding": { + "kind": "shape", + "measured_property": "grantEquivalent", + "netting_basis": null + }, + "availability": { + "status": "available", + "detail": {} + } + }, + { + "option_id": "measure_basis:commitments", + "label": "commitments, current USD", + "binding": { + "kind": "shape", + "measured_property": "amount", + "netting_basis": null + }, + "availability": { + "status": "available", + "detail": {} + } + } + ] + }, + { + "id": "spec_7a02b6facd2dc17b5d0d7c35c11bf5d2:provider", + "axis": "provider", + "rule": "bilateral_flows", + "provenance": "default", + "active": "provider:bilateral", + "options": [ + { + "option_id": "provider:bilateral", + "label": "bilateral flows only", + "binding": { + "kind": "provider", + "scope": "bilateral" + }, + "availability": { + "status": "available", + "detail": {} + } + }, + { + "option_id": "provider:inclusive", + "label": "bilateral plus imputed multilateral, 2011 to 2024", + "binding": { + "kind": "provider", + "scope": "inclusive", + "window": [ + 2011, + 2024 + ], + "provenance": "provenance/ONEBilateralAndImputedMultilateral" + }, + "availability": { + "status": "partial", + "years": [ + [ + 2011, + 2024 + ] + ], + "code": "imputed_coverage", + "detail": {} + } + } + ] + } + ], + "compiled": { + "spec_id": "spec_7a02b6facd2dc17b5d0d7c35c11bf5d2", + "identity": { + "identity_version": "spec1", + "shape": { + "kind": "statvar_schema", + "population_type": "FinancialFlow", + "measured_property": "amount", + "stat_type": "measuredValue", + "measurement_qualifier": "Nominal" + }, + "slots": [ + { + "property": "crsCooperationModality", + "binding": { + "state": "unbound" + } + }, + { + "property": "crsPurpose", + "binding": { + "state": "set", + "refs": [ + "CRSPurposeCode110", + "CRSPurposeCode120", + "CRSPurposeCode130" + ] + } + }, + { + "property": "crsTypeOfFinance", + "binding": { + "state": "unbound" + } + }, + { + "property": "crsTypeOfFlow", + "binding": { + "state": "value", + "ref": "CRSTypeOfFlow10" + } + }, + { + "property": "financialFlowType", + "binding": { + "state": "value", + "ref": "Disbursement" + } + }, + { + "property": "nettingBasis", + "binding": { + "state": "value", + "ref": "Gross" + } + } + ], + "entities": { + "destination": [ + "country/KEN" + ], + "origin": [ + "country/DEU" + ] + }, + "requested_window": { + "kind": "all" + } + }, + "components": [ + { + "role": "whole", + "identity": { + "identity_version": "spec1", + "shape": { + "kind": "statvar_schema", + "population_type": "FinancialFlow", + "measured_property": "amount", + "stat_type": "measuredValue", + "measurement_qualifier": "Nominal" + }, + "slots": [ + { + "property": "crsCooperationModality", + "binding": { + "state": "unbound" + } + }, + { + "property": "crsPurpose", + "binding": { + "state": "set", + "refs": [ + "CRSPurposeCode110", + "CRSPurposeCode120", + "CRSPurposeCode130" + ] + } + }, + { + "property": "crsTypeOfFinance", + "binding": { + "state": "unbound" + } + }, + { + "property": "crsTypeOfFlow", + "binding": { + "state": "value", + "ref": "CRSTypeOfFlow10" + } + }, + { + "property": "financialFlowType", + "binding": { + "state": "value", + "ref": "Disbursement" + } + }, + { + "property": "nettingBasis", + "binding": { + "state": "value", + "ref": "Gross" + } + } + ], + "entities": { + "destination": [ + "country/KEN" + ], + "origin": [ + "country/DEU" + ] + }, + "requested_window": { + "kind": "all" + } + } + } + ] + }, + "ledger": [] } } } @@ -7463,30 +8731,30 @@ } ], "timing_ms": { - "total": 2851, + "total": 5202, "by_step": { - "recall": 360, + "recall": 1145, "phase_resolve_places": 0, "phase_check_entities": 0, - "shape_arcs": 4, - "shape_probe_coverage": 2, - "shape_probe": 121, - "shape_groups": 841, - "shape_labels": 17, - "shape_admission": 4, + "shape_arcs": 5, + "shape_probe_coverage": 4, + "shape_probe": 1327, + "shape_groups": 85, + "shape_labels": 11, + "shape_admission": 2, "phase_derive_shapes": 0, - "shape": 1100, + "shape": 1663, "phase_prune_and_rank": 0, - "bind": 261, - "phase_bind": 16, - "phase_settle": 7, - "phase_place_bindings": 554, + "bind": 216, + "phase_bind": 39, + "phase_settle": 18, + "phase_place_bindings": 1429, "phase_facet_requests": 0, - "materialise": 96, - "phase_materialise": 17, - "answer": 239, - "options": 188, - "phase_outcome": 13 + "materialise": 147, + "phase_materialise": 19, + "answer": 102, + "options": 400, + "phase_outcome": 24 } }, "restatement": { @@ -8923,7 +10191,7 @@ } ], "query_qualifiers": [], - "capability_version": "cap_765c9d2a0c7529b9", + "capability_version": "cap_4913302d7a6b6435", "default_reading": { "applied": true, "removed_stat_vars": [ @@ -9456,7 +10724,7 @@ } ], "query_qualifiers": [], - "capability_version": "cap_765c9d2a0c7529b9", + "capability_version": "cap_4913302d7a6b6435", "default_reading": { "applied": true, "removed_stat_vars": [ @@ -9495,12 +10763,14 @@ "confidence": "high", "available_at_place": true, "measure_label_axes": [], - "measure_axis_values": [] + "measure_axis_values": [], + "published_tables": "IMF World Economic Outlook (WEO)" } } ], "measure_label_axes": [], "measure_axis_values": [], + "published_tables": "World Development Indicators", "related_group": { "ref": "dc/g/EconomicActivity_ActivitySource-GrossDomesticProduction", "label": "Economic Activity With Activity Source = Gross Domestic Production" @@ -9548,7 +10818,7 @@ } } ], - "rendered_sentence": "Germany's gross ODA disbursements to Kenya for education and health, 1997 to 2024. Current US dollars · OECD Creditor Reporting System (CRS). GDP in Germany and Kenya, 1960 to 2025. Current US dollars · World Development Indicators. You named Germany as a provider. This measure has no providers, so this shows the place itself. You named Kenya as a recipient. This measure has no recipients, so this shows the place itself.", + "rendered_sentence": "Germany's gross ODA disbursements to Kenya for education, health, and population policy, programme, and reproductive health, 1997 to 2024. Current US dollars · OECD Creditor Reporting System (CRS). GDP in Germany and Kenya, 1960 to 2025. Current US dollars · World Development Indicators. You named Germany as a provider. This measure has no providers, so this shows the place itself. You named Kenya as a recipient. This measure has no recipients, so this shows the place itself.", "sentence_plan": [ { "kind": "slot", @@ -9621,7 +10891,7 @@ }, { "kind": "slot", - "text": "education and health", + "text": "education, health, and population policy, programme, and reproductive health", "axis": "how", "segment": "heading", "property_dcid": "crsPurpose", @@ -9953,10 +11223,10 @@ "answer": { "kind": "resolution", "status": "definite", - "sentence": "Germany's gross ODA disbursements to Kenya for education and health, 1997 to 2024. Current US dollars · OECD Creditor Reporting System (CRS). GDP in Germany and Kenya, 1960 to 2025. Current US dollars · World Development Indicators. You named Germany as a provider. This measure has no providers, so this shows the place itself. You named Kenya as a recipient. This measure has no recipients, so this shows the place itself.", + "sentence": "Germany's gross ODA disbursements to Kenya for education, health, and population policy, programme, and reproductive health, 1997 to 2024. Current US dollars · OECD Creditor Reporting System (CRS). GDP in Germany and Kenya, 1960 to 2025. Current US dollars · World Development Indicators. You named Germany as a provider. This measure has no providers, so this shows the place itself. You named Kenya as a recipient. This measure has no recipients, so this shows the place itself.", "complete": true, "specs": [ - "spec_25f482395c5d012ec278118f38dff29c", + "spec_7a02b6facd2dc17b5d0d7c35c11bf5d2", "spec_f8dea3052d1ef6ba5667628815d1a663" ], "gaps": [] diff --git a/python/client-contract/src/dfo_client_contract/scenarios/fetch-null-member.json b/python/client-contract/src/dfo_client_contract/scenarios/fetch-null-member.json index d8795d5..3380391 100644 --- a/python/client-contract/src/dfo_client_contract/scenarios/fetch-null-member.json +++ b/python/client-contract/src/dfo_client_contract/scenarios/fetch-null-member.json @@ -33,7 +33,7 @@ "status": 200, "headers": { "content-type": "application/json", - "x-dfo-trace-id": "c7cb40f3790f4a15a0ddcad0cc93c9bb" + "x-dfo-trace-id": "92a325e77a854c5daafa875164b5e23e" }, "json": { "schema_version": 1, @@ -41,23 +41,27 @@ "entry_path": "raw_text", "raw_query": "ODA disbursements from Germany to Nigeria for basic health care", "normalized_query": "ODA disbursements from Germany to Nigeria for basic health care", - "extract_skipped": true + "extract_skipped": false }, "diagnostics": { - "engine_build": "d80df9f5fd598b7345255470932d202ee5d49942", - "trace_id": "c7cb40f3790f4a15a0ddcad0cc93c9bb", + "engine_build": "ccb6617922c839ce3cd5615a3bbb65c70bfe1bde", + "trace_id": "92a325e77a854c5daafa875164b5e23e", "warnings": [], "timing_ms": { - "total": 3, + "total": 17540, "by_step": { "coverage": 0, - "response_cache_layer1": 1 + "extract": 1239, + "exclusion_read": 719, + "cache_lookup": 0 } }, "llm_usage": { - "input_tokens": 0, - "output_tokens": 0, - "cached_tokens": 0 + "input_tokens": 2784, + "output_tokens": 111, + "cached_tokens": 0, + "jev_input_tokens": 6695, + "jev_output_tokens": 2088 }, "timed_out": false }, @@ -67,30 +71,30 @@ "variable_text": "ODA disbursements for basic health care", "warnings": [], "timing_ms": { - "total": 3011, + "total": 16265, "by_step": { - "recall": 457, + "recall": 2821, "phase_resolve_places": 0, "phase_check_entities": 0, "shape_arcs": 2, - "shape_probe_coverage": 8, - "shape_probe": 114, - "shape_groups": 579, + "shape_probe_coverage": 104, + "shape_probe": 352, + "shape_groups": 109, "shape_labels": 1, - "shape_admission": 2, + "shape_admission": 0, "phase_derive_shapes": 0, - "shape": 1247, + "shape": 1134, "phase_prune_and_rank": 0, - "bind": 266, - "phase_bind": 327, - "phase_settle": 46, - "phase_place_bindings": 57, + "bind": 5473, + "phase_bind": 345, + "phase_settle": 105, + "phase_place_bindings": 1078, "phase_facet_requests": 0, - "materialise": 44, - "phase_materialise": 200, - "answer": 220, - "options": 55, - "phase_outcome": 92 + "materialise": 2132, + "phase_materialise": 313, + "answer": 1829, + "options": 872, + "phase_outcome": 163 } }, "restatement": { @@ -537,7 +541,7 @@ "label": "OECD Terms and Conditions" } }, - "coverage_stamp": "e6e717ab8c77e84d010915893ede5809e9ecec67929a07cfafbcc2210edfa1eb", + "coverage_stamp": "ad27fd11738abb03d2d84dc214e223f04781609636cf678d0d08c385fb863d99", "facets": { "provenance": { "basis": "fallback", @@ -595,7 +599,7 @@ }, "relation": "child", "parent": "CRSCooperationModalityB", - "member_count": 1606, + "member_count": 1614, "served_rows": 1, "served_rows_exact": true }, @@ -609,7 +613,7 @@ }, "relation": "child", "parent": "CRSCooperationModalityB", - "member_count": 1331, + "member_count": 1337, "served_rows": 6, "served_rows_exact": true }, @@ -636,7 +640,7 @@ }, "relation": "child", "parent": "CRSCooperationModalityC", - "member_count": 7005, + "member_count": 7041, "served_rows": 7, "served_rows_exact": true }, @@ -732,7 +736,7 @@ }, "relation": "child", "parent": "CRSTypeOfFinance100", - "member_count": 12672, + "member_count": 12745, "served_rows": 30, "served_rows_exact": true } @@ -759,7 +763,7 @@ "value_kind": "enum_value" }, "relation": "root", - "member_count": 14098, + "member_count": 14146, "served_rows": 30, "served_rows_exact": true } @@ -1190,7 +1194,7 @@ "selected": [] } ], - "capability_version": "cap_765c9d2a0c7529b9", + "capability_version": "cap_4913302d7a6b6435", "default_reading": { "applied": true, "removed_stat_vars": [] @@ -1198,214 +1202,7 @@ }, "confidence": "high", "available_at_place": true, - "alternative_measures": [ - { - "definition": { - "schema_version": 1, - "spec_id": "spec_80b92ca1ba1114b426eb5e79b84361d4", - "identity": { - "identity_version": "spec1", - "shape": { - "kind": "statvar_schema", - "population_type": "FinancialFlow", - "measured_property": "amount", - "stat_type": "measuredValue", - "measurement_qualifier": "Nominal" - }, - "slots": [ - { - "property": "crsCooperationModality", - "binding": { - "state": "unbound" - } - }, - { - "property": "crsPurpose", - "binding": { - "state": "value", - "ref": "CRSPurposeCode12220" - } - }, - { - "property": "crsTypeOfFinance", - "binding": { - "state": "unbound" - } - }, - { - "property": "crsTypeOfFlow", - "binding": { - "state": "value", - "ref": "CRSTypeOfFlow10" - } - }, - { - "property": "financialFlowType", - "binding": { - "state": "value", - "ref": "Disbursement" - } - }, - { - "property": "nettingBasis", - "binding": { - "state": "value", - "ref": "Net" - } - } - ], - "entities": { - "destination": [ - "country/NGA" - ], - "origin": [ - "country/DEU" - ] - }, - "requested_window": { - "kind": "all" - } - } - }, - "label": "net disbursements", - "axis": "what", - "measure_axis_values": [ - { - "axis": "populationType", - "value": { - "ref": "FinancialFlow", - "label": "financial flow" - } - }, - { - "axis": "measuredProperty", - "value": { - "ref": "amount", - "label": "amount" - } - }, - { - "axis": "measurementQualifier", - "value": { - "ref": "Nominal", - "label": "nominal" - } - }, - { - "axis": "financialFlowType", - "value": { - "ref": "Disbursement", - "label": "disbursement" - } - }, - { - "axis": "nettingBasis", - "value": { - "ref": "Net", - "label": "net" - } - } - ], - "served_rows": 30, - "served_rows_exact": true - }, - { - "definition": { - "schema_version": 1, - "spec_id": "spec_c394f9108db2100f1c8e4532d8d1c804", - "identity": { - "identity_version": "spec1", - "shape": { - "kind": "statvar_schema", - "population_type": "FinancialObligation", - "measured_property": "amount", - "stat_type": "measuredValue", - "measurement_qualifier": "Nominal" - }, - "slots": [ - { - "property": "crsCooperationModality", - "binding": { - "state": "unbound" - } - }, - { - "property": "crsPurpose", - "binding": { - "state": "value", - "ref": "CRSPurposeCode12220" - } - }, - { - "property": "crsTypeOfFinance", - "binding": { - "state": "unbound" - } - }, - { - "property": "crsTypeOfFlow", - "binding": { - "state": "value", - "ref": "CRSTypeOfFlow10" - } - }, - { - "property": "financialObligationType", - "binding": { - "state": "value", - "ref": "Commitment" - } - } - ], - "entities": { - "destination": [ - "country/NGA" - ], - "origin": [ - "country/DEU" - ] - }, - "requested_window": { - "kind": "all" - } - } - }, - "label": "commitments", - "axis": "what", - "measure_axis_values": [ - { - "axis": "populationType", - "value": { - "ref": "FinancialObligation", - "label": "financial obligation" - } - }, - { - "axis": "measuredProperty", - "value": { - "ref": "amount", - "label": "amount" - } - }, - { - "axis": "measurementQualifier", - "value": { - "ref": "Nominal", - "label": "nominal" - } - }, - { - "axis": "financialObligationType", - "value": { - "ref": "Commitment", - "label": "commitment" - } - } - ], - "served_rows": 24, - "served_rows_exact": true - } - ], + "alternative_measures": [], "measure_label": "gross disbursements", "measure_label_axes": [ "populationType", @@ -1451,6 +1248,8 @@ } } ], + "concept_label": "basic health care", + "published_tables": "OECD Creditor Reporting System (CRS)", "open_axis_facts": [ { "property": "crsTypeOfFinance", @@ -3476,6 +3275,363 @@ "destination": "NGN", "origin": "EUR" } + }, + "scope_choices": { + "id": "spec_774d6c001a6250aa67ca676ab067895e", + "base": { + "schema_version": 1, + "spec_id": "spec_774d6c001a6250aa67ca676ab067895e", + "identity": { + "identity_version": "spec1", + "shape": { + "kind": "statvar_schema", + "population_type": "FinancialFlow", + "measured_property": "amount", + "stat_type": "measuredValue", + "measurement_qualifier": "Nominal" + }, + "slots": [ + { + "property": "crsCooperationModality", + "binding": { + "state": "unbound" + } + }, + { + "property": "crsPurpose", + "binding": { + "state": "value", + "ref": "CRSPurposeCode12220" + } + }, + { + "property": "crsTypeOfFinance", + "binding": { + "state": "unbound" + } + }, + { + "property": "crsTypeOfFlow", + "binding": { + "state": "value", + "ref": "CRSTypeOfFlow10" + } + }, + { + "property": "financialFlowType", + "binding": { + "state": "value", + "ref": "Disbursement" + } + }, + { + "property": "nettingBasis", + "binding": { + "state": "value", + "ref": "Gross" + } + } + ], + "entities": { + "destination": [ + "country/NGA" + ], + "origin": [ + "country/DEU" + ] + }, + "requested_window": { + "kind": "all" + } + } + }, + "rule_version": "scope1:3eef00a928eedd463ee48d02b79730da", + "entries": [ + { + "axis": "sector", + "option_id": "sector:12220", + "provenance": "explicit", + "origin": { + "kind": "text", + "text": "basic health care", + "start": 46, + "end": 63 + } + } + ], + "dropped_entries": [], + "choices": [ + { + "id": "spec_774d6c001a6250aa67ca676ab067895e:sector", + "axis": "sector", + "rule": "sector_code", + "provenance": "explicit", + "active": "sector:12220", + "options": [ + { + "option_id": "sector:12220", + "label": "basic health care (CRS 12220)", + "binding": { + "kind": "slot", + "slot": "crsPurpose", + "state": "value", + "refs": [ + "CRSPurposeCode12220" + ] + }, + "availability": { + "status": "available", + "detail": {} + } + } + ] + }, + { + "id": "spec_774d6c001a6250aa67ca676ab067895e:measure_basis", + "axis": "measure_basis", + "rule": "measure_basis_convention", + "provenance": "default", + "active": "measure_basis:gross", + "options": [ + { + "option_id": "measure_basis:gross", + "label": "gross disbursements, current USD", + "binding": { + "kind": "shape", + "measured_property": "amount", + "netting_basis": "Gross" + }, + "availability": { + "status": "available", + "detail": {} + } + }, + { + "option_id": "measure_basis:net", + "label": "net disbursements, current USD", + "binding": { + "kind": "shape", + "measured_property": "amount", + "netting_basis": "Net" + }, + "availability": { + "status": "available", + "detail": {} + } + }, + { + "option_id": "measure_basis:grant_equivalent", + "label": "grant equivalents (OECD headline), current USD", + "binding": { + "kind": "shape", + "measured_property": "grantEquivalent", + "netting_basis": null + }, + "availability": { + "status": "available", + "detail": {} + } + }, + { + "option_id": "measure_basis:commitments", + "label": "commitments, current USD", + "binding": { + "kind": "shape", + "measured_property": "amount", + "netting_basis": null + }, + "availability": { + "status": "available", + "detail": {} + } + } + ] + }, + { + "id": "spec_774d6c001a6250aa67ca676ab067895e:provider", + "axis": "provider", + "rule": "bilateral_flows", + "provenance": "default", + "active": "provider:bilateral", + "options": [ + { + "option_id": "provider:bilateral", + "label": "bilateral flows only", + "binding": { + "kind": "provider", + "scope": "bilateral" + }, + "availability": { + "status": "available", + "detail": {} + } + }, + { + "option_id": "provider:inclusive", + "label": "bilateral plus imputed multilateral, 2020 to 2024", + "binding": { + "kind": "provider", + "scope": "inclusive", + "window": [ + 2020, + 2024 + ], + "provenance": "provenance/ONEBilateralAndImputedMultilateral" + }, + "availability": { + "status": "partial", + "years": [ + [ + 2011, + 2016 + ], + [ + 2020, + 2024 + ] + ], + "code": "imputed_coverage", + "detail": {} + } + } + ] + } + ], + "compiled": { + "spec_id": "spec_774d6c001a6250aa67ca676ab067895e", + "identity": { + "identity_version": "spec1", + "shape": { + "kind": "statvar_schema", + "population_type": "FinancialFlow", + "measured_property": "amount", + "stat_type": "measuredValue", + "measurement_qualifier": "Nominal" + }, + "slots": [ + { + "property": "crsCooperationModality", + "binding": { + "state": "unbound" + } + }, + { + "property": "crsPurpose", + "binding": { + "state": "value", + "ref": "CRSPurposeCode12220" + } + }, + { + "property": "crsTypeOfFinance", + "binding": { + "state": "unbound" + } + }, + { + "property": "crsTypeOfFlow", + "binding": { + "state": "value", + "ref": "CRSTypeOfFlow10" + } + }, + { + "property": "financialFlowType", + "binding": { + "state": "value", + "ref": "Disbursement" + } + }, + { + "property": "nettingBasis", + "binding": { + "state": "value", + "ref": "Gross" + } + } + ], + "entities": { + "destination": [ + "country/NGA" + ], + "origin": [ + "country/DEU" + ] + }, + "requested_window": { + "kind": "all" + } + }, + "components": [ + { + "role": "whole", + "identity": { + "identity_version": "spec1", + "shape": { + "kind": "statvar_schema", + "population_type": "FinancialFlow", + "measured_property": "amount", + "stat_type": "measuredValue", + "measurement_qualifier": "Nominal" + }, + "slots": [ + { + "property": "crsCooperationModality", + "binding": { + "state": "unbound" + } + }, + { + "property": "crsPurpose", + "binding": { + "state": "value", + "ref": "CRSPurposeCode12220" + } + }, + { + "property": "crsTypeOfFinance", + "binding": { + "state": "unbound" + } + }, + { + "property": "crsTypeOfFlow", + "binding": { + "state": "value", + "ref": "CRSTypeOfFlow10" + } + }, + { + "property": "financialFlowType", + "binding": { + "state": "value", + "ref": "Disbursement" + } + }, + { + "property": "nettingBasis", + "binding": { + "state": "value", + "ref": "Gross" + } + } + ], + "entities": { + "destination": [ + "country/NGA" + ], + "origin": [ + "country/DEU" + ] + }, + "requested_window": { + "kind": "all" + } + } + } + ] + }, + "ledger": [] } } } @@ -3789,7 +3945,7 @@ "status": 200, "headers": { "content-type": "application/json", - "x-dfo-trace-id": "4c3f35c8c0d44b99941a73a9519b41d2" + "x-dfo-trace-id": "fff69a3d23f5431c8a34da1b72c9e034" }, "json": { "schema_version": 1, @@ -4189,8 +4345,8 @@ "family_member_digest": "9fd3643bbde505d9542fd3d090ddd549349765d12b6bad95b17271cbf297ea8c", "frame_grammar_version": "1.1.0", "origin_catalogue_build_id": "20261011T194155Z-80081f08", - "served_from": "head", - "confirmed_at": "2026-10-26T09:17:22.037029+00:00" + "served_from": "materialise", + "confirmed_at": "2026-11-01T07:35:51.549820+00:00" }, "warnings": [ { @@ -4220,7 +4376,7 @@ "created_at": "2026-10-23T16:56:32.058938+00:00", "tier": "working", "url": "/api/datasets/spec_774d6c001a6250aa67ca676ab067895e/cv_b92d94774702c7f05f2075d0b03dd756/files/sha256:421efacc2dc010af38112a087b0b49ff5539f61d2afd12a88272b27e99b5f5db", - "enrichment_stamp": "08ed6c734fc69ea2204a21f4e1dd8b963f14dd1e03a2484c618049ac2e2d93d8" + "enrichment_stamp": "55887b871f7aa1c5d120cb2bee97086605351d5acfbec645ab027f562d0f65c5" }, { "artifact_digest": "sha256:07984a96eaf8ee637fe15bf13f2b0d9160a6378d3fa1efae2e71cf0e20115dff", @@ -4236,7 +4392,7 @@ ], "series_count": 5, "output_options": { - "capability_version": "dset_76f5fa7244511c58", + "capability_version": "dset_5282a0674178a233", "columns": [ { "name": "stat_var", @@ -4320,7 +4476,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": false }, { "column": "financingProvider", @@ -4332,7 +4489,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": false }, { "column": "financingProvider", @@ -4344,7 +4502,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true }, { "column": "financingProvider", @@ -4356,7 +4515,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": false }, { "column": "financingProvider", @@ -4368,7 +4528,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true }, { "column": "financingProvider", @@ -4380,7 +4541,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true }, { "column": "financingProvider", @@ -4392,7 +4554,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true }, { "column": "financingRecipient", @@ -4404,7 +4567,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": false }, { "column": "financingRecipient", @@ -4416,7 +4580,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": false }, { "column": "financingRecipient", @@ -4428,7 +4593,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true }, { "column": "financingRecipient", @@ -4440,7 +4606,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": false }, { "column": "financingRecipient", @@ -4452,7 +4619,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true }, { "column": "financingRecipient", @@ -4464,7 +4632,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true }, { "column": "financingRecipient", @@ -4476,7 +4645,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true } ], "long_layout_defaults": [ @@ -4520,7 +4690,7 @@ ] } }, - "series_coverage_stamp": "e6e717ab8c77e84d010915893ede5809e9ecec67929a07cfafbcc2210edfa1eb", + "series_coverage_stamp": "ad27fd11738abb03d2d84dc214e223f04781609636cf678d0d08c385fb863d99", "retention": { "pinned": true } @@ -4537,7 +4707,7 @@ "headers": { "content-type": "text/html", "location": "https://storage.googleapis.com/dev-fin-observatory-datasets-working/sha256%3A421efacc2dc010af38112a087b0b49ff5539f61d2afd12a88272b27e99b5f5db?X-Goog-Signature=redacted", - "x-dfo-trace-id": "333ab72de55449ed8288a5f458406a4c" + "x-dfo-trace-id": "815c18c3e59945d6ade9f99db58f2960" } } }, diff --git a/python/client-contract/src/dfo_client_contract/scenarios/fetch-partial-nothing-answered.json b/python/client-contract/src/dfo_client_contract/scenarios/fetch-partial-nothing-answered.json index 2adeebd..b7e3c75 100644 --- a/python/client-contract/src/dfo_client_contract/scenarios/fetch-partial-nothing-answered.json +++ b/python/client-contract/src/dfo_client_contract/scenarios/fetch-partial-nothing-answered.json @@ -34,7 +34,7 @@ "status": 200, "headers": { "content-type": "application/json", - "x-dfo-trace-id": "01cf4a9623c449759f24d249f8783de1" + "x-dfo-trace-id": "1d05424fb2784068acf168d73a67c0d0" }, "json": { "schema_version": 1, @@ -45,21 +45,22 @@ "extract_skipped": false }, "diagnostics": { - "engine_build": "d80df9f5fd598b7345255470932d202ee5d49942", - "trace_id": "01cf4a9623c449759f24d249f8783de1", + "engine_build": "ccb6617922c839ce3cd5615a3bbb65c70bfe1bde", + "trace_id": "1d05424fb2784068acf168d73a67c0d0", "warnings": [], "timing_ms": { - "total": 1162, + "total": 1946, "by_step": { "coverage": 0, - "extract": 1040, + "extract": 1070, + "exclusion_read": 606, "cache_lookup": 0 } }, "llm_usage": { - "input_tokens": 2233, - "output_tokens": 193, - "cached_tokens": 841 + "input_tokens": 2788, + "output_tokens": 202, + "cached_tokens": 0 }, "timed_out": false }, @@ -69,10 +70,10 @@ "variable_text": "ODA disbursements", "warnings": [], "timing_ms": { - "total": 117, + "total": 871, "by_step": { - "recall": 117, - "phase_resolve_places": 0, + "recall": 870, + "phase_resolve_places": 1, "phase_check_entities": 0 } }, @@ -122,7 +123,9 @@ "entity_refs": [ { "text": "Germany", - "refs": [] + "refs": [ + "country/DEU" + ] }, { "text": "Congo", @@ -281,7 +284,7 @@ "error": { "class": "IncompleteAnswerError", "code": "answer_incomplete", - "trace_id": "01cf4a9623c449759f24d249f8783de1" + "trace_id": "1d05424fb2784068acf168d73a67c0d0" } } ] diff --git a/python/client-contract/src/dfo_client_contract/scenarios/fetch-ref-artifact-unlisted.json b/python/client-contract/src/dfo_client_contract/scenarios/fetch-ref-artifact-unlisted.json index f77ae51..58ccfb3 100644 --- a/python/client-contract/src/dfo_client_contract/scenarios/fetch-ref-artifact-unlisted.json +++ b/python/client-contract/src/dfo_client_contract/scenarios/fetch-ref-artifact-unlisted.json @@ -112,7 +112,7 @@ "status": 200, "headers": { "content-type": "application/json", - "x-dfo-trace-id": "6bc9cad45e3c48769587db03ca0826a9" + "x-dfo-trace-id": "bb0701b517bc480c84122af2117d7553" }, "json": { "schema_version": 1, @@ -555,6 +555,28 @@ "tier": "working", "url": "/api/datasets/spec_774d6c001a6250aa67ca676ab067895e/cv_b92d94774702c7f05f2075d0b03dd756/files/sha256:f4026e80af4b8683d3bb86645ab3aca83dff75cd03fdd4c73ec54ba638922104" }, + { + "artifact_digest": "sha256:f9d7dfe335ac52c61aa7eb6d0af51c247eff6248bf3640687977c716f8419ef5", + "rendering": { + "bundle": false, + "format": "parquet", + "layout": "frame", + "columns": [ + "financingProvider_type", + "financingRecipient_type", + "party_class", + "party_kind", + "party_whole" + ], + "without_party_totals": true + }, + "bytes": 8160, + "media_type": "application/vnd.apache.parquet", + "created_at": "2026-10-29T22:26:42.669646+00:00", + "tier": "working", + "url": "/api/datasets/spec_774d6c001a6250aa67ca676ab067895e/cv_b92d94774702c7f05f2075d0b03dd756/files/sha256:f9d7dfe335ac52c61aa7eb6d0af51c247eff6248bf3640687977c716f8419ef5", + "enrichment_stamp": "55887b871f7aa1c5d120cb2bee97086605351d5acfbec645ab027f562d0f65c5" + }, { "artifact_digest": "sha256:2ff184d2ad022189c2b071f35cfd3a1119cd987cd883c5e84b2e61c9a68dc9cf", "rendering": { @@ -658,7 +680,7 @@ ], "series_count": 5, "output_options": { - "capability_version": "dset_76f5fa7244511c58", + "capability_version": "dset_5282a0674178a233", "columns": [ { "name": "stat_var", @@ -741,7 +763,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": false }, { "column": "financingProvider", @@ -753,7 +776,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": false }, { "column": "financingProvider", @@ -765,7 +789,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true }, { "column": "financingProvider", @@ -777,7 +802,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": false }, { "column": "financingProvider", @@ -789,7 +815,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true }, { "column": "financingProvider", @@ -801,7 +828,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true }, { "column": "financingProvider", @@ -813,7 +841,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true }, { "column": "financingRecipient", @@ -825,7 +854,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": false }, { "column": "financingRecipient", @@ -837,7 +867,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": false }, { "column": "financingRecipient", @@ -849,7 +880,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true }, { "column": "financingRecipient", @@ -861,7 +893,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": false }, { "column": "financingRecipient", @@ -873,7 +906,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true }, { "column": "financingRecipient", @@ -885,7 +919,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true }, { "column": "financingRecipient", @@ -897,7 +932,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true } ], "long_layout_defaults": [ @@ -958,7 +994,7 @@ "headers": { "content-type": "text/html", "location": "https://storage.googleapis.com/dev-fin-observatory-datasets-working/sha256%3A421efacc2dc010af38112a087b0b49ff5539f61d2afd12a88272b27e99b5f5db?X-Goog-Signature=redacted", - "x-dfo-trace-id": "9db04233957a46068e3999162a93c70c" + "x-dfo-trace-id": "da35390e87c443c488094765dcbbb302" } } }, diff --git a/python/client-contract/src/dfo_client_contract/scenarios/fetch-ref-expired-file-selector.json b/python/client-contract/src/dfo_client_contract/scenarios/fetch-ref-expired-file-selector.json index d5debee..929ef20 100644 --- a/python/client-contract/src/dfo_client_contract/scenarios/fetch-ref-expired-file-selector.json +++ b/python/client-contract/src/dfo_client_contract/scenarios/fetch-ref-expired-file-selector.json @@ -112,7 +112,7 @@ "status": 200, "headers": { "content-type": "application/json", - "x-dfo-trace-id": "6bc9cad45e3c48769587db03ca0826a9" + "x-dfo-trace-id": "bb0701b517bc480c84122af2117d7553" }, "json": { "schema_version": 1, @@ -541,7 +541,7 @@ "created_at": "2026-10-23T16:56:32.058938+00:00", "tier": "working", "url": "/api/datasets/spec_774d6c001a6250aa67ca676ab067895e/cv_b92d94774702c7f05f2075d0b03dd756/files/sha256:421efacc2dc010af38112a087b0b49ff5539f61d2afd12a88272b27e99b5f5db", - "enrichment_stamp": "08ed6c734fc69ea2204a21f4e1dd8b963f14dd1e03a2484c618049ac2e2d93d8" + "enrichment_stamp": "55887b871f7aa1c5d120cb2bee97086605351d5acfbec645ab027f562d0f65c5" }, { "artifact_digest": "sha256:421efacc2dc010af38112a087b0b49ff5539f61d2afd12a88272b27e99b5f5db", @@ -554,8 +554,20 @@ "media_type": "application/vnd.apache.parquet", "created_at": "2026-10-23T16:56:32.058938+00:00", "tier": "working", - "url": "/api/datasets/spec_774d6c001a6250aa67ca676ab067895e/cv_b92d94774702c7f05f2075d0b03dd756/files/sha256:421efacc2dc010af38112a087b0b49ff5539f61d2afd12a88272b27e99b5f5db", - "enrichment_stamp": "08ed6c734fc69ea2204a21f4e1dd8b963f14dd1e03a2484c618049ac2e2d93d8" + "url": "/api/datasets/spec_774d6c001a6250aa67ca676ab067895e/cv_b92d94774702c7f05f2075d0b03dd756/files/sha256:421efacc2dc010af38112a087b0b49ff5539f61d2afd12a88272b27e99b5f5db" + }, + { + "artifact_digest": "sha256:421efacc2dc010af38112a087b0b49ff5539f61d2afd12a88272b27e99b5f5db", + "rendering": { + "bundle": false, + "format": "parquet", + "layout": 4 + }, + "bytes": 9842, + "media_type": "application/vnd.apache.parquet", + "created_at": "2026-10-23T16:56:32.058938+00:00", + "tier": "working", + "url": "/api/datasets/spec_774d6c001a6250aa67ca676ab067895e/cv_b92d94774702c7f05f2075d0b03dd756/files/sha256:421efacc2dc010af38112a087b0b49ff5539f61d2afd12a88272b27e99b5f5db" }, { "artifact_digest": "sha256:f4026e80af4b8683d3bb86645ab3aca83dff75cd03fdd4c73ec54ba638922104", @@ -584,6 +596,28 @@ "tier": "working", "url": "/api/datasets/spec_774d6c001a6250aa67ca676ab067895e/cv_b92d94774702c7f05f2075d0b03dd756/files/sha256:f4026e80af4b8683d3bb86645ab3aca83dff75cd03fdd4c73ec54ba638922104" }, + { + "artifact_digest": "sha256:f9d7dfe335ac52c61aa7eb6d0af51c247eff6248bf3640687977c716f8419ef5", + "rendering": { + "bundle": false, + "format": "parquet", + "layout": "frame", + "columns": [ + "financingProvider_type", + "financingRecipient_type", + "party_class", + "party_kind", + "party_whole" + ], + "without_party_totals": true + }, + "bytes": 8160, + "media_type": "application/vnd.apache.parquet", + "created_at": "2026-10-29T22:26:42.669646+00:00", + "tier": "working", + "url": "/api/datasets/spec_774d6c001a6250aa67ca676ab067895e/cv_b92d94774702c7f05f2075d0b03dd756/files/sha256:f9d7dfe335ac52c61aa7eb6d0af51c247eff6248bf3640687977c716f8419ef5", + "enrichment_stamp": "55887b871f7aa1c5d120cb2bee97086605351d5acfbec645ab027f562d0f65c5" + }, { "artifact_digest": "sha256:2ff184d2ad022189c2b071f35cfd3a1119cd987cd883c5e84b2e61c9a68dc9cf", "rendering": { @@ -687,7 +721,7 @@ ], "series_count": 5, "output_options": { - "capability_version": "dset_76f5fa7244511c58", + "capability_version": "dset_5282a0674178a233", "columns": [ { "name": "stat_var", @@ -770,7 +804,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": false }, { "column": "financingProvider", @@ -782,7 +817,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": false }, { "column": "financingProvider", @@ -794,7 +830,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true }, { "column": "financingProvider", @@ -806,7 +843,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": false }, { "column": "financingProvider", @@ -818,7 +856,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true }, { "column": "financingProvider", @@ -830,7 +869,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true }, { "column": "financingProvider", @@ -842,7 +882,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true }, { "column": "financingRecipient", @@ -854,7 +895,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": false }, { "column": "financingRecipient", @@ -866,7 +908,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": false }, { "column": "financingRecipient", @@ -878,7 +921,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true }, { "column": "financingRecipient", @@ -890,7 +934,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": false }, { "column": "financingRecipient", @@ -902,7 +947,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true }, { "column": "financingRecipient", @@ -914,7 +960,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true }, { "column": "financingRecipient", @@ -926,7 +973,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true } ], "long_layout_defaults": [ @@ -1009,7 +1057,7 @@ "headers": { "content-type": "text/html", "location": "https://storage.googleapis.com/dev-fin-observatory-datasets-working/sha256%3A421efacc2dc010af38112a087b0b49ff5539f61d2afd12a88272b27e99b5f5db?X-Goog-Signature=redacted", - "x-dfo-trace-id": "9db04233957a46068e3999162a93c70c" + "x-dfo-trace-id": "da35390e87c443c488094765dcbbb302" } } }, diff --git a/python/client-contract/src/dfo_client_contract/scenarios/fetch-ref-expired-newer-version.json b/python/client-contract/src/dfo_client_contract/scenarios/fetch-ref-expired-newer-version.json index beb1daf..e168085 100644 --- a/python/client-contract/src/dfo_client_contract/scenarios/fetch-ref-expired-newer-version.json +++ b/python/client-contract/src/dfo_client_contract/scenarios/fetch-ref-expired-newer-version.json @@ -213,7 +213,7 @@ "status": 200, "headers": { "content-type": "application/json", - "x-dfo-trace-id": "4c3f35c8c0d44b99941a73a9519b41d2" + "x-dfo-trace-id": "fff69a3d23f5431c8a34da1b72c9e034" }, "json": { "schema_version": 1, @@ -613,8 +613,8 @@ "family_member_digest": "9fd3643bbde505d9542fd3d090ddd549349765d12b6bad95b17271cbf297ea8c", "frame_grammar_version": "1.1.0", "origin_catalogue_build_id": "20261011T194155Z-80081f08", - "served_from": "head", - "confirmed_at": "2026-10-26T09:17:22.037029+00:00" + "served_from": "materialise", + "confirmed_at": "2026-11-01T07:35:51.549820+00:00" }, "warnings": [ { @@ -644,7 +644,7 @@ "created_at": "2026-10-23T16:56:32.058938+00:00", "tier": "working", "url": "/api/datasets/spec_774d6c001a6250aa67ca676ab067895e/cv_b92d94774702c7f05f2075d0b03dd756/files/sha256:421efacc2dc010af38112a087b0b49ff5539f61d2afd12a88272b27e99b5f5db", - "enrichment_stamp": "08ed6c734fc69ea2204a21f4e1dd8b963f14dd1e03a2484c618049ac2e2d93d8" + "enrichment_stamp": "55887b871f7aa1c5d120cb2bee97086605351d5acfbec645ab027f562d0f65c5" }, { "artifact_digest": "sha256:07984a96eaf8ee637fe15bf13f2b0d9160a6378d3fa1efae2e71cf0e20115dff", @@ -660,7 +660,7 @@ ], "series_count": 5, "output_options": { - "capability_version": "dset_76f5fa7244511c58", + "capability_version": "dset_5282a0674178a233", "columns": [ { "name": "stat_var", @@ -743,7 +743,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": false }, { "column": "financingProvider", @@ -755,7 +756,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": false }, { "column": "financingProvider", @@ -767,7 +769,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true }, { "column": "financingProvider", @@ -779,7 +782,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": false }, { "column": "financingProvider", @@ -791,7 +795,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true }, { "column": "financingProvider", @@ -803,7 +808,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true }, { "column": "financingProvider", @@ -815,7 +821,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true }, { "column": "financingRecipient", @@ -827,7 +834,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": false }, { "column": "financingRecipient", @@ -839,7 +847,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": false }, { "column": "financingRecipient", @@ -851,7 +860,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true }, { "column": "financingRecipient", @@ -863,7 +873,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": false }, { "column": "financingRecipient", @@ -875,7 +886,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true }, { "column": "financingRecipient", @@ -887,7 +899,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true }, { "column": "financingRecipient", @@ -899,7 +912,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true } ], "long_layout_defaults": [ @@ -943,7 +957,7 @@ ] } }, - "series_coverage_stamp": "e6e717ab8c77e84d010915893ede5809e9ecec67929a07cfafbcc2210edfa1eb", + "series_coverage_stamp": "ad27fd11738abb03d2d84dc214e223f04781609636cf678d0d08c385fb863d99", "retention": { "pinned": true } diff --git a/python/client-contract/src/dfo_client_contract/scenarios/fetch-ref-expired-not-reproducible.json b/python/client-contract/src/dfo_client_contract/scenarios/fetch-ref-expired-not-reproducible.json index 84a42e1..c96218c 100644 --- a/python/client-contract/src/dfo_client_contract/scenarios/fetch-ref-expired-not-reproducible.json +++ b/python/client-contract/src/dfo_client_contract/scenarios/fetch-ref-expired-not-reproducible.json @@ -233,12 +233,12 @@ "status": 200, "headers": { "content-type": "application/json", - "x-dfo-trace-id": "7675f31f4bd548c782dad4c6001a7666" + "x-dfo-trace-id": "7f479c764ec644b6a5604ebb5b57e314" }, "json": { "schema_version": 1, "spec_id": "spec_774d6c001a6250aa67ca676ab067895e", - "enrichment_stamp": "08ed6c734fc69ea2204a21f4e1dd8b963f14dd1e03a2484c618049ac2e2d93d8", + "enrichment_stamp": "55887b871f7aa1c5d120cb2bee97086605351d5acfbec645ab027f562d0f65c5", "versions": [ { "content_version": "cv_25fa336da15247db708dd220b2d933a2", @@ -250,28 +250,28 @@ ], "op": "sum" }, - "enrichment_stamp": "08ed6c734fc69ea2204a21f4e1dd8b963f14dd1e03a2484c618049ac2e2d93d8" + "enrichment_stamp": "55887b871f7aa1c5d120cb2bee97086605351d5acfbec645ab027f562d0f65c5" }, { "content_version": "cv_b92d94774702c7f05f2075d0b03dd756", "base_content_version": null, "rendering": "plain", "groupby": null, - "enrichment_stamp": "08ed6c734fc69ea2204a21f4e1dd8b963f14dd1e03a2484c618049ac2e2d93d8" + "enrichment_stamp": "55887b871f7aa1c5d120cb2bee97086605351d5acfbec645ab027f562d0f65c5" }, { "content_version": "cv_9417c96e4e09dd36053fc395c5b0f92c", "base_content_version": null, "rendering": "plain", "groupby": null, - "enrichment_stamp": "08ed6c734fc69ea2204a21f4e1dd8b963f14dd1e03a2484c618049ac2e2d93d8" + "enrichment_stamp": "55887b871f7aa1c5d120cb2bee97086605351d5acfbec645ab027f562d0f65c5" }, { "content_version": "cv_e7f6ed9ddc5ca69902f92a8866f93ef7", "base_content_version": null, "rendering": "plain", "groupby": null, - "enrichment_stamp": "08ed6c734fc69ea2204a21f4e1dd8b963f14dd1e03a2484c618049ac2e2d93d8" + "enrichment_stamp": "55887b871f7aa1c5d120cb2bee97086605351d5acfbec645ab027f562d0f65c5" } ], "next_cursor": null, diff --git a/python/client-contract/src/dfo_client_contract/scenarios/fetch-ref-expired-rebuild-other-spec.json b/python/client-contract/src/dfo_client_contract/scenarios/fetch-ref-expired-rebuild-other-spec.json index aac6fda..d888d0c 100644 --- a/python/client-contract/src/dfo_client_contract/scenarios/fetch-ref-expired-rebuild-other-spec.json +++ b/python/client-contract/src/dfo_client_contract/scenarios/fetch-ref-expired-rebuild-other-spec.json @@ -213,7 +213,7 @@ "status": 200, "headers": { "content-type": "application/json", - "x-dfo-trace-id": "4c3f35c8c0d44b99941a73a9519b41d2" + "x-dfo-trace-id": "fff69a3d23f5431c8a34da1b72c9e034" }, "json": { "schema_version": 1, @@ -613,8 +613,8 @@ "family_member_digest": "9fd3643bbde505d9542fd3d090ddd549349765d12b6bad95b17271cbf297ea8c", "frame_grammar_version": "1.1.0", "origin_catalogue_build_id": "20261011T194155Z-80081f08", - "served_from": "head", - "confirmed_at": "2026-10-26T09:17:22.037029+00:00" + "served_from": "materialise", + "confirmed_at": "2026-11-01T07:35:51.549820+00:00" }, "warnings": [ { @@ -644,7 +644,7 @@ "created_at": "2026-10-23T16:56:32.058938+00:00", "tier": "working", "url": "/api/datasets/spec_774d6c001a6250aa67ca676ab067895e/cv_b92d94774702c7f05f2075d0b03dd756/files/sha256:421efacc2dc010af38112a087b0b49ff5539f61d2afd12a88272b27e99b5f5db", - "enrichment_stamp": "08ed6c734fc69ea2204a21f4e1dd8b963f14dd1e03a2484c618049ac2e2d93d8" + "enrichment_stamp": "55887b871f7aa1c5d120cb2bee97086605351d5acfbec645ab027f562d0f65c5" }, { "artifact_digest": "sha256:07984a96eaf8ee637fe15bf13f2b0d9160a6378d3fa1efae2e71cf0e20115dff", @@ -660,7 +660,7 @@ ], "series_count": 5, "output_options": { - "capability_version": "dset_76f5fa7244511c58", + "capability_version": "dset_5282a0674178a233", "columns": [ { "name": "stat_var", @@ -743,7 +743,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": false }, { "column": "financingProvider", @@ -755,7 +756,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": false }, { "column": "financingProvider", @@ -767,7 +769,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true }, { "column": "financingProvider", @@ -779,7 +782,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": false }, { "column": "financingProvider", @@ -791,7 +795,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true }, { "column": "financingProvider", @@ -803,7 +808,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true }, { "column": "financingProvider", @@ -815,7 +821,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true }, { "column": "financingRecipient", @@ -827,7 +834,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": false }, { "column": "financingRecipient", @@ -839,7 +847,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": false }, { "column": "financingRecipient", @@ -851,7 +860,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true }, { "column": "financingRecipient", @@ -863,7 +873,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": false }, { "column": "financingRecipient", @@ -875,7 +886,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true }, { "column": "financingRecipient", @@ -887,7 +899,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true }, { "column": "financingRecipient", @@ -899,7 +912,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true } ], "long_layout_defaults": [ @@ -943,7 +957,7 @@ ] } }, - "series_coverage_stamp": "e6e717ab8c77e84d010915893ede5809e9ecec67929a07cfafbcc2210edfa1eb", + "series_coverage_stamp": "ad27fd11738abb03d2d84dc214e223f04781609636cf678d0d08c385fb863d99", "retention": { "pinned": true } @@ -956,7 +970,7 @@ "error": { "class": "ContractError", "code": "contract_violation", - "trace_id": "4c3f35c8c0d44b99941a73a9519b41d2" + "trace_id": "fff69a3d23f5431c8a34da1b72c9e034" } } ] diff --git a/python/client-contract/src/dfo_client_contract/scenarios/fetch-ref-expired-rebuild-same-version.json b/python/client-contract/src/dfo_client_contract/scenarios/fetch-ref-expired-rebuild-same-version.json index 680ad6d..0ff0687 100644 --- a/python/client-contract/src/dfo_client_contract/scenarios/fetch-ref-expired-rebuild-same-version.json +++ b/python/client-contract/src/dfo_client_contract/scenarios/fetch-ref-expired-rebuild-same-version.json @@ -213,7 +213,7 @@ "status": 200, "headers": { "content-type": "application/json", - "x-dfo-trace-id": "4c3f35c8c0d44b99941a73a9519b41d2" + "x-dfo-trace-id": "fff69a3d23f5431c8a34da1b72c9e034" }, "json": { "schema_version": 1, @@ -613,8 +613,8 @@ "family_member_digest": "9fd3643bbde505d9542fd3d090ddd549349765d12b6bad95b17271cbf297ea8c", "frame_grammar_version": "1.1.0", "origin_catalogue_build_id": "20261011T194155Z-80081f08", - "served_from": "head", - "confirmed_at": "2026-10-26T09:17:22.037029+00:00" + "served_from": "materialise", + "confirmed_at": "2026-11-01T07:35:51.549820+00:00" }, "warnings": [ { @@ -644,7 +644,7 @@ "created_at": "2026-10-23T16:56:32.058938+00:00", "tier": "working", "url": "/api/datasets/spec_774d6c001a6250aa67ca676ab067895e/cv_b92d94774702c7f05f2075d0b03dd756/files/sha256:421efacc2dc010af38112a087b0b49ff5539f61d2afd12a88272b27e99b5f5db", - "enrichment_stamp": "08ed6c734fc69ea2204a21f4e1dd8b963f14dd1e03a2484c618049ac2e2d93d8" + "enrichment_stamp": "55887b871f7aa1c5d120cb2bee97086605351d5acfbec645ab027f562d0f65c5" }, { "artifact_digest": "sha256:07984a96eaf8ee637fe15bf13f2b0d9160a6378d3fa1efae2e71cf0e20115dff", @@ -660,7 +660,7 @@ ], "series_count": 5, "output_options": { - "capability_version": "dset_76f5fa7244511c58", + "capability_version": "dset_5282a0674178a233", "columns": [ { "name": "stat_var", @@ -743,7 +743,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": false }, { "column": "financingProvider", @@ -755,7 +756,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": false }, { "column": "financingProvider", @@ -767,7 +769,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true }, { "column": "financingProvider", @@ -779,7 +782,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": false }, { "column": "financingProvider", @@ -791,7 +795,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true }, { "column": "financingProvider", @@ -803,7 +808,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true }, { "column": "financingProvider", @@ -815,7 +821,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true }, { "column": "financingRecipient", @@ -827,7 +834,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": false }, { "column": "financingRecipient", @@ -839,7 +847,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": false }, { "column": "financingRecipient", @@ -851,7 +860,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true }, { "column": "financingRecipient", @@ -863,7 +873,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": false }, { "column": "financingRecipient", @@ -875,7 +886,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true }, { "column": "financingRecipient", @@ -887,7 +899,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true }, { "column": "financingRecipient", @@ -899,7 +912,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true } ], "long_layout_defaults": [ @@ -943,7 +957,7 @@ ] } }, - "series_coverage_stamp": "e6e717ab8c77e84d010915893ede5809e9ecec67929a07cfafbcc2210edfa1eb", + "series_coverage_stamp": "ad27fd11738abb03d2d84dc214e223f04781609636cf678d0d08c385fb863d99", "retention": { "pinned": true } @@ -960,7 +974,7 @@ "headers": { "content-type": "text/html", "location": "https://storage.googleapis.com/dev-fin-observatory-datasets-working/sha256%3A421efacc2dc010af38112a087b0b49ff5539f61d2afd12a88272b27e99b5f5db?X-Goog-Signature=redacted", - "x-dfo-trace-id": "333ab72de55449ed8288a5f458406a4c" + "x-dfo-trace-id": "815c18c3e59945d6ade9f99db58f2960" } } }, diff --git a/python/client-contract/src/dfo_client_contract/scenarios/fetch-ref-newest-version.json b/python/client-contract/src/dfo_client_contract/scenarios/fetch-ref-newest-version.json index 609e0ee..515ff12 100644 --- a/python/client-contract/src/dfo_client_contract/scenarios/fetch-ref-newest-version.json +++ b/python/client-contract/src/dfo_client_contract/scenarios/fetch-ref-newest-version.json @@ -5,8 +5,8 @@ "origin": { "kind": "recorded", "base_url": "https://dfo-dev-apis-zms5lj4zhq-nn.a.run.app/api", - "dfo_commit": "d80df9f5fd598b7345255470932d202ee5d49942", - "recorded_at": "2026-10-26T09:23:52Z" + "dfo_commit": "ccb6617922c839ce3cd5615a3bbb65c70bfe1bde", + "recorded_at": "2026-11-01T07:39:53Z" }, "call": [ { @@ -94,12 +94,12 @@ "status": 200, "headers": { "content-type": "application/json", - "x-dfo-trace-id": "7675f31f4bd548c782dad4c6001a7666" + "x-dfo-trace-id": "7f479c764ec644b6a5604ebb5b57e314" }, "json": { "schema_version": 1, "spec_id": "spec_774d6c001a6250aa67ca676ab067895e", - "enrichment_stamp": "08ed6c734fc69ea2204a21f4e1dd8b963f14dd1e03a2484c618049ac2e2d93d8", + "enrichment_stamp": "55887b871f7aa1c5d120cb2bee97086605351d5acfbec645ab027f562d0f65c5", "versions": [ { "content_version": "cv_25fa336da15247db708dd220b2d933a2", @@ -111,28 +111,28 @@ ], "op": "sum" }, - "enrichment_stamp": "08ed6c734fc69ea2204a21f4e1dd8b963f14dd1e03a2484c618049ac2e2d93d8" + "enrichment_stamp": "55887b871f7aa1c5d120cb2bee97086605351d5acfbec645ab027f562d0f65c5" }, { "content_version": "cv_b92d94774702c7f05f2075d0b03dd756", "base_content_version": null, "rendering": "plain", "groupby": null, - "enrichment_stamp": "08ed6c734fc69ea2204a21f4e1dd8b963f14dd1e03a2484c618049ac2e2d93d8" + "enrichment_stamp": "55887b871f7aa1c5d120cb2bee97086605351d5acfbec645ab027f562d0f65c5" }, { "content_version": "cv_9417c96e4e09dd36053fc395c5b0f92c", "base_content_version": null, "rendering": "plain", "groupby": null, - "enrichment_stamp": "08ed6c734fc69ea2204a21f4e1dd8b963f14dd1e03a2484c618049ac2e2d93d8" + "enrichment_stamp": "55887b871f7aa1c5d120cb2bee97086605351d5acfbec645ab027f562d0f65c5" }, { "content_version": "cv_e7f6ed9ddc5ca69902f92a8866f93ef7", "base_content_version": null, "rendering": "plain", "groupby": null, - "enrichment_stamp": "08ed6c734fc69ea2204a21f4e1dd8b963f14dd1e03a2484c618049ac2e2d93d8" + "enrichment_stamp": "55887b871f7aa1c5d120cb2bee97086605351d5acfbec645ab027f562d0f65c5" } ], "next_cursor": null, diff --git a/python/client-contract/src/dfo_client_contract/scenarios/fetch-ref-signed-url-refused-twice.json b/python/client-contract/src/dfo_client_contract/scenarios/fetch-ref-signed-url-refused-twice.json index 5d12fa5..1a1049e 100644 --- a/python/client-contract/src/dfo_client_contract/scenarios/fetch-ref-signed-url-refused-twice.json +++ b/python/client-contract/src/dfo_client_contract/scenarios/fetch-ref-signed-url-refused-twice.json @@ -112,7 +112,7 @@ "status": 200, "headers": { "content-type": "application/json", - "x-dfo-trace-id": "6bc9cad45e3c48769587db03ca0826a9" + "x-dfo-trace-id": "bb0701b517bc480c84122af2117d7553" }, "json": { "schema_version": 1, @@ -541,7 +541,7 @@ "created_at": "2026-10-23T16:56:32.058938+00:00", "tier": "working", "url": "/api/datasets/spec_774d6c001a6250aa67ca676ab067895e/cv_b92d94774702c7f05f2075d0b03dd756/files/sha256:421efacc2dc010af38112a087b0b49ff5539f61d2afd12a88272b27e99b5f5db", - "enrichment_stamp": "08ed6c734fc69ea2204a21f4e1dd8b963f14dd1e03a2484c618049ac2e2d93d8" + "enrichment_stamp": "55887b871f7aa1c5d120cb2bee97086605351d5acfbec645ab027f562d0f65c5" }, { "artifact_digest": "sha256:421efacc2dc010af38112a087b0b49ff5539f61d2afd12a88272b27e99b5f5db", @@ -554,8 +554,20 @@ "media_type": "application/vnd.apache.parquet", "created_at": "2026-10-23T16:56:32.058938+00:00", "tier": "working", - "url": "/api/datasets/spec_774d6c001a6250aa67ca676ab067895e/cv_b92d94774702c7f05f2075d0b03dd756/files/sha256:421efacc2dc010af38112a087b0b49ff5539f61d2afd12a88272b27e99b5f5db", - "enrichment_stamp": "08ed6c734fc69ea2204a21f4e1dd8b963f14dd1e03a2484c618049ac2e2d93d8" + "url": "/api/datasets/spec_774d6c001a6250aa67ca676ab067895e/cv_b92d94774702c7f05f2075d0b03dd756/files/sha256:421efacc2dc010af38112a087b0b49ff5539f61d2afd12a88272b27e99b5f5db" + }, + { + "artifact_digest": "sha256:421efacc2dc010af38112a087b0b49ff5539f61d2afd12a88272b27e99b5f5db", + "rendering": { + "bundle": false, + "format": "parquet", + "layout": 4 + }, + "bytes": 9842, + "media_type": "application/vnd.apache.parquet", + "created_at": "2026-10-23T16:56:32.058938+00:00", + "tier": "working", + "url": "/api/datasets/spec_774d6c001a6250aa67ca676ab067895e/cv_b92d94774702c7f05f2075d0b03dd756/files/sha256:421efacc2dc010af38112a087b0b49ff5539f61d2afd12a88272b27e99b5f5db" }, { "artifact_digest": "sha256:f4026e80af4b8683d3bb86645ab3aca83dff75cd03fdd4c73ec54ba638922104", @@ -584,6 +596,28 @@ "tier": "working", "url": "/api/datasets/spec_774d6c001a6250aa67ca676ab067895e/cv_b92d94774702c7f05f2075d0b03dd756/files/sha256:f4026e80af4b8683d3bb86645ab3aca83dff75cd03fdd4c73ec54ba638922104" }, + { + "artifact_digest": "sha256:f9d7dfe335ac52c61aa7eb6d0af51c247eff6248bf3640687977c716f8419ef5", + "rendering": { + "bundle": false, + "format": "parquet", + "layout": "frame", + "columns": [ + "financingProvider_type", + "financingRecipient_type", + "party_class", + "party_kind", + "party_whole" + ], + "without_party_totals": true + }, + "bytes": 8160, + "media_type": "application/vnd.apache.parquet", + "created_at": "2026-10-29T22:26:42.669646+00:00", + "tier": "working", + "url": "/api/datasets/spec_774d6c001a6250aa67ca676ab067895e/cv_b92d94774702c7f05f2075d0b03dd756/files/sha256:f9d7dfe335ac52c61aa7eb6d0af51c247eff6248bf3640687977c716f8419ef5", + "enrichment_stamp": "55887b871f7aa1c5d120cb2bee97086605351d5acfbec645ab027f562d0f65c5" + }, { "artifact_digest": "sha256:2ff184d2ad022189c2b071f35cfd3a1119cd987cd883c5e84b2e61c9a68dc9cf", "rendering": { @@ -687,7 +721,7 @@ ], "series_count": 5, "output_options": { - "capability_version": "dset_76f5fa7244511c58", + "capability_version": "dset_5282a0674178a233", "columns": [ { "name": "stat_var", @@ -770,7 +804,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": false }, { "column": "financingProvider", @@ -782,7 +817,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": false }, { "column": "financingProvider", @@ -794,7 +830,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true }, { "column": "financingProvider", @@ -806,7 +843,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": false }, { "column": "financingProvider", @@ -818,7 +856,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true }, { "column": "financingProvider", @@ -830,7 +869,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true }, { "column": "financingProvider", @@ -842,7 +882,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true }, { "column": "financingRecipient", @@ -854,7 +895,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": false }, { "column": "financingRecipient", @@ -866,7 +908,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": false }, { "column": "financingRecipient", @@ -878,7 +921,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true }, { "column": "financingRecipient", @@ -890,7 +934,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": false }, { "column": "financingRecipient", @@ -902,7 +947,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true }, { "column": "financingRecipient", @@ -914,7 +960,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true }, { "column": "financingRecipient", @@ -926,7 +973,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true } ], "long_layout_defaults": [ @@ -987,7 +1035,7 @@ "headers": { "content-type": "text/html", "location": "https://storage.googleapis.com/dev-fin-observatory-datasets-working/sha256%3A421efacc2dc010af38112a087b0b49ff5539f61d2afd12a88272b27e99b5f5db?X-Goog-Signature=redacted", - "x-dfo-trace-id": "9db04233957a46068e3999162a93c70c" + "x-dfo-trace-id": "da35390e87c443c488094765dcbbb302" } } }, @@ -1013,7 +1061,7 @@ "headers": { "content-type": "text/html", "location": "https://storage.googleapis.com/dev-fin-observatory-datasets-working/sha256%3A421efacc2dc010af38112a087b0b49ff5539f61d2afd12a88272b27e99b5f5db?X-Goog-Signature=redacted", - "x-dfo-trace-id": "9db04233957a46068e3999162a93c70c" + "x-dfo-trace-id": "da35390e87c443c488094765dcbbb302" } } }, diff --git a/python/client-contract/src/dfo_client_contract/scenarios/fetch-ref-signed-url-refused.json b/python/client-contract/src/dfo_client_contract/scenarios/fetch-ref-signed-url-refused.json index a379515..aaca945 100644 --- a/python/client-contract/src/dfo_client_contract/scenarios/fetch-ref-signed-url-refused.json +++ b/python/client-contract/src/dfo_client_contract/scenarios/fetch-ref-signed-url-refused.json @@ -112,7 +112,7 @@ "status": 200, "headers": { "content-type": "application/json", - "x-dfo-trace-id": "6bc9cad45e3c48769587db03ca0826a9" + "x-dfo-trace-id": "bb0701b517bc480c84122af2117d7553" }, "json": { "schema_version": 1, @@ -541,7 +541,7 @@ "created_at": "2026-10-23T16:56:32.058938+00:00", "tier": "working", "url": "/api/datasets/spec_774d6c001a6250aa67ca676ab067895e/cv_b92d94774702c7f05f2075d0b03dd756/files/sha256:421efacc2dc010af38112a087b0b49ff5539f61d2afd12a88272b27e99b5f5db", - "enrichment_stamp": "08ed6c734fc69ea2204a21f4e1dd8b963f14dd1e03a2484c618049ac2e2d93d8" + "enrichment_stamp": "55887b871f7aa1c5d120cb2bee97086605351d5acfbec645ab027f562d0f65c5" }, { "artifact_digest": "sha256:421efacc2dc010af38112a087b0b49ff5539f61d2afd12a88272b27e99b5f5db", @@ -554,8 +554,20 @@ "media_type": "application/vnd.apache.parquet", "created_at": "2026-10-23T16:56:32.058938+00:00", "tier": "working", - "url": "/api/datasets/spec_774d6c001a6250aa67ca676ab067895e/cv_b92d94774702c7f05f2075d0b03dd756/files/sha256:421efacc2dc010af38112a087b0b49ff5539f61d2afd12a88272b27e99b5f5db", - "enrichment_stamp": "08ed6c734fc69ea2204a21f4e1dd8b963f14dd1e03a2484c618049ac2e2d93d8" + "url": "/api/datasets/spec_774d6c001a6250aa67ca676ab067895e/cv_b92d94774702c7f05f2075d0b03dd756/files/sha256:421efacc2dc010af38112a087b0b49ff5539f61d2afd12a88272b27e99b5f5db" + }, + { + "artifact_digest": "sha256:421efacc2dc010af38112a087b0b49ff5539f61d2afd12a88272b27e99b5f5db", + "rendering": { + "bundle": false, + "format": "parquet", + "layout": 4 + }, + "bytes": 9842, + "media_type": "application/vnd.apache.parquet", + "created_at": "2026-10-23T16:56:32.058938+00:00", + "tier": "working", + "url": "/api/datasets/spec_774d6c001a6250aa67ca676ab067895e/cv_b92d94774702c7f05f2075d0b03dd756/files/sha256:421efacc2dc010af38112a087b0b49ff5539f61d2afd12a88272b27e99b5f5db" }, { "artifact_digest": "sha256:f4026e80af4b8683d3bb86645ab3aca83dff75cd03fdd4c73ec54ba638922104", @@ -584,6 +596,28 @@ "tier": "working", "url": "/api/datasets/spec_774d6c001a6250aa67ca676ab067895e/cv_b92d94774702c7f05f2075d0b03dd756/files/sha256:f4026e80af4b8683d3bb86645ab3aca83dff75cd03fdd4c73ec54ba638922104" }, + { + "artifact_digest": "sha256:f9d7dfe335ac52c61aa7eb6d0af51c247eff6248bf3640687977c716f8419ef5", + "rendering": { + "bundle": false, + "format": "parquet", + "layout": "frame", + "columns": [ + "financingProvider_type", + "financingRecipient_type", + "party_class", + "party_kind", + "party_whole" + ], + "without_party_totals": true + }, + "bytes": 8160, + "media_type": "application/vnd.apache.parquet", + "created_at": "2026-10-29T22:26:42.669646+00:00", + "tier": "working", + "url": "/api/datasets/spec_774d6c001a6250aa67ca676ab067895e/cv_b92d94774702c7f05f2075d0b03dd756/files/sha256:f9d7dfe335ac52c61aa7eb6d0af51c247eff6248bf3640687977c716f8419ef5", + "enrichment_stamp": "55887b871f7aa1c5d120cb2bee97086605351d5acfbec645ab027f562d0f65c5" + }, { "artifact_digest": "sha256:2ff184d2ad022189c2b071f35cfd3a1119cd987cd883c5e84b2e61c9a68dc9cf", "rendering": { @@ -687,7 +721,7 @@ ], "series_count": 5, "output_options": { - "capability_version": "dset_76f5fa7244511c58", + "capability_version": "dset_5282a0674178a233", "columns": [ { "name": "stat_var", @@ -770,7 +804,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": false }, { "column": "financingProvider", @@ -782,7 +817,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": false }, { "column": "financingProvider", @@ -794,7 +830,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true }, { "column": "financingProvider", @@ -806,7 +843,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": false }, { "column": "financingProvider", @@ -818,7 +856,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true }, { "column": "financingProvider", @@ -830,7 +869,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true }, { "column": "financingProvider", @@ -842,7 +882,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true }, { "column": "financingRecipient", @@ -854,7 +895,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": false }, { "column": "financingRecipient", @@ -866,7 +908,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": false }, { "column": "financingRecipient", @@ -878,7 +921,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true }, { "column": "financingRecipient", @@ -890,7 +934,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": false }, { "column": "financingRecipient", @@ -902,7 +947,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true }, { "column": "financingRecipient", @@ -914,7 +960,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true }, { "column": "financingRecipient", @@ -926,7 +973,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true } ], "long_layout_defaults": [ @@ -987,7 +1035,7 @@ "headers": { "content-type": "text/html", "location": "https://storage.googleapis.com/dev-fin-observatory-datasets-working/sha256%3A421efacc2dc010af38112a087b0b49ff5539f61d2afd12a88272b27e99b5f5db?X-Goog-Signature=redacted", - "x-dfo-trace-id": "9db04233957a46068e3999162a93c70c" + "x-dfo-trace-id": "da35390e87c443c488094765dcbbb302" } } }, @@ -1013,7 +1061,7 @@ "headers": { "content-type": "text/html", "location": "https://storage.googleapis.com/dev-fin-observatory-datasets-working/sha256%3A421efacc2dc010af38112a087b0b49ff5539f61d2afd12a88272b27e99b5f5db?X-Goog-Signature=redacted", - "x-dfo-trace-id": "9db04233957a46068e3999162a93c70c" + "x-dfo-trace-id": "da35390e87c443c488094765dcbbb302" } } }, diff --git a/python/client-contract/src/dfo_client_contract/scenarios/fetch-ref-unknown-version.json b/python/client-contract/src/dfo_client_contract/scenarios/fetch-ref-unknown-version.json index e594531..cc16934 100644 --- a/python/client-contract/src/dfo_client_contract/scenarios/fetch-ref-unknown-version.json +++ b/python/client-contract/src/dfo_client_contract/scenarios/fetch-ref-unknown-version.json @@ -5,8 +5,8 @@ "origin": { "kind": "recorded", "base_url": "https://dfo-dev-apis-zms5lj4zhq-nn.a.run.app/api", - "dfo_commit": "d80df9f5fd598b7345255470932d202ee5d49942", - "recorded_at": "2026-10-26T09:22:34Z" + "dfo_commit": "ccb6617922c839ce3cd5615a3bbb65c70bfe1bde", + "recorded_at": "2026-11-01T07:38:29Z" }, "call": [ { @@ -113,7 +113,7 @@ "status": 404, "headers": { "content-type": "application/problem+json", - "x-dfo-trace-id": "72953e5cc1f1470dac2c80cf5889052d" + "x-dfo-trace-id": "16c1aa4689f242b68b283a38033c6fd5" }, "json": { "type": "/codes/snapshot_not_found", @@ -121,8 +121,8 @@ "status": 404, "detail": "'spec_774d6c001a6250aa67ca676ab067895e' has no version at content_version 'cv_00000000000000000000000000000000'", "code": "snapshot_not_found", - "trace_id": "72953e5cc1f1470dac2c80cf5889052d", - "capability_version": "dset_76f5fa7244511c58", + "trace_id": "16c1aa4689f242b68b283a38033c6fd5", + "capability_version": "dset_5282a0674178a233", "retryable": false } } @@ -133,7 +133,7 @@ "error": { "class": "NotFoundError", "code": "snapshot_not_found", - "trace_id": "72953e5cc1f1470dac2c80cf5889052d" + "trace_id": "16c1aa4689f242b68b283a38033c6fd5" } } ] diff --git a/python/client-contract/src/dfo_client_contract/scenarios/fetch-ref.json b/python/client-contract/src/dfo_client_contract/scenarios/fetch-ref.json index 5c43080..04c5380 100644 --- a/python/client-contract/src/dfo_client_contract/scenarios/fetch-ref.json +++ b/python/client-contract/src/dfo_client_contract/scenarios/fetch-ref.json @@ -5,8 +5,8 @@ "origin": { "kind": "recorded", "base_url": "https://dfo-dev-apis-zms5lj4zhq-nn.a.run.app/api", - "dfo_commit": "d80df9f5fd598b7345255470932d202ee5d49942", - "recorded_at": "2026-10-26T09:22:32Z" + "dfo_commit": "ccb6617922c839ce3cd5615a3bbb65c70bfe1bde", + "recorded_at": "2026-11-01T07:38:27Z" }, "call": [ { @@ -113,7 +113,7 @@ "status": 200, "headers": { "content-type": "application/json", - "x-dfo-trace-id": "6bc9cad45e3c48769587db03ca0826a9" + "x-dfo-trace-id": "bb0701b517bc480c84122af2117d7553" }, "json": { "schema_version": 1, @@ -542,7 +542,7 @@ "created_at": "2026-10-23T16:56:32.058938+00:00", "tier": "working", "url": "/api/datasets/spec_774d6c001a6250aa67ca676ab067895e/cv_b92d94774702c7f05f2075d0b03dd756/files/sha256:421efacc2dc010af38112a087b0b49ff5539f61d2afd12a88272b27e99b5f5db", - "enrichment_stamp": "08ed6c734fc69ea2204a21f4e1dd8b963f14dd1e03a2484c618049ac2e2d93d8" + "enrichment_stamp": "55887b871f7aa1c5d120cb2bee97086605351d5acfbec645ab027f562d0f65c5" }, { "artifact_digest": "sha256:421efacc2dc010af38112a087b0b49ff5539f61d2afd12a88272b27e99b5f5db", @@ -555,8 +555,20 @@ "media_type": "application/vnd.apache.parquet", "created_at": "2026-10-23T16:56:32.058938+00:00", "tier": "working", - "url": "/api/datasets/spec_774d6c001a6250aa67ca676ab067895e/cv_b92d94774702c7f05f2075d0b03dd756/files/sha256:421efacc2dc010af38112a087b0b49ff5539f61d2afd12a88272b27e99b5f5db", - "enrichment_stamp": "08ed6c734fc69ea2204a21f4e1dd8b963f14dd1e03a2484c618049ac2e2d93d8" + "url": "/api/datasets/spec_774d6c001a6250aa67ca676ab067895e/cv_b92d94774702c7f05f2075d0b03dd756/files/sha256:421efacc2dc010af38112a087b0b49ff5539f61d2afd12a88272b27e99b5f5db" + }, + { + "artifact_digest": "sha256:421efacc2dc010af38112a087b0b49ff5539f61d2afd12a88272b27e99b5f5db", + "rendering": { + "bundle": false, + "format": "parquet", + "layout": 4 + }, + "bytes": 9842, + "media_type": "application/vnd.apache.parquet", + "created_at": "2026-10-23T16:56:32.058938+00:00", + "tier": "working", + "url": "/api/datasets/spec_774d6c001a6250aa67ca676ab067895e/cv_b92d94774702c7f05f2075d0b03dd756/files/sha256:421efacc2dc010af38112a087b0b49ff5539f61d2afd12a88272b27e99b5f5db" }, { "artifact_digest": "sha256:f4026e80af4b8683d3bb86645ab3aca83dff75cd03fdd4c73ec54ba638922104", @@ -585,6 +597,28 @@ "tier": "working", "url": "/api/datasets/spec_774d6c001a6250aa67ca676ab067895e/cv_b92d94774702c7f05f2075d0b03dd756/files/sha256:f4026e80af4b8683d3bb86645ab3aca83dff75cd03fdd4c73ec54ba638922104" }, + { + "artifact_digest": "sha256:f9d7dfe335ac52c61aa7eb6d0af51c247eff6248bf3640687977c716f8419ef5", + "rendering": { + "bundle": false, + "format": "parquet", + "layout": "frame", + "columns": [ + "financingProvider_type", + "financingRecipient_type", + "party_class", + "party_kind", + "party_whole" + ], + "without_party_totals": true + }, + "bytes": 8160, + "media_type": "application/vnd.apache.parquet", + "created_at": "2026-10-29T22:26:42.669646+00:00", + "tier": "working", + "url": "/api/datasets/spec_774d6c001a6250aa67ca676ab067895e/cv_b92d94774702c7f05f2075d0b03dd756/files/sha256:f9d7dfe335ac52c61aa7eb6d0af51c247eff6248bf3640687977c716f8419ef5", + "enrichment_stamp": "55887b871f7aa1c5d120cb2bee97086605351d5acfbec645ab027f562d0f65c5" + }, { "artifact_digest": "sha256:2ff184d2ad022189c2b071f35cfd3a1119cd987cd883c5e84b2e61c9a68dc9cf", "rendering": { @@ -688,7 +722,7 @@ ], "series_count": 5, "output_options": { - "capability_version": "dset_76f5fa7244511c58", + "capability_version": "dset_5282a0674178a233", "columns": [ { "name": "stat_var", @@ -771,7 +805,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": false }, { "column": "financingProvider", @@ -783,7 +818,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": false }, { "column": "financingProvider", @@ -795,7 +831,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true }, { "column": "financingProvider", @@ -807,7 +844,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": false }, { "column": "financingProvider", @@ -819,7 +857,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true }, { "column": "financingProvider", @@ -831,7 +870,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true }, { "column": "financingProvider", @@ -843,7 +883,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true }, { "column": "financingRecipient", @@ -855,7 +896,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": false }, { "column": "financingRecipient", @@ -867,7 +909,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": false }, { "column": "financingRecipient", @@ -879,7 +922,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true }, { "column": "financingRecipient", @@ -891,7 +935,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": false }, { "column": "financingRecipient", @@ -903,7 +948,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true }, { "column": "financingRecipient", @@ -915,7 +961,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true }, { "column": "financingRecipient", @@ -927,7 +974,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true } ], "long_layout_defaults": [ @@ -988,7 +1036,7 @@ "headers": { "content-type": "text/html", "location": "https://storage.googleapis.com/dev-fin-observatory-datasets-working/sha256%3A421efacc2dc010af38112a087b0b49ff5539f61d2afd12a88272b27e99b5f5db?X-Goog-Signature=redacted", - "x-dfo-trace-id": "9db04233957a46068e3999162a93c70c" + "x-dfo-trace-id": "da35390e87c443c488094765dcbbb302" } } }, diff --git a/python/client-contract/src/dfo_client_contract/scenarios/fetch-renamed-strict-field.json b/python/client-contract/src/dfo_client_contract/scenarios/fetch-renamed-strict-field.json index cdf37fa..c5007c2 100644 --- a/python/client-contract/src/dfo_client_contract/scenarios/fetch-renamed-strict-field.json +++ b/python/client-contract/src/dfo_client_contract/scenarios/fetch-renamed-strict-field.json @@ -33,7 +33,7 @@ "status": 200, "headers": { "content-type": "application/json", - "x-dfo-trace-id": "c7cb40f3790f4a15a0ddcad0cc93c9bb" + "x-dfo-trace-id": "92a325e77a854c5daafa875164b5e23e" }, "json": { "schema_version": 1, @@ -41,23 +41,27 @@ "entry_path": "raw_text", "raw_query": "ODA disbursements from Germany to Nigeria for basic health care", "normalized_query": "ODA disbursements from Germany to Nigeria for basic health care", - "extract_skipped": true + "extract_skipped": false }, "diagnostics": { - "engine_build": "d80df9f5fd598b7345255470932d202ee5d49942", - "trace_id": "c7cb40f3790f4a15a0ddcad0cc93c9bb", + "engine_build": "ccb6617922c839ce3cd5615a3bbb65c70bfe1bde", + "trace_id": "92a325e77a854c5daafa875164b5e23e", "warnings": [], "timing_ms": { - "total": 3, + "total": 17540, "by_step": { "coverage": 0, - "response_cache_layer1": 1 + "extract": 1239, + "exclusion_read": 719, + "cache_lookup": 0 } }, "llm_usage": { - "input_tokens": 0, - "output_tokens": 0, - "cached_tokens": 0 + "input_tokens": 2784, + "output_tokens": 111, + "cached_tokens": 0, + "jev_input_tokens": 6695, + "jev_output_tokens": 2088 }, "timed_out": false }, @@ -67,30 +71,30 @@ "variable_text": "ODA disbursements for basic health care", "warnings": [], "timing_ms": { - "total": 3011, + "total": 16265, "by_step": { - "recall": 457, + "recall": 2821, "phase_resolve_places": 0, "phase_check_entities": 0, "shape_arcs": 2, - "shape_probe_coverage": 8, - "shape_probe": 114, - "shape_groups": 579, + "shape_probe_coverage": 104, + "shape_probe": 352, + "shape_groups": 109, "shape_labels": 1, - "shape_admission": 2, + "shape_admission": 0, "phase_derive_shapes": 0, - "shape": 1247, + "shape": 1134, "phase_prune_and_rank": 0, - "bind": 266, - "phase_bind": 327, - "phase_settle": 46, - "phase_place_bindings": 57, + "bind": 5473, + "phase_bind": 345, + "phase_settle": 105, + "phase_place_bindings": 1078, "phase_facet_requests": 0, - "materialise": 44, - "phase_materialise": 200, - "answer": 220, - "options": 55, - "phase_outcome": 92 + "materialise": 2132, + "phase_materialise": 313, + "answer": 1829, + "options": 872, + "phase_outcome": 163 } }, "restatement": { @@ -537,7 +541,7 @@ "label": "OECD Terms and Conditions" } }, - "coverage_stamp": "e6e717ab8c77e84d010915893ede5809e9ecec67929a07cfafbcc2210edfa1eb", + "coverage_stamp": "ad27fd11738abb03d2d84dc214e223f04781609636cf678d0d08c385fb863d99", "facets": { "provenance": { "basis": "fallback", @@ -595,7 +599,7 @@ }, "relation": "child", "parent": "CRSCooperationModalityB", - "member_count": 1606, + "member_count": 1614, "served_rows": 1, "served_rows_exact": true }, @@ -609,7 +613,7 @@ }, "relation": "child", "parent": "CRSCooperationModalityB", - "member_count": 1331, + "member_count": 1337, "served_rows": 6, "served_rows_exact": true }, @@ -636,7 +640,7 @@ }, "relation": "child", "parent": "CRSCooperationModalityC", - "member_count": 7005, + "member_count": 7041, "served_rows": 7, "served_rows_exact": true }, @@ -732,7 +736,7 @@ }, "relation": "child", "parent": "CRSTypeOfFinance100", - "member_count": 12672, + "member_count": 12745, "served_rows": 30, "served_rows_exact": true } @@ -759,7 +763,7 @@ "value_kind": "enum_value" }, "relation": "root", - "member_count": 14098, + "member_count": 14146, "served_rows": 30, "served_rows_exact": true } @@ -1190,7 +1194,7 @@ "selected": [] } ], - "capability_version": "cap_765c9d2a0c7529b9", + "capability_version": "cap_4913302d7a6b6435", "default_reading": { "applied": true, "removed_stat_vars": [] @@ -1198,214 +1202,7 @@ }, "confidence": "high", "available_at_place": true, - "alternative_measures": [ - { - "definition": { - "schema_version": 1, - "spec_id": "spec_80b92ca1ba1114b426eb5e79b84361d4", - "identity": { - "identity_version": "spec1", - "shape": { - "kind": "statvar_schema", - "population_type": "FinancialFlow", - "measured_property": "amount", - "stat_type": "measuredValue", - "measurement_qualifier": "Nominal" - }, - "slots": [ - { - "property": "crsCooperationModality", - "binding": { - "state": "unbound" - } - }, - { - "property": "crsPurpose", - "binding": { - "state": "value", - "ref": "CRSPurposeCode12220" - } - }, - { - "property": "crsTypeOfFinance", - "binding": { - "state": "unbound" - } - }, - { - "property": "crsTypeOfFlow", - "binding": { - "state": "value", - "ref": "CRSTypeOfFlow10" - } - }, - { - "property": "financialFlowType", - "binding": { - "state": "value", - "ref": "Disbursement" - } - }, - { - "property": "nettingBasis", - "binding": { - "state": "value", - "ref": "Net" - } - } - ], - "entities": { - "destination": [ - "country/NGA" - ], - "origin": [ - "country/DEU" - ] - }, - "requested_window": { - "kind": "all" - } - } - }, - "label": "net disbursements", - "axis": "what", - "measure_axis_values": [ - { - "axis": "populationType", - "value": { - "ref": "FinancialFlow", - "label": "financial flow" - } - }, - { - "axis": "measuredProperty", - "value": { - "ref": "amount", - "label": "amount" - } - }, - { - "axis": "measurementQualifier", - "value": { - "ref": "Nominal", - "label": "nominal" - } - }, - { - "axis": "financialFlowType", - "value": { - "ref": "Disbursement", - "label": "disbursement" - } - }, - { - "axis": "nettingBasis", - "value": { - "ref": "Net", - "label": "net" - } - } - ], - "served_rows": 30, - "served_rows_exact": true - }, - { - "definition": { - "schema_version": 1, - "spec_id": "spec_c394f9108db2100f1c8e4532d8d1c804", - "identity": { - "identity_version": "spec1", - "shape": { - "kind": "statvar_schema", - "population_type": "FinancialObligation", - "measured_property": "amount", - "stat_type": "measuredValue", - "measurement_qualifier": "Nominal" - }, - "slots": [ - { - "property": "crsCooperationModality", - "binding": { - "state": "unbound" - } - }, - { - "property": "crsPurpose", - "binding": { - "state": "value", - "ref": "CRSPurposeCode12220" - } - }, - { - "property": "crsTypeOfFinance", - "binding": { - "state": "unbound" - } - }, - { - "property": "crsTypeOfFlow", - "binding": { - "state": "value", - "ref": "CRSTypeOfFlow10" - } - }, - { - "property": "financialObligationType", - "binding": { - "state": "value", - "ref": "Commitment" - } - } - ], - "entities": { - "destination": [ - "country/NGA" - ], - "origin": [ - "country/DEU" - ] - }, - "requested_window": { - "kind": "all" - } - } - }, - "label": "commitments", - "axis": "what", - "measure_axis_values": [ - { - "axis": "populationType", - "value": { - "ref": "FinancialObligation", - "label": "financial obligation" - } - }, - { - "axis": "measuredProperty", - "value": { - "ref": "amount", - "label": "amount" - } - }, - { - "axis": "measurementQualifier", - "value": { - "ref": "Nominal", - "label": "nominal" - } - }, - { - "axis": "financialObligationType", - "value": { - "ref": "Commitment", - "label": "commitment" - } - } - ], - "served_rows": 24, - "served_rows_exact": true - } - ], + "alternative_measures": [], "measure_label": "gross disbursements", "measure_label_axes": [ "populationType", @@ -1451,6 +1248,8 @@ } } ], + "concept_label": "basic health care", + "published_tables": "OECD Creditor Reporting System (CRS)", "open_axis_facts": [ { "property": "crsTypeOfFinance", @@ -3476,6 +3275,363 @@ "destination": "NGN", "origin": "EUR" } + }, + "scope_choices": { + "id": "spec_774d6c001a6250aa67ca676ab067895e", + "base": { + "schema_version": 1, + "spec_id": "spec_774d6c001a6250aa67ca676ab067895e", + "identity": { + "identity_version": "spec1", + "shape": { + "kind": "statvar_schema", + "population_type": "FinancialFlow", + "measured_property": "amount", + "stat_type": "measuredValue", + "measurement_qualifier": "Nominal" + }, + "slots": [ + { + "property": "crsCooperationModality", + "binding": { + "state": "unbound" + } + }, + { + "property": "crsPurpose", + "binding": { + "state": "value", + "ref": "CRSPurposeCode12220" + } + }, + { + "property": "crsTypeOfFinance", + "binding": { + "state": "unbound" + } + }, + { + "property": "crsTypeOfFlow", + "binding": { + "state": "value", + "ref": "CRSTypeOfFlow10" + } + }, + { + "property": "financialFlowType", + "binding": { + "state": "value", + "ref": "Disbursement" + } + }, + { + "property": "nettingBasis", + "binding": { + "state": "value", + "ref": "Gross" + } + } + ], + "entities": { + "destination": [ + "country/NGA" + ], + "origin": [ + "country/DEU" + ] + }, + "requested_window": { + "kind": "all" + } + } + }, + "rule_version": "scope1:3eef00a928eedd463ee48d02b79730da", + "entries": [ + { + "axis": "sector", + "option_id": "sector:12220", + "provenance": "explicit", + "origin": { + "kind": "text", + "text": "basic health care", + "start": 46, + "end": 63 + } + } + ], + "dropped_entries": [], + "choices": [ + { + "id": "spec_774d6c001a6250aa67ca676ab067895e:sector", + "axis": "sector", + "rule": "sector_code", + "provenance": "explicit", + "active": "sector:12220", + "options": [ + { + "option_id": "sector:12220", + "label": "basic health care (CRS 12220)", + "binding": { + "kind": "slot", + "slot": "crsPurpose", + "state": "value", + "refs": [ + "CRSPurposeCode12220" + ] + }, + "availability": { + "status": "available", + "detail": {} + } + } + ] + }, + { + "id": "spec_774d6c001a6250aa67ca676ab067895e:measure_basis", + "axis": "measure_basis", + "rule": "measure_basis_convention", + "provenance": "default", + "active": "measure_basis:gross", + "options": [ + { + "option_id": "measure_basis:gross", + "label": "gross disbursements, current USD", + "binding": { + "kind": "shape", + "measured_property": "amount", + "netting_basis": "Gross" + }, + "availability": { + "status": "available", + "detail": {} + } + }, + { + "option_id": "measure_basis:net", + "label": "net disbursements, current USD", + "binding": { + "kind": "shape", + "measured_property": "amount", + "netting_basis": "Net" + }, + "availability": { + "status": "available", + "detail": {} + } + }, + { + "option_id": "measure_basis:grant_equivalent", + "label": "grant equivalents (OECD headline), current USD", + "binding": { + "kind": "shape", + "measured_property": "grantEquivalent", + "netting_basis": null + }, + "availability": { + "status": "available", + "detail": {} + } + }, + { + "option_id": "measure_basis:commitments", + "label": "commitments, current USD", + "binding": { + "kind": "shape", + "measured_property": "amount", + "netting_basis": null + }, + "availability": { + "status": "available", + "detail": {} + } + } + ] + }, + { + "id": "spec_774d6c001a6250aa67ca676ab067895e:provider", + "axis": "provider", + "rule": "bilateral_flows", + "provenance": "default", + "active": "provider:bilateral", + "options": [ + { + "option_id": "provider:bilateral", + "label": "bilateral flows only", + "binding": { + "kind": "provider", + "scope": "bilateral" + }, + "availability": { + "status": "available", + "detail": {} + } + }, + { + "option_id": "provider:inclusive", + "label": "bilateral plus imputed multilateral, 2020 to 2024", + "binding": { + "kind": "provider", + "scope": "inclusive", + "window": [ + 2020, + 2024 + ], + "provenance": "provenance/ONEBilateralAndImputedMultilateral" + }, + "availability": { + "status": "partial", + "years": [ + [ + 2011, + 2016 + ], + [ + 2020, + 2024 + ] + ], + "code": "imputed_coverage", + "detail": {} + } + } + ] + } + ], + "compiled": { + "spec_id": "spec_774d6c001a6250aa67ca676ab067895e", + "identity": { + "identity_version": "spec1", + "shape": { + "kind": "statvar_schema", + "population_type": "FinancialFlow", + "measured_property": "amount", + "stat_type": "measuredValue", + "measurement_qualifier": "Nominal" + }, + "slots": [ + { + "property": "crsCooperationModality", + "binding": { + "state": "unbound" + } + }, + { + "property": "crsPurpose", + "binding": { + "state": "value", + "ref": "CRSPurposeCode12220" + } + }, + { + "property": "crsTypeOfFinance", + "binding": { + "state": "unbound" + } + }, + { + "property": "crsTypeOfFlow", + "binding": { + "state": "value", + "ref": "CRSTypeOfFlow10" + } + }, + { + "property": "financialFlowType", + "binding": { + "state": "value", + "ref": "Disbursement" + } + }, + { + "property": "nettingBasis", + "binding": { + "state": "value", + "ref": "Gross" + } + } + ], + "entities": { + "destination": [ + "country/NGA" + ], + "origin": [ + "country/DEU" + ] + }, + "requested_window": { + "kind": "all" + } + }, + "components": [ + { + "role": "whole", + "identity": { + "identity_version": "spec1", + "shape": { + "kind": "statvar_schema", + "population_type": "FinancialFlow", + "measured_property": "amount", + "stat_type": "measuredValue", + "measurement_qualifier": "Nominal" + }, + "slots": [ + { + "property": "crsCooperationModality", + "binding": { + "state": "unbound" + } + }, + { + "property": "crsPurpose", + "binding": { + "state": "value", + "ref": "CRSPurposeCode12220" + } + }, + { + "property": "crsTypeOfFinance", + "binding": { + "state": "unbound" + } + }, + { + "property": "crsTypeOfFlow", + "binding": { + "state": "value", + "ref": "CRSTypeOfFlow10" + } + }, + { + "property": "financialFlowType", + "binding": { + "state": "value", + "ref": "Disbursement" + } + }, + { + "property": "nettingBasis", + "binding": { + "state": "value", + "ref": "Gross" + } + } + ], + "entities": { + "destination": [ + "country/NGA" + ], + "origin": [ + "country/DEU" + ] + }, + "requested_window": { + "kind": "all" + } + } + } + ] + }, + "ledger": [] } } } @@ -3789,7 +3945,7 @@ "status": 200, "headers": { "content-type": "application/json", - "x-dfo-trace-id": "4c3f35c8c0d44b99941a73a9519b41d2" + "x-dfo-trace-id": "fff69a3d23f5431c8a34da1b72c9e034" }, "json": { "schema_version": 1, @@ -4188,8 +4344,8 @@ "family_member_digest": "9fd3643bbde505d9542fd3d090ddd549349765d12b6bad95b17271cbf297ea8c", "frame_grammar_version": "1.1.0", "origin_catalogue_build_id": "20261011T194155Z-80081f08", - "served_from": "head", - "confirmed_at": "2026-10-26T09:17:22.037029+00:00" + "served_from": "materialise", + "confirmed_at": "2026-11-01T07:35:51.549820+00:00" }, "warnings": [ { @@ -4219,7 +4375,7 @@ "created_at": "2026-10-23T16:56:32.058938+00:00", "tier": "working", "url": "/api/datasets/spec_774d6c001a6250aa67ca676ab067895e/cv_b92d94774702c7f05f2075d0b03dd756/files/sha256:421efacc2dc010af38112a087b0b49ff5539f61d2afd12a88272b27e99b5f5db", - "enrichment_stamp": "08ed6c734fc69ea2204a21f4e1dd8b963f14dd1e03a2484c618049ac2e2d93d8" + "enrichment_stamp": "55887b871f7aa1c5d120cb2bee97086605351d5acfbec645ab027f562d0f65c5" }, { "artifact_digest": "sha256:07984a96eaf8ee637fe15bf13f2b0d9160a6378d3fa1efae2e71cf0e20115dff", @@ -4235,7 +4391,7 @@ ], "series_count": 5, "output_options": { - "capability_version": "dset_76f5fa7244511c58", + "capability_version": "dset_5282a0674178a233", "columns": [ { "name": "stat_var", @@ -4318,7 +4474,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": false }, { "column": "financingProvider", @@ -4330,7 +4487,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": false }, { "column": "financingProvider", @@ -4342,7 +4500,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true }, { "column": "financingProvider", @@ -4354,7 +4513,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": false }, { "column": "financingProvider", @@ -4366,7 +4526,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true }, { "column": "financingProvider", @@ -4378,7 +4539,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true }, { "column": "financingProvider", @@ -4390,7 +4552,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true }, { "column": "financingRecipient", @@ -4402,7 +4565,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": false }, { "column": "financingRecipient", @@ -4414,7 +4578,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": false }, { "column": "financingRecipient", @@ -4426,7 +4591,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true }, { "column": "financingRecipient", @@ -4438,7 +4604,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": false }, { "column": "financingRecipient", @@ -4450,7 +4617,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true }, { "column": "financingRecipient", @@ -4462,7 +4630,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true }, { "column": "financingRecipient", @@ -4474,7 +4643,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true } ], "long_layout_defaults": [ @@ -4518,7 +4688,7 @@ ] } }, - "series_coverage_stamp": "e6e717ab8c77e84d010915893ede5809e9ecec67929a07cfafbcc2210edfa1eb", + "series_coverage_stamp": "ad27fd11738abb03d2d84dc214e223f04781609636cf678d0d08c385fb863d99", "retention": { "pinned": true }, @@ -4544,7 +4714,7 @@ "error": { "class": "ContractError", "code": "contract_violation", - "trace_id": "4c3f35c8c0d44b99941a73a9519b41d2" + "trace_id": "fff69a3d23f5431c8a34da1b72c9e034" } } ] diff --git a/python/client-contract/src/dfo_client_contract/scenarios/fetch-retry-after-504.json b/python/client-contract/src/dfo_client_contract/scenarios/fetch-retry-after-504.json index cd3d71e..3d876ae 100644 --- a/python/client-contract/src/dfo_client_contract/scenarios/fetch-retry-after-504.json +++ b/python/client-contract/src/dfo_client_contract/scenarios/fetch-retry-after-504.json @@ -33,7 +33,7 @@ "status": 200, "headers": { "content-type": "application/json", - "x-dfo-trace-id": "c7cb40f3790f4a15a0ddcad0cc93c9bb" + "x-dfo-trace-id": "92a325e77a854c5daafa875164b5e23e" }, "json": { "schema_version": 1, @@ -41,23 +41,27 @@ "entry_path": "raw_text", "raw_query": "ODA disbursements from Germany to Nigeria for basic health care", "normalized_query": "ODA disbursements from Germany to Nigeria for basic health care", - "extract_skipped": true + "extract_skipped": false }, "diagnostics": { - "engine_build": "d80df9f5fd598b7345255470932d202ee5d49942", - "trace_id": "c7cb40f3790f4a15a0ddcad0cc93c9bb", + "engine_build": "ccb6617922c839ce3cd5615a3bbb65c70bfe1bde", + "trace_id": "92a325e77a854c5daafa875164b5e23e", "warnings": [], "timing_ms": { - "total": 3, + "total": 17540, "by_step": { "coverage": 0, - "response_cache_layer1": 1 + "extract": 1239, + "exclusion_read": 719, + "cache_lookup": 0 } }, "llm_usage": { - "input_tokens": 0, - "output_tokens": 0, - "cached_tokens": 0 + "input_tokens": 2784, + "output_tokens": 111, + "cached_tokens": 0, + "jev_input_tokens": 6695, + "jev_output_tokens": 2088 }, "timed_out": false }, @@ -67,30 +71,30 @@ "variable_text": "ODA disbursements for basic health care", "warnings": [], "timing_ms": { - "total": 3011, + "total": 16265, "by_step": { - "recall": 457, + "recall": 2821, "phase_resolve_places": 0, "phase_check_entities": 0, "shape_arcs": 2, - "shape_probe_coverage": 8, - "shape_probe": 114, - "shape_groups": 579, + "shape_probe_coverage": 104, + "shape_probe": 352, + "shape_groups": 109, "shape_labels": 1, - "shape_admission": 2, + "shape_admission": 0, "phase_derive_shapes": 0, - "shape": 1247, + "shape": 1134, "phase_prune_and_rank": 0, - "bind": 266, - "phase_bind": 327, - "phase_settle": 46, - "phase_place_bindings": 57, + "bind": 5473, + "phase_bind": 345, + "phase_settle": 105, + "phase_place_bindings": 1078, "phase_facet_requests": 0, - "materialise": 44, - "phase_materialise": 200, - "answer": 220, - "options": 55, - "phase_outcome": 92 + "materialise": 2132, + "phase_materialise": 313, + "answer": 1829, + "options": 872, + "phase_outcome": 163 } }, "restatement": { @@ -537,7 +541,7 @@ "label": "OECD Terms and Conditions" } }, - "coverage_stamp": "e6e717ab8c77e84d010915893ede5809e9ecec67929a07cfafbcc2210edfa1eb", + "coverage_stamp": "ad27fd11738abb03d2d84dc214e223f04781609636cf678d0d08c385fb863d99", "facets": { "provenance": { "basis": "fallback", @@ -595,7 +599,7 @@ }, "relation": "child", "parent": "CRSCooperationModalityB", - "member_count": 1606, + "member_count": 1614, "served_rows": 1, "served_rows_exact": true }, @@ -609,7 +613,7 @@ }, "relation": "child", "parent": "CRSCooperationModalityB", - "member_count": 1331, + "member_count": 1337, "served_rows": 6, "served_rows_exact": true }, @@ -636,7 +640,7 @@ }, "relation": "child", "parent": "CRSCooperationModalityC", - "member_count": 7005, + "member_count": 7041, "served_rows": 7, "served_rows_exact": true }, @@ -732,7 +736,7 @@ }, "relation": "child", "parent": "CRSTypeOfFinance100", - "member_count": 12672, + "member_count": 12745, "served_rows": 30, "served_rows_exact": true } @@ -759,7 +763,7 @@ "value_kind": "enum_value" }, "relation": "root", - "member_count": 14098, + "member_count": 14146, "served_rows": 30, "served_rows_exact": true } @@ -1190,7 +1194,7 @@ "selected": [] } ], - "capability_version": "cap_765c9d2a0c7529b9", + "capability_version": "cap_4913302d7a6b6435", "default_reading": { "applied": true, "removed_stat_vars": [] @@ -1198,214 +1202,7 @@ }, "confidence": "high", "available_at_place": true, - "alternative_measures": [ - { - "definition": { - "schema_version": 1, - "spec_id": "spec_80b92ca1ba1114b426eb5e79b84361d4", - "identity": { - "identity_version": "spec1", - "shape": { - "kind": "statvar_schema", - "population_type": "FinancialFlow", - "measured_property": "amount", - "stat_type": "measuredValue", - "measurement_qualifier": "Nominal" - }, - "slots": [ - { - "property": "crsCooperationModality", - "binding": { - "state": "unbound" - } - }, - { - "property": "crsPurpose", - "binding": { - "state": "value", - "ref": "CRSPurposeCode12220" - } - }, - { - "property": "crsTypeOfFinance", - "binding": { - "state": "unbound" - } - }, - { - "property": "crsTypeOfFlow", - "binding": { - "state": "value", - "ref": "CRSTypeOfFlow10" - } - }, - { - "property": "financialFlowType", - "binding": { - "state": "value", - "ref": "Disbursement" - } - }, - { - "property": "nettingBasis", - "binding": { - "state": "value", - "ref": "Net" - } - } - ], - "entities": { - "destination": [ - "country/NGA" - ], - "origin": [ - "country/DEU" - ] - }, - "requested_window": { - "kind": "all" - } - } - }, - "label": "net disbursements", - "axis": "what", - "measure_axis_values": [ - { - "axis": "populationType", - "value": { - "ref": "FinancialFlow", - "label": "financial flow" - } - }, - { - "axis": "measuredProperty", - "value": { - "ref": "amount", - "label": "amount" - } - }, - { - "axis": "measurementQualifier", - "value": { - "ref": "Nominal", - "label": "nominal" - } - }, - { - "axis": "financialFlowType", - "value": { - "ref": "Disbursement", - "label": "disbursement" - } - }, - { - "axis": "nettingBasis", - "value": { - "ref": "Net", - "label": "net" - } - } - ], - "served_rows": 30, - "served_rows_exact": true - }, - { - "definition": { - "schema_version": 1, - "spec_id": "spec_c394f9108db2100f1c8e4532d8d1c804", - "identity": { - "identity_version": "spec1", - "shape": { - "kind": "statvar_schema", - "population_type": "FinancialObligation", - "measured_property": "amount", - "stat_type": "measuredValue", - "measurement_qualifier": "Nominal" - }, - "slots": [ - { - "property": "crsCooperationModality", - "binding": { - "state": "unbound" - } - }, - { - "property": "crsPurpose", - "binding": { - "state": "value", - "ref": "CRSPurposeCode12220" - } - }, - { - "property": "crsTypeOfFinance", - "binding": { - "state": "unbound" - } - }, - { - "property": "crsTypeOfFlow", - "binding": { - "state": "value", - "ref": "CRSTypeOfFlow10" - } - }, - { - "property": "financialObligationType", - "binding": { - "state": "value", - "ref": "Commitment" - } - } - ], - "entities": { - "destination": [ - "country/NGA" - ], - "origin": [ - "country/DEU" - ] - }, - "requested_window": { - "kind": "all" - } - } - }, - "label": "commitments", - "axis": "what", - "measure_axis_values": [ - { - "axis": "populationType", - "value": { - "ref": "FinancialObligation", - "label": "financial obligation" - } - }, - { - "axis": "measuredProperty", - "value": { - "ref": "amount", - "label": "amount" - } - }, - { - "axis": "measurementQualifier", - "value": { - "ref": "Nominal", - "label": "nominal" - } - }, - { - "axis": "financialObligationType", - "value": { - "ref": "Commitment", - "label": "commitment" - } - } - ], - "served_rows": 24, - "served_rows_exact": true - } - ], + "alternative_measures": [], "measure_label": "gross disbursements", "measure_label_axes": [ "populationType", @@ -1451,6 +1248,8 @@ } } ], + "concept_label": "basic health care", + "published_tables": "OECD Creditor Reporting System (CRS)", "open_axis_facts": [ { "property": "crsTypeOfFinance", @@ -3476,6 +3275,363 @@ "destination": "NGN", "origin": "EUR" } + }, + "scope_choices": { + "id": "spec_774d6c001a6250aa67ca676ab067895e", + "base": { + "schema_version": 1, + "spec_id": "spec_774d6c001a6250aa67ca676ab067895e", + "identity": { + "identity_version": "spec1", + "shape": { + "kind": "statvar_schema", + "population_type": "FinancialFlow", + "measured_property": "amount", + "stat_type": "measuredValue", + "measurement_qualifier": "Nominal" + }, + "slots": [ + { + "property": "crsCooperationModality", + "binding": { + "state": "unbound" + } + }, + { + "property": "crsPurpose", + "binding": { + "state": "value", + "ref": "CRSPurposeCode12220" + } + }, + { + "property": "crsTypeOfFinance", + "binding": { + "state": "unbound" + } + }, + { + "property": "crsTypeOfFlow", + "binding": { + "state": "value", + "ref": "CRSTypeOfFlow10" + } + }, + { + "property": "financialFlowType", + "binding": { + "state": "value", + "ref": "Disbursement" + } + }, + { + "property": "nettingBasis", + "binding": { + "state": "value", + "ref": "Gross" + } + } + ], + "entities": { + "destination": [ + "country/NGA" + ], + "origin": [ + "country/DEU" + ] + }, + "requested_window": { + "kind": "all" + } + } + }, + "rule_version": "scope1:3eef00a928eedd463ee48d02b79730da", + "entries": [ + { + "axis": "sector", + "option_id": "sector:12220", + "provenance": "explicit", + "origin": { + "kind": "text", + "text": "basic health care", + "start": 46, + "end": 63 + } + } + ], + "dropped_entries": [], + "choices": [ + { + "id": "spec_774d6c001a6250aa67ca676ab067895e:sector", + "axis": "sector", + "rule": "sector_code", + "provenance": "explicit", + "active": "sector:12220", + "options": [ + { + "option_id": "sector:12220", + "label": "basic health care (CRS 12220)", + "binding": { + "kind": "slot", + "slot": "crsPurpose", + "state": "value", + "refs": [ + "CRSPurposeCode12220" + ] + }, + "availability": { + "status": "available", + "detail": {} + } + } + ] + }, + { + "id": "spec_774d6c001a6250aa67ca676ab067895e:measure_basis", + "axis": "measure_basis", + "rule": "measure_basis_convention", + "provenance": "default", + "active": "measure_basis:gross", + "options": [ + { + "option_id": "measure_basis:gross", + "label": "gross disbursements, current USD", + "binding": { + "kind": "shape", + "measured_property": "amount", + "netting_basis": "Gross" + }, + "availability": { + "status": "available", + "detail": {} + } + }, + { + "option_id": "measure_basis:net", + "label": "net disbursements, current USD", + "binding": { + "kind": "shape", + "measured_property": "amount", + "netting_basis": "Net" + }, + "availability": { + "status": "available", + "detail": {} + } + }, + { + "option_id": "measure_basis:grant_equivalent", + "label": "grant equivalents (OECD headline), current USD", + "binding": { + "kind": "shape", + "measured_property": "grantEquivalent", + "netting_basis": null + }, + "availability": { + "status": "available", + "detail": {} + } + }, + { + "option_id": "measure_basis:commitments", + "label": "commitments, current USD", + "binding": { + "kind": "shape", + "measured_property": "amount", + "netting_basis": null + }, + "availability": { + "status": "available", + "detail": {} + } + } + ] + }, + { + "id": "spec_774d6c001a6250aa67ca676ab067895e:provider", + "axis": "provider", + "rule": "bilateral_flows", + "provenance": "default", + "active": "provider:bilateral", + "options": [ + { + "option_id": "provider:bilateral", + "label": "bilateral flows only", + "binding": { + "kind": "provider", + "scope": "bilateral" + }, + "availability": { + "status": "available", + "detail": {} + } + }, + { + "option_id": "provider:inclusive", + "label": "bilateral plus imputed multilateral, 2020 to 2024", + "binding": { + "kind": "provider", + "scope": "inclusive", + "window": [ + 2020, + 2024 + ], + "provenance": "provenance/ONEBilateralAndImputedMultilateral" + }, + "availability": { + "status": "partial", + "years": [ + [ + 2011, + 2016 + ], + [ + 2020, + 2024 + ] + ], + "code": "imputed_coverage", + "detail": {} + } + } + ] + } + ], + "compiled": { + "spec_id": "spec_774d6c001a6250aa67ca676ab067895e", + "identity": { + "identity_version": "spec1", + "shape": { + "kind": "statvar_schema", + "population_type": "FinancialFlow", + "measured_property": "amount", + "stat_type": "measuredValue", + "measurement_qualifier": "Nominal" + }, + "slots": [ + { + "property": "crsCooperationModality", + "binding": { + "state": "unbound" + } + }, + { + "property": "crsPurpose", + "binding": { + "state": "value", + "ref": "CRSPurposeCode12220" + } + }, + { + "property": "crsTypeOfFinance", + "binding": { + "state": "unbound" + } + }, + { + "property": "crsTypeOfFlow", + "binding": { + "state": "value", + "ref": "CRSTypeOfFlow10" + } + }, + { + "property": "financialFlowType", + "binding": { + "state": "value", + "ref": "Disbursement" + } + }, + { + "property": "nettingBasis", + "binding": { + "state": "value", + "ref": "Gross" + } + } + ], + "entities": { + "destination": [ + "country/NGA" + ], + "origin": [ + "country/DEU" + ] + }, + "requested_window": { + "kind": "all" + } + }, + "components": [ + { + "role": "whole", + "identity": { + "identity_version": "spec1", + "shape": { + "kind": "statvar_schema", + "population_type": "FinancialFlow", + "measured_property": "amount", + "stat_type": "measuredValue", + "measurement_qualifier": "Nominal" + }, + "slots": [ + { + "property": "crsCooperationModality", + "binding": { + "state": "unbound" + } + }, + { + "property": "crsPurpose", + "binding": { + "state": "value", + "ref": "CRSPurposeCode12220" + } + }, + { + "property": "crsTypeOfFinance", + "binding": { + "state": "unbound" + } + }, + { + "property": "crsTypeOfFlow", + "binding": { + "state": "value", + "ref": "CRSTypeOfFlow10" + } + }, + { + "property": "financialFlowType", + "binding": { + "state": "value", + "ref": "Disbursement" + } + }, + { + "property": "nettingBasis", + "binding": { + "state": "value", + "ref": "Gross" + } + } + ], + "entities": { + "destination": [ + "country/NGA" + ], + "origin": [ + "country/DEU" + ] + }, + "requested_window": { + "kind": "all" + } + } + } + ] + }, + "ledger": [] } } } @@ -3890,7 +4046,7 @@ "status": 200, "headers": { "content-type": "application/json", - "x-dfo-trace-id": "4c3f35c8c0d44b99941a73a9519b41d2" + "x-dfo-trace-id": "fff69a3d23f5431c8a34da1b72c9e034" }, "json": { "schema_version": 1, @@ -4290,8 +4446,8 @@ "family_member_digest": "9fd3643bbde505d9542fd3d090ddd549349765d12b6bad95b17271cbf297ea8c", "frame_grammar_version": "1.1.0", "origin_catalogue_build_id": "20261011T194155Z-80081f08", - "served_from": "head", - "confirmed_at": "2026-10-26T09:17:22.037029+00:00" + "served_from": "materialise", + "confirmed_at": "2026-11-01T07:35:51.549820+00:00" }, "warnings": [ { @@ -4321,7 +4477,7 @@ "created_at": "2026-10-23T16:56:32.058938+00:00", "tier": "working", "url": "/api/datasets/spec_774d6c001a6250aa67ca676ab067895e/cv_b92d94774702c7f05f2075d0b03dd756/files/sha256:421efacc2dc010af38112a087b0b49ff5539f61d2afd12a88272b27e99b5f5db", - "enrichment_stamp": "08ed6c734fc69ea2204a21f4e1dd8b963f14dd1e03a2484c618049ac2e2d93d8" + "enrichment_stamp": "55887b871f7aa1c5d120cb2bee97086605351d5acfbec645ab027f562d0f65c5" }, { "artifact_digest": "sha256:07984a96eaf8ee637fe15bf13f2b0d9160a6378d3fa1efae2e71cf0e20115dff", @@ -4337,7 +4493,7 @@ ], "series_count": 5, "output_options": { - "capability_version": "dset_76f5fa7244511c58", + "capability_version": "dset_5282a0674178a233", "columns": [ { "name": "stat_var", @@ -4420,7 +4576,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": false }, { "column": "financingProvider", @@ -4432,7 +4589,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": false }, { "column": "financingProvider", @@ -4444,7 +4602,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true }, { "column": "financingProvider", @@ -4456,7 +4615,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": false }, { "column": "financingProvider", @@ -4468,7 +4628,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true }, { "column": "financingProvider", @@ -4480,7 +4641,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true }, { "column": "financingProvider", @@ -4492,7 +4654,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true }, { "column": "financingRecipient", @@ -4504,7 +4667,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": false }, { "column": "financingRecipient", @@ -4516,7 +4680,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": false }, { "column": "financingRecipient", @@ -4528,7 +4693,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true }, { "column": "financingRecipient", @@ -4540,7 +4706,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": false }, { "column": "financingRecipient", @@ -4552,7 +4719,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true }, { "column": "financingRecipient", @@ -4564,7 +4732,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true }, { "column": "financingRecipient", @@ -4576,7 +4745,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true } ], "long_layout_defaults": [ @@ -4620,7 +4790,7 @@ ] } }, - "series_coverage_stamp": "e6e717ab8c77e84d010915893ede5809e9ecec67929a07cfafbcc2210edfa1eb", + "series_coverage_stamp": "ad27fd11738abb03d2d84dc214e223f04781609636cf678d0d08c385fb863d99", "retention": { "pinned": true } @@ -4637,7 +4807,7 @@ "headers": { "content-type": "text/html", "location": "https://storage.googleapis.com/dev-fin-observatory-datasets-working/sha256%3A421efacc2dc010af38112a087b0b49ff5539f61d2afd12a88272b27e99b5f5db?X-Goog-Signature=redacted", - "x-dfo-trace-id": "333ab72de55449ed8288a5f458406a4c" + "x-dfo-trace-id": "815c18c3e59945d6ade9f99db58f2960" } } }, diff --git a/python/client-contract/src/dfo_client_contract/scenarios/fetch-spec-503-then-504.json b/python/client-contract/src/dfo_client_contract/scenarios/fetch-spec-503-then-504.json index 701f36e..5e3c4c9 100644 --- a/python/client-contract/src/dfo_client_contract/scenarios/fetch-spec-503-then-504.json +++ b/python/client-contract/src/dfo_client_contract/scenarios/fetch-spec-503-then-504.json @@ -382,7 +382,7 @@ "status": 200, "headers": { "content-type": "application/json", - "x-dfo-trace-id": "b89cda3bb794448abf06b56c955d754e" + "x-dfo-trace-id": "27d2f0b694144799a0314850fb5d29bc" }, "json": { "schema_version": 1, @@ -789,7 +789,7 @@ "frame_grammar_version": "1.1.0", "origin_catalogue_build_id": "20261019T174519Z-2e5e8cfd", "served_from": "head", - "confirmed_at": "2026-10-26T09:18:06.976633+00:00" + "confirmed_at": "2026-11-01T07:37:46.482431+00:00" }, "warnings": [ { @@ -819,7 +819,7 @@ "created_at": "2026-10-23T16:58:47.734759+00:00", "tier": "working", "url": "/api/datasets/spec_cb5baa4161de718f18583060674dbca6/cv_bf242138f8d0a892c97da9373d1626f4/files/sha256:c44200969f19d73104d1bc24ebca905e59f749c2939234cdde10ba6f5a131170", - "enrichment_stamp": "08ed6c734fc69ea2204a21f4e1dd8b963f14dd1e03a2484c618049ac2e2d93d8" + "enrichment_stamp": "55887b871f7aa1c5d120cb2bee97086605351d5acfbec645ab027f562d0f65c5" }, { "artifact_digest": "sha256:d3a506bc9b95188583b5764592d2f1897c0665add660106b7f77c3e501000bb4", @@ -835,7 +835,7 @@ ], "series_count": 1, "output_options": { - "capability_version": "dset_76f5fa7244511c58", + "capability_version": "dset_5282a0674178a233", "columns": [ { "name": "stat_var", @@ -918,7 +918,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": false }, { "column": "financingProvider", @@ -930,7 +931,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": false }, { "column": "financingProvider", @@ -942,7 +944,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true }, { "column": "financingProvider", @@ -954,7 +957,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": false }, { "column": "financingProvider", @@ -966,7 +970,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true }, { "column": "financingProvider", @@ -978,7 +983,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true }, { "column": "financingProvider", @@ -990,7 +996,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true }, { "column": "financingRecipient", @@ -1002,7 +1009,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": false }, { "column": "financingRecipient", @@ -1014,7 +1022,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": false }, { "column": "financingRecipient", @@ -1026,7 +1035,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true }, { "column": "financingRecipient", @@ -1038,7 +1048,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": false }, { "column": "financingRecipient", @@ -1050,7 +1061,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true }, { "column": "financingRecipient", @@ -1062,7 +1074,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true }, { "column": "financingRecipient", @@ -1074,7 +1087,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true } ], "long_layout_defaults": [ @@ -1103,7 +1117,7 @@ ] } }, - "series_coverage_stamp": "e6e717ab8c77e84d010915893ede5809e9ecec67929a07cfafbcc2210edfa1eb", + "series_coverage_stamp": "ad27fd11738abb03d2d84dc214e223f04781609636cf678d0d08c385fb863d99", "retention": { "pinned": false, "held_until": "2026-11-19T13:59:18.051742Z" @@ -1121,7 +1135,7 @@ "headers": { "content-type": "text/html", "location": "https://storage.googleapis.com/dev-fin-observatory-datasets-working/sha256%3Ac44200969f19d73104d1bc24ebca905e59f749c2939234cdde10ba6f5a131170?X-Goog-Signature=redacted", - "x-dfo-trace-id": "cf3f86713afb44c98d21fbf9731d66e3" + "x-dfo-trace-id": "b00bcf5bd0ca432eac38be0de17b99ad" } } }, diff --git a/python/client-contract/src/dfo_client_contract/scenarios/fetch-spec-504-retry-after.json b/python/client-contract/src/dfo_client_contract/scenarios/fetch-spec-504-retry-after.json index 11761b6..252d9d2 100644 --- a/python/client-contract/src/dfo_client_contract/scenarios/fetch-spec-504-retry-after.json +++ b/python/client-contract/src/dfo_client_contract/scenarios/fetch-spec-504-retry-after.json @@ -280,7 +280,7 @@ "status": 200, "headers": { "content-type": "application/json", - "x-dfo-trace-id": "b89cda3bb794448abf06b56c955d754e" + "x-dfo-trace-id": "27d2f0b694144799a0314850fb5d29bc" }, "json": { "schema_version": 1, @@ -687,7 +687,7 @@ "frame_grammar_version": "1.1.0", "origin_catalogue_build_id": "20261019T174519Z-2e5e8cfd", "served_from": "head", - "confirmed_at": "2026-10-26T09:18:06.976633+00:00" + "confirmed_at": "2026-11-01T07:37:46.482431+00:00" }, "warnings": [ { @@ -717,7 +717,7 @@ "created_at": "2026-10-23T16:58:47.734759+00:00", "tier": "working", "url": "/api/datasets/spec_cb5baa4161de718f18583060674dbca6/cv_bf242138f8d0a892c97da9373d1626f4/files/sha256:c44200969f19d73104d1bc24ebca905e59f749c2939234cdde10ba6f5a131170", - "enrichment_stamp": "08ed6c734fc69ea2204a21f4e1dd8b963f14dd1e03a2484c618049ac2e2d93d8" + "enrichment_stamp": "55887b871f7aa1c5d120cb2bee97086605351d5acfbec645ab027f562d0f65c5" }, { "artifact_digest": "sha256:d3a506bc9b95188583b5764592d2f1897c0665add660106b7f77c3e501000bb4", @@ -733,7 +733,7 @@ ], "series_count": 1, "output_options": { - "capability_version": "dset_76f5fa7244511c58", + "capability_version": "dset_5282a0674178a233", "columns": [ { "name": "stat_var", @@ -816,7 +816,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": false }, { "column": "financingProvider", @@ -828,7 +829,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": false }, { "column": "financingProvider", @@ -840,7 +842,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true }, { "column": "financingProvider", @@ -852,7 +855,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": false }, { "column": "financingProvider", @@ -864,7 +868,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true }, { "column": "financingProvider", @@ -876,7 +881,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true }, { "column": "financingProvider", @@ -888,7 +894,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true }, { "column": "financingRecipient", @@ -900,7 +907,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": false }, { "column": "financingRecipient", @@ -912,7 +920,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": false }, { "column": "financingRecipient", @@ -924,7 +933,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true }, { "column": "financingRecipient", @@ -936,7 +946,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": false }, { "column": "financingRecipient", @@ -948,7 +959,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true }, { "column": "financingRecipient", @@ -960,7 +972,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true }, { "column": "financingRecipient", @@ -972,7 +985,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true } ], "long_layout_defaults": [ @@ -1001,7 +1015,7 @@ ] } }, - "series_coverage_stamp": "e6e717ab8c77e84d010915893ede5809e9ecec67929a07cfafbcc2210edfa1eb", + "series_coverage_stamp": "ad27fd11738abb03d2d84dc214e223f04781609636cf678d0d08c385fb863d99", "retention": { "pinned": false, "held_until": "2026-11-19T13:59:18.051742Z" @@ -1019,7 +1033,7 @@ "headers": { "content-type": "text/html", "location": "https://storage.googleapis.com/dev-fin-observatory-datasets-working/sha256%3Ac44200969f19d73104d1bc24ebca905e59f749c2939234cdde10ba6f5a131170?X-Goog-Signature=redacted", - "x-dfo-trace-id": "cf3f86713afb44c98d21fbf9731d66e3" + "x-dfo-trace-id": "b00bcf5bd0ca432eac38be0de17b99ad" } } }, diff --git a/python/client-contract/src/dfo_client_contract/scenarios/fetch-spec-accepted-running.json b/python/client-contract/src/dfo_client_contract/scenarios/fetch-spec-accepted-running.json index ab81f2c..e8479cb 100644 --- a/python/client-contract/src/dfo_client_contract/scenarios/fetch-spec-accepted-running.json +++ b/python/client-contract/src/dfo_client_contract/scenarios/fetch-spec-accepted-running.json @@ -11,10 +11,10 @@ { "op": "fetch", "spec": { - "spec_id": "spec_70ddf0ce6a9b3f147063f2adf37fab9e", + "spec_id": "spec_8d395f753219876fa459778f38499a80", "definition": { "schema_version": 1, - "spec_id": "spec_70ddf0ce6a9b3f147063f2adf37fab9e", + "spec_id": "spec_8d395f753219876fa459778f38499a80", "identity": { "identity_version": "spec1", "shape": { @@ -49,7 +49,7 @@ "property": "nettingBasis", "binding": { "state": "value", - "ref": "Gross" + "ref": "Net" } } ], @@ -226,12 +226,12 @@ }, "requested_window": { "kind": "range", - "start_year": 1967, + "start_year": 1968, "end_year": 2024 } } }, - "sentence": "Gross disbursements to the 133 G77 countries from the 32 DAC countries for official development assistance, 1967 to 2024. Current US dollars · OECD DAC2a.", + "sentence": "Net disbursements to the 133 G77 countries from the 32 DAC countries for official development assistance, 1968 to 2024. Current US dollars · OECD DAC2a.", "entity_groups": { "destination": { "label": "G77 countries", @@ -239,7 +239,8 @@ }, "origin": { "label": "DAC countries", - "group_id": "groups/OECD.DAC" + "group_id": "groups/OECD.DAC", + "sum_differs": true } } }, @@ -255,10 +256,10 @@ "schema_version": 1, "input": { "kind": "spec_id", - "spec_id": "spec_70ddf0ce6a9b3f147063f2adf37fab9e", + "spec_id": "spec_8d395f753219876fa459778f38499a80", "definition": { "schema_version": 1, - "spec_id": "spec_70ddf0ce6a9b3f147063f2adf37fab9e", + "spec_id": "spec_8d395f753219876fa459778f38499a80", "identity": { "identity_version": "spec1", "shape": { @@ -293,7 +294,7 @@ "property": "nettingBasis", "binding": { "state": "value", - "ref": "Gross" + "ref": "Net" } } ], @@ -470,7 +471,7 @@ }, "requested_window": { "kind": "range", - "start_year": 1967, + "start_year": 1968, "end_year": 2024 } } @@ -486,15 +487,15 @@ "status": 202, "headers": { "content-type": "application/json", - "location": "/api/datasets/operations/op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f", + "location": "/api/datasets/operations/op_d53662fbaac38ee0bd0801eab9630ebca0c8b467d33b0a1b2c6792d0cd83b7cf", "retry-after": "2", - "x-dfo-trace-id": "9e96509866ff4da09a698df1f19a5cbd" + "x-dfo-trace-id": "7fd3deb153d34f4b9afce2b95ffdd664" }, "json": { "operation": { - "operation_id": "op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f", + "operation_id": "op_d53662fbaac38ee0bd0801eab9630ebca0c8b467d33b0a1b2c6792d0cd83b7cf", "status": "running", - "poll": "/api/datasets/operations/op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f", + "poll": "/api/datasets/operations/op_d53662fbaac38ee0bd0801eab9630ebca0c8b467d33b0a1b2c6792d0cd83b7cf", "retry_after_ms": 1500 } } @@ -503,24 +504,24 @@ { "request": { "method": "GET", - "path": "/datasets/operations/op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f" + "path": "/datasets/operations/op_d53662fbaac38ee0bd0801eab9630ebca0c8b467d33b0a1b2c6792d0cd83b7cf" }, "response": { "status": 200, "headers": { "content-type": "application/json", "retry-after": "2", - "x-dfo-trace-id": "6185b86217ef499bb5b6932299df1207" + "x-dfo-trace-id": "55b37040b90c4b51bb1432fb7f565e8d" }, "json": { "operation": { - "operation_id": "op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f", + "operation_id": "op_d53662fbaac38ee0bd0801eab9630ebca0c8b467d33b0a1b2c6792d0cd83b7cf", "status": "running", - "poll": "/api/datasets/operations/op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f", + "poll": "/api/datasets/operations/op_d53662fbaac38ee0bd0801eab9630ebca0c8b467d33b0a1b2c6792d0cd83b7cf", "retry_after_ms": 1500, "progress": { "rows_written": 0, - "estimate_rows": 107252 + "estimate_rows": 107148 } } } @@ -529,24 +530,24 @@ { "request": { "method": "GET", - "path": "/datasets/operations/op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f" + "path": "/datasets/operations/op_d53662fbaac38ee0bd0801eab9630ebca0c8b467d33b0a1b2c6792d0cd83b7cf" }, "response": { "status": 200, "headers": { "content-type": "application/json", "retry-after": "2", - "x-dfo-trace-id": "1ebea3ca2d15409c953cd716bdc1fccf" + "x-dfo-trace-id": "76621ada279a42da9405c03760d3fa30" }, "json": { "operation": { - "operation_id": "op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f", + "operation_id": "op_d53662fbaac38ee0bd0801eab9630ebca0c8b467d33b0a1b2c6792d0cd83b7cf", "status": "running", - "poll": "/api/datasets/operations/op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f", + "poll": "/api/datasets/operations/op_d53662fbaac38ee0bd0801eab9630ebca0c8b467d33b0a1b2c6792d0cd83b7cf", "retry_after_ms": 1500, "progress": { - "rows_written": 61927, - "estimate_rows": 107252 + "rows_written": 50967, + "estimate_rows": 107148 } } } @@ -555,24 +556,24 @@ { "request": { "method": "GET", - "path": "/datasets/operations/op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f" + "path": "/datasets/operations/op_d53662fbaac38ee0bd0801eab9630ebca0c8b467d33b0a1b2c6792d0cd83b7cf" }, "response": { "status": 200, "headers": { "content-type": "application/json", "retry-after": "2", - "x-dfo-trace-id": "94bb5a8a7c2041969d9a9118b75dc4aa" + "x-dfo-trace-id": "f489220d020f40cabbd29c2e1d57a188" }, "json": { "operation": { - "operation_id": "op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f", + "operation_id": "op_d53662fbaac38ee0bd0801eab9630ebca0c8b467d33b0a1b2c6792d0cd83b7cf", "status": "running", - "poll": "/api/datasets/operations/op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f", + "poll": "/api/datasets/operations/op_d53662fbaac38ee0bd0801eab9630ebca0c8b467d33b0a1b2c6792d0cd83b7cf", "retry_after_ms": 1500, "progress": { - "rows_written": 107252, - "estimate_rows": 107252 + "rows_written": 107148, + "estimate_rows": 107148 } } } @@ -581,24 +582,24 @@ { "request": { "method": "GET", - "path": "/datasets/operations/op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f" + "path": "/datasets/operations/op_d53662fbaac38ee0bd0801eab9630ebca0c8b467d33b0a1b2c6792d0cd83b7cf" }, "response": { "status": 200, "headers": { "content-type": "application/json", "retry-after": "2", - "x-dfo-trace-id": "c78757a54b9f4b6786a784f8a47ad5b4" + "x-dfo-trace-id": "9855026593bc4f158bc5bcdea3bd1809" }, "json": { "operation": { - "operation_id": "op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f", + "operation_id": "op_d53662fbaac38ee0bd0801eab9630ebca0c8b467d33b0a1b2c6792d0cd83b7cf", "status": "running", - "poll": "/api/datasets/operations/op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f", - "retry_after_ms": 1784, + "poll": "/api/datasets/operations/op_d53662fbaac38ee0bd0801eab9630ebca0c8b467d33b0a1b2c6792d0cd83b7cf", + "retry_after_ms": 1797, "progress": { - "rows_written": 107252, - "estimate_rows": 107252 + "rows_written": 107148, + "estimate_rows": 107148 } } } @@ -607,24 +608,24 @@ { "request": { "method": "GET", - "path": "/datasets/operations/op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f" + "path": "/datasets/operations/op_d53662fbaac38ee0bd0801eab9630ebca0c8b467d33b0a1b2c6792d0cd83b7cf" }, "response": { "status": 200, "headers": { "content-type": "application/json", "retry-after": "3", - "x-dfo-trace-id": "914bfd57942740b893ba9ca1b4f4591b" + "x-dfo-trace-id": "119eba2f4a1b446aa13d7abc8d39a2a9" }, "json": { "operation": { - "operation_id": "op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f", + "operation_id": "op_d53662fbaac38ee0bd0801eab9630ebca0c8b467d33b0a1b2c6792d0cd83b7cf", "status": "running", - "poll": "/api/datasets/operations/op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f", - "retry_after_ms": 2289, + "poll": "/api/datasets/operations/op_d53662fbaac38ee0bd0801eab9630ebca0c8b467d33b0a1b2c6792d0cd83b7cf", + "retry_after_ms": 2302, "progress": { - "rows_written": 107252, - "estimate_rows": 107252 + "rows_written": 107148, + "estimate_rows": 107148 } } } @@ -633,24 +634,24 @@ { "request": { "method": "GET", - "path": "/datasets/operations/op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f" + "path": "/datasets/operations/op_d53662fbaac38ee0bd0801eab9630ebca0c8b467d33b0a1b2c6792d0cd83b7cf" }, "response": { "status": 200, "headers": { "content-type": "application/json", "retry-after": "3", - "x-dfo-trace-id": "217766e0425f4916a393331295c4a7e7" + "x-dfo-trace-id": "1019c2a1661647d193bda3dd1a96847a" }, "json": { "operation": { - "operation_id": "op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f", + "operation_id": "op_d53662fbaac38ee0bd0801eab9630ebca0c8b467d33b0a1b2c6792d0cd83b7cf", "status": "running", - "poll": "/api/datasets/operations/op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f", - "retry_after_ms": 2934, + "poll": "/api/datasets/operations/op_d53662fbaac38ee0bd0801eab9630ebca0c8b467d33b0a1b2c6792d0cd83b7cf", + "retry_after_ms": 2919, "progress": { - "rows_written": 107252, - "estimate_rows": 107252 + "rows_written": 107148, + "estimate_rows": 107148 } } } @@ -659,24 +660,24 @@ { "request": { "method": "GET", - "path": "/datasets/operations/op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f" + "path": "/datasets/operations/op_d53662fbaac38ee0bd0801eab9630ebca0c8b467d33b0a1b2c6792d0cd83b7cf" }, "response": { "status": 200, "headers": { "content-type": "application/json", - "x-dfo-trace-id": "c501ba8d087b4561b2ff0e423c719ab0" + "x-dfo-trace-id": "2a08d19167d845478a587fcdca1b295b" }, "json": { "operation": { - "operation_id": "op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f", + "operation_id": "op_d53662fbaac38ee0bd0801eab9630ebca0c8b467d33b0a1b2c6792d0cd83b7cf", "status": "done" }, "manifest": { "schema_version": 1, "definition": { "schema_version": 1, - "spec_id": "spec_70ddf0ce6a9b3f147063f2adf37fab9e", + "spec_id": "spec_8d395f753219876fa459778f38499a80", "identity": { "shape": { "kind": "statvar_schema", @@ -708,7 +709,7 @@ }, { "binding": { - "ref": "Gross", + "ref": "Net", "state": "value" }, "property": "nettingBasis" @@ -889,14 +890,14 @@ "requested_window": { "kind": "range", "end_year": 2024, - "start_year": 1967 + "start_year": 1968 } } }, - "content_version": "cv_fafc60a507e03b0d42689fb1936127b9", - "prepared_at": "2026-10-26T09:22:44Z", + "content_version": "cv_e9cd9cba677e6dd0e2a81d5700d5edfb", + "prepared_at": "2026-11-01T07:38:40Z", "coverage": { - "rows": 107252, + "rows": 107148, "dimensions": [ { "label": "financingProvider", @@ -918,14 +919,14 @@ }, { "label": "years", - "count": 58 + "count": 57 } ], "window": { "kind": "range", "origin": "query", "end_year": 2024, - "start_year": 1967 + "start_year": 1968 } }, "citation": { @@ -952,8 +953,8 @@ "source_data_url": "https://webfs-dcd.oecd.org/files/dotStat/DSD_DAC2/Table2a_Data.zip", "attribution": "OECD (2026), OECD DAC2A, OECD Data Explorer, https://webfs-dcd.oecd.org/files/dotStat/DSD_DAC2/Table2a_Data.zip (accessed on 2026-10-12)", "update_cadence": "Quarterly", - "last_update": "2026-10-15", - "years_covered": "1960-2024", + "last_update": "2026-10-29", + "years_covered": "1960-2025", "granularity": "Annual, by provider and recipient", "currencies": [ "USD" @@ -964,8 +965,8 @@ "description": "The OECD publishes DAC2A in April, June, September and December. The complete table is downloaded from the OECD each time it is republished, and replaces the previous copy, so the data reflects the OECD's latest release." }, { - "transformation": "Exclude the partial preliminary year", - "description": "Before each full release, the OECD publishes preliminary data for the year that release covers, as reporters submit it. Until then, that year is partial, so the pipeline excludes it. Support for partial years is in development. Partial years will be marked incomplete, so they don't lead to incorrect or confusing analyses." + "transformation": "Mark the partial year", + "description": "The OECD publishes data for a year as donors report it, and its final release in December of the following year covers every donor. Until then, the year is partial. The pipeline publishes it, and the import's provenance names it in `partialObservationDate`." }, { "transformation": "Standardise providers and recipients", @@ -985,13 +986,23 @@ } ], "version_history": [ + { + "date": "2026-10-29", + "title": "Partial year published, marked as partial", + "changes": [ + { + "kind": "changed", + "note": "The partial year, which only some donors have reported ahead of the OECD's final release in December, is included, and the import's provenance marks it with `partialObservationDate`." + } + ] + }, { "date": "2026-10-15", - "title": "Partial preliminary year excluded", + "title": "Partial year excluded", "changes": [ { "kind": "changed", - "note": "The partial preliminary year published ahead of the next full release is excluded." + "note": "The partial year, which only some donors have reported ahead of the OECD's final release in December, is excluded." } ] }, @@ -1044,39 +1055,39 @@ "kind": "range", "origin": "query", "end_year": 2024, - "start_year": 1967 + "start_year": 1968 }, "graph_revision": null, "normalisations": [], "code_index_stamp": { - "exported_at": "2026-10-24T19:20:27Z", - "content_hash": "3d946d8f4986dbbe0fa3e5c4c917200381f529d89ce417c11daeb22df56eed99", + "exported_at": "2026-11-01T03:08:18Z", + "content_hash": "a1bde3be8710f5ba073e52aaaba73cf9156079c273c874372f54bb07a81b0f94", "graph_endpoint": "graph_release" }, "source_revisions": [ { "source": "provenance/OECDDAC2A", - "revision": "2026-10-15" + "revision": "2026-10-29" } ], - "capability_version": "dset_76f5fa7244511c58", - "materialiser_build": "d80df9f5fd598b7345255470932d202ee5d49942", + "capability_version": "dset_5282a0674178a233", + "materialiser_build": "ccb6617922c839ce3cd5615a3bbb65c70bfe1bde", "resolved_stat_vars": [ { - "ref": "dcid:Amount_FinancialFlow_Gross_Disbursement_DAC2aAidType206_Nominal", + "ref": "dcid:Amount_FinancialFlow_Net_Disbursement_DAC2aAidType206_Nominal", "roles": [ "financingProvider", "financingRecipient" ], - "observation_count": 107252 + "observation_count": 107148 } ], "family_member_count": 1, - "family_member_digest": "1a36e1a7292b1bfff95a5415de0be74cac7bb033217ed50e79faa8ce51a224c0", + "family_member_digest": "c2d373442ac21a31377df76cd343f156c72a530649757c399c6661cbf56c9a71", "frame_grammar_version": "1.1.0", - "origin_catalogue_build_id": "20261026T000018Z-0af2cac5", + "origin_catalogue_build_id": "20261029T171521Z-7d0a5854", "served_from": "materialise", - "confirmed_at": "2026-10-26T09:22:46.854499+00:00" + "confirmed_at": "2026-11-01T07:38:43.335353+00:00" }, "warnings": [], "diagnostics": [ @@ -1088,34 +1099,34 @@ ], "artifacts": [ { - "artifact_digest": "sha256:a8c742f8f416b2f3414c7a569f7c18b337c5ee9ae3012483583bad0b238f5c61", + "artifact_digest": "sha256:1effd75b0d46b45109033faa8adfba1dbdc83d285810fe8c878c953595456b57", "rendering": { "bundle": false, "format": "parquet", "layout": 4 }, - "bytes": 466531, + "bytes": 469908, "media_type": "application/vnd.apache.parquet", - "created_at": "2026-10-26T09:22:46.786678+00:00", + "created_at": "2026-11-01T07:38:43.262295+00:00", "tier": "working", - "url": "/api/datasets/spec_70ddf0ce6a9b3f147063f2adf37fab9e/cv_fafc60a507e03b0d42689fb1936127b9/files/sha256:a8c742f8f416b2f3414c7a569f7c18b337c5ee9ae3012483583bad0b238f5c61", - "enrichment_stamp": "08ed6c734fc69ea2204a21f4e1dd8b963f14dd1e03a2484c618049ac2e2d93d8" + "url": "/api/datasets/spec_8d395f753219876fa459778f38499a80/cv_e9cd9cba677e6dd0e2a81d5700d5edfb/files/sha256:1effd75b0d46b45109033faa8adfba1dbdc83d285810fe8c878c953595456b57", + "enrichment_stamp": "55887b871f7aa1c5d120cb2bee97086605351d5acfbec645ab027f562d0f65c5" }, { - "artifact_digest": "sha256:5247bafa55f84fe2f8bc348601acb955162c39a1a082e939945336470e5c5231", + "artifact_digest": "sha256:73e13b2b41415cb991b4416af6ddd4c6ccf9e2ebc9bbaa4818b197a9e6e9b1a2", "rendering": { "statistics": "series" }, - "bytes": 144985, + "bytes": 147458, "media_type": "application/vnd.apache.parquet", - "created_at": "2026-10-26T09:22:46.786678+00:00", + "created_at": "2026-11-01T07:38:43.262295+00:00", "tier": "working", - "url": "/api/datasets/spec_70ddf0ce6a9b3f147063f2adf37fab9e/cv_fafc60a507e03b0d42689fb1936127b9/files/sha256:5247bafa55f84fe2f8bc348601acb955162c39a1a082e939945336470e5c5231" + "url": "/api/datasets/spec_8d395f753219876fa459778f38499a80/cv_e9cd9cba677e6dd0e2a81d5700d5edfb/files/sha256:73e13b2b41415cb991b4416af6ddd4c6ccf9e2ebc9bbaa4818b197a9e6e9b1a2" } ], - "series_count": 3656, + "series_count": 3657, "output_options": { - "capability_version": "dset_76f5fa7244511c58", + "capability_version": "dset_5282a0674178a233", "columns": [ { "name": "stat_var", @@ -1139,7 +1150,7 @@ "name": "time_period", "kind": "grain", "droppable": false, - "distinct": 58 + "distinct": 57 }, { "name": "value", @@ -1198,7 +1209,8 @@ "covered": 32 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": false }, { "column": "financingProvider", @@ -1210,7 +1222,8 @@ "covered": 32 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": false }, { "column": "financingProvider", @@ -1222,7 +1235,8 @@ "covered": 32 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true }, { "column": "financingProvider", @@ -1234,7 +1248,8 @@ "covered": 32 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": false }, { "column": "financingProvider", @@ -1246,7 +1261,8 @@ "covered": 32 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true }, { "column": "financingProvider", @@ -1258,7 +1274,8 @@ "covered": 32 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true }, { "column": "financingProvider", @@ -1270,7 +1287,8 @@ "covered": 32 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true }, { "column": "financingRecipient", @@ -1282,7 +1300,8 @@ "covered": 133 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": false }, { "column": "financingRecipient", @@ -1300,7 +1319,8 @@ "label": "South Sudan" } ], - "truncated": false + "truncated": false, + "in_long_layout": false }, { "column": "financingRecipient", @@ -1312,7 +1332,8 @@ "covered": 133 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true }, { "column": "financingRecipient", @@ -1324,7 +1345,8 @@ "covered": 133 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": false }, { "column": "financingRecipient", @@ -1336,7 +1358,8 @@ "covered": 133 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true }, { "column": "financingRecipient", @@ -1348,7 +1371,8 @@ "covered": 133 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true }, { "column": "financingRecipient", @@ -1360,7 +1384,8 @@ "covered": 133 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true } ], "long_layout_defaults": [ @@ -1379,7 +1404,7 @@ "varying": [ { "column": "time_period", - "distinct": 58 + "distinct": 57 } ] }, @@ -1403,7 +1428,7 @@ "varying": [ { "column": "time_period", - "distinct": 58 + "distinct": 57 } ] }, @@ -1462,10 +1487,10 @@ ] } }, - "series_coverage_stamp": "e6e717ab8c77e84d010915893ede5809e9ecec67929a07cfafbcc2210edfa1eb", + "series_coverage_stamp": "ad27fd11738abb03d2d84dc214e223f04781609636cf678d0d08c385fb863d99", "retention": { "pinned": false, - "held_until": "2026-11-25T09:22:46.785219Z" + "held_until": "2026-12-01T07:38:43.261993Z" } } } @@ -1474,21 +1499,21 @@ { "request": { "method": "GET", - "origin_path": "/api/datasets/spec_70ddf0ce6a9b3f147063f2adf37fab9e/cv_fafc60a507e03b0d42689fb1936127b9/files/sha256:a8c742f8f416b2f3414c7a569f7c18b337c5ee9ae3012483583bad0b238f5c61" + "origin_path": "/api/datasets/spec_8d395f753219876fa459778f38499a80/cv_e9cd9cba677e6dd0e2a81d5700d5edfb/files/sha256:1effd75b0d46b45109033faa8adfba1dbdc83d285810fe8c878c953595456b57" }, "response": { "status": 302, "headers": { "content-type": "text/html", - "location": "https://storage.googleapis.com/dev-fin-observatory-datasets-working/sha256%3Aa8c742f8f416b2f3414c7a569f7c18b337c5ee9ae3012483583bad0b238f5c61?X-Goog-Signature=redacted", - "x-dfo-trace-id": "22f0d88923c14d74825b5f14d41c05b8" + "location": "https://storage.googleapis.com/dev-fin-observatory-datasets-working/sha256%3A1effd75b0d46b45109033faa8adfba1dbdc83d285810fe8c878c953595456b57?X-Goog-Signature=redacted", + "x-dfo-trace-id": "0758c8ebc1d44bb896d7880cc101fd6a" } } }, { "request": { "method": "GET", - "url": "https://storage.googleapis.com/dev-fin-observatory-datasets-working/sha256%3Aa8c742f8f416b2f3414c7a569f7c18b337c5ee9ae3012483583bad0b238f5c61?X-Goog-Signature=redacted" + "url": "https://storage.googleapis.com/dev-fin-observatory-datasets-working/sha256%3A1effd75b0d46b45109033faa8adfba1dbdc83d285810fe8c878c953595456b57?X-Goog-Signature=redacted" }, "response": { "status": 200, @@ -1502,7 +1527,7 @@ "expect": [ { "dataset": { - "rows": 107252, + "rows": 107148, "columns": [ "time_period", "financingProvider_label", @@ -1529,23 +1554,23 @@ "members": [ { "parts": [], - "spec_id": "spec_70ddf0ce6a9b3f147063f2adf37fab9e", - "content_version": "cv_fafc60a507e03b0d42689fb1936127b9", - "sentence": "Gross disbursements to the 133 G77 countries from the 32 DAC countries for official development assistance, 1967 to 2024. Current US dollars · OECD DAC2a." + "spec_id": "spec_8d395f753219876fa459778f38499a80", + "content_version": "cv_e9cd9cba677e6dd0e2a81d5700d5edfb", + "sentence": "Net disbursements to the 133 G77 countries from the 32 DAC countries for official development assistance, 1968 to 2024. Current US dollars · OECD DAC2a." } ], "missing": [], "long_builds": [ { - "operation_id": "op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f", + "operation_id": "op_d53662fbaac38ee0bd0801eab9630ebca0c8b467d33b0a1b2c6792d0cd83b7cf", "poll_waits": [ 1.5, 1.5, 1.5, 1.5, - 1.784, - 2.289, - 2.934 + 1.797, + 2.302, + 2.919 ], "resubmissions": 0 } diff --git a/python/client-contract/src/dfo_client_contract/scenarios/fetch-spec-async-build.json b/python/client-contract/src/dfo_client_contract/scenarios/fetch-spec-async-build.json index bcc6706..d0aea20 100644 --- a/python/client-contract/src/dfo_client_contract/scenarios/fetch-spec-async-build.json +++ b/python/client-contract/src/dfo_client_contract/scenarios/fetch-spec-async-build.json @@ -11,10 +11,10 @@ { "op": "fetch", "spec": { - "spec_id": "spec_70ddf0ce6a9b3f147063f2adf37fab9e", + "spec_id": "spec_8d395f753219876fa459778f38499a80", "definition": { "schema_version": 1, - "spec_id": "spec_70ddf0ce6a9b3f147063f2adf37fab9e", + "spec_id": "spec_8d395f753219876fa459778f38499a80", "identity": { "identity_version": "spec1", "shape": { @@ -49,7 +49,7 @@ "property": "nettingBasis", "binding": { "state": "value", - "ref": "Gross" + "ref": "Net" } } ], @@ -226,12 +226,12 @@ }, "requested_window": { "kind": "range", - "start_year": 1967, + "start_year": 1968, "end_year": 2024 } } }, - "sentence": "Gross disbursements to the 133 G77 countries from the 32 DAC countries for official development assistance, 1967 to 2024. Current US dollars · OECD DAC2a.", + "sentence": "Net disbursements to the 133 G77 countries from the 32 DAC countries for official development assistance, 1968 to 2024. Current US dollars · OECD DAC2a.", "entity_groups": { "destination": { "label": "G77 countries", @@ -239,7 +239,8 @@ }, "origin": { "label": "DAC countries", - "group_id": "groups/OECD.DAC" + "group_id": "groups/OECD.DAC", + "sum_differs": true } } }, @@ -255,10 +256,10 @@ "schema_version": 1, "input": { "kind": "spec_id", - "spec_id": "spec_70ddf0ce6a9b3f147063f2adf37fab9e", + "spec_id": "spec_8d395f753219876fa459778f38499a80", "definition": { "schema_version": 1, - "spec_id": "spec_70ddf0ce6a9b3f147063f2adf37fab9e", + "spec_id": "spec_8d395f753219876fa459778f38499a80", "identity": { "identity_version": "spec1", "shape": { @@ -293,7 +294,7 @@ "property": "nettingBasis", "binding": { "state": "value", - "ref": "Gross" + "ref": "Net" } } ], @@ -470,7 +471,7 @@ }, "requested_window": { "kind": "range", - "start_year": 1967, + "start_year": 1968, "end_year": 2024 } } @@ -486,15 +487,15 @@ "status": 202, "headers": { "content-type": "application/json", - "location": "/api/datasets/operations/op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f", + "location": "/api/datasets/operations/op_d53662fbaac38ee0bd0801eab9630ebca0c8b467d33b0a1b2c6792d0cd83b7cf", "retry-after": "2", - "x-dfo-trace-id": "9e96509866ff4da09a698df1f19a5cbd" + "x-dfo-trace-id": "7fd3deb153d34f4b9afce2b95ffdd664" }, "json": { "operation": { - "operation_id": "op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f", + "operation_id": "op_d53662fbaac38ee0bd0801eab9630ebca0c8b467d33b0a1b2c6792d0cd83b7cf", "status": "pending", - "poll": "/api/datasets/operations/op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f", + "poll": "/api/datasets/operations/op_d53662fbaac38ee0bd0801eab9630ebca0c8b467d33b0a1b2c6792d0cd83b7cf", "retry_after_ms": 1500 } } @@ -503,24 +504,24 @@ { "request": { "method": "GET", - "path": "/datasets/operations/op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f" + "path": "/datasets/operations/op_d53662fbaac38ee0bd0801eab9630ebca0c8b467d33b0a1b2c6792d0cd83b7cf" }, "response": { "status": 200, "headers": { "content-type": "application/json", "retry-after": "2", - "x-dfo-trace-id": "6185b86217ef499bb5b6932299df1207" + "x-dfo-trace-id": "55b37040b90c4b51bb1432fb7f565e8d" }, "json": { "operation": { - "operation_id": "op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f", + "operation_id": "op_d53662fbaac38ee0bd0801eab9630ebca0c8b467d33b0a1b2c6792d0cd83b7cf", "status": "running", - "poll": "/api/datasets/operations/op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f", + "poll": "/api/datasets/operations/op_d53662fbaac38ee0bd0801eab9630ebca0c8b467d33b0a1b2c6792d0cd83b7cf", "retry_after_ms": 1500, "progress": { "rows_written": 0, - "estimate_rows": 107252 + "estimate_rows": 107148 } } } @@ -529,24 +530,24 @@ { "request": { "method": "GET", - "path": "/datasets/operations/op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f" + "path": "/datasets/operations/op_d53662fbaac38ee0bd0801eab9630ebca0c8b467d33b0a1b2c6792d0cd83b7cf" }, "response": { "status": 200, "headers": { "content-type": "application/json", "retry-after": "2", - "x-dfo-trace-id": "1ebea3ca2d15409c953cd716bdc1fccf" + "x-dfo-trace-id": "76621ada279a42da9405c03760d3fa30" }, "json": { "operation": { - "operation_id": "op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f", + "operation_id": "op_d53662fbaac38ee0bd0801eab9630ebca0c8b467d33b0a1b2c6792d0cd83b7cf", "status": "running", - "poll": "/api/datasets/operations/op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f", + "poll": "/api/datasets/operations/op_d53662fbaac38ee0bd0801eab9630ebca0c8b467d33b0a1b2c6792d0cd83b7cf", "retry_after_ms": 1500, "progress": { - "rows_written": 61927, - "estimate_rows": 107252 + "rows_written": 50967, + "estimate_rows": 107148 } } } @@ -555,24 +556,24 @@ { "request": { "method": "GET", - "path": "/datasets/operations/op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f" + "path": "/datasets/operations/op_d53662fbaac38ee0bd0801eab9630ebca0c8b467d33b0a1b2c6792d0cd83b7cf" }, "response": { "status": 200, "headers": { "content-type": "application/json", "retry-after": "2", - "x-dfo-trace-id": "94bb5a8a7c2041969d9a9118b75dc4aa" + "x-dfo-trace-id": "f489220d020f40cabbd29c2e1d57a188" }, "json": { "operation": { - "operation_id": "op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f", + "operation_id": "op_d53662fbaac38ee0bd0801eab9630ebca0c8b467d33b0a1b2c6792d0cd83b7cf", "status": "running", - "poll": "/api/datasets/operations/op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f", + "poll": "/api/datasets/operations/op_d53662fbaac38ee0bd0801eab9630ebca0c8b467d33b0a1b2c6792d0cd83b7cf", "retry_after_ms": 1500, "progress": { - "rows_written": 107252, - "estimate_rows": 107252 + "rows_written": 107148, + "estimate_rows": 107148 } } } @@ -581,24 +582,24 @@ { "request": { "method": "GET", - "path": "/datasets/operations/op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f" + "path": "/datasets/operations/op_d53662fbaac38ee0bd0801eab9630ebca0c8b467d33b0a1b2c6792d0cd83b7cf" }, "response": { "status": 200, "headers": { "content-type": "application/json", "retry-after": "2", - "x-dfo-trace-id": "c78757a54b9f4b6786a784f8a47ad5b4" + "x-dfo-trace-id": "9855026593bc4f158bc5bcdea3bd1809" }, "json": { "operation": { - "operation_id": "op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f", + "operation_id": "op_d53662fbaac38ee0bd0801eab9630ebca0c8b467d33b0a1b2c6792d0cd83b7cf", "status": "running", - "poll": "/api/datasets/operations/op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f", - "retry_after_ms": 1784, + "poll": "/api/datasets/operations/op_d53662fbaac38ee0bd0801eab9630ebca0c8b467d33b0a1b2c6792d0cd83b7cf", + "retry_after_ms": 1797, "progress": { - "rows_written": 107252, - "estimate_rows": 107252 + "rows_written": 107148, + "estimate_rows": 107148 } } } @@ -607,24 +608,24 @@ { "request": { "method": "GET", - "path": "/datasets/operations/op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f" + "path": "/datasets/operations/op_d53662fbaac38ee0bd0801eab9630ebca0c8b467d33b0a1b2c6792d0cd83b7cf" }, "response": { "status": 200, "headers": { "content-type": "application/json", "retry-after": "3", - "x-dfo-trace-id": "914bfd57942740b893ba9ca1b4f4591b" + "x-dfo-trace-id": "119eba2f4a1b446aa13d7abc8d39a2a9" }, "json": { "operation": { - "operation_id": "op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f", + "operation_id": "op_d53662fbaac38ee0bd0801eab9630ebca0c8b467d33b0a1b2c6792d0cd83b7cf", "status": "running", - "poll": "/api/datasets/operations/op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f", - "retry_after_ms": 2289, + "poll": "/api/datasets/operations/op_d53662fbaac38ee0bd0801eab9630ebca0c8b467d33b0a1b2c6792d0cd83b7cf", + "retry_after_ms": 2302, "progress": { - "rows_written": 107252, - "estimate_rows": 107252 + "rows_written": 107148, + "estimate_rows": 107148 } } } @@ -633,24 +634,24 @@ { "request": { "method": "GET", - "path": "/datasets/operations/op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f" + "path": "/datasets/operations/op_d53662fbaac38ee0bd0801eab9630ebca0c8b467d33b0a1b2c6792d0cd83b7cf" }, "response": { "status": 200, "headers": { "content-type": "application/json", "retry-after": "3", - "x-dfo-trace-id": "217766e0425f4916a393331295c4a7e7" + "x-dfo-trace-id": "1019c2a1661647d193bda3dd1a96847a" }, "json": { "operation": { - "operation_id": "op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f", + "operation_id": "op_d53662fbaac38ee0bd0801eab9630ebca0c8b467d33b0a1b2c6792d0cd83b7cf", "status": "running", - "poll": "/api/datasets/operations/op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f", - "retry_after_ms": 2934, + "poll": "/api/datasets/operations/op_d53662fbaac38ee0bd0801eab9630ebca0c8b467d33b0a1b2c6792d0cd83b7cf", + "retry_after_ms": 2919, "progress": { - "rows_written": 107252, - "estimate_rows": 107252 + "rows_written": 107148, + "estimate_rows": 107148 } } } @@ -659,24 +660,24 @@ { "request": { "method": "GET", - "path": "/datasets/operations/op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f" + "path": "/datasets/operations/op_d53662fbaac38ee0bd0801eab9630ebca0c8b467d33b0a1b2c6792d0cd83b7cf" }, "response": { "status": 200, "headers": { "content-type": "application/json", - "x-dfo-trace-id": "c501ba8d087b4561b2ff0e423c719ab0" + "x-dfo-trace-id": "2a08d19167d845478a587fcdca1b295b" }, "json": { "operation": { - "operation_id": "op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f", + "operation_id": "op_d53662fbaac38ee0bd0801eab9630ebca0c8b467d33b0a1b2c6792d0cd83b7cf", "status": "done" }, "manifest": { "schema_version": 1, "definition": { "schema_version": 1, - "spec_id": "spec_70ddf0ce6a9b3f147063f2adf37fab9e", + "spec_id": "spec_8d395f753219876fa459778f38499a80", "identity": { "shape": { "kind": "statvar_schema", @@ -708,7 +709,7 @@ }, { "binding": { - "ref": "Gross", + "ref": "Net", "state": "value" }, "property": "nettingBasis" @@ -889,14 +890,14 @@ "requested_window": { "kind": "range", "end_year": 2024, - "start_year": 1967 + "start_year": 1968 } } }, - "content_version": "cv_fafc60a507e03b0d42689fb1936127b9", - "prepared_at": "2026-10-26T09:22:44Z", + "content_version": "cv_e9cd9cba677e6dd0e2a81d5700d5edfb", + "prepared_at": "2026-11-01T07:38:40Z", "coverage": { - "rows": 107252, + "rows": 107148, "dimensions": [ { "label": "financingProvider", @@ -918,14 +919,14 @@ }, { "label": "years", - "count": 58 + "count": 57 } ], "window": { "kind": "range", "origin": "query", "end_year": 2024, - "start_year": 1967 + "start_year": 1968 } }, "citation": { @@ -952,8 +953,8 @@ "source_data_url": "https://webfs-dcd.oecd.org/files/dotStat/DSD_DAC2/Table2a_Data.zip", "attribution": "OECD (2026), OECD DAC2A, OECD Data Explorer, https://webfs-dcd.oecd.org/files/dotStat/DSD_DAC2/Table2a_Data.zip (accessed on 2026-10-12)", "update_cadence": "Quarterly", - "last_update": "2026-10-15", - "years_covered": "1960-2024", + "last_update": "2026-10-29", + "years_covered": "1960-2025", "granularity": "Annual, by provider and recipient", "currencies": [ "USD" @@ -964,8 +965,8 @@ "description": "The OECD publishes DAC2A in April, June, September and December. The complete table is downloaded from the OECD each time it is republished, and replaces the previous copy, so the data reflects the OECD's latest release." }, { - "transformation": "Exclude the partial preliminary year", - "description": "Before each full release, the OECD publishes preliminary data for the year that release covers, as reporters submit it. Until then, that year is partial, so the pipeline excludes it. Support for partial years is in development. Partial years will be marked incomplete, so they don't lead to incorrect or confusing analyses." + "transformation": "Mark the partial year", + "description": "The OECD publishes data for a year as donors report it, and its final release in December of the following year covers every donor. Until then, the year is partial. The pipeline publishes it, and the import's provenance names it in `partialObservationDate`." }, { "transformation": "Standardise providers and recipients", @@ -985,13 +986,23 @@ } ], "version_history": [ + { + "date": "2026-10-29", + "title": "Partial year published, marked as partial", + "changes": [ + { + "kind": "changed", + "note": "The partial year, which only some donors have reported ahead of the OECD's final release in December, is included, and the import's provenance marks it with `partialObservationDate`." + } + ] + }, { "date": "2026-10-15", - "title": "Partial preliminary year excluded", + "title": "Partial year excluded", "changes": [ { "kind": "changed", - "note": "The partial preliminary year published ahead of the next full release is excluded." + "note": "The partial year, which only some donors have reported ahead of the OECD's final release in December, is excluded." } ] }, @@ -1044,39 +1055,39 @@ "kind": "range", "origin": "query", "end_year": 2024, - "start_year": 1967 + "start_year": 1968 }, "graph_revision": null, "normalisations": [], "code_index_stamp": { - "exported_at": "2026-10-24T19:20:27Z", - "content_hash": "3d946d8f4986dbbe0fa3e5c4c917200381f529d89ce417c11daeb22df56eed99", + "exported_at": "2026-11-01T03:08:18Z", + "content_hash": "a1bde3be8710f5ba073e52aaaba73cf9156079c273c874372f54bb07a81b0f94", "graph_endpoint": "graph_release" }, "source_revisions": [ { "source": "provenance/OECDDAC2A", - "revision": "2026-10-15" + "revision": "2026-10-29" } ], - "capability_version": "dset_76f5fa7244511c58", - "materialiser_build": "d80df9f5fd598b7345255470932d202ee5d49942", + "capability_version": "dset_5282a0674178a233", + "materialiser_build": "ccb6617922c839ce3cd5615a3bbb65c70bfe1bde", "resolved_stat_vars": [ { - "ref": "dcid:Amount_FinancialFlow_Gross_Disbursement_DAC2aAidType206_Nominal", + "ref": "dcid:Amount_FinancialFlow_Net_Disbursement_DAC2aAidType206_Nominal", "roles": [ "financingProvider", "financingRecipient" ], - "observation_count": 107252 + "observation_count": 107148 } ], "family_member_count": 1, - "family_member_digest": "1a36e1a7292b1bfff95a5415de0be74cac7bb033217ed50e79faa8ce51a224c0", + "family_member_digest": "c2d373442ac21a31377df76cd343f156c72a530649757c399c6661cbf56c9a71", "frame_grammar_version": "1.1.0", - "origin_catalogue_build_id": "20261026T000018Z-0af2cac5", + "origin_catalogue_build_id": "20261029T171521Z-7d0a5854", "served_from": "materialise", - "confirmed_at": "2026-10-26T09:22:46.854499+00:00" + "confirmed_at": "2026-11-01T07:38:43.335353+00:00" }, "warnings": [], "diagnostics": [ @@ -1088,34 +1099,34 @@ ], "artifacts": [ { - "artifact_digest": "sha256:a8c742f8f416b2f3414c7a569f7c18b337c5ee9ae3012483583bad0b238f5c61", + "artifact_digest": "sha256:1effd75b0d46b45109033faa8adfba1dbdc83d285810fe8c878c953595456b57", "rendering": { "bundle": false, "format": "parquet", "layout": 4 }, - "bytes": 466531, + "bytes": 469908, "media_type": "application/vnd.apache.parquet", - "created_at": "2026-10-26T09:22:46.786678+00:00", + "created_at": "2026-11-01T07:38:43.262295+00:00", "tier": "working", - "url": "/api/datasets/spec_70ddf0ce6a9b3f147063f2adf37fab9e/cv_fafc60a507e03b0d42689fb1936127b9/files/sha256:a8c742f8f416b2f3414c7a569f7c18b337c5ee9ae3012483583bad0b238f5c61", - "enrichment_stamp": "08ed6c734fc69ea2204a21f4e1dd8b963f14dd1e03a2484c618049ac2e2d93d8" + "url": "/api/datasets/spec_8d395f753219876fa459778f38499a80/cv_e9cd9cba677e6dd0e2a81d5700d5edfb/files/sha256:1effd75b0d46b45109033faa8adfba1dbdc83d285810fe8c878c953595456b57", + "enrichment_stamp": "55887b871f7aa1c5d120cb2bee97086605351d5acfbec645ab027f562d0f65c5" }, { - "artifact_digest": "sha256:5247bafa55f84fe2f8bc348601acb955162c39a1a082e939945336470e5c5231", + "artifact_digest": "sha256:73e13b2b41415cb991b4416af6ddd4c6ccf9e2ebc9bbaa4818b197a9e6e9b1a2", "rendering": { "statistics": "series" }, - "bytes": 144985, + "bytes": 147458, "media_type": "application/vnd.apache.parquet", - "created_at": "2026-10-26T09:22:46.786678+00:00", + "created_at": "2026-11-01T07:38:43.262295+00:00", "tier": "working", - "url": "/api/datasets/spec_70ddf0ce6a9b3f147063f2adf37fab9e/cv_fafc60a507e03b0d42689fb1936127b9/files/sha256:5247bafa55f84fe2f8bc348601acb955162c39a1a082e939945336470e5c5231" + "url": "/api/datasets/spec_8d395f753219876fa459778f38499a80/cv_e9cd9cba677e6dd0e2a81d5700d5edfb/files/sha256:73e13b2b41415cb991b4416af6ddd4c6ccf9e2ebc9bbaa4818b197a9e6e9b1a2" } ], - "series_count": 3656, + "series_count": 3657, "output_options": { - "capability_version": "dset_76f5fa7244511c58", + "capability_version": "dset_5282a0674178a233", "columns": [ { "name": "stat_var", @@ -1139,7 +1150,7 @@ "name": "time_period", "kind": "grain", "droppable": false, - "distinct": 58 + "distinct": 57 }, { "name": "value", @@ -1198,7 +1209,8 @@ "covered": 32 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": false }, { "column": "financingProvider", @@ -1210,7 +1222,8 @@ "covered": 32 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": false }, { "column": "financingProvider", @@ -1222,7 +1235,8 @@ "covered": 32 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true }, { "column": "financingProvider", @@ -1234,7 +1248,8 @@ "covered": 32 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": false }, { "column": "financingProvider", @@ -1246,7 +1261,8 @@ "covered": 32 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true }, { "column": "financingProvider", @@ -1258,7 +1274,8 @@ "covered": 32 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true }, { "column": "financingProvider", @@ -1270,7 +1287,8 @@ "covered": 32 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true }, { "column": "financingRecipient", @@ -1282,7 +1300,8 @@ "covered": 133 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": false }, { "column": "financingRecipient", @@ -1300,7 +1319,8 @@ "label": "South Sudan" } ], - "truncated": false + "truncated": false, + "in_long_layout": false }, { "column": "financingRecipient", @@ -1312,7 +1332,8 @@ "covered": 133 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true }, { "column": "financingRecipient", @@ -1324,7 +1345,8 @@ "covered": 133 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": false }, { "column": "financingRecipient", @@ -1336,7 +1358,8 @@ "covered": 133 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true }, { "column": "financingRecipient", @@ -1348,7 +1371,8 @@ "covered": 133 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true }, { "column": "financingRecipient", @@ -1360,7 +1384,8 @@ "covered": 133 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true } ], "long_layout_defaults": [ @@ -1379,7 +1404,7 @@ "varying": [ { "column": "time_period", - "distinct": 58 + "distinct": 57 } ] }, @@ -1403,7 +1428,7 @@ "varying": [ { "column": "time_period", - "distinct": 58 + "distinct": 57 } ] }, @@ -1462,10 +1487,10 @@ ] } }, - "series_coverage_stamp": "e6e717ab8c77e84d010915893ede5809e9ecec67929a07cfafbcc2210edfa1eb", + "series_coverage_stamp": "ad27fd11738abb03d2d84dc214e223f04781609636cf678d0d08c385fb863d99", "retention": { "pinned": false, - "held_until": "2026-11-25T09:22:46.785219Z" + "held_until": "2026-12-01T07:38:43.261993Z" } } } @@ -1474,21 +1499,21 @@ { "request": { "method": "GET", - "origin_path": "/api/datasets/spec_70ddf0ce6a9b3f147063f2adf37fab9e/cv_fafc60a507e03b0d42689fb1936127b9/files/sha256:a8c742f8f416b2f3414c7a569f7c18b337c5ee9ae3012483583bad0b238f5c61" + "origin_path": "/api/datasets/spec_8d395f753219876fa459778f38499a80/cv_e9cd9cba677e6dd0e2a81d5700d5edfb/files/sha256:1effd75b0d46b45109033faa8adfba1dbdc83d285810fe8c878c953595456b57" }, "response": { "status": 302, "headers": { "content-type": "text/html", - "location": "https://storage.googleapis.com/dev-fin-observatory-datasets-working/sha256%3Aa8c742f8f416b2f3414c7a569f7c18b337c5ee9ae3012483583bad0b238f5c61?X-Goog-Signature=redacted", - "x-dfo-trace-id": "22f0d88923c14d74825b5f14d41c05b8" + "location": "https://storage.googleapis.com/dev-fin-observatory-datasets-working/sha256%3A1effd75b0d46b45109033faa8adfba1dbdc83d285810fe8c878c953595456b57?X-Goog-Signature=redacted", + "x-dfo-trace-id": "0758c8ebc1d44bb896d7880cc101fd6a" } } }, { "request": { "method": "GET", - "url": "https://storage.googleapis.com/dev-fin-observatory-datasets-working/sha256%3Aa8c742f8f416b2f3414c7a569f7c18b337c5ee9ae3012483583bad0b238f5c61?X-Goog-Signature=redacted" + "url": "https://storage.googleapis.com/dev-fin-observatory-datasets-working/sha256%3A1effd75b0d46b45109033faa8adfba1dbdc83d285810fe8c878c953595456b57?X-Goog-Signature=redacted" }, "response": { "status": 200, @@ -1502,7 +1527,7 @@ "expect": [ { "dataset": { - "rows": 107252, + "rows": 107148, "columns": [ "time_period", "financingProvider_label", @@ -1529,23 +1554,23 @@ "members": [ { "parts": [], - "spec_id": "spec_70ddf0ce6a9b3f147063f2adf37fab9e", - "content_version": "cv_fafc60a507e03b0d42689fb1936127b9", - "sentence": "Gross disbursements to the 133 G77 countries from the 32 DAC countries for official development assistance, 1967 to 2024. Current US dollars · OECD DAC2a." + "spec_id": "spec_8d395f753219876fa459778f38499a80", + "content_version": "cv_e9cd9cba677e6dd0e2a81d5700d5edfb", + "sentence": "Net disbursements to the 133 G77 countries from the 32 DAC countries for official development assistance, 1968 to 2024. Current US dollars · OECD DAC2a." } ], "missing": [], "long_builds": [ { - "operation_id": "op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f", + "operation_id": "op_d53662fbaac38ee0bd0801eab9630ebca0c8b467d33b0a1b2c6792d0cd83b7cf", "poll_waits": [ 1.5, 1.5, 1.5, 1.5, - 1.784, - 2.289, - 2.934 + 1.797, + 2.302, + 2.919 ], "resubmissions": 0 } diff --git a/python/client-contract/src/dfo_client_contract/scenarios/fetch-spec-digest-mismatch.json b/python/client-contract/src/dfo_client_contract/scenarios/fetch-spec-digest-mismatch.json index 2a98b3b..73ebdf1 100644 --- a/python/client-contract/src/dfo_client_contract/scenarios/fetch-spec-digest-mismatch.json +++ b/python/client-contract/src/dfo_client_contract/scenarios/fetch-spec-digest-mismatch.json @@ -176,7 +176,7 @@ "status": 200, "headers": { "content-type": "application/json", - "x-dfo-trace-id": "b89cda3bb794448abf06b56c955d754e" + "x-dfo-trace-id": "27d2f0b694144799a0314850fb5d29bc" }, "json": { "schema_version": 1, @@ -583,7 +583,7 @@ "frame_grammar_version": "1.1.0", "origin_catalogue_build_id": "20261019T174519Z-2e5e8cfd", "served_from": "head", - "confirmed_at": "2026-10-26T09:18:06.976633+00:00" + "confirmed_at": "2026-11-01T07:37:46.482431+00:00" }, "warnings": [ { @@ -613,7 +613,7 @@ "created_at": "2026-10-23T16:58:47.734759+00:00", "tier": "working", "url": "/api/datasets/spec_cb5baa4161de718f18583060674dbca6/cv_bf242138f8d0a892c97da9373d1626f4/files/sha256:c44200969f19d73104d1bc24ebca905e59f749c2939234cdde10ba6f5a131170", - "enrichment_stamp": "08ed6c734fc69ea2204a21f4e1dd8b963f14dd1e03a2484c618049ac2e2d93d8" + "enrichment_stamp": "55887b871f7aa1c5d120cb2bee97086605351d5acfbec645ab027f562d0f65c5" }, { "artifact_digest": "sha256:d3a506bc9b95188583b5764592d2f1897c0665add660106b7f77c3e501000bb4", @@ -629,7 +629,7 @@ ], "series_count": 1, "output_options": { - "capability_version": "dset_76f5fa7244511c58", + "capability_version": "dset_5282a0674178a233", "columns": [ { "name": "stat_var", @@ -712,7 +712,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": false }, { "column": "financingProvider", @@ -724,7 +725,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": false }, { "column": "financingProvider", @@ -736,7 +738,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true }, { "column": "financingProvider", @@ -748,7 +751,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": false }, { "column": "financingProvider", @@ -760,7 +764,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true }, { "column": "financingProvider", @@ -772,7 +777,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true }, { "column": "financingProvider", @@ -784,7 +790,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true }, { "column": "financingRecipient", @@ -796,7 +803,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": false }, { "column": "financingRecipient", @@ -808,7 +816,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": false }, { "column": "financingRecipient", @@ -820,7 +829,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true }, { "column": "financingRecipient", @@ -832,7 +842,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": false }, { "column": "financingRecipient", @@ -844,7 +855,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true }, { "column": "financingRecipient", @@ -856,7 +868,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true }, { "column": "financingRecipient", @@ -868,7 +881,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true } ], "long_layout_defaults": [ @@ -897,7 +911,7 @@ ] } }, - "series_coverage_stamp": "e6e717ab8c77e84d010915893ede5809e9ecec67929a07cfafbcc2210edfa1eb", + "series_coverage_stamp": "ad27fd11738abb03d2d84dc214e223f04781609636cf678d0d08c385fb863d99", "retention": { "pinned": false, "held_until": "2026-11-19T13:59:18.051742Z" @@ -915,7 +929,7 @@ "headers": { "content-type": "text/html", "location": "https://storage.googleapis.com/dev-fin-observatory-datasets-working/sha256%3Ac44200969f19d73104d1bc24ebca905e59f749c2939234cdde10ba6f5a131170?X-Goog-Signature=redacted", - "x-dfo-trace-id": "cf3f86713afb44c98d21fbf9731d66e3" + "x-dfo-trace-id": "b00bcf5bd0ca432eac38be0de17b99ad" } } }, @@ -942,7 +956,7 @@ "headers": { "content-type": "text/html", "location": "https://storage.googleapis.com/dev-fin-observatory-datasets-working/sha256%3Ac44200969f19d73104d1bc24ebca905e59f749c2939234cdde10ba6f5a131170?X-Goog-Signature=redacted", - "x-dfo-trace-id": "cf3f86713afb44c98d21fbf9731d66e3" + "x-dfo-trace-id": "b00bcf5bd0ca432eac38be0de17b99ad" } } }, diff --git a/python/client-contract/src/dfo_client_contract/scenarios/fetch-spec-empty-narrowing.json b/python/client-contract/src/dfo_client_contract/scenarios/fetch-spec-empty-narrowing.json index 7095cf3..d6ca996 100644 --- a/python/client-contract/src/dfo_client_contract/scenarios/fetch-spec-empty-narrowing.json +++ b/python/client-contract/src/dfo_client_contract/scenarios/fetch-spec-empty-narrowing.json @@ -178,7 +178,7 @@ "status": 200, "headers": { "content-type": "application/json", - "x-dfo-trace-id": "b89cda3bb794448abf06b56c955d754e" + "x-dfo-trace-id": "27d2f0b694144799a0314850fb5d29bc" }, "json": { "schema_version": 1, @@ -585,7 +585,7 @@ "frame_grammar_version": "1.1.0", "origin_catalogue_build_id": "20261019T174519Z-2e5e8cfd", "served_from": "head", - "confirmed_at": "2026-10-26T09:18:06.976633+00:00" + "confirmed_at": "2026-11-01T07:37:46.482431+00:00" }, "warnings": [ { @@ -615,7 +615,7 @@ "created_at": "2026-10-23T16:58:47.734759+00:00", "tier": "working", "url": "/api/datasets/spec_cb5baa4161de718f18583060674dbca6/cv_bf242138f8d0a892c97da9373d1626f4/files/sha256:c44200969f19d73104d1bc24ebca905e59f749c2939234cdde10ba6f5a131170", - "enrichment_stamp": "08ed6c734fc69ea2204a21f4e1dd8b963f14dd1e03a2484c618049ac2e2d93d8" + "enrichment_stamp": "55887b871f7aa1c5d120cb2bee97086605351d5acfbec645ab027f562d0f65c5" }, { "artifact_digest": "sha256:d3a506bc9b95188583b5764592d2f1897c0665add660106b7f77c3e501000bb4", @@ -631,7 +631,7 @@ ], "series_count": 1, "output_options": { - "capability_version": "dset_76f5fa7244511c58", + "capability_version": "dset_5282a0674178a233", "columns": [ { "name": "stat_var", @@ -714,7 +714,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": false }, { "column": "financingProvider", @@ -726,7 +727,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": false }, { "column": "financingProvider", @@ -738,7 +740,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true }, { "column": "financingProvider", @@ -750,7 +753,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": false }, { "column": "financingProvider", @@ -762,7 +766,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true }, { "column": "financingProvider", @@ -774,7 +779,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true }, { "column": "financingProvider", @@ -786,7 +792,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true }, { "column": "financingRecipient", @@ -798,7 +805,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": false }, { "column": "financingRecipient", @@ -810,7 +818,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": false }, { "column": "financingRecipient", @@ -822,7 +831,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true }, { "column": "financingRecipient", @@ -834,7 +844,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": false }, { "column": "financingRecipient", @@ -846,7 +857,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true }, { "column": "financingRecipient", @@ -858,7 +870,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true }, { "column": "financingRecipient", @@ -870,7 +883,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true } ], "long_layout_defaults": [ @@ -899,7 +913,7 @@ ] } }, - "series_coverage_stamp": "e6e717ab8c77e84d010915893ede5809e9ecec67929a07cfafbcc2210edfa1eb", + "series_coverage_stamp": "ad27fd11738abb03d2d84dc214e223f04781609636cf678d0d08c385fb863d99", "retention": { "pinned": false, "held_until": "2026-11-19T13:59:18.051742Z" @@ -917,7 +931,7 @@ "headers": { "content-type": "text/html", "location": "https://storage.googleapis.com/dev-fin-observatory-datasets-working/sha256%3Ac44200969f19d73104d1bc24ebca905e59f749c2939234cdde10ba6f5a131170?X-Goog-Signature=redacted", - "x-dfo-trace-id": "cf3f86713afb44c98d21fbf9731d66e3" + "x-dfo-trace-id": "b00bcf5bd0ca432eac38be0de17b99ad" } } }, diff --git a/python/client-contract/src/dfo_client_contract/scenarios/fetch-spec-entity-dropped.json b/python/client-contract/src/dfo_client_contract/scenarios/fetch-spec-entity-dropped.json index 166b104..fedfc5a 100644 --- a/python/client-contract/src/dfo_client_contract/scenarios/fetch-spec-entity-dropped.json +++ b/python/client-contract/src/dfo_client_contract/scenarios/fetch-spec-entity-dropped.json @@ -5,8 +5,8 @@ "origin": { "kind": "recorded", "base_url": "https://dfo-dev-apis-zms5lj4zhq-nn.a.run.app/api", - "dfo_commit": "d80df9f5fd598b7345255470932d202ee5d49942", - "recorded_at": "2026-10-26T09:22:17Z" + "dfo_commit": "ccb6617922c839ce3cd5615a3bbb65c70bfe1bde", + "recorded_at": "2026-11-01T07:37:51Z" }, "call": [ { @@ -183,7 +183,7 @@ "status": 200, "headers": { "content-type": "application/json", - "x-dfo-trace-id": "dfa8f009e43a48bd9113306c1946b4b7" + "x-dfo-trace-id": "dd4b57a30ed543a0b6edbb8c89497082" }, "json": { "schema_version": 1, @@ -584,8 +584,8 @@ "family_member_digest": "9fd3643bbde505d9542fd3d090ddd549349765d12b6bad95b17271cbf297ea8c", "frame_grammar_version": "1.1.0", "origin_catalogue_build_id": "20261020T170016Z-691bf0da", - "served_from": "head", - "confirmed_at": "2026-10-26T09:18:11.197140+00:00" + "served_from": "materialise", + "confirmed_at": "2026-11-01T07:37:54.430708+00:00" }, "warnings": [], "diagnostics": [ @@ -609,7 +609,7 @@ "created_at": "2026-10-25T14:19:44.744913+00:00", "tier": "working", "url": "/api/datasets/spec_4c228c73be6c18efd0939eabb3b3c456/cv_1868d697e8e7d56da6a83740a940c2e5/files/sha256:e8092d8c75768ba31abe07fa60d85c1d13f7ed8b2159acb7785e0041f44e771a", - "enrichment_stamp": "08ed6c734fc69ea2204a21f4e1dd8b963f14dd1e03a2484c618049ac2e2d93d8" + "enrichment_stamp": "55887b871f7aa1c5d120cb2bee97086605351d5acfbec645ab027f562d0f65c5" }, { "artifact_digest": "sha256:ffd0e9eaabfc35d3113188c82648ce0bf809307a01a024b52b0baa133ef63d18", @@ -625,7 +625,7 @@ ], "series_count": 58, "output_options": { - "capability_version": "dset_76f5fa7244511c58", + "capability_version": "dset_5282a0674178a233", "columns": [ { "name": "stat_var", @@ -738,7 +738,8 @@ "label": "World Health Organization" } ], - "truncated": false + "truncated": false, + "in_long_layout": false }, { "column": "financingProvider", @@ -780,7 +781,8 @@ "label": "World Health Organization" } ], - "truncated": false + "truncated": false, + "in_long_layout": false }, { "column": "financingProvider", @@ -792,7 +794,8 @@ "covered": 25 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true }, { "column": "financingProvider", @@ -804,7 +807,8 @@ "covered": 25 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": false }, { "column": "financingProvider", @@ -816,7 +820,8 @@ "covered": 25 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true }, { "column": "financingProvider", @@ -828,7 +833,8 @@ "covered": 25 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true }, { "column": "financingProvider", @@ -840,7 +846,8 @@ "covered": 25 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true }, { "column": "financingRecipient", @@ -852,7 +859,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": false }, { "column": "financingRecipient", @@ -864,7 +872,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": false }, { "column": "financingRecipient", @@ -876,7 +885,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true }, { "column": "financingRecipient", @@ -888,7 +898,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": false }, { "column": "financingRecipient", @@ -900,7 +911,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true }, { "column": "financingRecipient", @@ -912,7 +924,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true }, { "column": "financingRecipient", @@ -924,7 +937,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true } ], "long_layout_defaults": [ @@ -1026,7 +1040,7 @@ ] } }, - "series_coverage_stamp": "e6e717ab8c77e84d010915893ede5809e9ecec67929a07cfafbcc2210edfa1eb", + "series_coverage_stamp": "ad27fd11738abb03d2d84dc214e223f04781609636cf678d0d08c385fb863d99", "retention": { "pinned": false, "held_until": "2026-11-20T06:50:59.874372Z" @@ -1115,7 +1129,7 @@ "status": 200, "headers": { "content-type": "application/json", - "x-dfo-trace-id": "de250b63d7d54077a2e7ced00745249b" + "x-dfo-trace-id": "2a168bcbdb3f45b1a676e1033231eebd" }, "json": { "schema_version": 1, @@ -1124,11 +1138,11 @@ "extract_skipped": true }, "diagnostics": { - "engine_build": "d80df9f5fd598b7345255470932d202ee5d49942", - "trace_id": "de250b63d7d54077a2e7ced00745249b", + "engine_build": "ccb6617922c839ce3cd5615a3bbb65c70bfe1bde", + "trace_id": "2a168bcbdb3f45b1a676e1033231eebd", "warnings": [], "timing_ms": { - "total": 2, + "total": 1749, "by_step": { "coverage": 0 } @@ -1147,9 +1161,39 @@ } ], "timing_ms": { - "total": 0, + "total": 1722, "by_step": { - "response_cache_part_memo": 0 + "validate": 4, + "phase_validate": 0, + "walk": 1211, + "reread_arcs": 1, + "phase_reread_arcs": 0, + "detect_edits": 0, + "phase_detect_edits": 0, + "resolve_survivors": 0, + "phase_resolve_survivors": 0, + "shape": 4, + "phase_build_shape": 0, + "bind": 0, + "phase_build_bindings": 0, + "where_places": 0, + "phase_where_places": 0, + "materialise": 159, + "phase_materialise": 0, + "ground_related": 10, + "ground_units": 0, + "ground_facets": 0, + "ground_convert": 0, + "answer": 23, + "ground_gates": 93, + "phase_ground_build": 197, + "finalize_preview": 0, + "options": 16, + "finalize_related": 0, + "finalize_wholes": 0, + "finalize_relaunch": 0, + "phase_finalize": 0, + "served_entry": 4 } }, "entity_refs": [], @@ -1564,7 +1608,7 @@ "label": "OECD Terms and Conditions" } }, - "coverage_stamp": "e6e717ab8c77e84d010915893ede5809e9ecec67929a07cfafbcc2210edfa1eb", + "coverage_stamp": "ad27fd11738abb03d2d84dc214e223f04781609636cf678d0d08c385fb863d99", "facets": { "provenance": { "basis": "fallback", @@ -1622,7 +1666,7 @@ }, "relation": "child", "parent": "CRSCooperationModalityB", - "member_count": 1606, + "member_count": 1614, "served_rows": 22, "served_rows_exact": true }, @@ -1636,7 +1680,7 @@ }, "relation": "child", "parent": "CRSCooperationModalityB", - "member_count": 1331, + "member_count": 1337, "served_rows": 33, "served_rows_exact": true }, @@ -1677,7 +1721,7 @@ }, "relation": "child", "parent": "CRSCooperationModalityC", - "member_count": 7005, + "member_count": 7041, "served_rows": 172, "served_rows_exact": true }, @@ -1718,7 +1762,7 @@ }, "relation": "child", "parent": "CRSCooperationModalityD", - "member_count": 976, + "member_count": 980, "served_rows": 2, "served_rows_exact": true }, @@ -1814,7 +1858,7 @@ }, "relation": "child", "parent": "CRSTypeOfFinance100", - "member_count": 12672, + "member_count": 12745, "served_rows": 286, "served_rows_exact": true }, @@ -1868,7 +1912,7 @@ "value_kind": "enum_value" }, "relation": "root", - "member_count": 14098, + "member_count": 14146, "served_rows": 309, "served_rows_exact": true }, @@ -1881,7 +1925,7 @@ "value_kind": "enum_value" }, "relation": "root", - "member_count": 3798, + "member_count": 3800, "served_rows": 12, "served_rows_exact": true }, @@ -1894,8 +1938,8 @@ "value_kind": "enum_value" }, "relation": "root", - "member_count": 2711, - "served_rows": 42, + "member_count": 2749, + "served_rows": 44, "served_rows_exact": true } ], @@ -2293,7 +2337,7 @@ } ], "query_qualifiers": [], - "capability_version": "cap_765c9d2a0c7529b9" + "capability_version": "cap_4913302d7a6b6435" }, "confidence": "high", "available_at_place": true, @@ -2544,6 +2588,8 @@ } } ], + "concept_label": "basic health care", + "published_tables": "OECD Creditor Reporting System (CRS)", "open_axis_facts": [ { "property": "crsTypeOfFinance", @@ -2636,7 +2682,8 @@ { "role": "origin", "member_count": 25, - "members_available": true + "members_available": true, + "holds_multilaterals": true } ], "unit_conversion": { @@ -4862,7 +4909,7 @@ "headers": { "content-type": "text/html", "location": "https://storage.googleapis.com/dev-fin-observatory-datasets-working/sha256%3Ae8092d8c75768ba31abe07fa60d85c1d13f7ed8b2159acb7785e0041f44e771a?X-Goog-Signature=redacted", - "x-dfo-trace-id": "3971fe2094964eb69642432194306145" + "x-dfo-trace-id": "808c502dcd2d44fe9b0d5623227e2176" } } }, diff --git a/python/client-contract/src/dfo_client_contract/scenarios/fetch-spec-entity-rebound.json b/python/client-contract/src/dfo_client_contract/scenarios/fetch-spec-entity-rebound.json index d246838..36547c5 100644 --- a/python/client-contract/src/dfo_client_contract/scenarios/fetch-spec-entity-rebound.json +++ b/python/client-contract/src/dfo_client_contract/scenarios/fetch-spec-entity-rebound.json @@ -5,8 +5,8 @@ "origin": { "kind": "recorded", "base_url": "https://dfo-dev-apis-zms5lj4zhq-nn.a.run.app/api", - "dfo_commit": "d80df9f5fd598b7345255470932d202ee5d49942", - "recorded_at": "2026-10-26T09:22:15Z" + "dfo_commit": "ccb6617922c839ce3cd5615a3bbb65c70bfe1bde", + "recorded_at": "2026-11-01T07:37:48Z" }, "call": [ { @@ -188,7 +188,7 @@ "status": 200, "headers": { "content-type": "application/json", - "x-dfo-trace-id": "042e6c2ebb034091b3fbbfcef0565c48" + "x-dfo-trace-id": "d23c21c459fe4f3699d0ab77c9449cab" }, "json": { "schema_version": 1, @@ -592,8 +592,8 @@ "family_member_digest": "9fd3643bbde505d9542fd3d090ddd549349765d12b6bad95b17271cbf297ea8c", "frame_grammar_version": "1.1.0", "origin_catalogue_build_id": "20261020T170016Z-691bf0da", - "served_from": "head", - "confirmed_at": "2026-10-26T09:18:08.892616+00:00" + "served_from": "materialise", + "confirmed_at": "2026-11-01T07:37:49.774440+00:00" }, "warnings": [], "diagnostics": [ @@ -617,7 +617,7 @@ "created_at": "2026-10-23T16:58:51.358637+00:00", "tier": "working", "url": "/api/datasets/spec_1ee5f6648c9e46ddcc806fa0034bb6a8/cv_7947f7ed828c0b23b8df4c601d463c09/files/sha256:13a775f3b4811a104717ac226f173d614d685e533def09482b83c55e06505c4c", - "enrichment_stamp": "08ed6c734fc69ea2204a21f4e1dd8b963f14dd1e03a2484c618049ac2e2d93d8" + "enrichment_stamp": "55887b871f7aa1c5d120cb2bee97086605351d5acfbec645ab027f562d0f65c5" }, { "artifact_digest": "sha256:36616ef68df33904cc9dfa37fb145d8fd1563b1b3701710dcd8d9e04ed50d79a", @@ -633,7 +633,7 @@ ], "series_count": 2, "output_options": { - "capability_version": "dset_76f5fa7244511c58", + "capability_version": "dset_5282a0674178a233", "columns": [ { "name": "stat_var", @@ -716,7 +716,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": false }, { "column": "financingProvider", @@ -728,7 +729,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": false }, { "column": "financingProvider", @@ -740,7 +742,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true }, { "column": "financingProvider", @@ -752,7 +755,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": false }, { "column": "financingProvider", @@ -764,7 +768,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true }, { "column": "financingProvider", @@ -776,7 +781,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true }, { "column": "financingProvider", @@ -788,7 +794,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true }, { "column": "financingRecipient", @@ -800,7 +807,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": false }, { "column": "financingRecipient", @@ -812,7 +820,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": false }, { "column": "financingRecipient", @@ -824,7 +833,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true }, { "column": "financingRecipient", @@ -836,7 +846,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": false }, { "column": "financingRecipient", @@ -848,7 +859,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true }, { "column": "financingRecipient", @@ -860,7 +872,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true }, { "column": "financingRecipient", @@ -872,7 +885,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true } ], "long_layout_defaults": [ @@ -916,7 +930,7 @@ ] } }, - "series_coverage_stamp": "e6e717ab8c77e84d010915893ede5809e9ecec67929a07cfafbcc2210edfa1eb", + "series_coverage_stamp": "ad27fd11738abb03d2d84dc214e223f04781609636cf678d0d08c385fb863d99", "retention": { "pinned": false, "held_until": "2026-11-20T06:50:59.083841Z" @@ -1008,7 +1022,7 @@ "status": 200, "headers": { "content-type": "application/json", - "x-dfo-trace-id": "155a086b6b2b46fe899457496517c746" + "x-dfo-trace-id": "2d5e5b17961c417cb04050b1b0608097" }, "json": { "schema_version": 1, @@ -1017,11 +1031,11 @@ "extract_skipped": true }, "diagnostics": { - "engine_build": "d80df9f5fd598b7345255470932d202ee5d49942", - "trace_id": "155a086b6b2b46fe899457496517c746", + "engine_build": "ccb6617922c839ce3cd5615a3bbb65c70bfe1bde", + "trace_id": "2d5e5b17961c417cb04050b1b0608097", "warnings": [], "timing_ms": { - "total": 3, + "total": 768, "by_step": { "coverage": 0 } @@ -1034,9 +1048,39 @@ "variable_text": "dataset", "warnings": [], "timing_ms": { - "total": 1, + "total": 758, "by_step": { - "response_cache_part_memo": 1 + "validate": 4, + "phase_validate": 0, + "walk": 285, + "reread_arcs": 4, + "phase_reread_arcs": 0, + "detect_edits": 0, + "phase_detect_edits": 0, + "resolve_survivors": 0, + "phase_resolve_survivors": 0, + "shape": 3, + "phase_build_shape": 0, + "bind": 1, + "phase_build_bindings": 0, + "where_places": 94, + "phase_where_places": 0, + "materialise": 15, + "phase_materialise": 0, + "ground_related": 9, + "ground_units": 0, + "ground_facets": 0, + "ground_convert": 0, + "answer": 239, + "ground_gates": 3, + "phase_ground_build": 94, + "finalize_preview": 0, + "options": 2, + "finalize_related": 0, + "finalize_wholes": 0, + "finalize_relaunch": 0, + "phase_finalize": 0, + "served_entry": 5 } }, "entity_refs": [], @@ -1450,7 +1494,7 @@ "label": "OECD Terms and Conditions" } }, - "coverage_stamp": "e6e717ab8c77e84d010915893ede5809e9ecec67929a07cfafbcc2210edfa1eb", + "coverage_stamp": "ad27fd11738abb03d2d84dc214e223f04781609636cf678d0d08c385fb863d99", "facets": { "provenance": { "basis": "fallback", @@ -1508,7 +1552,7 @@ }, "relation": "child", "parent": "CRSCooperationModalityC", - "member_count": 7005, + "member_count": 7041, "served_rows": 1, "served_rows_exact": true }, @@ -1535,7 +1579,7 @@ }, "relation": "child", "parent": "CRSCooperationModalityD", - "member_count": 976, + "member_count": 980, "served_rows": 1, "served_rows_exact": true } @@ -1604,7 +1648,7 @@ }, "relation": "child", "parent": "CRSTypeOfFinance100", - "member_count": 12672, + "member_count": 12745, "served_rows": 2, "served_rows_exact": true } @@ -1631,7 +1675,7 @@ "value_kind": "enum_value" }, "relation": "root", - "member_count": 14098, + "member_count": 14146, "served_rows": 2, "served_rows_exact": true }, @@ -1644,7 +1688,7 @@ "value_kind": "enum_value" }, "relation": "root", - "member_count": 3798, + "member_count": 3800, "served_rows": 1, "served_rows_exact": true } @@ -2050,7 +2094,7 @@ } ], "query_qualifiers": [], - "capability_version": "cap_765c9d2a0c7529b9" + "capability_version": "cap_4913302d7a6b6435" }, "confidence": "high", "available_at_place": true, @@ -2307,6 +2351,8 @@ } } ], + "concept_label": "basic health care", + "published_tables": "OECD Creditor Reporting System (CRS)", "open_axis_facts": [ { "property": "crsCooperationModality", @@ -4550,7 +4596,7 @@ "headers": { "content-type": "text/html", "location": "https://storage.googleapis.com/dev-fin-observatory-datasets-working/sha256%3A13a775f3b4811a104717ac226f173d614d685e533def09482b83c55e06505c4c?X-Goog-Signature=redacted", - "x-dfo-trace-id": "1300eead85a84452b36be91c751c6206" + "x-dfo-trace-id": "501ec892e8e240459ad2c4f71dc3f3ce" } } }, diff --git a/python/client-contract/src/dfo_client_contract/scenarios/fetch-spec-files-route-no-content.json b/python/client-contract/src/dfo_client_contract/scenarios/fetch-spec-files-route-no-content.json index e364bed..46021fe 100644 --- a/python/client-contract/src/dfo_client_contract/scenarios/fetch-spec-files-route-no-content.json +++ b/python/client-contract/src/dfo_client_contract/scenarios/fetch-spec-files-route-no-content.json @@ -176,7 +176,7 @@ "status": 200, "headers": { "content-type": "application/json", - "x-dfo-trace-id": "b89cda3bb794448abf06b56c955d754e" + "x-dfo-trace-id": "27d2f0b694144799a0314850fb5d29bc" }, "json": { "schema_version": 1, @@ -583,7 +583,7 @@ "frame_grammar_version": "1.1.0", "origin_catalogue_build_id": "20261019T174519Z-2e5e8cfd", "served_from": "head", - "confirmed_at": "2026-10-26T09:18:06.976633+00:00" + "confirmed_at": "2026-11-01T07:37:46.482431+00:00" }, "warnings": [ { @@ -613,7 +613,7 @@ "created_at": "2026-10-23T16:58:47.734759+00:00", "tier": "working", "url": "/api/datasets/spec_cb5baa4161de718f18583060674dbca6/cv_bf242138f8d0a892c97da9373d1626f4/files/sha256:c44200969f19d73104d1bc24ebca905e59f749c2939234cdde10ba6f5a131170", - "enrichment_stamp": "08ed6c734fc69ea2204a21f4e1dd8b963f14dd1e03a2484c618049ac2e2d93d8" + "enrichment_stamp": "55887b871f7aa1c5d120cb2bee97086605351d5acfbec645ab027f562d0f65c5" }, { "artifact_digest": "sha256:d3a506bc9b95188583b5764592d2f1897c0665add660106b7f77c3e501000bb4", @@ -629,7 +629,7 @@ ], "series_count": 1, "output_options": { - "capability_version": "dset_76f5fa7244511c58", + "capability_version": "dset_5282a0674178a233", "columns": [ { "name": "stat_var", @@ -712,7 +712,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": false }, { "column": "financingProvider", @@ -724,7 +725,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": false }, { "column": "financingProvider", @@ -736,7 +738,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true }, { "column": "financingProvider", @@ -748,7 +751,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": false }, { "column": "financingProvider", @@ -760,7 +764,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true }, { "column": "financingProvider", @@ -772,7 +777,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true }, { "column": "financingProvider", @@ -784,7 +790,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true }, { "column": "financingRecipient", @@ -796,7 +803,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": false }, { "column": "financingRecipient", @@ -808,7 +816,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": false }, { "column": "financingRecipient", @@ -820,7 +829,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true }, { "column": "financingRecipient", @@ -832,7 +842,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": false }, { "column": "financingRecipient", @@ -844,7 +855,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true }, { "column": "financingRecipient", @@ -856,7 +868,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true }, { "column": "financingRecipient", @@ -868,7 +881,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true } ], "long_layout_defaults": [ @@ -897,7 +911,7 @@ ] } }, - "series_coverage_stamp": "e6e717ab8c77e84d010915893ede5809e9ecec67929a07cfafbcc2210edfa1eb", + "series_coverage_stamp": "ad27fd11738abb03d2d84dc214e223f04781609636cf678d0d08c385fb863d99", "retention": { "pinned": false, "held_until": "2026-11-19T13:59:18.051742Z" @@ -913,7 +927,7 @@ "response": { "status": 204, "headers": { - "x-dfo-trace-id": "cf3f86713afb44c98d21fbf9731d66e3" + "x-dfo-trace-id": "b00bcf5bd0ca432eac38be0de17b99ad" } } } @@ -923,7 +937,7 @@ "error": { "class": "ContractError", "code": "unexpected_response", - "trace_id": "cf3f86713afb44c98d21fbf9731d66e3" + "trace_id": "b00bcf5bd0ca432eac38be0de17b99ad" } } ] diff --git a/python/client-contract/src/dfo_client_contract/scenarios/fetch-spec-files-route-serves-file.json b/python/client-contract/src/dfo_client_contract/scenarios/fetch-spec-files-route-serves-file.json index dc2c862..b8c9189 100644 --- a/python/client-contract/src/dfo_client_contract/scenarios/fetch-spec-files-route-serves-file.json +++ b/python/client-contract/src/dfo_client_contract/scenarios/fetch-spec-files-route-serves-file.json @@ -176,7 +176,7 @@ "status": 200, "headers": { "content-type": "application/json", - "x-dfo-trace-id": "b89cda3bb794448abf06b56c955d754e" + "x-dfo-trace-id": "27d2f0b694144799a0314850fb5d29bc" }, "json": { "schema_version": 1, @@ -583,7 +583,7 @@ "frame_grammar_version": "1.1.0", "origin_catalogue_build_id": "20261019T174519Z-2e5e8cfd", "served_from": "head", - "confirmed_at": "2026-10-26T09:18:06.976633+00:00" + "confirmed_at": "2026-11-01T07:37:46.482431+00:00" }, "warnings": [ { @@ -613,7 +613,7 @@ "created_at": "2026-10-23T16:58:47.734759+00:00", "tier": "working", "url": "/api/datasets/spec_cb5baa4161de718f18583060674dbca6/cv_bf242138f8d0a892c97da9373d1626f4/files/sha256:c44200969f19d73104d1bc24ebca905e59f749c2939234cdde10ba6f5a131170", - "enrichment_stamp": "08ed6c734fc69ea2204a21f4e1dd8b963f14dd1e03a2484c618049ac2e2d93d8" + "enrichment_stamp": "55887b871f7aa1c5d120cb2bee97086605351d5acfbec645ab027f562d0f65c5" }, { "artifact_digest": "sha256:d3a506bc9b95188583b5764592d2f1897c0665add660106b7f77c3e501000bb4", @@ -629,7 +629,7 @@ ], "series_count": 1, "output_options": { - "capability_version": "dset_76f5fa7244511c58", + "capability_version": "dset_5282a0674178a233", "columns": [ { "name": "stat_var", @@ -712,7 +712,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": false }, { "column": "financingProvider", @@ -724,7 +725,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": false }, { "column": "financingProvider", @@ -736,7 +738,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true }, { "column": "financingProvider", @@ -748,7 +751,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": false }, { "column": "financingProvider", @@ -760,7 +764,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true }, { "column": "financingProvider", @@ -772,7 +777,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true }, { "column": "financingProvider", @@ -784,7 +790,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true }, { "column": "financingRecipient", @@ -796,7 +803,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": false }, { "column": "financingRecipient", @@ -808,7 +816,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": false }, { "column": "financingRecipient", @@ -820,7 +829,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true }, { "column": "financingRecipient", @@ -832,7 +842,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": false }, { "column": "financingRecipient", @@ -844,7 +855,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true }, { "column": "financingRecipient", @@ -856,7 +868,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true }, { "column": "financingRecipient", @@ -868,7 +881,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true } ], "long_layout_defaults": [ @@ -897,7 +911,7 @@ ] } }, - "series_coverage_stamp": "e6e717ab8c77e84d010915893ede5809e9ecec67929a07cfafbcc2210edfa1eb", + "series_coverage_stamp": "ad27fd11738abb03d2d84dc214e223f04781609636cf678d0d08c385fb863d99", "retention": { "pinned": false, "held_until": "2026-11-19T13:59:18.051742Z" @@ -914,7 +928,7 @@ "status": 200, "headers": { "content-type": "application/vnd.apache.parquet", - "x-dfo-trace-id": "cf3f86713afb44c98d21fbf9731d66e3" + "x-dfo-trace-id": "b00bcf5bd0ca432eac38be0de17b99ad" }, "body_file": "fetch-spec-known-sentence.parquet" } diff --git a/python/client-contract/src/dfo_client_contract/scenarios/fetch-spec-files-route-temporary-redirect.json b/python/client-contract/src/dfo_client_contract/scenarios/fetch-spec-files-route-temporary-redirect.json index 32dc6ef..335dcd4 100644 --- a/python/client-contract/src/dfo_client_contract/scenarios/fetch-spec-files-route-temporary-redirect.json +++ b/python/client-contract/src/dfo_client_contract/scenarios/fetch-spec-files-route-temporary-redirect.json @@ -176,7 +176,7 @@ "status": 200, "headers": { "content-type": "application/json", - "x-dfo-trace-id": "b89cda3bb794448abf06b56c955d754e" + "x-dfo-trace-id": "27d2f0b694144799a0314850fb5d29bc" }, "json": { "schema_version": 1, @@ -583,7 +583,7 @@ "frame_grammar_version": "1.1.0", "origin_catalogue_build_id": "20261019T174519Z-2e5e8cfd", "served_from": "head", - "confirmed_at": "2026-10-26T09:18:06.976633+00:00" + "confirmed_at": "2026-11-01T07:37:46.482431+00:00" }, "warnings": [ { @@ -613,7 +613,7 @@ "created_at": "2026-10-23T16:58:47.734759+00:00", "tier": "working", "url": "/api/datasets/spec_cb5baa4161de718f18583060674dbca6/cv_bf242138f8d0a892c97da9373d1626f4/files/sha256:c44200969f19d73104d1bc24ebca905e59f749c2939234cdde10ba6f5a131170", - "enrichment_stamp": "08ed6c734fc69ea2204a21f4e1dd8b963f14dd1e03a2484c618049ac2e2d93d8" + "enrichment_stamp": "55887b871f7aa1c5d120cb2bee97086605351d5acfbec645ab027f562d0f65c5" }, { "artifact_digest": "sha256:d3a506bc9b95188583b5764592d2f1897c0665add660106b7f77c3e501000bb4", @@ -629,7 +629,7 @@ ], "series_count": 1, "output_options": { - "capability_version": "dset_76f5fa7244511c58", + "capability_version": "dset_5282a0674178a233", "columns": [ { "name": "stat_var", @@ -712,7 +712,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": false }, { "column": "financingProvider", @@ -724,7 +725,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": false }, { "column": "financingProvider", @@ -736,7 +738,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true }, { "column": "financingProvider", @@ -748,7 +751,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": false }, { "column": "financingProvider", @@ -760,7 +764,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true }, { "column": "financingProvider", @@ -772,7 +777,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true }, { "column": "financingProvider", @@ -784,7 +790,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true }, { "column": "financingRecipient", @@ -796,7 +803,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": false }, { "column": "financingRecipient", @@ -808,7 +816,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": false }, { "column": "financingRecipient", @@ -820,7 +829,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true }, { "column": "financingRecipient", @@ -832,7 +842,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": false }, { "column": "financingRecipient", @@ -844,7 +855,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true }, { "column": "financingRecipient", @@ -856,7 +868,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true }, { "column": "financingRecipient", @@ -868,7 +881,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true } ], "long_layout_defaults": [ @@ -897,7 +911,7 @@ ] } }, - "series_coverage_stamp": "e6e717ab8c77e84d010915893ede5809e9ecec67929a07cfafbcc2210edfa1eb", + "series_coverage_stamp": "ad27fd11738abb03d2d84dc214e223f04781609636cf678d0d08c385fb863d99", "retention": { "pinned": false, "held_until": "2026-11-19T13:59:18.051742Z" @@ -914,7 +928,7 @@ "status": 307, "headers": { "location": "https://storage.googleapis.com/dev-fin-observatory-datasets-working/sha256%3Ac44200969f19d73104d1bc24ebca905e59f749c2939234cdde10ba6f5a131170?X-Goog-Signature=redacted", - "x-dfo-trace-id": "cf3f86713afb44c98d21fbf9731d66e3" + "x-dfo-trace-id": "b00bcf5bd0ca432eac38be0de17b99ad" } } } @@ -924,7 +938,7 @@ "error": { "class": "ContractError", "code": "unexpected_response", - "trace_id": "cf3f86713afb44c98d21fbf9731d66e3" + "trace_id": "b00bcf5bd0ca432eac38be0de17b99ad" } } ] diff --git a/python/client-contract/src/dfo_client_contract/scenarios/fetch-spec-foreign-artifact-url.json b/python/client-contract/src/dfo_client_contract/scenarios/fetch-spec-foreign-artifact-url.json index 1424844..5e8ee13 100644 --- a/python/client-contract/src/dfo_client_contract/scenarios/fetch-spec-foreign-artifact-url.json +++ b/python/client-contract/src/dfo_client_contract/scenarios/fetch-spec-foreign-artifact-url.json @@ -176,7 +176,7 @@ "status": 200, "headers": { "content-type": "application/json", - "x-dfo-trace-id": "b89cda3bb794448abf06b56c955d754e" + "x-dfo-trace-id": "27d2f0b694144799a0314850fb5d29bc" }, "json": { "schema_version": 1, @@ -583,7 +583,7 @@ "frame_grammar_version": "1.1.0", "origin_catalogue_build_id": "20261019T174519Z-2e5e8cfd", "served_from": "head", - "confirmed_at": "2026-10-26T09:18:06.976633+00:00" + "confirmed_at": "2026-11-01T07:37:46.482431+00:00" }, "warnings": [ { @@ -613,7 +613,7 @@ "created_at": "2026-10-23T16:58:47.734759+00:00", "tier": "working", "url": "https://downloads.example.com/api/datasets/spec_cb5baa4161de718f18583060674dbca6/cv_bf242138f8d0a892c97da9373d1626f4/files/sha256:c44200969f19d73104d1bc24ebca905e59f749c2939234cdde10ba6f5a131170", - "enrichment_stamp": "08ed6c734fc69ea2204a21f4e1dd8b963f14dd1e03a2484c618049ac2e2d93d8" + "enrichment_stamp": "55887b871f7aa1c5d120cb2bee97086605351d5acfbec645ab027f562d0f65c5" }, { "artifact_digest": "sha256:d3a506bc9b95188583b5764592d2f1897c0665add660106b7f77c3e501000bb4", @@ -629,7 +629,7 @@ ], "series_count": 1, "output_options": { - "capability_version": "dset_76f5fa7244511c58", + "capability_version": "dset_5282a0674178a233", "columns": [ { "name": "stat_var", @@ -712,7 +712,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": false }, { "column": "financingProvider", @@ -724,7 +725,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": false }, { "column": "financingProvider", @@ -736,7 +738,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true }, { "column": "financingProvider", @@ -748,7 +751,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": false }, { "column": "financingProvider", @@ -760,7 +764,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true }, { "column": "financingProvider", @@ -772,7 +777,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true }, { "column": "financingProvider", @@ -784,7 +790,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true }, { "column": "financingRecipient", @@ -796,7 +803,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": false }, { "column": "financingRecipient", @@ -808,7 +816,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": false }, { "column": "financingRecipient", @@ -820,7 +829,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true }, { "column": "financingRecipient", @@ -832,7 +842,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": false }, { "column": "financingRecipient", @@ -844,7 +855,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true }, { "column": "financingRecipient", @@ -856,7 +868,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true }, { "column": "financingRecipient", @@ -868,7 +881,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true } ], "long_layout_defaults": [ @@ -897,7 +911,7 @@ ] } }, - "series_coverage_stamp": "e6e717ab8c77e84d010915893ede5809e9ecec67929a07cfafbcc2210edfa1eb", + "series_coverage_stamp": "ad27fd11738abb03d2d84dc214e223f04781609636cf678d0d08c385fb863d99", "retention": { "pinned": false, "held_until": "2026-11-19T13:59:18.051742Z" @@ -911,7 +925,7 @@ "error": { "class": "ContractError", "code": "contract_violation", - "trace_id": "b89cda3bb794448abf06b56c955d754e" + "trace_id": "27d2f0b694144799a0314850fb5d29bc" } } ] diff --git a/python/client-contract/src/dfo_client_contract/scenarios/fetch-spec-frame-layout.json b/python/client-contract/src/dfo_client_contract/scenarios/fetch-spec-frame-layout.json index bd68531..97c156d 100644 --- a/python/client-contract/src/dfo_client_contract/scenarios/fetch-spec-frame-layout.json +++ b/python/client-contract/src/dfo_client_contract/scenarios/fetch-spec-frame-layout.json @@ -5,8 +5,8 @@ "origin": { "kind": "recorded", "base_url": "https://dfo-dev-apis-zms5lj4zhq-nn.a.run.app/api", - "dfo_commit": "d80df9f5fd598b7345255470932d202ee5d49942", - "recorded_at": "2026-10-26T09:23:08Z" + "dfo_commit": "ccb6617922c839ce3cd5615a3bbb65c70bfe1bde", + "recorded_at": "2026-11-01T07:39:01Z" }, "call": [ { @@ -175,7 +175,7 @@ "status": 200, "headers": { "content-type": "application/json", - "x-dfo-trace-id": "b236e3739a984c4da5c2a1ba3fe66cc9" + "x-dfo-trace-id": "76f9a9493d564afc8eb69e29a8f25e3d" }, "json": { "schema_version": 1, @@ -576,7 +576,7 @@ "frame_grammar_version": "1.1.0", "origin_catalogue_build_id": "20261011T194155Z-80081f08", "served_from": "head", - "confirmed_at": "2026-10-26T09:17:22.037029+00:00" + "confirmed_at": "2026-11-01T07:35:51.549820+00:00" }, "warnings": [ { @@ -621,7 +621,7 @@ ], "series_count": 5, "output_options": { - "capability_version": "dset_76f5fa7244511c58", + "capability_version": "dset_5282a0674178a233", "columns": [ { "name": "stat_var", @@ -704,7 +704,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": false }, { "column": "financingProvider", @@ -716,7 +717,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": false }, { "column": "financingProvider", @@ -728,7 +730,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true }, { "column": "financingProvider", @@ -740,7 +743,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": false }, { "column": "financingProvider", @@ -752,7 +756,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true }, { "column": "financingProvider", @@ -764,7 +769,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true }, { "column": "financingProvider", @@ -776,7 +782,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true }, { "column": "financingRecipient", @@ -788,7 +795,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": false }, { "column": "financingRecipient", @@ -800,7 +808,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": false }, { "column": "financingRecipient", @@ -812,7 +821,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true }, { "column": "financingRecipient", @@ -824,7 +834,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": false }, { "column": "financingRecipient", @@ -836,7 +847,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true }, { "column": "financingRecipient", @@ -848,7 +860,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true }, { "column": "financingRecipient", @@ -860,7 +873,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true } ], "long_layout_defaults": [ @@ -904,7 +918,7 @@ ] } }, - "series_coverage_stamp": "e6e717ab8c77e84d010915893ede5809e9ecec67929a07cfafbcc2210edfa1eb", + "series_coverage_stamp": "ad27fd11738abb03d2d84dc214e223f04781609636cf678d0d08c385fb863d99", "retention": { "pinned": true } @@ -921,7 +935,7 @@ "headers": { "content-type": "text/html", "location": "https://storage.googleapis.com/dev-fin-observatory-datasets-working/sha256%3Af4026e80af4b8683d3bb86645ab3aca83dff75cd03fdd4c73ec54ba638922104?X-Goog-Signature=redacted", - "x-dfo-trace-id": "5abca8a9651b4bca8e2d422e6b8c02a1" + "x-dfo-trace-id": "665a3fc766034e93ac587fde664c41ae" } } }, diff --git a/python/client-contract/src/dfo_client_contract/scenarios/fetch-spec-group-narrowed.json b/python/client-contract/src/dfo_client_contract/scenarios/fetch-spec-group-narrowed.json index 136dde5..1a635f1 100644 --- a/python/client-contract/src/dfo_client_contract/scenarios/fetch-spec-group-narrowed.json +++ b/python/client-contract/src/dfo_client_contract/scenarios/fetch-spec-group-narrowed.json @@ -5,17 +5,17 @@ "origin": { "kind": "recorded", "base_url": "https://dfo-dev-apis-zms5lj4zhq-nn.a.run.app/api", - "dfo_commit": "d80df9f5fd598b7345255470932d202ee5d49942", - "recorded_at": "2026-10-26T09:22:26Z" + "dfo_commit": "ccb6617922c839ce3cd5615a3bbb65c70bfe1bde", + "recorded_at": "2026-11-01T07:38:17Z" }, "call": [ { "op": "fetch", "spec": { - "spec_id": "spec_17a33486ccfd93f1a75c2070bab68b8c", + "spec_id": "spec_fc5ce33e120fc3dcba5e02f0655a4258", "definition": { "schema_version": 1, - "spec_id": "spec_17a33486ccfd93f1a75c2070bab68b8c", + "spec_id": "spec_fc5ce33e120fc3dcba5e02f0655a4258", "identity": { "identity_version": "spec1", "shape": { @@ -50,7 +50,7 @@ "property": "nettingBasis", "binding": { "state": "value", - "ref": "Gross" + "ref": "Net" } } ], @@ -110,7 +110,7 @@ } } }, - "sentence": "Germany's gross disbursements to the 44 Least Developed Countries for official development assistance, 1960 to 2024. Current US dollars · OECD DAC2a.", + "sentence": "Germany's net disbursements to the 44 Least Developed Countries for official development assistance, 1960 to 2024. Current US dollars · OECD DAC2a.", "entity_groups": { "destination": { "label": "Least Developed Countries", @@ -133,10 +133,10 @@ "schema_version": 1, "input": { "kind": "spec_id", - "spec_id": "spec_17a33486ccfd93f1a75c2070bab68b8c", + "spec_id": "spec_fc5ce33e120fc3dcba5e02f0655a4258", "definition": { "schema_version": 1, - "spec_id": "spec_17a33486ccfd93f1a75c2070bab68b8c", + "spec_id": "spec_fc5ce33e120fc3dcba5e02f0655a4258", "identity": { "identity_version": "spec1", "shape": { @@ -171,7 +171,7 @@ "property": "nettingBasis", "binding": { "state": "value", - "ref": "Gross" + "ref": "Net" } } ], @@ -250,54 +250,15 @@ "status": 200, "headers": { "content-type": "application/json", - "x-dfo-trace-id": "c658ba6641be4c4183f82bbab7cabc5a" + "x-dfo-trace-id": "bc403dba367b4c5bae1a90d36cee6d6b" }, "json": { "schema_version": 1, "definition": { "schema_version": 1, - "spec_id": "spec_f04936b8378cde70bc6289ac1e45ee9b", + "spec_id": "spec_53102a787c202df65dcbb4d112c7bf33", "identity": { - "shape": { - "kind": "statvar_schema", - "stat_type": "measuredValue", - "population_type": "FinancialFlow", - "measured_property": "amount", - "measurement_qualifier": "Nominal" - }, - "slots": [ - { - "binding": { - "ref": "DAC2aAidType206", - "state": "value" - }, - "property": "dac2aAidType" - }, - { - "binding": { - "state": "unbound" - }, - "property": "dacTypeOfFinance" - }, - { - "binding": { - "ref": "Disbursement", - "state": "value" - }, - "property": "financialFlowType" - }, - { - "binding": { - "ref": "Gross", - "state": "value" - }, - "property": "nettingBasis" - } - ], "entities": { - "origin": [ - "country/DEU" - ], "destination": [ "country/AFG", "country/AGO", @@ -343,18 +304,57 @@ "country/UGA", "country/YEM", "country/ZMB" + ], + "origin": [ + "country/DEU" ] }, "identity_version": "spec1", "requested_window": { - "kind": "range", "end_year": 2023, + "kind": "range", "start_year": 2020 - } + }, + "shape": { + "kind": "statvar_schema", + "measured_property": "amount", + "measurement_qualifier": "Nominal", + "population_type": "FinancialFlow", + "stat_type": "measuredValue" + }, + "slots": [ + { + "binding": { + "ref": "DAC2aAidType206", + "state": "value" + }, + "property": "dac2aAidType" + }, + { + "binding": { + "state": "unbound" + }, + "property": "dacTypeOfFinance" + }, + { + "binding": { + "ref": "Disbursement", + "state": "value" + }, + "property": "financialFlowType" + }, + { + "binding": { + "ref": "Net", + "state": "value" + }, + "property": "nettingBasis" + } + ] } }, - "content_version": "cv_daec84e443d4e1b37291242d90fc8fa8", - "prepared_at": "2026-10-21T07:08:48Z", + "content_version": "cv_c836c8b3ecbb63dde4177d8c5e23c9e3", + "prepared_at": "2026-11-01T07:38:21Z", "coverage": { "rows": 170, "dimensions": [ @@ -383,9 +383,9 @@ ], "window": { "kind": "range", - "origin": "query", + "start_year": 2020, "end_year": 2023, - "start_year": 2020 + "origin": "query" } }, "citation": { @@ -412,8 +412,8 @@ "source_data_url": "https://webfs-dcd.oecd.org/files/dotStat/DSD_DAC2/Table2a_Data.zip", "attribution": "OECD (2026), OECD DAC2A, OECD Data Explorer, https://webfs-dcd.oecd.org/files/dotStat/DSD_DAC2/Table2a_Data.zip (accessed on 2026-10-12)", "update_cadence": "Quarterly", - "last_update": "2026-10-15", - "years_covered": "1960-2024", + "last_update": "2026-10-29", + "years_covered": "1960-2025", "granularity": "Annual, by provider and recipient", "currencies": [ "USD" @@ -424,8 +424,8 @@ "description": "The OECD publishes DAC2A in April, June, September and December. The complete table is downloaded from the OECD each time it is republished, and replaces the previous copy, so the data reflects the OECD's latest release." }, { - "transformation": "Exclude the partial preliminary year", - "description": "Before each full release, the OECD publishes preliminary data for the year that release covers, as reporters submit it. Until then, that year is partial, so the pipeline excludes it. Support for partial years is in development. Partial years will be marked incomplete, so they don't lead to incorrect or confusing analyses." + "transformation": "Mark the partial year", + "description": "The OECD publishes data for a year as donors report it, and its final release in December of the following year covers every donor. Until then, the year is partial. The pipeline publishes it, and the import's provenance names it in `partialObservationDate`." }, { "transformation": "Standardise providers and recipients", @@ -445,13 +445,23 @@ } ], "version_history": [ + { + "date": "2026-10-29", + "title": "Partial year published, marked as partial", + "changes": [ + { + "kind": "changed", + "note": "The partial year, which only some donors have reported ahead of the OECD's final release in December, is included, and the import's provenance marks it with `partialObservationDate`." + } + ] + }, { "date": "2026-10-15", - "title": "Partial preliminary year excluded", + "title": "Partial year excluded", "changes": [ { "kind": "changed", - "note": "The partial preliminary year published ahead of the next full release is excluded." + "note": "The partial year, which only some donors have reported ahead of the OECD's final release in December, is excluded." } ] }, @@ -471,59 +481,28 @@ ] }, "trace": { - "facets": [ - { - "ref": "provenance/OECDDAC2A", - "axis": "provenance", - "basis": "deployment_fallback", - "default_policy": "dfo/facet-policy/most-observations", - "selection_reason": "sole_candidate", - "dispatch_facet_id": "1962969911839422253", - "default_policy_version": "1" - }, - { - "ref": null, - "axis": "measurementMethod", - "basis": "deployment_fallback", - "default_policy": "dfo/facet-policy/most-observations", - "selection_reason": "absent_on_selected_facet", - "dispatch_facet_id": "1962969911839422253", - "default_policy_version": "1" - }, - { - "ref": "CurrencyUSD", - "axis": "unit", - "basis": "deployment_fallback", - "default_policy": "dfo/facet-policy/most-observations", - "selection_reason": "sole_candidate", - "dispatch_facet_id": "1962969911839422253", - "default_policy_version": "1" - } - ], "applied_window": { "kind": "range", - "origin": "query", + "start_year": 2020, "end_year": 2023, - "start_year": 2020 + "origin": "query" }, - "graph_revision": "dfo-dev-dc-datacommons-service-00260-6xk", - "normalisations": [], + "graph_revision": "dfo-dev-dc-datacommons-service-00284-j2f", "code_index_stamp": { - "exported_at": "2026-10-20T19:50:14Z", - "content_hash": "602c7022fc21c17540a6873d93196ad6b967eaae3e71f9dce6dec178a735daf4", + "content_hash": "a1bde3be8710f5ba073e52aaaba73cf9156079c273c874372f54bb07a81b0f94", + "exported_at": "2026-11-01T03:08:18Z", "graph_endpoint": "graph_release" }, + "origin_catalogue_build_id": "20261029T171521Z-7d0a5854", "source_revisions": [ { "source": "provenance/OECDDAC2A", - "revision": "2026-10-15" + "revision": "2026-10-29" } ], - "capability_version": "dset_1e6cd9546fac19e9", - "materialiser_build": "36b9f48d83282bcd5d99cb8f67b83e57a00216fd", "resolved_stat_vars": [ { - "ref": "dcid:Amount_FinancialFlow_Gross_Disbursement_DAC2aAidType206_Nominal", + "ref": "dcid:Amount_FinancialFlow_Net_Disbursement_DAC2aAidType206_Nominal", "roles": [ "financingProvider", "financingRecipient" @@ -531,18 +510,55 @@ "observation_count": 170 } ], + "family_member_digest": "c2d373442ac21a31377df76cd343f156c72a530649757c399c6661cbf56c9a71", "family_member_count": 1, - "family_member_digest": "1a36e1a7292b1bfff95a5415de0be74cac7bb033217ed50e79faa8ce51a224c0", + "facets": [ + { + "axis": "provenance", + "ref": "provenance/OECDDAC2A", + "basis": "deployment_fallback", + "default_policy": "dfo/facet-policy/most-observations", + "default_policy_version": "1", + "selection_reason": "sole_candidate", + "dispatch_facet_id": "1962969911839422253" + }, + { + "axis": "measurementMethod", + "ref": null, + "basis": "deployment_fallback", + "default_policy": "dfo/facet-policy/most-observations", + "default_policy_version": "1", + "selection_reason": "absent_on_selected_facet", + "dispatch_facet_id": "1962969911839422253" + }, + { + "axis": "unit", + "ref": "CurrencyUSD", + "basis": "deployment_fallback", + "default_policy": "dfo/facet-policy/most-observations", + "default_policy_version": "1", + "selection_reason": "sole_candidate", + "dispatch_facet_id": "1962969911839422253" + } + ], + "normalisations": [], "frame_grammar_version": "1.1.0", - "origin_catalogue_build_id": "20261021T070020Z-7262111e", - "served_from": "head", - "confirmed_at": "2026-10-26T09:18:33.682273+00:00" + "materialiser_build": "ccb6617922c839ce3cd5615a3bbb65c70bfe1bde", + "capability_version": "dset_5282a0674178a233", + "served_from": "materialise", + "confirmed_at": "2026-11-01T07:38:21.528890+00:00" }, "warnings": [ { "code": "coverage_below_scope", "severity": "warn", - "message": "The served coverage falls short of the requested scope. No observations were served for country/TUV." + "message": "The served coverage falls short of the requested scope. No observations were served for 1 requested entity.", + "unserved_entities": { + "count": 1, + "refs": [ + "dcid:country/TUV" + ] + } } ], "diagnostics": [ @@ -554,35 +570,35 @@ ], "artifacts": [ { - "artifact_digest": "sha256:87ee2f60de69561349a468cc45a902dc585b7726affc5fa2d080750df7ce9a72", + "artifact_digest": "sha256:dfab152c9d79c0c3c7c1269ee875140a2afeac20859331d30f2931c819d80fc2", "rendering": { "bundle": false, "format": "parquet", "layout": 4, "without_party_totals": true }, - "bytes": 8810, + "bytes": 8800, "media_type": "application/vnd.apache.parquet", - "created_at": "2026-10-25T14:20:02.459303+00:00", + "created_at": "2026-11-01T07:38:21.430053+00:00", "tier": "working", - "url": "/api/datasets/spec_f04936b8378cde70bc6289ac1e45ee9b/cv_daec84e443d4e1b37291242d90fc8fa8/files/sha256:87ee2f60de69561349a468cc45a902dc585b7726affc5fa2d080750df7ce9a72", - "enrichment_stamp": "08ed6c734fc69ea2204a21f4e1dd8b963f14dd1e03a2484c618049ac2e2d93d8" + "url": "/api/datasets/spec_53102a787c202df65dcbb4d112c7bf33/cv_c836c8b3ecbb63dde4177d8c5e23c9e3/files/sha256:dfab152c9d79c0c3c7c1269ee875140a2afeac20859331d30f2931c819d80fc2", + "enrichment_stamp": "55887b871f7aa1c5d120cb2bee97086605351d5acfbec645ab027f562d0f65c5" }, { - "artifact_digest": "sha256:78ad78b09dcc0d40e50f5804d66f3399fa6b851ae4b4ac48b27ce5a6f2124ef0", + "artifact_digest": "sha256:c959529fa024aa5d9129d7d666cd9d4a63bef22171eb97097270df2d2d814cad", "rendering": { "statistics": "series" }, - "bytes": 7768, + "bytes": 7752, "media_type": "application/vnd.apache.parquet", - "created_at": "2026-10-21T07:08:48.809260+00:00", + "created_at": "2026-11-01T07:38:21.430053+00:00", "tier": "working", - "url": "/api/datasets/spec_f04936b8378cde70bc6289ac1e45ee9b/cv_daec84e443d4e1b37291242d90fc8fa8/files/sha256:78ad78b09dcc0d40e50f5804d66f3399fa6b851ae4b4ac48b27ce5a6f2124ef0" + "url": "/api/datasets/spec_53102a787c202df65dcbb4d112c7bf33/cv_c836c8b3ecbb63dde4177d8c5e23c9e3/files/sha256:c959529fa024aa5d9129d7d666cd9d4a63bef22171eb97097270df2d2d814cad" } ], "series_count": 43, "output_options": { - "capability_version": "dset_76f5fa7244511c58", + "capability_version": "dset_5282a0674178a233", "columns": [ { "name": "stat_var", @@ -665,7 +681,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": false }, { "column": "financingProvider", @@ -677,7 +694,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": false }, { "column": "financingProvider", @@ -689,7 +707,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true }, { "column": "financingProvider", @@ -701,7 +720,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": false }, { "column": "financingProvider", @@ -713,7 +733,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true }, { "column": "financingProvider", @@ -725,7 +746,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true }, { "column": "financingProvider", @@ -737,7 +759,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true }, { "column": "financingRecipient", @@ -749,7 +772,8 @@ "covered": 43 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": false }, { "column": "financingRecipient", @@ -767,7 +791,8 @@ "label": "South Sudan" } ], - "truncated": false + "truncated": false, + "in_long_layout": false }, { "column": "financingRecipient", @@ -779,7 +804,8 @@ "covered": 43 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true }, { "column": "financingRecipient", @@ -791,7 +817,8 @@ "covered": 43 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": false }, { "column": "financingRecipient", @@ -803,7 +830,8 @@ "covered": 43 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true }, { "column": "financingRecipient", @@ -815,7 +843,8 @@ "covered": 43 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true }, { "column": "financingRecipient", @@ -827,7 +856,8 @@ "covered": 43 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true } ], "long_layout_defaults": [ @@ -871,10 +901,10 @@ ] } }, - "series_coverage_stamp": "e6e717ab8c77e84d010915893ede5809e9ecec67929a07cfafbcc2210edfa1eb", + "series_coverage_stamp": "ad27fd11738abb03d2d84dc214e223f04781609636cf678d0d08c385fb863d99", "retention": { "pinned": false, - "held_until": "2026-11-20T07:08:48.808348Z" + "held_until": "2026-12-01T07:38:21.430340Z" } } } @@ -892,46 +922,7 @@ "entry_kind": "identity", "variable_text": "dataset", "identity": { - "shape": { - "kind": "statvar_schema", - "stat_type": "measuredValue", - "population_type": "FinancialFlow", - "measured_property": "amount", - "measurement_qualifier": "Nominal" - }, - "slots": [ - { - "binding": { - "ref": "DAC2aAidType206", - "state": "value" - }, - "property": "dac2aAidType" - }, - { - "binding": { - "state": "unbound" - }, - "property": "dacTypeOfFinance" - }, - { - "binding": { - "ref": "Disbursement", - "state": "value" - }, - "property": "financialFlowType" - }, - { - "binding": { - "ref": "Gross", - "state": "value" - }, - "property": "nettingBasis" - } - ], "entities": { - "origin": [ - "country/DEU" - ], "destination": [ "country/AFG", "country/AGO", @@ -977,14 +968,53 @@ "country/UGA", "country/YEM", "country/ZMB" + ], + "origin": [ + "country/DEU" ] }, "identity_version": "spec1", "requested_window": { - "kind": "range", "end_year": 2023, + "kind": "range", "start_year": 2020 - } + }, + "shape": { + "kind": "statvar_schema", + "measured_property": "amount", + "measurement_qualifier": "Nominal", + "population_type": "FinancialFlow", + "stat_type": "measuredValue" + }, + "slots": [ + { + "binding": { + "ref": "DAC2aAidType206", + "state": "value" + }, + "property": "dac2aAidType" + }, + { + "binding": { + "state": "unbound" + }, + "property": "dacTypeOfFinance" + }, + { + "binding": { + "ref": "Disbursement", + "state": "value" + }, + "property": "financialFlowType" + }, + { + "binding": { + "ref": "Net", + "state": "value" + }, + "property": "nettingBasis" + } + ] }, "entity_groups": { "destination": { @@ -1001,7 +1031,7 @@ "status": 200, "headers": { "content-type": "application/json", - "x-dfo-trace-id": "b0a96c8e862d4a3ea8b0dea282c6ada4" + "x-dfo-trace-id": "0162bf4153c045739174aba39910e026" }, "json": { "schema_version": 1, @@ -1010,13 +1040,13 @@ "extract_skipped": true }, "diagnostics": { - "engine_build": "d80df9f5fd598b7345255470932d202ee5d49942", - "trace_id": "b0a96c8e862d4a3ea8b0dea282c6ada4", + "engine_build": "ccb6617922c839ce3cd5615a3bbb65c70bfe1bde", + "trace_id": "0162bf4153c045739174aba39910e026", "warnings": [], "timing_ms": { - "total": 2, + "total": 139, "by_step": { - "coverage": 1 + "coverage": 0 } }, "timed_out": false @@ -1027,9 +1057,39 @@ "variable_text": "dataset", "warnings": [], "timing_ms": { - "total": 0, + "total": 125, "by_step": { - "response_cache_part_memo": 0 + "validate": 0, + "phase_validate": 0, + "walk": 13, + "reread_arcs": 0, + "phase_reread_arcs": 0, + "detect_edits": 0, + "phase_detect_edits": 0, + "resolve_survivors": 0, + "phase_resolve_survivors": 0, + "shape": 1, + "phase_build_shape": 0, + "bind": 0, + "phase_build_bindings": 0, + "where_places": 0, + "phase_where_places": 0, + "materialise": 32, + "phase_materialise": 0, + "ground_related": 0, + "ground_units": 0, + "ground_facets": 0, + "ground_convert": 0, + "answer": 15, + "ground_gates": 5, + "phase_ground_build": 55, + "finalize_preview": 0, + "options": 3, + "finalize_related": 0, + "finalize_wholes": 0, + "finalize_relaunch": 0, + "phase_finalize": 1, + "served_entry": 0 } }, "entity_refs": [], @@ -1049,10 +1109,10 @@ "assumptions": [], "status": "definite", "spec": { - "spec_id": "spec_f04936b8378cde70bc6289ac1e45ee9b", + "spec_id": "spec_53102a787c202df65dcbb4d112c7bf33", "definition": { "schema_version": 1, - "spec_id": "spec_f04936b8378cde70bc6289ac1e45ee9b", + "spec_id": "spec_53102a787c202df65dcbb4d112c7bf33", "identity": { "identity_version": "spec1", "shape": { @@ -1087,7 +1147,7 @@ "property": "nettingBasis", "binding": { "state": "value", - "ref": "Gross" + "ref": "Net" } } ], @@ -1152,7 +1212,7 @@ "resolved": { "shape": { "shape_id": "financialflow_amount_measuredvalue_nominal_family_f096b1ba", - "label": "gross disbursements (official development assistance)", + "label": "net disbursements (official development assistance)", "population_type": { "ref": "FinancialFlow", "label": "financial flow" @@ -1217,7 +1277,7 @@ } ], "member_count": 1, - "member_digest": "1a36e1a7292b1bfff95a5415de0be74cac7bb033217ed50e79faa8ce51a224c0", + "member_digest": "c2d373442ac21a31377df76cd343f156c72a530649757c399c6661cbf56c9a71", "refine_supported": true, "data_commons": [ { @@ -1282,8 +1342,8 @@ "kind": "value", "value": { "ref": { - "ref": "Gross", - "label": "gross" + "ref": "Net", + "label": "net" }, "value_kind": "enum_value" } @@ -2022,7 +2082,7 @@ "label": "OECD Terms and Conditions" } }, - "coverage_stamp": "e6e717ab8c77e84d010915893ede5809e9ecec67929a07cfafbcc2210edfa1eb", + "coverage_stamp": "ad27fd11738abb03d2d84dc214e223f04781609636cf678d0d08c385fb863d99", "facets": { "provenance": { "basis": "fallback", @@ -2068,60 +2128,33 @@ "relation": "child", "parent": "DAC2aAidType206", "member_count": 2, - "served_rows": 19, + "served_rows": 27, "served_rows_exact": true }, { "value": { "ref": { - "ref": "DAC2aAidType201", - "label": "ODA grant" - }, - "value_kind": "enum_value" - }, - "relation": "child", - "parent": "DAC2aAidType206", - "member_count": 1, - "served_rows": 170, - "served_rows_exact": true - }, - { - "value": { - "ref": { - "ref": "DAC2aAidType207", - "label": "free-standing technical co-operation" - }, - "value_kind": "enum_value" - }, - "relation": "root", - "member_count": 1, - "served_rows": 170, - "served_rows_exact": true - }, - { - "value": { - "ref": { - "ref": "DAC2aAidType213", - "label": "developmental food aid" + "ref": "DAC2aAidType209", + "label": "interest received on ODA lending" }, "value_kind": "enum_value" }, "relation": "root", "member_count": 1, - "served_rows": 74, + "served_rows": 16, "served_rows_exact": true }, { "value": { "ref": { - "ref": "DAC2aAidType216", - "label": "humanitarian aid" + "ref": "DAC2aAidType250", + "label": "official development assistance excluding debt relief" }, "value_kind": "enum_value" }, "relation": "root", "member_count": 1, - "served_rows": 101, + "served_rows": 170, "served_rows_exact": true } ], @@ -2164,7 +2197,7 @@ "source": "observed" } ], - "rendered_sentence": "Germany's gross disbursements to the 44 Least Developed Countries for official development assistance, 2020 to 2023. Current US dollars · OECD DAC2a.", + "rendered_sentence": "Germany's net disbursements to the 44 Least Developed Countries for official development assistance, 2020 to 2023. Current US dollars · OECD DAC2a.", "sentence_plan": [ { "kind": "slot", @@ -2195,7 +2228,7 @@ }, { "kind": "slot", - "text": "gross disbursements", + "text": "net disbursements", "axis": "what", "segment": "heading", "entity_refs": [], @@ -2635,8 +2668,8 @@ "binding_kind": "value", "refs": [ { - "ref": "Gross", - "label": "gross" + "ref": "Net", + "label": "net" } ], "provenance": "binder" @@ -2864,7 +2897,7 @@ "start_year": 2020, "end_year": 2023 }, - "capability_version": "cap_765c9d2a0c7529b9" + "capability_version": "cap_4913302d7a6b6435" }, "confidence": "high", "available_at_place": true, @@ -2872,7 +2905,7 @@ { "definition": { "schema_version": 1, - "spec_id": "spec_53102a787c202df65dcbb4d112c7bf33", + "spec_id": "spec_f04936b8378cde70bc6289ac1e45ee9b", "identity": { "identity_version": "spec1", "shape": { @@ -2907,7 +2940,7 @@ "property": "nettingBasis", "binding": { "state": "value", - "ref": "Net" + "ref": "Gross" } } ], @@ -2969,7 +3002,7 @@ } } }, - "label": "net disbursements", + "label": "gross disbursements", "axis": "what", "measure_axis_values": [ { @@ -3003,8 +3036,8 @@ { "axis": "nettingBasis", "value": { - "ref": "Net", - "label": "net" + "ref": "Gross", + "label": "gross" } } ], @@ -3012,7 +3045,7 @@ "served_rows_exact": true } ], - "measure_label": "gross disbursements", + "measure_label": "net disbursements", "measure_label_axes": [ "populationType", "measuredProperty", @@ -3052,11 +3085,13 @@ { "axis": "nettingBasis", "value": { - "ref": "Gross", - "label": "gross" + "ref": "Net", + "label": "net" } } ], + "concept_label": "official development assistance", + "published_tables": "OECD DAC2a", "unit_conversion": { "currencies": [ { @@ -5023,7 +5058,7 @@ } } ], - "rendered_sentence": "Germany's gross disbursements to the 44 Least Developed Countries for official development assistance, 2020 to 2023. Current US dollars · OECD DAC2a. The data holds no values for 1 of the 44 Least Developed Countries. This shows the 44 Least Developed Countries, each on its own.", + "rendered_sentence": "Germany's net disbursements to the 44 Least Developed Countries for official development assistance, 2020 to 2023. Current US dollars · OECD DAC2a. The data holds no values for 1 of the 44 Least Developed Countries. This shows the 44 Least Developed Countries, each on its own.", "sentence_plan": [ { "kind": "slot", @@ -5057,7 +5092,7 @@ }, { "kind": "slot", - "text": "gross disbursements", + "text": "net disbursements", "axis": "what", "segment": "heading", "entity_refs": [], @@ -5297,21 +5332,21 @@ { "request": { "method": "GET", - "origin_path": "/api/datasets/spec_f04936b8378cde70bc6289ac1e45ee9b/cv_daec84e443d4e1b37291242d90fc8fa8/files/sha256:87ee2f60de69561349a468cc45a902dc585b7726affc5fa2d080750df7ce9a72" + "origin_path": "/api/datasets/spec_53102a787c202df65dcbb4d112c7bf33/cv_c836c8b3ecbb63dde4177d8c5e23c9e3/files/sha256:dfab152c9d79c0c3c7c1269ee875140a2afeac20859331d30f2931c819d80fc2" }, "response": { "status": 302, "headers": { "content-type": "text/html", - "location": "https://storage.googleapis.com/dev-fin-observatory-datasets-working/sha256%3A87ee2f60de69561349a468cc45a902dc585b7726affc5fa2d080750df7ce9a72?X-Goog-Signature=redacted", - "x-dfo-trace-id": "83e8a270332a4fdd9ae6127e98ee0d0d" + "location": "https://storage.googleapis.com/dev-fin-observatory-datasets-working/sha256%3Adfab152c9d79c0c3c7c1269ee875140a2afeac20859331d30f2931c819d80fc2?X-Goog-Signature=redacted", + "x-dfo-trace-id": "1e3ae57623ff4296a60f1ff747022c13" } } }, { "request": { "method": "GET", - "url": "https://storage.googleapis.com/dev-fin-observatory-datasets-working/sha256%3A87ee2f60de69561349a468cc45a902dc585b7726affc5fa2d080750df7ce9a72?X-Goog-Signature=redacted" + "url": "https://storage.googleapis.com/dev-fin-observatory-datasets-working/sha256%3Adfab152c9d79c0c3c7c1269ee875140a2afeac20859331d30f2931c819d80fc2?X-Goog-Signature=redacted" }, "response": { "status": 200, @@ -5352,9 +5387,9 @@ "members": [ { "parts": [], - "spec_id": "spec_f04936b8378cde70bc6289ac1e45ee9b", - "content_version": "cv_daec84e443d4e1b37291242d90fc8fa8", - "sentence": "Germany's gross disbursements to the 44 Least Developed Countries for official development assistance, 2020 to 2023. Current US dollars · OECD DAC2a." + "spec_id": "spec_53102a787c202df65dcbb4d112c7bf33", + "content_version": "cv_c836c8b3ecbb63dde4177d8c5e23c9e3", + "sentence": "Germany's net disbursements to the 44 Least Developed Countries for official development assistance, 2020 to 2023. Current US dollars · OECD DAC2a." } ], "missing": [] diff --git a/python/client-contract/src/dfo_client_contract/scenarios/fetch-spec-group-narrowed.parquet b/python/client-contract/src/dfo_client_contract/scenarios/fetch-spec-group-narrowed.parquet index 001b8f4..71f23dc 100644 Binary files a/python/client-contract/src/dfo_client_contract/scenarios/fetch-spec-group-narrowed.parquet and b/python/client-contract/src/dfo_client_contract/scenarios/fetch-spec-group-narrowed.parquet differ diff --git a/python/client-contract/src/dfo_client_contract/scenarios/fetch-spec-group-origin-rebound.json b/python/client-contract/src/dfo_client_contract/scenarios/fetch-spec-group-origin-rebound.json index f5318d4..a13fdff 100644 --- a/python/client-contract/src/dfo_client_contract/scenarios/fetch-spec-group-origin-rebound.json +++ b/python/client-contract/src/dfo_client_contract/scenarios/fetch-spec-group-origin-rebound.json @@ -5,17 +5,17 @@ "origin": { "kind": "recorded", "base_url": "https://dfo-dev-apis-zms5lj4zhq-nn.a.run.app/api", - "dfo_commit": "d80df9f5fd598b7345255470932d202ee5d49942", - "recorded_at": "2026-10-26T09:22:27Z" + "dfo_commit": "ccb6617922c839ce3cd5615a3bbb65c70bfe1bde", + "recorded_at": "2026-11-01T07:38:22Z" }, "call": [ { "op": "fetch", "spec": { - "spec_id": "spec_17a33486ccfd93f1a75c2070bab68b8c", + "spec_id": "spec_fc5ce33e120fc3dcba5e02f0655a4258", "definition": { "schema_version": 1, - "spec_id": "spec_17a33486ccfd93f1a75c2070bab68b8c", + "spec_id": "spec_fc5ce33e120fc3dcba5e02f0655a4258", "identity": { "identity_version": "spec1", "shape": { @@ -50,7 +50,7 @@ "property": "nettingBasis", "binding": { "state": "value", - "ref": "Gross" + "ref": "Net" } } ], @@ -110,7 +110,7 @@ } } }, - "sentence": "Germany's gross disbursements to the 44 Least Developed Countries for official development assistance, 1960 to 2024. Current US dollars · OECD DAC2a.", + "sentence": "Germany's net disbursements to the 44 Least Developed Countries for official development assistance, 1960 to 2024. Current US dollars · OECD DAC2a.", "entity_groups": { "destination": { "label": "Least Developed Countries", @@ -134,10 +134,10 @@ "schema_version": 1, "input": { "kind": "spec_id", - "spec_id": "spec_17a33486ccfd93f1a75c2070bab68b8c", + "spec_id": "spec_fc5ce33e120fc3dcba5e02f0655a4258", "definition": { "schema_version": 1, - "spec_id": "spec_17a33486ccfd93f1a75c2070bab68b8c", + "spec_id": "spec_fc5ce33e120fc3dcba5e02f0655a4258", "identity": { "identity_version": "spec1", "shape": { @@ -172,7 +172,7 @@ "property": "nettingBasis", "binding": { "state": "value", - "ref": "Gross" + "ref": "Net" } } ], @@ -297,54 +297,15 @@ "status": 200, "headers": { "content-type": "application/json", - "x-dfo-trace-id": "e32f376d58684753b9bc195b1429569b" + "x-dfo-trace-id": "cf3527fa181f4bd294cc8bdcb8d8b510" }, "json": { "schema_version": 1, "definition": { "schema_version": 1, - "spec_id": "spec_c2f21170dfa9f31705e47ed60c8fa305", + "spec_id": "spec_d0fa2dd4c5ba67436b13a12bb98547d4", "identity": { - "shape": { - "kind": "statvar_schema", - "stat_type": "measuredValue", - "population_type": "FinancialFlow", - "measured_property": "amount", - "measurement_qualifier": "Nominal" - }, - "slots": [ - { - "binding": { - "ref": "DAC2aAidType206", - "state": "value" - }, - "property": "dac2aAidType" - }, - { - "binding": { - "state": "unbound" - }, - "property": "dacTypeOfFinance" - }, - { - "binding": { - "ref": "Disbursement", - "state": "value" - }, - "property": "financialFlowType" - }, - { - "binding": { - "ref": "Gross", - "state": "value" - }, - "property": "nettingBasis" - } - ], "entities": { - "origin": [ - "country/FRA" - ], "destination": [ "country/AFG", "country/AGO", @@ -390,18 +351,57 @@ "country/UGA", "country/YEM", "country/ZMB" + ], + "origin": [ + "country/FRA" ] }, "identity_version": "spec1", "requested_window": { "kind": "all" - } + }, + "shape": { + "kind": "statvar_schema", + "measured_property": "amount", + "measurement_qualifier": "Nominal", + "population_type": "FinancialFlow", + "stat_type": "measuredValue" + }, + "slots": [ + { + "binding": { + "ref": "DAC2aAidType206", + "state": "value" + }, + "property": "dac2aAidType" + }, + { + "binding": { + "state": "unbound" + }, + "property": "dacTypeOfFinance" + }, + { + "binding": { + "ref": "Disbursement", + "state": "value" + }, + "property": "financialFlowType" + }, + { + "binding": { + "ref": "Net", + "state": "value" + }, + "property": "nettingBasis" + } + ] } }, - "content_version": "cv_66a0a4a0331d59b519aa1629dade3d99", - "prepared_at": "2026-10-21T07:08:52Z", + "content_version": "cv_070d2755d6bf2ffa39860ca05c717279", + "prepared_at": "2026-11-01T07:38:23Z", "coverage": { - "rows": 2114, + "rows": 2128, "dimensions": [ { "label": "financingProvider", @@ -428,9 +428,9 @@ ], "window": { "kind": "all", - "origin": "default", + "start_year": 1960, "end_year": 2024, - "start_year": 1960 + "origin": "default" } }, "citation": { @@ -457,8 +457,8 @@ "source_data_url": "https://webfs-dcd.oecd.org/files/dotStat/DSD_DAC2/Table2a_Data.zip", "attribution": "OECD (2026), OECD DAC2A, OECD Data Explorer, https://webfs-dcd.oecd.org/files/dotStat/DSD_DAC2/Table2a_Data.zip (accessed on 2026-10-12)", "update_cadence": "Quarterly", - "last_update": "2026-10-15", - "years_covered": "1960-2024", + "last_update": "2026-10-29", + "years_covered": "1960-2025", "granularity": "Annual, by provider and recipient", "currencies": [ "USD" @@ -469,8 +469,8 @@ "description": "The OECD publishes DAC2A in April, June, September and December. The complete table is downloaded from the OECD each time it is republished, and replaces the previous copy, so the data reflects the OECD's latest release." }, { - "transformation": "Exclude the partial preliminary year", - "description": "Before each full release, the OECD publishes preliminary data for the year that release covers, as reporters submit it. Until then, that year is partial, so the pipeline excludes it. Support for partial years is in development. Partial years will be marked incomplete, so they don't lead to incorrect or confusing analyses." + "transformation": "Mark the partial year", + "description": "The OECD publishes data for a year as donors report it, and its final release in December of the following year covers every donor. Until then, the year is partial. The pipeline publishes it, and the import's provenance names it in `partialObservationDate`." }, { "transformation": "Standardise providers and recipients", @@ -490,13 +490,23 @@ } ], "version_history": [ + { + "date": "2026-10-29", + "title": "Partial year published, marked as partial", + "changes": [ + { + "kind": "changed", + "note": "The partial year, which only some donors have reported ahead of the OECD's final release in December, is included, and the import's provenance marks it with `partialObservationDate`." + } + ] + }, { "date": "2026-10-15", - "title": "Partial preliminary year excluded", + "title": "Partial year excluded", "changes": [ { "kind": "changed", - "note": "The partial preliminary year published ahead of the next full release is excluded." + "note": "The partial year, which only some donors have reported ahead of the OECD's final release in December, is excluded." } ] }, @@ -516,72 +526,72 @@ ] }, "trace": { - "facets": [ - { - "ref": "provenance/OECDDAC2A", - "axis": "provenance", - "basis": "deployment_fallback", - "default_policy": "dfo/facet-policy/most-observations", - "selection_reason": "sole_candidate", - "dispatch_facet_id": "1962969911839422253", - "default_policy_version": "1" - }, - { - "ref": null, - "axis": "measurementMethod", - "basis": "deployment_fallback", - "default_policy": "dfo/facet-policy/most-observations", - "selection_reason": "absent_on_selected_facet", - "dispatch_facet_id": "1962969911839422253", - "default_policy_version": "1" - }, - { - "ref": "CurrencyUSD", - "axis": "unit", - "basis": "deployment_fallback", - "default_policy": "dfo/facet-policy/most-observations", - "selection_reason": "sole_candidate", - "dispatch_facet_id": "1962969911839422253", - "default_policy_version": "1" - } - ], "applied_window": { "kind": "all", - "origin": "default", + "start_year": 1960, "end_year": 2024, - "start_year": 1960 + "origin": "default" }, - "graph_revision": "dfo-dev-dc-datacommons-service-00260-6xk", - "normalisations": [], + "graph_revision": "dfo-dev-dc-datacommons-service-00284-j2f", "code_index_stamp": { - "exported_at": "2026-10-20T19:50:14Z", - "content_hash": "602c7022fc21c17540a6873d93196ad6b967eaae3e71f9dce6dec178a735daf4", + "content_hash": "a1bde3be8710f5ba073e52aaaba73cf9156079c273c874372f54bb07a81b0f94", + "exported_at": "2026-11-01T03:08:18Z", "graph_endpoint": "graph_release" }, + "origin_catalogue_build_id": "20261029T171521Z-7d0a5854", "source_revisions": [ { "source": "provenance/OECDDAC2A", - "revision": "2026-10-15" + "revision": "2026-10-29" } ], - "capability_version": "dset_1e6cd9546fac19e9", - "materialiser_build": "36b9f48d83282bcd5d99cb8f67b83e57a00216fd", "resolved_stat_vars": [ { - "ref": "dcid:Amount_FinancialFlow_Gross_Disbursement_DAC2aAidType206_Nominal", + "ref": "dcid:Amount_FinancialFlow_Net_Disbursement_DAC2aAidType206_Nominal", "roles": [ "financingProvider", "financingRecipient" ], - "observation_count": 2114 + "observation_count": 2128 } ], + "family_member_digest": "c2d373442ac21a31377df76cd343f156c72a530649757c399c6661cbf56c9a71", "family_member_count": 1, - "family_member_digest": "1a36e1a7292b1bfff95a5415de0be74cac7bb033217ed50e79faa8ce51a224c0", + "facets": [ + { + "axis": "provenance", + "ref": "provenance/OECDDAC2A", + "basis": "deployment_fallback", + "default_policy": "dfo/facet-policy/most-observations", + "default_policy_version": "1", + "selection_reason": "sole_candidate", + "dispatch_facet_id": "1962969911839422253" + }, + { + "axis": "measurementMethod", + "ref": null, + "basis": "deployment_fallback", + "default_policy": "dfo/facet-policy/most-observations", + "default_policy_version": "1", + "selection_reason": "absent_on_selected_facet", + "dispatch_facet_id": "1962969911839422253" + }, + { + "axis": "unit", + "ref": "CurrencyUSD", + "basis": "deployment_fallback", + "default_policy": "dfo/facet-policy/most-observations", + "default_policy_version": "1", + "selection_reason": "sole_candidate", + "dispatch_facet_id": "1962969911839422253" + } + ], + "normalisations": [], "frame_grammar_version": "1.1.0", - "origin_catalogue_build_id": "20261021T070020Z-7262111e", - "served_from": "head", - "confirmed_at": "2026-10-26T09:18:36.478834+00:00" + "materialiser_build": "ccb6617922c839ce3cd5615a3bbb65c70bfe1bde", + "capability_version": "dset_5282a0674178a233", + "served_from": "materialise", + "confirmed_at": "2026-11-01T07:38:23.690796+00:00" }, "warnings": [], "diagnostics": [ @@ -593,35 +603,35 @@ ], "artifacts": [ { - "artifact_digest": "sha256:e9513ce3953896d5b833a71546a5987a82e3f18219cd43eb987fc69dfab80321", + "artifact_digest": "sha256:e394e0de88d7c5b0e9488b0169a229b2261005a5ab2d7b9a4d8e2dd925da5fa1", "rendering": { "bundle": false, "format": "parquet", "layout": 4, "without_party_totals": true }, - "bytes": 21121, + "bytes": 21244, "media_type": "application/vnd.apache.parquet", - "created_at": "2026-10-25T14:20:06.098634+00:00", + "created_at": "2026-11-01T07:38:23.639888+00:00", "tier": "working", - "url": "/api/datasets/spec_c2f21170dfa9f31705e47ed60c8fa305/cv_66a0a4a0331d59b519aa1629dade3d99/files/sha256:e9513ce3953896d5b833a71546a5987a82e3f18219cd43eb987fc69dfab80321", - "enrichment_stamp": "08ed6c734fc69ea2204a21f4e1dd8b963f14dd1e03a2484c618049ac2e2d93d8" + "url": "/api/datasets/spec_d0fa2dd4c5ba67436b13a12bb98547d4/cv_070d2755d6bf2ffa39860ca05c717279/files/sha256:e394e0de88d7c5b0e9488b0169a229b2261005a5ab2d7b9a4d8e2dd925da5fa1", + "enrichment_stamp": "55887b871f7aa1c5d120cb2bee97086605351d5acfbec645ab027f562d0f65c5" }, { - "artifact_digest": "sha256:b1f80f2d3df16b6cda3831730ee4749b13e1eb3fff82cdf2f479e71f087bfe2b", + "artifact_digest": "sha256:2b399bedb12605f62e1688725984e5969e06abf9265bfa19e7bb7febdc50d989", "rendering": { "statistics": "series" }, - "bytes": 8093, + "bytes": 8128, "media_type": "application/vnd.apache.parquet", - "created_at": "2026-10-21T07:08:52.857494+00:00", + "created_at": "2026-11-01T07:38:23.639888+00:00", "tier": "working", - "url": "/api/datasets/spec_c2f21170dfa9f31705e47ed60c8fa305/cv_66a0a4a0331d59b519aa1629dade3d99/files/sha256:b1f80f2d3df16b6cda3831730ee4749b13e1eb3fff82cdf2f479e71f087bfe2b" + "url": "/api/datasets/spec_d0fa2dd4c5ba67436b13a12bb98547d4/cv_070d2755d6bf2ffa39860ca05c717279/files/sha256:2b399bedb12605f62e1688725984e5969e06abf9265bfa19e7bb7febdc50d989" } ], "series_count": 44, "output_options": { - "capability_version": "dset_76f5fa7244511c58", + "capability_version": "dset_5282a0674178a233", "columns": [ { "name": "stat_var", @@ -704,7 +714,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": false }, { "column": "financingProvider", @@ -716,7 +727,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": false }, { "column": "financingProvider", @@ -728,7 +740,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true }, { "column": "financingProvider", @@ -740,7 +753,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": false }, { "column": "financingProvider", @@ -752,7 +766,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true }, { "column": "financingProvider", @@ -764,7 +779,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true }, { "column": "financingProvider", @@ -776,7 +792,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true }, { "column": "financingRecipient", @@ -788,7 +805,8 @@ "covered": 44 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": false }, { "column": "financingRecipient", @@ -806,7 +824,8 @@ "label": "South Sudan" } ], - "truncated": false + "truncated": false, + "in_long_layout": false }, { "column": "financingRecipient", @@ -818,7 +837,8 @@ "covered": 44 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true }, { "column": "financingRecipient", @@ -830,7 +850,8 @@ "covered": 44 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": false }, { "column": "financingRecipient", @@ -842,7 +863,8 @@ "covered": 44 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true }, { "column": "financingRecipient", @@ -854,7 +876,8 @@ "covered": 44 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true }, { "column": "financingRecipient", @@ -866,7 +889,8 @@ "covered": 44 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true } ], "long_layout_defaults": [ @@ -910,10 +934,10 @@ ] } }, - "series_coverage_stamp": "e6e717ab8c77e84d010915893ede5809e9ecec67929a07cfafbcc2210edfa1eb", + "series_coverage_stamp": "ad27fd11738abb03d2d84dc214e223f04781609636cf678d0d08c385fb863d99", "retention": { "pinned": false, - "held_until": "2026-11-20T07:08:52.858156Z" + "held_until": "2026-12-01T07:38:23.640348Z" } } } @@ -931,46 +955,7 @@ "entry_kind": "identity", "variable_text": "dataset", "identity": { - "shape": { - "kind": "statvar_schema", - "stat_type": "measuredValue", - "population_type": "FinancialFlow", - "measured_property": "amount", - "measurement_qualifier": "Nominal" - }, - "slots": [ - { - "binding": { - "ref": "DAC2aAidType206", - "state": "value" - }, - "property": "dac2aAidType" - }, - { - "binding": { - "state": "unbound" - }, - "property": "dacTypeOfFinance" - }, - { - "binding": { - "ref": "Disbursement", - "state": "value" - }, - "property": "financialFlowType" - }, - { - "binding": { - "ref": "Gross", - "state": "value" - }, - "property": "nettingBasis" - } - ], "entities": { - "origin": [ - "country/FRA" - ], "destination": [ "country/AFG", "country/AGO", @@ -1016,12 +1001,51 @@ "country/UGA", "country/YEM", "country/ZMB" + ], + "origin": [ + "country/FRA" ] }, "identity_version": "spec1", "requested_window": { "kind": "all" - } + }, + "shape": { + "kind": "statvar_schema", + "measured_property": "amount", + "measurement_qualifier": "Nominal", + "population_type": "FinancialFlow", + "stat_type": "measuredValue" + }, + "slots": [ + { + "binding": { + "ref": "DAC2aAidType206", + "state": "value" + }, + "property": "dac2aAidType" + }, + { + "binding": { + "state": "unbound" + }, + "property": "dacTypeOfFinance" + }, + { + "binding": { + "ref": "Disbursement", + "state": "value" + }, + "property": "financialFlowType" + }, + { + "binding": { + "ref": "Net", + "state": "value" + }, + "property": "nettingBasis" + } + ] }, "entity_groups": { "destination": { @@ -1038,7 +1062,7 @@ "status": 200, "headers": { "content-type": "application/json", - "x-dfo-trace-id": "76155faedf434e46b697c5bd58c318f8" + "x-dfo-trace-id": "4134f9d61c9a407e9261b5d371a48ee4" }, "json": { "schema_version": 1, @@ -1047,11 +1071,11 @@ "extract_skipped": true }, "diagnostics": { - "engine_build": "d80df9f5fd598b7345255470932d202ee5d49942", - "trace_id": "76155faedf434e46b697c5bd58c318f8", + "engine_build": "ccb6617922c839ce3cd5615a3bbb65c70bfe1bde", + "trace_id": "4134f9d61c9a407e9261b5d371a48ee4", "warnings": [], "timing_ms": { - "total": 2, + "total": 97, "by_step": { "coverage": 0 } @@ -1064,9 +1088,39 @@ "variable_text": "dataset", "warnings": [], "timing_ms": { - "total": 0, + "total": 84, "by_step": { - "response_cache_part_memo": 0 + "validate": 1, + "phase_validate": 0, + "walk": 0, + "reread_arcs": 0, + "phase_reread_arcs": 0, + "detect_edits": 0, + "phase_detect_edits": 0, + "resolve_survivors": 0, + "phase_resolve_survivors": 0, + "shape": 1, + "phase_build_shape": 0, + "bind": 0, + "phase_build_bindings": 0, + "where_places": 0, + "phase_where_places": 0, + "materialise": 21, + "phase_materialise": 0, + "ground_related": 0, + "ground_units": 0, + "ground_facets": 0, + "ground_convert": 0, + "answer": 10, + "ground_gates": 2, + "phase_ground_build": 46, + "finalize_preview": 0, + "options": 3, + "finalize_related": 0, + "finalize_wholes": 0, + "finalize_relaunch": 0, + "phase_finalize": 0, + "served_entry": 0 } }, "entity_refs": [], @@ -1081,10 +1135,10 @@ "assumptions": [], "status": "definite", "spec": { - "spec_id": "spec_c2f21170dfa9f31705e47ed60c8fa305", + "spec_id": "spec_d0fa2dd4c5ba67436b13a12bb98547d4", "definition": { "schema_version": 1, - "spec_id": "spec_c2f21170dfa9f31705e47ed60c8fa305", + "spec_id": "spec_d0fa2dd4c5ba67436b13a12bb98547d4", "identity": { "identity_version": "spec1", "shape": { @@ -1119,7 +1173,7 @@ "property": "nettingBasis", "binding": { "state": "value", - "ref": "Gross" + "ref": "Net" } } ], @@ -1182,7 +1236,7 @@ "resolved": { "shape": { "shape_id": "financialflow_amount_measuredvalue_nominal_family_f096b1ba", - "label": "gross disbursements (official development assistance)", + "label": "net disbursements (official development assistance)", "population_type": { "ref": "FinancialFlow", "label": "financial flow" @@ -1247,7 +1301,7 @@ } ], "member_count": 1, - "member_digest": "1a36e1a7292b1bfff95a5415de0be74cac7bb033217ed50e79faa8ce51a224c0", + "member_digest": "c2d373442ac21a31377df76cd343f156c72a530649757c399c6661cbf56c9a71", "refine_supported": true, "data_commons": [ { @@ -1312,8 +1366,8 @@ "kind": "value", "value": { "ref": { - "ref": "Gross", - "label": "gross" + "ref": "Net", + "label": "net" }, "value_kind": "enum_value" } @@ -1969,7 +2023,7 @@ "coverage": { "kind": "exact", "has_data": true, - "observation_count": 2114, + "observation_count": 2128, "evidence": "facet_metadata", "dimensions": [ { @@ -2026,7 +2080,7 @@ ] }, "download": { - "rows": 2114, + "rows": 2128, "rows_exact": true, "series": 44, "window": { @@ -2037,7 +2091,7 @@ "label": "OECD Terms and Conditions" } }, - "coverage_stamp": "e6e717ab8c77e84d010915893ede5809e9ecec67929a07cfafbcc2210edfa1eb", + "coverage_stamp": "ad27fd11738abb03d2d84dc214e223f04781609636cf678d0d08c385fb863d99", "facets": { "provenance": { "basis": "fallback", @@ -2083,60 +2137,60 @@ "relation": "child", "parent": "DAC2aAidType206", "member_count": 2, - "served_rows": 1091, + "served_rows": 1691, "served_rows_exact": true }, { "value": { "ref": { - "ref": "DAC2aAidType201", - "label": "ODA grant" + "ref": "DAC2aAidType219", + "label": "recovery on ODA grants and capital subscriptions" }, "value_kind": "enum_value" }, "relation": "child", "parent": "DAC2aAidType206", "member_count": 1, - "served_rows": 2095, + "served_rows": 147, "served_rows_exact": true }, { "value": { "ref": { - "ref": "DAC2aAidType207", - "label": "free-standing technical co-operation" + "ref": "DAC2aAidType209", + "label": "interest received on ODA lending" }, "value_kind": "enum_value" }, "relation": "root", "member_count": 1, - "served_rows": 2021, + "served_rows": 816, "served_rows_exact": true }, { "value": { "ref": { - "ref": "DAC2aAidType213", - "label": "developmental food aid" + "ref": "DAC2aAidType250", + "label": "official development assistance excluding debt relief" }, "value_kind": "enum_value" }, "relation": "root", "member_count": 1, - "served_rows": 845, + "served_rows": 2129, "served_rows_exact": true }, { "value": { "ref": { - "ref": "DAC2aAidType216", - "label": "humanitarian aid" + "ref": "DAC2aAidType255", + "label": "debt relief" }, "value_kind": "enum_value" }, "relation": "root", "member_count": 1, - "served_rows": 545, + "served_rows": 909, "served_rows_exact": true } ], @@ -2179,7 +2233,7 @@ "source": "observed" } ], - "rendered_sentence": "France's gross disbursements to the 44 Least Developed Countries for official development assistance, 1960 to 2024. Current US dollars · OECD DAC2a.", + "rendered_sentence": "France's net disbursements to the 44 Least Developed Countries for official development assistance, 1960 to 2024. Current US dollars · OECD DAC2a.", "sentence_plan": [ { "kind": "slot", @@ -2210,7 +2264,7 @@ }, { "kind": "slot", - "text": "gross disbursements", + "text": "net disbursements", "axis": "what", "segment": "heading", "entity_refs": [], @@ -2650,8 +2704,8 @@ "binding_kind": "value", "refs": [ { - "ref": "Gross", - "label": "gross" + "ref": "Net", + "label": "net" } ], "provenance": "binder" @@ -2875,7 +2929,7 @@ } ], "query_qualifiers": [], - "capability_version": "cap_765c9d2a0c7529b9" + "capability_version": "cap_4913302d7a6b6435" }, "confidence": "high", "available_at_place": true, @@ -2883,7 +2937,7 @@ { "definition": { "schema_version": 1, - "spec_id": "spec_d0fa2dd4c5ba67436b13a12bb98547d4", + "spec_id": "spec_c2f21170dfa9f31705e47ed60c8fa305", "identity": { "identity_version": "spec1", "shape": { @@ -2918,7 +2972,7 @@ "property": "nettingBasis", "binding": { "state": "value", - "ref": "Net" + "ref": "Gross" } } ], @@ -2978,7 +3032,7 @@ } } }, - "label": "net disbursements", + "label": "gross disbursements", "axis": "what", "measure_axis_values": [ { @@ -3012,16 +3066,16 @@ { "axis": "nettingBasis", "value": { - "ref": "Net", - "label": "net" + "ref": "Gross", + "label": "gross" } } ], - "served_rows": 2128, + "served_rows": 2114, "served_rows_exact": true } ], - "measure_label": "gross disbursements", + "measure_label": "net disbursements", "measure_label_axes": [ "populationType", "measuredProperty", @@ -3061,11 +3115,13 @@ { "axis": "nettingBasis", "value": { - "ref": "Gross", - "label": "gross" + "ref": "Net", + "label": "net" } } ], + "concept_label": "official development assistance", + "published_tables": "OECD DAC2a", "unit_conversion": { "currencies": [ { @@ -5038,7 +5094,7 @@ } } ], - "rendered_sentence": "France's gross disbursements to the 44 Least Developed Countries for official development assistance, 1960 to 2024. Current US dollars · OECD DAC2a. This shows the 44 Least Developed Countries, each on its own.", + "rendered_sentence": "France's net disbursements to the 44 Least Developed Countries for official development assistance, 1960 to 2024. Current US dollars · OECD DAC2a. This shows the 44 Least Developed Countries, each on its own.", "sentence_plan": [ { "kind": "slot", @@ -5072,7 +5128,7 @@ }, { "kind": "slot", - "text": "gross disbursements", + "text": "net disbursements", "axis": "what", "segment": "heading", "entity_refs": [], @@ -5296,21 +5352,21 @@ { "request": { "method": "GET", - "origin_path": "/api/datasets/spec_c2f21170dfa9f31705e47ed60c8fa305/cv_66a0a4a0331d59b519aa1629dade3d99/files/sha256:e9513ce3953896d5b833a71546a5987a82e3f18219cd43eb987fc69dfab80321" + "origin_path": "/api/datasets/spec_d0fa2dd4c5ba67436b13a12bb98547d4/cv_070d2755d6bf2ffa39860ca05c717279/files/sha256:e394e0de88d7c5b0e9488b0169a229b2261005a5ab2d7b9a4d8e2dd925da5fa1" }, "response": { "status": 302, "headers": { "content-type": "text/html", - "location": "https://storage.googleapis.com/dev-fin-observatory-datasets-working/sha256%3Ae9513ce3953896d5b833a71546a5987a82e3f18219cd43eb987fc69dfab80321?X-Goog-Signature=redacted", - "x-dfo-trace-id": "75d565fbb9c948c8b131be201b1cf923" + "location": "https://storage.googleapis.com/dev-fin-observatory-datasets-working/sha256%3Ae394e0de88d7c5b0e9488b0169a229b2261005a5ab2d7b9a4d8e2dd925da5fa1?X-Goog-Signature=redacted", + "x-dfo-trace-id": "bb5a9505e2a64357a4be484a60822e8e" } } }, { "request": { "method": "GET", - "url": "https://storage.googleapis.com/dev-fin-observatory-datasets-working/sha256%3Ae9513ce3953896d5b833a71546a5987a82e3f18219cd43eb987fc69dfab80321?X-Goog-Signature=redacted" + "url": "https://storage.googleapis.com/dev-fin-observatory-datasets-working/sha256%3Ae394e0de88d7c5b0e9488b0169a229b2261005a5ab2d7b9a4d8e2dd925da5fa1?X-Goog-Signature=redacted" }, "response": { "status": 200, @@ -5324,7 +5380,7 @@ "expect": [ { "dataset": { - "rows": 2114, + "rows": 2128, "columns": [ "time_period", "financingProvider_label", @@ -5351,9 +5407,9 @@ "members": [ { "parts": [], - "spec_id": "spec_c2f21170dfa9f31705e47ed60c8fa305", - "content_version": "cv_66a0a4a0331d59b519aa1629dade3d99", - "sentence": "France's gross disbursements to the 44 Least Developed Countries for official development assistance, 1960 to 2024. Current US dollars · OECD DAC2a." + "spec_id": "spec_d0fa2dd4c5ba67436b13a12bb98547d4", + "content_version": "cv_070d2755d6bf2ffa39860ca05c717279", + "sentence": "France's net disbursements to the 44 Least Developed Countries for official development assistance, 1960 to 2024. Current US dollars · OECD DAC2a." } ], "missing": [] diff --git a/python/client-contract/src/dfo_client_contract/scenarios/fetch-spec-group-origin-rebound.parquet b/python/client-contract/src/dfo_client_contract/scenarios/fetch-spec-group-origin-rebound.parquet index 6c76c4a..c7afe73 100644 Binary files a/python/client-contract/src/dfo_client_contract/scenarios/fetch-spec-group-origin-rebound.parquet and b/python/client-contract/src/dfo_client_contract/scenarios/fetch-spec-group-origin-rebound.parquet differ diff --git a/python/client-contract/src/dfo_client_contract/scenarios/fetch-spec-known-sentence.json b/python/client-contract/src/dfo_client_contract/scenarios/fetch-spec-known-sentence.json index ecc048b..c23acae 100644 --- a/python/client-contract/src/dfo_client_contract/scenarios/fetch-spec-known-sentence.json +++ b/python/client-contract/src/dfo_client_contract/scenarios/fetch-spec-known-sentence.json @@ -5,8 +5,8 @@ "origin": { "kind": "recorded", "base_url": "https://dfo-dev-apis-zms5lj4zhq-nn.a.run.app/api", - "dfo_commit": "d80df9f5fd598b7345255470932d202ee5d49942", - "recorded_at": "2026-10-26T09:22:29Z" + "dfo_commit": "ccb6617922c839ce3cd5615a3bbb65c70bfe1bde", + "recorded_at": "2026-11-01T07:38:24Z" }, "call": [ { @@ -177,7 +177,7 @@ "status": 200, "headers": { "content-type": "application/json", - "x-dfo-trace-id": "b89cda3bb794448abf06b56c955d754e" + "x-dfo-trace-id": "27d2f0b694144799a0314850fb5d29bc" }, "json": { "schema_version": 1, @@ -584,7 +584,7 @@ "frame_grammar_version": "1.1.0", "origin_catalogue_build_id": "20261019T174519Z-2e5e8cfd", "served_from": "head", - "confirmed_at": "2026-10-26T09:18:06.976633+00:00" + "confirmed_at": "2026-11-01T07:37:46.482431+00:00" }, "warnings": [ { @@ -614,7 +614,7 @@ "created_at": "2026-10-23T16:58:47.734759+00:00", "tier": "working", "url": "/api/datasets/spec_cb5baa4161de718f18583060674dbca6/cv_bf242138f8d0a892c97da9373d1626f4/files/sha256:c44200969f19d73104d1bc24ebca905e59f749c2939234cdde10ba6f5a131170", - "enrichment_stamp": "08ed6c734fc69ea2204a21f4e1dd8b963f14dd1e03a2484c618049ac2e2d93d8" + "enrichment_stamp": "55887b871f7aa1c5d120cb2bee97086605351d5acfbec645ab027f562d0f65c5" }, { "artifact_digest": "sha256:d3a506bc9b95188583b5764592d2f1897c0665add660106b7f77c3e501000bb4", @@ -630,7 +630,7 @@ ], "series_count": 1, "output_options": { - "capability_version": "dset_76f5fa7244511c58", + "capability_version": "dset_5282a0674178a233", "columns": [ { "name": "stat_var", @@ -713,7 +713,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": false }, { "column": "financingProvider", @@ -725,7 +726,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": false }, { "column": "financingProvider", @@ -737,7 +739,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true }, { "column": "financingProvider", @@ -749,7 +752,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": false }, { "column": "financingProvider", @@ -761,7 +765,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true }, { "column": "financingProvider", @@ -773,7 +778,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true }, { "column": "financingProvider", @@ -785,7 +791,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true }, { "column": "financingRecipient", @@ -797,7 +804,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": false }, { "column": "financingRecipient", @@ -809,7 +817,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": false }, { "column": "financingRecipient", @@ -821,7 +830,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true }, { "column": "financingRecipient", @@ -833,7 +843,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": false }, { "column": "financingRecipient", @@ -845,7 +856,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true }, { "column": "financingRecipient", @@ -857,7 +869,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true }, { "column": "financingRecipient", @@ -869,7 +882,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true } ], "long_layout_defaults": [ @@ -898,7 +912,7 @@ ] } }, - "series_coverage_stamp": "e6e717ab8c77e84d010915893ede5809e9ecec67929a07cfafbcc2210edfa1eb", + "series_coverage_stamp": "ad27fd11738abb03d2d84dc214e223f04781609636cf678d0d08c385fb863d99", "retention": { "pinned": false, "held_until": "2026-11-19T13:59:18.051742Z" @@ -916,7 +930,7 @@ "headers": { "content-type": "text/html", "location": "https://storage.googleapis.com/dev-fin-observatory-datasets-working/sha256%3Ac44200969f19d73104d1bc24ebca905e59f749c2939234cdde10ba6f5a131170?X-Goog-Signature=redacted", - "x-dfo-trace-id": "cf3f86713afb44c98d21fbf9731d66e3" + "x-dfo-trace-id": "b00bcf5bd0ca432eac38be0de17b99ad" } } }, diff --git a/python/client-contract/src/dfo_client_contract/scenarios/fetch-spec-manifest-without-identity.json b/python/client-contract/src/dfo_client_contract/scenarios/fetch-spec-manifest-without-identity.json index 2e809f4..bc1a7a6 100644 --- a/python/client-contract/src/dfo_client_contract/scenarios/fetch-spec-manifest-without-identity.json +++ b/python/client-contract/src/dfo_client_contract/scenarios/fetch-spec-manifest-without-identity.json @@ -176,7 +176,7 @@ "status": 200, "headers": { "content-type": "application/json", - "x-dfo-trace-id": "b89cda3bb794448abf06b56c955d754e" + "x-dfo-trace-id": "27d2f0b694144799a0314850fb5d29bc" }, "json": { "schema_version": 1, @@ -518,7 +518,7 @@ "frame_grammar_version": "1.1.0", "origin_catalogue_build_id": "20261019T174519Z-2e5e8cfd", "served_from": "head", - "confirmed_at": "2026-10-26T09:18:06.976633+00:00" + "confirmed_at": "2026-11-01T07:37:46.482431+00:00" }, "warnings": [ { @@ -548,7 +548,7 @@ "created_at": "2026-10-23T16:58:47.734759+00:00", "tier": "working", "url": "/api/datasets/spec_cb5baa4161de718f18583060674dbca6/cv_bf242138f8d0a892c97da9373d1626f4/files/sha256:c44200969f19d73104d1bc24ebca905e59f749c2939234cdde10ba6f5a131170", - "enrichment_stamp": "08ed6c734fc69ea2204a21f4e1dd8b963f14dd1e03a2484c618049ac2e2d93d8" + "enrichment_stamp": "55887b871f7aa1c5d120cb2bee97086605351d5acfbec645ab027f562d0f65c5" }, { "artifact_digest": "sha256:d3a506bc9b95188583b5764592d2f1897c0665add660106b7f77c3e501000bb4", @@ -564,7 +564,7 @@ ], "series_count": 1, "output_options": { - "capability_version": "dset_76f5fa7244511c58", + "capability_version": "dset_5282a0674178a233", "columns": [ { "name": "stat_var", @@ -647,7 +647,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": false }, { "column": "financingProvider", @@ -659,7 +660,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": false }, { "column": "financingProvider", @@ -671,7 +673,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true }, { "column": "financingProvider", @@ -683,7 +686,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": false }, { "column": "financingProvider", @@ -695,7 +699,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true }, { "column": "financingProvider", @@ -707,7 +712,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true }, { "column": "financingProvider", @@ -719,7 +725,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true }, { "column": "financingRecipient", @@ -731,7 +738,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": false }, { "column": "financingRecipient", @@ -743,7 +751,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": false }, { "column": "financingRecipient", @@ -755,7 +764,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true }, { "column": "financingRecipient", @@ -767,7 +777,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": false }, { "column": "financingRecipient", @@ -779,7 +790,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true }, { "column": "financingRecipient", @@ -791,7 +803,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true }, { "column": "financingRecipient", @@ -803,7 +816,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true } ], "long_layout_defaults": [ @@ -832,7 +846,7 @@ ] } }, - "series_coverage_stamp": "e6e717ab8c77e84d010915893ede5809e9ecec67929a07cfafbcc2210edfa1eb", + "series_coverage_stamp": "ad27fd11738abb03d2d84dc214e223f04781609636cf678d0d08c385fb863d99", "retention": { "pinned": false, "held_until": "2026-11-19T13:59:18.051742Z" @@ -846,7 +860,7 @@ "error": { "class": "ContractError", "code": "contract_violation", - "trace_id": "b89cda3bb794448abf06b56c955d754e" + "trace_id": "27d2f0b694144799a0314850fb5d29bc" } } ] diff --git a/python/client-contract/src/dfo_client_contract/scenarios/fetch-spec-manifest-without-schema-version.json b/python/client-contract/src/dfo_client_contract/scenarios/fetch-spec-manifest-without-schema-version.json index ef7f6ec..a748edd 100644 --- a/python/client-contract/src/dfo_client_contract/scenarios/fetch-spec-manifest-without-schema-version.json +++ b/python/client-contract/src/dfo_client_contract/scenarios/fetch-spec-manifest-without-schema-version.json @@ -176,7 +176,7 @@ "status": 200, "headers": { "content-type": "application/json", - "x-dfo-trace-id": "b89cda3bb794448abf06b56c955d754e" + "x-dfo-trace-id": "27d2f0b694144799a0314850fb5d29bc" }, "json": { "schema_version": 1, @@ -582,7 +582,7 @@ "frame_grammar_version": "1.1.0", "origin_catalogue_build_id": "20261019T174519Z-2e5e8cfd", "served_from": "head", - "confirmed_at": "2026-10-26T09:18:06.976633+00:00" + "confirmed_at": "2026-11-01T07:37:46.482431+00:00" }, "warnings": [ { @@ -612,7 +612,7 @@ "created_at": "2026-10-23T16:58:47.734759+00:00", "tier": "working", "url": "/api/datasets/spec_cb5baa4161de718f18583060674dbca6/cv_bf242138f8d0a892c97da9373d1626f4/files/sha256:c44200969f19d73104d1bc24ebca905e59f749c2939234cdde10ba6f5a131170", - "enrichment_stamp": "08ed6c734fc69ea2204a21f4e1dd8b963f14dd1e03a2484c618049ac2e2d93d8" + "enrichment_stamp": "55887b871f7aa1c5d120cb2bee97086605351d5acfbec645ab027f562d0f65c5" }, { "artifact_digest": "sha256:d3a506bc9b95188583b5764592d2f1897c0665add660106b7f77c3e501000bb4", @@ -628,7 +628,7 @@ ], "series_count": 1, "output_options": { - "capability_version": "dset_76f5fa7244511c58", + "capability_version": "dset_5282a0674178a233", "columns": [ { "name": "stat_var", @@ -711,7 +711,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": false }, { "column": "financingProvider", @@ -723,7 +724,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": false }, { "column": "financingProvider", @@ -735,7 +737,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true }, { "column": "financingProvider", @@ -747,7 +750,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": false }, { "column": "financingProvider", @@ -759,7 +763,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true }, { "column": "financingProvider", @@ -771,7 +776,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true }, { "column": "financingProvider", @@ -783,7 +789,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true }, { "column": "financingRecipient", @@ -795,7 +802,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": false }, { "column": "financingRecipient", @@ -807,7 +815,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": false }, { "column": "financingRecipient", @@ -819,7 +828,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true }, { "column": "financingRecipient", @@ -831,7 +841,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": false }, { "column": "financingRecipient", @@ -843,7 +854,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true }, { "column": "financingRecipient", @@ -855,7 +867,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true }, { "column": "financingRecipient", @@ -867,7 +880,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true } ], "long_layout_defaults": [ @@ -896,7 +910,7 @@ ] } }, - "series_coverage_stamp": "e6e717ab8c77e84d010915893ede5809e9ecec67929a07cfafbcc2210edfa1eb", + "series_coverage_stamp": "ad27fd11738abb03d2d84dc214e223f04781609636cf678d0d08c385fb863d99", "retention": { "pinned": false, "held_until": "2026-11-19T13:59:18.051742Z" @@ -910,7 +924,7 @@ "error": { "class": "ContractError", "code": "contract_violation", - "trace_id": "b89cda3bb794448abf06b56c955d754e" + "trace_id": "27d2f0b694144799a0314850fb5d29bc" } } ] diff --git a/python/client-contract/src/dfo_client_contract/scenarios/fetch-spec-narrowed.json b/python/client-contract/src/dfo_client_contract/scenarios/fetch-spec-narrowed.json index 69f12eb..bf5a761 100644 --- a/python/client-contract/src/dfo_client_contract/scenarios/fetch-spec-narrowed.json +++ b/python/client-contract/src/dfo_client_contract/scenarios/fetch-spec-narrowed.json @@ -5,8 +5,8 @@ "origin": { "kind": "recorded", "base_url": "https://dfo-dev-apis-zms5lj4zhq-nn.a.run.app/api", - "dfo_commit": "d80df9f5fd598b7345255470932d202ee5d49942", - "recorded_at": "2026-10-26T09:22:13Z" + "dfo_commit": "ccb6617922c839ce3cd5615a3bbb65c70bfe1bde", + "recorded_at": "2026-11-01T07:37:41Z" }, "call": [ { @@ -184,7 +184,7 @@ "status": 200, "headers": { "content-type": "application/json", - "x-dfo-trace-id": "250fbb95951e4a8c8d847cbcde0ae4f9" + "x-dfo-trace-id": "a746de54b70e40c696df4f9f2e711908" }, "json": { "schema_version": 1, @@ -590,8 +590,8 @@ "family_member_digest": "9fd3643bbde505d9542fd3d090ddd549349765d12b6bad95b17271cbf297ea8c", "frame_grammar_version": "1.1.0", "origin_catalogue_build_id": "20261019T174519Z-2e5e8cfd", - "served_from": "head", - "confirmed_at": "2026-10-26T09:18:06.976633+00:00" + "served_from": "materialise", + "confirmed_at": "2026-11-01T07:37:46.482431+00:00" }, "warnings": [ { @@ -621,7 +621,7 @@ "created_at": "2026-10-23T16:58:47.734759+00:00", "tier": "working", "url": "/api/datasets/spec_cb5baa4161de718f18583060674dbca6/cv_bf242138f8d0a892c97da9373d1626f4/files/sha256:c44200969f19d73104d1bc24ebca905e59f749c2939234cdde10ba6f5a131170", - "enrichment_stamp": "08ed6c734fc69ea2204a21f4e1dd8b963f14dd1e03a2484c618049ac2e2d93d8" + "enrichment_stamp": "55887b871f7aa1c5d120cb2bee97086605351d5acfbec645ab027f562d0f65c5" }, { "artifact_digest": "sha256:d3a506bc9b95188583b5764592d2f1897c0665add660106b7f77c3e501000bb4", @@ -637,7 +637,7 @@ ], "series_count": 1, "output_options": { - "capability_version": "dset_76f5fa7244511c58", + "capability_version": "dset_5282a0674178a233", "columns": [ { "name": "stat_var", @@ -720,7 +720,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": false }, { "column": "financingProvider", @@ -732,7 +733,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": false }, { "column": "financingProvider", @@ -744,7 +746,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true }, { "column": "financingProvider", @@ -756,7 +759,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": false }, { "column": "financingProvider", @@ -768,7 +772,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true }, { "column": "financingProvider", @@ -780,7 +785,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true }, { "column": "financingProvider", @@ -792,7 +798,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true }, { "column": "financingRecipient", @@ -804,7 +811,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": false }, { "column": "financingRecipient", @@ -816,7 +824,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": false }, { "column": "financingRecipient", @@ -828,7 +837,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true }, { "column": "financingRecipient", @@ -840,7 +850,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": false }, { "column": "financingRecipient", @@ -852,7 +863,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true }, { "column": "financingRecipient", @@ -864,7 +876,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true }, { "column": "financingRecipient", @@ -876,7 +889,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true } ], "long_layout_defaults": [ @@ -905,7 +919,7 @@ ] } }, - "series_coverage_stamp": "e6e717ab8c77e84d010915893ede5809e9ecec67929a07cfafbcc2210edfa1eb", + "series_coverage_stamp": "ad27fd11738abb03d2d84dc214e223f04781609636cf678d0d08c385fb863d99", "retention": { "pinned": false, "held_until": "2026-11-19T13:59:18.051742Z" @@ -999,7 +1013,7 @@ "status": 200, "headers": { "content-type": "application/json", - "x-dfo-trace-id": "ff646392059e46e68f83a2753e921d6a" + "x-dfo-trace-id": "203e162341304fd082ccc7499fd37070" }, "json": { "schema_version": 1, @@ -1008,11 +1022,11 @@ "extract_skipped": true }, "diagnostics": { - "engine_build": "d80df9f5fd598b7345255470932d202ee5d49942", - "trace_id": "ff646392059e46e68f83a2753e921d6a", + "engine_build": "ccb6617922c839ce3cd5615a3bbb65c70bfe1bde", + "trace_id": "203e162341304fd082ccc7499fd37070", "warnings": [], "timing_ms": { - "total": 1, + "total": 173, "by_step": { "coverage": 0 } @@ -1025,9 +1039,39 @@ "variable_text": "dataset", "warnings": [], "timing_ms": { - "total": 0, + "total": 140, "by_step": { - "response_cache_part_memo": 0 + "validate": 4, + "phase_validate": 0, + "walk": 13, + "reread_arcs": 0, + "phase_reread_arcs": 0, + "detect_edits": 1, + "phase_detect_edits": 0, + "resolve_survivors": 0, + "phase_resolve_survivors": 0, + "shape": 4, + "phase_build_shape": 0, + "bind": 0, + "phase_build_bindings": 0, + "where_places": 1, + "phase_where_places": 0, + "materialise": 16, + "phase_materialise": 0, + "ground_related": 0, + "ground_units": 0, + "ground_facets": 0, + "ground_convert": 0, + "answer": 47, + "ground_gates": 4, + "phase_ground_build": 46, + "finalize_preview": 0, + "options": 2, + "finalize_related": 0, + "finalize_wholes": 0, + "finalize_relaunch": 1, + "phase_finalize": 0, + "served_entry": 1 } }, "entity_refs": [], @@ -1461,7 +1505,7 @@ "label": "OECD Terms and Conditions" } }, - "coverage_stamp": "e6e717ab8c77e84d010915893ede5809e9ecec67929a07cfafbcc2210edfa1eb", + "coverage_stamp": "ad27fd11738abb03d2d84dc214e223f04781609636cf678d0d08c385fb863d99", "facets": { "provenance": { "basis": "fallback", @@ -1519,7 +1563,7 @@ }, "relation": "child", "parent": "CRSCooperationModalityB", - "member_count": 1331, + "member_count": 1337, "served_rows": 4, "served_rows_exact": true } @@ -1588,7 +1632,7 @@ }, "relation": "child", "parent": "CRSTypeOfFinance100", - "member_count": 12672, + "member_count": 12745, "served_rows": 4, "served_rows_exact": true } @@ -1615,7 +1659,7 @@ "value_kind": "enum_value" }, "relation": "root", - "member_count": 14098, + "member_count": 14146, "served_rows": 4, "served_rows_exact": true } @@ -2026,7 +2070,7 @@ "start_year": 2020, "end_year": 2023 }, - "capability_version": "cap_765c9d2a0c7529b9" + "capability_version": "cap_4913302d7a6b6435" }, "confidence": "high", "available_at_place": true, @@ -2287,6 +2331,8 @@ } } ], + "concept_label": "basic health care", + "published_tables": "OECD Creditor Reporting System (CRS)", "open_axis_facts": [ { "property": "crsCooperationModality", @@ -4525,7 +4571,7 @@ "headers": { "content-type": "text/html", "location": "https://storage.googleapis.com/dev-fin-observatory-datasets-working/sha256%3Ac44200969f19d73104d1bc24ebca905e59f749c2939234cdde10ba6f5a131170?X-Goog-Signature=redacted", - "x-dfo-trace-id": "6a74097c16e04e21857031860d5c9de1" + "x-dfo-trace-id": "2d6a661d4c9a474b980ad239a19f5329" } } }, diff --git a/python/client-contract/src/dfo_client_contract/scenarios/fetch-spec-operation-failed-resubmitted.json b/python/client-contract/src/dfo_client_contract/scenarios/fetch-spec-operation-failed-resubmitted.json index 919f817..5a4faf9 100644 --- a/python/client-contract/src/dfo_client_contract/scenarios/fetch-spec-operation-failed-resubmitted.json +++ b/python/client-contract/src/dfo_client_contract/scenarios/fetch-spec-operation-failed-resubmitted.json @@ -11,10 +11,10 @@ { "op": "fetch", "spec": { - "spec_id": "spec_70ddf0ce6a9b3f147063f2adf37fab9e", + "spec_id": "spec_8d395f753219876fa459778f38499a80", "definition": { "schema_version": 1, - "spec_id": "spec_70ddf0ce6a9b3f147063f2adf37fab9e", + "spec_id": "spec_8d395f753219876fa459778f38499a80", "identity": { "identity_version": "spec1", "shape": { @@ -49,7 +49,7 @@ "property": "nettingBasis", "binding": { "state": "value", - "ref": "Gross" + "ref": "Net" } } ], @@ -226,12 +226,12 @@ }, "requested_window": { "kind": "range", - "start_year": 1967, + "start_year": 1968, "end_year": 2024 } } }, - "sentence": "Gross disbursements to the 133 G77 countries from the 32 DAC countries for official development assistance, 1967 to 2024. Current US dollars · OECD DAC2a.", + "sentence": "Net disbursements to the 133 G77 countries from the 32 DAC countries for official development assistance, 1968 to 2024. Current US dollars · OECD DAC2a.", "entity_groups": { "destination": { "label": "G77 countries", @@ -239,7 +239,8 @@ }, "origin": { "label": "DAC countries", - "group_id": "groups/OECD.DAC" + "group_id": "groups/OECD.DAC", + "sum_differs": true } } }, @@ -255,10 +256,10 @@ "schema_version": 1, "input": { "kind": "spec_id", - "spec_id": "spec_70ddf0ce6a9b3f147063f2adf37fab9e", + "spec_id": "spec_8d395f753219876fa459778f38499a80", "definition": { "schema_version": 1, - "spec_id": "spec_70ddf0ce6a9b3f147063f2adf37fab9e", + "spec_id": "spec_8d395f753219876fa459778f38499a80", "identity": { "identity_version": "spec1", "shape": { @@ -293,7 +294,7 @@ "property": "nettingBasis", "binding": { "state": "value", - "ref": "Gross" + "ref": "Net" } } ], @@ -470,7 +471,7 @@ }, "requested_window": { "kind": "range", - "start_year": 1967, + "start_year": 1968, "end_year": 2024 } } @@ -486,15 +487,15 @@ "status": 202, "headers": { "content-type": "application/json", - "location": "/api/datasets/operations/op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f", + "location": "/api/datasets/operations/op_d53662fbaac38ee0bd0801eab9630ebca0c8b467d33b0a1b2c6792d0cd83b7cf", "retry-after": "2", - "x-dfo-trace-id": "9e96509866ff4da09a698df1f19a5cbd" + "x-dfo-trace-id": "7fd3deb153d34f4b9afce2b95ffdd664" }, "json": { "operation": { - "operation_id": "op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f", + "operation_id": "op_d53662fbaac38ee0bd0801eab9630ebca0c8b467d33b0a1b2c6792d0cd83b7cf", "status": "pending", - "poll": "/api/datasets/operations/op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f", + "poll": "/api/datasets/operations/op_d53662fbaac38ee0bd0801eab9630ebca0c8b467d33b0a1b2c6792d0cd83b7cf", "retry_after_ms": 1500 } } @@ -503,20 +504,20 @@ { "request": { "method": "GET", - "path": "/datasets/operations/op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f" + "path": "/datasets/operations/op_d53662fbaac38ee0bd0801eab9630ebca0c8b467d33b0a1b2c6792d0cd83b7cf" }, "response": { "status": 200, "headers": { "content-type": "application/json", "retry-after": "2", - "x-dfo-trace-id": "6185b86217ef499bb5b6932299df1207" + "x-dfo-trace-id": "55b37040b90c4b51bb1432fb7f565e8d" }, "json": { "operation": { - "operation_id": "op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f", + "operation_id": "op_d53662fbaac38ee0bd0801eab9630ebca0c8b467d33b0a1b2c6792d0cd83b7cf", "status": "failed", - "poll": "/api/datasets/operations/op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f", + "poll": "/api/datasets/operations/op_d53662fbaac38ee0bd0801eab9630ebca0c8b467d33b0a1b2c6792d0cd83b7cf", "retry_after_ms": 1500 }, "error": { @@ -540,10 +541,10 @@ "schema_version": 1, "input": { "kind": "spec_id", - "spec_id": "spec_70ddf0ce6a9b3f147063f2adf37fab9e", + "spec_id": "spec_8d395f753219876fa459778f38499a80", "definition": { "schema_version": 1, - "spec_id": "spec_70ddf0ce6a9b3f147063f2adf37fab9e", + "spec_id": "spec_8d395f753219876fa459778f38499a80", "identity": { "identity_version": "spec1", "shape": { @@ -578,7 +579,7 @@ "property": "nettingBasis", "binding": { "state": "value", - "ref": "Gross" + "ref": "Net" } } ], @@ -755,7 +756,7 @@ }, "requested_window": { "kind": "range", - "start_year": 1967, + "start_year": 1968, "end_year": 2024 } } @@ -771,15 +772,15 @@ "status": 202, "headers": { "content-type": "application/json", - "location": "/api/datasets/operations/op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f", + "location": "/api/datasets/operations/op_d53662fbaac38ee0bd0801eab9630ebca0c8b467d33b0a1b2c6792d0cd83b7cf", "retry-after": "2", - "x-dfo-trace-id": "9e96509866ff4da09a698df1f19a5cbd" + "x-dfo-trace-id": "7fd3deb153d34f4b9afce2b95ffdd664" }, "json": { "operation": { - "operation_id": "op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f", + "operation_id": "op_d53662fbaac38ee0bd0801eab9630ebca0c8b467d33b0a1b2c6792d0cd83b7cf", "status": "pending", - "poll": "/api/datasets/operations/op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f", + "poll": "/api/datasets/operations/op_d53662fbaac38ee0bd0801eab9630ebca0c8b467d33b0a1b2c6792d0cd83b7cf", "retry_after_ms": 1500 } } @@ -788,24 +789,24 @@ { "request": { "method": "GET", - "path": "/datasets/operations/op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f" + "path": "/datasets/operations/op_d53662fbaac38ee0bd0801eab9630ebca0c8b467d33b0a1b2c6792d0cd83b7cf" }, "response": { "status": 200, "headers": { "content-type": "application/json", "retry-after": "2", - "x-dfo-trace-id": "6185b86217ef499bb5b6932299df1207" + "x-dfo-trace-id": "55b37040b90c4b51bb1432fb7f565e8d" }, "json": { "operation": { - "operation_id": "op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f", + "operation_id": "op_d53662fbaac38ee0bd0801eab9630ebca0c8b467d33b0a1b2c6792d0cd83b7cf", "status": "running", - "poll": "/api/datasets/operations/op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f", + "poll": "/api/datasets/operations/op_d53662fbaac38ee0bd0801eab9630ebca0c8b467d33b0a1b2c6792d0cd83b7cf", "retry_after_ms": 1500, "progress": { "rows_written": 0, - "estimate_rows": 107252 + "estimate_rows": 107148 } } } @@ -814,24 +815,24 @@ { "request": { "method": "GET", - "path": "/datasets/operations/op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f" + "path": "/datasets/operations/op_d53662fbaac38ee0bd0801eab9630ebca0c8b467d33b0a1b2c6792d0cd83b7cf" }, "response": { "status": 200, "headers": { "content-type": "application/json", "retry-after": "2", - "x-dfo-trace-id": "1ebea3ca2d15409c953cd716bdc1fccf" + "x-dfo-trace-id": "76621ada279a42da9405c03760d3fa30" }, "json": { "operation": { - "operation_id": "op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f", + "operation_id": "op_d53662fbaac38ee0bd0801eab9630ebca0c8b467d33b0a1b2c6792d0cd83b7cf", "status": "running", - "poll": "/api/datasets/operations/op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f", + "poll": "/api/datasets/operations/op_d53662fbaac38ee0bd0801eab9630ebca0c8b467d33b0a1b2c6792d0cd83b7cf", "retry_after_ms": 1500, "progress": { - "rows_written": 61927, - "estimate_rows": 107252 + "rows_written": 50967, + "estimate_rows": 107148 } } } @@ -840,24 +841,24 @@ { "request": { "method": "GET", - "path": "/datasets/operations/op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f" + "path": "/datasets/operations/op_d53662fbaac38ee0bd0801eab9630ebca0c8b467d33b0a1b2c6792d0cd83b7cf" }, "response": { "status": 200, "headers": { "content-type": "application/json", "retry-after": "2", - "x-dfo-trace-id": "94bb5a8a7c2041969d9a9118b75dc4aa" + "x-dfo-trace-id": "f489220d020f40cabbd29c2e1d57a188" }, "json": { "operation": { - "operation_id": "op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f", + "operation_id": "op_d53662fbaac38ee0bd0801eab9630ebca0c8b467d33b0a1b2c6792d0cd83b7cf", "status": "running", - "poll": "/api/datasets/operations/op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f", + "poll": "/api/datasets/operations/op_d53662fbaac38ee0bd0801eab9630ebca0c8b467d33b0a1b2c6792d0cd83b7cf", "retry_after_ms": 1500, "progress": { - "rows_written": 107252, - "estimate_rows": 107252 + "rows_written": 107148, + "estimate_rows": 107148 } } } @@ -866,24 +867,24 @@ { "request": { "method": "GET", - "path": "/datasets/operations/op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f" + "path": "/datasets/operations/op_d53662fbaac38ee0bd0801eab9630ebca0c8b467d33b0a1b2c6792d0cd83b7cf" }, "response": { "status": 200, "headers": { "content-type": "application/json", "retry-after": "2", - "x-dfo-trace-id": "c78757a54b9f4b6786a784f8a47ad5b4" + "x-dfo-trace-id": "9855026593bc4f158bc5bcdea3bd1809" }, "json": { "operation": { - "operation_id": "op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f", + "operation_id": "op_d53662fbaac38ee0bd0801eab9630ebca0c8b467d33b0a1b2c6792d0cd83b7cf", "status": "running", - "poll": "/api/datasets/operations/op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f", - "retry_after_ms": 1784, + "poll": "/api/datasets/operations/op_d53662fbaac38ee0bd0801eab9630ebca0c8b467d33b0a1b2c6792d0cd83b7cf", + "retry_after_ms": 1797, "progress": { - "rows_written": 107252, - "estimate_rows": 107252 + "rows_written": 107148, + "estimate_rows": 107148 } } } @@ -892,24 +893,24 @@ { "request": { "method": "GET", - "path": "/datasets/operations/op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f" + "path": "/datasets/operations/op_d53662fbaac38ee0bd0801eab9630ebca0c8b467d33b0a1b2c6792d0cd83b7cf" }, "response": { "status": 200, "headers": { "content-type": "application/json", "retry-after": "3", - "x-dfo-trace-id": "914bfd57942740b893ba9ca1b4f4591b" + "x-dfo-trace-id": "119eba2f4a1b446aa13d7abc8d39a2a9" }, "json": { "operation": { - "operation_id": "op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f", + "operation_id": "op_d53662fbaac38ee0bd0801eab9630ebca0c8b467d33b0a1b2c6792d0cd83b7cf", "status": "running", - "poll": "/api/datasets/operations/op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f", - "retry_after_ms": 2289, + "poll": "/api/datasets/operations/op_d53662fbaac38ee0bd0801eab9630ebca0c8b467d33b0a1b2c6792d0cd83b7cf", + "retry_after_ms": 2302, "progress": { - "rows_written": 107252, - "estimate_rows": 107252 + "rows_written": 107148, + "estimate_rows": 107148 } } } @@ -918,24 +919,24 @@ { "request": { "method": "GET", - "path": "/datasets/operations/op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f" + "path": "/datasets/operations/op_d53662fbaac38ee0bd0801eab9630ebca0c8b467d33b0a1b2c6792d0cd83b7cf" }, "response": { "status": 200, "headers": { "content-type": "application/json", "retry-after": "3", - "x-dfo-trace-id": "217766e0425f4916a393331295c4a7e7" + "x-dfo-trace-id": "1019c2a1661647d193bda3dd1a96847a" }, "json": { "operation": { - "operation_id": "op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f", + "operation_id": "op_d53662fbaac38ee0bd0801eab9630ebca0c8b467d33b0a1b2c6792d0cd83b7cf", "status": "running", - "poll": "/api/datasets/operations/op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f", - "retry_after_ms": 2934, + "poll": "/api/datasets/operations/op_d53662fbaac38ee0bd0801eab9630ebca0c8b467d33b0a1b2c6792d0cd83b7cf", + "retry_after_ms": 2919, "progress": { - "rows_written": 107252, - "estimate_rows": 107252 + "rows_written": 107148, + "estimate_rows": 107148 } } } @@ -944,24 +945,24 @@ { "request": { "method": "GET", - "path": "/datasets/operations/op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f" + "path": "/datasets/operations/op_d53662fbaac38ee0bd0801eab9630ebca0c8b467d33b0a1b2c6792d0cd83b7cf" }, "response": { "status": 200, "headers": { "content-type": "application/json", - "x-dfo-trace-id": "c501ba8d087b4561b2ff0e423c719ab0" + "x-dfo-trace-id": "2a08d19167d845478a587fcdca1b295b" }, "json": { "operation": { - "operation_id": "op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f", + "operation_id": "op_d53662fbaac38ee0bd0801eab9630ebca0c8b467d33b0a1b2c6792d0cd83b7cf", "status": "done" }, "manifest": { "schema_version": 1, "definition": { "schema_version": 1, - "spec_id": "spec_70ddf0ce6a9b3f147063f2adf37fab9e", + "spec_id": "spec_8d395f753219876fa459778f38499a80", "identity": { "shape": { "kind": "statvar_schema", @@ -993,7 +994,7 @@ }, { "binding": { - "ref": "Gross", + "ref": "Net", "state": "value" }, "property": "nettingBasis" @@ -1174,14 +1175,14 @@ "requested_window": { "kind": "range", "end_year": 2024, - "start_year": 1967 + "start_year": 1968 } } }, - "content_version": "cv_fafc60a507e03b0d42689fb1936127b9", - "prepared_at": "2026-10-26T09:22:44Z", + "content_version": "cv_e9cd9cba677e6dd0e2a81d5700d5edfb", + "prepared_at": "2026-11-01T07:38:40Z", "coverage": { - "rows": 107252, + "rows": 107148, "dimensions": [ { "label": "financingProvider", @@ -1203,14 +1204,14 @@ }, { "label": "years", - "count": 58 + "count": 57 } ], "window": { "kind": "range", "origin": "query", "end_year": 2024, - "start_year": 1967 + "start_year": 1968 } }, "citation": { @@ -1237,8 +1238,8 @@ "source_data_url": "https://webfs-dcd.oecd.org/files/dotStat/DSD_DAC2/Table2a_Data.zip", "attribution": "OECD (2026), OECD DAC2A, OECD Data Explorer, https://webfs-dcd.oecd.org/files/dotStat/DSD_DAC2/Table2a_Data.zip (accessed on 2026-10-12)", "update_cadence": "Quarterly", - "last_update": "2026-10-15", - "years_covered": "1960-2024", + "last_update": "2026-10-29", + "years_covered": "1960-2025", "granularity": "Annual, by provider and recipient", "currencies": [ "USD" @@ -1249,8 +1250,8 @@ "description": "The OECD publishes DAC2A in April, June, September and December. The complete table is downloaded from the OECD each time it is republished, and replaces the previous copy, so the data reflects the OECD's latest release." }, { - "transformation": "Exclude the partial preliminary year", - "description": "Before each full release, the OECD publishes preliminary data for the year that release covers, as reporters submit it. Until then, that year is partial, so the pipeline excludes it. Support for partial years is in development. Partial years will be marked incomplete, so they don't lead to incorrect or confusing analyses." + "transformation": "Mark the partial year", + "description": "The OECD publishes data for a year as donors report it, and its final release in December of the following year covers every donor. Until then, the year is partial. The pipeline publishes it, and the import's provenance names it in `partialObservationDate`." }, { "transformation": "Standardise providers and recipients", @@ -1270,13 +1271,23 @@ } ], "version_history": [ + { + "date": "2026-10-29", + "title": "Partial year published, marked as partial", + "changes": [ + { + "kind": "changed", + "note": "The partial year, which only some donors have reported ahead of the OECD's final release in December, is included, and the import's provenance marks it with `partialObservationDate`." + } + ] + }, { "date": "2026-10-15", - "title": "Partial preliminary year excluded", + "title": "Partial year excluded", "changes": [ { "kind": "changed", - "note": "The partial preliminary year published ahead of the next full release is excluded." + "note": "The partial year, which only some donors have reported ahead of the OECD's final release in December, is excluded." } ] }, @@ -1329,39 +1340,39 @@ "kind": "range", "origin": "query", "end_year": 2024, - "start_year": 1967 + "start_year": 1968 }, "graph_revision": null, "normalisations": [], "code_index_stamp": { - "exported_at": "2026-10-24T19:20:27Z", - "content_hash": "3d946d8f4986dbbe0fa3e5c4c917200381f529d89ce417c11daeb22df56eed99", + "exported_at": "2026-11-01T03:08:18Z", + "content_hash": "a1bde3be8710f5ba073e52aaaba73cf9156079c273c874372f54bb07a81b0f94", "graph_endpoint": "graph_release" }, "source_revisions": [ { "source": "provenance/OECDDAC2A", - "revision": "2026-10-15" + "revision": "2026-10-29" } ], - "capability_version": "dset_76f5fa7244511c58", - "materialiser_build": "d80df9f5fd598b7345255470932d202ee5d49942", + "capability_version": "dset_5282a0674178a233", + "materialiser_build": "ccb6617922c839ce3cd5615a3bbb65c70bfe1bde", "resolved_stat_vars": [ { - "ref": "dcid:Amount_FinancialFlow_Gross_Disbursement_DAC2aAidType206_Nominal", + "ref": "dcid:Amount_FinancialFlow_Net_Disbursement_DAC2aAidType206_Nominal", "roles": [ "financingProvider", "financingRecipient" ], - "observation_count": 107252 + "observation_count": 107148 } ], "family_member_count": 1, - "family_member_digest": "1a36e1a7292b1bfff95a5415de0be74cac7bb033217ed50e79faa8ce51a224c0", + "family_member_digest": "c2d373442ac21a31377df76cd343f156c72a530649757c399c6661cbf56c9a71", "frame_grammar_version": "1.1.0", - "origin_catalogue_build_id": "20261026T000018Z-0af2cac5", + "origin_catalogue_build_id": "20261029T171521Z-7d0a5854", "served_from": "materialise", - "confirmed_at": "2026-10-26T09:22:46.854499+00:00" + "confirmed_at": "2026-11-01T07:38:43.335353+00:00" }, "warnings": [], "diagnostics": [ @@ -1373,34 +1384,34 @@ ], "artifacts": [ { - "artifact_digest": "sha256:a8c742f8f416b2f3414c7a569f7c18b337c5ee9ae3012483583bad0b238f5c61", + "artifact_digest": "sha256:1effd75b0d46b45109033faa8adfba1dbdc83d285810fe8c878c953595456b57", "rendering": { "bundle": false, "format": "parquet", "layout": 4 }, - "bytes": 466531, + "bytes": 469908, "media_type": "application/vnd.apache.parquet", - "created_at": "2026-10-26T09:22:46.786678+00:00", + "created_at": "2026-11-01T07:38:43.262295+00:00", "tier": "working", - "url": "/api/datasets/spec_70ddf0ce6a9b3f147063f2adf37fab9e/cv_fafc60a507e03b0d42689fb1936127b9/files/sha256:a8c742f8f416b2f3414c7a569f7c18b337c5ee9ae3012483583bad0b238f5c61", - "enrichment_stamp": "08ed6c734fc69ea2204a21f4e1dd8b963f14dd1e03a2484c618049ac2e2d93d8" + "url": "/api/datasets/spec_8d395f753219876fa459778f38499a80/cv_e9cd9cba677e6dd0e2a81d5700d5edfb/files/sha256:1effd75b0d46b45109033faa8adfba1dbdc83d285810fe8c878c953595456b57", + "enrichment_stamp": "55887b871f7aa1c5d120cb2bee97086605351d5acfbec645ab027f562d0f65c5" }, { - "artifact_digest": "sha256:5247bafa55f84fe2f8bc348601acb955162c39a1a082e939945336470e5c5231", + "artifact_digest": "sha256:73e13b2b41415cb991b4416af6ddd4c6ccf9e2ebc9bbaa4818b197a9e6e9b1a2", "rendering": { "statistics": "series" }, - "bytes": 144985, + "bytes": 147458, "media_type": "application/vnd.apache.parquet", - "created_at": "2026-10-26T09:22:46.786678+00:00", + "created_at": "2026-11-01T07:38:43.262295+00:00", "tier": "working", - "url": "/api/datasets/spec_70ddf0ce6a9b3f147063f2adf37fab9e/cv_fafc60a507e03b0d42689fb1936127b9/files/sha256:5247bafa55f84fe2f8bc348601acb955162c39a1a082e939945336470e5c5231" + "url": "/api/datasets/spec_8d395f753219876fa459778f38499a80/cv_e9cd9cba677e6dd0e2a81d5700d5edfb/files/sha256:73e13b2b41415cb991b4416af6ddd4c6ccf9e2ebc9bbaa4818b197a9e6e9b1a2" } ], - "series_count": 3656, + "series_count": 3657, "output_options": { - "capability_version": "dset_76f5fa7244511c58", + "capability_version": "dset_5282a0674178a233", "columns": [ { "name": "stat_var", @@ -1424,7 +1435,7 @@ "name": "time_period", "kind": "grain", "droppable": false, - "distinct": 58 + "distinct": 57 }, { "name": "value", @@ -1483,7 +1494,8 @@ "covered": 32 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": false }, { "column": "financingProvider", @@ -1495,7 +1507,8 @@ "covered": 32 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": false }, { "column": "financingProvider", @@ -1507,7 +1520,8 @@ "covered": 32 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true }, { "column": "financingProvider", @@ -1519,7 +1533,8 @@ "covered": 32 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": false }, { "column": "financingProvider", @@ -1531,7 +1546,8 @@ "covered": 32 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true }, { "column": "financingProvider", @@ -1543,7 +1559,8 @@ "covered": 32 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true }, { "column": "financingProvider", @@ -1555,7 +1572,8 @@ "covered": 32 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true }, { "column": "financingRecipient", @@ -1567,7 +1585,8 @@ "covered": 133 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": false }, { "column": "financingRecipient", @@ -1585,7 +1604,8 @@ "label": "South Sudan" } ], - "truncated": false + "truncated": false, + "in_long_layout": false }, { "column": "financingRecipient", @@ -1597,7 +1617,8 @@ "covered": 133 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true }, { "column": "financingRecipient", @@ -1609,7 +1630,8 @@ "covered": 133 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": false }, { "column": "financingRecipient", @@ -1621,7 +1643,8 @@ "covered": 133 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true }, { "column": "financingRecipient", @@ -1633,7 +1656,8 @@ "covered": 133 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true }, { "column": "financingRecipient", @@ -1645,7 +1669,8 @@ "covered": 133 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true } ], "long_layout_defaults": [ @@ -1664,7 +1689,7 @@ "varying": [ { "column": "time_period", - "distinct": 58 + "distinct": 57 } ] }, @@ -1688,7 +1713,7 @@ "varying": [ { "column": "time_period", - "distinct": 58 + "distinct": 57 } ] }, @@ -1747,10 +1772,10 @@ ] } }, - "series_coverage_stamp": "e6e717ab8c77e84d010915893ede5809e9ecec67929a07cfafbcc2210edfa1eb", + "series_coverage_stamp": "ad27fd11738abb03d2d84dc214e223f04781609636cf678d0d08c385fb863d99", "retention": { "pinned": false, - "held_until": "2026-11-25T09:22:46.785219Z" + "held_until": "2026-12-01T07:38:43.261993Z" } } } @@ -1759,21 +1784,21 @@ { "request": { "method": "GET", - "origin_path": "/api/datasets/spec_70ddf0ce6a9b3f147063f2adf37fab9e/cv_fafc60a507e03b0d42689fb1936127b9/files/sha256:a8c742f8f416b2f3414c7a569f7c18b337c5ee9ae3012483583bad0b238f5c61" + "origin_path": "/api/datasets/spec_8d395f753219876fa459778f38499a80/cv_e9cd9cba677e6dd0e2a81d5700d5edfb/files/sha256:1effd75b0d46b45109033faa8adfba1dbdc83d285810fe8c878c953595456b57" }, "response": { "status": 302, "headers": { "content-type": "text/html", - "location": "https://storage.googleapis.com/dev-fin-observatory-datasets-working/sha256%3Aa8c742f8f416b2f3414c7a569f7c18b337c5ee9ae3012483583bad0b238f5c61?X-Goog-Signature=redacted", - "x-dfo-trace-id": "22f0d88923c14d74825b5f14d41c05b8" + "location": "https://storage.googleapis.com/dev-fin-observatory-datasets-working/sha256%3A1effd75b0d46b45109033faa8adfba1dbdc83d285810fe8c878c953595456b57?X-Goog-Signature=redacted", + "x-dfo-trace-id": "0758c8ebc1d44bb896d7880cc101fd6a" } } }, { "request": { "method": "GET", - "url": "https://storage.googleapis.com/dev-fin-observatory-datasets-working/sha256%3Aa8c742f8f416b2f3414c7a569f7c18b337c5ee9ae3012483583bad0b238f5c61?X-Goog-Signature=redacted" + "url": "https://storage.googleapis.com/dev-fin-observatory-datasets-working/sha256%3A1effd75b0d46b45109033faa8adfba1dbdc83d285810fe8c878c953595456b57?X-Goog-Signature=redacted" }, "response": { "status": 200, @@ -1787,7 +1812,7 @@ "expect": [ { "dataset": { - "rows": 107252, + "rows": 107148, "columns": [ "time_period", "financingProvider_label", @@ -1814,24 +1839,24 @@ "members": [ { "parts": [], - "spec_id": "spec_70ddf0ce6a9b3f147063f2adf37fab9e", - "content_version": "cv_fafc60a507e03b0d42689fb1936127b9", - "sentence": "Gross disbursements to the 133 G77 countries from the 32 DAC countries for official development assistance, 1967 to 2024. Current US dollars · OECD DAC2a." + "spec_id": "spec_8d395f753219876fa459778f38499a80", + "content_version": "cv_e9cd9cba677e6dd0e2a81d5700d5edfb", + "sentence": "Net disbursements to the 133 G77 countries from the 32 DAC countries for official development assistance, 1968 to 2024. Current US dollars · OECD DAC2a." } ], "missing": [], "long_builds": [ { - "operation_id": "op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f", + "operation_id": "op_d53662fbaac38ee0bd0801eab9630ebca0c8b467d33b0a1b2c6792d0cd83b7cf", "poll_waits": [ 1.5, 1.5, 1.5, 1.5, 1.5, - 1.784, - 2.289, - 2.934 + 1.797, + 2.302, + 2.919 ], "resubmissions": 1 } diff --git a/python/client-contract/src/dfo_client_contract/scenarios/fetch-spec-party-totals-kept.json b/python/client-contract/src/dfo_client_contract/scenarios/fetch-spec-party-totals-kept.json index 90b582d..0cc319e 100644 --- a/python/client-contract/src/dfo_client_contract/scenarios/fetch-spec-party-totals-kept.json +++ b/python/client-contract/src/dfo_client_contract/scenarios/fetch-spec-party-totals-kept.json @@ -5,17 +5,17 @@ "origin": { "kind": "recorded", "base_url": "https://dfo-dev-apis-zms5lj4zhq-nn.a.run.app/api", - "dfo_commit": "d80df9f5fd598b7345255470932d202ee5d49942", - "recorded_at": "2026-10-26T09:22:22Z" + "dfo_commit": "ccb6617922c839ce3cd5615a3bbb65c70bfe1bde", + "recorded_at": "2026-11-01T07:38:14Z" }, "call": [ { "op": "fetch", "spec": { - "spec_id": "spec_70ddf0ce6a9b3f147063f2adf37fab9e", + "spec_id": "spec_b05b2b3ee21debf9e2ac3fbe03e05f94", "definition": { "schema_version": 1, - "spec_id": "spec_70ddf0ce6a9b3f147063f2adf37fab9e", + "spec_id": "spec_b05b2b3ee21debf9e2ac3fbe03e05f94", "identity": { "identity_version": "spec1", "shape": { @@ -50,7 +50,7 @@ "property": "nettingBasis", "binding": { "state": "value", - "ref": "Gross" + "ref": "Net" } } ], @@ -232,7 +232,7 @@ } } }, - "sentence": "Gross disbursements to the 133 G77 countries from the 32 DAC countries for official development assistance, 1967 to 2024. Current US dollars · OECD DAC2a.", + "sentence": "Net disbursements to the 133 G77 countries from the 32 DAC countries for official development assistance, 1967 to 2024. Current US dollars · OECD DAC2a.", "entity_groups": { "destination": { "label": "G77 countries", @@ -240,7 +240,8 @@ }, "origin": { "label": "DAC countries", - "group_id": "groups/OECD.DAC" + "group_id": "groups/OECD.DAC", + "sum_differs": true } } }, @@ -266,10 +267,10 @@ "schema_version": 1, "input": { "kind": "spec_id", - "spec_id": "spec_70ddf0ce6a9b3f147063f2adf37fab9e", + "spec_id": "spec_b05b2b3ee21debf9e2ac3fbe03e05f94", "definition": { "schema_version": 1, - "spec_id": "spec_70ddf0ce6a9b3f147063f2adf37fab9e", + "spec_id": "spec_b05b2b3ee21debf9e2ac3fbe03e05f94", "identity": { "identity_version": "spec1", "shape": { @@ -304,7 +305,7 @@ "property": "nettingBasis", "binding": { "state": "value", - "ref": "Gross" + "ref": "Net" } } ], @@ -509,13 +510,13 @@ "status": 200, "headers": { "content-type": "application/json", - "x-dfo-trace-id": "7459cea38c154e609d1f2142b94f4cbe" + "x-dfo-trace-id": "f802bd2833054fbebe1769dc8f96089f" }, "json": { "schema_version": 1, "definition": { "schema_version": 1, - "spec_id": "spec_73897fdfb0206fcf27c5898b353348fb", + "spec_id": "spec_e14699f9dcd167f0211081a726ae1031", "identity": { "shape": { "kind": "statvar_schema", @@ -547,7 +548,7 @@ }, { "binding": { - "ref": "Gross", + "ref": "Net", "state": "value" }, "property": "nettingBasis" @@ -566,8 +567,8 @@ } } }, - "content_version": "cv_2aa4cc2fd852cd9b84347c61d07d609a", - "prepared_at": "2026-10-12T18:33:25Z", + "content_version": "cv_574e68a18917407b0f5534cfc9ff001b", + "prepared_at": "2026-10-15T09:59:06Z", "coverage": { "rows": 111, "dimensions": [ @@ -602,7 +603,7 @@ } }, "citation": { - "text": "OECD DAC2A via ONE DFO, retrieved 2026-10-12", + "text": "OECD DAC2A (2026), via the Development Finance Observatory", "sources": [ { "ref": "provenance/OECDDAC2A", @@ -705,11 +706,11 @@ "end_year": 2022, "start_year": 2022 }, - "graph_revision": "dfo-dev-dc-datacommons-service-00242-zfr", + "graph_revision": "dfo-dev-dc-datacommons-service-00249-9gv", "normalisations": [], "code_index_stamp": { - "exported_at": "2026-10-11T15:49:13Z", - "content_hash": "952a221e6d43254927fcb75abbf12ce7ba03285fbfeef7d9913e2ddcf49f904c", + "exported_at": "2026-10-13T21:51:17Z", + "content_hash": "602c7022fc21c17540a6873d93196ad6b967eaae3e71f9dce6dec178a735daf4", "graph_endpoint": "https://dfo-dev-dc-datacommons-service-zms5lj4zhq-nn.a.run.app" }, "source_revisions": [ @@ -718,11 +719,11 @@ "revision": "2026-10-12" } ], - "capability_version": "dset_5c3f5b0bf4cd9569", - "materialiser_build": "cd25922ac45834a7c7d0193d3b3ee3d7e9cc7b55", + "capability_version": "dset_1e6cd9546fac19e9", + "materialiser_build": "1d29a70e59f70570c5ed8d610ec83291c8eb6f54", "resolved_stat_vars": [ { - "ref": "dcid:Amount_FinancialFlow_Gross_Disbursement_DAC2aAidType206_Nominal", + "ref": "dcid:Amount_FinancialFlow_Net_Disbursement_DAC2aAidType206_Nominal", "roles": [ "financingProvider", "financingRecipient" @@ -731,11 +732,11 @@ } ], "family_member_count": 1, - "family_member_digest": "1a36e1a7292b1bfff95a5415de0be74cac7bb033217ed50e79faa8ce51a224c0", + "family_member_digest": "c2d373442ac21a31377df76cd343f156c72a530649757c399c6661cbf56c9a71", "frame_grammar_version": "1.1.0", - "origin_catalogue_build_id": "20261012T163104Z-67f98b87", + "origin_catalogue_build_id": "20261013T114555Z-613cf5c2", "served_from": "head", - "confirmed_at": "2026-10-26T09:18:21.103020+00:00" + "confirmed_at": "2026-11-01T07:38:10.731097+00:00" }, "warnings": [], "diagnostics": [ @@ -747,34 +748,34 @@ ], "artifacts": [ { - "artifact_digest": "sha256:05d0cbf59e8dddd7162104bf8e2edc406fc402a0b8d0d971452d01b07b0ee426", + "artifact_digest": "sha256:7ef1038eb25d978077bb4f5b9c54e940052ccd2aedd3284e6fb9739f1deca1f4", "rendering": { "bundle": false, "format": "parquet", "layout": 4 }, - "bytes": 10932, + "bytes": 10911, "media_type": "application/vnd.apache.parquet", - "created_at": "2026-10-25T13:51:32.998697+00:00", + "created_at": "2026-11-01T07:38:12.547249+00:00", "tier": "working", - "url": "/api/datasets/spec_73897fdfb0206fcf27c5898b353348fb/cv_2aa4cc2fd852cd9b84347c61d07d609a/files/sha256:05d0cbf59e8dddd7162104bf8e2edc406fc402a0b8d0d971452d01b07b0ee426", - "enrichment_stamp": "08ed6c734fc69ea2204a21f4e1dd8b963f14dd1e03a2484c618049ac2e2d93d8" + "url": "/api/datasets/spec_e14699f9dcd167f0211081a726ae1031/cv_574e68a18917407b0f5534cfc9ff001b/files/sha256:7ef1038eb25d978077bb4f5b9c54e940052ccd2aedd3284e6fb9739f1deca1f4", + "enrichment_stamp": "55887b871f7aa1c5d120cb2bee97086605351d5acfbec645ab027f562d0f65c5" }, { - "artifact_digest": "sha256:8682dea270c469411916b6758279fdda0f4c989dac40b35509802141c8f7de22", + "artifact_digest": "sha256:3bb5d3b2b26768e57c233ccc76a2b1c79fdb7c916d105a2dbfd6a25646efd3c9", "rendering": { "statistics": "series" }, - "bytes": 10113, + "bytes": 10059, "media_type": "application/vnd.apache.parquet", - "created_at": "2026-10-12T18:21:54.977252+00:00", + "created_at": "2026-10-15T09:59:06.850277+00:00", "tier": "working", - "url": "/api/datasets/spec_73897fdfb0206fcf27c5898b353348fb/cv_2aa4cc2fd852cd9b84347c61d07d609a/files/sha256:8682dea270c469411916b6758279fdda0f4c989dac40b35509802141c8f7de22" + "url": "/api/datasets/spec_e14699f9dcd167f0211081a726ae1031/cv_574e68a18917407b0f5534cfc9ff001b/files/sha256:3bb5d3b2b26768e57c233ccc76a2b1c79fdb7c916d105a2dbfd6a25646efd3c9" } ], "series_count": 111, "output_options": { - "capability_version": "dset_76f5fa7244511c58", + "capability_version": "dset_5282a0674178a233", "columns": [ { "name": "stat_var", @@ -899,7 +900,8 @@ "label": "Conrad N. Hilton Foundation" } ], - "truncated": true + "truncated": true, + "in_long_layout": false }, { "column": "financingProvider", @@ -953,7 +955,8 @@ "label": "Conrad N. Hilton Foundation" } ], - "truncated": true + "truncated": true, + "in_long_layout": false }, { "column": "financingProvider", @@ -965,7 +968,8 @@ "covered": 111 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true }, { "column": "financingProvider", @@ -977,7 +981,8 @@ "covered": 111 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": false }, { "column": "financingProvider", @@ -989,7 +994,8 @@ "covered": 111 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true }, { "column": "financingProvider", @@ -1001,7 +1007,8 @@ "covered": 111 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true }, { "column": "financingProvider", @@ -1013,7 +1020,8 @@ "covered": 111 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true }, { "column": "financingRecipient", @@ -1025,7 +1033,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": false }, { "column": "financingRecipient", @@ -1037,7 +1046,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": false }, { "column": "financingRecipient", @@ -1049,7 +1059,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true }, { "column": "financingRecipient", @@ -1061,7 +1072,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": false }, { "column": "financingRecipient", @@ -1073,7 +1085,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true }, { "column": "financingRecipient", @@ -1085,7 +1098,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true }, { "column": "financingRecipient", @@ -1097,7 +1111,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true } ], "long_layout_defaults": [ @@ -1126,7 +1141,7 @@ ] } }, - "series_coverage_stamp": "e6e717ab8c77e84d010915893ede5809e9ecec67929a07cfafbcc2210edfa1eb", + "series_coverage_stamp": "ad27fd11738abb03d2d84dc214e223f04781609636cf678d0d08c385fb863d99", "retention": { "pinned": true } @@ -1176,7 +1191,7 @@ }, { "binding": { - "ref": "Gross", + "ref": "Net", "state": "value" }, "property": "nettingBasis" @@ -1203,7 +1218,7 @@ "status": 200, "headers": { "content-type": "application/json", - "x-dfo-trace-id": "ccdbf2ec39f8429ab9c3b8b0f3bb1a92" + "x-dfo-trace-id": "a5753a06386f4de3874484b22fda6f84" }, "json": { "schema_version": 1, @@ -1212,11 +1227,11 @@ "extract_skipped": true }, "diagnostics": { - "engine_build": "d80df9f5fd598b7345255470932d202ee5d49942", - "trace_id": "ccdbf2ec39f8429ab9c3b8b0f3bb1a92", + "engine_build": "ccb6617922c839ce3cd5615a3bbb65c70bfe1bde", + "trace_id": "a5753a06386f4de3874484b22fda6f84", "warnings": [], "timing_ms": { - "total": 2, + "total": 4, "by_step": { "coverage": 0 } @@ -1237,7 +1252,7 @@ "code": "whole_total_available", "severity": "info", "message": "The source publishes the total of every official donor as official donors (DAC); a sum of the listed donors includes private donors and differs from it.", - "spec_id": "spec_73897fdfb0206fcf27c5898b353348fb", + "spec_id": "spec_e14699f9dcd167f0211081a726ae1031", "params": { "total": "DACOfficialDonors", "total_label": "official donors (DAC)", @@ -1246,9 +1261,10 @@ } ], "timing_ms": { - "total": 0, + "total": 1, "by_step": { - "response_cache_part_memo": 0 + "response_cache_part_memo": 0, + "served_entry": 1 } }, "entity_refs": [], @@ -1264,10 +1280,10 @@ ], "status": "definite", "spec": { - "spec_id": "spec_73897fdfb0206fcf27c5898b353348fb", + "spec_id": "spec_e14699f9dcd167f0211081a726ae1031", "definition": { "schema_version": 1, - "spec_id": "spec_73897fdfb0206fcf27c5898b353348fb", + "spec_id": "spec_e14699f9dcd167f0211081a726ae1031", "identity": { "identity_version": "spec1", "shape": { @@ -1302,7 +1318,7 @@ "property": "nettingBasis", "binding": { "state": "value", - "ref": "Gross" + "ref": "Net" } } ], @@ -1321,7 +1337,7 @@ "resolved": { "shape": { "shape_id": "financialflow_amount_measuredvalue_nominal_family_f096b1ba", - "label": "gross disbursements (official development assistance)", + "label": "net disbursements (official development assistance)", "population_type": { "ref": "FinancialFlow", "label": "financial flow" @@ -1386,7 +1402,7 @@ } ], "member_count": 1, - "member_digest": "1a36e1a7292b1bfff95a5415de0be74cac7bb033217ed50e79faa8ce51a224c0", + "member_digest": "c2d373442ac21a31377df76cd343f156c72a530649757c399c6661cbf56c9a71", "refine_supported": true, "data_commons": [ { @@ -1451,8 +1467,8 @@ "kind": "value", "value": { "ref": { - "ref": "Gross", - "label": "gross" + "ref": "Net", + "label": "net" }, "value_kind": "enum_value" } @@ -1618,7 +1634,7 @@ "label": "OECD Terms and Conditions" } }, - "coverage_stamp": "e6e717ab8c77e84d010915893ede5809e9ecec67929a07cfafbcc2210edfa1eb", + "coverage_stamp": "ad27fd11738abb03d2d84dc214e223f04781609636cf678d0d08c385fb863d99", "facets": { "provenance": { "basis": "fallback", @@ -1664,60 +1680,47 @@ "relation": "child", "parent": "DAC2aAidType206", "member_count": 2, - "served_rows": 27, + "served_rows": 32, "served_rows_exact": true }, { "value": { "ref": { - "ref": "DAC2aAidType201", - "label": "ODA grant" + "ref": "DAC2aAidType219", + "label": "recovery on ODA grants and capital subscriptions" }, "value_kind": "enum_value" }, "relation": "child", "parent": "DAC2aAidType206", "member_count": 1, - "served_rows": 109, - "served_rows_exact": true - }, - { - "value": { - "ref": { - "ref": "DAC2aAidType207", - "label": "free-standing technical co-operation" - }, - "value_kind": "enum_value" - }, - "relation": "root", - "member_count": 1, - "served_rows": 45, + "served_rows": 26, "served_rows_exact": true }, { "value": { "ref": { - "ref": "DAC2aAidType213", - "label": "developmental food aid" + "ref": "DAC2aAidType209", + "label": "interest received on ODA lending" }, "value_kind": "enum_value" }, "relation": "root", "member_count": 1, - "served_rows": 15, + "served_rows": 14, "served_rows_exact": true }, { "value": { "ref": { - "ref": "DAC2aAidType216", - "label": "humanitarian aid" + "ref": "DAC2aAidType250", + "label": "official development assistance excluding debt relief" }, "value_kind": "enum_value" }, "relation": "root", "member_count": 1, - "served_rows": 42, + "served_rows": 111, "served_rows_exact": true } ], @@ -1767,11 +1770,11 @@ "source": "observed" } ], - "rendered_sentence": "Gross disbursements to Kenya from 96 providers for official development assistance in 2022. Current US dollars · OECD DAC2a.", + "rendered_sentence": "Net disbursements to Kenya from 96 providers for official development assistance in 2022. Current US dollars · OECD DAC2a.", "sentence_plan": [ { "kind": "slot", - "text": "Gross disbursements", + "text": "Net disbursements", "axis": "what", "segment": "heading", "entity_refs": [], @@ -2010,8 +2013,8 @@ "binding_kind": "value", "refs": [ { - "ref": "Gross", - "label": "gross" + "ref": "Net", + "label": "net" } ], "provenance": "binder" @@ -2067,7 +2070,7 @@ "start_year": 2022, "end_year": 2022 }, - "capability_version": "cap_765c9d2a0c7529b9" + "capability_version": "cap_4913302d7a6b6435" }, "confidence": "high", "available_at_place": true, @@ -2075,7 +2078,7 @@ { "definition": { "schema_version": 1, - "spec_id": "spec_e14699f9dcd167f0211081a726ae1031", + "spec_id": "spec_73897fdfb0206fcf27c5898b353348fb", "identity": { "identity_version": "spec1", "shape": { @@ -2110,7 +2113,7 @@ "property": "nettingBasis", "binding": { "state": "value", - "ref": "Net" + "ref": "Gross" } } ], @@ -2126,7 +2129,7 @@ } } }, - "label": "net disbursements", + "label": "gross disbursements", "axis": "what", "measure_axis_values": [ { @@ -2160,8 +2163,8 @@ { "axis": "nettingBasis", "value": { - "ref": "Net", - "label": "net" + "ref": "Gross", + "label": "gross" } } ], @@ -2169,7 +2172,7 @@ "served_rows_exact": true } ], - "measure_label": "gross disbursements", + "measure_label": "net disbursements", "measure_label_axes": [ "populationType", "measuredProperty", @@ -2209,16 +2212,19 @@ { "axis": "nettingBasis", "value": { - "ref": "Gross", - "label": "gross" + "ref": "Net", + "label": "net" } } ], + "concept_label": "official development assistance", + "published_tables": "OECD DAC2a", "role_axis_facts": [ { "role": "origin", "member_count": 96, - "members_available": true + "members_available": true, + "holds_multilaterals": true } ], "unit_conversion": { @@ -4172,11 +4178,11 @@ } } ], - "rendered_sentence": "Gross disbursements to Kenya from 96 providers for official development assistance in 2022. Current US dollars · OECD DAC2a. Assumed: every provider.", + "rendered_sentence": "Net disbursements to Kenya from 96 providers for official development assistance in 2022. Current US dollars · OECD DAC2a. Assumed: every provider.", "sentence_plan": [ { "kind": "slot", - "text": "Gross disbursements", + "text": "Net disbursements", "axis": "what", "segment": "heading", "entity_refs": [], @@ -4393,21 +4399,21 @@ { "request": { "method": "GET", - "origin_path": "/api/datasets/spec_73897fdfb0206fcf27c5898b353348fb/cv_2aa4cc2fd852cd9b84347c61d07d609a/files/sha256:05d0cbf59e8dddd7162104bf8e2edc406fc402a0b8d0d971452d01b07b0ee426" + "origin_path": "/api/datasets/spec_e14699f9dcd167f0211081a726ae1031/cv_574e68a18917407b0f5534cfc9ff001b/files/sha256:7ef1038eb25d978077bb4f5b9c54e940052ccd2aedd3284e6fb9739f1deca1f4" }, "response": { "status": 302, "headers": { "content-type": "text/html", - "location": "https://storage.googleapis.com/dev-fin-observatory-datasets-working/sha256%3A05d0cbf59e8dddd7162104bf8e2edc406fc402a0b8d0d971452d01b07b0ee426?X-Goog-Signature=redacted", - "x-dfo-trace-id": "3c0742cfbe724089ab0e8e2a15bfa9ce" + "location": "https://storage.googleapis.com/dev-fin-observatory-datasets-working/sha256%3A7ef1038eb25d978077bb4f5b9c54e940052ccd2aedd3284e6fb9739f1deca1f4?X-Goog-Signature=redacted", + "x-dfo-trace-id": "3161b93c0e844e15934681b0752bdaa3" } } }, { "request": { "method": "GET", - "url": "https://storage.googleapis.com/dev-fin-observatory-datasets-working/sha256%3A05d0cbf59e8dddd7162104bf8e2edc406fc402a0b8d0d971452d01b07b0ee426?X-Goog-Signature=redacted" + "url": "https://storage.googleapis.com/dev-fin-observatory-datasets-working/sha256%3A7ef1038eb25d978077bb4f5b9c54e940052ccd2aedd3284e6fb9739f1deca1f4?X-Goog-Signature=redacted" }, "response": { "status": 200, @@ -4448,9 +4454,9 @@ "members": [ { "parts": [], - "spec_id": "spec_73897fdfb0206fcf27c5898b353348fb", - "content_version": "cv_2aa4cc2fd852cd9b84347c61d07d609a", - "sentence": "Gross disbursements to Kenya from 96 providers for official development assistance in 2022. Current US dollars · OECD DAC2a." + "spec_id": "spec_e14699f9dcd167f0211081a726ae1031", + "content_version": "cv_574e68a18917407b0f5534cfc9ff001b", + "sentence": "Net disbursements to Kenya from 96 providers for official development assistance in 2022. Current US dollars · OECD DAC2a." } ], "missing": [] diff --git a/python/client-contract/src/dfo_client_contract/scenarios/fetch-spec-party-totals-kept.parquet b/python/client-contract/src/dfo_client_contract/scenarios/fetch-spec-party-totals-kept.parquet index e39f858..1bab295 100644 Binary files a/python/client-contract/src/dfo_client_contract/scenarios/fetch-spec-party-totals-kept.parquet and b/python/client-contract/src/dfo_client_contract/scenarios/fetch-spec-party-totals-kept.parquet differ diff --git a/python/client-contract/src/dfo_client_contract/scenarios/fetch-spec-party-totals-left-out.json b/python/client-contract/src/dfo_client_contract/scenarios/fetch-spec-party-totals-left-out.json index 957c35b..38559ce 100644 --- a/python/client-contract/src/dfo_client_contract/scenarios/fetch-spec-party-totals-left-out.json +++ b/python/client-contract/src/dfo_client_contract/scenarios/fetch-spec-party-totals-left-out.json @@ -5,17 +5,17 @@ "origin": { "kind": "recorded", "base_url": "https://dfo-dev-apis-zms5lj4zhq-nn.a.run.app/api", - "dfo_commit": "d80df9f5fd598b7345255470932d202ee5d49942", - "recorded_at": "2026-10-26T09:22:19Z" + "dfo_commit": "ccb6617922c839ce3cd5615a3bbb65c70bfe1bde", + "recorded_at": "2026-11-01T07:37:58Z" }, "call": [ { "op": "fetch", "spec": { - "spec_id": "spec_70ddf0ce6a9b3f147063f2adf37fab9e", + "spec_id": "spec_b05b2b3ee21debf9e2ac3fbe03e05f94", "definition": { "schema_version": 1, - "spec_id": "spec_70ddf0ce6a9b3f147063f2adf37fab9e", + "spec_id": "spec_b05b2b3ee21debf9e2ac3fbe03e05f94", "identity": { "identity_version": "spec1", "shape": { @@ -50,7 +50,7 @@ "property": "nettingBasis", "binding": { "state": "value", - "ref": "Gross" + "ref": "Net" } } ], @@ -232,7 +232,7 @@ } } }, - "sentence": "Gross disbursements to the 133 G77 countries from the 32 DAC countries for official development assistance, 1967 to 2024. Current US dollars · OECD DAC2a.", + "sentence": "Net disbursements to the 133 G77 countries from the 32 DAC countries for official development assistance, 1967 to 2024. Current US dollars · OECD DAC2a.", "entity_groups": { "destination": { "label": "G77 countries", @@ -240,7 +240,8 @@ }, "origin": { "label": "DAC countries", - "group_id": "groups/OECD.DAC" + "group_id": "groups/OECD.DAC", + "sum_differs": true } } }, @@ -265,10 +266,10 @@ "schema_version": 1, "input": { "kind": "spec_id", - "spec_id": "spec_70ddf0ce6a9b3f147063f2adf37fab9e", + "spec_id": "spec_b05b2b3ee21debf9e2ac3fbe03e05f94", "definition": { "schema_version": 1, - "spec_id": "spec_70ddf0ce6a9b3f147063f2adf37fab9e", + "spec_id": "spec_b05b2b3ee21debf9e2ac3fbe03e05f94", "identity": { "identity_version": "spec1", "shape": { @@ -303,7 +304,7 @@ "property": "nettingBasis", "binding": { "state": "value", - "ref": "Gross" + "ref": "Net" } } ], @@ -509,13 +510,13 @@ "status": 200, "headers": { "content-type": "application/json", - "x-dfo-trace-id": "32e9805e9f0641c38c9b29ba614120b5" + "x-dfo-trace-id": "3b3c6a25069b467d95aeb97ccd12c281" }, "json": { "schema_version": 1, "definition": { "schema_version": 1, - "spec_id": "spec_73897fdfb0206fcf27c5898b353348fb", + "spec_id": "spec_e14699f9dcd167f0211081a726ae1031", "identity": { "shape": { "kind": "statvar_schema", @@ -547,7 +548,7 @@ }, { "binding": { - "ref": "Gross", + "ref": "Net", "state": "value" }, "property": "nettingBasis" @@ -566,8 +567,8 @@ } } }, - "content_version": "cv_fd93b9bd8095076557d0e500bb15514f", - "prepared_at": "2026-10-12T18:33:25Z", + "content_version": "cv_a45fe84301ebe9f5f3d44cb042feacff", + "prepared_at": "2026-10-15T09:59:06Z", "coverage": { "rows": 96, "dimensions": [ @@ -602,7 +603,7 @@ } }, "citation": { - "text": "OECD DAC2A via ONE DFO, retrieved 2026-10-12", + "text": "OECD DAC2A (2026), via the Development Finance Observatory", "sources": [ { "ref": "provenance/OECDDAC2A", @@ -670,6 +671,28 @@ ] }, "trace": { + "party_totals_left_out": [ + { + "role": "financingProvider", + "entities": [ + "AfricanDevelopmentBankGroup", + "DACCountriesTotal", + "DACEUMembers", + "DACEUMembersAndEUInstitutions", + "DACMultilaterals", + "DACNonDACCountries", + "DACOfficialDonors", + "DACOtherMultilateralOrganisations", + "DACPrivateDonors", + "DACRegionalDevelopmentBanks", + "DACUnitedNations", + "DACWorldBank", + "GroupOfSeven", + "PostcodeLotteryGroup", + "WorldBankGroup" + ] + } + ], "facets": [ { "ref": "provenance/OECDDAC2A", @@ -705,11 +728,11 @@ "end_year": 2022, "start_year": 2022 }, - "graph_revision": "dfo-dev-dc-datacommons-service-00242-zfr", + "graph_revision": "dfo-dev-dc-datacommons-service-00249-9gv", "normalisations": [], "code_index_stamp": { - "exported_at": "2026-10-11T15:49:13Z", - "content_hash": "952a221e6d43254927fcb75abbf12ce7ba03285fbfeef7d9913e2ddcf49f904c", + "exported_at": "2026-10-13T21:51:17Z", + "content_hash": "602c7022fc21c17540a6873d93196ad6b967eaae3e71f9dce6dec178a735daf4", "graph_endpoint": "https://dfo-dev-dc-datacommons-service-zms5lj4zhq-nn.a.run.app" }, "source_revisions": [ @@ -718,11 +741,11 @@ "revision": "2026-10-12" } ], - "capability_version": "dset_5c3f5b0bf4cd9569", - "materialiser_build": "cd25922ac45834a7c7d0193d3b3ee3d7e9cc7b55", + "capability_version": "dset_1e6cd9546fac19e9", + "materialiser_build": "1d29a70e59f70570c5ed8d610ec83291c8eb6f54", "resolved_stat_vars": [ { - "ref": "dcid:Amount_FinancialFlow_Gross_Disbursement_DAC2aAidType206_Nominal", + "ref": "dcid:Amount_FinancialFlow_Net_Disbursement_DAC2aAidType206_Nominal", "roles": [ "financingProvider", "financingRecipient" @@ -731,34 +754,11 @@ } ], "family_member_count": 1, - "family_member_digest": "1a36e1a7292b1bfff95a5415de0be74cac7bb033217ed50e79faa8ce51a224c0", + "family_member_digest": "c2d373442ac21a31377df76cd343f156c72a530649757c399c6661cbf56c9a71", "frame_grammar_version": "1.1.0", - "party_totals_left_out": [ - { - "role": "financingProvider", - "entities": [ - "AfricanDevelopmentBankGroup", - "DACCountriesTotal", - "DACEUMembers", - "DACEUMembersAndEUInstitutions", - "DACMultilaterals", - "DACNonDACCountries", - "DACOfficialDonors", - "DACOtherMultilateralOrganisations", - "DACPrivateDonors", - "DACRegionalDevelopmentBanks", - "DACUnitedNations", - "DACWorldBank", - "GroupOfSeven", - "PostcodeLotteryGroup", - "WorldBankGroup" - ], - "provenance": "provenance/OECDDAC2A" - } - ], - "origin_catalogue_build_id": "20261012T163104Z-67f98b87", - "served_from": "head", - "confirmed_at": "2026-10-26T09:18:21.103020+00:00" + "origin_catalogue_build_id": "20261013T114555Z-613cf5c2", + "served_from": "materialise", + "confirmed_at": "2026-11-01T07:38:10.731097+00:00" }, "warnings": [], "diagnostics": [ @@ -770,35 +770,35 @@ ], "artifacts": [ { - "artifact_digest": "sha256:586f5aaffd96c46feb4d7bf09625d4c1a259faf51daf2d88967566fd4de07b4e", + "artifact_digest": "sha256:b6b1b11cd813990bfa3ec73915f7ba443e1de6f43f1745c8df6a36d464ac0f89", "rendering": { "bundle": false, "format": "parquet", "layout": 4, "without_party_totals": true }, - "bytes": 10346, + "bytes": 10333, "media_type": "application/vnd.apache.parquet", - "created_at": "2026-10-25T13:52:32.232191+00:00", + "created_at": "2026-11-01T07:38:10.616769+00:00", "tier": "working", - "url": "/api/datasets/spec_73897fdfb0206fcf27c5898b353348fb/cv_fd93b9bd8095076557d0e500bb15514f/files/sha256:586f5aaffd96c46feb4d7bf09625d4c1a259faf51daf2d88967566fd4de07b4e", - "enrichment_stamp": "08ed6c734fc69ea2204a21f4e1dd8b963f14dd1e03a2484c618049ac2e2d93d8" + "url": "/api/datasets/spec_e14699f9dcd167f0211081a726ae1031/cv_a45fe84301ebe9f5f3d44cb042feacff/files/sha256:b6b1b11cd813990bfa3ec73915f7ba443e1de6f43f1745c8df6a36d464ac0f89", + "enrichment_stamp": "55887b871f7aa1c5d120cb2bee97086605351d5acfbec645ab027f562d0f65c5" }, { - "artifact_digest": "sha256:f59e46a097f5837a3cc787e5dfe8b8bb562ad4dbc106f811575e322a15cc2db4", + "artifact_digest": "sha256:8e04fdf7882aef108c740e92cad0f94df9778f4816af785d808d53ea973de2dd", "rendering": { "statistics": "series" }, - "bytes": 9488, + "bytes": 9466, "media_type": "application/vnd.apache.parquet", - "created_at": "2026-10-15T09:58:17.967502+00:00", + "created_at": "2026-10-15T11:16:59.961737+00:00", "tier": "working", - "url": "/api/datasets/spec_73897fdfb0206fcf27c5898b353348fb/cv_fd93b9bd8095076557d0e500bb15514f/files/sha256:f59e46a097f5837a3cc787e5dfe8b8bb562ad4dbc106f811575e322a15cc2db4" + "url": "/api/datasets/spec_e14699f9dcd167f0211081a726ae1031/cv_a45fe84301ebe9f5f3d44cb042feacff/files/sha256:8e04fdf7882aef108c740e92cad0f94df9778f4816af785d808d53ea973de2dd" } ], "series_count": 96, "output_options": { - "capability_version": "dset_76f5fa7244511c58", + "capability_version": "dset_5282a0674178a233", "columns": [ { "name": "stat_var", @@ -923,7 +923,8 @@ "label": "David and Lucile Packard Foundation" } ], - "truncated": true + "truncated": true, + "in_long_layout": false }, { "column": "financingProvider", @@ -977,7 +978,8 @@ "label": "David and Lucile Packard Foundation" } ], - "truncated": true + "truncated": true, + "in_long_layout": false }, { "column": "financingProvider", @@ -989,7 +991,8 @@ "covered": 96 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true }, { "column": "financingProvider", @@ -1001,7 +1004,8 @@ "covered": 96 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": false }, { "column": "financingProvider", @@ -1013,7 +1017,8 @@ "covered": 96 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true }, { "column": "financingProvider", @@ -1025,7 +1030,8 @@ "covered": 96 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true }, { "column": "financingProvider", @@ -1037,7 +1043,8 @@ "covered": 96 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true }, { "column": "financingRecipient", @@ -1049,7 +1056,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": false }, { "column": "financingRecipient", @@ -1061,7 +1069,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": false }, { "column": "financingRecipient", @@ -1073,7 +1082,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true }, { "column": "financingRecipient", @@ -1085,7 +1095,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": false }, { "column": "financingRecipient", @@ -1097,7 +1108,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true }, { "column": "financingRecipient", @@ -1109,7 +1121,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true }, { "column": "financingRecipient", @@ -1121,7 +1134,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true } ], "long_layout_defaults": [ @@ -1150,7 +1164,7 @@ ] } }, - "series_coverage_stamp": "e6e717ab8c77e84d010915893ede5809e9ecec67929a07cfafbcc2210edfa1eb", + "series_coverage_stamp": "ad27fd11738abb03d2d84dc214e223f04781609636cf678d0d08c385fb863d99", "retention": { "pinned": true } @@ -1200,7 +1214,7 @@ }, { "binding": { - "ref": "Gross", + "ref": "Net", "state": "value" }, "property": "nettingBasis" @@ -1227,7 +1241,7 @@ "status": 200, "headers": { "content-type": "application/json", - "x-dfo-trace-id": "66a2d2508ed04bddb8e7bb1aabaa88db" + "x-dfo-trace-id": "f35f96ab20924811bfed6ee2a0d7853f" }, "json": { "schema_version": 1, @@ -1236,11 +1250,11 @@ "extract_skipped": true }, "diagnostics": { - "engine_build": "d80df9f5fd598b7345255470932d202ee5d49942", - "trace_id": "66a2d2508ed04bddb8e7bb1aabaa88db", + "engine_build": "ccb6617922c839ce3cd5615a3bbb65c70bfe1bde", + "trace_id": "f35f96ab20924811bfed6ee2a0d7853f", "warnings": [], "timing_ms": { - "total": 2, + "total": 193, "by_step": { "coverage": 0 } @@ -1261,7 +1275,7 @@ "code": "whole_total_available", "severity": "info", "message": "The source publishes the total of every official donor as official donors (DAC); a sum of the listed donors includes private donors and differs from it.", - "spec_id": "spec_73897fdfb0206fcf27c5898b353348fb", + "spec_id": "spec_e14699f9dcd167f0211081a726ae1031", "params": { "total": "DACOfficialDonors", "total_label": "official donors (DAC)", @@ -1270,9 +1284,39 @@ } ], "timing_ms": { - "total": 0, + "total": 179, "by_step": { - "response_cache_part_memo": 0 + "validate": 0, + "phase_validate": 0, + "walk": 13, + "reread_arcs": 0, + "phase_reread_arcs": 0, + "detect_edits": 0, + "phase_detect_edits": 0, + "resolve_survivors": 0, + "phase_resolve_survivors": 0, + "shape": 1, + "phase_build_shape": 0, + "bind": 0, + "phase_build_bindings": 0, + "where_places": 0, + "phase_where_places": 0, + "materialise": 38, + "phase_materialise": 0, + "ground_related": 7, + "ground_units": 0, + "ground_facets": 0, + "ground_convert": 0, + "answer": 15, + "ground_gates": 6, + "phase_ground_build": 92, + "finalize_preview": 0, + "options": 4, + "finalize_related": 0, + "finalize_wholes": 2, + "finalize_relaunch": 0, + "phase_finalize": 1, + "served_entry": 0 } }, "entity_refs": [], @@ -1288,10 +1332,10 @@ ], "status": "definite", "spec": { - "spec_id": "spec_73897fdfb0206fcf27c5898b353348fb", + "spec_id": "spec_e14699f9dcd167f0211081a726ae1031", "definition": { "schema_version": 1, - "spec_id": "spec_73897fdfb0206fcf27c5898b353348fb", + "spec_id": "spec_e14699f9dcd167f0211081a726ae1031", "identity": { "identity_version": "spec1", "shape": { @@ -1326,7 +1370,7 @@ "property": "nettingBasis", "binding": { "state": "value", - "ref": "Gross" + "ref": "Net" } } ], @@ -1345,7 +1389,7 @@ "resolved": { "shape": { "shape_id": "financialflow_amount_measuredvalue_nominal_family_f096b1ba", - "label": "gross disbursements (official development assistance)", + "label": "net disbursements (official development assistance)", "population_type": { "ref": "FinancialFlow", "label": "financial flow" @@ -1410,7 +1454,7 @@ } ], "member_count": 1, - "member_digest": "1a36e1a7292b1bfff95a5415de0be74cac7bb033217ed50e79faa8ce51a224c0", + "member_digest": "c2d373442ac21a31377df76cd343f156c72a530649757c399c6661cbf56c9a71", "refine_supported": true, "data_commons": [ { @@ -1475,8 +1519,8 @@ "kind": "value", "value": { "ref": { - "ref": "Gross", - "label": "gross" + "ref": "Net", + "label": "net" }, "value_kind": "enum_value" } @@ -1642,7 +1686,7 @@ "label": "OECD Terms and Conditions" } }, - "coverage_stamp": "e6e717ab8c77e84d010915893ede5809e9ecec67929a07cfafbcc2210edfa1eb", + "coverage_stamp": "ad27fd11738abb03d2d84dc214e223f04781609636cf678d0d08c385fb863d99", "facets": { "provenance": { "basis": "fallback", @@ -1688,60 +1732,47 @@ "relation": "child", "parent": "DAC2aAidType206", "member_count": 2, - "served_rows": 27, + "served_rows": 32, "served_rows_exact": true }, { "value": { "ref": { - "ref": "DAC2aAidType201", - "label": "ODA grant" + "ref": "DAC2aAidType219", + "label": "recovery on ODA grants and capital subscriptions" }, "value_kind": "enum_value" }, "relation": "child", "parent": "DAC2aAidType206", "member_count": 1, - "served_rows": 109, + "served_rows": 26, "served_rows_exact": true }, { "value": { "ref": { - "ref": "DAC2aAidType207", - "label": "free-standing technical co-operation" + "ref": "DAC2aAidType209", + "label": "interest received on ODA lending" }, "value_kind": "enum_value" }, "relation": "root", "member_count": 1, - "served_rows": 45, + "served_rows": 14, "served_rows_exact": true }, { "value": { "ref": { - "ref": "DAC2aAidType213", - "label": "developmental food aid" + "ref": "DAC2aAidType250", + "label": "official development assistance excluding debt relief" }, "value_kind": "enum_value" }, "relation": "root", "member_count": 1, - "served_rows": 15, - "served_rows_exact": true - }, - { - "value": { - "ref": { - "ref": "DAC2aAidType216", - "label": "humanitarian aid" - }, - "value_kind": "enum_value" - }, - "relation": "root", - "member_count": 1, - "served_rows": 42, + "served_rows": 111, "served_rows_exact": true } ], @@ -1791,11 +1822,11 @@ "source": "observed" } ], - "rendered_sentence": "Gross disbursements to Kenya from 96 providers for official development assistance in 2022. Current US dollars · OECD DAC2a.", + "rendered_sentence": "Net disbursements to Kenya from 96 providers for official development assistance in 2022. Current US dollars · OECD DAC2a.", "sentence_plan": [ { "kind": "slot", - "text": "Gross disbursements", + "text": "Net disbursements", "axis": "what", "segment": "heading", "entity_refs": [], @@ -2034,8 +2065,8 @@ "binding_kind": "value", "refs": [ { - "ref": "Gross", - "label": "gross" + "ref": "Net", + "label": "net" } ], "provenance": "binder" @@ -2091,7 +2122,7 @@ "start_year": 2022, "end_year": 2022 }, - "capability_version": "cap_765c9d2a0c7529b9" + "capability_version": "cap_4913302d7a6b6435" }, "confidence": "high", "available_at_place": true, @@ -2099,7 +2130,7 @@ { "definition": { "schema_version": 1, - "spec_id": "spec_e14699f9dcd167f0211081a726ae1031", + "spec_id": "spec_73897fdfb0206fcf27c5898b353348fb", "identity": { "identity_version": "spec1", "shape": { @@ -2134,7 +2165,7 @@ "property": "nettingBasis", "binding": { "state": "value", - "ref": "Net" + "ref": "Gross" } } ], @@ -2150,7 +2181,7 @@ } } }, - "label": "net disbursements", + "label": "gross disbursements", "axis": "what", "measure_axis_values": [ { @@ -2184,8 +2215,8 @@ { "axis": "nettingBasis", "value": { - "ref": "Net", - "label": "net" + "ref": "Gross", + "label": "gross" } } ], @@ -2193,7 +2224,7 @@ "served_rows_exact": true } ], - "measure_label": "gross disbursements", + "measure_label": "net disbursements", "measure_label_axes": [ "populationType", "measuredProperty", @@ -2233,16 +2264,19 @@ { "axis": "nettingBasis", "value": { - "ref": "Gross", - "label": "gross" + "ref": "Net", + "label": "net" } } ], + "concept_label": "official development assistance", + "published_tables": "OECD DAC2a", "role_axis_facts": [ { "role": "origin", "member_count": 96, - "members_available": true + "members_available": true, + "holds_multilaterals": true } ], "unit_conversion": { @@ -4196,11 +4230,11 @@ } } ], - "rendered_sentence": "Gross disbursements to Kenya from 96 providers for official development assistance in 2022. Current US dollars · OECD DAC2a. Assumed: every provider.", + "rendered_sentence": "Net disbursements to Kenya from 96 providers for official development assistance in 2022. Current US dollars · OECD DAC2a. Assumed: every provider.", "sentence_plan": [ { "kind": "slot", - "text": "Gross disbursements", + "text": "Net disbursements", "axis": "what", "segment": "heading", "entity_refs": [], @@ -4417,21 +4451,21 @@ { "request": { "method": "GET", - "origin_path": "/api/datasets/spec_73897fdfb0206fcf27c5898b353348fb/cv_fd93b9bd8095076557d0e500bb15514f/files/sha256:586f5aaffd96c46feb4d7bf09625d4c1a259faf51daf2d88967566fd4de07b4e" + "origin_path": "/api/datasets/spec_e14699f9dcd167f0211081a726ae1031/cv_a45fe84301ebe9f5f3d44cb042feacff/files/sha256:b6b1b11cd813990bfa3ec73915f7ba443e1de6f43f1745c8df6a36d464ac0f89" }, "response": { "status": 302, "headers": { "content-type": "text/html", - "location": "https://storage.googleapis.com/dev-fin-observatory-datasets-working/sha256%3A586f5aaffd96c46feb4d7bf09625d4c1a259faf51daf2d88967566fd4de07b4e?X-Goog-Signature=redacted", - "x-dfo-trace-id": "cd279a74b4ef4b9689cf4a809b87c9c9" + "location": "https://storage.googleapis.com/dev-fin-observatory-datasets-working/sha256%3Ab6b1b11cd813990bfa3ec73915f7ba443e1de6f43f1745c8df6a36d464ac0f89?X-Goog-Signature=redacted", + "x-dfo-trace-id": "6a09f94b9eaf475b9aa7c8f1142459a4" } } }, { "request": { "method": "GET", - "url": "https://storage.googleapis.com/dev-fin-observatory-datasets-working/sha256%3A586f5aaffd96c46feb4d7bf09625d4c1a259faf51daf2d88967566fd4de07b4e?X-Goog-Signature=redacted" + "url": "https://storage.googleapis.com/dev-fin-observatory-datasets-working/sha256%3Ab6b1b11cd813990bfa3ec73915f7ba443e1de6f43f1745c8df6a36d464ac0f89?X-Goog-Signature=redacted" }, "response": { "status": 200, @@ -4472,9 +4506,9 @@ "members": [ { "parts": [], - "spec_id": "spec_73897fdfb0206fcf27c5898b353348fb", - "content_version": "cv_fd93b9bd8095076557d0e500bb15514f", - "sentence": "Gross disbursements to Kenya from 96 providers for official development assistance in 2022. Current US dollars · OECD DAC2a." + "spec_id": "spec_e14699f9dcd167f0211081a726ae1031", + "content_version": "cv_a45fe84301ebe9f5f3d44cb042feacff", + "sentence": "Net disbursements to Kenya from 96 providers for official development assistance in 2022. Current US dollars · OECD DAC2a." } ], "missing": [] diff --git a/python/client-contract/src/dfo_client_contract/scenarios/fetch-spec-party-totals-left-out.parquet b/python/client-contract/src/dfo_client_contract/scenarios/fetch-spec-party-totals-left-out.parquet index 6898a12..277ccce 100644 Binary files a/python/client-contract/src/dfo_client_contract/scenarios/fetch-spec-party-totals-left-out.parquet and b/python/client-contract/src/dfo_client_contract/scenarios/fetch-spec-party-totals-left-out.parquet differ diff --git a/python/client-contract/src/dfo_client_contract/scenarios/fetch-spec-poll-not-found.json b/python/client-contract/src/dfo_client_contract/scenarios/fetch-spec-poll-not-found.json index 4fb6e44..365dd93 100644 --- a/python/client-contract/src/dfo_client_contract/scenarios/fetch-spec-poll-not-found.json +++ b/python/client-contract/src/dfo_client_contract/scenarios/fetch-spec-poll-not-found.json @@ -11,10 +11,10 @@ { "op": "fetch", "spec": { - "spec_id": "spec_70ddf0ce6a9b3f147063f2adf37fab9e", + "spec_id": "spec_8d395f753219876fa459778f38499a80", "definition": { "schema_version": 1, - "spec_id": "spec_70ddf0ce6a9b3f147063f2adf37fab9e", + "spec_id": "spec_8d395f753219876fa459778f38499a80", "identity": { "identity_version": "spec1", "shape": { @@ -49,7 +49,7 @@ "property": "nettingBasis", "binding": { "state": "value", - "ref": "Gross" + "ref": "Net" } } ], @@ -226,12 +226,12 @@ }, "requested_window": { "kind": "range", - "start_year": 1967, + "start_year": 1968, "end_year": 2024 } } }, - "sentence": "Gross disbursements to the 133 G77 countries from the 32 DAC countries for official development assistance, 1967 to 2024. Current US dollars · OECD DAC2a.", + "sentence": "Net disbursements to the 133 G77 countries from the 32 DAC countries for official development assistance, 1968 to 2024. Current US dollars · OECD DAC2a.", "entity_groups": { "destination": { "label": "G77 countries", @@ -239,7 +239,8 @@ }, "origin": { "label": "DAC countries", - "group_id": "groups/OECD.DAC" + "group_id": "groups/OECD.DAC", + "sum_differs": true } } }, @@ -255,10 +256,10 @@ "schema_version": 1, "input": { "kind": "spec_id", - "spec_id": "spec_70ddf0ce6a9b3f147063f2adf37fab9e", + "spec_id": "spec_8d395f753219876fa459778f38499a80", "definition": { "schema_version": 1, - "spec_id": "spec_70ddf0ce6a9b3f147063f2adf37fab9e", + "spec_id": "spec_8d395f753219876fa459778f38499a80", "identity": { "identity_version": "spec1", "shape": { @@ -293,7 +294,7 @@ "property": "nettingBasis", "binding": { "state": "value", - "ref": "Gross" + "ref": "Net" } } ], @@ -470,7 +471,7 @@ }, "requested_window": { "kind": "range", - "start_year": 1967, + "start_year": 1968, "end_year": 2024 } } @@ -486,15 +487,15 @@ "status": 202, "headers": { "content-type": "application/json", - "location": "/api/datasets/operations/op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f", + "location": "/api/datasets/operations/op_d53662fbaac38ee0bd0801eab9630ebca0c8b467d33b0a1b2c6792d0cd83b7cf", "retry-after": "2", - "x-dfo-trace-id": "9e96509866ff4da09a698df1f19a5cbd" + "x-dfo-trace-id": "7fd3deb153d34f4b9afce2b95ffdd664" }, "json": { "operation": { - "operation_id": "op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f", + "operation_id": "op_d53662fbaac38ee0bd0801eab9630ebca0c8b467d33b0a1b2c6792d0cd83b7cf", "status": "pending", - "poll": "/api/datasets/operations/op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f", + "poll": "/api/datasets/operations/op_d53662fbaac38ee0bd0801eab9630ebca0c8b467d33b0a1b2c6792d0cd83b7cf", "retry_after_ms": 1500 } } @@ -503,7 +504,7 @@ { "request": { "method": "GET", - "path": "/datasets/operations/op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f" + "path": "/datasets/operations/op_d53662fbaac38ee0bd0801eab9630ebca0c8b467d33b0a1b2c6792d0cd83b7cf" }, "response": { "status": 404, @@ -531,7 +532,7 @@ "trace_id": "00000000000000000000000000000000", "long_builds": [ { - "operation_id": "op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f", + "operation_id": "op_d53662fbaac38ee0bd0801eab9630ebca0c8b467d33b0a1b2c6792d0cd83b7cf", "poll_waits": [ 1.5 ], diff --git a/python/client-contract/src/dfo_client_contract/scenarios/fetch-spec-poll-pacing-changes.json b/python/client-contract/src/dfo_client_contract/scenarios/fetch-spec-poll-pacing-changes.json index 636e329..962fb9d 100644 --- a/python/client-contract/src/dfo_client_contract/scenarios/fetch-spec-poll-pacing-changes.json +++ b/python/client-contract/src/dfo_client_contract/scenarios/fetch-spec-poll-pacing-changes.json @@ -11,10 +11,10 @@ { "op": "fetch", "spec": { - "spec_id": "spec_70ddf0ce6a9b3f147063f2adf37fab9e", + "spec_id": "spec_8d395f753219876fa459778f38499a80", "definition": { "schema_version": 1, - "spec_id": "spec_70ddf0ce6a9b3f147063f2adf37fab9e", + "spec_id": "spec_8d395f753219876fa459778f38499a80", "identity": { "identity_version": "spec1", "shape": { @@ -49,7 +49,7 @@ "property": "nettingBasis", "binding": { "state": "value", - "ref": "Gross" + "ref": "Net" } } ], @@ -226,12 +226,12 @@ }, "requested_window": { "kind": "range", - "start_year": 1967, + "start_year": 1968, "end_year": 2024 } } }, - "sentence": "Gross disbursements to the 133 G77 countries from the 32 DAC countries for official development assistance, 1967 to 2024. Current US dollars · OECD DAC2a.", + "sentence": "Net disbursements to the 133 G77 countries from the 32 DAC countries for official development assistance, 1968 to 2024. Current US dollars · OECD DAC2a.", "entity_groups": { "destination": { "label": "G77 countries", @@ -239,7 +239,8 @@ }, "origin": { "label": "DAC countries", - "group_id": "groups/OECD.DAC" + "group_id": "groups/OECD.DAC", + "sum_differs": true } } }, @@ -255,10 +256,10 @@ "schema_version": 1, "input": { "kind": "spec_id", - "spec_id": "spec_70ddf0ce6a9b3f147063f2adf37fab9e", + "spec_id": "spec_8d395f753219876fa459778f38499a80", "definition": { "schema_version": 1, - "spec_id": "spec_70ddf0ce6a9b3f147063f2adf37fab9e", + "spec_id": "spec_8d395f753219876fa459778f38499a80", "identity": { "identity_version": "spec1", "shape": { @@ -293,7 +294,7 @@ "property": "nettingBasis", "binding": { "state": "value", - "ref": "Gross" + "ref": "Net" } } ], @@ -470,7 +471,7 @@ }, "requested_window": { "kind": "range", - "start_year": 1967, + "start_year": 1968, "end_year": 2024 } } @@ -486,15 +487,15 @@ "status": 202, "headers": { "content-type": "application/json", - "location": "/api/datasets/operations/op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f", + "location": "/api/datasets/operations/op_d53662fbaac38ee0bd0801eab9630ebca0c8b467d33b0a1b2c6792d0cd83b7cf", "retry-after": "2", - "x-dfo-trace-id": "9e96509866ff4da09a698df1f19a5cbd" + "x-dfo-trace-id": "7fd3deb153d34f4b9afce2b95ffdd664" }, "json": { "operation": { - "operation_id": "op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f", + "operation_id": "op_d53662fbaac38ee0bd0801eab9630ebca0c8b467d33b0a1b2c6792d0cd83b7cf", "status": "pending", - "poll": "/api/datasets/operations/op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f", + "poll": "/api/datasets/operations/op_d53662fbaac38ee0bd0801eab9630ebca0c8b467d33b0a1b2c6792d0cd83b7cf", "retry_after_ms": 1500 } } @@ -503,24 +504,24 @@ { "request": { "method": "GET", - "path": "/datasets/operations/op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f" + "path": "/datasets/operations/op_d53662fbaac38ee0bd0801eab9630ebca0c8b467d33b0a1b2c6792d0cd83b7cf" }, "response": { "status": 200, "headers": { "content-type": "application/json", "retry-after": "2", - "x-dfo-trace-id": "6185b86217ef499bb5b6932299df1207" + "x-dfo-trace-id": "55b37040b90c4b51bb1432fb7f565e8d" }, "json": { "operation": { - "operation_id": "op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f", + "operation_id": "op_d53662fbaac38ee0bd0801eab9630ebca0c8b467d33b0a1b2c6792d0cd83b7cf", "status": "running", - "poll": "/api/datasets/operations/op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f", + "poll": "/api/datasets/operations/op_d53662fbaac38ee0bd0801eab9630ebca0c8b467d33b0a1b2c6792d0cd83b7cf", "retry_after_ms": 2500, "progress": { "rows_written": 0, - "estimate_rows": 107252 + "estimate_rows": 107148 } } } @@ -529,24 +530,24 @@ { "request": { "method": "GET", - "path": "/datasets/operations/op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f" + "path": "/datasets/operations/op_d53662fbaac38ee0bd0801eab9630ebca0c8b467d33b0a1b2c6792d0cd83b7cf" }, "response": { "status": 200, "headers": { "content-type": "application/json", "retry-after": "2", - "x-dfo-trace-id": "1ebea3ca2d15409c953cd716bdc1fccf" + "x-dfo-trace-id": "76621ada279a42da9405c03760d3fa30" }, "json": { "operation": { - "operation_id": "op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f", + "operation_id": "op_d53662fbaac38ee0bd0801eab9630ebca0c8b467d33b0a1b2c6792d0cd83b7cf", "status": "running", - "poll": "/api/datasets/operations/op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f", + "poll": "/api/datasets/operations/op_d53662fbaac38ee0bd0801eab9630ebca0c8b467d33b0a1b2c6792d0cd83b7cf", "retry_after_ms": 4000, "progress": { - "rows_written": 61927, - "estimate_rows": 107252 + "rows_written": 50967, + "estimate_rows": 107148 } } } @@ -555,24 +556,24 @@ { "request": { "method": "GET", - "path": "/datasets/operations/op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f" + "path": "/datasets/operations/op_d53662fbaac38ee0bd0801eab9630ebca0c8b467d33b0a1b2c6792d0cd83b7cf" }, "response": { "status": 200, "headers": { "content-type": "application/json", "retry-after": "2", - "x-dfo-trace-id": "94bb5a8a7c2041969d9a9118b75dc4aa" + "x-dfo-trace-id": "f489220d020f40cabbd29c2e1d57a188" }, "json": { "operation": { - "operation_id": "op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f", + "operation_id": "op_d53662fbaac38ee0bd0801eab9630ebca0c8b467d33b0a1b2c6792d0cd83b7cf", "status": "running", - "poll": "/api/datasets/operations/op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f", + "poll": "/api/datasets/operations/op_d53662fbaac38ee0bd0801eab9630ebca0c8b467d33b0a1b2c6792d0cd83b7cf", "retry_after_ms": 1000, "progress": { - "rows_written": 107252, - "estimate_rows": 107252 + "rows_written": 107148, + "estimate_rows": 107148 } } } @@ -581,24 +582,24 @@ { "request": { "method": "GET", - "path": "/datasets/operations/op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f" + "path": "/datasets/operations/op_d53662fbaac38ee0bd0801eab9630ebca0c8b467d33b0a1b2c6792d0cd83b7cf" }, "response": { "status": 200, "headers": { "content-type": "application/json", - "x-dfo-trace-id": "c501ba8d087b4561b2ff0e423c719ab0" + "x-dfo-trace-id": "2a08d19167d845478a587fcdca1b295b" }, "json": { "operation": { - "operation_id": "op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f", + "operation_id": "op_d53662fbaac38ee0bd0801eab9630ebca0c8b467d33b0a1b2c6792d0cd83b7cf", "status": "done" }, "manifest": { "schema_version": 1, "definition": { "schema_version": 1, - "spec_id": "spec_70ddf0ce6a9b3f147063f2adf37fab9e", + "spec_id": "spec_8d395f753219876fa459778f38499a80", "identity": { "shape": { "kind": "statvar_schema", @@ -630,7 +631,7 @@ }, { "binding": { - "ref": "Gross", + "ref": "Net", "state": "value" }, "property": "nettingBasis" @@ -811,14 +812,14 @@ "requested_window": { "kind": "range", "end_year": 2024, - "start_year": 1967 + "start_year": 1968 } } }, - "content_version": "cv_fafc60a507e03b0d42689fb1936127b9", - "prepared_at": "2026-10-26T09:22:44Z", + "content_version": "cv_e9cd9cba677e6dd0e2a81d5700d5edfb", + "prepared_at": "2026-11-01T07:38:40Z", "coverage": { - "rows": 107252, + "rows": 107148, "dimensions": [ { "label": "financingProvider", @@ -840,14 +841,14 @@ }, { "label": "years", - "count": 58 + "count": 57 } ], "window": { "kind": "range", "origin": "query", "end_year": 2024, - "start_year": 1967 + "start_year": 1968 } }, "citation": { @@ -874,8 +875,8 @@ "source_data_url": "https://webfs-dcd.oecd.org/files/dotStat/DSD_DAC2/Table2a_Data.zip", "attribution": "OECD (2026), OECD DAC2A, OECD Data Explorer, https://webfs-dcd.oecd.org/files/dotStat/DSD_DAC2/Table2a_Data.zip (accessed on 2026-10-12)", "update_cadence": "Quarterly", - "last_update": "2026-10-15", - "years_covered": "1960-2024", + "last_update": "2026-10-29", + "years_covered": "1960-2025", "granularity": "Annual, by provider and recipient", "currencies": [ "USD" @@ -886,8 +887,8 @@ "description": "The OECD publishes DAC2A in April, June, September and December. The complete table is downloaded from the OECD each time it is republished, and replaces the previous copy, so the data reflects the OECD's latest release." }, { - "transformation": "Exclude the partial preliminary year", - "description": "Before each full release, the OECD publishes preliminary data for the year that release covers, as reporters submit it. Until then, that year is partial, so the pipeline excludes it. Support for partial years is in development. Partial years will be marked incomplete, so they don't lead to incorrect or confusing analyses." + "transformation": "Mark the partial year", + "description": "The OECD publishes data for a year as donors report it, and its final release in December of the following year covers every donor. Until then, the year is partial. The pipeline publishes it, and the import's provenance names it in `partialObservationDate`." }, { "transformation": "Standardise providers and recipients", @@ -907,13 +908,23 @@ } ], "version_history": [ + { + "date": "2026-10-29", + "title": "Partial year published, marked as partial", + "changes": [ + { + "kind": "changed", + "note": "The partial year, which only some donors have reported ahead of the OECD's final release in December, is included, and the import's provenance marks it with `partialObservationDate`." + } + ] + }, { "date": "2026-10-15", - "title": "Partial preliminary year excluded", + "title": "Partial year excluded", "changes": [ { "kind": "changed", - "note": "The partial preliminary year published ahead of the next full release is excluded." + "note": "The partial year, which only some donors have reported ahead of the OECD's final release in December, is excluded." } ] }, @@ -966,39 +977,39 @@ "kind": "range", "origin": "query", "end_year": 2024, - "start_year": 1967 + "start_year": 1968 }, "graph_revision": null, "normalisations": [], "code_index_stamp": { - "exported_at": "2026-10-24T19:20:27Z", - "content_hash": "3d946d8f4986dbbe0fa3e5c4c917200381f529d89ce417c11daeb22df56eed99", + "exported_at": "2026-11-01T03:08:18Z", + "content_hash": "a1bde3be8710f5ba073e52aaaba73cf9156079c273c874372f54bb07a81b0f94", "graph_endpoint": "graph_release" }, "source_revisions": [ { "source": "provenance/OECDDAC2A", - "revision": "2026-10-15" + "revision": "2026-10-29" } ], - "capability_version": "dset_76f5fa7244511c58", - "materialiser_build": "d80df9f5fd598b7345255470932d202ee5d49942", + "capability_version": "dset_5282a0674178a233", + "materialiser_build": "ccb6617922c839ce3cd5615a3bbb65c70bfe1bde", "resolved_stat_vars": [ { - "ref": "dcid:Amount_FinancialFlow_Gross_Disbursement_DAC2aAidType206_Nominal", + "ref": "dcid:Amount_FinancialFlow_Net_Disbursement_DAC2aAidType206_Nominal", "roles": [ "financingProvider", "financingRecipient" ], - "observation_count": 107252 + "observation_count": 107148 } ], "family_member_count": 1, - "family_member_digest": "1a36e1a7292b1bfff95a5415de0be74cac7bb033217ed50e79faa8ce51a224c0", + "family_member_digest": "c2d373442ac21a31377df76cd343f156c72a530649757c399c6661cbf56c9a71", "frame_grammar_version": "1.1.0", - "origin_catalogue_build_id": "20261026T000018Z-0af2cac5", + "origin_catalogue_build_id": "20261029T171521Z-7d0a5854", "served_from": "materialise", - "confirmed_at": "2026-10-26T09:22:46.854499+00:00" + "confirmed_at": "2026-11-01T07:38:43.335353+00:00" }, "warnings": [], "diagnostics": [ @@ -1010,34 +1021,34 @@ ], "artifacts": [ { - "artifact_digest": "sha256:a8c742f8f416b2f3414c7a569f7c18b337c5ee9ae3012483583bad0b238f5c61", + "artifact_digest": "sha256:1effd75b0d46b45109033faa8adfba1dbdc83d285810fe8c878c953595456b57", "rendering": { "bundle": false, "format": "parquet", "layout": 4 }, - "bytes": 466531, + "bytes": 469908, "media_type": "application/vnd.apache.parquet", - "created_at": "2026-10-26T09:22:46.786678+00:00", + "created_at": "2026-11-01T07:38:43.262295+00:00", "tier": "working", - "url": "/api/datasets/spec_70ddf0ce6a9b3f147063f2adf37fab9e/cv_fafc60a507e03b0d42689fb1936127b9/files/sha256:a8c742f8f416b2f3414c7a569f7c18b337c5ee9ae3012483583bad0b238f5c61", - "enrichment_stamp": "08ed6c734fc69ea2204a21f4e1dd8b963f14dd1e03a2484c618049ac2e2d93d8" + "url": "/api/datasets/spec_8d395f753219876fa459778f38499a80/cv_e9cd9cba677e6dd0e2a81d5700d5edfb/files/sha256:1effd75b0d46b45109033faa8adfba1dbdc83d285810fe8c878c953595456b57", + "enrichment_stamp": "55887b871f7aa1c5d120cb2bee97086605351d5acfbec645ab027f562d0f65c5" }, { - "artifact_digest": "sha256:5247bafa55f84fe2f8bc348601acb955162c39a1a082e939945336470e5c5231", + "artifact_digest": "sha256:73e13b2b41415cb991b4416af6ddd4c6ccf9e2ebc9bbaa4818b197a9e6e9b1a2", "rendering": { "statistics": "series" }, - "bytes": 144985, + "bytes": 147458, "media_type": "application/vnd.apache.parquet", - "created_at": "2026-10-26T09:22:46.786678+00:00", + "created_at": "2026-11-01T07:38:43.262295+00:00", "tier": "working", - "url": "/api/datasets/spec_70ddf0ce6a9b3f147063f2adf37fab9e/cv_fafc60a507e03b0d42689fb1936127b9/files/sha256:5247bafa55f84fe2f8bc348601acb955162c39a1a082e939945336470e5c5231" + "url": "/api/datasets/spec_8d395f753219876fa459778f38499a80/cv_e9cd9cba677e6dd0e2a81d5700d5edfb/files/sha256:73e13b2b41415cb991b4416af6ddd4c6ccf9e2ebc9bbaa4818b197a9e6e9b1a2" } ], - "series_count": 3656, + "series_count": 3657, "output_options": { - "capability_version": "dset_76f5fa7244511c58", + "capability_version": "dset_5282a0674178a233", "columns": [ { "name": "stat_var", @@ -1061,7 +1072,7 @@ "name": "time_period", "kind": "grain", "droppable": false, - "distinct": 58 + "distinct": 57 }, { "name": "value", @@ -1120,7 +1131,8 @@ "covered": 32 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": false }, { "column": "financingProvider", @@ -1132,7 +1144,8 @@ "covered": 32 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": false }, { "column": "financingProvider", @@ -1144,7 +1157,8 @@ "covered": 32 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true }, { "column": "financingProvider", @@ -1156,7 +1170,8 @@ "covered": 32 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": false }, { "column": "financingProvider", @@ -1168,7 +1183,8 @@ "covered": 32 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true }, { "column": "financingProvider", @@ -1180,7 +1196,8 @@ "covered": 32 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true }, { "column": "financingProvider", @@ -1192,7 +1209,8 @@ "covered": 32 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true }, { "column": "financingRecipient", @@ -1204,7 +1222,8 @@ "covered": 133 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": false }, { "column": "financingRecipient", @@ -1222,7 +1241,8 @@ "label": "South Sudan" } ], - "truncated": false + "truncated": false, + "in_long_layout": false }, { "column": "financingRecipient", @@ -1234,7 +1254,8 @@ "covered": 133 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true }, { "column": "financingRecipient", @@ -1246,7 +1267,8 @@ "covered": 133 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": false }, { "column": "financingRecipient", @@ -1258,7 +1280,8 @@ "covered": 133 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true }, { "column": "financingRecipient", @@ -1270,7 +1293,8 @@ "covered": 133 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true }, { "column": "financingRecipient", @@ -1282,7 +1306,8 @@ "covered": 133 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true } ], "long_layout_defaults": [ @@ -1301,7 +1326,7 @@ "varying": [ { "column": "time_period", - "distinct": 58 + "distinct": 57 } ] }, @@ -1325,7 +1350,7 @@ "varying": [ { "column": "time_period", - "distinct": 58 + "distinct": 57 } ] }, @@ -1384,10 +1409,10 @@ ] } }, - "series_coverage_stamp": "e6e717ab8c77e84d010915893ede5809e9ecec67929a07cfafbcc2210edfa1eb", + "series_coverage_stamp": "ad27fd11738abb03d2d84dc214e223f04781609636cf678d0d08c385fb863d99", "retention": { "pinned": false, - "held_until": "2026-11-25T09:22:46.785219Z" + "held_until": "2026-12-01T07:38:43.261993Z" } } } @@ -1396,21 +1421,21 @@ { "request": { "method": "GET", - "origin_path": "/api/datasets/spec_70ddf0ce6a9b3f147063f2adf37fab9e/cv_fafc60a507e03b0d42689fb1936127b9/files/sha256:a8c742f8f416b2f3414c7a569f7c18b337c5ee9ae3012483583bad0b238f5c61" + "origin_path": "/api/datasets/spec_8d395f753219876fa459778f38499a80/cv_e9cd9cba677e6dd0e2a81d5700d5edfb/files/sha256:1effd75b0d46b45109033faa8adfba1dbdc83d285810fe8c878c953595456b57" }, "response": { "status": 302, "headers": { "content-type": "text/html", - "location": "https://storage.googleapis.com/dev-fin-observatory-datasets-working/sha256%3Aa8c742f8f416b2f3414c7a569f7c18b337c5ee9ae3012483583bad0b238f5c61?X-Goog-Signature=redacted", - "x-dfo-trace-id": "22f0d88923c14d74825b5f14d41c05b8" + "location": "https://storage.googleapis.com/dev-fin-observatory-datasets-working/sha256%3A1effd75b0d46b45109033faa8adfba1dbdc83d285810fe8c878c953595456b57?X-Goog-Signature=redacted", + "x-dfo-trace-id": "0758c8ebc1d44bb896d7880cc101fd6a" } } }, { "request": { "method": "GET", - "url": "https://storage.googleapis.com/dev-fin-observatory-datasets-working/sha256%3Aa8c742f8f416b2f3414c7a569f7c18b337c5ee9ae3012483583bad0b238f5c61?X-Goog-Signature=redacted" + "url": "https://storage.googleapis.com/dev-fin-observatory-datasets-working/sha256%3A1effd75b0d46b45109033faa8adfba1dbdc83d285810fe8c878c953595456b57?X-Goog-Signature=redacted" }, "response": { "status": 200, @@ -1424,7 +1449,7 @@ "expect": [ { "dataset": { - "rows": 107252, + "rows": 107148, "columns": [ "time_period", "financingProvider_label", @@ -1451,15 +1476,15 @@ "members": [ { "parts": [], - "spec_id": "spec_70ddf0ce6a9b3f147063f2adf37fab9e", - "content_version": "cv_fafc60a507e03b0d42689fb1936127b9", - "sentence": "Gross disbursements to the 133 G77 countries from the 32 DAC countries for official development assistance, 1967 to 2024. Current US dollars · OECD DAC2a." + "spec_id": "spec_8d395f753219876fa459778f38499a80", + "content_version": "cv_e9cd9cba677e6dd0e2a81d5700d5edfb", + "sentence": "Net disbursements to the 133 G77 countries from the 32 DAC countries for official development assistance, 1968 to 2024. Current US dollars · OECD DAC2a." } ], "missing": [], "long_builds": [ { - "operation_id": "op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f", + "operation_id": "op_d53662fbaac38ee0bd0801eab9630ebca0c8b467d33b0a1b2c6792d0cd83b7cf", "poll_waits": [ 1.5, 2.5, diff --git a/python/client-contract/src/dfo_client_contract/scenarios/fetch-spec-poll-rate-limited-not-retryable.json b/python/client-contract/src/dfo_client_contract/scenarios/fetch-spec-poll-rate-limited-not-retryable.json index 0c01f71..21ce225 100644 --- a/python/client-contract/src/dfo_client_contract/scenarios/fetch-spec-poll-rate-limited-not-retryable.json +++ b/python/client-contract/src/dfo_client_contract/scenarios/fetch-spec-poll-rate-limited-not-retryable.json @@ -11,10 +11,10 @@ { "op": "fetch", "spec": { - "spec_id": "spec_70ddf0ce6a9b3f147063f2adf37fab9e", + "spec_id": "spec_8d395f753219876fa459778f38499a80", "definition": { "schema_version": 1, - "spec_id": "spec_70ddf0ce6a9b3f147063f2adf37fab9e", + "spec_id": "spec_8d395f753219876fa459778f38499a80", "identity": { "identity_version": "spec1", "shape": { @@ -49,7 +49,7 @@ "property": "nettingBasis", "binding": { "state": "value", - "ref": "Gross" + "ref": "Net" } } ], @@ -226,12 +226,12 @@ }, "requested_window": { "kind": "range", - "start_year": 1967, + "start_year": 1968, "end_year": 2024 } } }, - "sentence": "Gross disbursements to the 133 G77 countries from the 32 DAC countries for official development assistance, 1967 to 2024. Current US dollars · OECD DAC2a.", + "sentence": "Net disbursements to the 133 G77 countries from the 32 DAC countries for official development assistance, 1968 to 2024. Current US dollars · OECD DAC2a.", "entity_groups": { "destination": { "label": "G77 countries", @@ -239,7 +239,8 @@ }, "origin": { "label": "DAC countries", - "group_id": "groups/OECD.DAC" + "group_id": "groups/OECD.DAC", + "sum_differs": true } } }, @@ -255,10 +256,10 @@ "schema_version": 1, "input": { "kind": "spec_id", - "spec_id": "spec_70ddf0ce6a9b3f147063f2adf37fab9e", + "spec_id": "spec_8d395f753219876fa459778f38499a80", "definition": { "schema_version": 1, - "spec_id": "spec_70ddf0ce6a9b3f147063f2adf37fab9e", + "spec_id": "spec_8d395f753219876fa459778f38499a80", "identity": { "identity_version": "spec1", "shape": { @@ -293,7 +294,7 @@ "property": "nettingBasis", "binding": { "state": "value", - "ref": "Gross" + "ref": "Net" } } ], @@ -470,7 +471,7 @@ }, "requested_window": { "kind": "range", - "start_year": 1967, + "start_year": 1968, "end_year": 2024 } } @@ -486,15 +487,15 @@ "status": 202, "headers": { "content-type": "application/json", - "location": "/api/datasets/operations/op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f", + "location": "/api/datasets/operations/op_d53662fbaac38ee0bd0801eab9630ebca0c8b467d33b0a1b2c6792d0cd83b7cf", "retry-after": "2", - "x-dfo-trace-id": "9e96509866ff4da09a698df1f19a5cbd" + "x-dfo-trace-id": "7fd3deb153d34f4b9afce2b95ffdd664" }, "json": { "operation": { - "operation_id": "op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f", + "operation_id": "op_d53662fbaac38ee0bd0801eab9630ebca0c8b467d33b0a1b2c6792d0cd83b7cf", "status": "pending", - "poll": "/api/datasets/operations/op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f", + "poll": "/api/datasets/operations/op_d53662fbaac38ee0bd0801eab9630ebca0c8b467d33b0a1b2c6792d0cd83b7cf", "retry_after_ms": 1500 } } @@ -503,7 +504,7 @@ { "request": { "method": "GET", - "path": "/datasets/operations/op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f" + "path": "/datasets/operations/op_d53662fbaac38ee0bd0801eab9630ebca0c8b467d33b0a1b2c6792d0cd83b7cf" }, "response": { "status": 429, @@ -528,7 +529,7 @@ "trace_id": "00000000000000000000000000000000", "long_builds": [ { - "operation_id": "op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f", + "operation_id": "op_d53662fbaac38ee0bd0801eab9630ebca0c8b467d33b0a1b2c6792d0cd83b7cf", "poll_waits": [ 1.5 ], diff --git a/python/client-contract/src/dfo_client_contract/scenarios/fetch-spec-poll-rate-limited.json b/python/client-contract/src/dfo_client_contract/scenarios/fetch-spec-poll-rate-limited.json index ea02336..edca73f 100644 --- a/python/client-contract/src/dfo_client_contract/scenarios/fetch-spec-poll-rate-limited.json +++ b/python/client-contract/src/dfo_client_contract/scenarios/fetch-spec-poll-rate-limited.json @@ -11,10 +11,10 @@ { "op": "fetch", "spec": { - "spec_id": "spec_70ddf0ce6a9b3f147063f2adf37fab9e", + "spec_id": "spec_8d395f753219876fa459778f38499a80", "definition": { "schema_version": 1, - "spec_id": "spec_70ddf0ce6a9b3f147063f2adf37fab9e", + "spec_id": "spec_8d395f753219876fa459778f38499a80", "identity": { "identity_version": "spec1", "shape": { @@ -49,7 +49,7 @@ "property": "nettingBasis", "binding": { "state": "value", - "ref": "Gross" + "ref": "Net" } } ], @@ -226,12 +226,12 @@ }, "requested_window": { "kind": "range", - "start_year": 1967, + "start_year": 1968, "end_year": 2024 } } }, - "sentence": "Gross disbursements to the 133 G77 countries from the 32 DAC countries for official development assistance, 1967 to 2024. Current US dollars · OECD DAC2a.", + "sentence": "Net disbursements to the 133 G77 countries from the 32 DAC countries for official development assistance, 1968 to 2024. Current US dollars · OECD DAC2a.", "entity_groups": { "destination": { "label": "G77 countries", @@ -239,7 +239,8 @@ }, "origin": { "label": "DAC countries", - "group_id": "groups/OECD.DAC" + "group_id": "groups/OECD.DAC", + "sum_differs": true } } }, @@ -255,10 +256,10 @@ "schema_version": 1, "input": { "kind": "spec_id", - "spec_id": "spec_70ddf0ce6a9b3f147063f2adf37fab9e", + "spec_id": "spec_8d395f753219876fa459778f38499a80", "definition": { "schema_version": 1, - "spec_id": "spec_70ddf0ce6a9b3f147063f2adf37fab9e", + "spec_id": "spec_8d395f753219876fa459778f38499a80", "identity": { "identity_version": "spec1", "shape": { @@ -293,7 +294,7 @@ "property": "nettingBasis", "binding": { "state": "value", - "ref": "Gross" + "ref": "Net" } } ], @@ -470,7 +471,7 @@ }, "requested_window": { "kind": "range", - "start_year": 1967, + "start_year": 1968, "end_year": 2024 } } @@ -486,15 +487,15 @@ "status": 202, "headers": { "content-type": "application/json", - "location": "/api/datasets/operations/op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f", + "location": "/api/datasets/operations/op_d53662fbaac38ee0bd0801eab9630ebca0c8b467d33b0a1b2c6792d0cd83b7cf", "retry-after": "2", - "x-dfo-trace-id": "9e96509866ff4da09a698df1f19a5cbd" + "x-dfo-trace-id": "7fd3deb153d34f4b9afce2b95ffdd664" }, "json": { "operation": { - "operation_id": "op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f", + "operation_id": "op_d53662fbaac38ee0bd0801eab9630ebca0c8b467d33b0a1b2c6792d0cd83b7cf", "status": "pending", - "poll": "/api/datasets/operations/op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f", + "poll": "/api/datasets/operations/op_d53662fbaac38ee0bd0801eab9630ebca0c8b467d33b0a1b2c6792d0cd83b7cf", "retry_after_ms": 1500 } } @@ -503,7 +504,7 @@ { "request": { "method": "GET", - "path": "/datasets/operations/op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f" + "path": "/datasets/operations/op_d53662fbaac38ee0bd0801eab9630ebca0c8b467d33b0a1b2c6792d0cd83b7cf" }, "response": { "status": 429, @@ -515,24 +516,24 @@ { "request": { "method": "GET", - "path": "/datasets/operations/op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f" + "path": "/datasets/operations/op_d53662fbaac38ee0bd0801eab9630ebca0c8b467d33b0a1b2c6792d0cd83b7cf" }, "response": { "status": 200, "headers": { "content-type": "application/json", "retry-after": "2", - "x-dfo-trace-id": "6185b86217ef499bb5b6932299df1207" + "x-dfo-trace-id": "55b37040b90c4b51bb1432fb7f565e8d" }, "json": { "operation": { - "operation_id": "op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f", + "operation_id": "op_d53662fbaac38ee0bd0801eab9630ebca0c8b467d33b0a1b2c6792d0cd83b7cf", "status": "running", - "poll": "/api/datasets/operations/op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f", + "poll": "/api/datasets/operations/op_d53662fbaac38ee0bd0801eab9630ebca0c8b467d33b0a1b2c6792d0cd83b7cf", "retry_after_ms": 1500, "progress": { "rows_written": 0, - "estimate_rows": 107252 + "estimate_rows": 107148 } } } @@ -541,24 +542,24 @@ { "request": { "method": "GET", - "path": "/datasets/operations/op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f" + "path": "/datasets/operations/op_d53662fbaac38ee0bd0801eab9630ebca0c8b467d33b0a1b2c6792d0cd83b7cf" }, "response": { "status": 200, "headers": { "content-type": "application/json", "retry-after": "2", - "x-dfo-trace-id": "1ebea3ca2d15409c953cd716bdc1fccf" + "x-dfo-trace-id": "76621ada279a42da9405c03760d3fa30" }, "json": { "operation": { - "operation_id": "op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f", + "operation_id": "op_d53662fbaac38ee0bd0801eab9630ebca0c8b467d33b0a1b2c6792d0cd83b7cf", "status": "running", - "poll": "/api/datasets/operations/op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f", + "poll": "/api/datasets/operations/op_d53662fbaac38ee0bd0801eab9630ebca0c8b467d33b0a1b2c6792d0cd83b7cf", "retry_after_ms": 1500, "progress": { - "rows_written": 61927, - "estimate_rows": 107252 + "rows_written": 50967, + "estimate_rows": 107148 } } } @@ -567,24 +568,24 @@ { "request": { "method": "GET", - "path": "/datasets/operations/op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f" + "path": "/datasets/operations/op_d53662fbaac38ee0bd0801eab9630ebca0c8b467d33b0a1b2c6792d0cd83b7cf" }, "response": { "status": 200, "headers": { "content-type": "application/json", "retry-after": "2", - "x-dfo-trace-id": "94bb5a8a7c2041969d9a9118b75dc4aa" + "x-dfo-trace-id": "f489220d020f40cabbd29c2e1d57a188" }, "json": { "operation": { - "operation_id": "op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f", + "operation_id": "op_d53662fbaac38ee0bd0801eab9630ebca0c8b467d33b0a1b2c6792d0cd83b7cf", "status": "running", - "poll": "/api/datasets/operations/op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f", + "poll": "/api/datasets/operations/op_d53662fbaac38ee0bd0801eab9630ebca0c8b467d33b0a1b2c6792d0cd83b7cf", "retry_after_ms": 1500, "progress": { - "rows_written": 107252, - "estimate_rows": 107252 + "rows_written": 107148, + "estimate_rows": 107148 } } } @@ -593,24 +594,24 @@ { "request": { "method": "GET", - "path": "/datasets/operations/op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f" + "path": "/datasets/operations/op_d53662fbaac38ee0bd0801eab9630ebca0c8b467d33b0a1b2c6792d0cd83b7cf" }, "response": { "status": 200, "headers": { "content-type": "application/json", "retry-after": "2", - "x-dfo-trace-id": "c78757a54b9f4b6786a784f8a47ad5b4" + "x-dfo-trace-id": "9855026593bc4f158bc5bcdea3bd1809" }, "json": { "operation": { - "operation_id": "op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f", + "operation_id": "op_d53662fbaac38ee0bd0801eab9630ebca0c8b467d33b0a1b2c6792d0cd83b7cf", "status": "running", - "poll": "/api/datasets/operations/op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f", - "retry_after_ms": 1784, + "poll": "/api/datasets/operations/op_d53662fbaac38ee0bd0801eab9630ebca0c8b467d33b0a1b2c6792d0cd83b7cf", + "retry_after_ms": 1797, "progress": { - "rows_written": 107252, - "estimate_rows": 107252 + "rows_written": 107148, + "estimate_rows": 107148 } } } @@ -619,24 +620,24 @@ { "request": { "method": "GET", - "path": "/datasets/operations/op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f" + "path": "/datasets/operations/op_d53662fbaac38ee0bd0801eab9630ebca0c8b467d33b0a1b2c6792d0cd83b7cf" }, "response": { "status": 200, "headers": { "content-type": "application/json", "retry-after": "3", - "x-dfo-trace-id": "914bfd57942740b893ba9ca1b4f4591b" + "x-dfo-trace-id": "119eba2f4a1b446aa13d7abc8d39a2a9" }, "json": { "operation": { - "operation_id": "op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f", + "operation_id": "op_d53662fbaac38ee0bd0801eab9630ebca0c8b467d33b0a1b2c6792d0cd83b7cf", "status": "running", - "poll": "/api/datasets/operations/op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f", - "retry_after_ms": 2289, + "poll": "/api/datasets/operations/op_d53662fbaac38ee0bd0801eab9630ebca0c8b467d33b0a1b2c6792d0cd83b7cf", + "retry_after_ms": 2302, "progress": { - "rows_written": 107252, - "estimate_rows": 107252 + "rows_written": 107148, + "estimate_rows": 107148 } } } @@ -645,24 +646,24 @@ { "request": { "method": "GET", - "path": "/datasets/operations/op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f" + "path": "/datasets/operations/op_d53662fbaac38ee0bd0801eab9630ebca0c8b467d33b0a1b2c6792d0cd83b7cf" }, "response": { "status": 200, "headers": { "content-type": "application/json", "retry-after": "3", - "x-dfo-trace-id": "217766e0425f4916a393331295c4a7e7" + "x-dfo-trace-id": "1019c2a1661647d193bda3dd1a96847a" }, "json": { "operation": { - "operation_id": "op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f", + "operation_id": "op_d53662fbaac38ee0bd0801eab9630ebca0c8b467d33b0a1b2c6792d0cd83b7cf", "status": "running", - "poll": "/api/datasets/operations/op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f", - "retry_after_ms": 2934, + "poll": "/api/datasets/operations/op_d53662fbaac38ee0bd0801eab9630ebca0c8b467d33b0a1b2c6792d0cd83b7cf", + "retry_after_ms": 2919, "progress": { - "rows_written": 107252, - "estimate_rows": 107252 + "rows_written": 107148, + "estimate_rows": 107148 } } } @@ -671,24 +672,24 @@ { "request": { "method": "GET", - "path": "/datasets/operations/op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f" + "path": "/datasets/operations/op_d53662fbaac38ee0bd0801eab9630ebca0c8b467d33b0a1b2c6792d0cd83b7cf" }, "response": { "status": 200, "headers": { "content-type": "application/json", - "x-dfo-trace-id": "c501ba8d087b4561b2ff0e423c719ab0" + "x-dfo-trace-id": "2a08d19167d845478a587fcdca1b295b" }, "json": { "operation": { - "operation_id": "op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f", + "operation_id": "op_d53662fbaac38ee0bd0801eab9630ebca0c8b467d33b0a1b2c6792d0cd83b7cf", "status": "done" }, "manifest": { "schema_version": 1, "definition": { "schema_version": 1, - "spec_id": "spec_70ddf0ce6a9b3f147063f2adf37fab9e", + "spec_id": "spec_8d395f753219876fa459778f38499a80", "identity": { "shape": { "kind": "statvar_schema", @@ -720,7 +721,7 @@ }, { "binding": { - "ref": "Gross", + "ref": "Net", "state": "value" }, "property": "nettingBasis" @@ -901,14 +902,14 @@ "requested_window": { "kind": "range", "end_year": 2024, - "start_year": 1967 + "start_year": 1968 } } }, - "content_version": "cv_fafc60a507e03b0d42689fb1936127b9", - "prepared_at": "2026-10-26T09:22:44Z", + "content_version": "cv_e9cd9cba677e6dd0e2a81d5700d5edfb", + "prepared_at": "2026-11-01T07:38:40Z", "coverage": { - "rows": 107252, + "rows": 107148, "dimensions": [ { "label": "financingProvider", @@ -930,14 +931,14 @@ }, { "label": "years", - "count": 58 + "count": 57 } ], "window": { "kind": "range", "origin": "query", "end_year": 2024, - "start_year": 1967 + "start_year": 1968 } }, "citation": { @@ -964,8 +965,8 @@ "source_data_url": "https://webfs-dcd.oecd.org/files/dotStat/DSD_DAC2/Table2a_Data.zip", "attribution": "OECD (2026), OECD DAC2A, OECD Data Explorer, https://webfs-dcd.oecd.org/files/dotStat/DSD_DAC2/Table2a_Data.zip (accessed on 2026-10-12)", "update_cadence": "Quarterly", - "last_update": "2026-10-15", - "years_covered": "1960-2024", + "last_update": "2026-10-29", + "years_covered": "1960-2025", "granularity": "Annual, by provider and recipient", "currencies": [ "USD" @@ -976,8 +977,8 @@ "description": "The OECD publishes DAC2A in April, June, September and December. The complete table is downloaded from the OECD each time it is republished, and replaces the previous copy, so the data reflects the OECD's latest release." }, { - "transformation": "Exclude the partial preliminary year", - "description": "Before each full release, the OECD publishes preliminary data for the year that release covers, as reporters submit it. Until then, that year is partial, so the pipeline excludes it. Support for partial years is in development. Partial years will be marked incomplete, so they don't lead to incorrect or confusing analyses." + "transformation": "Mark the partial year", + "description": "The OECD publishes data for a year as donors report it, and its final release in December of the following year covers every donor. Until then, the year is partial. The pipeline publishes it, and the import's provenance names it in `partialObservationDate`." }, { "transformation": "Standardise providers and recipients", @@ -997,13 +998,23 @@ } ], "version_history": [ + { + "date": "2026-10-29", + "title": "Partial year published, marked as partial", + "changes": [ + { + "kind": "changed", + "note": "The partial year, which only some donors have reported ahead of the OECD's final release in December, is included, and the import's provenance marks it with `partialObservationDate`." + } + ] + }, { "date": "2026-10-15", - "title": "Partial preliminary year excluded", + "title": "Partial year excluded", "changes": [ { "kind": "changed", - "note": "The partial preliminary year published ahead of the next full release is excluded." + "note": "The partial year, which only some donors have reported ahead of the OECD's final release in December, is excluded." } ] }, @@ -1056,39 +1067,39 @@ "kind": "range", "origin": "query", "end_year": 2024, - "start_year": 1967 + "start_year": 1968 }, "graph_revision": null, "normalisations": [], "code_index_stamp": { - "exported_at": "2026-10-24T19:20:27Z", - "content_hash": "3d946d8f4986dbbe0fa3e5c4c917200381f529d89ce417c11daeb22df56eed99", + "exported_at": "2026-11-01T03:08:18Z", + "content_hash": "a1bde3be8710f5ba073e52aaaba73cf9156079c273c874372f54bb07a81b0f94", "graph_endpoint": "graph_release" }, "source_revisions": [ { "source": "provenance/OECDDAC2A", - "revision": "2026-10-15" + "revision": "2026-10-29" } ], - "capability_version": "dset_76f5fa7244511c58", - "materialiser_build": "d80df9f5fd598b7345255470932d202ee5d49942", + "capability_version": "dset_5282a0674178a233", + "materialiser_build": "ccb6617922c839ce3cd5615a3bbb65c70bfe1bde", "resolved_stat_vars": [ { - "ref": "dcid:Amount_FinancialFlow_Gross_Disbursement_DAC2aAidType206_Nominal", + "ref": "dcid:Amount_FinancialFlow_Net_Disbursement_DAC2aAidType206_Nominal", "roles": [ "financingProvider", "financingRecipient" ], - "observation_count": 107252 + "observation_count": 107148 } ], "family_member_count": 1, - "family_member_digest": "1a36e1a7292b1bfff95a5415de0be74cac7bb033217ed50e79faa8ce51a224c0", + "family_member_digest": "c2d373442ac21a31377df76cd343f156c72a530649757c399c6661cbf56c9a71", "frame_grammar_version": "1.1.0", - "origin_catalogue_build_id": "20261026T000018Z-0af2cac5", + "origin_catalogue_build_id": "20261029T171521Z-7d0a5854", "served_from": "materialise", - "confirmed_at": "2026-10-26T09:22:46.854499+00:00" + "confirmed_at": "2026-11-01T07:38:43.335353+00:00" }, "warnings": [], "diagnostics": [ @@ -1100,34 +1111,34 @@ ], "artifacts": [ { - "artifact_digest": "sha256:a8c742f8f416b2f3414c7a569f7c18b337c5ee9ae3012483583bad0b238f5c61", + "artifact_digest": "sha256:1effd75b0d46b45109033faa8adfba1dbdc83d285810fe8c878c953595456b57", "rendering": { "bundle": false, "format": "parquet", "layout": 4 }, - "bytes": 466531, + "bytes": 469908, "media_type": "application/vnd.apache.parquet", - "created_at": "2026-10-26T09:22:46.786678+00:00", + "created_at": "2026-11-01T07:38:43.262295+00:00", "tier": "working", - "url": "/api/datasets/spec_70ddf0ce6a9b3f147063f2adf37fab9e/cv_fafc60a507e03b0d42689fb1936127b9/files/sha256:a8c742f8f416b2f3414c7a569f7c18b337c5ee9ae3012483583bad0b238f5c61", - "enrichment_stamp": "08ed6c734fc69ea2204a21f4e1dd8b963f14dd1e03a2484c618049ac2e2d93d8" + "url": "/api/datasets/spec_8d395f753219876fa459778f38499a80/cv_e9cd9cba677e6dd0e2a81d5700d5edfb/files/sha256:1effd75b0d46b45109033faa8adfba1dbdc83d285810fe8c878c953595456b57", + "enrichment_stamp": "55887b871f7aa1c5d120cb2bee97086605351d5acfbec645ab027f562d0f65c5" }, { - "artifact_digest": "sha256:5247bafa55f84fe2f8bc348601acb955162c39a1a082e939945336470e5c5231", + "artifact_digest": "sha256:73e13b2b41415cb991b4416af6ddd4c6ccf9e2ebc9bbaa4818b197a9e6e9b1a2", "rendering": { "statistics": "series" }, - "bytes": 144985, + "bytes": 147458, "media_type": "application/vnd.apache.parquet", - "created_at": "2026-10-26T09:22:46.786678+00:00", + "created_at": "2026-11-01T07:38:43.262295+00:00", "tier": "working", - "url": "/api/datasets/spec_70ddf0ce6a9b3f147063f2adf37fab9e/cv_fafc60a507e03b0d42689fb1936127b9/files/sha256:5247bafa55f84fe2f8bc348601acb955162c39a1a082e939945336470e5c5231" + "url": "/api/datasets/spec_8d395f753219876fa459778f38499a80/cv_e9cd9cba677e6dd0e2a81d5700d5edfb/files/sha256:73e13b2b41415cb991b4416af6ddd4c6ccf9e2ebc9bbaa4818b197a9e6e9b1a2" } ], - "series_count": 3656, + "series_count": 3657, "output_options": { - "capability_version": "dset_76f5fa7244511c58", + "capability_version": "dset_5282a0674178a233", "columns": [ { "name": "stat_var", @@ -1151,7 +1162,7 @@ "name": "time_period", "kind": "grain", "droppable": false, - "distinct": 58 + "distinct": 57 }, { "name": "value", @@ -1210,7 +1221,8 @@ "covered": 32 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": false }, { "column": "financingProvider", @@ -1222,7 +1234,8 @@ "covered": 32 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": false }, { "column": "financingProvider", @@ -1234,7 +1247,8 @@ "covered": 32 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true }, { "column": "financingProvider", @@ -1246,7 +1260,8 @@ "covered": 32 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": false }, { "column": "financingProvider", @@ -1258,7 +1273,8 @@ "covered": 32 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true }, { "column": "financingProvider", @@ -1270,7 +1286,8 @@ "covered": 32 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true }, { "column": "financingProvider", @@ -1282,7 +1299,8 @@ "covered": 32 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true }, { "column": "financingRecipient", @@ -1294,7 +1312,8 @@ "covered": 133 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": false }, { "column": "financingRecipient", @@ -1312,7 +1331,8 @@ "label": "South Sudan" } ], - "truncated": false + "truncated": false, + "in_long_layout": false }, { "column": "financingRecipient", @@ -1324,7 +1344,8 @@ "covered": 133 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true }, { "column": "financingRecipient", @@ -1336,7 +1357,8 @@ "covered": 133 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": false }, { "column": "financingRecipient", @@ -1348,7 +1370,8 @@ "covered": 133 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true }, { "column": "financingRecipient", @@ -1360,7 +1383,8 @@ "covered": 133 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true }, { "column": "financingRecipient", @@ -1372,7 +1396,8 @@ "covered": 133 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true } ], "long_layout_defaults": [ @@ -1391,7 +1416,7 @@ "varying": [ { "column": "time_period", - "distinct": 58 + "distinct": 57 } ] }, @@ -1415,7 +1440,7 @@ "varying": [ { "column": "time_period", - "distinct": 58 + "distinct": 57 } ] }, @@ -1474,10 +1499,10 @@ ] } }, - "series_coverage_stamp": "e6e717ab8c77e84d010915893ede5809e9ecec67929a07cfafbcc2210edfa1eb", + "series_coverage_stamp": "ad27fd11738abb03d2d84dc214e223f04781609636cf678d0d08c385fb863d99", "retention": { "pinned": false, - "held_until": "2026-11-25T09:22:46.785219Z" + "held_until": "2026-12-01T07:38:43.261993Z" } } } @@ -1486,21 +1511,21 @@ { "request": { "method": "GET", - "origin_path": "/api/datasets/spec_70ddf0ce6a9b3f147063f2adf37fab9e/cv_fafc60a507e03b0d42689fb1936127b9/files/sha256:a8c742f8f416b2f3414c7a569f7c18b337c5ee9ae3012483583bad0b238f5c61" + "origin_path": "/api/datasets/spec_8d395f753219876fa459778f38499a80/cv_e9cd9cba677e6dd0e2a81d5700d5edfb/files/sha256:1effd75b0d46b45109033faa8adfba1dbdc83d285810fe8c878c953595456b57" }, "response": { "status": 302, "headers": { "content-type": "text/html", - "location": "https://storage.googleapis.com/dev-fin-observatory-datasets-working/sha256%3Aa8c742f8f416b2f3414c7a569f7c18b337c5ee9ae3012483583bad0b238f5c61?X-Goog-Signature=redacted", - "x-dfo-trace-id": "22f0d88923c14d74825b5f14d41c05b8" + "location": "https://storage.googleapis.com/dev-fin-observatory-datasets-working/sha256%3A1effd75b0d46b45109033faa8adfba1dbdc83d285810fe8c878c953595456b57?X-Goog-Signature=redacted", + "x-dfo-trace-id": "0758c8ebc1d44bb896d7880cc101fd6a" } } }, { "request": { "method": "GET", - "url": "https://storage.googleapis.com/dev-fin-observatory-datasets-working/sha256%3Aa8c742f8f416b2f3414c7a569f7c18b337c5ee9ae3012483583bad0b238f5c61?X-Goog-Signature=redacted" + "url": "https://storage.googleapis.com/dev-fin-observatory-datasets-working/sha256%3A1effd75b0d46b45109033faa8adfba1dbdc83d285810fe8c878c953595456b57?X-Goog-Signature=redacted" }, "response": { "status": 200, @@ -1514,7 +1539,7 @@ "expect": [ { "dataset": { - "rows": 107252, + "rows": 107148, "columns": [ "time_period", "financingProvider_label", @@ -1541,24 +1566,24 @@ "members": [ { "parts": [], - "spec_id": "spec_70ddf0ce6a9b3f147063f2adf37fab9e", - "content_version": "cv_fafc60a507e03b0d42689fb1936127b9", - "sentence": "Gross disbursements to the 133 G77 countries from the 32 DAC countries for official development assistance, 1967 to 2024. Current US dollars · OECD DAC2a." + "spec_id": "spec_8d395f753219876fa459778f38499a80", + "content_version": "cv_e9cd9cba677e6dd0e2a81d5700d5edfb", + "sentence": "Net disbursements to the 133 G77 countries from the 32 DAC countries for official development assistance, 1968 to 2024. Current US dollars · OECD DAC2a." } ], "missing": [], "long_builds": [ { - "operation_id": "op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f", + "operation_id": "op_d53662fbaac38ee0bd0801eab9630ebca0c8b467d33b0a1b2c6792d0cd83b7cf", "poll_waits": [ 1.5, 3.0, 1.5, 1.5, 1.5, - 1.784, - 2.289, - 2.934 + 1.797, + 2.302, + 2.919 ], "resubmissions": 0 } diff --git a/python/client-contract/src/dfo_client_contract/scenarios/fetch-spec-poll-refused-backoff.json b/python/client-contract/src/dfo_client_contract/scenarios/fetch-spec-poll-refused-backoff.json index a6ede46..9a834cb 100644 --- a/python/client-contract/src/dfo_client_contract/scenarios/fetch-spec-poll-refused-backoff.json +++ b/python/client-contract/src/dfo_client_contract/scenarios/fetch-spec-poll-refused-backoff.json @@ -11,10 +11,10 @@ { "op": "fetch", "spec": { - "spec_id": "spec_70ddf0ce6a9b3f147063f2adf37fab9e", + "spec_id": "spec_8d395f753219876fa459778f38499a80", "definition": { "schema_version": 1, - "spec_id": "spec_70ddf0ce6a9b3f147063f2adf37fab9e", + "spec_id": "spec_8d395f753219876fa459778f38499a80", "identity": { "identity_version": "spec1", "shape": { @@ -49,7 +49,7 @@ "property": "nettingBasis", "binding": { "state": "value", - "ref": "Gross" + "ref": "Net" } } ], @@ -226,12 +226,12 @@ }, "requested_window": { "kind": "range", - "start_year": 1967, + "start_year": 1968, "end_year": 2024 } } }, - "sentence": "Gross disbursements to the 133 G77 countries from the 32 DAC countries for official development assistance, 1967 to 2024. Current US dollars · OECD DAC2a.", + "sentence": "Net disbursements to the 133 G77 countries from the 32 DAC countries for official development assistance, 1968 to 2024. Current US dollars · OECD DAC2a.", "entity_groups": { "destination": { "label": "G77 countries", @@ -239,7 +239,8 @@ }, "origin": { "label": "DAC countries", - "group_id": "groups/OECD.DAC" + "group_id": "groups/OECD.DAC", + "sum_differs": true } } }, @@ -255,10 +256,10 @@ "schema_version": 1, "input": { "kind": "spec_id", - "spec_id": "spec_70ddf0ce6a9b3f147063f2adf37fab9e", + "spec_id": "spec_8d395f753219876fa459778f38499a80", "definition": { "schema_version": 1, - "spec_id": "spec_70ddf0ce6a9b3f147063f2adf37fab9e", + "spec_id": "spec_8d395f753219876fa459778f38499a80", "identity": { "identity_version": "spec1", "shape": { @@ -293,7 +294,7 @@ "property": "nettingBasis", "binding": { "state": "value", - "ref": "Gross" + "ref": "Net" } } ], @@ -470,7 +471,7 @@ }, "requested_window": { "kind": "range", - "start_year": 1967, + "start_year": 1968, "end_year": 2024 } } @@ -486,14 +487,14 @@ "status": 202, "headers": { "content-type": "application/json", - "location": "/api/datasets/operations/op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f", - "x-dfo-trace-id": "9e96509866ff4da09a698df1f19a5cbd" + "location": "/api/datasets/operations/op_d53662fbaac38ee0bd0801eab9630ebca0c8b467d33b0a1b2c6792d0cd83b7cf", + "x-dfo-trace-id": "7fd3deb153d34f4b9afce2b95ffdd664" }, "json": { "operation": { - "operation_id": "op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f", + "operation_id": "op_d53662fbaac38ee0bd0801eab9630ebca0c8b467d33b0a1b2c6792d0cd83b7cf", "status": "pending", - "poll": "/api/datasets/operations/op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f" + "poll": "/api/datasets/operations/op_d53662fbaac38ee0bd0801eab9630ebca0c8b467d33b0a1b2c6792d0cd83b7cf" } } } @@ -501,22 +502,22 @@ { "request": { "method": "GET", - "path": "/datasets/operations/op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f" + "path": "/datasets/operations/op_d53662fbaac38ee0bd0801eab9630ebca0c8b467d33b0a1b2c6792d0cd83b7cf" }, "response": { "status": 200, "headers": { "content-type": "application/json", - "x-dfo-trace-id": "6185b86217ef499bb5b6932299df1207" + "x-dfo-trace-id": "55b37040b90c4b51bb1432fb7f565e8d" }, "json": { "operation": { - "operation_id": "op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f", + "operation_id": "op_d53662fbaac38ee0bd0801eab9630ebca0c8b467d33b0a1b2c6792d0cd83b7cf", "status": "running", - "poll": "/api/datasets/operations/op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f", + "poll": "/api/datasets/operations/op_d53662fbaac38ee0bd0801eab9630ebca0c8b467d33b0a1b2c6792d0cd83b7cf", "progress": { "rows_written": 0, - "estimate_rows": 107252 + "estimate_rows": 107148 } } } @@ -525,7 +526,7 @@ { "request": { "method": "GET", - "path": "/datasets/operations/op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f" + "path": "/datasets/operations/op_d53662fbaac38ee0bd0801eab9630ebca0c8b467d33b0a1b2c6792d0cd83b7cf" }, "response": { "status": 503, @@ -547,22 +548,22 @@ { "request": { "method": "GET", - "path": "/datasets/operations/op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f" + "path": "/datasets/operations/op_d53662fbaac38ee0bd0801eab9630ebca0c8b467d33b0a1b2c6792d0cd83b7cf" }, "response": { "status": 200, "headers": { "content-type": "application/json", - "x-dfo-trace-id": "1ebea3ca2d15409c953cd716bdc1fccf" + "x-dfo-trace-id": "76621ada279a42da9405c03760d3fa30" }, "json": { "operation": { - "operation_id": "op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f", + "operation_id": "op_d53662fbaac38ee0bd0801eab9630ebca0c8b467d33b0a1b2c6792d0cd83b7cf", "status": "running", - "poll": "/api/datasets/operations/op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f", + "poll": "/api/datasets/operations/op_d53662fbaac38ee0bd0801eab9630ebca0c8b467d33b0a1b2c6792d0cd83b7cf", "progress": { - "rows_written": 61927, - "estimate_rows": 107252 + "rows_written": 50967, + "estimate_rows": 107148 } } } @@ -571,22 +572,22 @@ { "request": { "method": "GET", - "path": "/datasets/operations/op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f" + "path": "/datasets/operations/op_d53662fbaac38ee0bd0801eab9630ebca0c8b467d33b0a1b2c6792d0cd83b7cf" }, "response": { "status": 200, "headers": { "content-type": "application/json", - "x-dfo-trace-id": "94bb5a8a7c2041969d9a9118b75dc4aa" + "x-dfo-trace-id": "f489220d020f40cabbd29c2e1d57a188" }, "json": { "operation": { - "operation_id": "op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f", + "operation_id": "op_d53662fbaac38ee0bd0801eab9630ebca0c8b467d33b0a1b2c6792d0cd83b7cf", "status": "running", - "poll": "/api/datasets/operations/op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f", + "poll": "/api/datasets/operations/op_d53662fbaac38ee0bd0801eab9630ebca0c8b467d33b0a1b2c6792d0cd83b7cf", "progress": { - "rows_written": 107252, - "estimate_rows": 107252 + "rows_written": 107148, + "estimate_rows": 107148 } } } @@ -595,22 +596,22 @@ { "request": { "method": "GET", - "path": "/datasets/operations/op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f" + "path": "/datasets/operations/op_d53662fbaac38ee0bd0801eab9630ebca0c8b467d33b0a1b2c6792d0cd83b7cf" }, "response": { "status": 200, "headers": { "content-type": "application/json", - "x-dfo-trace-id": "c78757a54b9f4b6786a784f8a47ad5b4" + "x-dfo-trace-id": "9855026593bc4f158bc5bcdea3bd1809" }, "json": { "operation": { - "operation_id": "op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f", + "operation_id": "op_d53662fbaac38ee0bd0801eab9630ebca0c8b467d33b0a1b2c6792d0cd83b7cf", "status": "running", - "poll": "/api/datasets/operations/op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f", + "poll": "/api/datasets/operations/op_d53662fbaac38ee0bd0801eab9630ebca0c8b467d33b0a1b2c6792d0cd83b7cf", "progress": { - "rows_written": 107252, - "estimate_rows": 107252 + "rows_written": 107148, + "estimate_rows": 107148 } } } @@ -619,22 +620,22 @@ { "request": { "method": "GET", - "path": "/datasets/operations/op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f" + "path": "/datasets/operations/op_d53662fbaac38ee0bd0801eab9630ebca0c8b467d33b0a1b2c6792d0cd83b7cf" }, "response": { "status": 200, "headers": { "content-type": "application/json", - "x-dfo-trace-id": "914bfd57942740b893ba9ca1b4f4591b" + "x-dfo-trace-id": "119eba2f4a1b446aa13d7abc8d39a2a9" }, "json": { "operation": { - "operation_id": "op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f", + "operation_id": "op_d53662fbaac38ee0bd0801eab9630ebca0c8b467d33b0a1b2c6792d0cd83b7cf", "status": "running", - "poll": "/api/datasets/operations/op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f", + "poll": "/api/datasets/operations/op_d53662fbaac38ee0bd0801eab9630ebca0c8b467d33b0a1b2c6792d0cd83b7cf", "progress": { - "rows_written": 107252, - "estimate_rows": 107252 + "rows_written": 107148, + "estimate_rows": 107148 } } } @@ -643,22 +644,22 @@ { "request": { "method": "GET", - "path": "/datasets/operations/op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f" + "path": "/datasets/operations/op_d53662fbaac38ee0bd0801eab9630ebca0c8b467d33b0a1b2c6792d0cd83b7cf" }, "response": { "status": 200, "headers": { "content-type": "application/json", - "x-dfo-trace-id": "217766e0425f4916a393331295c4a7e7" + "x-dfo-trace-id": "1019c2a1661647d193bda3dd1a96847a" }, "json": { "operation": { - "operation_id": "op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f", + "operation_id": "op_d53662fbaac38ee0bd0801eab9630ebca0c8b467d33b0a1b2c6792d0cd83b7cf", "status": "running", - "poll": "/api/datasets/operations/op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f", + "poll": "/api/datasets/operations/op_d53662fbaac38ee0bd0801eab9630ebca0c8b467d33b0a1b2c6792d0cd83b7cf", "progress": { - "rows_written": 107252, - "estimate_rows": 107252 + "rows_written": 107148, + "estimate_rows": 107148 } } } @@ -667,24 +668,24 @@ { "request": { "method": "GET", - "path": "/datasets/operations/op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f" + "path": "/datasets/operations/op_d53662fbaac38ee0bd0801eab9630ebca0c8b467d33b0a1b2c6792d0cd83b7cf" }, "response": { "status": 200, "headers": { "content-type": "application/json", - "x-dfo-trace-id": "c501ba8d087b4561b2ff0e423c719ab0" + "x-dfo-trace-id": "2a08d19167d845478a587fcdca1b295b" }, "json": { "operation": { - "operation_id": "op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f", + "operation_id": "op_d53662fbaac38ee0bd0801eab9630ebca0c8b467d33b0a1b2c6792d0cd83b7cf", "status": "done" }, "manifest": { "schema_version": 1, "definition": { "schema_version": 1, - "spec_id": "spec_70ddf0ce6a9b3f147063f2adf37fab9e", + "spec_id": "spec_8d395f753219876fa459778f38499a80", "identity": { "shape": { "kind": "statvar_schema", @@ -716,7 +717,7 @@ }, { "binding": { - "ref": "Gross", + "ref": "Net", "state": "value" }, "property": "nettingBasis" @@ -897,14 +898,14 @@ "requested_window": { "kind": "range", "end_year": 2024, - "start_year": 1967 + "start_year": 1968 } } }, - "content_version": "cv_fafc60a507e03b0d42689fb1936127b9", - "prepared_at": "2026-10-26T09:22:44Z", + "content_version": "cv_e9cd9cba677e6dd0e2a81d5700d5edfb", + "prepared_at": "2026-11-01T07:38:40Z", "coverage": { - "rows": 107252, + "rows": 107148, "dimensions": [ { "label": "financingProvider", @@ -926,14 +927,14 @@ }, { "label": "years", - "count": 58 + "count": 57 } ], "window": { "kind": "range", "origin": "query", "end_year": 2024, - "start_year": 1967 + "start_year": 1968 } }, "citation": { @@ -960,8 +961,8 @@ "source_data_url": "https://webfs-dcd.oecd.org/files/dotStat/DSD_DAC2/Table2a_Data.zip", "attribution": "OECD (2026), OECD DAC2A, OECD Data Explorer, https://webfs-dcd.oecd.org/files/dotStat/DSD_DAC2/Table2a_Data.zip (accessed on 2026-10-12)", "update_cadence": "Quarterly", - "last_update": "2026-10-15", - "years_covered": "1960-2024", + "last_update": "2026-10-29", + "years_covered": "1960-2025", "granularity": "Annual, by provider and recipient", "currencies": [ "USD" @@ -972,8 +973,8 @@ "description": "The OECD publishes DAC2A in April, June, September and December. The complete table is downloaded from the OECD each time it is republished, and replaces the previous copy, so the data reflects the OECD's latest release." }, { - "transformation": "Exclude the partial preliminary year", - "description": "Before each full release, the OECD publishes preliminary data for the year that release covers, as reporters submit it. Until then, that year is partial, so the pipeline excludes it. Support for partial years is in development. Partial years will be marked incomplete, so they don't lead to incorrect or confusing analyses." + "transformation": "Mark the partial year", + "description": "The OECD publishes data for a year as donors report it, and its final release in December of the following year covers every donor. Until then, the year is partial. The pipeline publishes it, and the import's provenance names it in `partialObservationDate`." }, { "transformation": "Standardise providers and recipients", @@ -993,13 +994,23 @@ } ], "version_history": [ + { + "date": "2026-10-29", + "title": "Partial year published, marked as partial", + "changes": [ + { + "kind": "changed", + "note": "The partial year, which only some donors have reported ahead of the OECD's final release in December, is included, and the import's provenance marks it with `partialObservationDate`." + } + ] + }, { "date": "2026-10-15", - "title": "Partial preliminary year excluded", + "title": "Partial year excluded", "changes": [ { "kind": "changed", - "note": "The partial preliminary year published ahead of the next full release is excluded." + "note": "The partial year, which only some donors have reported ahead of the OECD's final release in December, is excluded." } ] }, @@ -1052,39 +1063,39 @@ "kind": "range", "origin": "query", "end_year": 2024, - "start_year": 1967 + "start_year": 1968 }, "graph_revision": null, "normalisations": [], "code_index_stamp": { - "exported_at": "2026-10-24T19:20:27Z", - "content_hash": "3d946d8f4986dbbe0fa3e5c4c917200381f529d89ce417c11daeb22df56eed99", + "exported_at": "2026-11-01T03:08:18Z", + "content_hash": "a1bde3be8710f5ba073e52aaaba73cf9156079c273c874372f54bb07a81b0f94", "graph_endpoint": "graph_release" }, "source_revisions": [ { "source": "provenance/OECDDAC2A", - "revision": "2026-10-15" + "revision": "2026-10-29" } ], - "capability_version": "dset_76f5fa7244511c58", - "materialiser_build": "d80df9f5fd598b7345255470932d202ee5d49942", + "capability_version": "dset_5282a0674178a233", + "materialiser_build": "ccb6617922c839ce3cd5615a3bbb65c70bfe1bde", "resolved_stat_vars": [ { - "ref": "dcid:Amount_FinancialFlow_Gross_Disbursement_DAC2aAidType206_Nominal", + "ref": "dcid:Amount_FinancialFlow_Net_Disbursement_DAC2aAidType206_Nominal", "roles": [ "financingProvider", "financingRecipient" ], - "observation_count": 107252 + "observation_count": 107148 } ], "family_member_count": 1, - "family_member_digest": "1a36e1a7292b1bfff95a5415de0be74cac7bb033217ed50e79faa8ce51a224c0", + "family_member_digest": "c2d373442ac21a31377df76cd343f156c72a530649757c399c6661cbf56c9a71", "frame_grammar_version": "1.1.0", - "origin_catalogue_build_id": "20261026T000018Z-0af2cac5", + "origin_catalogue_build_id": "20261029T171521Z-7d0a5854", "served_from": "materialise", - "confirmed_at": "2026-10-26T09:22:46.854499+00:00" + "confirmed_at": "2026-11-01T07:38:43.335353+00:00" }, "warnings": [], "diagnostics": [ @@ -1096,34 +1107,34 @@ ], "artifacts": [ { - "artifact_digest": "sha256:a8c742f8f416b2f3414c7a569f7c18b337c5ee9ae3012483583bad0b238f5c61", + "artifact_digest": "sha256:1effd75b0d46b45109033faa8adfba1dbdc83d285810fe8c878c953595456b57", "rendering": { "bundle": false, "format": "parquet", "layout": 4 }, - "bytes": 466531, + "bytes": 469908, "media_type": "application/vnd.apache.parquet", - "created_at": "2026-10-26T09:22:46.786678+00:00", + "created_at": "2026-11-01T07:38:43.262295+00:00", "tier": "working", - "url": "/api/datasets/spec_70ddf0ce6a9b3f147063f2adf37fab9e/cv_fafc60a507e03b0d42689fb1936127b9/files/sha256:a8c742f8f416b2f3414c7a569f7c18b337c5ee9ae3012483583bad0b238f5c61", - "enrichment_stamp": "08ed6c734fc69ea2204a21f4e1dd8b963f14dd1e03a2484c618049ac2e2d93d8" + "url": "/api/datasets/spec_8d395f753219876fa459778f38499a80/cv_e9cd9cba677e6dd0e2a81d5700d5edfb/files/sha256:1effd75b0d46b45109033faa8adfba1dbdc83d285810fe8c878c953595456b57", + "enrichment_stamp": "55887b871f7aa1c5d120cb2bee97086605351d5acfbec645ab027f562d0f65c5" }, { - "artifact_digest": "sha256:5247bafa55f84fe2f8bc348601acb955162c39a1a082e939945336470e5c5231", + "artifact_digest": "sha256:73e13b2b41415cb991b4416af6ddd4c6ccf9e2ebc9bbaa4818b197a9e6e9b1a2", "rendering": { "statistics": "series" }, - "bytes": 144985, + "bytes": 147458, "media_type": "application/vnd.apache.parquet", - "created_at": "2026-10-26T09:22:46.786678+00:00", + "created_at": "2026-11-01T07:38:43.262295+00:00", "tier": "working", - "url": "/api/datasets/spec_70ddf0ce6a9b3f147063f2adf37fab9e/cv_fafc60a507e03b0d42689fb1936127b9/files/sha256:5247bafa55f84fe2f8bc348601acb955162c39a1a082e939945336470e5c5231" + "url": "/api/datasets/spec_8d395f753219876fa459778f38499a80/cv_e9cd9cba677e6dd0e2a81d5700d5edfb/files/sha256:73e13b2b41415cb991b4416af6ddd4c6ccf9e2ebc9bbaa4818b197a9e6e9b1a2" } ], - "series_count": 3656, + "series_count": 3657, "output_options": { - "capability_version": "dset_76f5fa7244511c58", + "capability_version": "dset_5282a0674178a233", "columns": [ { "name": "stat_var", @@ -1147,7 +1158,7 @@ "name": "time_period", "kind": "grain", "droppable": false, - "distinct": 58 + "distinct": 57 }, { "name": "value", @@ -1206,7 +1217,8 @@ "covered": 32 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": false }, { "column": "financingProvider", @@ -1218,7 +1230,8 @@ "covered": 32 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": false }, { "column": "financingProvider", @@ -1230,7 +1243,8 @@ "covered": 32 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true }, { "column": "financingProvider", @@ -1242,7 +1256,8 @@ "covered": 32 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": false }, { "column": "financingProvider", @@ -1254,7 +1269,8 @@ "covered": 32 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true }, { "column": "financingProvider", @@ -1266,7 +1282,8 @@ "covered": 32 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true }, { "column": "financingProvider", @@ -1278,7 +1295,8 @@ "covered": 32 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true }, { "column": "financingRecipient", @@ -1290,7 +1308,8 @@ "covered": 133 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": false }, { "column": "financingRecipient", @@ -1308,7 +1327,8 @@ "label": "South Sudan" } ], - "truncated": false + "truncated": false, + "in_long_layout": false }, { "column": "financingRecipient", @@ -1320,7 +1340,8 @@ "covered": 133 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true }, { "column": "financingRecipient", @@ -1332,7 +1353,8 @@ "covered": 133 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": false }, { "column": "financingRecipient", @@ -1344,7 +1366,8 @@ "covered": 133 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true }, { "column": "financingRecipient", @@ -1356,7 +1379,8 @@ "covered": 133 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true }, { "column": "financingRecipient", @@ -1368,7 +1392,8 @@ "covered": 133 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true } ], "long_layout_defaults": [ @@ -1387,7 +1412,7 @@ "varying": [ { "column": "time_period", - "distinct": 58 + "distinct": 57 } ] }, @@ -1411,7 +1436,7 @@ "varying": [ { "column": "time_period", - "distinct": 58 + "distinct": 57 } ] }, @@ -1470,10 +1495,10 @@ ] } }, - "series_coverage_stamp": "e6e717ab8c77e84d010915893ede5809e9ecec67929a07cfafbcc2210edfa1eb", + "series_coverage_stamp": "ad27fd11738abb03d2d84dc214e223f04781609636cf678d0d08c385fb863d99", "retention": { "pinned": false, - "held_until": "2026-11-25T09:22:46.785219Z" + "held_until": "2026-12-01T07:38:43.261993Z" } } } @@ -1482,21 +1507,21 @@ { "request": { "method": "GET", - "origin_path": "/api/datasets/spec_70ddf0ce6a9b3f147063f2adf37fab9e/cv_fafc60a507e03b0d42689fb1936127b9/files/sha256:a8c742f8f416b2f3414c7a569f7c18b337c5ee9ae3012483583bad0b238f5c61" + "origin_path": "/api/datasets/spec_8d395f753219876fa459778f38499a80/cv_e9cd9cba677e6dd0e2a81d5700d5edfb/files/sha256:1effd75b0d46b45109033faa8adfba1dbdc83d285810fe8c878c953595456b57" }, "response": { "status": 302, "headers": { "content-type": "text/html", - "location": "https://storage.googleapis.com/dev-fin-observatory-datasets-working/sha256%3Aa8c742f8f416b2f3414c7a569f7c18b337c5ee9ae3012483583bad0b238f5c61?X-Goog-Signature=redacted", - "x-dfo-trace-id": "22f0d88923c14d74825b5f14d41c05b8" + "location": "https://storage.googleapis.com/dev-fin-observatory-datasets-working/sha256%3A1effd75b0d46b45109033faa8adfba1dbdc83d285810fe8c878c953595456b57?X-Goog-Signature=redacted", + "x-dfo-trace-id": "0758c8ebc1d44bb896d7880cc101fd6a" } } }, { "request": { "method": "GET", - "url": "https://storage.googleapis.com/dev-fin-observatory-datasets-working/sha256%3Aa8c742f8f416b2f3414c7a569f7c18b337c5ee9ae3012483583bad0b238f5c61?X-Goog-Signature=redacted" + "url": "https://storage.googleapis.com/dev-fin-observatory-datasets-working/sha256%3A1effd75b0d46b45109033faa8adfba1dbdc83d285810fe8c878c953595456b57?X-Goog-Signature=redacted" }, "response": { "status": 200, @@ -1510,7 +1535,7 @@ "expect": [ { "dataset": { - "rows": 107252, + "rows": 107148, "columns": [ "time_period", "financingProvider_label", @@ -1537,15 +1562,15 @@ "members": [ { "parts": [], - "spec_id": "spec_70ddf0ce6a9b3f147063f2adf37fab9e", - "content_version": "cv_fafc60a507e03b0d42689fb1936127b9", - "sentence": "Gross disbursements to the 133 G77 countries from the 32 DAC countries for official development assistance, 1967 to 2024. Current US dollars · OECD DAC2a." + "spec_id": "spec_8d395f753219876fa459778f38499a80", + "content_version": "cv_e9cd9cba677e6dd0e2a81d5700d5edfb", + "sentence": "Net disbursements to the 133 G77 countries from the 32 DAC countries for official development assistance, 1968 to 2024. Current US dollars · OECD DAC2a." } ], "missing": [], "long_builds": [ { - "operation_id": "op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f", + "operation_id": "op_d53662fbaac38ee0bd0801eab9630ebca0c8b467d33b0a1b2c6792d0cd83b7cf", "poll_waits": [ 1.0, 2.0, diff --git a/python/client-contract/src/dfo_client_contract/scenarios/fetch-spec-poll-refused-retry-after.json b/python/client-contract/src/dfo_client_contract/scenarios/fetch-spec-poll-refused-retry-after.json index 322e6f8..36c1098 100644 --- a/python/client-contract/src/dfo_client_contract/scenarios/fetch-spec-poll-refused-retry-after.json +++ b/python/client-contract/src/dfo_client_contract/scenarios/fetch-spec-poll-refused-retry-after.json @@ -11,10 +11,10 @@ { "op": "fetch", "spec": { - "spec_id": "spec_70ddf0ce6a9b3f147063f2adf37fab9e", + "spec_id": "spec_8d395f753219876fa459778f38499a80", "definition": { "schema_version": 1, - "spec_id": "spec_70ddf0ce6a9b3f147063f2adf37fab9e", + "spec_id": "spec_8d395f753219876fa459778f38499a80", "identity": { "identity_version": "spec1", "shape": { @@ -49,7 +49,7 @@ "property": "nettingBasis", "binding": { "state": "value", - "ref": "Gross" + "ref": "Net" } } ], @@ -226,12 +226,12 @@ }, "requested_window": { "kind": "range", - "start_year": 1967, + "start_year": 1968, "end_year": 2024 } } }, - "sentence": "Gross disbursements to the 133 G77 countries from the 32 DAC countries for official development assistance, 1967 to 2024. Current US dollars · OECD DAC2a.", + "sentence": "Net disbursements to the 133 G77 countries from the 32 DAC countries for official development assistance, 1968 to 2024. Current US dollars · OECD DAC2a.", "entity_groups": { "destination": { "label": "G77 countries", @@ -239,7 +239,8 @@ }, "origin": { "label": "DAC countries", - "group_id": "groups/OECD.DAC" + "group_id": "groups/OECD.DAC", + "sum_differs": true } } }, @@ -255,10 +256,10 @@ "schema_version": 1, "input": { "kind": "spec_id", - "spec_id": "spec_70ddf0ce6a9b3f147063f2adf37fab9e", + "spec_id": "spec_8d395f753219876fa459778f38499a80", "definition": { "schema_version": 1, - "spec_id": "spec_70ddf0ce6a9b3f147063f2adf37fab9e", + "spec_id": "spec_8d395f753219876fa459778f38499a80", "identity": { "identity_version": "spec1", "shape": { @@ -293,7 +294,7 @@ "property": "nettingBasis", "binding": { "state": "value", - "ref": "Gross" + "ref": "Net" } } ], @@ -470,7 +471,7 @@ }, "requested_window": { "kind": "range", - "start_year": 1967, + "start_year": 1968, "end_year": 2024 } } @@ -486,15 +487,15 @@ "status": 202, "headers": { "content-type": "application/json", - "location": "/api/datasets/operations/op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f", + "location": "/api/datasets/operations/op_d53662fbaac38ee0bd0801eab9630ebca0c8b467d33b0a1b2c6792d0cd83b7cf", "retry-after": "2", - "x-dfo-trace-id": "9e96509866ff4da09a698df1f19a5cbd" + "x-dfo-trace-id": "7fd3deb153d34f4b9afce2b95ffdd664" }, "json": { "operation": { - "operation_id": "op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f", + "operation_id": "op_d53662fbaac38ee0bd0801eab9630ebca0c8b467d33b0a1b2c6792d0cd83b7cf", "status": "pending", - "poll": "/api/datasets/operations/op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f", + "poll": "/api/datasets/operations/op_d53662fbaac38ee0bd0801eab9630ebca0c8b467d33b0a1b2c6792d0cd83b7cf", "retry_after_ms": 1500 } } @@ -503,7 +504,7 @@ { "request": { "method": "GET", - "path": "/datasets/operations/op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f" + "path": "/datasets/operations/op_d53662fbaac38ee0bd0801eab9630ebca0c8b467d33b0a1b2c6792d0cd83b7cf" }, "response": { "status": 503, @@ -526,24 +527,24 @@ { "request": { "method": "GET", - "path": "/datasets/operations/op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f" + "path": "/datasets/operations/op_d53662fbaac38ee0bd0801eab9630ebca0c8b467d33b0a1b2c6792d0cd83b7cf" }, "response": { "status": 200, "headers": { "content-type": "application/json", "retry-after": "2", - "x-dfo-trace-id": "6185b86217ef499bb5b6932299df1207" + "x-dfo-trace-id": "55b37040b90c4b51bb1432fb7f565e8d" }, "json": { "operation": { - "operation_id": "op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f", + "operation_id": "op_d53662fbaac38ee0bd0801eab9630ebca0c8b467d33b0a1b2c6792d0cd83b7cf", "status": "running", - "poll": "/api/datasets/operations/op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f", + "poll": "/api/datasets/operations/op_d53662fbaac38ee0bd0801eab9630ebca0c8b467d33b0a1b2c6792d0cd83b7cf", "retry_after_ms": 1500, "progress": { "rows_written": 0, - "estimate_rows": 107252 + "estimate_rows": 107148 } } } @@ -552,24 +553,24 @@ { "request": { "method": "GET", - "path": "/datasets/operations/op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f" + "path": "/datasets/operations/op_d53662fbaac38ee0bd0801eab9630ebca0c8b467d33b0a1b2c6792d0cd83b7cf" }, "response": { "status": 200, "headers": { "content-type": "application/json", "retry-after": "2", - "x-dfo-trace-id": "1ebea3ca2d15409c953cd716bdc1fccf" + "x-dfo-trace-id": "76621ada279a42da9405c03760d3fa30" }, "json": { "operation": { - "operation_id": "op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f", + "operation_id": "op_d53662fbaac38ee0bd0801eab9630ebca0c8b467d33b0a1b2c6792d0cd83b7cf", "status": "running", - "poll": "/api/datasets/operations/op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f", + "poll": "/api/datasets/operations/op_d53662fbaac38ee0bd0801eab9630ebca0c8b467d33b0a1b2c6792d0cd83b7cf", "retry_after_ms": 1500, "progress": { - "rows_written": 61927, - "estimate_rows": 107252 + "rows_written": 50967, + "estimate_rows": 107148 } } } @@ -578,24 +579,24 @@ { "request": { "method": "GET", - "path": "/datasets/operations/op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f" + "path": "/datasets/operations/op_d53662fbaac38ee0bd0801eab9630ebca0c8b467d33b0a1b2c6792d0cd83b7cf" }, "response": { "status": 200, "headers": { "content-type": "application/json", "retry-after": "2", - "x-dfo-trace-id": "94bb5a8a7c2041969d9a9118b75dc4aa" + "x-dfo-trace-id": "f489220d020f40cabbd29c2e1d57a188" }, "json": { "operation": { - "operation_id": "op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f", + "operation_id": "op_d53662fbaac38ee0bd0801eab9630ebca0c8b467d33b0a1b2c6792d0cd83b7cf", "status": "running", - "poll": "/api/datasets/operations/op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f", + "poll": "/api/datasets/operations/op_d53662fbaac38ee0bd0801eab9630ebca0c8b467d33b0a1b2c6792d0cd83b7cf", "retry_after_ms": 1500, "progress": { - "rows_written": 107252, - "estimate_rows": 107252 + "rows_written": 107148, + "estimate_rows": 107148 } } } @@ -604,24 +605,24 @@ { "request": { "method": "GET", - "path": "/datasets/operations/op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f" + "path": "/datasets/operations/op_d53662fbaac38ee0bd0801eab9630ebca0c8b467d33b0a1b2c6792d0cd83b7cf" }, "response": { "status": 200, "headers": { "content-type": "application/json", "retry-after": "2", - "x-dfo-trace-id": "c78757a54b9f4b6786a784f8a47ad5b4" + "x-dfo-trace-id": "9855026593bc4f158bc5bcdea3bd1809" }, "json": { "operation": { - "operation_id": "op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f", + "operation_id": "op_d53662fbaac38ee0bd0801eab9630ebca0c8b467d33b0a1b2c6792d0cd83b7cf", "status": "running", - "poll": "/api/datasets/operations/op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f", - "retry_after_ms": 1784, + "poll": "/api/datasets/operations/op_d53662fbaac38ee0bd0801eab9630ebca0c8b467d33b0a1b2c6792d0cd83b7cf", + "retry_after_ms": 1797, "progress": { - "rows_written": 107252, - "estimate_rows": 107252 + "rows_written": 107148, + "estimate_rows": 107148 } } } @@ -630,24 +631,24 @@ { "request": { "method": "GET", - "path": "/datasets/operations/op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f" + "path": "/datasets/operations/op_d53662fbaac38ee0bd0801eab9630ebca0c8b467d33b0a1b2c6792d0cd83b7cf" }, "response": { "status": 200, "headers": { "content-type": "application/json", "retry-after": "3", - "x-dfo-trace-id": "914bfd57942740b893ba9ca1b4f4591b" + "x-dfo-trace-id": "119eba2f4a1b446aa13d7abc8d39a2a9" }, "json": { "operation": { - "operation_id": "op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f", + "operation_id": "op_d53662fbaac38ee0bd0801eab9630ebca0c8b467d33b0a1b2c6792d0cd83b7cf", "status": "running", - "poll": "/api/datasets/operations/op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f", - "retry_after_ms": 2289, + "poll": "/api/datasets/operations/op_d53662fbaac38ee0bd0801eab9630ebca0c8b467d33b0a1b2c6792d0cd83b7cf", + "retry_after_ms": 2302, "progress": { - "rows_written": 107252, - "estimate_rows": 107252 + "rows_written": 107148, + "estimate_rows": 107148 } } } @@ -656,24 +657,24 @@ { "request": { "method": "GET", - "path": "/datasets/operations/op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f" + "path": "/datasets/operations/op_d53662fbaac38ee0bd0801eab9630ebca0c8b467d33b0a1b2c6792d0cd83b7cf" }, "response": { "status": 200, "headers": { "content-type": "application/json", "retry-after": "3", - "x-dfo-trace-id": "217766e0425f4916a393331295c4a7e7" + "x-dfo-trace-id": "1019c2a1661647d193bda3dd1a96847a" }, "json": { "operation": { - "operation_id": "op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f", + "operation_id": "op_d53662fbaac38ee0bd0801eab9630ebca0c8b467d33b0a1b2c6792d0cd83b7cf", "status": "running", - "poll": "/api/datasets/operations/op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f", - "retry_after_ms": 2934, + "poll": "/api/datasets/operations/op_d53662fbaac38ee0bd0801eab9630ebca0c8b467d33b0a1b2c6792d0cd83b7cf", + "retry_after_ms": 2919, "progress": { - "rows_written": 107252, - "estimate_rows": 107252 + "rows_written": 107148, + "estimate_rows": 107148 } } } @@ -682,24 +683,24 @@ { "request": { "method": "GET", - "path": "/datasets/operations/op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f" + "path": "/datasets/operations/op_d53662fbaac38ee0bd0801eab9630ebca0c8b467d33b0a1b2c6792d0cd83b7cf" }, "response": { "status": 200, "headers": { "content-type": "application/json", - "x-dfo-trace-id": "c501ba8d087b4561b2ff0e423c719ab0" + "x-dfo-trace-id": "2a08d19167d845478a587fcdca1b295b" }, "json": { "operation": { - "operation_id": "op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f", + "operation_id": "op_d53662fbaac38ee0bd0801eab9630ebca0c8b467d33b0a1b2c6792d0cd83b7cf", "status": "done" }, "manifest": { "schema_version": 1, "definition": { "schema_version": 1, - "spec_id": "spec_70ddf0ce6a9b3f147063f2adf37fab9e", + "spec_id": "spec_8d395f753219876fa459778f38499a80", "identity": { "shape": { "kind": "statvar_schema", @@ -731,7 +732,7 @@ }, { "binding": { - "ref": "Gross", + "ref": "Net", "state": "value" }, "property": "nettingBasis" @@ -912,14 +913,14 @@ "requested_window": { "kind": "range", "end_year": 2024, - "start_year": 1967 + "start_year": 1968 } } }, - "content_version": "cv_fafc60a507e03b0d42689fb1936127b9", - "prepared_at": "2026-10-26T09:22:44Z", + "content_version": "cv_e9cd9cba677e6dd0e2a81d5700d5edfb", + "prepared_at": "2026-11-01T07:38:40Z", "coverage": { - "rows": 107252, + "rows": 107148, "dimensions": [ { "label": "financingProvider", @@ -941,14 +942,14 @@ }, { "label": "years", - "count": 58 + "count": 57 } ], "window": { "kind": "range", "origin": "query", "end_year": 2024, - "start_year": 1967 + "start_year": 1968 } }, "citation": { @@ -975,8 +976,8 @@ "source_data_url": "https://webfs-dcd.oecd.org/files/dotStat/DSD_DAC2/Table2a_Data.zip", "attribution": "OECD (2026), OECD DAC2A, OECD Data Explorer, https://webfs-dcd.oecd.org/files/dotStat/DSD_DAC2/Table2a_Data.zip (accessed on 2026-10-12)", "update_cadence": "Quarterly", - "last_update": "2026-10-15", - "years_covered": "1960-2024", + "last_update": "2026-10-29", + "years_covered": "1960-2025", "granularity": "Annual, by provider and recipient", "currencies": [ "USD" @@ -987,8 +988,8 @@ "description": "The OECD publishes DAC2A in April, June, September and December. The complete table is downloaded from the OECD each time it is republished, and replaces the previous copy, so the data reflects the OECD's latest release." }, { - "transformation": "Exclude the partial preliminary year", - "description": "Before each full release, the OECD publishes preliminary data for the year that release covers, as reporters submit it. Until then, that year is partial, so the pipeline excludes it. Support for partial years is in development. Partial years will be marked incomplete, so they don't lead to incorrect or confusing analyses." + "transformation": "Mark the partial year", + "description": "The OECD publishes data for a year as donors report it, and its final release in December of the following year covers every donor. Until then, the year is partial. The pipeline publishes it, and the import's provenance names it in `partialObservationDate`." }, { "transformation": "Standardise providers and recipients", @@ -1008,13 +1009,23 @@ } ], "version_history": [ + { + "date": "2026-10-29", + "title": "Partial year published, marked as partial", + "changes": [ + { + "kind": "changed", + "note": "The partial year, which only some donors have reported ahead of the OECD's final release in December, is included, and the import's provenance marks it with `partialObservationDate`." + } + ] + }, { "date": "2026-10-15", - "title": "Partial preliminary year excluded", + "title": "Partial year excluded", "changes": [ { "kind": "changed", - "note": "The partial preliminary year published ahead of the next full release is excluded." + "note": "The partial year, which only some donors have reported ahead of the OECD's final release in December, is excluded." } ] }, @@ -1067,39 +1078,39 @@ "kind": "range", "origin": "query", "end_year": 2024, - "start_year": 1967 + "start_year": 1968 }, "graph_revision": null, "normalisations": [], "code_index_stamp": { - "exported_at": "2026-10-24T19:20:27Z", - "content_hash": "3d946d8f4986dbbe0fa3e5c4c917200381f529d89ce417c11daeb22df56eed99", + "exported_at": "2026-11-01T03:08:18Z", + "content_hash": "a1bde3be8710f5ba073e52aaaba73cf9156079c273c874372f54bb07a81b0f94", "graph_endpoint": "graph_release" }, "source_revisions": [ { "source": "provenance/OECDDAC2A", - "revision": "2026-10-15" + "revision": "2026-10-29" } ], - "capability_version": "dset_76f5fa7244511c58", - "materialiser_build": "d80df9f5fd598b7345255470932d202ee5d49942", + "capability_version": "dset_5282a0674178a233", + "materialiser_build": "ccb6617922c839ce3cd5615a3bbb65c70bfe1bde", "resolved_stat_vars": [ { - "ref": "dcid:Amount_FinancialFlow_Gross_Disbursement_DAC2aAidType206_Nominal", + "ref": "dcid:Amount_FinancialFlow_Net_Disbursement_DAC2aAidType206_Nominal", "roles": [ "financingProvider", "financingRecipient" ], - "observation_count": 107252 + "observation_count": 107148 } ], "family_member_count": 1, - "family_member_digest": "1a36e1a7292b1bfff95a5415de0be74cac7bb033217ed50e79faa8ce51a224c0", + "family_member_digest": "c2d373442ac21a31377df76cd343f156c72a530649757c399c6661cbf56c9a71", "frame_grammar_version": "1.1.0", - "origin_catalogue_build_id": "20261026T000018Z-0af2cac5", + "origin_catalogue_build_id": "20261029T171521Z-7d0a5854", "served_from": "materialise", - "confirmed_at": "2026-10-26T09:22:46.854499+00:00" + "confirmed_at": "2026-11-01T07:38:43.335353+00:00" }, "warnings": [], "diagnostics": [ @@ -1111,34 +1122,34 @@ ], "artifacts": [ { - "artifact_digest": "sha256:a8c742f8f416b2f3414c7a569f7c18b337c5ee9ae3012483583bad0b238f5c61", + "artifact_digest": "sha256:1effd75b0d46b45109033faa8adfba1dbdc83d285810fe8c878c953595456b57", "rendering": { "bundle": false, "format": "parquet", "layout": 4 }, - "bytes": 466531, + "bytes": 469908, "media_type": "application/vnd.apache.parquet", - "created_at": "2026-10-26T09:22:46.786678+00:00", + "created_at": "2026-11-01T07:38:43.262295+00:00", "tier": "working", - "url": "/api/datasets/spec_70ddf0ce6a9b3f147063f2adf37fab9e/cv_fafc60a507e03b0d42689fb1936127b9/files/sha256:a8c742f8f416b2f3414c7a569f7c18b337c5ee9ae3012483583bad0b238f5c61", - "enrichment_stamp": "08ed6c734fc69ea2204a21f4e1dd8b963f14dd1e03a2484c618049ac2e2d93d8" + "url": "/api/datasets/spec_8d395f753219876fa459778f38499a80/cv_e9cd9cba677e6dd0e2a81d5700d5edfb/files/sha256:1effd75b0d46b45109033faa8adfba1dbdc83d285810fe8c878c953595456b57", + "enrichment_stamp": "55887b871f7aa1c5d120cb2bee97086605351d5acfbec645ab027f562d0f65c5" }, { - "artifact_digest": "sha256:5247bafa55f84fe2f8bc348601acb955162c39a1a082e939945336470e5c5231", + "artifact_digest": "sha256:73e13b2b41415cb991b4416af6ddd4c6ccf9e2ebc9bbaa4818b197a9e6e9b1a2", "rendering": { "statistics": "series" }, - "bytes": 144985, + "bytes": 147458, "media_type": "application/vnd.apache.parquet", - "created_at": "2026-10-26T09:22:46.786678+00:00", + "created_at": "2026-11-01T07:38:43.262295+00:00", "tier": "working", - "url": "/api/datasets/spec_70ddf0ce6a9b3f147063f2adf37fab9e/cv_fafc60a507e03b0d42689fb1936127b9/files/sha256:5247bafa55f84fe2f8bc348601acb955162c39a1a082e939945336470e5c5231" + "url": "/api/datasets/spec_8d395f753219876fa459778f38499a80/cv_e9cd9cba677e6dd0e2a81d5700d5edfb/files/sha256:73e13b2b41415cb991b4416af6ddd4c6ccf9e2ebc9bbaa4818b197a9e6e9b1a2" } ], - "series_count": 3656, + "series_count": 3657, "output_options": { - "capability_version": "dset_76f5fa7244511c58", + "capability_version": "dset_5282a0674178a233", "columns": [ { "name": "stat_var", @@ -1162,7 +1173,7 @@ "name": "time_period", "kind": "grain", "droppable": false, - "distinct": 58 + "distinct": 57 }, { "name": "value", @@ -1221,7 +1232,8 @@ "covered": 32 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": false }, { "column": "financingProvider", @@ -1233,7 +1245,8 @@ "covered": 32 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": false }, { "column": "financingProvider", @@ -1245,7 +1258,8 @@ "covered": 32 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true }, { "column": "financingProvider", @@ -1257,7 +1271,8 @@ "covered": 32 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": false }, { "column": "financingProvider", @@ -1269,7 +1284,8 @@ "covered": 32 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true }, { "column": "financingProvider", @@ -1281,7 +1297,8 @@ "covered": 32 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true }, { "column": "financingProvider", @@ -1293,7 +1310,8 @@ "covered": 32 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true }, { "column": "financingRecipient", @@ -1305,7 +1323,8 @@ "covered": 133 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": false }, { "column": "financingRecipient", @@ -1323,7 +1342,8 @@ "label": "South Sudan" } ], - "truncated": false + "truncated": false, + "in_long_layout": false }, { "column": "financingRecipient", @@ -1335,7 +1355,8 @@ "covered": 133 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true }, { "column": "financingRecipient", @@ -1347,7 +1368,8 @@ "covered": 133 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": false }, { "column": "financingRecipient", @@ -1359,7 +1381,8 @@ "covered": 133 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true }, { "column": "financingRecipient", @@ -1371,7 +1394,8 @@ "covered": 133 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true }, { "column": "financingRecipient", @@ -1383,7 +1407,8 @@ "covered": 133 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true } ], "long_layout_defaults": [ @@ -1402,7 +1427,7 @@ "varying": [ { "column": "time_period", - "distinct": 58 + "distinct": 57 } ] }, @@ -1426,7 +1451,7 @@ "varying": [ { "column": "time_period", - "distinct": 58 + "distinct": 57 } ] }, @@ -1485,10 +1510,10 @@ ] } }, - "series_coverage_stamp": "e6e717ab8c77e84d010915893ede5809e9ecec67929a07cfafbcc2210edfa1eb", + "series_coverage_stamp": "ad27fd11738abb03d2d84dc214e223f04781609636cf678d0d08c385fb863d99", "retention": { "pinned": false, - "held_until": "2026-11-25T09:22:46.785219Z" + "held_until": "2026-12-01T07:38:43.261993Z" } } } @@ -1497,21 +1522,21 @@ { "request": { "method": "GET", - "origin_path": "/api/datasets/spec_70ddf0ce6a9b3f147063f2adf37fab9e/cv_fafc60a507e03b0d42689fb1936127b9/files/sha256:a8c742f8f416b2f3414c7a569f7c18b337c5ee9ae3012483583bad0b238f5c61" + "origin_path": "/api/datasets/spec_8d395f753219876fa459778f38499a80/cv_e9cd9cba677e6dd0e2a81d5700d5edfb/files/sha256:1effd75b0d46b45109033faa8adfba1dbdc83d285810fe8c878c953595456b57" }, "response": { "status": 302, "headers": { "content-type": "text/html", - "location": "https://storage.googleapis.com/dev-fin-observatory-datasets-working/sha256%3Aa8c742f8f416b2f3414c7a569f7c18b337c5ee9ae3012483583bad0b238f5c61?X-Goog-Signature=redacted", - "x-dfo-trace-id": "22f0d88923c14d74825b5f14d41c05b8" + "location": "https://storage.googleapis.com/dev-fin-observatory-datasets-working/sha256%3A1effd75b0d46b45109033faa8adfba1dbdc83d285810fe8c878c953595456b57?X-Goog-Signature=redacted", + "x-dfo-trace-id": "0758c8ebc1d44bb896d7880cc101fd6a" } } }, { "request": { "method": "GET", - "url": "https://storage.googleapis.com/dev-fin-observatory-datasets-working/sha256%3Aa8c742f8f416b2f3414c7a569f7c18b337c5ee9ae3012483583bad0b238f5c61?X-Goog-Signature=redacted" + "url": "https://storage.googleapis.com/dev-fin-observatory-datasets-working/sha256%3A1effd75b0d46b45109033faa8adfba1dbdc83d285810fe8c878c953595456b57?X-Goog-Signature=redacted" }, "response": { "status": 200, @@ -1525,7 +1550,7 @@ "expect": [ { "dataset": { - "rows": 107252, + "rows": 107148, "columns": [ "time_period", "financingProvider_label", @@ -1552,24 +1577,24 @@ "members": [ { "parts": [], - "spec_id": "spec_70ddf0ce6a9b3f147063f2adf37fab9e", - "content_version": "cv_fafc60a507e03b0d42689fb1936127b9", - "sentence": "Gross disbursements to the 133 G77 countries from the 32 DAC countries for official development assistance, 1967 to 2024. Current US dollars · OECD DAC2a." + "spec_id": "spec_8d395f753219876fa459778f38499a80", + "content_version": "cv_e9cd9cba677e6dd0e2a81d5700d5edfb", + "sentence": "Net disbursements to the 133 G77 countries from the 32 DAC countries for official development assistance, 1968 to 2024. Current US dollars · OECD DAC2a." } ], "missing": [], "long_builds": [ { - "operation_id": "op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f", + "operation_id": "op_d53662fbaac38ee0bd0801eab9630ebca0c8b467d33b0a1b2c6792d0cd83b7cf", "poll_waits": [ 1.5, 5.0, 1.5, 1.5, 1.5, - 1.784, - 2.289, - 2.934 + 1.797, + 2.302, + 2.919 ], "resubmissions": 0 } diff --git a/python/client-contract/src/dfo_client_contract/scenarios/fetch-spec-poll-refused.json b/python/client-contract/src/dfo_client_contract/scenarios/fetch-spec-poll-refused.json index a629db0..fe63360 100644 --- a/python/client-contract/src/dfo_client_contract/scenarios/fetch-spec-poll-refused.json +++ b/python/client-contract/src/dfo_client_contract/scenarios/fetch-spec-poll-refused.json @@ -11,10 +11,10 @@ { "op": "fetch", "spec": { - "spec_id": "spec_70ddf0ce6a9b3f147063f2adf37fab9e", + "spec_id": "spec_8d395f753219876fa459778f38499a80", "definition": { "schema_version": 1, - "spec_id": "spec_70ddf0ce6a9b3f147063f2adf37fab9e", + "spec_id": "spec_8d395f753219876fa459778f38499a80", "identity": { "identity_version": "spec1", "shape": { @@ -49,7 +49,7 @@ "property": "nettingBasis", "binding": { "state": "value", - "ref": "Gross" + "ref": "Net" } } ], @@ -226,12 +226,12 @@ }, "requested_window": { "kind": "range", - "start_year": 1967, + "start_year": 1968, "end_year": 2024 } } }, - "sentence": "Gross disbursements to the 133 G77 countries from the 32 DAC countries for official development assistance, 1967 to 2024. Current US dollars · OECD DAC2a.", + "sentence": "Net disbursements to the 133 G77 countries from the 32 DAC countries for official development assistance, 1968 to 2024. Current US dollars · OECD DAC2a.", "entity_groups": { "destination": { "label": "G77 countries", @@ -239,7 +239,8 @@ }, "origin": { "label": "DAC countries", - "group_id": "groups/OECD.DAC" + "group_id": "groups/OECD.DAC", + "sum_differs": true } } }, @@ -255,10 +256,10 @@ "schema_version": 1, "input": { "kind": "spec_id", - "spec_id": "spec_70ddf0ce6a9b3f147063f2adf37fab9e", + "spec_id": "spec_8d395f753219876fa459778f38499a80", "definition": { "schema_version": 1, - "spec_id": "spec_70ddf0ce6a9b3f147063f2adf37fab9e", + "spec_id": "spec_8d395f753219876fa459778f38499a80", "identity": { "identity_version": "spec1", "shape": { @@ -293,7 +294,7 @@ "property": "nettingBasis", "binding": { "state": "value", - "ref": "Gross" + "ref": "Net" } } ], @@ -470,7 +471,7 @@ }, "requested_window": { "kind": "range", - "start_year": 1967, + "start_year": 1968, "end_year": 2024 } } @@ -486,15 +487,15 @@ "status": 202, "headers": { "content-type": "application/json", - "location": "/api/datasets/operations/op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f", + "location": "/api/datasets/operations/op_d53662fbaac38ee0bd0801eab9630ebca0c8b467d33b0a1b2c6792d0cd83b7cf", "retry-after": "2", - "x-dfo-trace-id": "9e96509866ff4da09a698df1f19a5cbd" + "x-dfo-trace-id": "7fd3deb153d34f4b9afce2b95ffdd664" }, "json": { "operation": { - "operation_id": "op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f", + "operation_id": "op_d53662fbaac38ee0bd0801eab9630ebca0c8b467d33b0a1b2c6792d0cd83b7cf", "status": "pending", - "poll": "/api/datasets/operations/op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f", + "poll": "/api/datasets/operations/op_d53662fbaac38ee0bd0801eab9630ebca0c8b467d33b0a1b2c6792d0cd83b7cf", "retry_after_ms": 1500 } } @@ -503,7 +504,7 @@ { "request": { "method": "GET", - "path": "/datasets/operations/op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f" + "path": "/datasets/operations/op_d53662fbaac38ee0bd0801eab9630ebca0c8b467d33b0a1b2c6792d0cd83b7cf" }, "response": { "status": 503, @@ -525,24 +526,24 @@ { "request": { "method": "GET", - "path": "/datasets/operations/op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f" + "path": "/datasets/operations/op_d53662fbaac38ee0bd0801eab9630ebca0c8b467d33b0a1b2c6792d0cd83b7cf" }, "response": { "status": 200, "headers": { "content-type": "application/json", "retry-after": "2", - "x-dfo-trace-id": "6185b86217ef499bb5b6932299df1207" + "x-dfo-trace-id": "55b37040b90c4b51bb1432fb7f565e8d" }, "json": { "operation": { - "operation_id": "op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f", + "operation_id": "op_d53662fbaac38ee0bd0801eab9630ebca0c8b467d33b0a1b2c6792d0cd83b7cf", "status": "running", - "poll": "/api/datasets/operations/op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f", + "poll": "/api/datasets/operations/op_d53662fbaac38ee0bd0801eab9630ebca0c8b467d33b0a1b2c6792d0cd83b7cf", "retry_after_ms": 1500, "progress": { "rows_written": 0, - "estimate_rows": 107252 + "estimate_rows": 107148 } } } @@ -551,24 +552,24 @@ { "request": { "method": "GET", - "path": "/datasets/operations/op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f" + "path": "/datasets/operations/op_d53662fbaac38ee0bd0801eab9630ebca0c8b467d33b0a1b2c6792d0cd83b7cf" }, "response": { "status": 200, "headers": { "content-type": "application/json", "retry-after": "2", - "x-dfo-trace-id": "1ebea3ca2d15409c953cd716bdc1fccf" + "x-dfo-trace-id": "76621ada279a42da9405c03760d3fa30" }, "json": { "operation": { - "operation_id": "op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f", + "operation_id": "op_d53662fbaac38ee0bd0801eab9630ebca0c8b467d33b0a1b2c6792d0cd83b7cf", "status": "running", - "poll": "/api/datasets/operations/op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f", + "poll": "/api/datasets/operations/op_d53662fbaac38ee0bd0801eab9630ebca0c8b467d33b0a1b2c6792d0cd83b7cf", "retry_after_ms": 1500, "progress": { - "rows_written": 61927, - "estimate_rows": 107252 + "rows_written": 50967, + "estimate_rows": 107148 } } } @@ -577,7 +578,7 @@ { "request": { "method": "GET", - "path": "/datasets/operations/op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f" + "path": "/datasets/operations/op_d53662fbaac38ee0bd0801eab9630ebca0c8b467d33b0a1b2c6792d0cd83b7cf" }, "response": { "status": 503, @@ -599,7 +600,7 @@ { "request": { "method": "GET", - "path": "/datasets/operations/op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f" + "path": "/datasets/operations/op_d53662fbaac38ee0bd0801eab9630ebca0c8b467d33b0a1b2c6792d0cd83b7cf" }, "response": { "status": 503, @@ -621,24 +622,24 @@ { "request": { "method": "GET", - "path": "/datasets/operations/op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f" + "path": "/datasets/operations/op_d53662fbaac38ee0bd0801eab9630ebca0c8b467d33b0a1b2c6792d0cd83b7cf" }, "response": { "status": 200, "headers": { "content-type": "application/json", "retry-after": "2", - "x-dfo-trace-id": "94bb5a8a7c2041969d9a9118b75dc4aa" + "x-dfo-trace-id": "f489220d020f40cabbd29c2e1d57a188" }, "json": { "operation": { - "operation_id": "op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f", + "operation_id": "op_d53662fbaac38ee0bd0801eab9630ebca0c8b467d33b0a1b2c6792d0cd83b7cf", "status": "running", - "poll": "/api/datasets/operations/op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f", + "poll": "/api/datasets/operations/op_d53662fbaac38ee0bd0801eab9630ebca0c8b467d33b0a1b2c6792d0cd83b7cf", "retry_after_ms": 1500, "progress": { - "rows_written": 107252, - "estimate_rows": 107252 + "rows_written": 107148, + "estimate_rows": 107148 } } } @@ -647,24 +648,24 @@ { "request": { "method": "GET", - "path": "/datasets/operations/op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f" + "path": "/datasets/operations/op_d53662fbaac38ee0bd0801eab9630ebca0c8b467d33b0a1b2c6792d0cd83b7cf" }, "response": { "status": 200, "headers": { "content-type": "application/json", "retry-after": "2", - "x-dfo-trace-id": "c78757a54b9f4b6786a784f8a47ad5b4" + "x-dfo-trace-id": "9855026593bc4f158bc5bcdea3bd1809" }, "json": { "operation": { - "operation_id": "op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f", + "operation_id": "op_d53662fbaac38ee0bd0801eab9630ebca0c8b467d33b0a1b2c6792d0cd83b7cf", "status": "running", - "poll": "/api/datasets/operations/op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f", - "retry_after_ms": 1784, + "poll": "/api/datasets/operations/op_d53662fbaac38ee0bd0801eab9630ebca0c8b467d33b0a1b2c6792d0cd83b7cf", + "retry_after_ms": 1797, "progress": { - "rows_written": 107252, - "estimate_rows": 107252 + "rows_written": 107148, + "estimate_rows": 107148 } } } @@ -673,24 +674,24 @@ { "request": { "method": "GET", - "path": "/datasets/operations/op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f" + "path": "/datasets/operations/op_d53662fbaac38ee0bd0801eab9630ebca0c8b467d33b0a1b2c6792d0cd83b7cf" }, "response": { "status": 200, "headers": { "content-type": "application/json", "retry-after": "3", - "x-dfo-trace-id": "914bfd57942740b893ba9ca1b4f4591b" + "x-dfo-trace-id": "119eba2f4a1b446aa13d7abc8d39a2a9" }, "json": { "operation": { - "operation_id": "op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f", + "operation_id": "op_d53662fbaac38ee0bd0801eab9630ebca0c8b467d33b0a1b2c6792d0cd83b7cf", "status": "running", - "poll": "/api/datasets/operations/op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f", - "retry_after_ms": 2289, + "poll": "/api/datasets/operations/op_d53662fbaac38ee0bd0801eab9630ebca0c8b467d33b0a1b2c6792d0cd83b7cf", + "retry_after_ms": 2302, "progress": { - "rows_written": 107252, - "estimate_rows": 107252 + "rows_written": 107148, + "estimate_rows": 107148 } } } @@ -699,24 +700,24 @@ { "request": { "method": "GET", - "path": "/datasets/operations/op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f" + "path": "/datasets/operations/op_d53662fbaac38ee0bd0801eab9630ebca0c8b467d33b0a1b2c6792d0cd83b7cf" }, "response": { "status": 200, "headers": { "content-type": "application/json", "retry-after": "3", - "x-dfo-trace-id": "217766e0425f4916a393331295c4a7e7" + "x-dfo-trace-id": "1019c2a1661647d193bda3dd1a96847a" }, "json": { "operation": { - "operation_id": "op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f", + "operation_id": "op_d53662fbaac38ee0bd0801eab9630ebca0c8b467d33b0a1b2c6792d0cd83b7cf", "status": "running", - "poll": "/api/datasets/operations/op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f", - "retry_after_ms": 2934, + "poll": "/api/datasets/operations/op_d53662fbaac38ee0bd0801eab9630ebca0c8b467d33b0a1b2c6792d0cd83b7cf", + "retry_after_ms": 2919, "progress": { - "rows_written": 107252, - "estimate_rows": 107252 + "rows_written": 107148, + "estimate_rows": 107148 } } } @@ -725,24 +726,24 @@ { "request": { "method": "GET", - "path": "/datasets/operations/op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f" + "path": "/datasets/operations/op_d53662fbaac38ee0bd0801eab9630ebca0c8b467d33b0a1b2c6792d0cd83b7cf" }, "response": { "status": 200, "headers": { "content-type": "application/json", - "x-dfo-trace-id": "c501ba8d087b4561b2ff0e423c719ab0" + "x-dfo-trace-id": "2a08d19167d845478a587fcdca1b295b" }, "json": { "operation": { - "operation_id": "op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f", + "operation_id": "op_d53662fbaac38ee0bd0801eab9630ebca0c8b467d33b0a1b2c6792d0cd83b7cf", "status": "done" }, "manifest": { "schema_version": 1, "definition": { "schema_version": 1, - "spec_id": "spec_70ddf0ce6a9b3f147063f2adf37fab9e", + "spec_id": "spec_8d395f753219876fa459778f38499a80", "identity": { "shape": { "kind": "statvar_schema", @@ -774,7 +775,7 @@ }, { "binding": { - "ref": "Gross", + "ref": "Net", "state": "value" }, "property": "nettingBasis" @@ -955,14 +956,14 @@ "requested_window": { "kind": "range", "end_year": 2024, - "start_year": 1967 + "start_year": 1968 } } }, - "content_version": "cv_fafc60a507e03b0d42689fb1936127b9", - "prepared_at": "2026-10-26T09:22:44Z", + "content_version": "cv_e9cd9cba677e6dd0e2a81d5700d5edfb", + "prepared_at": "2026-11-01T07:38:40Z", "coverage": { - "rows": 107252, + "rows": 107148, "dimensions": [ { "label": "financingProvider", @@ -984,14 +985,14 @@ }, { "label": "years", - "count": 58 + "count": 57 } ], "window": { "kind": "range", "origin": "query", "end_year": 2024, - "start_year": 1967 + "start_year": 1968 } }, "citation": { @@ -1018,8 +1019,8 @@ "source_data_url": "https://webfs-dcd.oecd.org/files/dotStat/DSD_DAC2/Table2a_Data.zip", "attribution": "OECD (2026), OECD DAC2A, OECD Data Explorer, https://webfs-dcd.oecd.org/files/dotStat/DSD_DAC2/Table2a_Data.zip (accessed on 2026-10-12)", "update_cadence": "Quarterly", - "last_update": "2026-10-15", - "years_covered": "1960-2024", + "last_update": "2026-10-29", + "years_covered": "1960-2025", "granularity": "Annual, by provider and recipient", "currencies": [ "USD" @@ -1030,8 +1031,8 @@ "description": "The OECD publishes DAC2A in April, June, September and December. The complete table is downloaded from the OECD each time it is republished, and replaces the previous copy, so the data reflects the OECD's latest release." }, { - "transformation": "Exclude the partial preliminary year", - "description": "Before each full release, the OECD publishes preliminary data for the year that release covers, as reporters submit it. Until then, that year is partial, so the pipeline excludes it. Support for partial years is in development. Partial years will be marked incomplete, so they don't lead to incorrect or confusing analyses." + "transformation": "Mark the partial year", + "description": "The OECD publishes data for a year as donors report it, and its final release in December of the following year covers every donor. Until then, the year is partial. The pipeline publishes it, and the import's provenance names it in `partialObservationDate`." }, { "transformation": "Standardise providers and recipients", @@ -1051,13 +1052,23 @@ } ], "version_history": [ + { + "date": "2026-10-29", + "title": "Partial year published, marked as partial", + "changes": [ + { + "kind": "changed", + "note": "The partial year, which only some donors have reported ahead of the OECD's final release in December, is included, and the import's provenance marks it with `partialObservationDate`." + } + ] + }, { "date": "2026-10-15", - "title": "Partial preliminary year excluded", + "title": "Partial year excluded", "changes": [ { "kind": "changed", - "note": "The partial preliminary year published ahead of the next full release is excluded." + "note": "The partial year, which only some donors have reported ahead of the OECD's final release in December, is excluded." } ] }, @@ -1110,39 +1121,39 @@ "kind": "range", "origin": "query", "end_year": 2024, - "start_year": 1967 + "start_year": 1968 }, "graph_revision": null, "normalisations": [], "code_index_stamp": { - "exported_at": "2026-10-24T19:20:27Z", - "content_hash": "3d946d8f4986dbbe0fa3e5c4c917200381f529d89ce417c11daeb22df56eed99", + "exported_at": "2026-11-01T03:08:18Z", + "content_hash": "a1bde3be8710f5ba073e52aaaba73cf9156079c273c874372f54bb07a81b0f94", "graph_endpoint": "graph_release" }, "source_revisions": [ { "source": "provenance/OECDDAC2A", - "revision": "2026-10-15" + "revision": "2026-10-29" } ], - "capability_version": "dset_76f5fa7244511c58", - "materialiser_build": "d80df9f5fd598b7345255470932d202ee5d49942", + "capability_version": "dset_5282a0674178a233", + "materialiser_build": "ccb6617922c839ce3cd5615a3bbb65c70bfe1bde", "resolved_stat_vars": [ { - "ref": "dcid:Amount_FinancialFlow_Gross_Disbursement_DAC2aAidType206_Nominal", + "ref": "dcid:Amount_FinancialFlow_Net_Disbursement_DAC2aAidType206_Nominal", "roles": [ "financingProvider", "financingRecipient" ], - "observation_count": 107252 + "observation_count": 107148 } ], "family_member_count": 1, - "family_member_digest": "1a36e1a7292b1bfff95a5415de0be74cac7bb033217ed50e79faa8ce51a224c0", + "family_member_digest": "c2d373442ac21a31377df76cd343f156c72a530649757c399c6661cbf56c9a71", "frame_grammar_version": "1.1.0", - "origin_catalogue_build_id": "20261026T000018Z-0af2cac5", + "origin_catalogue_build_id": "20261029T171521Z-7d0a5854", "served_from": "materialise", - "confirmed_at": "2026-10-26T09:22:46.854499+00:00" + "confirmed_at": "2026-11-01T07:38:43.335353+00:00" }, "warnings": [], "diagnostics": [ @@ -1154,34 +1165,34 @@ ], "artifacts": [ { - "artifact_digest": "sha256:a8c742f8f416b2f3414c7a569f7c18b337c5ee9ae3012483583bad0b238f5c61", + "artifact_digest": "sha256:1effd75b0d46b45109033faa8adfba1dbdc83d285810fe8c878c953595456b57", "rendering": { "bundle": false, "format": "parquet", "layout": 4 }, - "bytes": 466531, + "bytes": 469908, "media_type": "application/vnd.apache.parquet", - "created_at": "2026-10-26T09:22:46.786678+00:00", + "created_at": "2026-11-01T07:38:43.262295+00:00", "tier": "working", - "url": "/api/datasets/spec_70ddf0ce6a9b3f147063f2adf37fab9e/cv_fafc60a507e03b0d42689fb1936127b9/files/sha256:a8c742f8f416b2f3414c7a569f7c18b337c5ee9ae3012483583bad0b238f5c61", - "enrichment_stamp": "08ed6c734fc69ea2204a21f4e1dd8b963f14dd1e03a2484c618049ac2e2d93d8" + "url": "/api/datasets/spec_8d395f753219876fa459778f38499a80/cv_e9cd9cba677e6dd0e2a81d5700d5edfb/files/sha256:1effd75b0d46b45109033faa8adfba1dbdc83d285810fe8c878c953595456b57", + "enrichment_stamp": "55887b871f7aa1c5d120cb2bee97086605351d5acfbec645ab027f562d0f65c5" }, { - "artifact_digest": "sha256:5247bafa55f84fe2f8bc348601acb955162c39a1a082e939945336470e5c5231", + "artifact_digest": "sha256:73e13b2b41415cb991b4416af6ddd4c6ccf9e2ebc9bbaa4818b197a9e6e9b1a2", "rendering": { "statistics": "series" }, - "bytes": 144985, + "bytes": 147458, "media_type": "application/vnd.apache.parquet", - "created_at": "2026-10-26T09:22:46.786678+00:00", + "created_at": "2026-11-01T07:38:43.262295+00:00", "tier": "working", - "url": "/api/datasets/spec_70ddf0ce6a9b3f147063f2adf37fab9e/cv_fafc60a507e03b0d42689fb1936127b9/files/sha256:5247bafa55f84fe2f8bc348601acb955162c39a1a082e939945336470e5c5231" + "url": "/api/datasets/spec_8d395f753219876fa459778f38499a80/cv_e9cd9cba677e6dd0e2a81d5700d5edfb/files/sha256:73e13b2b41415cb991b4416af6ddd4c6ccf9e2ebc9bbaa4818b197a9e6e9b1a2" } ], - "series_count": 3656, + "series_count": 3657, "output_options": { - "capability_version": "dset_76f5fa7244511c58", + "capability_version": "dset_5282a0674178a233", "columns": [ { "name": "stat_var", @@ -1205,7 +1216,7 @@ "name": "time_period", "kind": "grain", "droppable": false, - "distinct": 58 + "distinct": 57 }, { "name": "value", @@ -1264,7 +1275,8 @@ "covered": 32 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": false }, { "column": "financingProvider", @@ -1276,7 +1288,8 @@ "covered": 32 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": false }, { "column": "financingProvider", @@ -1288,7 +1301,8 @@ "covered": 32 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true }, { "column": "financingProvider", @@ -1300,7 +1314,8 @@ "covered": 32 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": false }, { "column": "financingProvider", @@ -1312,7 +1327,8 @@ "covered": 32 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true }, { "column": "financingProvider", @@ -1324,7 +1340,8 @@ "covered": 32 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true }, { "column": "financingProvider", @@ -1336,7 +1353,8 @@ "covered": 32 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true }, { "column": "financingRecipient", @@ -1348,7 +1366,8 @@ "covered": 133 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": false }, { "column": "financingRecipient", @@ -1366,7 +1385,8 @@ "label": "South Sudan" } ], - "truncated": false + "truncated": false, + "in_long_layout": false }, { "column": "financingRecipient", @@ -1378,7 +1398,8 @@ "covered": 133 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true }, { "column": "financingRecipient", @@ -1390,7 +1411,8 @@ "covered": 133 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": false }, { "column": "financingRecipient", @@ -1402,7 +1424,8 @@ "covered": 133 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true }, { "column": "financingRecipient", @@ -1414,7 +1437,8 @@ "covered": 133 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true }, { "column": "financingRecipient", @@ -1426,7 +1450,8 @@ "covered": 133 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true } ], "long_layout_defaults": [ @@ -1445,7 +1470,7 @@ "varying": [ { "column": "time_period", - "distinct": 58 + "distinct": 57 } ] }, @@ -1469,7 +1494,7 @@ "varying": [ { "column": "time_period", - "distinct": 58 + "distinct": 57 } ] }, @@ -1528,10 +1553,10 @@ ] } }, - "series_coverage_stamp": "e6e717ab8c77e84d010915893ede5809e9ecec67929a07cfafbcc2210edfa1eb", + "series_coverage_stamp": "ad27fd11738abb03d2d84dc214e223f04781609636cf678d0d08c385fb863d99", "retention": { "pinned": false, - "held_until": "2026-11-25T09:22:46.785219Z" + "held_until": "2026-12-01T07:38:43.261993Z" } } } @@ -1540,21 +1565,21 @@ { "request": { "method": "GET", - "origin_path": "/api/datasets/spec_70ddf0ce6a9b3f147063f2adf37fab9e/cv_fafc60a507e03b0d42689fb1936127b9/files/sha256:a8c742f8f416b2f3414c7a569f7c18b337c5ee9ae3012483583bad0b238f5c61" + "origin_path": "/api/datasets/spec_8d395f753219876fa459778f38499a80/cv_e9cd9cba677e6dd0e2a81d5700d5edfb/files/sha256:1effd75b0d46b45109033faa8adfba1dbdc83d285810fe8c878c953595456b57" }, "response": { "status": 302, "headers": { "content-type": "text/html", - "location": "https://storage.googleapis.com/dev-fin-observatory-datasets-working/sha256%3Aa8c742f8f416b2f3414c7a569f7c18b337c5ee9ae3012483583bad0b238f5c61?X-Goog-Signature=redacted", - "x-dfo-trace-id": "22f0d88923c14d74825b5f14d41c05b8" + "location": "https://storage.googleapis.com/dev-fin-observatory-datasets-working/sha256%3A1effd75b0d46b45109033faa8adfba1dbdc83d285810fe8c878c953595456b57?X-Goog-Signature=redacted", + "x-dfo-trace-id": "0758c8ebc1d44bb896d7880cc101fd6a" } } }, { "request": { "method": "GET", - "url": "https://storage.googleapis.com/dev-fin-observatory-datasets-working/sha256%3Aa8c742f8f416b2f3414c7a569f7c18b337c5ee9ae3012483583bad0b238f5c61?X-Goog-Signature=redacted" + "url": "https://storage.googleapis.com/dev-fin-observatory-datasets-working/sha256%3A1effd75b0d46b45109033faa8adfba1dbdc83d285810fe8c878c953595456b57?X-Goog-Signature=redacted" }, "response": { "status": 200, @@ -1568,7 +1593,7 @@ "expect": [ { "dataset": { - "rows": 107252, + "rows": 107148, "columns": [ "time_period", "financingProvider_label", @@ -1595,15 +1620,15 @@ "members": [ { "parts": [], - "spec_id": "spec_70ddf0ce6a9b3f147063f2adf37fab9e", - "content_version": "cv_fafc60a507e03b0d42689fb1936127b9", - "sentence": "Gross disbursements to the 133 G77 countries from the 32 DAC countries for official development assistance, 1967 to 2024. Current US dollars · OECD DAC2a." + "spec_id": "spec_8d395f753219876fa459778f38499a80", + "content_version": "cv_e9cd9cba677e6dd0e2a81d5700d5edfb", + "sentence": "Net disbursements to the 133 G77 countries from the 32 DAC countries for official development assistance, 1968 to 2024. Current US dollars · OECD DAC2a." } ], "missing": [], "long_builds": [ { - "operation_id": "op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f", + "operation_id": "op_d53662fbaac38ee0bd0801eab9630ebca0c8b467d33b0a1b2c6792d0cd83b7cf", "poll_waits": [ 1.5, 1.5, @@ -1612,9 +1637,9 @@ 1.5, 1.5, 1.5, - 1.784, - 2.289, - 2.934 + 1.797, + 2.302, + 2.919 ], "resubmissions": 0 } diff --git a/python/client-contract/src/dfo_client_contract/scenarios/fetch-spec-relative-location.json b/python/client-contract/src/dfo_client_contract/scenarios/fetch-spec-relative-location.json index 9a95b17..5fcd6f3 100644 --- a/python/client-contract/src/dfo_client_contract/scenarios/fetch-spec-relative-location.json +++ b/python/client-contract/src/dfo_client_contract/scenarios/fetch-spec-relative-location.json @@ -176,7 +176,7 @@ "status": 200, "headers": { "content-type": "application/json", - "x-dfo-trace-id": "b89cda3bb794448abf06b56c955d754e" + "x-dfo-trace-id": "27d2f0b694144799a0314850fb5d29bc" }, "json": { "schema_version": 1, @@ -583,7 +583,7 @@ "frame_grammar_version": "1.1.0", "origin_catalogue_build_id": "20261019T174519Z-2e5e8cfd", "served_from": "head", - "confirmed_at": "2026-10-26T09:18:06.976633+00:00" + "confirmed_at": "2026-11-01T07:37:46.482431+00:00" }, "warnings": [ { @@ -613,7 +613,7 @@ "created_at": "2026-10-23T16:58:47.734759+00:00", "tier": "working", "url": "/api/datasets/spec_cb5baa4161de718f18583060674dbca6/cv_bf242138f8d0a892c97da9373d1626f4/files/sha256:c44200969f19d73104d1bc24ebca905e59f749c2939234cdde10ba6f5a131170", - "enrichment_stamp": "08ed6c734fc69ea2204a21f4e1dd8b963f14dd1e03a2484c618049ac2e2d93d8" + "enrichment_stamp": "55887b871f7aa1c5d120cb2bee97086605351d5acfbec645ab027f562d0f65c5" }, { "artifact_digest": "sha256:d3a506bc9b95188583b5764592d2f1897c0665add660106b7f77c3e501000bb4", @@ -629,7 +629,7 @@ ], "series_count": 1, "output_options": { - "capability_version": "dset_76f5fa7244511c58", + "capability_version": "dset_5282a0674178a233", "columns": [ { "name": "stat_var", @@ -712,7 +712,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": false }, { "column": "financingProvider", @@ -724,7 +725,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": false }, { "column": "financingProvider", @@ -736,7 +738,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true }, { "column": "financingProvider", @@ -748,7 +751,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": false }, { "column": "financingProvider", @@ -760,7 +764,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true }, { "column": "financingProvider", @@ -772,7 +777,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true }, { "column": "financingProvider", @@ -784,7 +790,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true }, { "column": "financingRecipient", @@ -796,7 +803,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": false }, { "column": "financingRecipient", @@ -808,7 +816,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": false }, { "column": "financingRecipient", @@ -820,7 +829,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true }, { "column": "financingRecipient", @@ -832,7 +842,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": false }, { "column": "financingRecipient", @@ -844,7 +855,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true }, { "column": "financingRecipient", @@ -856,7 +868,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true }, { "column": "financingRecipient", @@ -868,7 +881,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true } ], "long_layout_defaults": [ @@ -897,7 +911,7 @@ ] } }, - "series_coverage_stamp": "e6e717ab8c77e84d010915893ede5809e9ecec67929a07cfafbcc2210edfa1eb", + "series_coverage_stamp": "ad27fd11738abb03d2d84dc214e223f04781609636cf678d0d08c385fb863d99", "retention": { "pinned": false, "held_until": "2026-11-19T13:59:18.051742Z" @@ -915,7 +929,7 @@ "headers": { "content-type": "text/html", "location": "bytes", - "x-dfo-trace-id": "cf3f86713afb44c98d21fbf9731d66e3" + "x-dfo-trace-id": "b00bcf5bd0ca432eac38be0de17b99ad" } } }, diff --git a/python/client-contract/src/dfo_client_contract/scenarios/fetch-spec-request-invalid.json b/python/client-contract/src/dfo_client_contract/scenarios/fetch-spec-request-invalid.json index c5dc5c9..6f3a646 100644 --- a/python/client-contract/src/dfo_client_contract/scenarios/fetch-spec-request-invalid.json +++ b/python/client-contract/src/dfo_client_contract/scenarios/fetch-spec-request-invalid.json @@ -5,8 +5,8 @@ "origin": { "kind": "recorded", "base_url": "https://dfo-dev-apis-zms5lj4zhq-nn.a.run.app/api", - "dfo_commit": "d80df9f5fd598b7345255470932d202ee5d49942", - "recorded_at": "2026-10-26T09:22:31Z" + "dfo_commit": "ccb6617922c839ce3cd5615a3bbb65c70bfe1bde", + "recorded_at": "2026-11-01T07:38:27Z" }, "call": [ { @@ -183,7 +183,7 @@ "status": 400, "headers": { "content-type": "application/problem+json", - "x-dfo-trace-id": "827e62e72957420a91edcc1564671a13" + "x-dfo-trace-id": "7e23b240874e475ea2fb04958d05a03c" }, "json": { "type": "/codes/request_invalid", @@ -213,8 +213,8 @@ "truncated": false } ], - "trace_id": "827e62e72957420a91edcc1564671a13", - "capability_version": "dset_76f5fa7244511c58", + "trace_id": "7e23b240874e475ea2fb04958d05a03c", + "capability_version": "dset_5282a0674178a233", "retryable": false } } @@ -225,7 +225,7 @@ "error": { "class": "InvalidRequestError", "code": "request_invalid", - "trace_id": "827e62e72957420a91edcc1564671a13" + "trace_id": "7e23b240874e475ea2fb04958d05a03c" } } ] diff --git a/python/client-contract/src/dfo_client_contract/scenarios/fetch-spec-resubmit-other-spec.json b/python/client-contract/src/dfo_client_contract/scenarios/fetch-spec-resubmit-other-spec.json index 8393370..c6e7ca9 100644 --- a/python/client-contract/src/dfo_client_contract/scenarios/fetch-spec-resubmit-other-spec.json +++ b/python/client-contract/src/dfo_client_contract/scenarios/fetch-spec-resubmit-other-spec.json @@ -183,7 +183,7 @@ "status": 200, "headers": { "content-type": "application/json", - "x-dfo-trace-id": "250fbb95951e4a8c8d847cbcde0ae4f9" + "x-dfo-trace-id": "a746de54b70e40c696df4f9f2e711908" }, "json": { "schema_version": 1, @@ -589,8 +589,8 @@ "family_member_digest": "9fd3643bbde505d9542fd3d090ddd549349765d12b6bad95b17271cbf297ea8c", "frame_grammar_version": "1.1.0", "origin_catalogue_build_id": "20261019T174519Z-2e5e8cfd", - "served_from": "head", - "confirmed_at": "2026-10-26T09:18:06.976633+00:00" + "served_from": "materialise", + "confirmed_at": "2026-11-01T07:37:46.482431+00:00" }, "warnings": [ { @@ -620,7 +620,7 @@ "created_at": "2026-10-23T16:58:47.734759+00:00", "tier": "working", "url": "/api/datasets/spec_cb5baa4161de718f18583060674dbca6/cv_bf242138f8d0a892c97da9373d1626f4/files/sha256:c44200969f19d73104d1bc24ebca905e59f749c2939234cdde10ba6f5a131170", - "enrichment_stamp": "08ed6c734fc69ea2204a21f4e1dd8b963f14dd1e03a2484c618049ac2e2d93d8" + "enrichment_stamp": "55887b871f7aa1c5d120cb2bee97086605351d5acfbec645ab027f562d0f65c5" }, { "artifact_digest": "sha256:d3a506bc9b95188583b5764592d2f1897c0665add660106b7f77c3e501000bb4", @@ -636,7 +636,7 @@ ], "series_count": 1, "output_options": { - "capability_version": "dset_76f5fa7244511c58", + "capability_version": "dset_5282a0674178a233", "columns": [ { "name": "stat_var", @@ -719,7 +719,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": false }, { "column": "financingProvider", @@ -731,7 +732,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": false }, { "column": "financingProvider", @@ -743,7 +745,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true }, { "column": "financingProvider", @@ -755,7 +758,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": false }, { "column": "financingProvider", @@ -767,7 +771,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true }, { "column": "financingProvider", @@ -779,7 +784,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true }, { "column": "financingProvider", @@ -791,7 +797,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true }, { "column": "financingRecipient", @@ -803,7 +810,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": false }, { "column": "financingRecipient", @@ -815,7 +823,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": false }, { "column": "financingRecipient", @@ -827,7 +836,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true }, { "column": "financingRecipient", @@ -839,7 +849,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": false }, { "column": "financingRecipient", @@ -851,7 +862,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true }, { "column": "financingRecipient", @@ -863,7 +875,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true }, { "column": "financingRecipient", @@ -875,7 +888,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true } ], "long_layout_defaults": [ @@ -904,7 +918,7 @@ ] } }, - "series_coverage_stamp": "e6e717ab8c77e84d010915893ede5809e9ecec67929a07cfafbcc2210edfa1eb", + "series_coverage_stamp": "ad27fd11738abb03d2d84dc214e223f04781609636cf678d0d08c385fb863d99", "retention": { "pinned": false, "held_until": "2026-11-19T13:59:18.051742Z" @@ -998,7 +1012,7 @@ "status": 200, "headers": { "content-type": "application/json", - "x-dfo-trace-id": "ff646392059e46e68f83a2753e921d6a" + "x-dfo-trace-id": "203e162341304fd082ccc7499fd37070" }, "json": { "schema_version": 1, @@ -1007,11 +1021,11 @@ "extract_skipped": true }, "diagnostics": { - "engine_build": "d80df9f5fd598b7345255470932d202ee5d49942", - "trace_id": "ff646392059e46e68f83a2753e921d6a", + "engine_build": "ccb6617922c839ce3cd5615a3bbb65c70bfe1bde", + "trace_id": "203e162341304fd082ccc7499fd37070", "warnings": [], "timing_ms": { - "total": 1, + "total": 173, "by_step": { "coverage": 0 } @@ -1024,9 +1038,39 @@ "variable_text": "dataset", "warnings": [], "timing_ms": { - "total": 0, + "total": 140, "by_step": { - "response_cache_part_memo": 0 + "validate": 4, + "phase_validate": 0, + "walk": 13, + "reread_arcs": 0, + "phase_reread_arcs": 0, + "detect_edits": 1, + "phase_detect_edits": 0, + "resolve_survivors": 0, + "phase_resolve_survivors": 0, + "shape": 4, + "phase_build_shape": 0, + "bind": 0, + "phase_build_bindings": 0, + "where_places": 1, + "phase_where_places": 0, + "materialise": 16, + "phase_materialise": 0, + "ground_related": 0, + "ground_units": 0, + "ground_facets": 0, + "ground_convert": 0, + "answer": 47, + "ground_gates": 4, + "phase_ground_build": 46, + "finalize_preview": 0, + "options": 2, + "finalize_related": 0, + "finalize_wholes": 0, + "finalize_relaunch": 1, + "phase_finalize": 0, + "served_entry": 1 } }, "entity_refs": [], @@ -1460,7 +1504,7 @@ "label": "OECD Terms and Conditions" } }, - "coverage_stamp": "e6e717ab8c77e84d010915893ede5809e9ecec67929a07cfafbcc2210edfa1eb", + "coverage_stamp": "ad27fd11738abb03d2d84dc214e223f04781609636cf678d0d08c385fb863d99", "facets": { "provenance": { "basis": "fallback", @@ -1518,7 +1562,7 @@ }, "relation": "child", "parent": "CRSCooperationModalityB", - "member_count": 1331, + "member_count": 1337, "served_rows": 4, "served_rows_exact": true } @@ -1587,7 +1631,7 @@ }, "relation": "child", "parent": "CRSTypeOfFinance100", - "member_count": 12672, + "member_count": 12745, "served_rows": 4, "served_rows_exact": true } @@ -1614,7 +1658,7 @@ "value_kind": "enum_value" }, "relation": "root", - "member_count": 14098, + "member_count": 14146, "served_rows": 4, "served_rows_exact": true } @@ -2025,7 +2069,7 @@ "start_year": 2020, "end_year": 2023 }, - "capability_version": "cap_765c9d2a0c7529b9" + "capability_version": "cap_4913302d7a6b6435" }, "confidence": "high", "available_at_place": true, @@ -2286,6 +2330,8 @@ } } ], + "concept_label": "basic health care", + "published_tables": "OECD Creditor Reporting System (CRS)", "open_axis_facts": [ { "property": "crsCooperationModality", @@ -4520,7 +4566,7 @@ "error": { "class": "ContractError", "code": "contract_violation", - "trace_id": "ff646392059e46e68f83a2753e921d6a" + "trace_id": "203e162341304fd082ccc7499fd37070" } } ] diff --git a/python/client-contract/src/dfo_client_contract/scenarios/fetch-spec-same-origin-artifact-url.json b/python/client-contract/src/dfo_client_contract/scenarios/fetch-spec-same-origin-artifact-url.json index a796ffd..3a7fd61 100644 --- a/python/client-contract/src/dfo_client_contract/scenarios/fetch-spec-same-origin-artifact-url.json +++ b/python/client-contract/src/dfo_client_contract/scenarios/fetch-spec-same-origin-artifact-url.json @@ -176,7 +176,7 @@ "status": 200, "headers": { "content-type": "application/json", - "x-dfo-trace-id": "b89cda3bb794448abf06b56c955d754e" + "x-dfo-trace-id": "27d2f0b694144799a0314850fb5d29bc" }, "json": { "schema_version": 1, @@ -583,7 +583,7 @@ "frame_grammar_version": "1.1.0", "origin_catalogue_build_id": "20261019T174519Z-2e5e8cfd", "served_from": "head", - "confirmed_at": "2026-10-26T09:18:06.976633+00:00" + "confirmed_at": "2026-11-01T07:37:46.482431+00:00" }, "warnings": [ { @@ -613,7 +613,7 @@ "created_at": "2026-10-23T16:58:47.734759+00:00", "tier": "working", "url": "https://dfo-dev-apis-zms5lj4zhq-nn.a.run.app/api/datasets/spec_cb5baa4161de718f18583060674dbca6/cv_bf242138f8d0a892c97da9373d1626f4/files/sha256:c44200969f19d73104d1bc24ebca905e59f749c2939234cdde10ba6f5a131170", - "enrichment_stamp": "08ed6c734fc69ea2204a21f4e1dd8b963f14dd1e03a2484c618049ac2e2d93d8" + "enrichment_stamp": "55887b871f7aa1c5d120cb2bee97086605351d5acfbec645ab027f562d0f65c5" }, { "artifact_digest": "sha256:d3a506bc9b95188583b5764592d2f1897c0665add660106b7f77c3e501000bb4", @@ -629,7 +629,7 @@ ], "series_count": 1, "output_options": { - "capability_version": "dset_76f5fa7244511c58", + "capability_version": "dset_5282a0674178a233", "columns": [ { "name": "stat_var", @@ -712,7 +712,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": false }, { "column": "financingProvider", @@ -724,7 +725,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": false }, { "column": "financingProvider", @@ -736,7 +738,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true }, { "column": "financingProvider", @@ -748,7 +751,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": false }, { "column": "financingProvider", @@ -760,7 +764,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true }, { "column": "financingProvider", @@ -772,7 +777,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true }, { "column": "financingProvider", @@ -784,7 +790,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true }, { "column": "financingRecipient", @@ -796,7 +803,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": false }, { "column": "financingRecipient", @@ -808,7 +816,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": false }, { "column": "financingRecipient", @@ -820,7 +829,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true }, { "column": "financingRecipient", @@ -832,7 +842,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": false }, { "column": "financingRecipient", @@ -844,7 +855,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true }, { "column": "financingRecipient", @@ -856,7 +868,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true }, { "column": "financingRecipient", @@ -868,7 +881,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true } ], "long_layout_defaults": [ @@ -897,7 +911,7 @@ ] } }, - "series_coverage_stamp": "e6e717ab8c77e84d010915893ede5809e9ecec67929a07cfafbcc2210edfa1eb", + "series_coverage_stamp": "ad27fd11738abb03d2d84dc214e223f04781609636cf678d0d08c385fb863d99", "retention": { "pinned": false, "held_until": "2026-11-19T13:59:18.051742Z" @@ -915,7 +929,7 @@ "headers": { "content-type": "text/html", "location": "https://storage.googleapis.com/dev-fin-observatory-datasets-working/sha256%3Ac44200969f19d73104d1bc24ebca905e59f749c2939234cdde10ba6f5a131170?X-Goog-Signature=redacted", - "x-dfo-trace-id": "cf3f86713afb44c98d21fbf9731d66e3" + "x-dfo-trace-id": "b00bcf5bd0ca432eac38be0de17b99ad" } } }, diff --git a/python/client-contract/src/dfo_client_contract/scenarios/fetch-spec-signed-fetch-partial.json b/python/client-contract/src/dfo_client_contract/scenarios/fetch-spec-signed-fetch-partial.json index dcf6a62..e71aab2 100644 --- a/python/client-contract/src/dfo_client_contract/scenarios/fetch-spec-signed-fetch-partial.json +++ b/python/client-contract/src/dfo_client_contract/scenarios/fetch-spec-signed-fetch-partial.json @@ -176,7 +176,7 @@ "status": 200, "headers": { "content-type": "application/json", - "x-dfo-trace-id": "b89cda3bb794448abf06b56c955d754e" + "x-dfo-trace-id": "27d2f0b694144799a0314850fb5d29bc" }, "json": { "schema_version": 1, @@ -583,7 +583,7 @@ "frame_grammar_version": "1.1.0", "origin_catalogue_build_id": "20261019T174519Z-2e5e8cfd", "served_from": "head", - "confirmed_at": "2026-10-26T09:18:06.976633+00:00" + "confirmed_at": "2026-11-01T07:37:46.482431+00:00" }, "warnings": [ { @@ -613,7 +613,7 @@ "created_at": "2026-10-23T16:58:47.734759+00:00", "tier": "working", "url": "/api/datasets/spec_cb5baa4161de718f18583060674dbca6/cv_bf242138f8d0a892c97da9373d1626f4/files/sha256:c44200969f19d73104d1bc24ebca905e59f749c2939234cdde10ba6f5a131170", - "enrichment_stamp": "08ed6c734fc69ea2204a21f4e1dd8b963f14dd1e03a2484c618049ac2e2d93d8" + "enrichment_stamp": "55887b871f7aa1c5d120cb2bee97086605351d5acfbec645ab027f562d0f65c5" }, { "artifact_digest": "sha256:d3a506bc9b95188583b5764592d2f1897c0665add660106b7f77c3e501000bb4", @@ -629,7 +629,7 @@ ], "series_count": 1, "output_options": { - "capability_version": "dset_76f5fa7244511c58", + "capability_version": "dset_5282a0674178a233", "columns": [ { "name": "stat_var", @@ -712,7 +712,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": false }, { "column": "financingProvider", @@ -724,7 +725,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": false }, { "column": "financingProvider", @@ -736,7 +738,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true }, { "column": "financingProvider", @@ -748,7 +751,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": false }, { "column": "financingProvider", @@ -760,7 +764,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true }, { "column": "financingProvider", @@ -772,7 +777,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true }, { "column": "financingProvider", @@ -784,7 +790,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true }, { "column": "financingRecipient", @@ -796,7 +803,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": false }, { "column": "financingRecipient", @@ -808,7 +816,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": false }, { "column": "financingRecipient", @@ -820,7 +829,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true }, { "column": "financingRecipient", @@ -832,7 +842,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": false }, { "column": "financingRecipient", @@ -844,7 +855,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true }, { "column": "financingRecipient", @@ -856,7 +868,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true }, { "column": "financingRecipient", @@ -868,7 +881,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true } ], "long_layout_defaults": [ @@ -897,7 +911,7 @@ ] } }, - "series_coverage_stamp": "e6e717ab8c77e84d010915893ede5809e9ecec67929a07cfafbcc2210edfa1eb", + "series_coverage_stamp": "ad27fd11738abb03d2d84dc214e223f04781609636cf678d0d08c385fb863d99", "retention": { "pinned": false, "held_until": "2026-11-19T13:59:18.051742Z" @@ -915,7 +929,7 @@ "headers": { "content-type": "text/html", "location": "https://storage.googleapis.com/dev-fin-observatory-datasets-working/sha256%3Ac44200969f19d73104d1bc24ebca905e59f749c2939234cdde10ba6f5a131170?X-Goog-Signature=redacted", - "x-dfo-trace-id": "cf3f86713afb44c98d21fbf9731d66e3" + "x-dfo-trace-id": "b00bcf5bd0ca432eac38be0de17b99ad" } } }, @@ -942,7 +956,7 @@ "headers": { "content-type": "text/html", "location": "https://storage.googleapis.com/dev-fin-observatory-datasets-working/sha256%3Ac44200969f19d73104d1bc24ebca905e59f749c2939234cdde10ba6f5a131170?X-Goog-Signature=redacted", - "x-dfo-trace-id": "cf3f86713afb44c98d21fbf9731d66e3" + "x-dfo-trace-id": "b00bcf5bd0ca432eac38be0de17b99ad" } } }, diff --git a/python/client-contract/src/dfo_client_contract/scenarios/fetch-spec-storage-artifact-url.json b/python/client-contract/src/dfo_client_contract/scenarios/fetch-spec-storage-artifact-url.json index 575a504..146e50d 100644 --- a/python/client-contract/src/dfo_client_contract/scenarios/fetch-spec-storage-artifact-url.json +++ b/python/client-contract/src/dfo_client_contract/scenarios/fetch-spec-storage-artifact-url.json @@ -176,7 +176,7 @@ "status": 200, "headers": { "content-type": "application/json", - "x-dfo-trace-id": "b89cda3bb794448abf06b56c955d754e" + "x-dfo-trace-id": "27d2f0b694144799a0314850fb5d29bc" }, "json": { "schema_version": 1, @@ -583,7 +583,7 @@ "frame_grammar_version": "1.1.0", "origin_catalogue_build_id": "20261019T174519Z-2e5e8cfd", "served_from": "head", - "confirmed_at": "2026-10-26T09:18:06.976633+00:00" + "confirmed_at": "2026-11-01T07:37:46.482431+00:00" }, "warnings": [ { @@ -613,7 +613,7 @@ "created_at": "2026-10-23T16:58:47.734759+00:00", "tier": "working", "url": "https://storage.googleapis.com/api/datasets/spec_cb5baa4161de718f18583060674dbca6/cv_bf242138f8d0a892c97da9373d1626f4/files/sha256:c44200969f19d73104d1bc24ebca905e59f749c2939234cdde10ba6f5a131170", - "enrichment_stamp": "08ed6c734fc69ea2204a21f4e1dd8b963f14dd1e03a2484c618049ac2e2d93d8" + "enrichment_stamp": "55887b871f7aa1c5d120cb2bee97086605351d5acfbec645ab027f562d0f65c5" }, { "artifact_digest": "sha256:d3a506bc9b95188583b5764592d2f1897c0665add660106b7f77c3e501000bb4", @@ -629,7 +629,7 @@ ], "series_count": 1, "output_options": { - "capability_version": "dset_76f5fa7244511c58", + "capability_version": "dset_5282a0674178a233", "columns": [ { "name": "stat_var", @@ -712,7 +712,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": false }, { "column": "financingProvider", @@ -724,7 +725,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": false }, { "column": "financingProvider", @@ -736,7 +738,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true }, { "column": "financingProvider", @@ -748,7 +751,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": false }, { "column": "financingProvider", @@ -760,7 +764,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true }, { "column": "financingProvider", @@ -772,7 +777,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true }, { "column": "financingProvider", @@ -784,7 +790,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true }, { "column": "financingRecipient", @@ -796,7 +803,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": false }, { "column": "financingRecipient", @@ -808,7 +816,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": false }, { "column": "financingRecipient", @@ -820,7 +829,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true }, { "column": "financingRecipient", @@ -832,7 +842,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": false }, { "column": "financingRecipient", @@ -844,7 +855,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true }, { "column": "financingRecipient", @@ -856,7 +868,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true }, { "column": "financingRecipient", @@ -868,7 +881,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true } ], "long_layout_defaults": [ @@ -897,7 +911,7 @@ ] } }, - "series_coverage_stamp": "e6e717ab8c77e84d010915893ede5809e9ecec67929a07cfafbcc2210edfa1eb", + "series_coverage_stamp": "ad27fd11738abb03d2d84dc214e223f04781609636cf678d0d08c385fb863d99", "retention": { "pinned": false, "held_until": "2026-11-19T13:59:18.051742Z" @@ -911,7 +925,7 @@ "error": { "class": "ContractError", "code": "contract_violation", - "trace_id": "b89cda3bb794448abf06b56c955d754e" + "trace_id": "27d2f0b694144799a0314850fb5d29bc" } } ] diff --git a/python/client-contract/src/dfo_client_contract/scenarios/fetch-spec-strict-warning.json b/python/client-contract/src/dfo_client_contract/scenarios/fetch-spec-strict-warning.json index 03d5a61..3864a56 100644 --- a/python/client-contract/src/dfo_client_contract/scenarios/fetch-spec-strict-warning.json +++ b/python/client-contract/src/dfo_client_contract/scenarios/fetch-spec-strict-warning.json @@ -584,7 +584,7 @@ "frame_grammar_version": "1.1.0", "origin_catalogue_build_id": "20261019T174519Z-2e5e8cfd", "served_from": "head", - "confirmed_at": "2026-10-26T09:18:06.976633+00:00" + "confirmed_at": "2026-11-01T07:37:46.482431+00:00" }, "warnings": [ { @@ -614,7 +614,7 @@ "created_at": "2026-10-23T16:58:47.734759+00:00", "tier": "working", "url": "/api/datasets/spec_cb5baa4161de718f18583060674dbca6/cv_bf242138f8d0a892c97da9373d1626f4/files/sha256:c44200969f19d73104d1bc24ebca905e59f749c2939234cdde10ba6f5a131170", - "enrichment_stamp": "08ed6c734fc69ea2204a21f4e1dd8b963f14dd1e03a2484c618049ac2e2d93d8" + "enrichment_stamp": "55887b871f7aa1c5d120cb2bee97086605351d5acfbec645ab027f562d0f65c5" }, { "artifact_digest": "sha256:d3a506bc9b95188583b5764592d2f1897c0665add660106b7f77c3e501000bb4", @@ -630,7 +630,7 @@ ], "series_count": 1, "output_options": { - "capability_version": "dset_76f5fa7244511c58", + "capability_version": "dset_5282a0674178a233", "columns": [ { "name": "stat_var", @@ -713,7 +713,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": false }, { "column": "financingProvider", @@ -725,7 +726,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": false }, { "column": "financingProvider", @@ -737,7 +739,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true }, { "column": "financingProvider", @@ -749,7 +752,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": false }, { "column": "financingProvider", @@ -761,7 +765,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true }, { "column": "financingProvider", @@ -773,7 +778,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true }, { "column": "financingProvider", @@ -785,7 +791,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true }, { "column": "financingRecipient", @@ -797,7 +804,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": false }, { "column": "financingRecipient", @@ -809,7 +817,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": false }, { "column": "financingRecipient", @@ -821,7 +830,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true }, { "column": "financingRecipient", @@ -833,7 +843,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": false }, { "column": "financingRecipient", @@ -845,7 +856,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true }, { "column": "financingRecipient", @@ -857,7 +869,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true }, { "column": "financingRecipient", @@ -869,7 +882,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true } ], "long_layout_defaults": [ @@ -898,7 +912,7 @@ ] } }, - "series_coverage_stamp": "e6e717ab8c77e84d010915893ede5809e9ecec67929a07cfafbcc2210edfa1eb", + "series_coverage_stamp": "ad27fd11738abb03d2d84dc214e223f04781609636cf678d0d08c385fb863d99", "retention": { "pinned": false, "held_until": "2026-11-19T13:59:18.051742Z" diff --git a/python/client-contract/src/dfo_client_contract/scenarios/fetch-strict-info-notice.json b/python/client-contract/src/dfo_client_contract/scenarios/fetch-strict-info-notice.json index 5652a17..84bc8ac 100644 --- a/python/client-contract/src/dfo_client_contract/scenarios/fetch-strict-info-notice.json +++ b/python/client-contract/src/dfo_client_contract/scenarios/fetch-strict-info-notice.json @@ -34,7 +34,7 @@ "status": 200, "headers": { "content-type": "application/json", - "x-dfo-trace-id": "c7cb40f3790f4a15a0ddcad0cc93c9bb" + "x-dfo-trace-id": "92a325e77a854c5daafa875164b5e23e" }, "json": { "schema_version": 1, @@ -42,23 +42,27 @@ "entry_path": "raw_text", "raw_query": "ODA disbursements from Germany to Nigeria for basic health care", "normalized_query": "ODA disbursements from Germany to Nigeria for basic health care", - "extract_skipped": true + "extract_skipped": false }, "diagnostics": { - "engine_build": "d80df9f5fd598b7345255470932d202ee5d49942", - "trace_id": "c7cb40f3790f4a15a0ddcad0cc93c9bb", + "engine_build": "ccb6617922c839ce3cd5615a3bbb65c70bfe1bde", + "trace_id": "92a325e77a854c5daafa875164b5e23e", "warnings": [], "timing_ms": { - "total": 3, + "total": 17540, "by_step": { "coverage": 0, - "response_cache_layer1": 1 + "extract": 1239, + "exclusion_read": 719, + "cache_lookup": 0 } }, "llm_usage": { - "input_tokens": 0, - "output_tokens": 0, - "cached_tokens": 0 + "input_tokens": 2784, + "output_tokens": 111, + "cached_tokens": 0, + "jev_input_tokens": 6695, + "jev_output_tokens": 2088 }, "timed_out": false }, @@ -74,30 +78,30 @@ } ], "timing_ms": { - "total": 3011, + "total": 16265, "by_step": { - "recall": 457, + "recall": 2821, "phase_resolve_places": 0, "phase_check_entities": 0, "shape_arcs": 2, - "shape_probe_coverage": 8, - "shape_probe": 114, - "shape_groups": 579, + "shape_probe_coverage": 104, + "shape_probe": 352, + "shape_groups": 109, "shape_labels": 1, - "shape_admission": 2, + "shape_admission": 0, "phase_derive_shapes": 0, - "shape": 1247, + "shape": 1134, "phase_prune_and_rank": 0, - "bind": 266, - "phase_bind": 327, - "phase_settle": 46, - "phase_place_bindings": 57, + "bind": 5473, + "phase_bind": 345, + "phase_settle": 105, + "phase_place_bindings": 1078, "phase_facet_requests": 0, - "materialise": 44, - "phase_materialise": 200, - "answer": 220, - "options": 55, - "phase_outcome": 92 + "materialise": 2132, + "phase_materialise": 313, + "answer": 1829, + "options": 872, + "phase_outcome": 163 } }, "restatement": { @@ -544,7 +548,7 @@ "label": "OECD Terms and Conditions" } }, - "coverage_stamp": "e6e717ab8c77e84d010915893ede5809e9ecec67929a07cfafbcc2210edfa1eb", + "coverage_stamp": "ad27fd11738abb03d2d84dc214e223f04781609636cf678d0d08c385fb863d99", "facets": { "provenance": { "basis": "fallback", @@ -602,7 +606,7 @@ }, "relation": "child", "parent": "CRSCooperationModalityB", - "member_count": 1606, + "member_count": 1614, "served_rows": 1, "served_rows_exact": true }, @@ -616,7 +620,7 @@ }, "relation": "child", "parent": "CRSCooperationModalityB", - "member_count": 1331, + "member_count": 1337, "served_rows": 6, "served_rows_exact": true }, @@ -643,7 +647,7 @@ }, "relation": "child", "parent": "CRSCooperationModalityC", - "member_count": 7005, + "member_count": 7041, "served_rows": 7, "served_rows_exact": true }, @@ -739,7 +743,7 @@ }, "relation": "child", "parent": "CRSTypeOfFinance100", - "member_count": 12672, + "member_count": 12745, "served_rows": 30, "served_rows_exact": true } @@ -766,7 +770,7 @@ "value_kind": "enum_value" }, "relation": "root", - "member_count": 14098, + "member_count": 14146, "served_rows": 30, "served_rows_exact": true } @@ -1197,7 +1201,7 @@ "selected": [] } ], - "capability_version": "cap_765c9d2a0c7529b9", + "capability_version": "cap_4913302d7a6b6435", "default_reading": { "applied": true, "removed_stat_vars": [] @@ -1205,214 +1209,7 @@ }, "confidence": "high", "available_at_place": true, - "alternative_measures": [ - { - "definition": { - "schema_version": 1, - "spec_id": "spec_80b92ca1ba1114b426eb5e79b84361d4", - "identity": { - "identity_version": "spec1", - "shape": { - "kind": "statvar_schema", - "population_type": "FinancialFlow", - "measured_property": "amount", - "stat_type": "measuredValue", - "measurement_qualifier": "Nominal" - }, - "slots": [ - { - "property": "crsCooperationModality", - "binding": { - "state": "unbound" - } - }, - { - "property": "crsPurpose", - "binding": { - "state": "value", - "ref": "CRSPurposeCode12220" - } - }, - { - "property": "crsTypeOfFinance", - "binding": { - "state": "unbound" - } - }, - { - "property": "crsTypeOfFlow", - "binding": { - "state": "value", - "ref": "CRSTypeOfFlow10" - } - }, - { - "property": "financialFlowType", - "binding": { - "state": "value", - "ref": "Disbursement" - } - }, - { - "property": "nettingBasis", - "binding": { - "state": "value", - "ref": "Net" - } - } - ], - "entities": { - "destination": [ - "country/NGA" - ], - "origin": [ - "country/DEU" - ] - }, - "requested_window": { - "kind": "all" - } - } - }, - "label": "net disbursements", - "axis": "what", - "measure_axis_values": [ - { - "axis": "populationType", - "value": { - "ref": "FinancialFlow", - "label": "financial flow" - } - }, - { - "axis": "measuredProperty", - "value": { - "ref": "amount", - "label": "amount" - } - }, - { - "axis": "measurementQualifier", - "value": { - "ref": "Nominal", - "label": "nominal" - } - }, - { - "axis": "financialFlowType", - "value": { - "ref": "Disbursement", - "label": "disbursement" - } - }, - { - "axis": "nettingBasis", - "value": { - "ref": "Net", - "label": "net" - } - } - ], - "served_rows": 30, - "served_rows_exact": true - }, - { - "definition": { - "schema_version": 1, - "spec_id": "spec_c394f9108db2100f1c8e4532d8d1c804", - "identity": { - "identity_version": "spec1", - "shape": { - "kind": "statvar_schema", - "population_type": "FinancialObligation", - "measured_property": "amount", - "stat_type": "measuredValue", - "measurement_qualifier": "Nominal" - }, - "slots": [ - { - "property": "crsCooperationModality", - "binding": { - "state": "unbound" - } - }, - { - "property": "crsPurpose", - "binding": { - "state": "value", - "ref": "CRSPurposeCode12220" - } - }, - { - "property": "crsTypeOfFinance", - "binding": { - "state": "unbound" - } - }, - { - "property": "crsTypeOfFlow", - "binding": { - "state": "value", - "ref": "CRSTypeOfFlow10" - } - }, - { - "property": "financialObligationType", - "binding": { - "state": "value", - "ref": "Commitment" - } - } - ], - "entities": { - "destination": [ - "country/NGA" - ], - "origin": [ - "country/DEU" - ] - }, - "requested_window": { - "kind": "all" - } - } - }, - "label": "commitments", - "axis": "what", - "measure_axis_values": [ - { - "axis": "populationType", - "value": { - "ref": "FinancialObligation", - "label": "financial obligation" - } - }, - { - "axis": "measuredProperty", - "value": { - "ref": "amount", - "label": "amount" - } - }, - { - "axis": "measurementQualifier", - "value": { - "ref": "Nominal", - "label": "nominal" - } - }, - { - "axis": "financialObligationType", - "value": { - "ref": "Commitment", - "label": "commitment" - } - } - ], - "served_rows": 24, - "served_rows_exact": true - } - ], + "alternative_measures": [], "measure_label": "gross disbursements", "measure_label_axes": [ "populationType", @@ -1458,6 +1255,8 @@ } } ], + "concept_label": "basic health care", + "published_tables": "OECD Creditor Reporting System (CRS)", "open_axis_facts": [ { "property": "crsTypeOfFinance", @@ -3483,6 +3282,363 @@ "destination": "NGN", "origin": "EUR" } + }, + "scope_choices": { + "id": "spec_774d6c001a6250aa67ca676ab067895e", + "base": { + "schema_version": 1, + "spec_id": "spec_774d6c001a6250aa67ca676ab067895e", + "identity": { + "identity_version": "spec1", + "shape": { + "kind": "statvar_schema", + "population_type": "FinancialFlow", + "measured_property": "amount", + "stat_type": "measuredValue", + "measurement_qualifier": "Nominal" + }, + "slots": [ + { + "property": "crsCooperationModality", + "binding": { + "state": "unbound" + } + }, + { + "property": "crsPurpose", + "binding": { + "state": "value", + "ref": "CRSPurposeCode12220" + } + }, + { + "property": "crsTypeOfFinance", + "binding": { + "state": "unbound" + } + }, + { + "property": "crsTypeOfFlow", + "binding": { + "state": "value", + "ref": "CRSTypeOfFlow10" + } + }, + { + "property": "financialFlowType", + "binding": { + "state": "value", + "ref": "Disbursement" + } + }, + { + "property": "nettingBasis", + "binding": { + "state": "value", + "ref": "Gross" + } + } + ], + "entities": { + "destination": [ + "country/NGA" + ], + "origin": [ + "country/DEU" + ] + }, + "requested_window": { + "kind": "all" + } + } + }, + "rule_version": "scope1:3eef00a928eedd463ee48d02b79730da", + "entries": [ + { + "axis": "sector", + "option_id": "sector:12220", + "provenance": "explicit", + "origin": { + "kind": "text", + "text": "basic health care", + "start": 46, + "end": 63 + } + } + ], + "dropped_entries": [], + "choices": [ + { + "id": "spec_774d6c001a6250aa67ca676ab067895e:sector", + "axis": "sector", + "rule": "sector_code", + "provenance": "explicit", + "active": "sector:12220", + "options": [ + { + "option_id": "sector:12220", + "label": "basic health care (CRS 12220)", + "binding": { + "kind": "slot", + "slot": "crsPurpose", + "state": "value", + "refs": [ + "CRSPurposeCode12220" + ] + }, + "availability": { + "status": "available", + "detail": {} + } + } + ] + }, + { + "id": "spec_774d6c001a6250aa67ca676ab067895e:measure_basis", + "axis": "measure_basis", + "rule": "measure_basis_convention", + "provenance": "default", + "active": "measure_basis:gross", + "options": [ + { + "option_id": "measure_basis:gross", + "label": "gross disbursements, current USD", + "binding": { + "kind": "shape", + "measured_property": "amount", + "netting_basis": "Gross" + }, + "availability": { + "status": "available", + "detail": {} + } + }, + { + "option_id": "measure_basis:net", + "label": "net disbursements, current USD", + "binding": { + "kind": "shape", + "measured_property": "amount", + "netting_basis": "Net" + }, + "availability": { + "status": "available", + "detail": {} + } + }, + { + "option_id": "measure_basis:grant_equivalent", + "label": "grant equivalents (OECD headline), current USD", + "binding": { + "kind": "shape", + "measured_property": "grantEquivalent", + "netting_basis": null + }, + "availability": { + "status": "available", + "detail": {} + } + }, + { + "option_id": "measure_basis:commitments", + "label": "commitments, current USD", + "binding": { + "kind": "shape", + "measured_property": "amount", + "netting_basis": null + }, + "availability": { + "status": "available", + "detail": {} + } + } + ] + }, + { + "id": "spec_774d6c001a6250aa67ca676ab067895e:provider", + "axis": "provider", + "rule": "bilateral_flows", + "provenance": "default", + "active": "provider:bilateral", + "options": [ + { + "option_id": "provider:bilateral", + "label": "bilateral flows only", + "binding": { + "kind": "provider", + "scope": "bilateral" + }, + "availability": { + "status": "available", + "detail": {} + } + }, + { + "option_id": "provider:inclusive", + "label": "bilateral plus imputed multilateral, 2020 to 2024", + "binding": { + "kind": "provider", + "scope": "inclusive", + "window": [ + 2020, + 2024 + ], + "provenance": "provenance/ONEBilateralAndImputedMultilateral" + }, + "availability": { + "status": "partial", + "years": [ + [ + 2011, + 2016 + ], + [ + 2020, + 2024 + ] + ], + "code": "imputed_coverage", + "detail": {} + } + } + ] + } + ], + "compiled": { + "spec_id": "spec_774d6c001a6250aa67ca676ab067895e", + "identity": { + "identity_version": "spec1", + "shape": { + "kind": "statvar_schema", + "population_type": "FinancialFlow", + "measured_property": "amount", + "stat_type": "measuredValue", + "measurement_qualifier": "Nominal" + }, + "slots": [ + { + "property": "crsCooperationModality", + "binding": { + "state": "unbound" + } + }, + { + "property": "crsPurpose", + "binding": { + "state": "value", + "ref": "CRSPurposeCode12220" + } + }, + { + "property": "crsTypeOfFinance", + "binding": { + "state": "unbound" + } + }, + { + "property": "crsTypeOfFlow", + "binding": { + "state": "value", + "ref": "CRSTypeOfFlow10" + } + }, + { + "property": "financialFlowType", + "binding": { + "state": "value", + "ref": "Disbursement" + } + }, + { + "property": "nettingBasis", + "binding": { + "state": "value", + "ref": "Gross" + } + } + ], + "entities": { + "destination": [ + "country/NGA" + ], + "origin": [ + "country/DEU" + ] + }, + "requested_window": { + "kind": "all" + } + }, + "components": [ + { + "role": "whole", + "identity": { + "identity_version": "spec1", + "shape": { + "kind": "statvar_schema", + "population_type": "FinancialFlow", + "measured_property": "amount", + "stat_type": "measuredValue", + "measurement_qualifier": "Nominal" + }, + "slots": [ + { + "property": "crsCooperationModality", + "binding": { + "state": "unbound" + } + }, + { + "property": "crsPurpose", + "binding": { + "state": "value", + "ref": "CRSPurposeCode12220" + } + }, + { + "property": "crsTypeOfFinance", + "binding": { + "state": "unbound" + } + }, + { + "property": "crsTypeOfFlow", + "binding": { + "state": "value", + "ref": "CRSTypeOfFlow10" + } + }, + { + "property": "financialFlowType", + "binding": { + "state": "value", + "ref": "Disbursement" + } + }, + { + "property": "nettingBasis", + "binding": { + "state": "value", + "ref": "Gross" + } + } + ], + "entities": { + "destination": [ + "country/NGA" + ], + "origin": [ + "country/DEU" + ] + }, + "requested_window": { + "kind": "all" + } + } + } + ] + }, + "ledger": [] } } } @@ -3796,7 +3952,7 @@ "status": 200, "headers": { "content-type": "application/json", - "x-dfo-trace-id": "4c3f35c8c0d44b99941a73a9519b41d2" + "x-dfo-trace-id": "fff69a3d23f5431c8a34da1b72c9e034" }, "json": { "schema_version": 1, @@ -4196,8 +4352,8 @@ "family_member_digest": "9fd3643bbde505d9542fd3d090ddd549349765d12b6bad95b17271cbf297ea8c", "frame_grammar_version": "1.1.0", "origin_catalogue_build_id": "20261011T194155Z-80081f08", - "served_from": "head", - "confirmed_at": "2026-10-26T09:17:22.037029+00:00" + "served_from": "materialise", + "confirmed_at": "2026-11-01T07:35:51.549820+00:00" }, "warnings": [ { @@ -4227,7 +4383,7 @@ "created_at": "2026-10-23T16:56:32.058938+00:00", "tier": "working", "url": "/api/datasets/spec_774d6c001a6250aa67ca676ab067895e/cv_b92d94774702c7f05f2075d0b03dd756/files/sha256:421efacc2dc010af38112a087b0b49ff5539f61d2afd12a88272b27e99b5f5db", - "enrichment_stamp": "08ed6c734fc69ea2204a21f4e1dd8b963f14dd1e03a2484c618049ac2e2d93d8" + "enrichment_stamp": "55887b871f7aa1c5d120cb2bee97086605351d5acfbec645ab027f562d0f65c5" }, { "artifact_digest": "sha256:07984a96eaf8ee637fe15bf13f2b0d9160a6378d3fa1efae2e71cf0e20115dff", @@ -4243,7 +4399,7 @@ ], "series_count": 5, "output_options": { - "capability_version": "dset_76f5fa7244511c58", + "capability_version": "dset_5282a0674178a233", "columns": [ { "name": "stat_var", @@ -4326,7 +4482,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": false }, { "column": "financingProvider", @@ -4338,7 +4495,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": false }, { "column": "financingProvider", @@ -4350,7 +4508,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true }, { "column": "financingProvider", @@ -4362,7 +4521,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": false }, { "column": "financingProvider", @@ -4374,7 +4534,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true }, { "column": "financingProvider", @@ -4386,7 +4547,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true }, { "column": "financingProvider", @@ -4398,7 +4560,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true }, { "column": "financingRecipient", @@ -4410,7 +4573,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": false }, { "column": "financingRecipient", @@ -4422,7 +4586,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": false }, { "column": "financingRecipient", @@ -4434,7 +4599,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true }, { "column": "financingRecipient", @@ -4446,7 +4612,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": false }, { "column": "financingRecipient", @@ -4458,7 +4625,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true }, { "column": "financingRecipient", @@ -4470,7 +4638,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true }, { "column": "financingRecipient", @@ -4482,7 +4651,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true } ], "long_layout_defaults": [ @@ -4526,7 +4696,7 @@ ] } }, - "series_coverage_stamp": "e6e717ab8c77e84d010915893ede5809e9ecec67929a07cfafbcc2210edfa1eb", + "series_coverage_stamp": "ad27fd11738abb03d2d84dc214e223f04781609636cf678d0d08c385fb863d99", "retention": { "pinned": true } @@ -4543,7 +4713,7 @@ "headers": { "content-type": "text/html", "location": "https://storage.googleapis.com/dev-fin-observatory-datasets-working/sha256%3A421efacc2dc010af38112a087b0b49ff5539f61d2afd12a88272b27e99b5f5db?X-Goog-Signature=redacted", - "x-dfo-trace-id": "333ab72de55449ed8288a5f458406a4c" + "x-dfo-trace-id": "815c18c3e59945d6ade9f99db58f2960" } } }, diff --git a/python/client-contract/src/dfo_client_contract/scenarios/mint-async-build.json b/python/client-contract/src/dfo_client_contract/scenarios/mint-async-build.json index 4a1c656..d65faf3 100644 --- a/python/client-contract/src/dfo_client_contract/scenarios/mint-async-build.json +++ b/python/client-contract/src/dfo_client_contract/scenarios/mint-async-build.json @@ -5,17 +5,17 @@ "origin": { "kind": "recorded", "base_url": "https://dfo-dev-apis-zms5lj4zhq-nn.a.run.app/api", - "dfo_commit": "d80df9f5fd598b7345255470932d202ee5d49942", - "recorded_at": "2026-10-26T09:22:34Z" + "dfo_commit": "ccb6617922c839ce3cd5615a3bbb65c70bfe1bde", + "recorded_at": "2026-11-01T07:38:30Z" }, "call": [ { "op": "mint", "spec": { - "spec_id": "spec_70ddf0ce6a9b3f147063f2adf37fab9e", + "spec_id": "spec_8d395f753219876fa459778f38499a80", "definition": { "schema_version": 1, - "spec_id": "spec_70ddf0ce6a9b3f147063f2adf37fab9e", + "spec_id": "spec_8d395f753219876fa459778f38499a80", "identity": { "identity_version": "spec1", "shape": { @@ -50,7 +50,7 @@ "property": "nettingBasis", "binding": { "state": "value", - "ref": "Gross" + "ref": "Net" } } ], @@ -227,12 +227,12 @@ }, "requested_window": { "kind": "range", - "start_year": 1967, + "start_year": 1968, "end_year": 2024 } } }, - "sentence": "Gross disbursements to the 133 G77 countries from the 32 DAC countries for official development assistance, 1967 to 2024. Current US dollars · OECD DAC2a.", + "sentence": "Net disbursements to the 133 G77 countries from the 32 DAC countries for official development assistance, 1968 to 2024. Current US dollars · OECD DAC2a.", "entity_groups": { "destination": { "label": "G77 countries", @@ -240,7 +240,8 @@ }, "origin": { "label": "DAC countries", - "group_id": "groups/OECD.DAC" + "group_id": "groups/OECD.DAC", + "sum_differs": true } } }, @@ -259,10 +260,10 @@ "schema_version": 1, "input": { "kind": "spec_id", - "spec_id": "spec_70ddf0ce6a9b3f147063f2adf37fab9e", + "spec_id": "spec_8d395f753219876fa459778f38499a80", "definition": { "schema_version": 1, - "spec_id": "spec_70ddf0ce6a9b3f147063f2adf37fab9e", + "spec_id": "spec_8d395f753219876fa459778f38499a80", "identity": { "identity_version": "spec1", "shape": { @@ -297,7 +298,7 @@ "property": "nettingBasis", "binding": { "state": "value", - "ref": "Gross" + "ref": "Net" } } ], @@ -474,7 +475,7 @@ }, "requested_window": { "kind": "range", - "start_year": 1967, + "start_year": 1968, "end_year": 2024 } } @@ -490,15 +491,15 @@ "status": 202, "headers": { "content-type": "application/json", - "location": "/api/datasets/operations/op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f", + "location": "/api/datasets/operations/op_d53662fbaac38ee0bd0801eab9630ebca0c8b467d33b0a1b2c6792d0cd83b7cf", "retry-after": "2", - "x-dfo-trace-id": "9e96509866ff4da09a698df1f19a5cbd" + "x-dfo-trace-id": "7fd3deb153d34f4b9afce2b95ffdd664" }, "json": { "operation": { - "operation_id": "op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f", + "operation_id": "op_d53662fbaac38ee0bd0801eab9630ebca0c8b467d33b0a1b2c6792d0cd83b7cf", "status": "pending", - "poll": "/api/datasets/operations/op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f", + "poll": "/api/datasets/operations/op_d53662fbaac38ee0bd0801eab9630ebca0c8b467d33b0a1b2c6792d0cd83b7cf", "retry_after_ms": 1500 } } @@ -507,24 +508,24 @@ { "request": { "method": "GET", - "path": "/datasets/operations/op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f" + "path": "/datasets/operations/op_d53662fbaac38ee0bd0801eab9630ebca0c8b467d33b0a1b2c6792d0cd83b7cf" }, "response": { "status": 200, "headers": { "content-type": "application/json", "retry-after": "2", - "x-dfo-trace-id": "6185b86217ef499bb5b6932299df1207" + "x-dfo-trace-id": "55b37040b90c4b51bb1432fb7f565e8d" }, "json": { "operation": { - "operation_id": "op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f", + "operation_id": "op_d53662fbaac38ee0bd0801eab9630ebca0c8b467d33b0a1b2c6792d0cd83b7cf", "status": "running", - "poll": "/api/datasets/operations/op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f", + "poll": "/api/datasets/operations/op_d53662fbaac38ee0bd0801eab9630ebca0c8b467d33b0a1b2c6792d0cd83b7cf", "retry_after_ms": 1500, "progress": { "rows_written": 0, - "estimate_rows": 107252 + "estimate_rows": 107148 } } } @@ -533,24 +534,24 @@ { "request": { "method": "GET", - "path": "/datasets/operations/op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f" + "path": "/datasets/operations/op_d53662fbaac38ee0bd0801eab9630ebca0c8b467d33b0a1b2c6792d0cd83b7cf" }, "response": { "status": 200, "headers": { "content-type": "application/json", "retry-after": "2", - "x-dfo-trace-id": "1ebea3ca2d15409c953cd716bdc1fccf" + "x-dfo-trace-id": "76621ada279a42da9405c03760d3fa30" }, "json": { "operation": { - "operation_id": "op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f", + "operation_id": "op_d53662fbaac38ee0bd0801eab9630ebca0c8b467d33b0a1b2c6792d0cd83b7cf", "status": "running", - "poll": "/api/datasets/operations/op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f", + "poll": "/api/datasets/operations/op_d53662fbaac38ee0bd0801eab9630ebca0c8b467d33b0a1b2c6792d0cd83b7cf", "retry_after_ms": 1500, "progress": { - "rows_written": 61927, - "estimate_rows": 107252 + "rows_written": 50967, + "estimate_rows": 107148 } } } @@ -559,24 +560,24 @@ { "request": { "method": "GET", - "path": "/datasets/operations/op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f" + "path": "/datasets/operations/op_d53662fbaac38ee0bd0801eab9630ebca0c8b467d33b0a1b2c6792d0cd83b7cf" }, "response": { "status": 200, "headers": { "content-type": "application/json", "retry-after": "2", - "x-dfo-trace-id": "94bb5a8a7c2041969d9a9118b75dc4aa" + "x-dfo-trace-id": "f489220d020f40cabbd29c2e1d57a188" }, "json": { "operation": { - "operation_id": "op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f", + "operation_id": "op_d53662fbaac38ee0bd0801eab9630ebca0c8b467d33b0a1b2c6792d0cd83b7cf", "status": "running", - "poll": "/api/datasets/operations/op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f", + "poll": "/api/datasets/operations/op_d53662fbaac38ee0bd0801eab9630ebca0c8b467d33b0a1b2c6792d0cd83b7cf", "retry_after_ms": 1500, "progress": { - "rows_written": 107252, - "estimate_rows": 107252 + "rows_written": 107148, + "estimate_rows": 107148 } } } @@ -585,24 +586,24 @@ { "request": { "method": "GET", - "path": "/datasets/operations/op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f" + "path": "/datasets/operations/op_d53662fbaac38ee0bd0801eab9630ebca0c8b467d33b0a1b2c6792d0cd83b7cf" }, "response": { "status": 200, "headers": { "content-type": "application/json", "retry-after": "2", - "x-dfo-trace-id": "c78757a54b9f4b6786a784f8a47ad5b4" + "x-dfo-trace-id": "9855026593bc4f158bc5bcdea3bd1809" }, "json": { "operation": { - "operation_id": "op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f", + "operation_id": "op_d53662fbaac38ee0bd0801eab9630ebca0c8b467d33b0a1b2c6792d0cd83b7cf", "status": "running", - "poll": "/api/datasets/operations/op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f", - "retry_after_ms": 1784, + "poll": "/api/datasets/operations/op_d53662fbaac38ee0bd0801eab9630ebca0c8b467d33b0a1b2c6792d0cd83b7cf", + "retry_after_ms": 1797, "progress": { - "rows_written": 107252, - "estimate_rows": 107252 + "rows_written": 107148, + "estimate_rows": 107148 } } } @@ -611,24 +612,24 @@ { "request": { "method": "GET", - "path": "/datasets/operations/op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f" + "path": "/datasets/operations/op_d53662fbaac38ee0bd0801eab9630ebca0c8b467d33b0a1b2c6792d0cd83b7cf" }, "response": { "status": 200, "headers": { "content-type": "application/json", "retry-after": "3", - "x-dfo-trace-id": "914bfd57942740b893ba9ca1b4f4591b" + "x-dfo-trace-id": "119eba2f4a1b446aa13d7abc8d39a2a9" }, "json": { "operation": { - "operation_id": "op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f", + "operation_id": "op_d53662fbaac38ee0bd0801eab9630ebca0c8b467d33b0a1b2c6792d0cd83b7cf", "status": "running", - "poll": "/api/datasets/operations/op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f", - "retry_after_ms": 2289, + "poll": "/api/datasets/operations/op_d53662fbaac38ee0bd0801eab9630ebca0c8b467d33b0a1b2c6792d0cd83b7cf", + "retry_after_ms": 2302, "progress": { - "rows_written": 107252, - "estimate_rows": 107252 + "rows_written": 107148, + "estimate_rows": 107148 } } } @@ -637,24 +638,24 @@ { "request": { "method": "GET", - "path": "/datasets/operations/op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f" + "path": "/datasets/operations/op_d53662fbaac38ee0bd0801eab9630ebca0c8b467d33b0a1b2c6792d0cd83b7cf" }, "response": { "status": 200, "headers": { "content-type": "application/json", "retry-after": "3", - "x-dfo-trace-id": "217766e0425f4916a393331295c4a7e7" + "x-dfo-trace-id": "1019c2a1661647d193bda3dd1a96847a" }, "json": { "operation": { - "operation_id": "op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f", + "operation_id": "op_d53662fbaac38ee0bd0801eab9630ebca0c8b467d33b0a1b2c6792d0cd83b7cf", "status": "running", - "poll": "/api/datasets/operations/op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f", - "retry_after_ms": 2934, + "poll": "/api/datasets/operations/op_d53662fbaac38ee0bd0801eab9630ebca0c8b467d33b0a1b2c6792d0cd83b7cf", + "retry_after_ms": 2919, "progress": { - "rows_written": 107252, - "estimate_rows": 107252 + "rows_written": 107148, + "estimate_rows": 107148 } } } @@ -663,24 +664,24 @@ { "request": { "method": "GET", - "path": "/datasets/operations/op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f" + "path": "/datasets/operations/op_d53662fbaac38ee0bd0801eab9630ebca0c8b467d33b0a1b2c6792d0cd83b7cf" }, "response": { "status": 200, "headers": { "content-type": "application/json", - "x-dfo-trace-id": "c501ba8d087b4561b2ff0e423c719ab0" + "x-dfo-trace-id": "2a08d19167d845478a587fcdca1b295b" }, "json": { "operation": { - "operation_id": "op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f", + "operation_id": "op_d53662fbaac38ee0bd0801eab9630ebca0c8b467d33b0a1b2c6792d0cd83b7cf", "status": "done" }, "manifest": { "schema_version": 1, "definition": { "schema_version": 1, - "spec_id": "spec_70ddf0ce6a9b3f147063f2adf37fab9e", + "spec_id": "spec_8d395f753219876fa459778f38499a80", "identity": { "shape": { "kind": "statvar_schema", @@ -712,7 +713,7 @@ }, { "binding": { - "ref": "Gross", + "ref": "Net", "state": "value" }, "property": "nettingBasis" @@ -893,14 +894,14 @@ "requested_window": { "kind": "range", "end_year": 2024, - "start_year": 1967 + "start_year": 1968 } } }, - "content_version": "cv_fafc60a507e03b0d42689fb1936127b9", - "prepared_at": "2026-10-26T09:22:44Z", + "content_version": "cv_e9cd9cba677e6dd0e2a81d5700d5edfb", + "prepared_at": "2026-11-01T07:38:40Z", "coverage": { - "rows": 107252, + "rows": 107148, "dimensions": [ { "label": "financingProvider", @@ -922,14 +923,14 @@ }, { "label": "years", - "count": 58 + "count": 57 } ], "window": { "kind": "range", "origin": "query", "end_year": 2024, - "start_year": 1967 + "start_year": 1968 } }, "citation": { @@ -956,8 +957,8 @@ "source_data_url": "https://webfs-dcd.oecd.org/files/dotStat/DSD_DAC2/Table2a_Data.zip", "attribution": "OECD (2026), OECD DAC2A, OECD Data Explorer, https://webfs-dcd.oecd.org/files/dotStat/DSD_DAC2/Table2a_Data.zip (accessed on 2026-10-12)", "update_cadence": "Quarterly", - "last_update": "2026-10-15", - "years_covered": "1960-2024", + "last_update": "2026-10-29", + "years_covered": "1960-2025", "granularity": "Annual, by provider and recipient", "currencies": [ "USD" @@ -968,8 +969,8 @@ "description": "The OECD publishes DAC2A in April, June, September and December. The complete table is downloaded from the OECD each time it is republished, and replaces the previous copy, so the data reflects the OECD's latest release." }, { - "transformation": "Exclude the partial preliminary year", - "description": "Before each full release, the OECD publishes preliminary data for the year that release covers, as reporters submit it. Until then, that year is partial, so the pipeline excludes it. Support for partial years is in development. Partial years will be marked incomplete, so they don't lead to incorrect or confusing analyses." + "transformation": "Mark the partial year", + "description": "The OECD publishes data for a year as donors report it, and its final release in December of the following year covers every donor. Until then, the year is partial. The pipeline publishes it, and the import's provenance names it in `partialObservationDate`." }, { "transformation": "Standardise providers and recipients", @@ -989,13 +990,23 @@ } ], "version_history": [ + { + "date": "2026-10-29", + "title": "Partial year published, marked as partial", + "changes": [ + { + "kind": "changed", + "note": "The partial year, which only some donors have reported ahead of the OECD's final release in December, is included, and the import's provenance marks it with `partialObservationDate`." + } + ] + }, { "date": "2026-10-15", - "title": "Partial preliminary year excluded", + "title": "Partial year excluded", "changes": [ { "kind": "changed", - "note": "The partial preliminary year published ahead of the next full release is excluded." + "note": "The partial year, which only some donors have reported ahead of the OECD's final release in December, is excluded." } ] }, @@ -1048,39 +1059,39 @@ "kind": "range", "origin": "query", "end_year": 2024, - "start_year": 1967 + "start_year": 1968 }, "graph_revision": null, "normalisations": [], "code_index_stamp": { - "exported_at": "2026-10-24T19:20:27Z", - "content_hash": "3d946d8f4986dbbe0fa3e5c4c917200381f529d89ce417c11daeb22df56eed99", + "exported_at": "2026-11-01T03:08:18Z", + "content_hash": "a1bde3be8710f5ba073e52aaaba73cf9156079c273c874372f54bb07a81b0f94", "graph_endpoint": "graph_release" }, "source_revisions": [ { "source": "provenance/OECDDAC2A", - "revision": "2026-10-15" + "revision": "2026-10-29" } ], - "capability_version": "dset_76f5fa7244511c58", - "materialiser_build": "d80df9f5fd598b7345255470932d202ee5d49942", + "capability_version": "dset_5282a0674178a233", + "materialiser_build": "ccb6617922c839ce3cd5615a3bbb65c70bfe1bde", "resolved_stat_vars": [ { - "ref": "dcid:Amount_FinancialFlow_Gross_Disbursement_DAC2aAidType206_Nominal", + "ref": "dcid:Amount_FinancialFlow_Net_Disbursement_DAC2aAidType206_Nominal", "roles": [ "financingProvider", "financingRecipient" ], - "observation_count": 107252 + "observation_count": 107148 } ], "family_member_count": 1, - "family_member_digest": "1a36e1a7292b1bfff95a5415de0be74cac7bb033217ed50e79faa8ce51a224c0", + "family_member_digest": "c2d373442ac21a31377df76cd343f156c72a530649757c399c6661cbf56c9a71", "frame_grammar_version": "1.1.0", - "origin_catalogue_build_id": "20261026T000018Z-0af2cac5", + "origin_catalogue_build_id": "20261029T171521Z-7d0a5854", "served_from": "materialise", - "confirmed_at": "2026-10-26T09:22:46.854499+00:00" + "confirmed_at": "2026-11-01T07:38:43.335353+00:00" }, "warnings": [], "diagnostics": [ @@ -1092,34 +1103,34 @@ ], "artifacts": [ { - "artifact_digest": "sha256:a8c742f8f416b2f3414c7a569f7c18b337c5ee9ae3012483583bad0b238f5c61", + "artifact_digest": "sha256:1effd75b0d46b45109033faa8adfba1dbdc83d285810fe8c878c953595456b57", "rendering": { "bundle": false, "format": "parquet", "layout": 4 }, - "bytes": 466531, + "bytes": 469908, "media_type": "application/vnd.apache.parquet", - "created_at": "2026-10-26T09:22:46.786678+00:00", + "created_at": "2026-11-01T07:38:43.262295+00:00", "tier": "working", - "url": "/api/datasets/spec_70ddf0ce6a9b3f147063f2adf37fab9e/cv_fafc60a507e03b0d42689fb1936127b9/files/sha256:a8c742f8f416b2f3414c7a569f7c18b337c5ee9ae3012483583bad0b238f5c61", - "enrichment_stamp": "08ed6c734fc69ea2204a21f4e1dd8b963f14dd1e03a2484c618049ac2e2d93d8" + "url": "/api/datasets/spec_8d395f753219876fa459778f38499a80/cv_e9cd9cba677e6dd0e2a81d5700d5edfb/files/sha256:1effd75b0d46b45109033faa8adfba1dbdc83d285810fe8c878c953595456b57", + "enrichment_stamp": "55887b871f7aa1c5d120cb2bee97086605351d5acfbec645ab027f562d0f65c5" }, { - "artifact_digest": "sha256:5247bafa55f84fe2f8bc348601acb955162c39a1a082e939945336470e5c5231", + "artifact_digest": "sha256:73e13b2b41415cb991b4416af6ddd4c6ccf9e2ebc9bbaa4818b197a9e6e9b1a2", "rendering": { "statistics": "series" }, - "bytes": 144985, + "bytes": 147458, "media_type": "application/vnd.apache.parquet", - "created_at": "2026-10-26T09:22:46.786678+00:00", + "created_at": "2026-11-01T07:38:43.262295+00:00", "tier": "working", - "url": "/api/datasets/spec_70ddf0ce6a9b3f147063f2adf37fab9e/cv_fafc60a507e03b0d42689fb1936127b9/files/sha256:5247bafa55f84fe2f8bc348601acb955162c39a1a082e939945336470e5c5231" + "url": "/api/datasets/spec_8d395f753219876fa459778f38499a80/cv_e9cd9cba677e6dd0e2a81d5700d5edfb/files/sha256:73e13b2b41415cb991b4416af6ddd4c6ccf9e2ebc9bbaa4818b197a9e6e9b1a2" } ], - "series_count": 3656, + "series_count": 3657, "output_options": { - "capability_version": "dset_76f5fa7244511c58", + "capability_version": "dset_5282a0674178a233", "columns": [ { "name": "stat_var", @@ -1143,7 +1154,7 @@ "name": "time_period", "kind": "grain", "droppable": false, - "distinct": 58 + "distinct": 57 }, { "name": "value", @@ -1202,7 +1213,8 @@ "covered": 32 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": false }, { "column": "financingProvider", @@ -1214,7 +1226,8 @@ "covered": 32 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": false }, { "column": "financingProvider", @@ -1226,7 +1239,8 @@ "covered": 32 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true }, { "column": "financingProvider", @@ -1238,7 +1252,8 @@ "covered": 32 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": false }, { "column": "financingProvider", @@ -1250,7 +1265,8 @@ "covered": 32 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true }, { "column": "financingProvider", @@ -1262,7 +1278,8 @@ "covered": 32 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true }, { "column": "financingProvider", @@ -1274,7 +1291,8 @@ "covered": 32 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true }, { "column": "financingRecipient", @@ -1286,7 +1304,8 @@ "covered": 133 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": false }, { "column": "financingRecipient", @@ -1304,7 +1323,8 @@ "label": "South Sudan" } ], - "truncated": false + "truncated": false, + "in_long_layout": false }, { "column": "financingRecipient", @@ -1316,7 +1336,8 @@ "covered": 133 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true }, { "column": "financingRecipient", @@ -1328,7 +1349,8 @@ "covered": 133 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": false }, { "column": "financingRecipient", @@ -1340,7 +1362,8 @@ "covered": 133 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true }, { "column": "financingRecipient", @@ -1352,7 +1375,8 @@ "covered": 133 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true }, { "column": "financingRecipient", @@ -1364,7 +1388,8 @@ "covered": 133 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true } ], "long_layout_defaults": [ @@ -1383,7 +1408,7 @@ "varying": [ { "column": "time_period", - "distinct": 58 + "distinct": 57 } ] }, @@ -1407,7 +1432,7 @@ "varying": [ { "column": "time_period", - "distinct": 58 + "distinct": 57 } ] }, @@ -1466,10 +1491,10 @@ ] } }, - "series_coverage_stamp": "e6e717ab8c77e84d010915893ede5809e9ecec67929a07cfafbcc2210edfa1eb", + "series_coverage_stamp": "ad27fd11738abb03d2d84dc214e223f04781609636cf678d0d08c385fb863d99", "retention": { "pinned": false, - "held_until": "2026-11-25T09:22:46.785219Z" + "held_until": "2026-12-01T07:38:43.261993Z" } } } @@ -1478,21 +1503,21 @@ { "request": { "method": "GET", - "origin_path": "/api/datasets/spec_70ddf0ce6a9b3f147063f2adf37fab9e/cv_fafc60a507e03b0d42689fb1936127b9/files/sha256:a8c742f8f416b2f3414c7a569f7c18b337c5ee9ae3012483583bad0b238f5c61" + "origin_path": "/api/datasets/spec_8d395f753219876fa459778f38499a80/cv_e9cd9cba677e6dd0e2a81d5700d5edfb/files/sha256:1effd75b0d46b45109033faa8adfba1dbdc83d285810fe8c878c953595456b57" }, "response": { "status": 302, "headers": { "content-type": "text/html", - "location": "https://storage.googleapis.com/dev-fin-observatory-datasets-working/sha256%3Aa8c742f8f416b2f3414c7a569f7c18b337c5ee9ae3012483583bad0b238f5c61?X-Goog-Signature=redacted", - "x-dfo-trace-id": "22f0d88923c14d74825b5f14d41c05b8" + "location": "https://storage.googleapis.com/dev-fin-observatory-datasets-working/sha256%3A1effd75b0d46b45109033faa8adfba1dbdc83d285810fe8c878c953595456b57?X-Goog-Signature=redacted", + "x-dfo-trace-id": "0758c8ebc1d44bb896d7880cc101fd6a" } } }, { "request": { "method": "GET", - "url": "https://storage.googleapis.com/dev-fin-observatory-datasets-working/sha256%3Aa8c742f8f416b2f3414c7a569f7c18b337c5ee9ae3012483583bad0b238f5c61?X-Goog-Signature=redacted" + "url": "https://storage.googleapis.com/dev-fin-observatory-datasets-working/sha256%3A1effd75b0d46b45109033faa8adfba1dbdc83d285810fe8c878c953595456b57?X-Goog-Signature=redacted" }, "response": { "status": 200, @@ -1506,13 +1531,13 @@ "expect": [ { "operation": { - "operation_id": "op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f", + "operation_id": "op_d53662fbaac38ee0bd0801eab9630ebca0c8b467d33b0a1b2c6792d0cd83b7cf", "status": "pending" } }, { "dataset": { - "rows": 107252, + "rows": 107148, "columns": [ "time_period", "financingProvider_label", @@ -1539,23 +1564,23 @@ "members": [ { "parts": [], - "spec_id": "spec_70ddf0ce6a9b3f147063f2adf37fab9e", - "content_version": "cv_fafc60a507e03b0d42689fb1936127b9", - "sentence": "Gross disbursements to the 133 G77 countries from the 32 DAC countries for official development assistance, 1967 to 2024. Current US dollars · OECD DAC2a." + "spec_id": "spec_8d395f753219876fa459778f38499a80", + "content_version": "cv_e9cd9cba677e6dd0e2a81d5700d5edfb", + "sentence": "Net disbursements to the 133 G77 countries from the 32 DAC countries for official development assistance, 1968 to 2024. Current US dollars · OECD DAC2a." } ], "missing": [], "long_builds": [ { - "operation_id": "op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f", + "operation_id": "op_d53662fbaac38ee0bd0801eab9630ebca0c8b467d33b0a1b2c6792d0cd83b7cf", "poll_waits": [ 1.5, 1.5, 1.5, 1.5, - 1.784, - 2.289, - 2.934 + 1.797, + 2.302, + 2.919 ], "resubmissions": 0 } diff --git a/python/client-contract/src/dfo_client_contract/scenarios/mint-async-build.parquet b/python/client-contract/src/dfo_client_contract/scenarios/mint-async-build.parquet index a432036..1e069c5 100644 Binary files a/python/client-contract/src/dfo_client_contract/scenarios/mint-async-build.parquet and b/python/client-contract/src/dfo_client_contract/scenarios/mint-async-build.parquet differ diff --git a/python/client-contract/src/dfo_client_contract/scenarios/newest-version-unreadable-page.json b/python/client-contract/src/dfo_client_contract/scenarios/newest-version-unreadable-page.json index 402884f..098fac3 100644 --- a/python/client-contract/src/dfo_client_contract/scenarios/newest-version-unreadable-page.json +++ b/python/client-contract/src/dfo_client_contract/scenarios/newest-version-unreadable-page.json @@ -93,12 +93,12 @@ "status": 200, "headers": { "content-type": "application/json", - "x-dfo-trace-id": "7675f31f4bd548c782dad4c6001a7666" + "x-dfo-trace-id": "7f479c764ec644b6a5604ebb5b57e314" }, "json": { "schema_version": 1, "spec_id": "spec_774d6c001a6250aa67ca676ab067895e", - "enrichment_stamp": "08ed6c734fc69ea2204a21f4e1dd8b963f14dd1e03a2484c618049ac2e2d93d8", + "enrichment_stamp": "55887b871f7aa1c5d120cb2bee97086605351d5acfbec645ab027f562d0f65c5", "next_cursor": null, "complete": true, "items": [ @@ -112,28 +112,28 @@ ], "op": "sum" }, - "enrichment_stamp": "08ed6c734fc69ea2204a21f4e1dd8b963f14dd1e03a2484c618049ac2e2d93d8" + "enrichment_stamp": "55887b871f7aa1c5d120cb2bee97086605351d5acfbec645ab027f562d0f65c5" }, { "content_version": "cv_b92d94774702c7f05f2075d0b03dd756", "base_content_version": null, "rendering": "plain", "groupby": null, - "enrichment_stamp": "08ed6c734fc69ea2204a21f4e1dd8b963f14dd1e03a2484c618049ac2e2d93d8" + "enrichment_stamp": "55887b871f7aa1c5d120cb2bee97086605351d5acfbec645ab027f562d0f65c5" }, { "content_version": "cv_9417c96e4e09dd36053fc395c5b0f92c", "base_content_version": null, "rendering": "plain", "groupby": null, - "enrichment_stamp": "08ed6c734fc69ea2204a21f4e1dd8b963f14dd1e03a2484c618049ac2e2d93d8" + "enrichment_stamp": "55887b871f7aa1c5d120cb2bee97086605351d5acfbec645ab027f562d0f65c5" }, { "content_version": "cv_e7f6ed9ddc5ca69902f92a8866f93ef7", "base_content_version": null, "rendering": "plain", "groupby": null, - "enrichment_stamp": "08ed6c734fc69ea2204a21f4e1dd8b963f14dd1e03a2484c618049ac2e2d93d8" + "enrichment_stamp": "55887b871f7aa1c5d120cb2bee97086605351d5acfbec645ab027f562d0f65c5" } ] } @@ -145,7 +145,7 @@ "error": { "class": "ContractError", "code": "contract_violation", - "trace_id": "7675f31f4bd548c782dad4c6001a7666" + "trace_id": "7f479c764ec644b6a5604ebb5b57e314" } } ] diff --git a/python/client-contract/src/dfo_client_contract/scenarios/operation-failed-without-error.json b/python/client-contract/src/dfo_client_contract/scenarios/operation-failed-without-error.json index f6ba391..f4d2940 100644 --- a/python/client-contract/src/dfo_client_contract/scenarios/operation-failed-without-error.json +++ b/python/client-contract/src/dfo_client_contract/scenarios/operation-failed-without-error.json @@ -10,7 +10,7 @@ "call": [ { "op": "operation", - "operation_id": "op_a50d083649ee12fbede446887afa771e76446419365e74ade9d5239d128e6846" + "operation_id": "op_cea62e9a880b015903a11a6fdc9e5b7bd0707e9a769df456b2a134ce776400f5" }, { "op": "result" @@ -20,24 +20,24 @@ { "request": { "method": "GET", - "path": "/datasets/operations/op_a50d083649ee12fbede446887afa771e76446419365e74ade9d5239d128e6846" + "path": "/datasets/operations/op_cea62e9a880b015903a11a6fdc9e5b7bd0707e9a769df456b2a134ce776400f5" }, "response": { "status": 200, "headers": { "content-type": "application/json", "retry-after": "2", - "x-dfo-trace-id": "3503ecbc88d84ff3b8fd26ec06762f34" + "x-dfo-trace-id": "d09eeb9cba1f42938f485a6288079127" }, "json": { "operation": { - "operation_id": "op_a50d083649ee12fbede446887afa771e76446419365e74ade9d5239d128e6846", + "operation_id": "op_cea62e9a880b015903a11a6fdc9e5b7bd0707e9a769df456b2a134ce776400f5", "status": "running", - "poll": "/api/datasets/operations/op_a50d083649ee12fbede446887afa771e76446419365e74ade9d5239d128e6846", + "poll": "/api/datasets/operations/op_cea62e9a880b015903a11a6fdc9e5b7bd0707e9a769df456b2a134ce776400f5", "retry_after_ms": 1500, "progress": { "rows_written": 0, - "estimate_rows": 110887 + "estimate_rows": 110783 } } } @@ -46,20 +46,20 @@ { "request": { "method": "GET", - "path": "/datasets/operations/op_a50d083649ee12fbede446887afa771e76446419365e74ade9d5239d128e6846" + "path": "/datasets/operations/op_cea62e9a880b015903a11a6fdc9e5b7bd0707e9a769df456b2a134ce776400f5" }, "response": { "status": 200, "headers": { "content-type": "application/json", "retry-after": "2", - "x-dfo-trace-id": "b53e0a1669e045e18d440f6189c13db3" + "x-dfo-trace-id": "6196f9194a7f4d9cafe63f7064e075ef" }, "json": { "operation": { - "operation_id": "op_a50d083649ee12fbede446887afa771e76446419365e74ade9d5239d128e6846", + "operation_id": "op_cea62e9a880b015903a11a6fdc9e5b7bd0707e9a769df456b2a134ce776400f5", "status": "failed", - "poll": "/api/datasets/operations/op_a50d083649ee12fbede446887afa771e76446419365e74ade9d5239d128e6846", + "poll": "/api/datasets/operations/op_cea62e9a880b015903a11a6fdc9e5b7bd0707e9a769df456b2a134ce776400f5", "retry_after_ms": 1500 } } @@ -69,7 +69,7 @@ "expect": [ { "operation": { - "operation_id": "op_a50d083649ee12fbede446887afa771e76446419365e74ade9d5239d128e6846", + "operation_id": "op_cea62e9a880b015903a11a6fdc9e5b7bd0707e9a769df456b2a134ce776400f5", "status": "running" } }, @@ -77,10 +77,10 @@ "error": { "class": "ServerError", "code": "operation_failed", - "trace_id": "b53e0a1669e045e18d440f6189c13db3", + "trace_id": "6196f9194a7f4d9cafe63f7064e075ef", "long_builds": [ { - "operation_id": "op_a50d083649ee12fbede446887afa771e76446419365e74ade9d5239d128e6846", + "operation_id": "op_cea62e9a880b015903a11a6fdc9e5b7bd0707e9a769df456b2a134ce776400f5", "poll_waits": [ 1.5 ], diff --git a/python/client-contract/src/dfo_client_contract/scenarios/operation-resume.json b/python/client-contract/src/dfo_client_contract/scenarios/operation-resume.json index 3c31a70..c087191 100644 --- a/python/client-contract/src/dfo_client_contract/scenarios/operation-resume.json +++ b/python/client-contract/src/dfo_client_contract/scenarios/operation-resume.json @@ -5,13 +5,13 @@ "origin": { "kind": "recorded", "base_url": "https://dfo-dev-apis-zms5lj4zhq-nn.a.run.app/api", - "dfo_commit": "d80df9f5fd598b7345255470932d202ee5d49942", - "recorded_at": "2026-10-26T09:22:51Z" + "dfo_commit": "ccb6617922c839ce3cd5615a3bbb65c70bfe1bde", + "recorded_at": "2026-11-01T07:38:46Z" }, "call": [ { "op": "operation", - "operation_id": "op_a50d083649ee12fbede446887afa771e76446419365e74ade9d5239d128e6846" + "operation_id": "op_cea62e9a880b015903a11a6fdc9e5b7bd0707e9a769df456b2a134ce776400f5" }, { "op": "result" @@ -21,24 +21,24 @@ { "request": { "method": "GET", - "path": "/datasets/operations/op_a50d083649ee12fbede446887afa771e76446419365e74ade9d5239d128e6846" + "path": "/datasets/operations/op_cea62e9a880b015903a11a6fdc9e5b7bd0707e9a769df456b2a134ce776400f5" }, "response": { "status": 200, "headers": { "content-type": "application/json", "retry-after": "2", - "x-dfo-trace-id": "3503ecbc88d84ff3b8fd26ec06762f34" + "x-dfo-trace-id": "d09eeb9cba1f42938f485a6288079127" }, "json": { "operation": { - "operation_id": "op_a50d083649ee12fbede446887afa771e76446419365e74ade9d5239d128e6846", + "operation_id": "op_cea62e9a880b015903a11a6fdc9e5b7bd0707e9a769df456b2a134ce776400f5", "status": "running", - "poll": "/api/datasets/operations/op_a50d083649ee12fbede446887afa771e76446419365e74ade9d5239d128e6846", + "poll": "/api/datasets/operations/op_cea62e9a880b015903a11a6fdc9e5b7bd0707e9a769df456b2a134ce776400f5", "retry_after_ms": 1500, "progress": { "rows_written": 0, - "estimate_rows": 110887 + "estimate_rows": 110783 } } } @@ -47,24 +47,24 @@ { "request": { "method": "GET", - "path": "/datasets/operations/op_a50d083649ee12fbede446887afa771e76446419365e74ade9d5239d128e6846" + "path": "/datasets/operations/op_cea62e9a880b015903a11a6fdc9e5b7bd0707e9a769df456b2a134ce776400f5" }, "response": { "status": 200, "headers": { "content-type": "application/json", "retry-after": "2", - "x-dfo-trace-id": "b53e0a1669e045e18d440f6189c13db3" + "x-dfo-trace-id": "6196f9194a7f4d9cafe63f7064e075ef" }, "json": { "operation": { - "operation_id": "op_a50d083649ee12fbede446887afa771e76446419365e74ade9d5239d128e6846", + "operation_id": "op_cea62e9a880b015903a11a6fdc9e5b7bd0707e9a769df456b2a134ce776400f5", "status": "running", - "poll": "/api/datasets/operations/op_a50d083649ee12fbede446887afa771e76446419365e74ade9d5239d128e6846", + "poll": "/api/datasets/operations/op_cea62e9a880b015903a11a6fdc9e5b7bd0707e9a769df456b2a134ce776400f5", "retry_after_ms": 1500, "progress": { - "rows_written": 33440, - "estimate_rows": 110887 + "rows_written": 42045, + "estimate_rows": 110783 } } } @@ -73,24 +73,24 @@ { "request": { "method": "GET", - "path": "/datasets/operations/op_a50d083649ee12fbede446887afa771e76446419365e74ade9d5239d128e6846" + "path": "/datasets/operations/op_cea62e9a880b015903a11a6fdc9e5b7bd0707e9a769df456b2a134ce776400f5" }, "response": { "status": 200, "headers": { "content-type": "application/json", "retry-after": "2", - "x-dfo-trace-id": "549a9e0bbec342a99c0176fd523c76e1" + "x-dfo-trace-id": "c523c5e4357a4056a066359cd5d4ad2b" }, "json": { "operation": { - "operation_id": "op_a50d083649ee12fbede446887afa771e76446419365e74ade9d5239d128e6846", + "operation_id": "op_cea62e9a880b015903a11a6fdc9e5b7bd0707e9a769df456b2a134ce776400f5", "status": "running", - "poll": "/api/datasets/operations/op_a50d083649ee12fbede446887afa771e76446419365e74ade9d5239d128e6846", + "poll": "/api/datasets/operations/op_cea62e9a880b015903a11a6fdc9e5b7bd0707e9a769df456b2a134ce776400f5", "retry_after_ms": 1500, "progress": { - "rows_written": 106679, - "estimate_rows": 110887 + "rows_written": 110783, + "estimate_rows": 110783 } } } @@ -99,24 +99,24 @@ { "request": { "method": "GET", - "path": "/datasets/operations/op_a50d083649ee12fbede446887afa771e76446419365e74ade9d5239d128e6846" + "path": "/datasets/operations/op_cea62e9a880b015903a11a6fdc9e5b7bd0707e9a769df456b2a134ce776400f5" }, "response": { "status": 200, "headers": { "content-type": "application/json", "retry-after": "2", - "x-dfo-trace-id": "2bb0086a22c149bdb666fe3834159c36" + "x-dfo-trace-id": "1607ec1e20064cb9b445c2c2511cb77d" }, "json": { "operation": { - "operation_id": "op_a50d083649ee12fbede446887afa771e76446419365e74ade9d5239d128e6846", + "operation_id": "op_cea62e9a880b015903a11a6fdc9e5b7bd0707e9a769df456b2a134ce776400f5", "status": "running", - "poll": "/api/datasets/operations/op_a50d083649ee12fbede446887afa771e76446419365e74ade9d5239d128e6846", + "poll": "/api/datasets/operations/op_cea62e9a880b015903a11a6fdc9e5b7bd0707e9a769df456b2a134ce776400f5", "retry_after_ms": 1500, "progress": { - "rows_written": 110887, - "estimate_rows": 110887 + "rows_written": 110783, + "estimate_rows": 110783 } } } @@ -125,24 +125,24 @@ { "request": { "method": "GET", - "path": "/datasets/operations/op_a50d083649ee12fbede446887afa771e76446419365e74ade9d5239d128e6846" + "path": "/datasets/operations/op_cea62e9a880b015903a11a6fdc9e5b7bd0707e9a769df456b2a134ce776400f5" }, "response": { "status": 200, "headers": { "content-type": "application/json", "retry-after": "2", - "x-dfo-trace-id": "d0b6893e4ca84abcaa449b70756d3a76" + "x-dfo-trace-id": "fa84d9570290430abac4d631afa4d7c7" }, "json": { "operation": { - "operation_id": "op_a50d083649ee12fbede446887afa771e76446419365e74ade9d5239d128e6846", + "operation_id": "op_cea62e9a880b015903a11a6fdc9e5b7bd0707e9a769df456b2a134ce776400f5", "status": "running", - "poll": "/api/datasets/operations/op_a50d083649ee12fbede446887afa771e76446419365e74ade9d5239d128e6846", - "retry_after_ms": 1832, + "poll": "/api/datasets/operations/op_cea62e9a880b015903a11a6fdc9e5b7bd0707e9a769df456b2a134ce776400f5", + "retry_after_ms": 1798, "progress": { - "rows_written": 110887, - "estimate_rows": 110887 + "rows_written": 110783, + "estimate_rows": 110783 } } } @@ -151,24 +151,24 @@ { "request": { "method": "GET", - "path": "/datasets/operations/op_a50d083649ee12fbede446887afa771e76446419365e74ade9d5239d128e6846" + "path": "/datasets/operations/op_cea62e9a880b015903a11a6fdc9e5b7bd0707e9a769df456b2a134ce776400f5" }, "response": { "status": 200, "headers": { "content-type": "application/json", "retry-after": "3", - "x-dfo-trace-id": "09d934a8ec1e4169971b1e0c61e5af38" + "x-dfo-trace-id": "5ff7dda447e142b088887ab49871e8fd" }, "json": { "operation": { - "operation_id": "op_a50d083649ee12fbede446887afa771e76446419365e74ade9d5239d128e6846", + "operation_id": "op_cea62e9a880b015903a11a6fdc9e5b7bd0707e9a769df456b2a134ce776400f5", "status": "running", - "poll": "/api/datasets/operations/op_a50d083649ee12fbede446887afa771e76446419365e74ade9d5239d128e6846", - "retry_after_ms": 2348, + "poll": "/api/datasets/operations/op_cea62e9a880b015903a11a6fdc9e5b7bd0707e9a769df456b2a134ce776400f5", + "retry_after_ms": 2281, "progress": { - "rows_written": 110887, - "estimate_rows": 110887 + "rows_written": 110783, + "estimate_rows": 110783 } } } @@ -177,24 +177,24 @@ { "request": { "method": "GET", - "path": "/datasets/operations/op_a50d083649ee12fbede446887afa771e76446419365e74ade9d5239d128e6846" + "path": "/datasets/operations/op_cea62e9a880b015903a11a6fdc9e5b7bd0707e9a769df456b2a134ce776400f5" }, "response": { "status": 200, "headers": { "content-type": "application/json", - "x-dfo-trace-id": "ddc5828be1d84a159d4579ad5ca8833d" + "x-dfo-trace-id": "874dfe94f7714583b11db1f9f07a9080" }, "json": { "operation": { - "operation_id": "op_a50d083649ee12fbede446887afa771e76446419365e74ade9d5239d128e6846", + "operation_id": "op_cea62e9a880b015903a11a6fdc9e5b7bd0707e9a769df456b2a134ce776400f5", "status": "done" }, "manifest": { "schema_version": 1, "definition": { "schema_version": 1, - "spec_id": "spec_dee41c61dd0335d145f4c65e451817cb", + "spec_id": "spec_3fad1ff594c6f4c24bcb28a0ec746302", "identity": { "shape": { "kind": "statvar_schema", @@ -226,7 +226,7 @@ }, { "binding": { - "ref": "Gross", + "ref": "Net", "state": "value" }, "property": "nettingBasis" @@ -413,14 +413,14 @@ "requested_window": { "kind": "range", "end_year": 2024, - "start_year": 1968 + "start_year": 1969 } } }, - "content_version": "cv_c29903dc477674b87b3e5e0097f7a828", - "prepared_at": "2026-10-26T09:23:00Z", + "content_version": "cv_698f200473c286d9cba969401a266bd4", + "prepared_at": "2026-11-01T07:38:54Z", "coverage": { - "rows": 110887, + "rows": 110783, "dimensions": [ { "label": "financingProvider", @@ -442,14 +442,14 @@ }, { "label": "years", - "count": 57 + "count": 56 } ], "window": { "kind": "range", "origin": "query", "end_year": 2024, - "start_year": 1968 + "start_year": 1969 } }, "citation": { @@ -476,8 +476,8 @@ "source_data_url": "https://webfs-dcd.oecd.org/files/dotStat/DSD_DAC2/Table2a_Data.zip", "attribution": "OECD (2026), OECD DAC2A, OECD Data Explorer, https://webfs-dcd.oecd.org/files/dotStat/DSD_DAC2/Table2a_Data.zip (accessed on 2026-10-12)", "update_cadence": "Quarterly", - "last_update": "2026-10-15", - "years_covered": "1960-2024", + "last_update": "2026-10-29", + "years_covered": "1960-2025", "granularity": "Annual, by provider and recipient", "currencies": [ "USD" @@ -488,8 +488,8 @@ "description": "The OECD publishes DAC2A in April, June, September and December. The complete table is downloaded from the OECD each time it is republished, and replaces the previous copy, so the data reflects the OECD's latest release." }, { - "transformation": "Exclude the partial preliminary year", - "description": "Before each full release, the OECD publishes preliminary data for the year that release covers, as reporters submit it. Until then, that year is partial, so the pipeline excludes it. Support for partial years is in development. Partial years will be marked incomplete, so they don't lead to incorrect or confusing analyses." + "transformation": "Mark the partial year", + "description": "The OECD publishes data for a year as donors report it, and its final release in December of the following year covers every donor. Until then, the year is partial. The pipeline publishes it, and the import's provenance names it in `partialObservationDate`." }, { "transformation": "Standardise providers and recipients", @@ -509,13 +509,23 @@ } ], "version_history": [ + { + "date": "2026-10-29", + "title": "Partial year published, marked as partial", + "changes": [ + { + "kind": "changed", + "note": "The partial year, which only some donors have reported ahead of the OECD's final release in December, is included, and the import's provenance marks it with `partialObservationDate`." + } + ] + }, { "date": "2026-10-15", - "title": "Partial preliminary year excluded", + "title": "Partial year excluded", "changes": [ { "kind": "changed", - "note": "The partial preliminary year published ahead of the next full release is excluded." + "note": "The partial year, which only some donors have reported ahead of the OECD's final release in December, is excluded." } ] }, @@ -568,39 +578,39 @@ "kind": "range", "origin": "query", "end_year": 2024, - "start_year": 1968 + "start_year": 1969 }, - "graph_revision": "dfo-dev-dc-datacommons-service-00273-mmh", + "graph_revision": "dfo-dev-dc-datacommons-service-00284-j2f", "normalisations": [], "code_index_stamp": { - "exported_at": "2026-10-24T19:20:27Z", - "content_hash": "3d946d8f4986dbbe0fa3e5c4c917200381f529d89ce417c11daeb22df56eed99", + "exported_at": "2026-11-01T03:08:18Z", + "content_hash": "a1bde3be8710f5ba073e52aaaba73cf9156079c273c874372f54bb07a81b0f94", "graph_endpoint": "graph_release" }, "source_revisions": [ { "source": "provenance/OECDDAC2A", - "revision": "2026-10-15" + "revision": "2026-10-29" } ], - "capability_version": "dset_76f5fa7244511c58", - "materialiser_build": "d80df9f5fd598b7345255470932d202ee5d49942", + "capability_version": "dset_5282a0674178a233", + "materialiser_build": "ccb6617922c839ce3cd5615a3bbb65c70bfe1bde", "resolved_stat_vars": [ { - "ref": "dcid:Amount_FinancialFlow_Gross_Disbursement_DAC2aAidType206_Nominal", + "ref": "dcid:Amount_FinancialFlow_Net_Disbursement_DAC2aAidType206_Nominal", "roles": [ "financingProvider", "financingRecipient" ], - "observation_count": 110887 + "observation_count": 110783 } ], "family_member_count": 1, - "family_member_digest": "1a36e1a7292b1bfff95a5415de0be74cac7bb033217ed50e79faa8ce51a224c0", + "family_member_digest": "c2d373442ac21a31377df76cd343f156c72a530649757c399c6661cbf56c9a71", "frame_grammar_version": "1.1.0", - "origin_catalogue_build_id": "20261026T000018Z-0af2cac5", + "origin_catalogue_build_id": "20261029T171521Z-7d0a5854", "served_from": "materialise", - "confirmed_at": "2026-10-26T09:23:03.079042+00:00" + "confirmed_at": "2026-11-01T07:38:56.944317+00:00" }, "warnings": [ { @@ -627,34 +637,34 @@ ], "artifacts": [ { - "artifact_digest": "sha256:3aae1d10e41e6cd40e33a2a65757641a4c74244ffcdd47974df72ab6dfa60779", + "artifact_digest": "sha256:6548eb176cdafbf4ca1624348dee06b20802151d8a1f4359024d526aa555ec93", "rendering": { "bundle": false, "format": "parquet", "layout": 4 }, - "bytes": 486086, + "bytes": 489019, "media_type": "application/vnd.apache.parquet", - "created_at": "2026-10-26T09:23:03.005638+00:00", + "created_at": "2026-11-01T07:38:56.890676+00:00", "tier": "working", - "url": "/api/datasets/spec_dee41c61dd0335d145f4c65e451817cb/cv_c29903dc477674b87b3e5e0097f7a828/files/sha256:3aae1d10e41e6cd40e33a2a65757641a4c74244ffcdd47974df72ab6dfa60779", - "enrichment_stamp": "08ed6c734fc69ea2204a21f4e1dd8b963f14dd1e03a2484c618049ac2e2d93d8" + "url": "/api/datasets/spec_3fad1ff594c6f4c24bcb28a0ec746302/cv_698f200473c286d9cba969401a266bd4/files/sha256:6548eb176cdafbf4ca1624348dee06b20802151d8a1f4359024d526aa555ec93", + "enrichment_stamp": "55887b871f7aa1c5d120cb2bee97086605351d5acfbec645ab027f562d0f65c5" }, { - "artifact_digest": "sha256:871390d2ad08d6c429938b930ac69f71d7b5d88cda0170a0433158f75dbdc167", + "artifact_digest": "sha256:4f28926f9366a1cd5282d5bb3229d590c6ff02846b4555ae7a3073cabd29f972", "rendering": { "statistics": "series" }, - "bytes": 153793, + "bytes": 156099, "media_type": "application/vnd.apache.parquet", - "created_at": "2026-10-26T09:23:03.005638+00:00", + "created_at": "2026-11-01T07:38:56.890676+00:00", "tier": "working", - "url": "/api/datasets/spec_dee41c61dd0335d145f4c65e451817cb/cv_c29903dc477674b87b3e5e0097f7a828/files/sha256:871390d2ad08d6c429938b930ac69f71d7b5d88cda0170a0433158f75dbdc167" + "url": "/api/datasets/spec_3fad1ff594c6f4c24bcb28a0ec746302/cv_698f200473c286d9cba969401a266bd4/files/sha256:4f28926f9366a1cd5282d5bb3229d590c6ff02846b4555ae7a3073cabd29f972" } ], - "series_count": 3907, + "series_count": 3908, "output_options": { - "capability_version": "dset_76f5fa7244511c58", + "capability_version": "dset_5282a0674178a233", "columns": [ { "name": "stat_var", @@ -678,7 +688,7 @@ "name": "time_period", "kind": "grain", "droppable": false, - "distinct": 57 + "distinct": 56 }, { "name": "value", @@ -737,7 +747,8 @@ "covered": 34 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": false }, { "column": "financingProvider", @@ -749,7 +760,8 @@ "covered": 34 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": false }, { "column": "financingProvider", @@ -761,7 +773,8 @@ "covered": 34 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true }, { "column": "financingProvider", @@ -773,7 +786,8 @@ "covered": 34 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": false }, { "column": "financingProvider", @@ -785,7 +799,8 @@ "covered": 34 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true }, { "column": "financingProvider", @@ -797,7 +812,8 @@ "covered": 34 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true }, { "column": "financingProvider", @@ -809,7 +825,8 @@ "covered": 34 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true }, { "column": "financingRecipient", @@ -821,7 +838,8 @@ "covered": 133 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": false }, { "column": "financingRecipient", @@ -839,7 +857,8 @@ "label": "South Sudan" } ], - "truncated": false + "truncated": false, + "in_long_layout": false }, { "column": "financingRecipient", @@ -851,7 +870,8 @@ "covered": 133 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true }, { "column": "financingRecipient", @@ -863,7 +883,8 @@ "covered": 133 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": false }, { "column": "financingRecipient", @@ -875,7 +896,8 @@ "covered": 133 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true }, { "column": "financingRecipient", @@ -887,7 +909,8 @@ "covered": 133 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true }, { "column": "financingRecipient", @@ -899,7 +922,8 @@ "covered": 133 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true } ], "long_layout_defaults": [ @@ -918,7 +942,7 @@ "varying": [ { "column": "time_period", - "distinct": 57 + "distinct": 56 } ] }, @@ -942,7 +966,7 @@ "varying": [ { "column": "time_period", - "distinct": 57 + "distinct": 56 } ] }, @@ -1001,10 +1025,10 @@ ] } }, - "series_coverage_stamp": "e6e717ab8c77e84d010915893ede5809e9ecec67929a07cfafbcc2210edfa1eb", + "series_coverage_stamp": "ad27fd11738abb03d2d84dc214e223f04781609636cf678d0d08c385fb863d99", "retention": { "pinned": false, - "held_until": "2026-11-25T09:23:03.004652Z" + "held_until": "2026-12-01T07:38:56.890348Z" } } } @@ -1053,7 +1077,7 @@ }, { "binding": { - "ref": "Gross", + "ref": "Net", "state": "value" }, "property": "nettingBasis" @@ -1240,7 +1264,7 @@ "requested_window": { "kind": "range", "end_year": 2024, - "start_year": 1968 + "start_year": 1969 } } } @@ -1252,7 +1276,7 @@ "status": 200, "headers": { "content-type": "application/json", - "x-dfo-trace-id": "2a8974d28a894ee0aebb24df0ca7dc67" + "x-dfo-trace-id": "3d7c463ce063414ebbaf29e35bfd7375" }, "json": { "schema_version": 1, @@ -1261,11 +1285,11 @@ "extract_skipped": true }, "diagnostics": { - "engine_build": "d80df9f5fd598b7345255470932d202ee5d49942", - "trace_id": "2a8974d28a894ee0aebb24df0ca7dc67", + "engine_build": "ccb6617922c839ce3cd5615a3bbb65c70bfe1bde", + "trace_id": "3d7c463ce063414ebbaf29e35bfd7375", "warnings": [], "timing_ms": { - "total": 2071, + "total": 512, "by_step": { "coverage": 0 } @@ -1278,19 +1302,39 @@ "variable_text": "dataset", "warnings": [], "timing_ms": { - "total": 1091, + "total": 427, "by_step": { "validate": 1, - "walk": 19, + "phase_validate": 0, + "walk": 0, "reread_arcs": 0, + "phase_reread_arcs": 0, "detect_edits": 0, + "phase_detect_edits": 0, "resolve_survivors": 0, - "shape": 1000, + "phase_resolve_survivors": 0, + "shape": 1, + "phase_build_shape": 0, "bind": 0, - "where_places": 2, - "materialise": 28, - "answer": 13, - "options": 28 + "phase_build_bindings": 0, + "where_places": 90, + "phase_where_places": 0, + "materialise": 34, + "phase_materialise": 0, + "ground_related": 0, + "ground_units": 0, + "ground_facets": 0, + "ground_convert": 0, + "answer": 178, + "ground_gates": 16, + "phase_ground_build": 97, + "finalize_preview": 0, + "options": 9, + "finalize_related": 0, + "finalize_wholes": 0, + "finalize_relaunch": 0, + "phase_finalize": 0, + "served_entry": 1 } }, "entity_refs": [], @@ -1305,10 +1349,10 @@ "assumptions": [], "status": "definite", "spec": { - "spec_id": "spec_dee41c61dd0335d145f4c65e451817cb", + "spec_id": "spec_3fad1ff594c6f4c24bcb28a0ec746302", "definition": { "schema_version": 1, - "spec_id": "spec_dee41c61dd0335d145f4c65e451817cb", + "spec_id": "spec_3fad1ff594c6f4c24bcb28a0ec746302", "identity": { "identity_version": "spec1", "shape": { @@ -1343,7 +1387,7 @@ "property": "nettingBasis", "binding": { "state": "value", - "ref": "Gross" + "ref": "Net" } } ], @@ -1526,7 +1570,7 @@ }, "requested_window": { "kind": "range", - "start_year": 1968, + "start_year": 1969, "end_year": 2024 } } @@ -1534,7 +1578,7 @@ "resolved": { "shape": { "shape_id": "financialflow_amount_measuredvalue_nominal_family_f096b1ba", - "label": "gross disbursements (official development assistance)", + "label": "net disbursements (official development assistance)", "population_type": { "ref": "FinancialFlow", "label": "financial flow" @@ -1599,7 +1643,7 @@ } ], "member_count": 1, - "member_digest": "1a36e1a7292b1bfff95a5415de0be74cac7bb033217ed50e79faa8ce51a224c0", + "member_digest": "c2d373442ac21a31377df76cd343f156c72a530649757c399c6661cbf56c9a71", "refine_supported": true, "data_commons": [ { @@ -1664,8 +1708,8 @@ "kind": "value", "value": { "ref": { - "ref": "Gross", - "label": "gross" + "ref": "Net", + "label": "net" }, "value_kind": "enum_value" } @@ -2639,7 +2683,7 @@ "value": { "value_kind": "time_window", "time_window": { - "start_year": 1968, + "start_year": 1969, "end_year": 2024 } } @@ -2666,7 +2710,7 @@ "member_count_exact": true, "served_count": 1, "data_date_range": { - "start": "1968", + "start": "1969", "end": "2024" } }, @@ -3701,7 +3745,7 @@ "coverage": { "kind": "exact", "has_data": true, - "observation_count": 110887, + "observation_count": 110783, "evidence": "facet_metadata", "dimensions": [ { @@ -3710,7 +3754,7 @@ }, { "label": "observations", - "count": 57 + "count": 56 }, { "label": "variables", @@ -3718,7 +3762,7 @@ } ], "window": { - "start_year": 1968, + "start_year": 1969, "end_year": 2024 } }, @@ -3726,11 +3770,11 @@ "year": 2024, "year_named": true, "named_window": { - "start_year": 1968, + "start_year": 1969, "end_year": 2024 }, - "observations": 2629, - "series": 2629, + "observations": 2638, + "series": 2638, "role_counts": { "financingProvider": 34, "financingRecipient": 117 @@ -3738,8 +3782,8 @@ "recent_years": [ { "year": 2024, - "observations": 2629, - "series": 2629, + "observations": 2638, + "series": 2638, "role_counts": { "financingProvider": 34, "financingRecipient": 117 @@ -3747,8 +3791,8 @@ }, { "year": 2023, - "observations": 2588, - "series": 2588, + "observations": 2601, + "series": 2601, "role_counts": { "financingProvider": 34, "financingRecipient": 117 @@ -3756,8 +3800,8 @@ }, { "year": 2022, - "observations": 2628, - "series": 2628, + "observations": 2639, + "series": 2639, "role_counts": { "financingProvider": 34, "financingRecipient": 117 @@ -3766,18 +3810,18 @@ ] }, "download": { - "rows": 110887, + "rows": 110783, "rows_exact": true, - "series": 3907, + "series": 3908, "window": { - "start_year": 1968, + "start_year": 1969, "end_year": 2024 }, "licence": { "label": "OECD Terms and Conditions" } }, - "coverage_stamp": "e6e717ab8c77e84d010915893ede5809e9ecec67929a07cfafbcc2210edfa1eb", + "coverage_stamp": "ad27fd11738abb03d2d84dc214e223f04781609636cf678d0d08c385fb863d99", "facets": { "provenance": { "basis": "fallback", @@ -3823,60 +3867,60 @@ "relation": "child", "parent": "DAC2aAidType206", "member_count": 2, - "served_rows": 17503, + "served_rows": 27422, "served_rows_exact": true }, { "value": { "ref": { - "ref": "DAC2aAidType201", - "label": "ODA grant" + "ref": "DAC2aAidType219", + "label": "recovery on ODA grants and capital subscriptions" }, "value_kind": "enum_value" }, "relation": "child", "parent": "DAC2aAidType206", "member_count": 1, - "served_rows": 110146, + "served_rows": 6176, "served_rows_exact": true }, { "value": { "ref": { - "ref": "DAC2aAidType207", - "label": "free-standing technical co-operation" + "ref": "DAC2aAidType209", + "label": "interest received on ODA lending" }, "value_kind": "enum_value" }, "relation": "root", "member_count": 1, - "served_rows": 87187, + "served_rows": 16832, "served_rows_exact": true }, { "value": { "ref": { - "ref": "DAC2aAidType213", - "label": "developmental food aid" + "ref": "DAC2aAidType250", + "label": "official development assistance excluding debt relief" }, "value_kind": "enum_value" }, "relation": "root", "member_count": 1, - "served_rows": 13512, + "served_rows": 110798, "served_rows_exact": true }, { "value": { "ref": { - "ref": "DAC2aAidType216", - "label": "humanitarian aid" + "ref": "DAC2aAidType255", + "label": "debt relief" }, "value_kind": "enum_value" }, "relation": "root", "member_count": 1, - "served_rows": 27720, + "served_rows": 4639, "served_rows_exact": true } ], @@ -3919,11 +3963,11 @@ "source": "observed" } ], - "rendered_sentence": "Gross disbursements to 133 recipients from 38 providers for official development assistance, 1968 to 2024. Current US dollars · OECD DAC2a.", + "rendered_sentence": "Net disbursements to 133 recipients from 38 providers for official development assistance, 1969 to 2024. Current US dollars · OECD DAC2a.", "sentence_plan": [ { "kind": "slot", - "text": "Gross disbursements", + "text": "Net disbursements", "axis": "what", "segment": "heading", "entity_refs": [], @@ -4202,7 +4246,7 @@ }, { "kind": "slot", - "text": "1968 to 2024", + "text": "1969 to 2024", "axis": "when", "segment": "heading", "binding_ref": "when:", @@ -5013,8 +5057,8 @@ "binding_kind": "value", "refs": [ { - "ref": "Gross", - "label": "gross" + "ref": "Net", + "label": "net" } ], "provenance": "binder" @@ -5595,10 +5639,10 @@ ], "query_qualifiers": [], "requested_window": { - "start_year": 1968, + "start_year": 1969, "end_year": 2024 }, - "capability_version": "cap_765c9d2a0c7529b9" + "capability_version": "cap_4913302d7a6b6435" }, "confidence": "high", "available_at_place": true, @@ -5606,7 +5650,7 @@ { "definition": { "schema_version": 1, - "spec_id": "spec_6a878829c5a95abb6c08dc9bb0668022", + "spec_id": "spec_88aab058d001c10242f9b49a44784e92", "identity": { "identity_version": "spec1", "shape": { @@ -5641,7 +5685,7 @@ "property": "nettingBasis", "binding": { "state": "value", - "ref": "Net" + "ref": "Gross" } } ], @@ -5824,12 +5868,12 @@ }, "requested_window": { "kind": "range", - "start_year": 1968, + "start_year": 1969, "end_year": 2024 } } }, - "label": "net disbursements", + "label": "gross disbursements", "axis": "what", "measure_axis_values": [ { @@ -5863,16 +5907,16 @@ { "axis": "nettingBasis", "value": { - "ref": "Net", - "label": "net" + "ref": "Gross", + "label": "gross" } } ], - "served_rows": 111506, + "served_rows": 110167, "served_rows_exact": true } ], - "measure_label": "gross disbursements", + "measure_label": "net disbursements", "measure_label_axes": [ "populationType", "measuredProperty", @@ -5912,11 +5956,13 @@ { "axis": "nettingBasis", "value": { - "ref": "Gross", - "label": "gross" + "ref": "Net", + "label": "net" } } ], + "concept_label": "official development assistance", + "published_tables": "OECD DAC2a", "unit_conversion": { "currencies": [ { @@ -5927,7 +5973,7 @@ "end_year": 2021 }, "constant_years": { - "start_year": 1968, + "start_year": 1969, "end_year": 2024 }, "base_year_min": 2023, @@ -5941,7 +5987,7 @@ "end_year": 2024 }, "constant_years": { - "start_year": 1968, + "start_year": 1969, "end_year": 2024 }, "base_year_min": 2002, @@ -5955,7 +6001,7 @@ "end_year": 2024 }, "constant_years": { - "start_year": 1968, + "start_year": 1969, "end_year": 2024 }, "base_year_min": 1980, @@ -5969,7 +6015,7 @@ "end_year": 2024 }, "constant_years": { - "start_year": 1968, + "start_year": 1969, "end_year": 2024 }, "base_year_min": 1992, @@ -5983,7 +6029,7 @@ "end_year": 2024 }, "constant_years": { - "start_year": 1968, + "start_year": 1969, "end_year": 2024 }, "base_year_min": 1991, @@ -5997,7 +6043,7 @@ "end_year": 2024 }, "constant_years": { - "start_year": 1968, + "start_year": 1969, "end_year": 2024 }, "base_year_min": 1980, @@ -6007,11 +6053,11 @@ "code": "AUD", "noun": "Australian dollars", "current_years": { - "start_year": 1968, + "start_year": 1969, "end_year": 2024 }, "constant_years": { - "start_year": 1968, + "start_year": 1969, "end_year": 2024 }, "base_year_min": 1960, @@ -6025,7 +6071,7 @@ "end_year": 2024 }, "constant_years": { - "start_year": 1968, + "start_year": 1969, "end_year": 2024 }, "base_year_min": 1995, @@ -6039,7 +6085,7 @@ "end_year": 2019 }, "constant_years": { - "start_year": 1968, + "start_year": 1969, "end_year": 2024 }, "base_year_min": 2023, @@ -6053,7 +6099,7 @@ "end_year": 2024 }, "constant_years": { - "start_year": 1968, + "start_year": 1969, "end_year": 2024 }, "base_year_min": 1996, @@ -6067,7 +6113,7 @@ "end_year": 2024 }, "constant_years": { - "start_year": 1968, + "start_year": 1969, "end_year": 2024 }, "base_year_min": 1980, @@ -6081,7 +6127,7 @@ "end_year": 2024 }, "constant_years": { - "start_year": 1968, + "start_year": 1969, "end_year": 2024 }, "base_year_min": 1980, @@ -6095,7 +6141,7 @@ "end_year": 2024 }, "constant_years": { - "start_year": 1968, + "start_year": 1969, "end_year": 2024 }, "base_year_min": 1980, @@ -6109,7 +6155,7 @@ "end_year": 2024 }, "constant_years": { - "start_year": 1968, + "start_year": 1969, "end_year": 2024 }, "base_year_min": 1980, @@ -6123,7 +6169,7 @@ "end_year": 2024 }, "constant_years": { - "start_year": 1968, + "start_year": 1969, "end_year": 2024 }, "base_year_min": 1985, @@ -6137,7 +6183,7 @@ "end_year": 2024 }, "constant_years": { - "start_year": 1968, + "start_year": 1969, "end_year": 2024 }, "base_year_min": 1980, @@ -6151,7 +6197,7 @@ "end_year": 2024 }, "constant_years": { - "start_year": 1968, + "start_year": 1969, "end_year": 2024 }, "base_year_min": 1986, @@ -6165,7 +6211,7 @@ "end_year": 2024 }, "constant_years": { - "start_year": 1968, + "start_year": 1969, "end_year": 2024 }, "base_year_min": 1980, @@ -6179,7 +6225,7 @@ "end_year": 2024 }, "constant_years": { - "start_year": 1968, + "start_year": 1969, "end_year": 2024 }, "base_year_min": 1980, @@ -6193,7 +6239,7 @@ "end_year": 2024 }, "constant_years": { - "start_year": 1968, + "start_year": 1969, "end_year": 2024 }, "base_year_min": 1980, @@ -6207,7 +6253,7 @@ "end_year": 2024 }, "constant_years": { - "start_year": 1968, + "start_year": 1969, "end_year": 2024 }, "base_year_min": 1992, @@ -6221,7 +6267,7 @@ "end_year": 2024 }, "constant_years": { - "start_year": 1968, + "start_year": 1969, "end_year": 2024 }, "base_year_min": 1980, @@ -6231,11 +6277,11 @@ "code": "CAD", "noun": "Canadian dollars", "current_years": { - "start_year": 1968, + "start_year": 1969, "end_year": 2024 }, "constant_years": { - "start_year": 1968, + "start_year": 1969, "end_year": 2024 }, "base_year_min": 1960, @@ -6249,7 +6295,7 @@ "end_year": 2024 }, "constant_years": { - "start_year": 1968, + "start_year": 1969, "end_year": 2024 }, "base_year_min": 1991, @@ -6259,11 +6305,11 @@ "code": "CHF", "noun": "Swiss francs", "current_years": { - "start_year": 1968, + "start_year": 1969, "end_year": 2024 }, "constant_years": { - "start_year": 1968, + "start_year": 1969, "end_year": 2024 }, "base_year_min": 1960, @@ -6277,7 +6323,7 @@ "end_year": 2024 }, "constant_years": { - "start_year": 1968, + "start_year": 1969, "end_year": 2024 }, "base_year_min": 1980, @@ -6291,7 +6337,7 @@ "end_year": 2024 }, "constant_years": { - "start_year": 1968, + "start_year": 1969, "end_year": 2024 }, "base_year_min": 1980, @@ -6305,7 +6351,7 @@ "end_year": 2024 }, "constant_years": { - "start_year": 1968, + "start_year": 1969, "end_year": 2024 }, "base_year_min": 1980, @@ -6319,7 +6365,7 @@ "end_year": 2024 }, "constant_years": { - "start_year": 1968, + "start_year": 1969, "end_year": 2024 }, "base_year_min": 1980, @@ -6333,7 +6379,7 @@ "end_year": 2024 }, "constant_years": { - "start_year": 1968, + "start_year": 1969, "end_year": 2024 }, "base_year_min": 1980, @@ -6347,7 +6393,7 @@ "end_year": 2024 }, "constant_years": { - "start_year": 1968, + "start_year": 1969, "end_year": 2024 }, "base_year_min": 1998, @@ -6361,7 +6407,7 @@ "end_year": 2024 }, "constant_years": { - "start_year": 1968, + "start_year": 1969, "end_year": 2024 }, "base_year_min": 1990, @@ -6371,11 +6417,11 @@ "code": "DKK", "noun": "Danish kroner", "current_years": { - "start_year": 1968, + "start_year": 1969, "end_year": 2024 }, "constant_years": { - "start_year": 1968, + "start_year": 1969, "end_year": 2024 }, "base_year_min": 1960, @@ -6389,7 +6435,7 @@ "end_year": 2024 }, "constant_years": { - "start_year": 1968, + "start_year": 1969, "end_year": 2024 }, "base_year_min": 1980, @@ -6403,7 +6449,7 @@ "end_year": 2024 }, "constant_years": { - "start_year": 1968, + "start_year": 1969, "end_year": 2024 }, "base_year_min": 1980, @@ -6417,7 +6463,7 @@ "end_year": 2024 }, "constant_years": { - "start_year": 1968, + "start_year": 1969, "end_year": 2024 }, "base_year_min": 1980, @@ -6431,7 +6477,7 @@ "end_year": 2019 }, "constant_years": { - "start_year": 1968, + "start_year": 1969, "end_year": 2024 }, "base_year_min": 1992, @@ -6445,7 +6491,7 @@ "end_year": 2024 }, "constant_years": { - "start_year": 1968, + "start_year": 1969, "end_year": 2024 }, "base_year_min": 1980, @@ -6459,7 +6505,7 @@ "end_year": 2024 }, "constant_years": { - "start_year": 1968, + "start_year": 1969, "end_year": 2024 }, "base_year_min": 1973, @@ -6473,7 +6519,7 @@ "end_year": 2024 }, "constant_years": { - "start_year": 1968, + "start_year": 1969, "end_year": 2024 }, "base_year_min": 1980, @@ -6483,11 +6529,11 @@ "code": "GBP", "noun": "British pounds", "current_years": { - "start_year": 1968, + "start_year": 1969, "end_year": 2024 }, "constant_years": { - "start_year": 1968, + "start_year": 1969, "end_year": 2024 }, "base_year_min": 1960, @@ -6501,7 +6547,7 @@ "end_year": 2024 }, "constant_years": { - "start_year": 1968, + "start_year": 1969, "end_year": 2024 }, "base_year_min": 1994, @@ -6515,7 +6561,7 @@ "end_year": 2024 }, "constant_years": { - "start_year": 1968, + "start_year": 1969, "end_year": 2024 }, "base_year_min": 1980, @@ -6529,7 +6575,7 @@ "end_year": 2024 }, "constant_years": { - "start_year": 1968, + "start_year": 1969, "end_year": 2024 }, "base_year_min": 1980, @@ -6543,7 +6589,7 @@ "end_year": 2024 }, "constant_years": { - "start_year": 1968, + "start_year": 1969, "end_year": 2024 }, "base_year_min": 1980, @@ -6557,7 +6603,7 @@ "end_year": 2024 }, "constant_years": { - "start_year": 1968, + "start_year": 1969, "end_year": 2024 }, "base_year_min": 1980, @@ -6571,7 +6617,7 @@ "end_year": 2024 }, "constant_years": { - "start_year": 1968, + "start_year": 1969, "end_year": 2024 }, "base_year_min": 1980, @@ -6585,7 +6631,7 @@ "end_year": 2024 }, "constant_years": { - "start_year": 1968, + "start_year": 1969, "end_year": 2024 }, "base_year_min": 1980, @@ -6599,7 +6645,7 @@ "end_year": 2024 }, "constant_years": { - "start_year": 1968, + "start_year": 1969, "end_year": 2024 }, "base_year_min": 1980, @@ -6613,7 +6659,7 @@ "end_year": 2024 }, "constant_years": { - "start_year": 1968, + "start_year": 1969, "end_year": 2024 }, "base_year_min": 1980, @@ -6627,7 +6673,7 @@ "end_year": 2024 }, "constant_years": { - "start_year": 1968, + "start_year": 1969, "end_year": 2024 }, "base_year_min": 2003, @@ -6641,7 +6687,7 @@ "end_year": 2024 }, "constant_years": { - "start_year": 1968, + "start_year": 1969, "end_year": 2024 }, "base_year_min": 1980, @@ -6655,7 +6701,7 @@ "end_year": 2024 }, "constant_years": { - "start_year": 1968, + "start_year": 1969, "end_year": 2024 }, "base_year_min": 1997, @@ -6669,7 +6715,7 @@ "end_year": 2024 }, "constant_years": { - "start_year": 1968, + "start_year": 1969, "end_year": 2024 }, "base_year_min": 1980, @@ -6683,7 +6729,7 @@ "end_year": 2024 }, "constant_years": { - "start_year": 1968, + "start_year": 1969, "end_year": 2024 }, "base_year_min": 2000, @@ -6697,7 +6743,7 @@ "end_year": 2024 }, "constant_years": { - "start_year": 1968, + "start_year": 1969, "end_year": 2024 }, "base_year_min": 1980, @@ -6711,7 +6757,7 @@ "end_year": 2024 }, "constant_years": { - "start_year": 1968, + "start_year": 1969, "end_year": 2024 }, "base_year_min": 1997, @@ -6725,7 +6771,7 @@ "end_year": 2024 }, "constant_years": { - "start_year": 1968, + "start_year": 1969, "end_year": 2024 }, "base_year_min": 1980, @@ -6739,7 +6785,7 @@ "end_year": 2024 }, "constant_years": { - "start_year": 1968, + "start_year": 1969, "end_year": 2024 }, "base_year_min": 1980, @@ -6749,11 +6795,11 @@ "code": "JPY", "noun": "Japanese yen", "current_years": { - "start_year": 1968, + "start_year": 1969, "end_year": 2024 }, "constant_years": { - "start_year": 1968, + "start_year": 1969, "end_year": 2024 }, "base_year_min": 1960, @@ -6767,7 +6813,7 @@ "end_year": 2024 }, "constant_years": { - "start_year": 1968, + "start_year": 1969, "end_year": 2024 }, "base_year_min": 1980, @@ -6781,7 +6827,7 @@ "end_year": 2024 }, "constant_years": { - "start_year": 1968, + "start_year": 1969, "end_year": 2024 }, "base_year_min": 1992, @@ -6795,7 +6841,7 @@ "end_year": 2024 }, "constant_years": { - "start_year": 1968, + "start_year": 1969, "end_year": 2024 }, "base_year_min": 1986, @@ -6809,7 +6855,7 @@ "end_year": 2024 }, "constant_years": { - "start_year": 1968, + "start_year": 1969, "end_year": 2024 }, "base_year_min": 1980, @@ -6823,7 +6869,7 @@ "end_year": 2024 }, "constant_years": { - "start_year": 1968, + "start_year": 1969, "end_year": 2024 }, "base_year_min": 1987, @@ -6837,7 +6883,7 @@ "end_year": 2024 }, "constant_years": { - "start_year": 1968, + "start_year": 1969, "end_year": 2024 }, "base_year_min": 1995, @@ -6851,7 +6897,7 @@ "end_year": 2024 }, "constant_years": { - "start_year": 1968, + "start_year": 1969, "end_year": 2024 }, "base_year_min": 2013, @@ -6865,7 +6911,7 @@ "end_year": 2024 }, "constant_years": { - "start_year": 1968, + "start_year": 1969, "end_year": 2024 }, "base_year_min": 1980, @@ -6879,7 +6925,7 @@ "end_year": 2024 }, "constant_years": { - "start_year": 1968, + "start_year": 1969, "end_year": 2024 }, "base_year_min": 1980, @@ -6893,7 +6939,7 @@ "end_year": 2024 }, "constant_years": { - "start_year": 1968, + "start_year": 1969, "end_year": 2024 }, "base_year_min": 1980, @@ -6907,7 +6953,7 @@ "end_year": 2024 }, "constant_years": { - "start_year": 1968, + "start_year": 1969, "end_year": 2024 }, "base_year_min": 1980, @@ -6921,7 +6967,7 @@ "end_year": 2024 }, "constant_years": { - "start_year": 1968, + "start_year": 1969, "end_year": 2024 }, "base_year_min": 1980, @@ -6935,7 +6981,7 @@ "end_year": 2024 }, "constant_years": { - "start_year": 1968, + "start_year": 1969, "end_year": 2024 }, "base_year_min": 1980, @@ -6949,7 +6995,7 @@ "end_year": 2024 }, "constant_years": { - "start_year": 1968, + "start_year": 1969, "end_year": 2024 }, "base_year_min": 1992, @@ -6963,7 +7009,7 @@ "end_year": 2024 }, "constant_years": { - "start_year": 1968, + "start_year": 1969, "end_year": 2024 }, "base_year_min": 1980, @@ -6977,7 +7023,7 @@ "end_year": 2024 }, "constant_years": { - "start_year": 1968, + "start_year": 1969, "end_year": 2024 }, "base_year_min": 1992, @@ -6991,7 +7037,7 @@ "end_year": 2024 }, "constant_years": { - "start_year": 1968, + "start_year": 1969, "end_year": 2024 }, "base_year_min": 1998, @@ -7005,7 +7051,7 @@ "end_year": 2024 }, "constant_years": { - "start_year": 1968, + "start_year": 1969, "end_year": 2024 }, "base_year_min": 1980, @@ -7019,7 +7065,7 @@ "end_year": 2024 }, "constant_years": { - "start_year": 1968, + "start_year": 1969, "end_year": 2024 }, "base_year_min": 2001, @@ -7033,7 +7079,7 @@ "end_year": 2024 }, "constant_years": { - "start_year": 1968, + "start_year": 1969, "end_year": 2024 }, "base_year_min": 1990, @@ -7047,7 +7093,7 @@ "end_year": 2024 }, "constant_years": { - "start_year": 1968, + "start_year": 1969, "end_year": 2024 }, "base_year_min": 1980, @@ -7061,7 +7107,7 @@ "end_year": 2024 }, "constant_years": { - "start_year": 1968, + "start_year": 1969, "end_year": 2024 }, "base_year_min": 1980, @@ -7075,7 +7121,7 @@ "end_year": 2024 }, "constant_years": { - "start_year": 1968, + "start_year": 1969, "end_year": 2024 }, "base_year_min": 1980, @@ -7089,7 +7135,7 @@ "end_year": 2024 }, "constant_years": { - "start_year": 1968, + "start_year": 1969, "end_year": 2024 }, "base_year_min": 1980, @@ -7103,7 +7149,7 @@ "end_year": 2024 }, "constant_years": { - "start_year": 1968, + "start_year": 1969, "end_year": 2024 }, "base_year_min": 1980, @@ -7117,7 +7163,7 @@ "end_year": 2024 }, "constant_years": { - "start_year": 1968, + "start_year": 1969, "end_year": 2024 }, "base_year_min": 1980, @@ -7131,7 +7177,7 @@ "end_year": 2024 }, "constant_years": { - "start_year": 1968, + "start_year": 1969, "end_year": 2024 }, "base_year_min": 1989, @@ -7145,7 +7191,7 @@ "end_year": 2024 }, "constant_years": { - "start_year": 1968, + "start_year": 1969, "end_year": 2024 }, "base_year_min": 1990, @@ -7159,7 +7205,7 @@ "end_year": 2024 }, "constant_years": { - "start_year": 1968, + "start_year": 1969, "end_year": 2024 }, "base_year_min": 1987, @@ -7169,11 +7215,11 @@ "code": "NOK", "noun": "Norwegian kroner", "current_years": { - "start_year": 1968, + "start_year": 1969, "end_year": 2024 }, "constant_years": { - "start_year": 1968, + "start_year": 1969, "end_year": 2024 }, "base_year_min": 1960, @@ -7187,7 +7233,7 @@ "end_year": 2024 }, "constant_years": { - "start_year": 1968, + "start_year": 1969, "end_year": 2024 }, "base_year_min": 1980, @@ -7197,11 +7243,11 @@ "code": "NZD", "noun": "New Zealand dollars", "current_years": { - "start_year": 1968, + "start_year": 1969, "end_year": 2024 }, "constant_years": { - "start_year": 1968, + "start_year": 1969, "end_year": 2024 }, "base_year_min": 1961, @@ -7215,7 +7261,7 @@ "end_year": 2024 }, "constant_years": { - "start_year": 1968, + "start_year": 1969, "end_year": 2024 }, "base_year_min": 1980, @@ -7229,7 +7275,7 @@ "end_year": 2024 }, "constant_years": { - "start_year": 1968, + "start_year": 1969, "end_year": 2024 }, "base_year_min": 1980, @@ -7243,7 +7289,7 @@ "end_year": 2024 }, "constant_years": { - "start_year": 1968, + "start_year": 1969, "end_year": 2024 }, "base_year_min": 1980, @@ -7257,7 +7303,7 @@ "end_year": 2024 }, "constant_years": { - "start_year": 1968, + "start_year": 1969, "end_year": 2024 }, "base_year_min": 1980, @@ -7271,7 +7317,7 @@ "end_year": 2024 }, "constant_years": { - "start_year": 1968, + "start_year": 1969, "end_year": 2024 }, "base_year_min": 1980, @@ -7285,7 +7331,7 @@ "end_year": 2024 }, "constant_years": { - "start_year": 1968, + "start_year": 1969, "end_year": 2024 }, "base_year_min": 1998, @@ -7299,7 +7345,7 @@ "end_year": 2024 }, "constant_years": { - "start_year": 1968, + "start_year": 1969, "end_year": 2024 }, "base_year_min": 1980, @@ -7313,7 +7359,7 @@ "end_year": 1990 }, "constant_years": { - "start_year": 1968, + "start_year": 1969, "end_year": 2024 }, "base_year_min": 2023, @@ -7327,7 +7373,7 @@ "end_year": 2024 }, "constant_years": { - "start_year": 1968, + "start_year": 1969, "end_year": 2024 }, "base_year_min": 2013, @@ -7341,7 +7387,7 @@ "end_year": 2024 }, "constant_years": { - "start_year": 1968, + "start_year": 1969, "end_year": 2024 }, "base_year_min": 1997, @@ -7355,7 +7401,7 @@ "end_year": 2020 }, "constant_years": { - "start_year": 1968, + "start_year": 1969, "end_year": 2024 }, "base_year_min": 2010, @@ -7369,7 +7415,7 @@ "end_year": 2024 }, "constant_years": { - "start_year": 1968, + "start_year": 1969, "end_year": 2024 }, "base_year_min": 1980, @@ -7383,7 +7429,7 @@ "end_year": 2023 }, "constant_years": { - "start_year": 1968, + "start_year": 1969, "end_year": 2024 }, "base_year_min": 2000, @@ -7397,7 +7443,7 @@ "end_year": 2024 }, "constant_years": { - "start_year": 1968, + "start_year": 1969, "end_year": 2024 }, "base_year_min": 1980, @@ -7411,7 +7457,7 @@ "end_year": 2024 }, "constant_years": { - "start_year": 1968, + "start_year": 1969, "end_year": 2024 }, "base_year_min": 1980, @@ -7425,7 +7471,7 @@ "end_year": 2024 }, "constant_years": { - "start_year": 1968, + "start_year": 1969, "end_year": 2024 }, "base_year_min": 1980, @@ -7435,11 +7481,11 @@ "code": "SEK", "noun": "Swedish kronor", "current_years": { - "start_year": 1968, + "start_year": 1969, "end_year": 2024 }, "constant_years": { - "start_year": 1968, + "start_year": 1969, "end_year": 2024 }, "base_year_min": 1960, @@ -7453,7 +7499,7 @@ "end_year": 2024 }, "constant_years": { - "start_year": 1968, + "start_year": 1969, "end_year": 2024 }, "base_year_min": 1980, @@ -7467,7 +7513,7 @@ "end_year": 2024 }, "constant_years": { - "start_year": 1968, + "start_year": 1969, "end_year": 2024 }, "base_year_min": 1980, @@ -7481,7 +7527,7 @@ "end_year": 2024 }, "constant_years": { - "start_year": 1968, + "start_year": 1969, "end_year": 2024 }, "base_year_min": 1980, @@ -7495,7 +7541,7 @@ "end_year": 2024 }, "constant_years": { - "start_year": 1968, + "start_year": 1969, "end_year": 2024 }, "base_year_min": 2011, @@ -7509,7 +7555,7 @@ "end_year": 2024 }, "constant_years": { - "start_year": 1968, + "start_year": 1969, "end_year": 2024 }, "base_year_min": 1980, @@ -7523,7 +7569,7 @@ "end_year": 2010 }, "constant_years": { - "start_year": 1968, + "start_year": 1969, "end_year": 2024 }, "base_year_min": 1980, @@ -7537,7 +7583,7 @@ "end_year": 2024 }, "constant_years": { - "start_year": 1968, + "start_year": 1969, "end_year": 2024 }, "base_year_min": 1980, @@ -7551,7 +7597,7 @@ "end_year": 2016 }, "constant_years": { - "start_year": 1968, + "start_year": 1969, "end_year": 2024 }, "base_year_min": 2018, @@ -7565,7 +7611,7 @@ "end_year": 2024 }, "constant_years": { - "start_year": 1968, + "start_year": 1969, "end_year": 2024 }, "base_year_min": 1992, @@ -7579,7 +7625,7 @@ "end_year": 2024 }, "constant_years": { - "start_year": 1968, + "start_year": 1969, "end_year": 2024 }, "base_year_min": 1992, @@ -7593,7 +7639,7 @@ "end_year": 2024 }, "constant_years": { - "start_year": 1968, + "start_year": 1969, "end_year": 2024 }, "base_year_min": 1980, @@ -7607,7 +7653,7 @@ "end_year": 2024 }, "constant_years": { - "start_year": 1968, + "start_year": 1969, "end_year": 2024 }, "base_year_min": 1980, @@ -7621,7 +7667,7 @@ "end_year": 2024 }, "constant_years": { - "start_year": 1968, + "start_year": 1969, "end_year": 2024 }, "base_year_min": 1990, @@ -7635,7 +7681,7 @@ "end_year": 2024 }, "constant_years": { - "start_year": 1968, + "start_year": 1969, "end_year": 2024 }, "base_year_min": 1980, @@ -7649,7 +7695,7 @@ "end_year": 2016 }, "constant_years": { - "start_year": 1968, + "start_year": 1969, "end_year": 2024 }, "base_year_min": 2023, @@ -7663,7 +7709,7 @@ "end_year": 2024 }, "constant_years": { - "start_year": 1968, + "start_year": 1969, "end_year": 2024 }, "base_year_min": 1980, @@ -7677,7 +7723,7 @@ "end_year": 2024 }, "constant_years": { - "start_year": 1968, + "start_year": 1969, "end_year": 2024 }, "base_year_min": 1991, @@ -7691,7 +7737,7 @@ "end_year": 2024 }, "constant_years": { - "start_year": 1968, + "start_year": 1969, "end_year": 2024 }, "base_year_min": 1980, @@ -7701,11 +7747,11 @@ "code": "USD", "noun": "US dollars", "current_years": { - "start_year": 1968, + "start_year": 1969, "end_year": 2024 }, "constant_years": { - "start_year": 1968, + "start_year": 1969, "end_year": 2024 }, "base_year_min": 1960, @@ -7719,7 +7765,7 @@ "end_year": 2024 }, "constant_years": { - "start_year": 1968, + "start_year": 1969, "end_year": 2024 }, "base_year_min": 1980, @@ -7733,7 +7779,7 @@ "end_year": 2024 }, "constant_years": { - "start_year": 1968, + "start_year": 1969, "end_year": 2024 }, "base_year_min": 1992, @@ -7747,7 +7793,7 @@ "end_year": 2024 }, "constant_years": { - "start_year": 1968, + "start_year": 1969, "end_year": 2024 }, "base_year_min": 2017, @@ -7761,7 +7807,7 @@ "end_year": 2024 }, "constant_years": { - "start_year": 1968, + "start_year": 1969, "end_year": 2024 }, "base_year_min": 1980, @@ -7775,7 +7821,7 @@ "end_year": 2024 }, "constant_years": { - "start_year": 1968, + "start_year": 1969, "end_year": 2024 }, "base_year_min": 1980, @@ -7789,7 +7835,7 @@ "end_year": 2024 }, "constant_years": { - "start_year": 1968, + "start_year": 1969, "end_year": 2024 }, "base_year_min": 1980, @@ -7803,7 +7849,7 @@ "end_year": 2024 }, "constant_years": { - "start_year": 1968, + "start_year": 1969, "end_year": 2024 }, "base_year_min": 1980, @@ -7817,7 +7863,7 @@ "end_year": 2024 }, "constant_years": { - "start_year": 1968, + "start_year": 1969, "end_year": 2024 }, "base_year_min": 1980, @@ -7831,7 +7877,7 @@ "end_year": 2024 }, "constant_years": { - "start_year": 1968, + "start_year": 1969, "end_year": 2024 }, "base_year_min": 1980, @@ -7845,7 +7891,7 @@ "end_year": 2024 }, "constant_years": { - "start_year": 1968, + "start_year": 1969, "end_year": 2024 }, "base_year_min": 2014, @@ -7859,7 +7905,7 @@ "end_year": 2024 }, "constant_years": { - "start_year": 1968, + "start_year": 1969, "end_year": 2024 }, "base_year_min": 1980, @@ -7873,7 +7919,7 @@ "end_year": 2024 }, "constant_years": { - "start_year": 1968, + "start_year": 1969, "end_year": 2024 }, "base_year_min": 1980, @@ -7887,11 +7933,11 @@ } } ], - "rendered_sentence": "Gross disbursements to 133 recipients from 38 providers for official development assistance, 1968 to 2024. Current US dollars · OECD DAC2a. You asked for Chile, Colombia, Costa Rica, and Mexico. The data holds no values for them.", + "rendered_sentence": "Net disbursements to 133 recipients from 38 providers for official development assistance, 1969 to 2024. Current US dollars · OECD DAC2a. You asked for Chile, Colombia, Costa Rica, and Mexico. The data holds no values for them.", "sentence_plan": [ { "kind": "slot", - "text": "Gross disbursements", + "text": "Net disbursements", "axis": "what", "segment": "heading", "entity_refs": [], @@ -8180,7 +8226,7 @@ }, { "kind": "slot", - "text": "1968 to 2024", + "text": "1969 to 2024", "axis": "when", "segment": "heading", "binding_ref": "when:", @@ -8263,21 +8309,21 @@ { "request": { "method": "GET", - "origin_path": "/api/datasets/spec_dee41c61dd0335d145f4c65e451817cb/cv_c29903dc477674b87b3e5e0097f7a828/files/sha256:3aae1d10e41e6cd40e33a2a65757641a4c74244ffcdd47974df72ab6dfa60779" + "origin_path": "/api/datasets/spec_3fad1ff594c6f4c24bcb28a0ec746302/cv_698f200473c286d9cba969401a266bd4/files/sha256:6548eb176cdafbf4ca1624348dee06b20802151d8a1f4359024d526aa555ec93" }, "response": { "status": 302, "headers": { "content-type": "text/html", - "location": "https://storage.googleapis.com/dev-fin-observatory-datasets-working/sha256%3A3aae1d10e41e6cd40e33a2a65757641a4c74244ffcdd47974df72ab6dfa60779?X-Goog-Signature=redacted", - "x-dfo-trace-id": "e8ac5b39c0c94474b741fefd66f9ef86" + "location": "https://storage.googleapis.com/dev-fin-observatory-datasets-working/sha256%3A6548eb176cdafbf4ca1624348dee06b20802151d8a1f4359024d526aa555ec93?X-Goog-Signature=redacted", + "x-dfo-trace-id": "78785eecc73149de91b25b3d2aad4314" } } }, { "request": { "method": "GET", - "url": "https://storage.googleapis.com/dev-fin-observatory-datasets-working/sha256%3A3aae1d10e41e6cd40e33a2a65757641a4c74244ffcdd47974df72ab6dfa60779?X-Goog-Signature=redacted" + "url": "https://storage.googleapis.com/dev-fin-observatory-datasets-working/sha256%3A6548eb176cdafbf4ca1624348dee06b20802151d8a1f4359024d526aa555ec93?X-Goog-Signature=redacted" }, "response": { "status": 200, @@ -8291,13 +8337,13 @@ "expect": [ { "operation": { - "operation_id": "op_a50d083649ee12fbede446887afa771e76446419365e74ade9d5239d128e6846", + "operation_id": "op_cea62e9a880b015903a11a6fdc9e5b7bd0707e9a769df456b2a134ce776400f5", "status": "running" } }, { "dataset": { - "rows": 110887, + "rows": 110783, "columns": [ "time_period", "financingProvider_label", @@ -8324,22 +8370,22 @@ "members": [ { "parts": [], - "spec_id": "spec_dee41c61dd0335d145f4c65e451817cb", - "content_version": "cv_c29903dc477674b87b3e5e0097f7a828", - "sentence": "Gross disbursements to 133 recipients from 38 providers for official development assistance, 1968 to 2024. Current US dollars · OECD DAC2a." + "spec_id": "spec_3fad1ff594c6f4c24bcb28a0ec746302", + "content_version": "cv_698f200473c286d9cba969401a266bd4", + "sentence": "Net disbursements to 133 recipients from 38 providers for official development assistance, 1969 to 2024. Current US dollars · OECD DAC2a." } ], "missing": [], "long_builds": [ { - "operation_id": "op_a50d083649ee12fbede446887afa771e76446419365e74ade9d5239d128e6846", + "operation_id": "op_cea62e9a880b015903a11a6fdc9e5b7bd0707e9a769df456b2a134ce776400f5", "poll_waits": [ 1.5, 1.5, 1.5, 1.5, - 1.832, - 2.348 + 1.798, + 2.281 ], "resubmissions": 0 } diff --git a/python/client-contract/src/dfo_client_contract/scenarios/operation-resume.parquet b/python/client-contract/src/dfo_client_contract/scenarios/operation-resume.parquet index c952971..3453bfd 100644 Binary files a/python/client-contract/src/dfo_client_contract/scenarios/operation-resume.parquet and b/python/client-contract/src/dfo_client_contract/scenarios/operation-resume.parquet differ diff --git a/python/client-contract/src/dfo_client_contract/scenarios/resubmit-candidates-sibling.json b/python/client-contract/src/dfo_client_contract/scenarios/resubmit-candidates-sibling.json index 80e7e42..050e2f0 100644 --- a/python/client-contract/src/dfo_client_contract/scenarios/resubmit-candidates-sibling.json +++ b/python/client-contract/src/dfo_client_contract/scenarios/resubmit-candidates-sibling.json @@ -5,8 +5,8 @@ "origin": { "kind": "recorded", "base_url": "https://dfo-dev-apis-zms5lj4zhq-nn.a.run.app/api", - "dfo_commit": "d80df9f5fd598b7345255470932d202ee5d49942", - "recorded_at": "2026-10-26T09:23:39Z" + "dfo_commit": "ccb6617922c839ce3cd5615a3bbb65c70bfe1bde", + "recorded_at": "2026-11-01T07:39:38Z" }, "call": [ { @@ -36,7 +36,7 @@ "status": 200, "headers": { "content-type": "application/json", - "x-dfo-trace-id": "3d449a99fb6941a8a036d4fd4ccd2555" + "x-dfo-trace-id": "a206cc3a2b984f4d86c59e087aeb5cb1" }, "json": { "schema_version": 1, @@ -47,23 +47,24 @@ "extract_skipped": false }, "diagnostics": { - "engine_build": "d80df9f5fd598b7345255470932d202ee5d49942", - "trace_id": "3d449a99fb6941a8a036d4fd4ccd2555", + "engine_build": "ccb6617922c839ce3cd5615a3bbb65c70bfe1bde", + "trace_id": "a206cc3a2b984f4d86c59e087aeb5cb1", "warnings": [], "timing_ms": { - "total": 6074, + "total": 9180, "by_step": { "coverage": 0, - "extract": 1151, + "extract": 1234, + "exclusion_read": 639, "cache_lookup": 0 } }, "llm_usage": { - "input_tokens": 2241, - "output_tokens": 197, - "cached_tokens": 843, - "jev_input_tokens": 26478, - "jev_output_tokens": 5727 + "input_tokens": 2804, + "output_tokens": 206, + "cached_tokens": 0, + "jev_input_tokens": 28366, + "jev_output_tokens": 6095 }, "timed_out": false }, @@ -73,31 +74,31 @@ "variable_text": "mortality", "warnings": [], "timing_ms": { - "total": 3027, + "total": 6048, "by_step": { "recall": 1, "phase_resolve_places": 0, "phase_check_entities": 0, - "shape_arcs": 4, - "shape_probe": 99, + "shape_arcs": 2, + "shape_probe": 105, "shape_groups": 6, "shape_labels": 1, - "shape_admission": 1, + "shape_admission": 2, "phase_derive_shapes": 0, - "shape": 206, + "shape": 232, "phase_prune_and_rank": 0, - "bind": 135, - "phase_bind": 13, + "bind": 124, + "phase_bind": 14, "phase_settle": 1, "phase_place_bindings": 32, "phase_facet_requests": 0, - "materialise": 108, + "materialise": 88, "phase_materialise": 26, - "answer": 749, - "phase_outcome": 1756 + "answer": 197, + "phase_outcome": 5333 } }, - "rendered_sentence": "2 readings. Kenya's deaths rate per capita. World Development Indicators · 2013 to 2022. Kenya's number of deaths. Kenya Census · 2018 to 2022.", + "rendered_sentence": "2 readings. Kenya's deaths rate per 1,000 people. World Development Indicators · 2013 to 2022. Kenya's number of deaths. Kenya Census · 2018 to 2022.", "sentence_plan": [ { "kind": "text", @@ -150,7 +151,7 @@ }, { "kind": "text", - "text": "per capita", + "text": "per 1,000 people", "segment": "heading", "entity_refs": [], "states": [] @@ -629,7 +630,7 @@ "source": "observed" } ], - "rendered_sentence": "Kenya's deaths rate per capita, 2013 to 2022. World Development Indicators.", + "rendered_sentence": "Kenya's deaths rate per 1,000 people, 2013 to 2022. World Development Indicators.", "sentence_plan": [ { "kind": "slot", @@ -674,11 +675,14 @@ }, { "kind": "slot", - "text": "per capita", + "text": "per 1,000 people", "axis": "unit", "segment": "heading", + "binding_ref": "unit:", "entity_refs": [], - "states": [] + "states": [ + "unit:" + ] }, { "kind": "slot", @@ -816,7 +820,7 @@ "start_year": 2013, "end_year": 2022 }, - "capability_version": "cap_765c9d2a0c7529b9", + "capability_version": "cap_4913302d7a6b6435", "default_reading": { "applied": true, "removed_stat_vars": [] @@ -825,7 +829,8 @@ "confidence": "high", "available_at_place": true, "measure_label_axes": [], - "measure_axis_values": [] + "measure_axis_values": [], + "published_tables": "World Development Indicators" } }, { @@ -998,7 +1003,7 @@ "label": "data source" } ], - "member_count": 2978, + "member_count": 2979, "refine_supported": true, "data_commons": [ { @@ -2368,7 +2373,7 @@ "start_year": 2013, "end_year": 2022 }, - "capability_version": "cap_765c9d2a0c7529b9", + "capability_version": "cap_4913302d7a6b6435", "default_reading": { "applied": true, "removed_stat_vars": [] @@ -2378,7 +2383,8 @@ "basis": "structural", "available_at_place": true, "measure_label_axes": [], - "measure_axis_values": [] + "measure_axis_values": [], + "published_tables": "Kenya Census" } } ], @@ -2406,29 +2412,29 @@ } ], "timing_ms": { - "total": 4844, + "total": 7934, "by_step": { - "recall": 440, + "recall": 871, "phase_resolve_places": 0, "phase_check_entities": 0, - "shape_arcs": 114, + "shape_arcs": 140, "shape_probe_coverage": 1, - "shape_probe": 110, - "shape_groups": 48, + "shape_probe": 1522, + "shape_groups": 85, "shape_labels": 1, - "shape_admission": 0, + "shape_admission": 1, "phase_derive_shapes": 0, - "shape": 430, + "shape": 1868, "phase_prune_and_rank": 0, - "bind": 142, - "phase_bind": 32, - "phase_settle": 18, - "phase_place_bindings": 3159, + "bind": 1021, + "phase_bind": 40, + "phase_settle": 66, + "phase_place_bindings": 3232, "phase_facet_requests": 0, - "materialise": 156, - "phase_materialise": 145, - "answer": 88, - "phase_outcome": 234 + "materialise": 213, + "phase_materialise": 142, + "answer": 243, + "phase_outcome": 238 } }, "rendered_sentence": "2 readings. Kenya's annual amount of emissions: carbon dioxide. Air and GHG emissions · 2013 to 2020. Kenya's annual amount of emissions: carbon dioxide. Air and GHG emissions · 2013 to 2020.", @@ -3307,7 +3313,7 @@ "start_year": 2013, "end_year": 2022 }, - "capability_version": "cap_765c9d2a0c7529b9", + "capability_version": "cap_4913302d7a6b6435", "default_reading": { "applied": true, "removed_stat_vars": [] @@ -3317,6 +3323,7 @@ "available_at_place": true, "measure_label_axes": [], "measure_axis_values": [], + "published_tables": "Air and GHG emissions", "open_axis_facts": [ { "property": "emittedThing", @@ -3806,7 +3813,7 @@ "start_year": 2013, "end_year": 2022 }, - "capability_version": "cap_765c9d2a0c7529b9", + "capability_version": "cap_4913302d7a6b6435", "default_reading": { "applied": true, "removed_stat_vars": [] @@ -3817,6 +3824,7 @@ "available_at_place": true, "measure_label_axes": [], "measure_axis_values": [], + "published_tables": "Air and GHG emissions", "open_axis_facts": [ { "property": "emittedThing", @@ -3849,7 +3857,7 @@ } } ], - "rendered_sentence": "Mortality has 2 readings. Kenya's deaths rate per capita. World Development Indicators · 2013 to 2022. Kenya's number of deaths. Kenya Census · 2018 to 2022. Emissions has 2 readings. Kenya's annual amount of emissions: carbon dioxide. Air and GHG emissions · 2013 to 2020. Kenya's annual amount of emissions: carbon dioxide. Air and GHG emissions · 2013 to 2020.", + "rendered_sentence": "Mortality has 2 readings. Kenya's deaths rate per 1,000 people. World Development Indicators · 2013 to 2022. Kenya's number of deaths. Kenya Census · 2018 to 2022. Emissions has 2 readings. Kenya's annual amount of emissions: carbon dioxide. Air and GHG emissions · 2013 to 2020. Kenya's annual amount of emissions: carbon dioxide. Air and GHG emissions · 2013 to 2020.", "sentence_plan": [ { "kind": "slot", @@ -3918,7 +3926,7 @@ }, { "kind": "text", - "text": "per capita", + "text": "per 1,000 people", "segment": "heading", "entity_refs": [], "states": [], @@ -4393,7 +4401,7 @@ "status": 200, "headers": { "content-type": "application/json", - "x-dfo-trace-id": "3b1149548ca74cb588cb0a6041e4fb22" + "x-dfo-trace-id": "ead2d3cd86864ecca5c476fce9267914" }, "json": { "schema_version": 1, @@ -4402,11 +4410,11 @@ "extract_skipped": true }, "diagnostics": { - "engine_build": "d80df9f5fd598b7345255470932d202ee5d49942", - "trace_id": "3b1149548ca74cb588cb0a6041e4fb22", + "engine_build": "ccb6617922c839ce3cd5615a3bbb65c70bfe1bde", + "trace_id": "ead2d3cd86864ecca5c476fce9267914", "warnings": [], "timing_ms": { - "total": 698, + "total": 744, "by_step": { "coverage": 0 } @@ -4419,19 +4427,39 @@ "variable_text": "mortality", "warnings": [], "timing_ms": { - "total": 335, + "total": 563, "by_step": { "validate": 0, + "phase_validate": 0, "walk": 0, "reread_arcs": 0, + "phase_reread_arcs": 0, "detect_edits": 0, + "phase_detect_edits": 0, "resolve_survivors": 0, - "shape": 178, + "phase_resolve_survivors": 0, + "shape": 284, + "phase_build_shape": 0, "bind": 0, + "phase_build_bindings": 0, "where_places": 1, - "materialise": 153, + "phase_where_places": 0, + "materialise": 184, + "phase_materialise": 0, + "ground_related": 1, + "ground_units": 0, + "ground_facets": 0, + "ground_convert": 0, "answer": 2, - "options": 1 + "ground_gates": 0, + "phase_ground_build": 2, + "finalize_preview": 0, + "options": 0, + "finalize_related": 88, + "finalize_wholes": 0, + "finalize_relaunch": 1, + "phase_finalize": 0, + "served_entry": 0 } }, "entity_refs": [], @@ -4766,7 +4794,7 @@ "source": "observed" } ], - "rendered_sentence": "Kenya's deaths rate per capita, 2013 to 2022. World Development Indicators.", + "rendered_sentence": "Kenya's deaths rate per 1,000 people, 2013 to 2022. World Development Indicators.", "sentence_plan": [ { "kind": "slot", @@ -4810,11 +4838,14 @@ }, { "kind": "slot", - "text": "per capita", + "text": "per 1,000 people", "axis": "unit", "segment": "heading", + "binding_ref": "unit:", "entity_refs": [], - "states": [] + "states": [ + "unit:" + ] }, { "kind": "slot", @@ -4950,12 +4981,13 @@ "start_year": 2013, "end_year": 2022 }, - "capability_version": "cap_765c9d2a0c7529b9" + "capability_version": "cap_4913302d7a6b6435" }, "confidence": "high", "available_at_place": true, "measure_label_axes": [], "measure_axis_values": [], + "published_tables": "World Development Indicators", "related_group": { "ref": "dc/g/MortalityEvent", "label": "Mortality Event" @@ -5012,19 +5044,38 @@ } ], "timing_ms": { - "total": 1059, + "total": 1128, "by_step": { "validate": 0, - "walk": 769, - "reread_arcs": 1, + "phase_validate": 0, + "walk": 829, + "reread_arcs": 2, + "phase_reread_arcs": 0, "detect_edits": 0, + "phase_detect_edits": 0, "resolve_survivors": 0, - "shape": 12, - "bind": 1, - "where_places": 0, - "materialise": 190, - "answer": 9, - "options": 77 + "phase_resolve_survivors": 0, + "shape": 6, + "phase_build_shape": 0, + "bind": 0, + "phase_build_bindings": 0, + "where_places": 1, + "phase_where_places": 0, + "materialise": 196, + "phase_materialise": 0, + "ground_related": 1, + "ground_units": 0, + "ground_facets": 0, + "ground_convert": 0, + "answer": 7, + "ground_gates": 0, + "phase_ground_build": 4, + "finalize_preview": 0, + "options": 80, + "finalize_related": 0, + "finalize_wholes": 1, + "finalize_relaunch": 0, + "phase_finalize": 1 } }, "rendered_sentence": "2 readings. Kenya's annual amount of emissions: carbon dioxide. Air and GHG emissions · 2013 to 2020. Kenya's annual amount of emissions: carbon dioxide. Air and GHG emissions · 2013 to 2020.", @@ -5865,12 +5916,13 @@ "start_year": 2013, "end_year": 2022 }, - "capability_version": "cap_765c9d2a0c7529b9" + "capability_version": "cap_4913302d7a6b6435" }, "confidence": "high", "available_at_place": true, "measure_label_axes": [], "measure_axis_values": [], + "published_tables": "Air and GHG emissions", "open_axis_facts": [ { "property": "emittedThing", @@ -6360,12 +6412,13 @@ "start_year": 2013, "end_year": 2022 }, - "capability_version": "cap_765c9d2a0c7529b9" + "capability_version": "cap_4913302d7a6b6435" }, "confidence": "high", "available_at_place": true, "measure_label_axes": [], "measure_axis_values": [], + "published_tables": "Air and GHG emissions", "open_axis_facts": [ { "property": "emittedThing", @@ -6398,7 +6451,7 @@ } } ], - "rendered_sentence": "Answered 1 of 2 parts. Kenya's deaths rate per capita, 2013 to 2022. World Development Indicators. Emissions has 2 readings. Kenya's annual amount of emissions: carbon dioxide. Air and GHG emissions · 2013 to 2020. Kenya's annual amount of emissions: carbon dioxide. Air and GHG emissions · 2013 to 2020.", + "rendered_sentence": "Answered 1 of 2 parts. Kenya's deaths rate per 1,000 people, 2013 to 2022. World Development Indicators. Emissions has 2 readings. Kenya's annual amount of emissions: carbon dioxide. Air and GHG emissions · 2013 to 2020. Kenya's annual amount of emissions: carbon dioxide. Air and GHG emissions · 2013 to 2020.", "sentence_plan": [ { "kind": "text", @@ -6461,11 +6514,14 @@ }, { "kind": "slot", - "text": "per capita", + "text": "per 1,000 people", "axis": "unit", "segment": "heading", + "binding_ref": "unit:", "entity_refs": [], - "states": [], + "states": [ + "unit:" + ], "part_index": 0 }, { @@ -6745,7 +6801,7 @@ "answer": { "kind": "resolution", "status": "candidates", - "sentence": "Mortality has 2 readings. Kenya's deaths rate per capita. World Development Indicators · 2013 to 2022. Kenya's number of deaths. Kenya Census · 2018 to 2022. Emissions has 2 readings. Kenya's annual amount of emissions: carbon dioxide. Air and GHG emissions · 2013 to 2020. Kenya's annual amount of emissions: carbon dioxide. Air and GHG emissions · 2013 to 2020.", + "sentence": "Mortality has 2 readings. Kenya's deaths rate per 1,000 people. World Development Indicators · 2013 to 2022. Kenya's number of deaths. Kenya Census · 2018 to 2022. Emissions has 2 readings. Kenya's annual amount of emissions: carbon dioxide. Air and GHG emissions · 2013 to 2020. Kenya's annual amount of emissions: carbon dioxide. Air and GHG emissions · 2013 to 2020.", "complete": false, "specs": [], "gaps": [ @@ -6766,7 +6822,7 @@ "answer": { "kind": "resolution", "status": "mixed", - "sentence": "Answered 1 of 2 parts. Kenya's deaths rate per capita, 2013 to 2022. World Development Indicators. Emissions has 2 readings. Kenya's annual amount of emissions: carbon dioxide. Air and GHG emissions · 2013 to 2020. Kenya's annual amount of emissions: carbon dioxide. Air and GHG emissions · 2013 to 2020.", + "sentence": "Answered 1 of 2 parts. Kenya's deaths rate per 1,000 people, 2013 to 2022. World Development Indicators. Emissions has 2 readings. Kenya's annual amount of emissions: carbon dioxide. Air and GHG emissions · 2013 to 2020. Kenya's annual amount of emissions: carbon dioxide. Air and GHG emissions · 2013 to 2020.", "complete": false, "specs": [ "spec_10bf62f9687154286b463d206f03a086" diff --git a/python/client-contract/src/dfo_client_contract/scenarios/resubmit-placeholder-without-restatement.json b/python/client-contract/src/dfo_client_contract/scenarios/resubmit-placeholder-without-restatement.json index 0a15890..f94e628 100644 --- a/python/client-contract/src/dfo_client_contract/scenarios/resubmit-placeholder-without-restatement.json +++ b/python/client-contract/src/dfo_client_contract/scenarios/resubmit-placeholder-without-restatement.json @@ -5,8 +5,8 @@ "origin": { "kind": "recorded", "base_url": "https://dfo-dev-apis-zms5lj4zhq-nn.a.run.app/api", - "dfo_commit": "d80df9f5fd598b7345255470932d202ee5d49942", - "recorded_at": "2026-10-26T09:23:59Z" + "dfo_commit": "ccb6617922c839ce3cd5615a3bbb65c70bfe1bde", + "recorded_at": "2026-11-01T07:40:01Z" }, "call": [ { @@ -36,7 +36,7 @@ "status": 200, "headers": { "content-type": "application/json", - "x-dfo-trace-id": "e46fa17bc1484e228c45bc2637a31869" + "x-dfo-trace-id": "1fc9c172c2444c3fa51175c7f8abdeec" }, "json": { "schema_version": 1, @@ -47,23 +47,24 @@ "extract_skipped": false }, "diagnostics": { - "engine_build": "d80df9f5fd598b7345255470932d202ee5d49942", - "trace_id": "e46fa17bc1484e228c45bc2637a31869", + "engine_build": "ccb6617922c839ce3cd5615a3bbb65c70bfe1bde", + "trace_id": "1fc9c172c2444c3fa51175c7f8abdeec", "warnings": [], "timing_ms": { - "total": 3952, + "total": 7769, "by_step": { "coverage": 0, - "extract": 1129, + "extract": 1200, + "exclusion_read": 661, "cache_lookup": 0 } }, "llm_usage": { - "input_tokens": 2241, - "output_tokens": 196, - "cached_tokens": 843, - "jev_input_tokens": 20185, - "jev_output_tokens": 4309 + "input_tokens": 2804, + "output_tokens": 205, + "cached_tokens": 0, + "jev_input_tokens": 22045, + "jev_output_tokens": 4677 }, "timed_out": false }, @@ -73,31 +74,31 @@ "variable_text": "mortality", "warnings": [], "timing_ms": { - "total": 2818, + "total": 6428, "by_step": { - "recall": 1, - "phase_resolve_places": 1, + "recall": 222, + "phase_resolve_places": 0, "phase_check_entities": 0, - "shape_arcs": 3, - "shape_probe": 98, - "shape_groups": 6, + "shape_arcs": 7, + "shape_probe": 204, + "shape_groups": 22, "shape_labels": 1, - "shape_admission": 1, + "shape_admission": 2, "phase_derive_shapes": 0, - "shape": 1214, + "shape": 354, "phase_prune_and_rank": 0, - "bind": 157, - "phase_bind": 24, + "bind": 159, + "phase_bind": 22, "phase_settle": 1, - "phase_place_bindings": 33, + "phase_place_bindings": 247, "phase_facet_requests": 0, - "materialise": 22, + "materialise": 5, "phase_materialise": 25, - "answer": 33, - "phase_outcome": 1307 + "answer": 32, + "phase_outcome": 5361 } }, - "rendered_sentence": "2 readings. Kenya's deaths rate per capita. World Development Indicators · 2013 to 2022. Kenya's number of deaths. Kenya Census · 2018 to 2022.", + "rendered_sentence": "2 readings. Kenya's deaths rate per 1,000 people. World Development Indicators · 2013 to 2022. Kenya's number of deaths. Kenya Census · 2018 to 2022.", "sentence_plan": [ { "kind": "text", @@ -150,7 +151,7 @@ }, { "kind": "text", - "text": "per capita", + "text": "per 1,000 people", "segment": "heading", "entity_refs": [], "states": [] @@ -629,7 +630,7 @@ "source": "observed" } ], - "rendered_sentence": "Kenya's deaths rate per capita, 2013 to 2022. World Development Indicators.", + "rendered_sentence": "Kenya's deaths rate per 1,000 people, 2013 to 2022. World Development Indicators.", "sentence_plan": [ { "kind": "slot", @@ -674,11 +675,14 @@ }, { "kind": "slot", - "text": "per capita", + "text": "per 1,000 people", "axis": "unit", "segment": "heading", + "binding_ref": "unit:", "entity_refs": [], - "states": [] + "states": [ + "unit:" + ] }, { "kind": "slot", @@ -816,7 +820,7 @@ "start_year": 2013, "end_year": 2022 }, - "capability_version": "cap_765c9d2a0c7529b9", + "capability_version": "cap_4913302d7a6b6435", "default_reading": { "applied": true, "removed_stat_vars": [] @@ -825,7 +829,8 @@ "confidence": "high", "available_at_place": true, "measure_label_axes": [], - "measure_axis_values": [] + "measure_axis_values": [], + "published_tables": "World Development Indicators" } }, { @@ -998,7 +1003,7 @@ "label": "data source" } ], - "member_count": 2978, + "member_count": 2979, "refine_supported": true, "data_commons": [ { @@ -2368,7 +2373,7 @@ "start_year": 2013, "end_year": 2022 }, - "capability_version": "cap_765c9d2a0c7529b9", + "capability_version": "cap_4913302d7a6b6435", "default_reading": { "applied": true, "removed_stat_vars": [] @@ -2378,7 +2383,8 @@ "basis": "structural", "available_at_place": true, "measure_label_axes": [], - "measure_axis_values": [] + "measure_axis_values": [], + "published_tables": "Kenya Census" } } ], @@ -2393,21 +2399,21 @@ "variable_text": "savings", "warnings": [], "timing_ms": { - "total": 1496, + "total": 734, "by_step": { - "recall": 235, - "phase_resolve_places": 0, + "recall": 266, + "phase_resolve_places": 1, "phase_check_entities": 0, - "shape_arcs": 1, + "shape_arcs": 2, "shape_probe_coverage": 1, - "shape_probe": 96, - "shape_groups": 908, + "shape_probe": 122, + "shape_groups": 85, "shape_labels": 1, - "shape_admission": 6, - "phase_derive_shapes": 1, - "shape": 1119, + "shape_admission": 1, + "phase_derive_shapes": 0, + "shape": 343, "phase_prune_and_rank": 0, - "bind": 137, + "bind": 120, "phase_bind": 4 } }, @@ -2439,7 +2445,7 @@ } } ], - "rendered_sentence": "Mortality has 2 readings. Kenya's deaths rate per capita. World Development Indicators · 2013 to 2022. Kenya's number of deaths. Kenya Census · 2018 to 2022. No match for savings. Try a different wording or a related indicator.", + "rendered_sentence": "Mortality has 2 readings. Kenya's deaths rate per 1,000 people. World Development Indicators · 2013 to 2022. Kenya's number of deaths. Kenya Census · 2018 to 2022. No match for savings. Try a different wording or a related indicator.", "sentence_plan": [ { "kind": "slot", @@ -2508,7 +2514,7 @@ }, { "kind": "text", - "text": "per capita", + "text": "per 1,000 people", "segment": "heading", "entity_refs": [], "states": [], @@ -2745,7 +2751,7 @@ "status": 200, "headers": { "content-type": "application/json", - "x-dfo-trace-id": "cf171b52e7e34625bb6dba046e930821" + "x-dfo-trace-id": "c68a8610bb324cd5835c9b760233c346" }, "json": { "schema_version": 1, @@ -2754,11 +2760,11 @@ "extract_skipped": true }, "diagnostics": { - "engine_build": "d80df9f5fd598b7345255470932d202ee5d49942", - "trace_id": "cf171b52e7e34625bb6dba046e930821", + "engine_build": "ccb6617922c839ce3cd5615a3bbb65c70bfe1bde", + "trace_id": "c68a8610bb324cd5835c9b760233c346", "warnings": [], "timing_ms": { - "total": 351, + "total": 375, "by_step": { "coverage": 0 } @@ -2771,19 +2777,39 @@ "variable_text": "mortality", "warnings": [], "timing_ms": { - "total": 283, + "total": 307, "by_step": { - "validate": 0, + "validate": 1, + "phase_validate": 0, "walk": 0, "reread_arcs": 0, + "phase_reread_arcs": 0, "detect_edits": 0, + "phase_detect_edits": 0, "resolve_survivors": 0, - "shape": 172, - "bind": 1, + "phase_resolve_survivors": 0, + "shape": 167, + "phase_build_shape": 0, + "bind": 0, + "phase_build_bindings": 0, "where_places": 0, - "materialise": 108, - "answer": 2, - "options": 0 + "phase_where_places": 0, + "materialise": 133, + "phase_materialise": 0, + "ground_related": 1, + "ground_units": 0, + "ground_facets": 0, + "ground_convert": 0, + "answer": 1, + "ground_gates": 0, + "phase_ground_build": 2, + "finalize_preview": 0, + "options": 1, + "finalize_related": 1, + "finalize_wholes": 0, + "finalize_relaunch": 0, + "phase_finalize": 0, + "served_entry": 0 } }, "entity_refs": [], @@ -3118,7 +3144,7 @@ "source": "observed" } ], - "rendered_sentence": "Kenya's deaths rate per capita, 2013 to 2022. World Development Indicators.", + "rendered_sentence": "Kenya's deaths rate per 1,000 people, 2013 to 2022. World Development Indicators.", "sentence_plan": [ { "kind": "slot", @@ -3162,11 +3188,14 @@ }, { "kind": "slot", - "text": "per capita", + "text": "per 1,000 people", "axis": "unit", "segment": "heading", + "binding_ref": "unit:", "entity_refs": [], - "states": [] + "states": [ + "unit:" + ] }, { "kind": "slot", @@ -3302,12 +3331,13 @@ "start_year": 2013, "end_year": 2022 }, - "capability_version": "cap_765c9d2a0c7529b9" + "capability_version": "cap_4913302d7a6b6435" }, "confidence": "high", "available_at_place": true, "measure_label_axes": [], "measure_axis_values": [], + "published_tables": "World Development Indicators", "related_group": { "ref": "dc/g/MortalityEvent", "label": "Mortality Event" @@ -3387,7 +3417,7 @@ } } ], - "rendered_sentence": "Answered 1 of 2 parts. Kenya's deaths rate per capita, 2013 to 2022. World Development Indicators. No match for savings. Try a different wording or a related indicator.", + "rendered_sentence": "Answered 1 of 2 parts. Kenya's deaths rate per 1,000 people, 2013 to 2022. World Development Indicators. No match for savings. Try a different wording or a related indicator.", "sentence_plan": [ { "kind": "text", @@ -3450,11 +3480,14 @@ }, { "kind": "slot", - "text": "per capita", + "text": "per 1,000 people", "axis": "unit", "segment": "heading", + "binding_ref": "unit:", "entity_refs": [], - "states": [], + "states": [ + "unit:" + ], "part_index": 0 }, { @@ -3566,7 +3599,7 @@ "answer": { "kind": "resolution", "status": "mixed", - "sentence": "Mortality has 2 readings. Kenya's deaths rate per capita. World Development Indicators · 2013 to 2022. Kenya's number of deaths. Kenya Census · 2018 to 2022. No match for savings. Try a different wording or a related indicator.", + "sentence": "Mortality has 2 readings. Kenya's deaths rate per 1,000 people. World Development Indicators · 2013 to 2022. Kenya's number of deaths. Kenya Census · 2018 to 2022. No match for savings. Try a different wording or a related indicator.", "complete": false, "specs": [], "gaps": [ @@ -3587,7 +3620,7 @@ "answer": { "kind": "resolution", "status": "mixed", - "sentence": "Answered 1 of 2 parts. Kenya's deaths rate per capita, 2013 to 2022. World Development Indicators. No match for savings. Try a different wording or a related indicator.", + "sentence": "Answered 1 of 2 parts. Kenya's deaths rate per 1,000 people, 2013 to 2022. World Development Indicators. No match for savings. Try a different wording or a related indicator.", "complete": false, "specs": [ "spec_10bf62f9687154286b463d206f03a086" diff --git a/python/client-contract/src/dfo_client_contract/scenarios/search-body-not-an-object.json b/python/client-contract/src/dfo_client_contract/scenarios/search-body-not-an-object.json index 9e2a4fb..c9743ac 100644 --- a/python/client-contract/src/dfo_client_contract/scenarios/search-body-not-an-object.json +++ b/python/client-contract/src/dfo_client_contract/scenarios/search-body-not-an-object.json @@ -30,7 +30,7 @@ "status": 200, "headers": { "content-type": "application/json", - "x-dfo-trace-id": "01cf4a9623c449759f24d249f8783de1" + "x-dfo-trace-id": "1d05424fb2784068acf168d73a67c0d0" }, "json": [ { @@ -42,21 +42,22 @@ "extract_skipped": false }, "diagnostics": { - "engine_build": "d80df9f5fd598b7345255470932d202ee5d49942", - "trace_id": "01cf4a9623c449759f24d249f8783de1", + "engine_build": "ccb6617922c839ce3cd5615a3bbb65c70bfe1bde", + "trace_id": "1d05424fb2784068acf168d73a67c0d0", "warnings": [], "timing_ms": { - "total": 1162, + "total": 1946, "by_step": { "coverage": 0, - "extract": 1040, + "extract": 1070, + "exclusion_read": 606, "cache_lookup": 0 } }, "llm_usage": { - "input_tokens": 2233, - "output_tokens": 193, - "cached_tokens": 841 + "input_tokens": 2788, + "output_tokens": 202, + "cached_tokens": 0 }, "timed_out": false }, @@ -66,10 +67,10 @@ "variable_text": "ODA disbursements", "warnings": [], "timing_ms": { - "total": 117, + "total": 871, "by_step": { - "recall": 117, - "phase_resolve_places": 0, + "recall": 870, + "phase_resolve_places": 1, "phase_check_entities": 0 } }, @@ -119,7 +120,9 @@ "entity_refs": [ { "text": "Germany", - "refs": [] + "refs": [ + "country/DEU" + ] }, { "text": "Congo", @@ -263,7 +266,7 @@ "error": { "class": "ContractError", "code": "contract_violation", - "trace_id": "01cf4a9623c449759f24d249f8783de1" + "trace_id": "1d05424fb2784068acf168d73a67c0d0" } } ] diff --git a/python/client-contract/src/dfo_client_contract/scenarios/search-place-ambiguous-twice.json b/python/client-contract/src/dfo_client_contract/scenarios/search-place-ambiguous-twice.json index 1365929..6df34c6 100644 --- a/python/client-contract/src/dfo_client_contract/scenarios/search-place-ambiguous-twice.json +++ b/python/client-contract/src/dfo_client_contract/scenarios/search-place-ambiguous-twice.json @@ -5,8 +5,8 @@ "origin": { "kind": "recorded", "base_url": "https://dfo-dev-apis-zms5lj4zhq-nn.a.run.app/api", - "dfo_commit": "d80df9f5fd598b7345255470932d202ee5d49942", - "recorded_at": "2026-10-26T09:23:14Z" + "dfo_commit": "ccb6617922c839ce3cd5615a3bbb65c70bfe1bde", + "recorded_at": "2026-11-01T07:39:07Z" }, "call": [ { @@ -31,7 +31,7 @@ "status": 200, "headers": { "content-type": "application/json", - "x-dfo-trace-id": "14c23c7a7a01430eb3f485e658ae7e51" + "x-dfo-trace-id": "c9d306b47a8e4b0a82b757bbe9e47469" }, "json": { "schema_version": 1, @@ -42,21 +42,22 @@ "extract_skipped": false }, "diagnostics": { - "engine_build": "d80df9f5fd598b7345255470932d202ee5d49942", - "trace_id": "14c23c7a7a01430eb3f485e658ae7e51", + "engine_build": "ccb6617922c839ce3cd5615a3bbb65c70bfe1bde", + "trace_id": "c9d306b47a8e4b0a82b757bbe9e47469", "warnings": [], "timing_ms": { - "total": 1535, + "total": 1059, "by_step": { "coverage": 0, - "extract": 1020, + "extract": 916, + "exclusion_read": 657, "cache_lookup": 0 } }, "llm_usage": { - "input_tokens": 2226, - "output_tokens": 106, - "cached_tokens": 840 + "input_tokens": 2774, + "output_tokens": 111, + "cached_tokens": 0 }, "timed_out": false }, @@ -66,9 +67,9 @@ "variable_text": "aid", "warnings": [], "timing_ms": { - "total": 377, + "total": 1, "by_step": { - "recall": 377, + "recall": 1, "phase_resolve_places": 0, "phase_check_entities": 0 } diff --git a/python/client-contract/src/dfo_client_contract/scenarios/search-place-ambiguous.json b/python/client-contract/src/dfo_client_contract/scenarios/search-place-ambiguous.json index 27b7347..2018a7f 100644 --- a/python/client-contract/src/dfo_client_contract/scenarios/search-place-ambiguous.json +++ b/python/client-contract/src/dfo_client_contract/scenarios/search-place-ambiguous.json @@ -5,8 +5,8 @@ "origin": { "kind": "recorded", "base_url": "https://dfo-dev-apis-zms5lj4zhq-nn.a.run.app/api", - "dfo_commit": "d80df9f5fd598b7345255470932d202ee5d49942", - "recorded_at": "2026-10-26T09:23:11Z" + "dfo_commit": "ccb6617922c839ce3cd5615a3bbb65c70bfe1bde", + "recorded_at": "2026-11-01T07:39:04Z" }, "call": [ { @@ -31,7 +31,7 @@ "status": 200, "headers": { "content-type": "application/json", - "x-dfo-trace-id": "01cf4a9623c449759f24d249f8783de1" + "x-dfo-trace-id": "1d05424fb2784068acf168d73a67c0d0" }, "json": { "schema_version": 1, @@ -42,21 +42,22 @@ "extract_skipped": false }, "diagnostics": { - "engine_build": "d80df9f5fd598b7345255470932d202ee5d49942", - "trace_id": "01cf4a9623c449759f24d249f8783de1", + "engine_build": "ccb6617922c839ce3cd5615a3bbb65c70bfe1bde", + "trace_id": "1d05424fb2784068acf168d73a67c0d0", "warnings": [], "timing_ms": { - "total": 1162, + "total": 1946, "by_step": { "coverage": 0, - "extract": 1040, + "extract": 1070, + "exclusion_read": 606, "cache_lookup": 0 } }, "llm_usage": { - "input_tokens": 2233, - "output_tokens": 193, - "cached_tokens": 841 + "input_tokens": 2788, + "output_tokens": 202, + "cached_tokens": 0 }, "timed_out": false }, @@ -66,10 +67,10 @@ "variable_text": "ODA disbursements", "warnings": [], "timing_ms": { - "total": 117, + "total": 871, "by_step": { - "recall": 117, - "phase_resolve_places": 0, + "recall": 870, + "phase_resolve_places": 1, "phase_check_entities": 0 } }, @@ -119,7 +120,9 @@ "entity_refs": [ { "text": "Germany", - "refs": [] + "refs": [ + "country/DEU" + ] }, { "text": "Congo", diff --git a/python/client-contract/src/dfo_client_contract/scenarios/search-proxy-rate-limited.json b/python/client-contract/src/dfo_client_contract/scenarios/search-proxy-rate-limited.json index 6925a06..50d3183 100644 --- a/python/client-contract/src/dfo_client_contract/scenarios/search-proxy-rate-limited.json +++ b/python/client-contract/src/dfo_client_contract/scenarios/search-proxy-rate-limited.json @@ -61,7 +61,7 @@ "status": 200, "headers": { "content-type": "application/json", - "x-dfo-trace-id": "01cf4a9623c449759f24d249f8783de1" + "x-dfo-trace-id": "1d05424fb2784068acf168d73a67c0d0" }, "json": { "schema_version": 1, @@ -72,21 +72,22 @@ "extract_skipped": false }, "diagnostics": { - "engine_build": "d80df9f5fd598b7345255470932d202ee5d49942", - "trace_id": "01cf4a9623c449759f24d249f8783de1", + "engine_build": "ccb6617922c839ce3cd5615a3bbb65c70bfe1bde", + "trace_id": "1d05424fb2784068acf168d73a67c0d0", "warnings": [], "timing_ms": { - "total": 1162, + "total": 1946, "by_step": { "coverage": 0, - "extract": 1040, + "extract": 1070, + "exclusion_read": 606, "cache_lookup": 0 } }, "llm_usage": { - "input_tokens": 2233, - "output_tokens": 193, - "cached_tokens": 841 + "input_tokens": 2788, + "output_tokens": 202, + "cached_tokens": 0 }, "timed_out": false }, @@ -96,10 +97,10 @@ "variable_text": "ODA disbursements", "warnings": [], "timing_ms": { - "total": 117, + "total": 871, "by_step": { - "recall": 117, - "phase_resolve_places": 0, + "recall": 870, + "phase_resolve_places": 1, "phase_check_entities": 0 } }, @@ -149,7 +150,9 @@ "entity_refs": [ { "text": "Germany", - "refs": [] + "refs": [ + "country/DEU" + ] }, { "text": "Congo", diff --git a/python/client-contract/src/dfo_client_contract/scenarios/search-retry-after-503.json b/python/client-contract/src/dfo_client_contract/scenarios/search-retry-after-503.json index a01b3dc..e0696da 100644 --- a/python/client-contract/src/dfo_client_contract/scenarios/search-retry-after-503.json +++ b/python/client-contract/src/dfo_client_contract/scenarios/search-retry-after-503.json @@ -60,7 +60,7 @@ "status": 200, "headers": { "content-type": "application/json", - "x-dfo-trace-id": "01cf4a9623c449759f24d249f8783de1" + "x-dfo-trace-id": "1d05424fb2784068acf168d73a67c0d0" }, "json": { "schema_version": 1, @@ -71,21 +71,22 @@ "extract_skipped": false }, "diagnostics": { - "engine_build": "d80df9f5fd598b7345255470932d202ee5d49942", - "trace_id": "01cf4a9623c449759f24d249f8783de1", + "engine_build": "ccb6617922c839ce3cd5615a3bbb65c70bfe1bde", + "trace_id": "1d05424fb2784068acf168d73a67c0d0", "warnings": [], "timing_ms": { - "total": 1162, + "total": 1946, "by_step": { "coverage": 0, - "extract": 1040, + "extract": 1070, + "exclusion_read": 606, "cache_lookup": 0 } }, "llm_usage": { - "input_tokens": 2233, - "output_tokens": 193, - "cached_tokens": 841 + "input_tokens": 2788, + "output_tokens": 202, + "cached_tokens": 0 }, "timed_out": false }, @@ -95,10 +96,10 @@ "variable_text": "ODA disbursements", "warnings": [], "timing_ms": { - "total": 117, + "total": 871, "by_step": { - "recall": 117, - "phase_resolve_places": 0, + "recall": 870, + "phase_resolve_places": 1, "phase_check_entities": 0 } }, @@ -148,7 +149,9 @@ "entity_refs": [ { "text": "Germany", - "refs": [] + "refs": [ + "country/DEU" + ] }, { "text": "Congo", diff --git a/python/client-contract/src/dfo_client_contract/scenarios/search-server-warning.json b/python/client-contract/src/dfo_client_contract/scenarios/search-server-warning.json index 5f5376f..3a41791 100644 --- a/python/client-contract/src/dfo_client_contract/scenarios/search-server-warning.json +++ b/python/client-contract/src/dfo_client_contract/scenarios/search-server-warning.json @@ -38,7 +38,7 @@ "status": 200, "headers": { "content-type": "application/json", - "x-dfo-trace-id": "01cf4a9623c449759f24d249f8783de1", + "x-dfo-trace-id": "1d05424fb2784068acf168d73a67c0d0", "x-dfo-warning": "Search runs on a reduced index while it is rebuilt." }, "json": { @@ -50,21 +50,22 @@ "extract_skipped": false }, "diagnostics": { - "engine_build": "d80df9f5fd598b7345255470932d202ee5d49942", - "trace_id": "01cf4a9623c449759f24d249f8783de1", + "engine_build": "ccb6617922c839ce3cd5615a3bbb65c70bfe1bde", + "trace_id": "1d05424fb2784068acf168d73a67c0d0", "warnings": [], "timing_ms": { - "total": 1162, + "total": 1946, "by_step": { "coverage": 0, - "extract": 1040, + "extract": 1070, + "exclusion_read": 606, "cache_lookup": 0 } }, "llm_usage": { - "input_tokens": 2233, - "output_tokens": 193, - "cached_tokens": 841 + "input_tokens": 2788, + "output_tokens": 202, + "cached_tokens": 0 }, "timed_out": false }, @@ -74,10 +75,10 @@ "variable_text": "ODA disbursements", "warnings": [], "timing_ms": { - "total": 117, + "total": 871, "by_step": { - "recall": 117, - "phase_resolve_places": 0, + "recall": 870, + "phase_resolve_places": 1, "phase_check_entities": 0 } }, @@ -127,7 +128,9 @@ "entity_refs": [ { "text": "Germany", - "refs": [] + "refs": [ + "country/DEU" + ] }, { "text": "Congo", @@ -280,7 +283,7 @@ "status": 200, "headers": { "content-type": "application/json", - "x-dfo-trace-id": "01cf4a9623c449759f24d249f8783de1", + "x-dfo-trace-id": "1d05424fb2784068acf168d73a67c0d0", "x-dfo-warning": "Search runs on a reduced index while it is rebuilt.", "sunset": "Sat, 01 May 2027 00:00:00 GMT" }, @@ -293,21 +296,22 @@ "extract_skipped": false }, "diagnostics": { - "engine_build": "d80df9f5fd598b7345255470932d202ee5d49942", - "trace_id": "01cf4a9623c449759f24d249f8783de1", + "engine_build": "ccb6617922c839ce3cd5615a3bbb65c70bfe1bde", + "trace_id": "1d05424fb2784068acf168d73a67c0d0", "warnings": [], "timing_ms": { - "total": 1162, + "total": 1946, "by_step": { "coverage": 0, - "extract": 1040, + "extract": 1070, + "exclusion_read": 606, "cache_lookup": 0 } }, "llm_usage": { - "input_tokens": 2233, - "output_tokens": 193, - "cached_tokens": 841 + "input_tokens": 2788, + "output_tokens": 202, + "cached_tokens": 0 }, "timed_out": false }, @@ -317,10 +321,10 @@ "variable_text": "ODA disbursements", "warnings": [], "timing_ms": { - "total": 117, + "total": 871, "by_step": { - "recall": 117, - "phase_resolve_places": 0, + "recall": 870, + "phase_resolve_places": 1, "phase_check_entities": 0 } }, @@ -370,7 +374,9 @@ "entity_refs": [ { "text": "Germany", - "refs": [] + "refs": [ + "country/DEU" + ] }, { "text": "Congo", @@ -523,7 +529,7 @@ "status": 200, "headers": { "content-type": "application/json", - "x-dfo-trace-id": "01cf4a9623c449759f24d249f8783de1", + "x-dfo-trace-id": "1d05424fb2784068acf168d73a67c0d0", "x-dfo-warning": "Search answers from a cached release.", "deprecation": "@1777593600", "sunset": "Sat, 01 May 2027 00:00:00 GMT" @@ -537,21 +543,22 @@ "extract_skipped": false }, "diagnostics": { - "engine_build": "d80df9f5fd598b7345255470932d202ee5d49942", - "trace_id": "01cf4a9623c449759f24d249f8783de1", + "engine_build": "ccb6617922c839ce3cd5615a3bbb65c70bfe1bde", + "trace_id": "1d05424fb2784068acf168d73a67c0d0", "warnings": [], "timing_ms": { - "total": 1162, + "total": 1946, "by_step": { "coverage": 0, - "extract": 1040, + "extract": 1070, + "exclusion_read": 606, "cache_lookup": 0 } }, "llm_usage": { - "input_tokens": 2233, - "output_tokens": 193, - "cached_tokens": 841 + "input_tokens": 2788, + "output_tokens": 202, + "cached_tokens": 0 }, "timed_out": false }, @@ -561,10 +568,10 @@ "variable_text": "ODA disbursements", "warnings": [], "timing_ms": { - "total": 117, + "total": 871, "by_step": { - "recall": 117, - "phase_resolve_places": 0, + "recall": 870, + "phase_resolve_places": 1, "phase_check_entities": 0 } }, @@ -614,7 +621,9 @@ "entity_refs": [ { "text": "Germany", - "refs": [] + "refs": [ + "country/DEU" + ] }, { "text": "Congo", diff --git a/python/client-contract/src/dfo_client_contract/scenarios/search-sunset-warning.json b/python/client-contract/src/dfo_client_contract/scenarios/search-sunset-warning.json index 9dc10a7..ba8450a 100644 --- a/python/client-contract/src/dfo_client_contract/scenarios/search-sunset-warning.json +++ b/python/client-contract/src/dfo_client_contract/scenarios/search-sunset-warning.json @@ -34,7 +34,7 @@ "status": 200, "headers": { "content-type": "application/json", - "x-dfo-trace-id": "01cf4a9623c449759f24d249f8783de1", + "x-dfo-trace-id": "1d05424fb2784068acf168d73a67c0d0", "sunset": "Sat, 01 May 2027 00:00:00 GMT" }, "json": { @@ -46,21 +46,22 @@ "extract_skipped": false }, "diagnostics": { - "engine_build": "d80df9f5fd598b7345255470932d202ee5d49942", - "trace_id": "01cf4a9623c449759f24d249f8783de1", + "engine_build": "ccb6617922c839ce3cd5615a3bbb65c70bfe1bde", + "trace_id": "1d05424fb2784068acf168d73a67c0d0", "warnings": [], "timing_ms": { - "total": 1162, + "total": 1946, "by_step": { "coverage": 0, - "extract": 1040, + "extract": 1070, + "exclusion_read": 606, "cache_lookup": 0 } }, "llm_usage": { - "input_tokens": 2233, - "output_tokens": 193, - "cached_tokens": 841 + "input_tokens": 2788, + "output_tokens": 202, + "cached_tokens": 0 }, "timed_out": false }, @@ -70,10 +71,10 @@ "variable_text": "ODA disbursements", "warnings": [], "timing_ms": { - "total": 117, + "total": 871, "by_step": { - "recall": 117, - "phase_resolve_places": 0, + "recall": 870, + "phase_resolve_places": 1, "phase_check_entities": 0 } }, @@ -123,7 +124,9 @@ "entity_refs": [ { "text": "Germany", - "refs": [] + "refs": [ + "country/DEU" + ] }, { "text": "Congo", @@ -276,7 +279,7 @@ "status": 200, "headers": { "content-type": "application/json", - "x-dfo-trace-id": "01cf4a9623c449759f24d249f8783de1", + "x-dfo-trace-id": "1d05424fb2784068acf168d73a67c0d0", "sunset": "Sat, 01 May 2027 00:00:00 GMT" }, "json": { @@ -288,21 +291,22 @@ "extract_skipped": false }, "diagnostics": { - "engine_build": "d80df9f5fd598b7345255470932d202ee5d49942", - "trace_id": "01cf4a9623c449759f24d249f8783de1", + "engine_build": "ccb6617922c839ce3cd5615a3bbb65c70bfe1bde", + "trace_id": "1d05424fb2784068acf168d73a67c0d0", "warnings": [], "timing_ms": { - "total": 1162, + "total": 1946, "by_step": { "coverage": 0, - "extract": 1040, + "extract": 1070, + "exclusion_read": 606, "cache_lookup": 0 } }, "llm_usage": { - "input_tokens": 2233, - "output_tokens": 193, - "cached_tokens": 841 + "input_tokens": 2788, + "output_tokens": 202, + "cached_tokens": 0 }, "timed_out": false }, @@ -312,10 +316,10 @@ "variable_text": "ODA disbursements", "warnings": [], "timing_ms": { - "total": 117, + "total": 871, "by_step": { - "recall": 117, - "phase_resolve_places": 0, + "recall": 870, + "phase_resolve_places": 1, "phase_check_entities": 0 } }, @@ -365,7 +369,9 @@ "entity_refs": [ { "text": "Germany", - "refs": [] + "refs": [ + "country/DEU" + ] }, { "text": "Congo", diff --git a/python/client-contract/src/dfo_client_contract/scenarios/search-two-parts-place-ambiguous.json b/python/client-contract/src/dfo_client_contract/scenarios/search-two-parts-place-ambiguous.json index 9e48a68..1aee07d 100644 --- a/python/client-contract/src/dfo_client_contract/scenarios/search-two-parts-place-ambiguous.json +++ b/python/client-contract/src/dfo_client_contract/scenarios/search-two-parts-place-ambiguous.json @@ -5,8 +5,8 @@ "origin": { "kind": "recorded", "base_url": "https://dfo-dev-apis-zms5lj4zhq-nn.a.run.app/api", - "dfo_commit": "d80df9f5fd598b7345255470932d202ee5d49942", - "recorded_at": "2026-10-26T09:23:13Z" + "dfo_commit": "ccb6617922c839ce3cd5615a3bbb65c70bfe1bde", + "recorded_at": "2026-11-01T07:39:06Z" }, "call": [ { @@ -31,7 +31,7 @@ "status": 200, "headers": { "content-type": "application/json", - "x-dfo-trace-id": "5df79c87dd3c43589df5c2921f3c93e3" + "x-dfo-trace-id": "66ee9968495c4420baa91bae126c6a07" }, "json": { "schema_version": 1, @@ -42,21 +42,22 @@ "extract_skipped": false }, "diagnostics": { - "engine_build": "d80df9f5fd598b7345255470932d202ee5d49942", - "trace_id": "5df79c87dd3c43589df5c2921f3c93e3", + "engine_build": "ccb6617922c839ce3cd5615a3bbb65c70bfe1bde", + "trace_id": "66ee9968495c4420baa91bae126c6a07", "warnings": [], "timing_ms": { - "total": 1209, + "total": 1103, "by_step": { "coverage": 0, - "extract": 1202, + "extract": 1095, + "exclusion_read": 608, "cache_lookup": 0 } }, "llm_usage": { - "input_tokens": 2234, - "output_tokens": 207, - "cached_tokens": 841 + "input_tokens": 2790, + "output_tokens": 216, + "cached_tokens": 0 }, "timed_out": false }, @@ -122,11 +123,15 @@ "entity_refs": [ { "text": "Kenya", - "refs": [] + "refs": [ + "country/KEN" + ] }, { "text": "Germany", - "refs": [] + "refs": [ + "country/DEU" + ] }, { "text": "Congo", @@ -240,9 +245,9 @@ "variable_text": "ODA disbursements", "warnings": [], "timing_ms": { - "total": 2, + "total": 1, "by_step": { - "recall": 2, + "recall": 1, "phase_resolve_places": 0, "phase_check_entities": 0 } @@ -296,11 +301,15 @@ "entity_refs": [ { "text": "Kenya", - "refs": [] + "refs": [ + "country/KEN" + ] }, { "text": "Germany", - "refs": [] + "refs": [ + "country/DEU" + ] }, { "text": "Congo", diff --git a/python/client-contract/src/dfo_client_contract/scenarios/search-warning-top5.json b/python/client-contract/src/dfo_client_contract/scenarios/search-warning-top5.json index 10533af..2b5cf25 100644 --- a/python/client-contract/src/dfo_client_contract/scenarios/search-warning-top5.json +++ b/python/client-contract/src/dfo_client_contract/scenarios/search-warning-top5.json @@ -5,8 +5,8 @@ "origin": { "kind": "recorded", "base_url": "https://dfo-dev-apis-zms5lj4zhq-nn.a.run.app/api", - "dfo_commit": "d80df9f5fd598b7345255470932d202ee5d49942", - "recorded_at": "2026-10-26T09:23:20Z" + "dfo_commit": "ccb6617922c839ce3cd5615a3bbb65c70bfe1bde", + "recorded_at": "2026-11-01T07:39:13Z" }, "call": [ { @@ -38,7 +38,7 @@ "status": 200, "headers": { "content-type": "application/json", - "x-dfo-trace-id": "6cfb1ed8ec3e430a91c10329304d9af4" + "x-dfo-trace-id": "fe5a5b819e9e43ce9cd95964ad1bfa28" }, "json": { "schema_version": 1, @@ -49,21 +49,22 @@ "extract_skipped": false }, "diagnostics": { - "engine_build": "d80df9f5fd598b7345255470932d202ee5d49942", - "trace_id": "6cfb1ed8ec3e430a91c10329304d9af4", + "engine_build": "ccb6617922c839ce3cd5615a3bbb65c70bfe1bde", + "trace_id": "fe5a5b819e9e43ce9cd95964ad1bfa28", "warnings": [], "timing_ms": { - "total": 1831, + "total": 1735, "by_step": { "coverage": 0, - "extract": 1224, + "extract": 1071, + "exclusion_read": 664, "cache_lookup": 0 } }, "llm_usage": { - "input_tokens": 2233, - "output_tokens": 188, - "cached_tokens": 841, + "input_tokens": 2788, + "output_tokens": 193, + "cached_tokens": 0, "jev_input_tokens": 4485, "jev_output_tokens": 849 }, @@ -88,7 +89,7 @@ "code": "whole_total_available", "severity": "info", "message": "The source publishes the total of every official donor as official donors (DAC); a sum of the listed donors includes private donors and differs from it.", - "spec_id": "spec_7778beed72f8433bb7fde4293acfd175", + "spec_id": "spec_67170941f9982e1b0525932d4b816168", "params": { "total": "DACOfficialDonors", "total_label": "official donors (DAC)", @@ -97,30 +98,30 @@ } ], "timing_ms": { - "total": 603, + "total": 657, "by_step": { - "recall": 81, + "recall": 126, "phase_resolve_places": 0, "phase_check_entities": 0, - "shape_arcs": 3, - "shape_probe_coverage": 11, - "shape_probe": 116, - "shape_groups": 9, + "shape_arcs": 1, + "shape_probe_coverage": 12, + "shape_probe": 109, + "shape_groups": 6, "shape_labels": 0, "shape_admission": 1, "phase_derive_shapes": 0, - "shape": 227, + "shape": 216, "phase_prune_and_rank": 0, - "bind": 106, - "phase_bind": 16, - "phase_settle": 8, + "bind": 95, + "phase_bind": 19, + "phase_settle": 12, "phase_place_bindings": 1, "phase_facet_requests": 0, - "materialise": 38, - "phase_materialise": 5, - "answer": 19, - "options": 11, - "phase_outcome": 91 + "materialise": 42, + "phase_materialise": 4, + "answer": 36, + "options": 13, + "phase_outcome": 93 } }, "restatement": { @@ -175,10 +176,10 @@ ], "status": "definite", "spec": { - "spec_id": "spec_7778beed72f8433bb7fde4293acfd175", + "spec_id": "spec_67170941f9982e1b0525932d4b816168", "definition": { "schema_version": 1, - "spec_id": "spec_7778beed72f8433bb7fde4293acfd175", + "spec_id": "spec_67170941f9982e1b0525932d4b816168", "identity": { "identity_version": "spec1", "shape": { @@ -213,7 +214,7 @@ "property": "nettingBasis", "binding": { "state": "value", - "ref": "Gross" + "ref": "Net" } } ], @@ -235,7 +236,7 @@ "resolved": { "shape": { "shape_id": "financialflow_amount_measuredvalue_nominal_family_f096b1ba", - "label": "gross disbursements (official development assistance)", + "label": "net disbursements (official development assistance)", "population_type": { "ref": "FinancialFlow", "label": "financial flow" @@ -300,7 +301,7 @@ } ], "member_count": 1, - "member_digest": "1a36e1a7292b1bfff95a5415de0be74cac7bb033217ed50e79faa8ce51a224c0", + "member_digest": "c2d373442ac21a31377df76cd343f156c72a530649757c399c6661cbf56c9a71", "refine_supported": true, "data_commons": [ { @@ -365,8 +366,8 @@ "kind": "value", "value": { "ref": { - "ref": "Gross", - "label": "gross" + "ref": "Net", + "label": "net" }, "value_kind": "enum_value" } @@ -457,7 +458,7 @@ "coverage": { "kind": "exact", "has_data": true, - "observation_count": 110, + "observation_count": 111, "evidence": "facet_metadata", "dimensions": [ { @@ -485,46 +486,46 @@ "start_year": 2022, "end_year": 2022 }, - "observations": 110, - "series": 110, + "observations": 111, + "series": 111, "role_counts": { - "financingProvider": 110, + "financingProvider": 111, "financingRecipient": 1 }, "recent_years": [ { "year": 2022, - "observations": 110, - "series": 110, + "observations": 111, + "series": 111, "role_counts": { - "financingProvider": 110, + "financingProvider": 111, "financingRecipient": 1 } }, { "year": 2021, - "observations": 102, - "series": 102, + "observations": 103, + "series": 103, "role_counts": { - "financingProvider": 102, + "financingProvider": 103, "financingRecipient": 1 } }, { "year": 2020, - "observations": 90, - "series": 90, + "observations": 92, + "series": 92, "role_counts": { - "financingProvider": 90, + "financingProvider": 92, "financingRecipient": 1 } } ] }, "download": { - "rows": 110, + "rows": 111, "rows_exact": true, - "series": 110, + "series": 111, "window": { "start_year": 2022, "end_year": 2022 @@ -533,7 +534,7 @@ "label": "OECD Terms and Conditions" } }, - "coverage_stamp": "e6e717ab8c77e84d010915893ede5809e9ecec67929a07cfafbcc2210edfa1eb", + "coverage_stamp": "ad27fd11738abb03d2d84dc214e223f04781609636cf678d0d08c385fb863d99", "facets": { "provenance": { "basis": "fallback", @@ -579,60 +580,60 @@ "relation": "child", "parent": "DAC2aAidType206", "member_count": 2, - "served_rows": 23, + "served_rows": 27, "served_rows_exact": true }, { "value": { "ref": { - "ref": "DAC2aAidType201", - "label": "ODA grant" + "ref": "DAC2aAidType219", + "label": "recovery on ODA grants and capital subscriptions" }, "value_kind": "enum_value" }, "relation": "child", "parent": "DAC2aAidType206", "member_count": 1, - "served_rows": 109, + "served_rows": 23, "served_rows_exact": true }, { "value": { "ref": { - "ref": "DAC2aAidType207", - "label": "free-standing technical co-operation" + "ref": "DAC2aAidType209", + "label": "interest received on ODA lending" }, "value_kind": "enum_value" }, "relation": "root", "member_count": 1, - "served_rows": 42, + "served_rows": 11, "served_rows_exact": true }, { "value": { "ref": { - "ref": "DAC2aAidType213", - "label": "developmental food aid" + "ref": "DAC2aAidType250", + "label": "official development assistance excluding debt relief" }, "value_kind": "enum_value" }, "relation": "root", "member_count": 1, - "served_rows": 17, + "served_rows": 111, "served_rows_exact": true }, { "value": { "ref": { - "ref": "DAC2aAidType216", - "label": "humanitarian aid" + "ref": "DAC2aAidType255", + "label": "debt relief" }, "value_kind": "enum_value" }, "relation": "root", "member_count": 1, - "served_rows": 52, + "served_rows": 4, "served_rows_exact": true } ], @@ -682,11 +683,11 @@ "source": "observed" } ], - "rendered_sentence": "Gross disbursements to Ethiopia from 95 providers for official development assistance in 2022. Current US dollars · OECD DAC2a.", + "rendered_sentence": "Net disbursements to Ethiopia from 96 providers for official development assistance in 2022. Current US dollars · OECD DAC2a.", "sentence_plan": [ { "kind": "slot", - "text": "Gross disbursements", + "text": "Net disbursements", "axis": "what", "segment": "heading", "entity_refs": [], @@ -727,7 +728,7 @@ }, { "kind": "slot", - "text": "95 providers", + "text": "96 providers", "segment": "heading", "role": "origin", "binding_ref": "origin:", @@ -925,8 +926,8 @@ "binding_kind": "value", "refs": [ { - "ref": "Gross", - "label": "gross" + "ref": "Net", + "label": "net" } ], "provenance": "measure_elected" @@ -982,7 +983,7 @@ "start_year": 2022, "end_year": 2022 }, - "capability_version": "cap_765c9d2a0c7529b9", + "capability_version": "cap_4913302d7a6b6435", "default_reading": { "applied": true, "removed_stat_vars": [] @@ -990,105 +991,8 @@ }, "confidence": "high", "available_at_place": true, - "alternative_measures": [ - { - "definition": { - "schema_version": 1, - "spec_id": "spec_3c568219e4c10cc4b9bdc35725c83293", - "identity": { - "identity_version": "spec1", - "shape": { - "kind": "statvar_schema", - "population_type": "FinancialFlow", - "measured_property": "amount", - "stat_type": "measuredValue", - "measurement_qualifier": "Nominal" - }, - "slots": [ - { - "property": "dac2aAidType", - "binding": { - "state": "value", - "ref": "DAC2aAidType206" - } - }, - { - "property": "dacTypeOfFinance", - "binding": { - "state": "unbound" - } - }, - { - "property": "financialFlowType", - "binding": { - "state": "value", - "ref": "Disbursement" - } - }, - { - "property": "nettingBasis", - "binding": { - "state": "value", - "ref": "Net" - } - } - ], - "entities": { - "destination": [ - "country/ETH" - ] - }, - "requested_window": { - "kind": "range", - "start_year": 2022, - "end_year": 2022 - } - } - }, - "label": "net disbursements", - "axis": "what", - "measure_axis_values": [ - { - "axis": "populationType", - "value": { - "ref": "FinancialFlow", - "label": "financial flow" - } - }, - { - "axis": "measuredProperty", - "value": { - "ref": "amount", - "label": "amount" - } - }, - { - "axis": "measurementQualifier", - "value": { - "ref": "Nominal", - "label": "nominal" - } - }, - { - "axis": "financialFlowType", - "value": { - "ref": "Disbursement", - "label": "disbursement" - } - }, - { - "axis": "nettingBasis", - "value": { - "ref": "Net", - "label": "net" - } - } - ], - "served_rows": 111, - "served_rows_exact": true - } - ], - "measure_label": "gross disbursements", + "alternative_measures": [], + "measure_label": "net disbursements", "measure_label_axes": [ "populationType", "measuredProperty", @@ -1128,16 +1032,19 @@ { "axis": "nettingBasis", "value": { - "ref": "Gross", - "label": "gross" + "ref": "Net", + "label": "net" } } ], + "concept_label": "official development assistance", + "published_tables": "OECD DAC2a", "role_axis_facts": [ { "role": "origin", - "member_count": 95, - "members_available": true + "member_count": 96, + "members_available": true, + "holds_multilaterals": true } ], "unit_conversion": { @@ -3086,16 +2993,260 @@ "role_currencies": { "destination": "ETB" } + }, + "scope_choices": { + "id": "spec_67170941f9982e1b0525932d4b816168", + "base": { + "schema_version": 1, + "spec_id": "spec_67170941f9982e1b0525932d4b816168", + "identity": { + "identity_version": "spec1", + "shape": { + "kind": "statvar_schema", + "population_type": "FinancialFlow", + "measured_property": "amount", + "stat_type": "measuredValue", + "measurement_qualifier": "Nominal" + }, + "slots": [ + { + "property": "dac2aAidType", + "binding": { + "state": "value", + "ref": "DAC2aAidType206" + } + }, + { + "property": "dacTypeOfFinance", + "binding": { + "state": "unbound" + } + }, + { + "property": "financialFlowType", + "binding": { + "state": "value", + "ref": "Disbursement" + } + }, + { + "property": "nettingBasis", + "binding": { + "state": "value", + "ref": "Net" + } + } + ], + "entities": { + "destination": [ + "country/ETH" + ] + }, + "requested_window": { + "kind": "range", + "start_year": 2022, + "end_year": 2022 + }, + "open_roles": [ + "origin" + ] + } + }, + "rule_version": "scope1:3eef00a928eedd463ee48d02b79730da", + "entries": [], + "dropped_entries": [], + "choices": [ + { + "id": "spec_67170941f9982e1b0525932d4b816168:measure_basis", + "axis": "measure_basis", + "rule": "measure_basis_convention", + "provenance": "default", + "active": "measure_basis:net", + "options": [ + { + "option_id": "measure_basis:gross", + "label": "gross disbursements, current USD", + "binding": { + "kind": "shape", + "measured_property": "amount", + "netting_basis": "Gross" + }, + "availability": { + "status": "available", + "detail": {} + } + }, + { + "option_id": "measure_basis:net", + "label": "net disbursements, current USD", + "binding": { + "kind": "shape", + "measured_property": "amount", + "netting_basis": "Net" + }, + "availability": { + "status": "available", + "detail": {} + } + }, + { + "option_id": "measure_basis:grant_equivalent", + "label": "grant equivalents (OECD headline), current USD", + "binding": { + "kind": "shape", + "measured_property": "grantEquivalent", + "netting_basis": null + }, + "availability": { + "status": "unavailable", + "code": "basis_not_published", + "detail": { + "dataset": "provenance/OECDDAC2A" + } + } + }, + { + "option_id": "measure_basis:commitments", + "label": "commitments, current USD", + "binding": { + "kind": "shape", + "measured_property": "amount", + "netting_basis": null + }, + "availability": { + "status": "unavailable", + "code": "basis_not_published", + "detail": { + "dataset": "provenance/OECDDAC2A" + } + } + } + ] + } + ], + "compiled": { + "spec_id": "spec_67170941f9982e1b0525932d4b816168", + "identity": { + "identity_version": "spec1", + "shape": { + "kind": "statvar_schema", + "population_type": "FinancialFlow", + "measured_property": "amount", + "stat_type": "measuredValue", + "measurement_qualifier": "Nominal" + }, + "slots": [ + { + "property": "dac2aAidType", + "binding": { + "state": "value", + "ref": "DAC2aAidType206" + } + }, + { + "property": "dacTypeOfFinance", + "binding": { + "state": "unbound" + } + }, + { + "property": "financialFlowType", + "binding": { + "state": "value", + "ref": "Disbursement" + } + }, + { + "property": "nettingBasis", + "binding": { + "state": "value", + "ref": "Net" + } + } + ], + "entities": { + "destination": [ + "country/ETH" + ] + }, + "requested_window": { + "kind": "range", + "start_year": 2022, + "end_year": 2022 + }, + "open_roles": [ + "origin" + ] + }, + "components": [ + { + "role": "whole", + "identity": { + "identity_version": "spec1", + "shape": { + "kind": "statvar_schema", + "population_type": "FinancialFlow", + "measured_property": "amount", + "stat_type": "measuredValue", + "measurement_qualifier": "Nominal" + }, + "slots": [ + { + "property": "dac2aAidType", + "binding": { + "state": "value", + "ref": "DAC2aAidType206" + } + }, + { + "property": "dacTypeOfFinance", + "binding": { + "state": "unbound" + } + }, + { + "property": "financialFlowType", + "binding": { + "state": "value", + "ref": "Disbursement" + } + }, + { + "property": "nettingBasis", + "binding": { + "state": "value", + "ref": "Net" + } + } + ], + "entities": { + "destination": [ + "country/ETH" + ] + }, + "requested_window": { + "kind": "range", + "start_year": 2022, + "end_year": 2022 + }, + "open_roles": [ + "origin" + ] + } + } + ] + }, + "ledger": [] } } } } ], - "rendered_sentence": "Gross disbursements to Ethiopia from 95 providers for official development assistance in 2022. Current US dollars · OECD DAC2a. You asked for a ranking. This shows the amounts behind it, because Search does not compute rankings. Assumed: official development assistance.", + "rendered_sentence": "Net disbursements to Ethiopia from 96 providers for official development assistance in 2022. Current US dollars · OECD DAC2a. You asked for a ranking. This shows the amounts behind it, because Search does not compute rankings. Assumed: official development assistance.", "sentence_plan": [ { "kind": "slot", - "text": "Gross disbursements", + "text": "Net disbursements", "axis": "what", "segment": "heading", "entity_refs": [], @@ -3140,7 +3291,7 @@ }, { "kind": "slot", - "text": "95 providers", + "text": "96 providers", "segment": "heading", "role": "origin", "binding_ref": "origin:", @@ -3333,10 +3484,10 @@ "schema_version": 1, "input": { "kind": "spec_id", - "spec_id": "spec_7778beed72f8433bb7fde4293acfd175", + "spec_id": "spec_67170941f9982e1b0525932d4b816168", "definition": { "schema_version": 1, - "spec_id": "spec_7778beed72f8433bb7fde4293acfd175", + "spec_id": "spec_67170941f9982e1b0525932d4b816168", "identity": { "identity_version": "spec1", "shape": { @@ -3371,7 +3522,7 @@ "property": "nettingBasis", "binding": { "state": "value", - "ref": "Gross" + "ref": "Net" } } ], @@ -3402,13 +3553,13 @@ "status": 200, "headers": { "content-type": "application/json", - "x-dfo-trace-id": "003f90ea7c3b4c0ea7414ee5a282c0f4" + "x-dfo-trace-id": "a89965c1f5e744409ef6370942f1fc70" }, "json": { "schema_version": 1, "definition": { "schema_version": 1, - "spec_id": "spec_7778beed72f8433bb7fde4293acfd175", + "spec_id": "spec_67170941f9982e1b0525932d4b816168", "identity": { "shape": { "kind": "statvar_schema", @@ -3440,7 +3591,7 @@ }, { "binding": { - "ref": "Gross", + "ref": "Net", "state": "value" }, "property": "nettingBasis" @@ -3462,14 +3613,14 @@ } } }, - "content_version": "cv_c17d6a131cb4556543b91556e46814e9", - "prepared_at": "2026-10-20T16:52:43Z", + "content_version": "cv_219fc5386675dcca1fc91197c39ac885", + "prepared_at": "2026-10-28T22:26:00Z", "coverage": { - "rows": 95, + "rows": 96, "dimensions": [ { "label": "financingProvider", - "count": 95, + "count": 96, "axis": "origin", "noun": { "singular": "provider", @@ -3580,6 +3731,29 @@ ] }, "trace": { + "party_totals_left_out": [ + { + "role": "financingProvider", + "provenance": "provenance/OECDDAC2A", + "entities": [ + "AfricanDevelopmentBankGroup", + "DACCountriesTotal", + "DACEUMembers", + "DACEUMembersAndEUInstitutions", + "DACMultilaterals", + "DACNonDACCountries", + "DACOfficialDonors", + "DACOtherMultilateralOrganisations", + "DACPrivateDonors", + "DACRegionalDevelopmentBanks", + "DACUnitedNations", + "DACWorldBank", + "GroupOfSeven", + "PostcodeLotteryGroup", + "WorldBankGroup" + ] + } + ], "facets": [ { "ref": "provenance/OECDDAC2A", @@ -3615,11 +3789,11 @@ "end_year": 2022, "start_year": 2022 }, - "graph_revision": "dfo-dev-dc-datacommons-service-00259-rpx", + "graph_revision": "dfo-dev-dc-datacommons-service-00275-9t9", "normalisations": [], "code_index_stamp": { - "exported_at": "2026-10-20T13:18:18Z", - "content_hash": "602c7022fc21c17540a6873d93196ad6b967eaae3e71f9dce6dec178a735daf4", + "exported_at": "2026-10-28T17:28:18Z", + "content_hash": "3d946d8f4986dbbe0fa3e5c4c917200381f529d89ce417c11daeb22df56eed99", "graph_endpoint": "graph_release" }, "source_revisions": [ @@ -3628,46 +3802,24 @@ "revision": "2026-10-15" } ], - "capability_version": "dset_1e6cd9546fac19e9", - "materialiser_build": "7175fe98eec005479f1397936dc011ad120092d5", + "capability_version": "dset_4c514fc1069d2b93", + "materialiser_build": "972c58bef62fbfc8baad54f8473fe465779025b0", "resolved_stat_vars": [ { - "ref": "dcid:Amount_FinancialFlow_Gross_Disbursement_DAC2aAidType206_Nominal", + "ref": "dcid:Amount_FinancialFlow_Net_Disbursement_DAC2aAidType206_Nominal", "roles": [ "financingProvider", "financingRecipient" ], - "observation_count": 110 + "observation_count": 111 } ], "family_member_count": 1, - "family_member_digest": "1a36e1a7292b1bfff95a5415de0be74cac7bb033217ed50e79faa8ce51a224c0", + "family_member_digest": "c2d373442ac21a31377df76cd343f156c72a530649757c399c6661cbf56c9a71", "frame_grammar_version": "1.1.0", - "party_totals_left_out": [ - { - "role": "financingProvider", - "entities": [ - "AfricanDevelopmentBankGroup", - "DACCountriesTotal", - "DACEUMembers", - "DACEUMembersAndEUInstitutions", - "DACMultilaterals", - "DACNonDACCountries", - "DACOfficialDonors", - "DACOtherMultilateralOrganisations", - "DACPrivateDonors", - "DACRegionalDevelopmentBanks", - "DACUnitedNations", - "DACWorldBank", - "GroupOfSeven", - "PostcodeLotteryGroup", - "WorldBankGroup" - ] - } - ], - "origin_catalogue_build_id": "20261019T174519Z-2e5e8cfd", - "served_from": "head", - "confirmed_at": "2026-10-26T09:23:22.526168+00:00" + "origin_catalogue_build_id": "20261027T131516Z-80bb1497", + "served_from": "materialise", + "confirmed_at": "2026-11-01T07:39:16.229411+00:00" }, "warnings": [], "diagnostics": [ @@ -3679,35 +3831,35 @@ ], "artifacts": [ { - "artifact_digest": "sha256:d2ea67ebd67a84915c8e97a7ef4b66733e2d624a1cc5d1c927d6673c8c2f668e", + "artifact_digest": "sha256:89fdd6dc3600cd739f88cdf8d948aab75c11754ef3c244cddcc1daed31bab64b", "rendering": { "bundle": false, "format": "parquet", "layout": 4, "without_party_totals": true }, - "bytes": 10329, + "bytes": 10345, "media_type": "application/vnd.apache.parquet", - "created_at": "2026-10-24T20:59:40.869991+00:00", + "created_at": "2026-10-28T22:26:00.878026+00:00", "tier": "working", - "url": "/api/datasets/spec_7778beed72f8433bb7fde4293acfd175/cv_c17d6a131cb4556543b91556e46814e9/files/sha256:d2ea67ebd67a84915c8e97a7ef4b66733e2d624a1cc5d1c927d6673c8c2f668e", - "enrichment_stamp": "08ed6c734fc69ea2204a21f4e1dd8b963f14dd1e03a2484c618049ac2e2d93d8" + "url": "/api/datasets/spec_67170941f9982e1b0525932d4b816168/cv_219fc5386675dcca1fc91197c39ac885/files/sha256:89fdd6dc3600cd739f88cdf8d948aab75c11754ef3c244cddcc1daed31bab64b", + "enrichment_stamp": "55887b871f7aa1c5d120cb2bee97086605351d5acfbec645ab027f562d0f65c5" }, { - "artifact_digest": "sha256:d59c03c57a8ea2d1da95b4fb2b1131919e8a13b2003ef51fc1b3801ca46be960", + "artifact_digest": "sha256:f34567332e3a45cb8357bd587f254a3126f03f085e2fdc32afb1ec54e068fe01", "rendering": { "statistics": "series" }, - "bytes": 9527, + "bytes": 9569, "media_type": "application/vnd.apache.parquet", - "created_at": "2026-10-23T22:01:14.760267+00:00", + "created_at": "2026-10-28T22:26:00.878026+00:00", "tier": "working", - "url": "/api/datasets/spec_7778beed72f8433bb7fde4293acfd175/cv_c17d6a131cb4556543b91556e46814e9/files/sha256:d59c03c57a8ea2d1da95b4fb2b1131919e8a13b2003ef51fc1b3801ca46be960" + "url": "/api/datasets/spec_67170941f9982e1b0525932d4b816168/cv_219fc5386675dcca1fc91197c39ac885/files/sha256:f34567332e3a45cb8357bd587f254a3126f03f085e2fdc32afb1ec54e068fe01" } ], - "series_count": 95, + "series_count": 96, "output_options": { - "capability_version": "dset_76f5fa7244511c58", + "capability_version": "dset_5282a0674178a233", "columns": [ { "name": "stat_var", @@ -3719,7 +3871,7 @@ "name": "financingProvider", "kind": "role", "droppable": false, - "distinct": 95 + "distinct": 96 }, { "name": "financingRecipient", @@ -3787,8 +3939,8 @@ "state": "partial", "reason": "enrichment_unavailable", "coverage": { - "entities": 95, - "covered": 40 + "entities": 96, + "covered": 41 }, "missing": [ { @@ -3832,7 +3984,8 @@ "label": "Dutch Postcode Lottery" } ], - "truncated": true + "truncated": true, + "in_long_layout": false }, { "column": "financingProvider", @@ -3841,8 +3994,8 @@ "state": "partial", "reason": "enrichment_unavailable", "coverage": { - "entities": 95, - "covered": 40 + "entities": 96, + "covered": 41 }, "missing": [ { @@ -3886,7 +4039,8 @@ "label": "Dutch Postcode Lottery" } ], - "truncated": true + "truncated": true, + "in_long_layout": false }, { "column": "financingProvider", @@ -3894,11 +4048,12 @@ "token": "financingProvider_label", "state": "available", "coverage": { - "entities": 95, - "covered": 95 + "entities": 96, + "covered": 96 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true }, { "column": "financingProvider", @@ -3906,11 +4061,12 @@ "token": "financingProvider_type", "state": "available", "coverage": { - "entities": 95, - "covered": 95 + "entities": 96, + "covered": 96 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": false }, { "column": "financingProvider", @@ -3918,11 +4074,12 @@ "token": "financingProvider_party_kind", "state": "available", "coverage": { - "entities": 95, - "covered": 95 + "entities": 96, + "covered": 96 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true }, { "column": "financingProvider", @@ -3930,11 +4087,12 @@ "token": "financingProvider_party_class", "state": "available", "coverage": { - "entities": 95, - "covered": 95 + "entities": 96, + "covered": 96 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true }, { "column": "financingProvider", @@ -3942,11 +4100,12 @@ "token": "financingProvider_party_whole", "state": "available", "coverage": { - "entities": 95, - "covered": 95 + "entities": 96, + "covered": 96 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true }, { "column": "financingRecipient", @@ -3958,7 +4117,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": false }, { "column": "financingRecipient", @@ -3970,7 +4130,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": false }, { "column": "financingRecipient", @@ -3982,7 +4143,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true }, { "column": "financingRecipient", @@ -3994,7 +4156,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": false }, { "column": "financingRecipient", @@ -4006,7 +4169,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true }, { "column": "financingRecipient", @@ -4018,7 +4182,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true }, { "column": "financingRecipient", @@ -4030,7 +4195,8 @@ "covered": 1 }, "missing": [], - "truncated": false + "truncated": false, + "in_long_layout": true } ], "long_layout_defaults": [ @@ -4061,10 +4227,10 @@ ] } }, - "series_coverage_stamp": "e6e717ab8c77e84d010915893ede5809e9ecec67929a07cfafbcc2210edfa1eb", + "series_coverage_stamp": "ad27fd11738abb03d2d84dc214e223f04781609636cf678d0d08c385fb863d99", "retention": { "pinned": false, - "held_until": "2026-11-22T22:01:14.671345Z" + "held_until": "2026-11-27T22:26:00.878555Z" } } } @@ -4072,21 +4238,21 @@ { "request": { "method": "GET", - "origin_path": "/api/datasets/spec_7778beed72f8433bb7fde4293acfd175/cv_c17d6a131cb4556543b91556e46814e9/files/sha256:d2ea67ebd67a84915c8e97a7ef4b66733e2d624a1cc5d1c927d6673c8c2f668e" + "origin_path": "/api/datasets/spec_67170941f9982e1b0525932d4b816168/cv_219fc5386675dcca1fc91197c39ac885/files/sha256:89fdd6dc3600cd739f88cdf8d948aab75c11754ef3c244cddcc1daed31bab64b" }, "response": { "status": 302, "headers": { "content-type": "text/html", - "location": "https://storage.googleapis.com/dev-fin-observatory-datasets-working/sha256%3Ad2ea67ebd67a84915c8e97a7ef4b66733e2d624a1cc5d1c927d6673c8c2f668e?X-Goog-Signature=redacted", - "x-dfo-trace-id": "014016fd216a48729c10484f342a83a6" + "location": "https://storage.googleapis.com/dev-fin-observatory-datasets-working/sha256%3A89fdd6dc3600cd739f88cdf8d948aab75c11754ef3c244cddcc1daed31bab64b?X-Goog-Signature=redacted", + "x-dfo-trace-id": "29811201aab2444fb90d67f48ec12ae7" } } }, { "request": { "method": "GET", - "url": "https://storage.googleapis.com/dev-fin-observatory-datasets-working/sha256%3Ad2ea67ebd67a84915c8e97a7ef4b66733e2d624a1cc5d1c927d6673c8c2f668e?X-Goog-Signature=redacted" + "url": "https://storage.googleapis.com/dev-fin-observatory-datasets-working/sha256%3A89fdd6dc3600cd739f88cdf8d948aab75c11754ef3c244cddcc1daed31bab64b?X-Goog-Signature=redacted" }, "response": { "status": 200, @@ -4102,10 +4268,10 @@ "answer": { "kind": "resolution", "status": "definite", - "sentence": "Gross disbursements to Ethiopia from 95 providers for official development assistance in 2022. Current US dollars · OECD DAC2a. You asked for a ranking. This shows the amounts behind it, because Search does not compute rankings. Assumed: official development assistance.", + "sentence": "Net disbursements to Ethiopia from 96 providers for official development assistance in 2022. Current US dollars · OECD DAC2a. You asked for a ranking. This shows the amounts behind it, because Search does not compute rankings. Assumed: official development assistance.", "complete": true, "specs": [ - "spec_7778beed72f8433bb7fde4293acfd175" + "spec_67170941f9982e1b0525932d4b816168" ], "gaps": [] } @@ -4114,12 +4280,12 @@ "error": { "class": "SearchWarning", "code": null, - "trace_id": "6cfb1ed8ec3e430a91c10329304d9af4" + "trace_id": "fe5a5b819e9e43ce9cd95964ad1bfa28" } }, { "dataset": { - "rows": 95, + "rows": 96, "columns": [ "time_period", "financingProvider_label", @@ -4148,9 +4314,9 @@ "parts": [ "aid" ], - "spec_id": "spec_7778beed72f8433bb7fde4293acfd175", - "content_version": "cv_c17d6a131cb4556543b91556e46814e9", - "sentence": "Gross disbursements to Ethiopia from 95 providers for official development assistance in 2022. Current US dollars · OECD DAC2a." + "spec_id": "spec_67170941f9982e1b0525932d4b816168", + "content_version": "cv_219fc5386675dcca1fc91197c39ac885", + "sentence": "Net disbursements to Ethiopia from 96 providers for official development assistance in 2022. Current US dollars · OECD DAC2a." } ], "missing": [], diff --git a/python/client-contract/src/dfo_client_contract/scenarios/search-warning-top5.parquet b/python/client-contract/src/dfo_client_contract/scenarios/search-warning-top5.parquet index 91ee4cc..dd4bcb0 100644 Binary files a/python/client-contract/src/dfo_client_contract/scenarios/search-warning-top5.parquet and b/python/client-contract/src/dfo_client_contract/scenarios/search-warning-top5.parquet differ diff --git a/python/client-contract/src/dfo_client_contract/served/SOURCE.json b/python/client-contract/src/dfo_client_contract/served/SOURCE.json index 8d5b00b..b2a1b2d 100644 --- a/python/client-contract/src/dfo_client_contract/served/SOURCE.json +++ b/python/client-contract/src/dfo_client_contract/served/SOURCE.json @@ -1,6 +1,6 @@ { "format_version": 1, "repository": "DevelopmentFinanceObservatory/apis", - "commit": "d80df9f5fd598b7345255470932d202ee5d49942", + "commit": "ccb6617922c839ce3cd5615a3bbb65c70bfe1bde", "captured_from": "dfo_apis.app.create_app() in process" } diff --git a/python/client-contract/src/dfo_client_contract/served/openapi.json b/python/client-contract/src/dfo_client_contract/served/openapi.json index c5ab609..c7ecad7 100644 --- a/python/client-contract/src/dfo_client_contract/served/openapi.json +++ b/python/client-contract/src/dfo_client_contract/served/openapi.json @@ -1020,6 +1020,282 @@ } } }, + "/api/datasets/analysis": { + "post": { + "tags": [ + "Datasets" + ], + "summary": "Post Analysis", + "description": "Compute a recipe tree and store its frame. Answers the stored frame's format 2 ref,\n`pending` while a root builds, or the refusal with its fix.", + "operationId": "datasets_post_analysis", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/AnalysisRequest" + } + } + }, + "required": true + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/AnalysisReady" + } + } + } + }, + "202": { + "description": "Accepted", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/AnalysisPendingBody" + } + } + } + }, + "default": { + "description": "any non-2xx response uses this envelope", + "content": { + "application/problem+json": { + "schema": { + "$ref": "#/components/schemas/ProblemDetails" + } + } + } + }, + "400": { + "description": "the request body or parameters failed validation (request_invalid)", + "content": { + "application/problem+json": { + "schema": { + "$ref": "#/components/schemas/ProblemDetails" + } + } + } + } + } + } + }, + "/api/datasets/analysis/anchor": { + "post": { + "tags": [ + "Datasets" + ], + "summary": "Post Analysis Anchor", + "description": "The latest period of the roots over the populations, and the series it leaves\nout. Stores nothing.", + "operationId": "datasets_post_analysis_anchor", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/AnchorRequest" + } + } + }, + "required": true + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/AnchorAnswer" + } + } + } + }, + "default": { + "description": "any non-2xx response uses this envelope", + "content": { + "application/problem+json": { + "schema": { + "$ref": "#/components/schemas/ProblemDetails" + } + } + } + }, + "400": { + "description": "the request body or parameters failed validation (request_invalid)", + "content": { + "application/problem+json": { + "schema": { + "$ref": "#/components/schemas/ProblemDetails" + } + } + } + } + } + } + }, + "/api/datasets/derived/{id}/{content_version}": { + "get": { + "tags": [ + "Datasets" + ], + "summary": "Get Derived", + "description": "A derived frame's retention, recipe, roots, citation, resolved periods and the\nseries its steps left out for missing data.", + "operationId": "datasets_get_derived", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "title": "Id" + } + }, + { + "name": "content_version", + "in": "path", + "required": true, + "schema": { + "type": "string", + "title": "Content Version" + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/DerivedManifest" + } + } + } + }, + "default": { + "description": "any non-2xx response uses this envelope", + "content": { + "application/problem+json": { + "schema": { + "$ref": "#/components/schemas/ProblemDetails" + } + } + } + }, + "400": { + "description": "the request body or parameters failed validation (request_invalid)", + "content": { + "application/problem+json": { + "schema": { + "$ref": "#/components/schemas/ProblemDetails" + } + } + } + } + } + } + }, + "/api/datasets/derived/{id}/{content_version}/file": { + "get": { + "tags": [ + "Datasets" + ], + "summary": "Get Derived File", + "description": "The derived frame's rows as a file in the format and bundle the query names.", + "operationId": "datasets_get_derived_file", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "title": "Id" + } + }, + { + "name": "content_version", + "in": "path", + "required": true, + "schema": { + "type": "string", + "title": "Content Version" + } + }, + { + "name": "format", + "in": "query", + "required": false, + "description": "the file format; csv when absent", + "schema": { + "type": "string", + "enum": [ + "csv", + "xlsx", + "parquet" + ], + "default": "csv" + } + }, + { + "name": "bundle", + "in": "query", + "required": false, + "description": "true for a zip bundle with its documentation; true when absent", + "schema": { + "type": "boolean", + "default": true + } + }, + { + "name": "layout", + "in": "query", + "required": false, + "description": "frame for a bare parquet file in the frame layout; needs format=parquet and bundle=false", + "schema": { + "type": "string", + "enum": [ + "frame" + ] + } + } + ], + "responses": { + "200": { + "description": "the file's bytes", + "content": { + "application/octet-stream": { + "schema": { + "type": "string", + "format": "binary" + } + } + } + }, + "default": { + "description": "any non-2xx response uses this envelope", + "content": { + "application/problem+json": { + "schema": { + "$ref": "#/components/schemas/ProblemDetails" + } + } + } + }, + "400": { + "description": "the request body or parameters failed validation (request_invalid)", + "content": { + "application/problem+json": { + "schema": { + "$ref": "#/components/schemas/ProblemDetails" + } + } + } + } + } + } + }, "/api/datasets/frames/{spec_id}/{content_version}/recipe": { "put": { "tags": [ @@ -1756,7 +2032,7 @@ "Datasets" ], "summary": "Post Pin", - "description": "Pin an artifact of a version, and the first frame its files can render from that survives, servable or aged: the version's own frame, else, for a derived version, its base version's frame. Every format then stays fetchable and the version reports `retention.pinned`. When no such frame's bytes survive, the named artifact still pins, and `retention` keeps the frames' `held_until`. Only the named artifact's copy waits on the daily pin budget; the frame copy skips it and counts toward later calls, so one pin can add up to two copies to the count.", + "description": "Pin an artifact of a version, and the first frame its files can render from that survives, servable or aged: the version's own frame, else, for a derived version, its base version's frame. Every format then stays fetchable and the version reports `retention.pinned`. When no such frame's bytes survive, the named artifact still pins, and `retention` keeps the frames' `held_until`. Only the named artifact's copy spends the daily pin budget, and the frame copy spends none. A caller without the pin grant also spends one unit of its daily pin allowance on a new copy, within a daily budget shared by every such caller; a repeat pin of an artifact already pinned spends nothing.", "operationId": "datasets_post_pin", "parameters": [ { @@ -1874,12 +2150,118 @@ } } }, - "/api/graph/healthz": { - "get": { + "/api/datasets/exports": { + "post": { "tags": [ - "Graph" + "Datasets" ], - "summary": "Get Health", + "summary": "Post Export", + "description": "Prepare one exact frame version as a file in the pinned tier and answer its facts\nand its link's path. A frame of a dataset id alone exports that dataset's newest\nversion, which the answer's `frame` names. A repeat request answers the same facts and\nspends nothing. A new pinned copy spends one unit of the caller's daily pin\nallowance.", + "operationId": "datasets_post_export", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ExportRequestBody" + } + } + }, + "required": true + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ExportResponse" + } + } + } + }, + "default": { + "description": "any non-2xx response uses this envelope", + "content": { + "application/problem+json": { + "schema": { + "$ref": "#/components/schemas/ProblemDetails" + } + } + } + }, + "400": { + "description": "the request body or parameters failed validation (request_invalid)", + "content": { + "application/problem+json": { + "schema": { + "$ref": "#/components/schemas/ProblemDetails" + } + } + } + } + } + } + }, + "/api/datasets/exports/{export_id}": { + "get": { + "tags": [ + "Datasets" + ], + "summary": "Get Export", + "description": "Redirect to the export's file, signed for five minutes. Renders nothing.", + "operationId": "datasets_get_export", + "parameters": [ + { + "name": "export_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "title": "Export Id" + } + } + ], + "responses": { + "302": { + "description": "a redirect to the artifact's bytes", + "headers": { + "Location": { + "description": "a GET URL signed for at most five minutes", + "schema": { + "type": "string" + } + } + } + }, + "default": { + "description": "any non-2xx response uses this envelope", + "content": { + "application/problem+json": { + "schema": { + "$ref": "#/components/schemas/ProblemDetails" + } + } + } + }, + "400": { + "description": "the request body or parameters failed validation (request_invalid)", + "content": { + "application/problem+json": { + "schema": { + "$ref": "#/components/schemas/ProblemDetails" + } + } + } + } + } + } + }, + "/api/graph/healthz": { + "get": { + "tags": [ + "Graph" + ], + "summary": "Get Health", "operationId": "graph_get_health", "responses": { "200": { @@ -3144,6 +3526,101 @@ } } }, + "/api/presentation/frames/{spec_id}": { + "get": { + "tags": [ + "Presentation" + ], + "summary": "Get Newest Frame", + "operationId": "presentation_get_newest_frame", + "parameters": [ + { + "name": "spec_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "title": "Spec Id" + } + }, + { + "name": "dimension", + "in": "query", + "required": false, + "schema": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Dimension" + } + }, + { + "name": "query", + "in": "query", + "required": false, + "schema": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Query" + } + } + ], + "responses": { + "200": { + "description": "Neither `dimension` nor `query` given returns the frame's structural view. `dimension` alone returns that one dimension's full value list. `query` alone returns every dimension filtered to values matching the query. `dimension` and `query` together return that one dimension's values filtered to the query. The frame is the newest version of the dataset `spec_id` names, the version the analysis runner reads for a Spec root; `spec_id` and `content_version` name it. The view reads that version's canonical frame, as the pair route does, so it holds no default enrichment column, and a `dimension` naming one refuses `binding_invalid`.", + "content": { + "application/json": { + "schema": { + "anyOf": [ + { + "$ref": "#/components/schemas/NewestFrameStructuralViewResponse" + }, + { + "$ref": "#/components/schemas/NewestFrameDimensionValuesResponse" + }, + { + "$ref": "#/components/schemas/NewestFrameFilteredViewResponse" + } + ], + "title": "Response 200 Presentation Get Newest Frame" + } + } + } + }, + "default": { + "description": "any non-2xx response uses this envelope", + "content": { + "application/problem+json": { + "schema": { + "$ref": "#/components/schemas/ProblemDetails" + } + } + } + }, + "400": { + "description": "the request body or parameters failed validation (request_invalid)", + "content": { + "application/problem+json": { + "schema": { + "$ref": "#/components/schemas/ProblemDetails" + } + } + } + } + } + } + }, "/api/presentation/release": { "get": { "tags": [ @@ -3175,21 +3652,74 @@ } } }, - "/codes/{code}": { + "/api/presentation/shares": { + "post": { + "tags": [ + "Presentation" + ], + "summary": "Create Share", + "description": "Publish cards as a share: one slot per card, a live link (latest=true) that follows new data or a snapshot (latest=false) that keeps the versions its cards draw now. Every card's frame is pinned. Spends one unit of the caller's daily share allowance, and one unit of its daily pin allowance and of the shared pin budgets for each new pinned copy. The reply's write_token grants replacing and deleting the share.", + "operationId": "presentation_create_share", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CreateShareBody" + } + } + }, + "required": true + }, + "responses": { + "201": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SharedResponse" + } + } + } + }, + "default": { + "description": "any non-2xx response uses this envelope", + "content": { + "application/problem+json": { + "schema": { + "$ref": "#/components/schemas/ProblemDetails" + } + } + } + }, + "400": { + "description": "the request body or parameters failed validation (request_invalid)", + "content": { + "application/problem+json": { + "schema": { + "$ref": "#/components/schemas/ProblemDetails" + } + } + } + } + } + } + }, + "/api/presentation/shares/{share_id}": { "get": { "tags": [ - "Codes" + "Presentation" ], - "summary": "Get Code", - "operationId": "codes_get_code", + "summary": "Read Share", + "description": "Read a share: its kind, mode, title, latest revision, slots and the website's payload. Any origin may read it. It omits the write token.", + "operationId": "presentation_read_share", "parameters": [ { - "name": "code", + "name": "share_id", "in": "path", "required": true, "schema": { "type": "string", - "title": "Code" + "title": "Share Id" } } ], @@ -3199,7 +3729,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/CodeRegistryEntry" + "$ref": "#/components/schemas/ShareReadResponse" } } } @@ -3225,510 +3755,3040 @@ } } } - } - } - }, - "components": { - "schemas": { - "AggregateNode": { - "properties": { - "ref": { - "type": "string", - "title": "Ref", - "description": "the node's dcid" - }, - "label": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" + }, + "put": { + "tags": [ + "Presentation" + ], + "summary": "Replace Share", + "description": "Give a live share new cards under the same URLs, as its next revision. Slot n shows the nth card, and slots past the last card stay empty. Needs the share's write token in x-dfo-write-token. A snapshot refuses share_not_replaceable. Each new pinned copy spends one unit of the caller's daily pin allowance and of the shared pin budgets.", + "operationId": "presentation_replace_share", + "parameters": [ + { + "name": "share_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "title": "Share Id" + } + }, + { + "name": "x-dfo-write-token", + "in": "header", + "required": false, + "schema": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "X-Dfo-Write-Token" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ShareCardsBody" + } + } + } + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ShareWriteResponse" + } + } + } + }, + "default": { + "description": "any non-2xx response uses this envelope", + "content": { + "application/problem+json": { + "schema": { + "$ref": "#/components/schemas/ProblemDetails" + } + } + } + }, + "400": { + "description": "the request body or parameters failed validation (request_invalid)", + "content": { + "application/problem+json": { + "schema": { + "$ref": "#/components/schemas/ProblemDetails" + } + } + } + } + } + }, + "delete": { + "tags": [ + "Presentation" + ], + "summary": "Delete Share", + "description": "Take a share down. Needs the share's write token in x-dfo-write-token.", + "operationId": "presentation_delete_share", + "parameters": [ + { + "name": "share_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "title": "Share Id" + } + }, + { + "name": "x-dfo-write-token", + "in": "header", + "required": false, + "schema": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "X-Dfo-Write-Token" + } + } + ], + "responses": { + "204": { + "description": "Successful Response" + }, + "default": { + "description": "any non-2xx response uses this envelope", + "content": { + "application/problem+json": { + "schema": { + "$ref": "#/components/schemas/ProblemDetails" + } + } + } + }, + "400": { + "description": "the request body or parameters failed validation (request_invalid)", + "content": { + "application/problem+json": { + "schema": { + "$ref": "#/components/schemas/ProblemDetails" + } + } + } + } + } + } + }, + "/api/presentation/shares/{share_id}/snapshot": { + "post": { + "tags": [ + "Presentation" + ], + "summary": "Post Share Snapshot", + "description": "Turn a live share into a snapshot under the same URLs. Each slot keeps the frame it serves now, pinned. Needs the share's write token in x-dfo-write-token. A snapshot answers as it is. No route turns a snapshot live. Each new pinned copy spends one unit of the caller's daily pin allowance and of the shared pin budgets.", + "operationId": "presentation_post_share_snapshot", + "parameters": [ + { + "name": "share_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "title": "Share Id" + } + }, + { + "name": "x-dfo-write-token", + "in": "header", + "required": false, + "schema": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "X-Dfo-Write-Token" + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ShareWriteResponse" + } + } + } + }, + "default": { + "description": "any non-2xx response uses this envelope", + "content": { + "application/problem+json": { + "schema": { + "$ref": "#/components/schemas/ProblemDetails" + } + } + } + }, + "400": { + "description": "the request body or parameters failed validation (request_invalid)", + "content": { + "application/problem+json": { + "schema": { + "$ref": "#/components/schemas/ProblemDetails" + } + } + } + } + } + } + }, + "/api/presentation/shares/{share_id}/import": { + "put": { + "tags": [ + "Presentation" + ], + "summary": "Put Share Import", + "description": "Store one of the website's shares under its own id, for the website's share migration job. Admits the share import principal alone. The body is the share's export line less its id, plus write_token_sha256. Pins the frames the share shows, spending no allowance. 201 when stored, 200 when an earlier import stored it.", + "operationId": "presentation_put_share_import", + "parameters": [ + { + "name": "share_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "title": "Share Id" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ShareImport" + } + } + } + }, + "responses": { + "201": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ShareImportResponse" + } + } + } + }, + "200": { + "description": "An earlier import stored this share, which is left as it is.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ShareImportResponse" + } + } + } + }, + "default": { + "description": "any non-2xx response uses this envelope", + "content": { + "application/problem+json": { + "schema": { + "$ref": "#/components/schemas/ProblemDetails" + } + } + } + }, + "400": { + "description": "the request body or parameters failed validation (request_invalid)", + "content": { + "application/problem+json": { + "schema": { + "$ref": "#/components/schemas/ProblemDetails" + } + } + } + } + } + } + }, + "/api/presentation/shares/{share_id}/history": { + "get": { + "tags": [ + "Presentation" + ], + "summary": "Read Share History", + "description": "What each of the share's slots showed, newest first, a page of up to limit entries (default 100) at a time: every frame it served, with its retention counted from when DFO stored it and whether it is still fetchable, and an entry with a null card and frame from when a replace left the slot empty. next names the following page's cursor, to send as before, and is null on the last page. Any origin may read it.", + "operationId": "presentation_read_share_history", + "parameters": [ + { + "name": "share_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "title": "Share Id" + } + }, + { + "name": "limit", + "in": "query", + "required": false, + "schema": { + "type": "integer", + "maximum": 500, + "minimum": 1, + "description": "the most entries the page holds, 1 to 500", + "default": 100, + "title": "Limit" + }, + "description": "the most entries the page holds, 1 to 500" + }, + { + "name": "before", + "in": "query", + "required": false, + "schema": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "description": "the `next` cursor of the previous page; the page continues after that page's last entry", + "title": "Before" + }, + "description": "the `next` cursor of the previous page; the page continues after that page's last entry" + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ShareHistoryResponse" + } + } + } + }, + "default": { + "description": "any non-2xx response uses this envelope", + "content": { + "application/problem+json": { + "schema": { + "$ref": "#/components/schemas/ProblemDetails" + } + } + } + }, + "400": { + "description": "the request body or parameters failed validation (request_invalid)", + "content": { + "application/problem+json": { + "schema": { + "$ref": "#/components/schemas/ProblemDetails" + } + } + } + } + } + } + }, + "/api/presentation/shares/{share_id}/slots/{slot}": { + "get": { + "tags": [ + "Presentation" + ], + "summary": "Read Share Slot Card", + "description": "Read the card a share's slot shows, drawn on the frame the slot serves. That is a snapshot's recorded frame, or a live slot's newest data, checked at most every 15 minutes, as the slot's data route chooses it.", + "operationId": "presentation_read_share_slot_card", + "parameters": [ + { + "name": "share_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "title": "Share Id" + } + }, + { + "name": "slot", + "in": "path", + "required": true, + "schema": { + "type": "integer", + "minimum": 1, + "title": "Slot" + } + }, + { + "name": "if-none-match", + "in": "header", + "required": false, + "schema": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "If-None-Match" + } + } + ], + "responses": { + "200": { + "description": "The slot's card as a component read states it, drawn on the frame the slot's data route serves, with that frame's retention and the freshness. x-dfo-freshness and a live slot's x-dfo-checked-at are the data route's. A strong ETag answers If-None-Match with 304. Any origin may read it.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ShareSlotCardResponse" + } + } + } + }, + "304": { + "description": "The If-None-Match ETag still names this card." + }, + "default": { + "description": "any non-2xx response uses this envelope", + "content": { + "application/problem+json": { + "schema": { + "$ref": "#/components/schemas/ProblemDetails" + } + } + } + }, + "400": { + "description": "the request body or parameters failed validation (request_invalid)", + "content": { + "application/problem+json": { + "schema": { + "$ref": "#/components/schemas/ProblemDetails" + } + } + } + } + } + } + }, + "/api/presentation/shares/{share_id}/slots/{slot}/data": { + "get": { + "tags": [ + "Presentation" + ], + "summary": "Read Share Slot Data", + "description": "Read the rows a share's slot serves. The frame is a snapshot's recorded frame, or a live slot's newest data, checked at most every 15 minutes.", + "operationId": "presentation_read_share_slot_data", + "parameters": [ + { + "name": "share_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "title": "Share Id" + } + }, + { + "name": "slot", + "in": "path", + "required": true, + "schema": { + "type": "integer", + "minimum": 1, + "title": "Slot" + } + }, + { + "name": "format", + "in": "query", + "required": false, + "schema": { + "$ref": "#/components/schemas/SlotFormat", + "default": "json" + } + }, + { + "name": "bundle", + "in": "query", + "required": false, + "schema": { + "type": "boolean", + "default": false, + "title": "Bundle" + } + }, + { + "name": "if-none-match", + "in": "header", + "required": false, + "schema": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "If-None-Match" + } + } + ], + "responses": { + "200": { + "description": "The rows behind the slot's card. JSON (the default) states the slot, its card and frame and the freshness beside the rows; csv, xlsx and parquet are the card's data file, and bundle=true serves the components data route's zip around it. x-dfo-freshness states current, stale or pending, and a live slot's x-dfo-checked-at when DFO last checked for newer data. A strong ETag answers If-None-Match with 304. Any origin may read it.", + "content": { + "application/zip": {}, + "text/csv": {}, + "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet": {}, + "application/vnd.apache.parquet": {}, + "application/json": { + "schema": { + "$ref": "#/components/schemas/ShareSlotDataResponse" + } + } + } + }, + "304": { + "description": "The If-None-Match ETag still names these rows." + }, + "default": { + "description": "any non-2xx response uses this envelope", + "content": { + "application/problem+json": { + "schema": { + "$ref": "#/components/schemas/ProblemDetails" + } + } + } + }, + "400": { + "description": "the request body or parameters failed validation (request_invalid)", + "content": { + "application/problem+json": { + "schema": { + "$ref": "#/components/schemas/ProblemDetails" + } + } + } + } + } + } + }, + "/codes/{code}": { + "get": { + "tags": [ + "Codes" + ], + "summary": "Get Code", + "operationId": "codes_get_code", + "parameters": [ + { + "name": "code", + "in": "path", + "required": true, + "schema": { + "type": "string", + "title": "Code" + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CodeRegistryEntry" + } + } + } + }, + "default": { + "description": "any non-2xx response uses this envelope", + "content": { + "application/problem+json": { + "schema": { + "$ref": "#/components/schemas/ProblemDetails" + } + } + } + }, + "400": { + "description": "the request body or parameters failed validation (request_invalid)", + "content": { + "application/problem+json": { + "schema": { + "$ref": "#/components/schemas/ProblemDetails" + } + } + } + } + } + } + } + }, + "components": { + "schemas": { + "AggregateNode": { + "properties": { + "ref": { + "type": "string", + "title": "Ref", + "description": "the node's dcid" + }, + "label": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Label", + "description": "the node's name; for a Provenance, its parent Dataset's name where it has one. Null, and named in gaps, when the graph gives none" + }, + "types": { + "items": { + "type": "string" + }, + "type": "array", + "title": "Types", + "description": "the node's typeOf values, as the graph holds them" + }, + "description": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Description", + "description": "the node's prose in the graph; null when it has none" + }, + "links": { + "additionalProperties": { + "type": "string" + }, + "propertyNames": { + "enum": [ + "codes", + "children", + "members", + "countries", + "datasets", + "variables", + "facets" + ] + }, + "type": "object", + "title": "Links", + "description": "each list relation the node has, mapped to its route; empty when none" + }, + "gaps": { + "items": { + "type": "string" + }, + "type": "array", + "title": "Gaps", + "description": "the member path of every value this door cannot know" + }, + "built_from": { + "additionalProperties": { + "type": "string" + }, + "propertyNames": { + "enum": [ + "code_index", + "origin_catalogue", + "coverage_index", + "membership" + ] + }, + "type": "object", + "title": "Built From", + "description": "the build of each table the response read" + }, + "kind": { + "type": "string", + "const": "aggregate", + "title": "Kind", + "default": "aggregate" + }, + "aggregate": { + "$ref": "#/components/schemas/PartyBlock" + } + }, + "type": "object", + "required": [ + "ref", + "label", + "types", + "description", + "links", + "gaps", + "built_from", + "kind", + "aggregate" + ], + "title": "AggregateNode" + }, + "AidCounts": { + "properties": { + "donors": { + "type": "integer", + "title": "Donors", + "description": "distinct donors: countries and organisations, leaving out the parties that total other donors (DAC countries, the G7)" + }, + "recipients": { + "type": "integer", + "title": "Recipients", + "description": "distinct recipients: countries, organisations and the residuals no country holds (Africa, unallocated by country), leaving out the parties that total other recipients (Africa, Total)" + }, + "years": { + "anyOf": [ + { + "$ref": "#/components/schemas/YearRange" + }, + { + "type": "null" + } + ], + "description": "the years with aid data; null when none" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "donors", + "recipients", + "years" + ], + "title": "AidCounts", + "description": "Counts over the coverage index's rows of the declared datasets." + }, + "AmbiguousEntityCandidate": { + "properties": { + "ref": { + "type": "string", + "title": "Ref", + "description": "the candidate's own dcid" + }, + "label": { + "type": "string", + "title": "Label", + "description": "the candidate's display name" + }, + "kind": { + "type": "string", + "title": "Kind", + "description": "the candidate's entity kind: country, continent, subregion, continental_union, organisation, aggregate, place_other, or other" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "ref", + "label", + "kind" + ], + "title": "AmbiguousEntityCandidate", + "description": "One graph node an ambiguous query wording could name -- one entry of\nan AmbiguousEntityGroup's own `candidates`. Mirrors engine.region.result.\nAmbiguousEntityCandidate field-for-field, with `label` in place of that\ndataclass's `name` (this contract's own vocabulary for a display\nstring, matching ResolvedEntity.label), except that it omits `group_node`\nand `group_name`, which only NoData.options read." + }, + "AmbiguousEntityGroup": { + "properties": { + "text": { + "type": "string", + "title": "Text", + "description": "the ambiguous query wording; equals some restatement.entities[i].text on the same part" + }, + "candidates": { + "items": { + "$ref": "#/components/schemas/AmbiguousEntityCandidate" + }, + "type": "array", + "title": "Candidates", + "description": "the graph candidates this wording could name -- 2+ from a real Ambiguous resolution, by construction of the resolver's own Ambiguous outcome (2+ candidates graph-confirm and none can be preferred); not constrained to a minimum here since region.AmbiguousEntity, this field's own engine-side source, carries no such constraint of its own" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "text", + "candidates" + ], + "title": "AmbiguousEntityGroup", + "description": "One query wording Ambiguous resolved to more than one graph\ncandidate, paired with the candidates it could name -- one entry of\nNoData.ambiguous_entities." + }, + "AmbiguousSourceCandidate": { + "properties": { + "ref": { + "type": "string", + "title": "Ref", + "description": "the source's reference, which a client posts back as a SourceMention's ref" + }, + "label": { + "type": "string", + "title": "Label", + "description": "the source's display name in the origin catalogue" + }, + "kind": { + "type": "string", + "enum": [ + "provenance", + "dataset", + "source" + ], + "title": "Kind", + "description": "what the reference names: a provenance, a catalogue Dataset, or a publishing Source" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "ref", + "label", + "kind" + ], + "title": "AmbiguousSourceCandidate", + "description": "One reading of an ambiguous source wording -- one entry of an\nAmbiguousSourceGroup's own `candidates`." + }, + "AmbiguousSourceGroup": { + "properties": { + "text": { + "type": "string", + "title": "Text", + "description": "the ambiguous wording; equals some restatement.sources[i].text on the part, or its restatement.source_code for source_code_ambiguous" + }, + "candidates": { + "items": { + "$ref": "#/components/schemas/AmbiguousSourceCandidate" + }, + "type": "array", + "title": "Candidates", + "description": "the admitted sources this wording names, two or more: provenances first, then datasets and sources" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "text", + "candidates" + ], + "title": "AmbiguousSourceGroup", + "description": "One source wording that names two or more unrelated admitted sources, paired with\nthe sources it could name -- one entry of NoData.ambiguous_sources." + }, + "AnalysisPendingBody": { + "properties": { + "status": { + "type": "string", + "const": "pending", + "title": "Status", + "default": "pending" + }, + "retry_after_s": { + "type": "number", + "title": "Retry After S" + }, + "operations": { + "items": { + "type": "string" + }, + "type": "array", + "title": "Operations", + "description": "the queued rebuilds the run waits on" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "retry_after_s", + "operations" + ], + "title": "AnalysisPendingBody" + }, + "AnalysisReady": { + "properties": { + "status": { + "type": "string", + "const": "ready", + "title": "Status", + "default": "ready" + }, + "ref": { + "additionalProperties": { + "$ref": "#/components/schemas/JsonValue" + }, + "type": "object", + "title": "Ref", + "description": "the format 2 DatasetRef naming the frame" + }, + "frame_content_version": { + "type": "string", + "pattern": "^cv_[0-9a-f]{32}$", + "title": "Frame Content Version" + }, + "output_digest": { + "type": "string", + "pattern": "^out_[0-9a-f]{32}$", + "title": "Output Digest" + }, + "summary": { + "additionalProperties": { + "$ref": "#/components/schemas/JsonValue" + }, + "type": "object", + "title": "Summary", + "description": "the facts of the tree's top step: the verb, its canonical parameters, the result's shape and exclusions, and the engine result's own fields" + }, + "rows": { + "type": "integer", + "minimum": 0.0, + "title": "Rows" + }, + "role_keys": { + "items": { + "type": "string" + }, + "type": "array", + "title": "Role Keys" + }, + "stat_var_count": { + "type": "integer", + "minimum": 0.0, + "title": "Stat Var Count" + }, + "exclusions": { + "items": { + "additionalProperties": { + "$ref": "#/components/schemas/JsonValue" + }, + "type": "object" + }, + "type": "array", + "title": "Exclusions" + }, + "time": { + "additionalProperties": { + "$ref": "#/components/schemas/JsonValue" + }, + "type": "object", + "title": "Time" + }, + "execution_identity": { + "additionalProperties": { + "type": "string" + }, + "type": "object", + "title": "Execution Identity" + }, + "resolved_periods": { + "items": { + "additionalProperties": { + "$ref": "#/components/schemas/JsonValue" + }, + "type": "object" + }, + "type": "array", + "title": "Resolved Periods", + "description": "each period the recipe states relative to the latest, with its period" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "ref", + "frame_content_version", + "output_digest", + "summary", + "rows", + "role_keys", + "stat_var_count", + "exclusions", + "time", + "execution_identity", + "resolved_periods" + ], + "title": "AnalysisReady", + "description": "The stored frame of a computed tree." + }, + "AnalysisRequest": { + "properties": { + "tree": { + "oneOf": [ + { + "$ref": "#/components/schemas/StepNode" + }, + { + "$ref": "#/components/schemas/DerivedRoot" + } + ], + "title": "Tree" + }, + "latest": { + "type": "boolean", + "title": "Latest", + "default": false + }, + "rolling": { + "anyOf": [ + { + "type": "string", + "const": "tree" + }, + { + "type": "null" + } + ], + "title": "Rolling" + }, + "anchor_roots": { + "anyOf": [ + { + "items": { + "oneOf": [ + { + "$ref": "#/components/schemas/SpecRoot" + }, + { + "$ref": "#/components/schemas/DatasetRoot" + } + ] + }, + "type": "array", + "maxItems": 64, + "minItems": 1 + }, + { + "type": "null" + } + ], + "title": "Anchor Roots" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "tree" + ], + "title": "AnalysisRequest", + "description": "`POST /api/datasets/analysis`: the tree to compute, and whether its roots follow their\ndatasets' newest versions. A `tree` that is a derived root alone computes that frame's\nstored recipe again, so `latest` reads it on its datasets' newest versions under the\nrecipe's own ids. `rolling` `\"tree\"` takes the populations and the latest period of every\nrolling overlay a derived root's recipe holds from the whole tree, so derived rolling inputs\nare computed again under one latest period. Left out, each keeps its stored populations and\nperiods." + }, + "AnchorAnswer": { + "properties": { + "period": { + "type": "string", + "title": "Period" + }, + "rule": { + "type": "string", + "title": "Rule" + }, + "left_out": { + "items": { + "$ref": "#/components/schemas/LeftOutSeriesBody" + }, + "type": "array", + "title": "Left Out" + }, + "roots": { + "items": { + "additionalProperties": { + "type": "string" + }, + "type": "object" + }, + "type": "array", + "title": "Roots", + "description": "the dataset versions the period was taken over" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "period", + "rule", + "left_out", + "roots" + ], + "title": "AnchorAnswer" + }, + "AnchorRequest": { + "properties": { + "roots": { + "items": { + "oneOf": [ + { + "$ref": "#/components/schemas/SpecRoot" + }, + { + "$ref": "#/components/schemas/DatasetRoot" + } + ] + }, + "type": "array", + "maxItems": 64, + "minItems": 1, + "title": "Roots" + }, + "populations": { + "items": { + "additionalProperties": { + "$ref": "#/components/schemas/JsonValue" + }, + "type": "object" + }, + "type": "array", + "minItems": 1, + "title": "Populations" + }, + "latest": { + "type": "boolean", + "title": "Latest", + "default": false + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "roots", + "populations" + ], + "title": "AnchorRequest", + "description": "`POST /api/datasets/analysis/anchor`: the roots and populations a latest period is\ntaken over." + }, + "AppliedDefaultModel": { + "properties": { + "pointer": { + "type": "string", + "title": "Pointer", + "description": "a JSON Pointer to the intent field this default fills" + }, + "detail": { + "type": "string", + "title": "Detail", + "description": "what the component chose and how to narrow it, in plain language" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "pointer", + "detail" + ], + "title": "AppliedDefaultModel", + "description": "One `fact_summary.defaults[]` entry: a choice the component made where its intent\nleft one open. An entity-mode bar_chart whose select lists no values draws every value\nof its one varying dimension, largest first." + }, + "ArtifactEntryModel": { + "properties": { + "artifact_digest": { + "type": "string", + "title": "Artifact Digest" + }, + "rendering": { + "additionalProperties": true, + "type": "object", + "title": "Rendering", + "description": "the rendering that produced the bytes: the request options of a requested file, {\"statistics\": \"series\"} for the series statistics, or {\"format\": \"frame\"} for the version's canonical frame, a Parquet file of the frame as minted" + }, + "bytes": { + "type": "integer", + "title": "Bytes" + }, + "media_type": { + "type": "string", + "title": "Media Type" + }, + "created_at": { + "type": "string", + "title": "Created At" + }, + "tier": { + "type": "string", + "title": "Tier" + }, + "url": { + "type": "string", + "title": "Url", + "description": "the artifact's stable download link, `/api/datasets/{id}/{content_version}/files/{artifact_digest}`, relative to the API host. It never expires: each request checks the version and answers 302 to a signed URL valid for five minutes, or refuses snapshot_revoked once the version is taken down" + }, + "enrichment_stamp": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Enrichment Stamp", + "description": "the digest of the code index's party kinds, classes and whole-total markers this file's party cells ({role}_kind, or {role}_party_kind, {role}_party_class and {role}_party_whole) were read under. Present on a file whose frame holds a party role and whose layout writes party cells (a long-layout file, or one whose columns name a party field), when it was rendered under the serving code index. Absent on every other file, including a pinned or older-layout file rendered under an earlier index, whose kinds may be out of date. A caller naming a frame by this file's rendering adds the stamp to the name, so a change to a party's kind names a new frame" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "artifact_digest", + "rendering", + "bytes", + "media_type", + "created_at", + "tier", + "url" + ], + "title": "ArtifactEntryModel" + }, + "Assumption": { + "properties": { + "kind": { + "type": "string", + "enum": [ + "name_corrected", + "declared_default", + "open_role", + "place_scope" + ], + "title": "Kind", + "description": "what the engine filled. 'name_corrected' is an entity the request typed in words that are no listed name or alias of it, such as a misspelling, read as that entity. 'declared_default' is a slot the request left open that its code system's or shape's declared default fixed. 'open_role' is a flow role no request word asked for, read across every entity on it with data, as one series per member where the role scope default filled it and the shape declares the role, else as the total over them. 'place_scope' is a request that named no place, read across every place with data" + }, + "binding_ref": { + "type": "string", + "maxLength": 1036, + "title": "Binding Ref", + "description": "the identity binding whose edit replaces this assumption: 'how:' for a declared default, 'origin:' or 'where:' for a role, the place scope or the role a corrected name binds, as on the sentence's own tokens" + }, + "text": { + "type": "string", + "maxLength": 200, + "minLength": 1, + "title": "Text", + "description": "the words the sentence's assumptions clause states for this fill: the typed words in quotes and the entity's label for a corrected name ('\"Germny\" read as Germany'), the bound code's full label for a declared default ('official development assistance' for CRSTypeOfFlow10, whose short name is 'ODA'), 'every' and the role's noun in the answer's flow family for an open role ('every provider', 'every creditor'), and 'every country', 'every place' or 'the world as a whole' for the place scope, as its members are typed" + }, + "refs": { + "items": { + "type": "string", + "maxLength": 1024 + }, + "type": "array", + "maxItems": 1, + "title": "Refs", + "description": "the value dcid a declared default bound its slot to, as the slot's trace.slot_filters[].refs list it (['CRSTypeOfFlow10'] for official development assistance), or the entity dcid a corrected name reads (['country/DEU']). An open role and the place scope carry []. A dataset_resubmit echo matches a declared default to its slot, and a corrected name to its role's entity, by these values" + }, + "asked": { + "anyOf": [ + { + "type": "string", + "maxLength": 200, + "minLength": 1 + }, + { + "type": "null" + } + ], + "title": "Asked", + "description": "the words the request typed for a corrected name ('Germny'), which `text` quotes; absent on every other kind. A dataset_resubmit echo restates a corrected name with these words, and drops one that carries none" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "kind", + "binding_ref", + "text" + ], + "title": "Assumption", + "description": "One value the answer filled that its request did not ask for, stated for people\nin `text` and for code in `kind`, `binding_ref` and `refs`.\n\nAssumptions live on the part (`_PartBase.assumptions`), and a candidates part holds\neach shown reading's own list as well (`CandidatesPart.reading_assumptions`), the one\na client echoes on a dataset_resubmit after picking that reading. The sentence that\ncarries the part closes with them as one clause: \"Assumed: official development\nassistance; every provider.\"" + }, + "Authority": { + "properties": { + "name": { + "type": "string", + "title": "Name" + }, + "version": { + "type": "string", + "title": "Version" + } + }, + "type": "object", + "required": [ + "name", + "version" + ], + "title": "GraphMembershipAuthority", + "description": "Where a membership's rows come from, with the data version that reproduces them." + }, + "Availability": { + "properties": { + "scope": { + "type": "string", + "const": "dfo", + "title": "Scope", + "default": "dfo" + }, + "summary": { + "$ref": "#/components/schemas/AvailabilitySummary" + }, + "default": { + "anyOf": [ + { + "$ref": "#/components/schemas/AvailabilityDefault" + }, + { + "type": "null" + } + ], + "description": "null when no facet dispatches a request naming nothing" + }, + "sources": { + "items": { + "$ref": "#/components/schemas/SourceAvailability" + }, + "type": "array", + "title": "Sources" + }, + "more_sources": { + "type": "integer", + "title": "More Sources", + "description": "the sources past the first ten" + } + }, + "type": "object", + "required": [ + "scope", + "summary", + "default", + "sources", + "more_sources" + ], + "title": "GraphAvailability", + "description": "Where DFO holds observations of a variable. `sources: []` means it verifiably holds\nnone." + }, + "AvailabilityDefault": { + "properties": { + "facets": { + "items": { + "type": "string" + }, + "type": "array", + "title": "Facets", + "description": "the facet ids the request is served, in order" + }, + "source": { + "anyOf": [ + { + "$ref": "#/components/schemas/AvailabilitySource" + }, + { + "type": "null" + } + ] + }, + "unit": { + "anyOf": [ + { + "$ref": "#/components/schemas/NodeRef" + }, + { + "type": "null" + } + ] + }, + "measurement_method": { + "anyOf": [ + { + "$ref": "#/components/schemas/NodeRef" + }, + { + "type": "null" + } + ] + }, + "observation_period": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Observation Period" + }, + "first_year": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "First Year" + }, + "last_year": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Last Year" + }, + "places": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ], + "title": "Places", + "description": "null for a role-bearing variable" + }, + "without_data": { + "type": "integer", + "title": "Without Data", + "description": "the places, or parties, holding the variable that the default leaves without data" + } + }, + "type": "object", + "required": [ + "facets", + "source", + "unit", + "measurement_method", + "observation_period", + "first_year", + "last_year", + "places", + "without_data" + ], + "title": "GraphAvailabilityDefault", + "description": "What a data request naming no place, years or facet receives." + }, + "AvailabilitySource": { + "properties": { + "ref": { + "type": "string", + "title": "Ref" + }, + "label": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Label" + }, + "documentation": { + "type": "string", + "title": "Documentation", + "description": "the path of the provenance's source document" + } + }, + "type": "object", + "required": [ + "ref", + "label", + "documentation" + ], + "title": "GraphAvailabilitySource", + "description": "A source that holds the variable: its provenance, labelled with the catalogue's name." + }, + "AvailabilitySummary": { + "properties": { + "places": { + "anyOf": [ + { + "additionalProperties": { + "type": "integer" + }, + "type": "object" + }, + { + "type": "null" + } + ], + "title": "Places", + "description": "the places covered by kind; null for a role-bearing variable, and while the places' kinds are unread (a transient gap)" + }, + "entities": { + "anyOf": [ + { + "additionalProperties": { + "$ref": "#/components/schemas/EntityCounts" + }, + "type": "object" + }, + { + "type": "null" + } + ], + "title": "Entities", + "description": "the entities covered per graph role; null for any other variable" + }, + "first_year": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "First Year" + }, + "last_year": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Last Year" + }, + "sources": { + "type": "integer", + "title": "Sources" + }, + "facets": { + "type": "integer", + "title": "Facets" + } + }, + "type": "object", + "required": [ + "places", + "entities", + "first_year", + "last_year", + "sources", + "facets" + ], + "title": "GraphAvailabilitySummary", + "description": "The variable across every source." + }, + "BareExportFrame": { + "properties": { + "spec_id": { + "type": "string", + "pattern": "^spec_[0-9a-f]{32}$", + "title": "Spec Id" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "spec_id" + ], + "title": "BareExportFrame", + "description": "A dataset named by its id alone, which stands for its newest version\n(`resolve_export_frame`)." + }, + "BaseIdentity": { + "properties": { + "identity_version": { + "type": "string", + "const": "spec1", + "title": "Identity Version", + "description": "the identity domain separator this Spec was hashed under", + "default": "spec1" + }, + "shape": { + "oneOf": [ + { + "$ref": "#/components/schemas/IdentityShapeSchema" + }, + { + "$ref": "#/components/schemas/IdentityShapePin" + } + ], + "title": "Shape", + "description": "the shape this Spec was hashed under", + "discriminator": { + "propertyName": "kind", + "mapping": { + "stat_var": "#/components/schemas/IdentityShapePin", + "statvar_schema": "#/components/schemas/IdentityShapeSchema" + } + } + }, + "slots": { + "items": { + "$ref": "#/components/schemas/IdentitySlot" + }, + "type": "array", + "maxItems": 64, + "title": "Slots", + "description": "the what/how slots that feed identity -- where/when/source are excluded. A what/how property the identity leaves out is one no member it serves asserts: an identity over a family with no total carries only the slots the request binds or opens, or its one breakdown, so a member asserting any other is excluded" + }, + "entities": { + "additionalProperties": { + "items": { + "type": "string", + "maxLength": 1024 + }, + "type": "array", + "maxItems": 1024, + "minItems": 1 + }, + "type": "object", + "maxProperties": 16, + "title": "Entities", + "description": "the bound entities, keyed by role (observationAbout/origin/destination); {} when none were bound -- always present, never omitted. A role that appears carries at least one dcid: the identity core refuses a role with zero members, so an empty list must not be expressible here" + }, + "requested_window": { + "oneOf": [ + { + "$ref": "#/components/schemas/IdentityWindowAll" + }, + { + "$ref": "#/components/schemas/IdentityWindowLatest" + }, + { + "$ref": "#/components/schemas/IdentityWindowRange" + } + ], + "title": "Requested Window", + "description": "the requested date window this Spec was hashed under; always present -- {\"kind\": \"all\"} means no date was requested at all", + "discriminator": { + "propertyName": "kind", + "mapping": { + "all": "#/components/schemas/IdentityWindowAll", + "latest": "#/components/schemas/IdentityWindowLatest", + "range": "#/components/schemas/IdentityWindowRange" + } + } + }, + "facets": { + "anyOf": [ + { + "additionalProperties": { + "oneOf": [ + { + "$ref": "#/components/schemas/IdentityBindingValue" + }, + { + "$ref": "#/components/schemas/IdentityBindingSet" + }, + { + "$ref": "#/components/schemas/IdentityFacetValueRequest" + }, + { + "$ref": "#/components/schemas/IdentityFacetValueAbsent" + } + ] + }, + "type": "object" + }, + { + "type": "null" + } + ], + "title": "Facets", + "description": "sparse facet bindings (provenance/measurementMethod/unit); omitted entirely when no facet axis is bound, never an empty object. A facet axis that appears is bound -- value, set, or (unit axis only) the request form -- never unbound: the identity core refuses an unbound facet binding state, since a sparse map omits what is not bound rather than carrying it as unbound" + }, + "open_roles": { + "anyOf": [ + { + "items": { + "$ref": "#/components/schemas/RoleAxis" + }, + "type": "array" + }, + { + "type": "null" + } + ], + "title": "Open Roles", + "description": "the flow axes asked for member by member (every creditor, every donor), sorted and de-duplicated; omitted when none is. A role absent from both entities and open_roles asks for the total over that role. An open role is never also an entities key, and a pinned shape (kind='stat_var') carries none" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "shape", + "slots", + "requested_window" + ], + "title": "BaseIdentity", + "description": "The spec1 identity-core projection document for one Spec: exactly what\ngets hashed to produce its spec_id, serialised once and echoed back\nverbatim -- never re-derived by a second, parallel implementation.\n\nEvery Spec carries one, on `Spec.definition.identity` (see\n`SpecDefinition`). A dataset_resubmit identity entry posts a prior Spec's own\n`definition.identity` byte-for-byte as its edited `identity`. Directional\nentities live directly in `identity.entities.origin` and\n`identity.entities.destination`. StatVar members are graph state, derived from the\nidentity, and no member here.\n\nThe document is hashed whole. `\"spec_\"` plus the first 32 hex digits of\nthe SHA-256 of its RFC 8785 serialisation, with null members omitted, is\nthe Spec's spec_id." + }, + "Binding": { + "properties": { + "provenance": { + "type": "string", + "title": "Provenance" + }, + "measurementMethod": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Measurementmethod" + }, + "unit": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Unit" + } + }, + "type": "object", + "required": [ + "provenance", + "measurementMethod", + "unit" + ], + "title": "GraphAvailabilityBinding", + "description": "The `scope.facets` values that request a series from Datasets, in its leading unit." + }, + "BindingSet": { + "properties": { + "kind": { + "type": "string", + "const": "set", + "title": "Kind", + "description": "binding kind discriminator", + "default": "set" + }, + "values": { + "items": { + "$ref": "#/components/schemas/SlotValue" + }, + "type": "array", + "minItems": 2, + "title": "Values", + "description": "two or more members, all in scope (a union)" + }, + "set_ref": { + "anyOf": [ + { + "$ref": "#/components/schemas/GraphRef" + }, + { + "type": "null" + } + ], + "description": "the group the set was drawn from, when one exists" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "values" + ], + "title": "BindingSet", + "description": "A slot bound to two or more taxonomy members, all in scope." + }, + "BindingUnbound": { + "properties": { + "kind": { + "type": "string", + "const": "unbound", + "title": "Kind", + "description": "explicit whole slot in scope, NOT null/missing", + "default": "unbound" + } + }, + "additionalProperties": false, + "type": "object", + "title": "BindingUnbound", + "description": "A slot explicitly open to the whole slot in scope, NOT null or missing." + }, + "BindingValue": { + "properties": { + "kind": { + "type": "string", + "const": "value", + "title": "Kind", + "description": "binding kind discriminator", + "default": "value" + }, + "value": { + "$ref": "#/components/schemas/SlotValue", + "description": "exactly one taxonomy member" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "value" + ], + "title": "BindingValue", + "description": "A slot bound to exactly one taxonomy member." + }, + "BreadthDim": { + "properties": { + "label": { + "type": "string", + "title": "Label", + "description": "the dimension, e.g. providers, years, methods, sources" + }, + "count": { + "type": "integer", + "title": "Count", + "description": "e.g. 36, 22, 3" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "label", + "count" + ], + "title": "BreadthDim", + "description": "One breadth dimension with its cardinality." + }, + "BundleOptionModel": { + "properties": { + "state": { + "type": "string", + "title": "State" + }, + "reason": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Reason" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "state" + ], + "title": "BundleOptionModel" + }, + "CandidateSet": { + "properties": { + "ordering": { + "type": "string", + "enum": [ + "broadest_first", + "intent_rank" + ], + "title": "Ordering", + "description": "how `specs` below is ordered -- see the two orderings described above" + }, + "max_candidates": { + "type": "integer", + "title": "Max Candidates", + "description": "the maximum number of candidates applied" + }, + "specs": { + "items": { + "$ref": "#/components/schemas/Spec", + "description": "the resolved Spec answering this part. Parts whose specs share a spec_id are one reading of the data, the same series, entities and years. A later part that folds into an earlier part's spec carries binding_folded. A part posted with separate: true never folds and keeps its own part, so two separate parts can carry one spec_id by request. Parts sharing a spec_id can differ in assumptions, so a client never dedupes parts by spec_id" + }, + "type": "array", + "minItems": 2, + "title": "Specs", + "description": "2 <= len <= max_candidates; full Specs, ordered per `ordering` above" + }, + "truncated": { + "type": "boolean", + "title": "Truncated", + "description": "false when every eligible, semantically distinct candidate shape found for this query is present in specs; true when the engine's own candidate budget dropped an eligible shape before it could be considered, or max_candidates itself cut the ordered list short" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "ordering", + "max_candidates", + "specs", + "truncated" + ], + "title": "CandidateSet", + "description": "A set of 2..N competing Specs, presented in the order named by ``ordering``.\n\n``ordering=\"intent_rank\"``: the order the status rule offers the readings in. A first\nanswer always uses it. The elected reading comes first, then its rivals in menu order,\neach stating why it is offered (``ResolvedSpec.basis``). Where the elected reading holds\nno data and several siblings differing from it only on the measurement qualifier do,\nthose siblings are the set, in menu order, without it. Where a place named without a\ndirection holds data under both, the elected reading under each direction is offered.\n\n``ordering=\"broadest_first\"``: a posted candidates entry that names it\n(``ResubmitCandidatesEntry``) keeps its posted order and states this ordering back. No\nfirst answer uses it.\n\nEach candidate carries its own heading and byline inside its own\n``resolved.rendered_sentence``/``resolved.sentence_plan``. There is no separate parallel sentence array, and a\ncandidate's Spec is a returned Spec like any other. The part's own\nsentence opens with how many readings there are and states, for each\nshown candidate, the source and span that set it apart." + }, + "CandidatesPart": { + "properties": { + "variable_text": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Variable Text", + "description": "the variable text this part answers, in the order asked. This part's position in Resolution.parts equals the same variable_index every SSE event keyed by variable_index uses (ShapeEvent, StepEvent, SentenceEvent). Every dataset_resubmit entry kind (identity, candidates, placeholder, and parsed through its nested ParsedPart) requires its own posted variable_text, so this field is always the posted text echoed back onto the rebuilt part, never null. Null only when the whole posted query was empty or whitespace-only (raw_text door), which refuses variable_not_resolved before extraction runs and so has no text to name." + }, + "separate": { + "type": "boolean", + "title": "Separate", + "description": "true when this part was asked beside the others to be compared with them. A client resubmitting an identity, candidate set, or placeholder posts this flag on that entry to preserve the comparison. Two parts marked separate that resolve to one reading carry the same spec_id and stay two parts. False, the default, is omitted", + "default": false + }, + "warnings": { + "items": { + "$ref": "#/components/schemas/Warning" + }, + "type": "array", + "title": "Warnings", + "description": "this part's own run-health signals. A part folded into an earlier part's spec (see DefinitePart.spec) carries binding_folded alone. The merged spec's own resolved warnings live only on the first part that carries it. An unfolded part carries the warnings raised while resolving this part, plus observations_omitted on a candidates part when response_options.include_observations was set." + }, + "timing_ms": { + "anyOf": [ + { + "$ref": "#/components/schemas/Timing" + }, + { + "type": "null" + } + ], + "description": "this part's own latency breakdown, where by_step names only the phases this part ran and total sums them, leaving out the shape_* stages nested inside shape. Excludes the shared, once-per-request steps (e.g. extract), which diagnostics.timing_ms.by_step carries once for the whole request; distinct too from diagnostics.timing_ms.total, the whole request's wall-clock elapsed time." + }, + "rendered_sentence": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Rendered Sentence", + "description": "a human-readable string. For candidates, a header naming how many readings there are ('3 readings.'), then each shown candidate's heading and a byline led by the source and span that set it apart; for no_data, a heading in the same claim form naming the entity, measure, and counterpart that were checked. Either ends with the text of this part's departures, in order, and a candidates part's then closes with its assumptions clause. For a definite part this stays null or omitted: the confirmation sentence (heading and byline) lives at spec.resolved.rendered_sentence, and its departures reach the envelope's composed sentence." + }, + "sentence_plan": { + "anyOf": [ + { + "items": { + "$ref": "#/components/schemas/SentenceToken" + }, + "type": "array" + }, + { + "type": "null" + } + ], + "title": "Sentence Plan", + "description": "the ordered token form of rendered_sentence, present whenever it is. For a definite part this stays null or omitted. spec.resolved.sentence_plan carries the confirmation sentence's own plan instead." + }, + "restatement": { + "anyOf": [ + { + "$ref": "#/components/schemas/ParsedPart" + }, + { + "type": "null" + } + ], + "description": "the ParsedPart that reproduces this part's own resolution inputs -- the same entities, resolved time window, unit text, and source text the engine actually used to resolve this one leg -- so a client holding this part alone can copy it straight into a fresh ParsedInput.parts entry and re-resolve it faithfully, without flattening it into the whole query's variable_text the way variable_text alone would. Canonical, not verbatim: for a raw_text part, time_text is the equivalent phrase this door's own time grammar recognises (e.g. '2015 to 2020'), not the user's original words, since the engine's date extraction keeps only the structured window and discards the phrasing. Null whenever this part has no faithful echo to give. On a dataset_resubmit entry's identity/candidates/placeholder kinds, which post an identity or stub rather than a phrase and have no per-part resolution inputs to echo -- a dataset_resubmit parsed entry, genuinely re-resolved from its own posted ParsedPart, carries a real one like any parsed-door part. Also null when this leg's entity was bound to a directional role axis (origin/destination) and no door-supplied role named that axis, since an echo without the axis would resubmit the request with that entity reversed. Also null when one of this leg's own inputs does not fit ParsedPart's own field caps, since a truncated echo would misrepresent what was actually resolved." + }, + "entity_refs": { + "items": { + "$ref": "#/components/schemas/EntityRefs" + }, + "type": "array", + "title": "Entity Refs", + "description": "the binding of each entity of `restatement`, one per restatement.entities row, in row order, so a client can tell which node a text such as 'G7' bound. A response field kept off `restatement`, which posts back unchanged. The binding is the one the answer reads: for a candidates part, the elected reading's; for a part folded into an earlier part's spec, its own. [] when `restatement` is null or names no entity" + }, + "operations": { + "items": { + "$ref": "#/components/schemas/Operation" + }, + "type": "array", + "title": "Operations", + "description": "the operations the question asks for over this part's data, in query order; the engine echoes them onto the part it resolves. Empty when the question asks for none" + }, + "departures": { + "items": { + "$ref": "#/components/schemas/Departure" + }, + "type": "array", + "title": "Departures", + "description": "every way this part's answer differs from what its request asked, ordered by how much each changes the number: closest_match, measure_not_applied, operation_not_applied, breakdown_not_applied, entity_unavailable, member_unavailable, year_unavailable, modelled_values, group_read_as_members, whole_total_read, whole_total_unpublished, direction_discarded, direction_inferred, scope_limited. [] when the answer is what was asked. A client that renders its own sentence reads them here; each one's text also closes the sentence that carries this part (see Departure.text). A warning on the same part reports run health and stays separate" + }, + "assumptions": { + "items": { + "$ref": "#/components/schemas/Assumption" + }, + "type": "array", + "title": "Assumptions", + "description": "every value the engine filled that the request did not ask for, in clause order. Declared defaults come first, in the order of the Spec's trace.slot_filters, then open roles, then the place scope. A declared default is a slot the request left open that its code system's or shape's declared default fixed, named by the bound code's full label. An open role is a flow role no request word asked for, read across every entity on it with data. It is either a role the role scope default filled (resolved.scope on that axis), whatever its member count, served as one series per member where the shape declares the role, or a role the heading states with no entity of its own ('from 164 providers', 'owed to all creditors'), served as the total over its members. A role the identity binds in entities or lists in open_roles, that one of the part's operations runs over ('top 5 donors'), or that the request's words asked every member of ('all donors'), is asked. The place scope is a request that named no place, read across every place with data. Every door fills assumptions. A definite part reads them from its Spec, a candidates part carries the items every list in CandidatesPart.reading_assumptions holds alike, text included, and no_data and unsupported parts carry []. A dataset_resubmit identity entry posts every slot bound, so its part states the items of the entry's assumptions echo that still hold (see ResubmitIdentityEntry.assumptions), and a candidates entry reads each reading with its candidate's echo (see ResubmitCandidate.assumptions). The sentence that carries this part closes with them as one segment='assumption' clause ('Assumed: official development assistance; every provider.'), after its departures. [] when the answer fills nothing" + }, + "status": { + "type": "string", + "const": "candidates", + "title": "Status", + "description": "this part's variable was genuinely ambiguous" + }, + "candidates": { + "$ref": "#/components/schemas/CandidateSet", + "description": "2..N competing Specs" + }, + "reading_assumptions": { + "additionalProperties": { + "items": { + "$ref": "#/components/schemas/Assumption" + }, + "type": "array" + }, + "type": "object", + "title": "Reading Assumptions", + "description": "each shown reading's own assumptions, keyed by its Spec's spec_id (candidates.specs[].spec_id). Each list is the one a definite part answering that Spec for this part's request carries, read with the part's operations and the axes the request's words asked every member of. The part's own assumptions are the items every list here holds alike, text included, so an open role one reading reads, or an item two readings word differently ('every provider' against 'every creditor'), is stated here alone. A client that picks a reading posts its identity as a dataset_resubmit identity entry and echoes reading_assumptions[spec_id] as the entry's assumptions, so the picked answer states what that reading assumed. A client that edits the set echoes each reading's entry as its candidate's assumptions. [] for a reading that assumes nothing" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "status", + "candidates" + ], + "title": "CandidatesPart", + "description": "This part's variable was genuinely ambiguous; two or more distinct specs compete." + }, + "CanonicalDefinition": { + "properties": { + "schema_version": { + "type": "integer", + "const": 1, + "title": "Schema Version", + "description": "the wire version this definition was written under" + }, + "spec_id": { + "type": "string", + "title": "Spec Id", + "description": "the caller-supplied spec_id this definition must hash to" + }, + "identity": { + "additionalProperties": true, + "type": "object", + "title": "Identity", + "description": "the identity-core document, shaped as search.models.identity.BaseIdentity and published at GET /api/search/schema" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "schema_version", + "spec_id", + "identity" + ], + "title": "CanonicalDefinition", + "description": "One canonical definition, exactly as the contract shapes it: the wire\nversion it was written under, its own spec_id (required -- the register\ndoor always verifies a supplied id, never mints one for a definition),\nand its identity-core document." + }, + "CapabilitiesResponse": { + "properties": { + "capability_version": { + "type": "string", + "title": "Capability Version", + "description": "a content hash over every capability-bearing field of the release this deployment serves" + }, + "catalog_version": { + "type": "string", + "title": "Catalog Version", + "description": "the catalogue release this deployment serves" + }, + "build": { + "type": "string", + "title": "Build", + "description": "the commit sha the image was built from, the same value the x-dfo-commit response header carries" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "capability_version", + "catalog_version", + "build" + ], + "title": "CapabilitiesResponse", + "description": "`GET /api/presentation/capabilities`'s body. It carries this\nsurface's own hashed `capability_version` beside the unhashed\n`catalog_version`." + }, + "CapabilityDefaultPolicy": { + "properties": { + "name": { + "type": "string", + "title": "Name", + "description": "the declared default policy's name" + }, + "live": { + "type": "boolean", + "title": "Live", + "description": "whether this deployment honours the declared default" + }, + "default": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "null" + } + ], + "title": "Default", + "description": "the current default value, when this policy is a boolean toggle" + } + }, + "type": "object", + "required": [ + "name", + "live" + ], + "title": "CapabilityDefaultPolicy", + "description": "One declared default policy: whether it is live, and its current\ndefault value when it is a simple boolean toggle." + }, + "CapabilityFormat": { + "properties": { + "name": { + "type": "string", + "title": "Name", + "description": "csv, xlsx, or parquet" + }, + "live": { + "type": "boolean", + "title": "Live", + "description": "whether this deployment can render this format" + } + }, + "type": "object", + "required": [ + "name", + "live" + ], + "title": "CapabilityFormat", + "description": "One output rendering's liveness in this deployment." + }, + "CapabilityKind": { + "properties": { + "name": { + "type": "string", + "title": "Name", + "description": "spec_id or statvar_set" + }, + "live": { + "type": "boolean", + "title": "Live", + "description": "whether this deployment's mint door dispatches this kind" + } + }, + "type": "object", + "required": [ + "name", + "live" + ], + "title": "CapabilityKind", + "description": "One mint-request `kind`'s liveness in this deployment." + }, + "CatalogueAnswer": { + "properties": { + "schema_version": { + "type": "integer", + "const": 1, + "title": "Schema Version", + "description": "contract schema version; exactly 1 for v1. Required on every response.", + "default": 1 + }, + "query_echo": { + "$ref": "#/components/schemas/QueryEcho", + "description": "what the response was understood to be answering" + }, + "diagnostics": { + "$ref": "#/components/schemas/Diagnostics", + "description": "run health, warnings, timing, build stamp" + }, + "kind": { + "type": "string", + "const": "catalogue", + "title": "Kind", + "description": "discriminator for a response to a question about what DFO holds", + "default": "catalogue" + }, + "scope": { + "$ref": "#/components/schemas/Scope-Output", + "description": "the place the question named, when it named a country" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "query_echo", + "diagnostics", + "scope", + "kind" + ], + "title": "CatalogueAnswer", + "description": "A resolve response to a question that asks what DFO holds and names\nneither an indicator nor a subject, such as \"what data do you have?\". It\ncarries the country the question named, when the resolver confirms one." + }, + "CatalogueExampleSentence": { + "properties": { + "text": { + "type": "string", + "title": "Text", + "description": "the template filled with the place's name" + }, + "template": { + "type": "string", + "title": "Template", + "description": "the sentence with a {place} slot" + }, + "stat_var": { + "type": "string", + "title": "Stat Var", + "description": "the StatVar the sentence resolves to" + }, + "place": { + "type": "string", + "title": "Place", + "description": "the country dcid the sentence is filled with" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "text", + "template", + "stat_var", + "place" + ], + "title": "CatalogueExampleSentence", + "description": "An example sentence a client offers and runs as a query." + }, + "CatalogueResponse": { + "properties": { + "catalogue_version": { + "type": "string", + "title": "Catalogue Version", + "description": "the published build this body comes from" + }, + "counts": { + "anyOf": [ + { + "$ref": "#/components/schemas/Counts" + }, + { + "$ref": "#/components/schemas/PlaceCounts" } ], - "title": "Label", - "description": "the node's name; for a Provenance, its parent Dataset's name where it has one. Null, and named in gaps, when the graph gives none" + "title": "Counts", + "description": "global counts, or the counts at the requested place" + }, + "examples": { + "items": { + "$ref": "#/components/schemas/CatalogueExampleSentence" + }, + "type": "array", + "title": "Examples" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "catalogue_version", + "counts", + "examples" + ], + "title": "CatalogueResponse", + "description": "What DFO holds and example sentences to ask of it." + }, + "Cause": { + "description": "The `cause` extension: why a refusal fired, beneath its own top-level\n`code` -- present only on a refusal that carries one (`recipe_not_declared`,\n`rate_coverage_gap`, `operation_failed`, or a Presentation refusal of a frame). On\n`operation_failed`, `code` is the failed operation's refusal code, and on a\nframe's refusal the reason the frame does not load. Mirrors `alternatives`/`truncated`'s\nown extension style: `entities` names what the cause concerns (entity or\n`entity@year` keys), capped, with `truncated` set when the cap cut items\nshort.", + "properties": { + "code": { + "description": "the cause code: a sub-cause such as nominal_undeclared, recipe_undeclared, or rate_missing, on operation_failed the failed operation's own refusal code, or on a Presentation refusal of a frame the reason the frame does not load", + "title": "Code", + "type": "string" + }, + "entities": { + "description": "the entity or entity@year keys this cause concerns, in the order given, capped at 10; empty for a cause that names no entity", + "items": { + "type": "string" + }, + "maxItems": 10, + "title": "Entities", + "type": "array" + }, + "truncated": { + "default": false, + "description": "true when the entities cap cut items short", + "title": "Truncated", + "type": "boolean" + } + }, + "required": [ + "code" + ], + "title": "Cause", + "type": "object" + }, + "ChangeEntry": { + "properties": { + "kind": { + "type": "string", + "enum": [ + "added", + "changed", + "deprecated", + "removed", + "fixed", + "security" + ], + "title": "Kind", + "description": "the Keep a Changelog group the change sits under" }, - "types": { - "items": { - "type": "string" - }, - "type": "array", - "title": "Types", - "description": "the node's typeOf values, as the graph holds them" + "note": { + "type": "string", + "title": "Note", + "description": "the change, as CommonMark" + } + }, + "type": "object", + "required": [ + "kind", + "note" + ], + "title": "ChangeEntry", + "description": "One change in a release." + }, + "ChangeModel": { + "properties": { + "kind": { + "type": "string", + "title": "Kind", + "description": "the Keep a Changelog group, lowercase: added, changed, deprecated, removed, fixed or security" }, - "description": { + "note": { + "type": "string", + "title": "Note", + "description": "the change, as CommonMark" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "kind", + "note" + ], + "title": "ChangeModel", + "description": "One change in a release of a source's DFO pipeline." + }, + "ChangedFieldModel": { + "properties": { + "field": { + "type": "string", + "title": "Field", + "description": "the intent field this entry reports" + }, + "prior": { "anyOf": [ - { - "type": "string" - }, + {}, { "type": "null" } ], - "title": "Description", - "description": "the node's prose in the graph; null when it has none" + "title": "Prior", + "description": "the field's value before the write, for a disclosed scalar" }, - "links": { - "additionalProperties": { - "type": "string" - }, - "propertyNames": { - "enum": [ - "codes", - "children", - "members", - "countries", - "datasets", - "variables", - "facets" - ] - }, - "type": "object", - "title": "Links", - "description": "each list relation the node has, mapped to its route; empty when none" + "new": { + "anyOf": [ + {}, + { + "type": "null" + } + ], + "title": "New", + "description": "the field's value after the write, for a disclosed scalar" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "field" + ], + "title": "ChangedFieldModel", + "description": "One entry of `changed[]`. `prior` and `new` are present only for a\nscalar field the write set changed. An array or object field carries\n`field` alone." + }, + "Choice": { + "properties": { + "chosen": { + "$ref": "#/components/schemas/StepRef" }, - "gaps": { + "others": { "items": { - "type": "string" + "$ref": "#/components/schemas/StepRef" }, "type": "array", - "title": "Gaps", - "description": "the member path of every value this door cannot know" + "maxItems": 32, + "title": "Others" }, - "built_from": { - "additionalProperties": { - "type": "string" - }, - "propertyNames": { - "enum": [ - "code_index", - "origin_catalogue", - "coverage_index", - "membership" - ] + "ranking": { + "items": { + "type": "string", + "pattern": "^[a-z][a-z0-9_]{0,63}$" }, - "type": "object", - "title": "Built From", - "description": "the build of each table the response read" - }, + "type": "array", + "maxItems": 8, + "minItems": 1, + "title": "Ranking" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "chosen", + "others", + "ranking" + ], + "title": "Choice", + "description": "A choice of source at mint: the source chosen, the others it was chosen over, and the\nranking it applied, in order." + }, + "ChoiceOrigin": { + "properties": { "kind": { "type": "string", - "const": "aggregate", + "const": "choice", "title": "Kind", - "default": "aggregate" + "default": "choice" }, - "aggregate": { - "$ref": "#/components/schemas/PartyBlock" + "choice_id": { + "type": "string", + "maxLength": 256, + "minLength": 1, + "title": "Choice Id", + "description": "the ScopeChoice.id the switch was made on" } }, + "additionalProperties": false, "type": "object", "required": [ - "ref", - "label", - "types", - "description", - "links", - "gaps", - "built_from", - "kind", - "aggregate" + "choice_id" ], - "title": "AggregateNode" + "title": "ChoiceOrigin", + "description": "The scope choice an entry was switched on." }, - "AidCounts": { + "CitationModel": { "properties": { - "donors": { - "type": "integer", - "title": "Donors", - "description": "distinct donors: countries and organisations, leaving out the parties that total other donors (DAC countries, the G7)" + "text": { + "type": "string", + "title": "Text" + }, + "sources": { + "items": { + "$ref": "#/components/schemas/CitationSource" + }, + "type": "array", + "title": "Sources" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "text", + "sources" + ], + "title": "CitationModel" + }, + "CitationSource": { + "properties": { + "ref": { + "type": "string", + "title": "Ref" + }, + "label": { + "type": "string", + "title": "Label" + }, + "processing_level": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Processing Level" + }, + "license": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "License" + }, + "license_type": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "License Type" + }, + "license_url": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "License Url" + }, + "url": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Url" }, - "recipients": { - "type": "integer", - "title": "Recipients", - "description": "distinct recipients: countries, organisations and the residuals no country holds (Africa, unallocated by country), leaving out the parties that total other recipients (Africa, Total)" + "source": { + "anyOf": [ + { + "$ref": "#/components/schemas/CitedSourceNode" + }, + { + "type": "null" + } + ] }, - "years": { + "data_commons": { "anyOf": [ { - "$ref": "#/components/schemas/YearRange" + "$ref": "#/components/schemas/CitedDataCommons" }, { "type": "null" } - ], - "description": "the years with aid data; null when none" + ] + }, + "documentation": { + "anyOf": [ + { + "$ref": "#/components/schemas/CitedDocumentation" + }, + { + "type": "null" + } + ] } }, "additionalProperties": false, "type": "object", "required": [ - "donors", - "recipients", - "years" + "ref", + "label" ], - "title": "AidCounts", - "description": "Counts over the coverage index's rows of the declared datasets." + "title": "CitationSource", + "description": "One cited source, named through\n`materialise.provenance_doc.read_source_citations`. `label`, `url`,\n`source`, `data_commons`, the licence fields and `documentation` come\nfrom the origin catalogue where it lists `ref`, and from the graph\notherwise: `license` is the licence's label, `license_type` its\n`licenseType` dcid and `license_url` its terms page. `license`, `license_type`,\n`license_url` and `url` are `None` where neither the catalogue nor the graph declares one. `source`\nand `data_commons` are `None` for a ref the catalogue does not list.\n`documentation` is the source's documentation at first mint, `None` when\nnothing documents the source or its graph read failed. A mint\nleaves a stored citation as it is. A bundle render fills every field but\n`ref`, `label` and `processing_level` that is `None` from a live read for\nthat render only (`datasets_api.manifest.healed_citation`), and every set\nfield wins." }, - "AmbiguousEntityCandidate": { + "CitedDataCommons": { "properties": { - "ref": { + "id": { "type": "string", - "title": "Ref", - "description": "the candidate's own dcid" + "enum": [ + "dfo", + "base", + "un_system" + ], + "title": "Id" }, "label": { "type": "string", - "title": "Label", - "description": "the candidate's display name" - }, - "kind": { - "type": "string", - "title": "Kind", - "description": "the candidate's entity kind: country, continent, subregion, continental_union, organisation, aggregate, place_other, or other" + "title": "Label" } }, "additionalProperties": false, "type": "object", "required": [ - "ref", - "label", - "kind" + "id", + "label" ], - "title": "AmbiguousEntityCandidate", - "description": "One graph node an ambiguous query wording could name -- one entry of\nan AmbiguousEntityGroup's own `candidates`. Mirrors engine.region.result.\nAmbiguousEntityCandidate field-for-field, with `label` in place of that\ndataclass's `name` (this contract's own vocabulary for a display\nstring, matching ResolvedEntity.label), except that it omits `group_node`\nand `group_name`, which only NoData.options read." + "title": "CitedDataCommons", + "description": "The Data Commons that serves a cited provenance." }, - "AmbiguousEntityGroup": { + "CitedDocumentation": { "properties": { - "text": { - "type": "string", - "title": "Text", - "description": "the ambiguous query wording; equals some restatement.entities[i].text on the same part" + "publisher": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Publisher", + "description": "the publishing organisation" }, - "candidates": { + "description": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Description", + "description": "what the source holds" + }, + "source_data_url": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Source Data Url", + "description": "where the raw data downloads from" + }, + "attribution": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Attribution", + "description": "the citation text the publisher asks for, verbatim" + }, + "update_cadence": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Update Cadence", + "description": "how often the source updates, as display text such as 'Quarterly'; an unrecognised ISO 8601 duration passes through as stored" + }, + "last_update": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Last Update", + "description": "the date of the DFO's last refresh of the source" + }, + "years_covered": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Years Covered", + "description": "YYYY or YYYY-YYYY" + }, + "granularity": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Granularity", + "description": "such as 'Annual, by provider and recipient'" + }, + "currencies": { "items": { - "$ref": "#/components/schemas/AmbiguousEntityCandidate" + "type": "string" }, "type": "array", - "title": "Candidates", - "description": "the graph candidates this wording could name -- 2+ from a real Ambiguous resolution, by construction of the resolver's own Ambiguous outcome (2+ candidates graph-confirm and none can be preferred); not constrained to a minimum here since region.AmbiguousEntity, this field's own engine-side source, carries no such constraint of its own" - } - }, - "additionalProperties": false, - "type": "object", - "required": [ - "text", - "candidates" - ], - "title": "AmbiguousEntityGroup", - "description": "One query wording Ambiguous resolved to more than one graph\ncandidate, paired with the candidates it could name -- one entry of\nNoData.ambiguous_entities." - }, - "AmbiguousSourceCandidate": { - "properties": { - "ref": { - "type": "string", - "title": "Ref", - "description": "the source's reference, which a client posts back as a SourceMention's ref" - }, - "label": { - "type": "string", - "title": "Label", - "description": "the source's display name in the origin catalogue" + "title": "Currencies", + "description": "sorted ISO 4217 codes of the source's currencies" }, - "kind": { - "type": "string", - "enum": [ - "provenance", - "dataset", - "source" - ], - "title": "Kind", - "description": "what the reference names: a provenance, a catalogue Dataset, or a publishing Source" - } - }, - "additionalProperties": false, - "type": "object", - "required": [ - "ref", - "label", - "kind" - ], - "title": "AmbiguousSourceCandidate", - "description": "One reading of an ambiguous source wording -- one entry of an\nAmbiguousSourceGroup's own `candidates`." - }, - "AmbiguousSourceGroup": { - "properties": { - "text": { - "type": "string", - "title": "Text", - "description": "the ambiguous wording; equals some restatement.sources[i].text on the part, or its restatement.source_code for source_code_ambiguous" + "transformation_log": { + "items": { + "$ref": "#/components/schemas/TransformationStepModel" + }, + "type": "array", + "title": "Transformation Log" }, - "candidates": { + "version_history": { "items": { - "$ref": "#/components/schemas/AmbiguousSourceCandidate" + "$ref": "#/components/schemas/ReleaseModel" }, "type": "array", - "title": "Candidates", - "description": "the admitted sources this wording names, two or more: provenances first, then datasets and sources" + "title": "Version History", + "description": "the DFO pipeline's releases, newest first" } }, "additionalProperties": false, "type": "object", - "required": [ - "text", - "candidates" - ], - "title": "AmbiguousSourceGroup", - "description": "One source wording that names two or more unrelated admitted sources, paired with\nthe sources it could name -- one entry of NoData.ambiguous_sources." + "title": "CitedDocumentation", + "description": "A cited source's documentation at first mint, read by\n`materialise.provenance_doc.read_provenance_doc`, the reader behind\n`GET /api/graph/documentation/{ref}`. Each member is `None` or empty where the graph\ndocuments nothing." }, - "AppliedDefaultModel": { + "CitedSourceNode": { "properties": { - "pointer": { + "ref": { "type": "string", - "title": "Pointer", - "description": "a JSON Pointer to the intent field this default fills" + "title": "Ref" }, - "detail": { + "label": { "type": "string", - "title": "Detail", - "description": "what the component chose and how to narrow it, in plain language" + "title": "Label" } }, "additionalProperties": false, "type": "object", "required": [ - "pointer", - "detail" + "ref", + "label" ], - "title": "AppliedDefaultModel", - "description": "One `fact_summary.defaults[]` entry: a choice the component made where its intent\nleft one open. An entity-mode bar_chart whose select lists no values draws every value\nof its one varying dimension, largest first." + "title": "CitedSourceNode", + "description": "The Data Commons `Source` node behind a cited provenance. On the UN\nSystem Data Commons it is the agency provenance itself." }, - "ArtifactEntryModel": { + "CodeBlock": { "properties": { - "artifact_digest": { - "type": "string", - "title": "Artifact Digest" - }, - "rendering": { - "additionalProperties": true, - "type": "object", - "title": "Rendering", - "description": "the rendering that produced the bytes: the request options of a requested file, {\"statistics\": \"series\"} for the series statistics, or {\"format\": \"frame\"} for the version's canonical frame, a Parquet file of the frame as minted" - }, - "bytes": { - "type": "integer", - "title": "Bytes" - }, - "media_type": { - "type": "string", - "title": "Media Type" - }, - "created_at": { - "type": "string", - "title": "Created At" + "code_system": { + "anyOf": [ + { + "$ref": "#/components/schemas/NodeRef" + }, + { + "type": "null" + } + ], + "description": "the system's graph node, such as `CRSPurposeCodeEnum`" }, - "tier": { + "property": { "type": "string", - "title": "Tier" + "title": "Property", + "description": "the constraint property the code is a value of" }, - "url": { + "code": { "type": "string", - "title": "Url", - "description": "the artifact's stable download link, `/api/datasets/{id}/{content_version}/files/{artifact_digest}`, relative to the API host. It never expires: each request checks the version and answers 302 to a signed URL valid for five minutes, or refuses snapshot_revoked once the version is taken down" + "title": "Code" }, - "enrichment_stamp": { + "parent": { "anyOf": [ { - "type": "string" + "$ref": "#/components/schemas/NodeRef" }, { "type": "null" } ], - "title": "Enrichment Stamp", - "description": "the digest of the code index's party kinds, classes and whole-total markers this file's party cells ({role}_kind, or {role}_party_kind, {role}_party_class and {role}_party_whole) were read under. Present on a file whose frame holds a party role and whose layout writes party cells (a long-layout file, or one whose columns name a party field), when it was rendered under the serving code index. Absent on every other file, including a pinned or older-layout file rendered under an earlier index, whose kinds may be out of date. A caller naming a frame by this file's rendering adds the stamp to the name, so a change to a party's kind names a new frame" + "description": "the code it specialises; null for a root" + }, + "synonyms": { + "items": { + "type": "string" + }, + "type": "array", + "title": "Synonyms" } }, - "additionalProperties": false, "type": "object", "required": [ - "artifact_digest", - "rendering", - "bytes", - "media_type", - "created_at", - "tier", - "url" + "code_system", + "property", + "code", + "parent", + "synonyms" ], - "title": "ArtifactEntryModel" + "title": "GraphCodeBlock", + "description": "A code's detail block." }, - "Assumption": { + "CodeItem": { "properties": { - "kind": { + "ref": { "type": "string", - "enum": [ - "name_corrected", - "declared_default", - "open_role", - "place_scope" - ], - "title": "Kind", - "description": "what the engine filled. 'name_corrected' is an entity the request typed in words that are no listed name or alias of it, such as a misspelling, read as that entity. 'declared_default' is a slot the request left open that its code system's or shape's declared default fixed. 'open_role' is a flow role no request word asked for, read across every entity on it with data, as one series per member where the role scope default filled it and the shape declares the role, else as the total over them. 'place_scope' is a request that named no place, read across every place with data" + "title": "Ref" }, - "binding_ref": { - "type": "string", - "maxLength": 1036, - "title": "Binding Ref", - "description": "the identity binding whose edit replaces this assumption: 'how:' for a declared default, 'origin:' or 'where:' for a role, the place scope or the role a corrected name binds, as on the sentence's own tokens" + "label": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Label" }, - "text": { + "code": { "type": "string", - "maxLength": 200, - "minLength": 1, - "title": "Text", - "description": "the words the sentence's assumptions clause states for this fill: the typed words in quotes and the entity's label for a corrected name ('\"Germny\" read as Germany'), the bound code's full label for a declared default ('official development assistance' for CRSTypeOfFlow10, whose short name is 'ODA'), 'every' and the role's noun in the answer's flow family for an open role ('every provider', 'every creditor'), and 'every country', 'every place' or 'the world as a whole' for the place scope, as its members are typed" - }, - "refs": { - "items": { - "type": "string", - "maxLength": 1024 - }, - "type": "array", - "maxItems": 1, - "title": "Refs", - "description": "the value dcid a declared default bound its slot to, as the slot's trace.slot_filters[].refs list it (['CRSTypeOfFlow10'] for official development assistance), or the entity dcid a corrected name reads (['country/DEU']). An open role and the place scope carry []. A dataset_resubmit echo matches a declared default to its slot, and a corrected name to its role's entity, by these values" + "title": "Code" }, - "asked": { + "parent": { "anyOf": [ { - "type": "string", - "maxLength": 200, - "minLength": 1 + "type": "string" }, { "type": "null" } ], - "title": "Asked", - "description": "the words the request typed for a corrected name ('Germny'), which `text` quotes; absent on every other kind. A dataset_resubmit echo restates a corrected name with these words, and drops one that carries none" + "title": "Parent", + "description": "the parent code's dcid; null for a top-level code" } }, - "additionalProperties": false, "type": "object", "required": [ - "kind", - "binding_ref", - "text" + "ref", + "label", + "code", + "parent" ], - "title": "Assumption", - "description": "One value the answer filled that its request did not ask for, stated for people\nin `text` and for code in `kind`, `binding_ref` and `refs`.\n\nAssumptions live on the part (`_PartBase.assumptions`), and a candidates part holds\neach shown reading's own list as well (`CandidatesPart.reading_assumptions`), the one\na client echoes on a dataset_resubmit after picking that reading. The sentence that\ncarries the part closes with them as one clause: \"Assumed: official development\nassistance; every provider.\"" + "title": "GraphCodeItem", + "description": "A code in a `codes` or `children` list, with its code and its parent's dcid." }, - "Authority": { + "CodeMappingEntry": { "properties": { - "name": { + "endpoint": { "type": "string", - "title": "Name" + "title": "Endpoint" }, - "version": { + "channel": { "type": "string", - "title": "Version" + "title": "Channel" + }, + "doors": { + "anyOf": [ + { + "items": { + "type": "string" + }, + "type": "array" + }, + { + "type": "null" + } + ], + "title": "Doors" + }, + "http_status": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ], + "title": "Http Status" } }, "type": "object", "required": [ - "name", - "version" + "endpoint", + "channel", + "doors", + "http_status" ], - "title": "GraphMembershipAuthority", - "description": "Where a membership's rows come from, with the data version that reproduces them." + "title": "CodeMappingEntry", + "description": "One endpoint/channel combination a registered code is permitted on.\nMirrors `dfo_spec_kit.registry.CodeMapping`'s fields. `doors` and\n`http_status` are null when the registry entry omits them." }, - "Availability": { + "CodeNode": { "properties": { - "scope": { + "ref": { "type": "string", - "const": "dfo", - "title": "Scope", - "default": "dfo" + "title": "Ref", + "description": "the node's dcid" }, - "summary": { - "$ref": "#/components/schemas/AvailabilitySummary" + "label": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Label", + "description": "the node's name; for a Provenance, its parent Dataset's name where it has one. Null, and named in gaps, when the graph gives none" }, - "default": { + "types": { + "items": { + "type": "string" + }, + "type": "array", + "title": "Types", + "description": "the node's typeOf values, as the graph holds them" + }, + "description": { "anyOf": [ { - "$ref": "#/components/schemas/AvailabilityDefault" + "type": "string" }, { "type": "null" } ], - "description": "null when no facet dispatches a request naming nothing" + "title": "Description", + "description": "the node's prose in the graph; null when it has none" }, - "sources": { + "links": { + "additionalProperties": { + "type": "string" + }, + "propertyNames": { + "enum": [ + "codes", + "children", + "members", + "countries", + "datasets", + "variables", + "facets" + ] + }, + "type": "object", + "title": "Links", + "description": "each list relation the node has, mapped to its route; empty when none" + }, + "gaps": { "items": { - "$ref": "#/components/schemas/SourceAvailability" + "type": "string" }, "type": "array", - "title": "Sources" + "title": "Gaps", + "description": "the member path of every value this door cannot know" }, - "more_sources": { - "type": "integer", - "title": "More Sources", - "description": "the sources past the first ten" + "built_from": { + "additionalProperties": { + "type": "string" + }, + "propertyNames": { + "enum": [ + "code_index", + "origin_catalogue", + "coverage_index", + "membership" + ] + }, + "type": "object", + "title": "Built From", + "description": "the build of each table the response read" + }, + "kind": { + "type": "string", + "const": "code", + "title": "Kind", + "default": "code" + }, + "code": { + "$ref": "#/components/schemas/CodeBlock" } }, "type": "object", "required": [ - "scope", - "summary", - "default", - "sources", - "more_sources" + "ref", + "label", + "types", + "description", + "links", + "gaps", + "built_from", + "kind", + "code" ], - "title": "GraphAvailability", - "description": "Where DFO holds observations of a variable. `sources: []` means it verifiably holds\nnone." + "title": "CodeNode" }, - "AvailabilityDefault": { + "CodeRegistryEntry": { "properties": { - "facets": { - "items": { - "type": "string" - }, - "type": "array", - "title": "Facets", - "description": "the facet ids the request is served, in order" - }, - "source": { - "anyOf": [ - { - "$ref": "#/components/schemas/AvailabilitySource" - }, - { - "type": "null" - } - ] - }, - "unit": { - "anyOf": [ - { - "$ref": "#/components/schemas/NodeRef" - }, - { - "type": "null" - } - ] + "code": { + "type": "string", + "title": "Code" }, - "measurement_method": { + "classification": { "anyOf": [ { - "$ref": "#/components/schemas/NodeRef" + "type": "string", + "enum": [ + "refusal", + "warning" + ] }, { "type": "null" } - ] + ], + "title": "Classification" }, - "observation_period": { + "definition": { "anyOf": [ { "type": "string" @@ -3737,20 +6797,31 @@ "type": "null" } ], - "title": "Observation Period" + "title": "Definition" }, - "first_year": { + "lifecycle": { "anyOf": [ { - "type": "string" + "type": "string", + "enum": [ + "active", + "retired" + ] }, { "type": "null" } ], - "title": "First Year" + "title": "Lifecycle" }, - "last_year": { + "mappings": { + "items": { + "$ref": "#/components/schemas/CodeMappingEntry" + }, + "type": "array", + "title": "Mappings" + }, + "title": { "anyOf": [ { "type": "string" @@ -3759,106 +6830,109 @@ "type": "null" } ], - "title": "Last Year" + "title": "Title" }, - "places": { + "detail": { "anyOf": [ { - "type": "integer" + "type": "string" }, { "type": "null" } ], - "title": "Places", - "description": "null for a role-bearing variable" - }, - "without_data": { - "type": "integer", - "title": "Without Data", - "description": "the places, or parties, holding the variable that the default leaves without data" + "title": "Detail" } }, "type": "object", "required": [ - "facets", - "source", - "unit", - "measurement_method", - "observation_period", - "first_year", - "last_year", - "places", - "without_data" + "code", + "classification", + "definition", + "lifecycle", + "mappings", + "title", + "detail" ], - "title": "GraphAvailabilityDefault", - "description": "What a data request naming no place, years or facet receives." + "title": "CodeRegistryEntry", + "description": "The wire shape of a successful `GET /codes/{code}` lookup, not the\n`ProblemDetails`/`Envelope` shape that carries `capability_version`,\n`trace_id`, and `type`. `dfo_platform.version` hashes this shape by\ncalling `registry_entry_body` through the `codes` module attribute, so\nany change here moves `PLATFORM_CAPABILITY_VERSION`.\n\n`classification`, `definition`, `lifecycle` and `mappings` come from\n`dfo_spec_kit.registry.REGISTRY`. `title` and `detail` come from the\nmerged refusal catalogue. Either source can lack the code. `title` and\n`detail` are null for a code the merged catalogue does not carry (a\nwarning, or a no-data reason), while `classification`, `definition` and\n`lifecycle` are null and `mappings` is empty for a code absent from the\nregistry. A client sees a missing source as null fields on a present\ncode, not as a vanished key set." }, - "AvailabilitySource": { + "CodeSystemBlock": { "properties": { - "ref": { + "property": { "type": "string", - "title": "Ref" - }, - "label": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Label" + "title": "Property", + "description": "the constraint property the system governs" }, - "documentation": { + "plain_name": { "type": "string", - "title": "Documentation", - "description": "the path of the provenance's source document" + "title": "Plain Name", + "description": "the property's plain name, such as `sector`" + }, + "declarations": { + "$ref": "#/components/schemas/CodeSystemDeclarations" + }, + "code_count": { + "type": "integer", + "title": "Code Count", + "description": "how many codes the code index holds for the system" } }, "type": "object", "required": [ - "ref", - "label", - "documentation" + "property", + "plain_name", + "declarations", + "code_count" ], - "title": "GraphAvailabilitySource", - "description": "A source that holds the variable: its provenance, labelled with the catalogue's name." + "title": "GraphCodeSystemBlock", + "description": "A code system's detail block." }, - "AvailabilitySummary": { + "CodeSystemDeclarations": { "properties": { - "places": { - "anyOf": [ - { - "additionalProperties": { - "type": "integer" - }, - "type": "object" - }, - { - "type": "null" - } - ], - "title": "Places", - "description": "the places covered by kind; null for a role-bearing variable, and while the places' kinds are unread (a transient gap)" + "hierarchical": { + "type": "boolean", + "title": "Hierarchical", + "description": "whether its codes nest through specializationOf" }, - "entities": { - "anyOf": [ - { - "additionalProperties": { - "$ref": "#/components/schemas/EntityCounts" - }, - "type": "object" - }, - { - "type": "null" - } + "disjoint_from_children": { + "type": "boolean", + "title": "Disjoint From Children", + "description": "whether a parent code's records sit apart from its children's, so a parent's total is its own records plus its descendants' (CRS purposes); false where a parent row already totals its children (DAC1 aid types)" + }, + "summable": { + "type": "boolean", + "title": "Summable", + "description": "whether sibling values can rebuild a parent total" + }, + "absent_reading": { + "type": "string", + "enum": [ + "not_declared", + "aggregate" ], - "title": "Entities", - "description": "the entities covered per graph role; null for any other variable" + "title": "Absent Reading", + "description": "how a variable that does not declare the property reads" + } + }, + "type": "object", + "required": [ + "hierarchical", + "disjoint_from_children", + "summable", + "absent_reading" + ], + "title": "GraphCodeSystemDeclarations", + "description": "The rules a code system declares (`code_index.types.CodeSystemDeclaration`)." + }, + "CodeSystemNode": { + "properties": { + "ref": { + "type": "string", + "title": "Ref", + "description": "the node's dcid" }, - "first_year": { + "label": { "anyOf": [ { "type": "string" @@ -3867,9 +6941,18 @@ "type": "null" } ], - "title": "First Year" + "title": "Label", + "description": "the node's name; for a Provenance, its parent Dataset's name where it has one. Null, and named in gaps, when the graph gives none" }, - "last_year": { + "types": { + "items": { + "type": "string" + }, + "type": "array", + "title": "Types", + "description": "the node's typeOf values, as the graph holds them" + }, + "description": { "anyOf": [ { "type": "string" @@ -3878,165 +6961,195 @@ "type": "null" } ], - "title": "Last Year" + "title": "Description", + "description": "the node's prose in the graph; null when it has none" }, - "sources": { - "type": "integer", - "title": "Sources" + "links": { + "additionalProperties": { + "type": "string" + }, + "propertyNames": { + "enum": [ + "codes", + "children", + "members", + "countries", + "datasets", + "variables", + "facets" + ] + }, + "type": "object", + "title": "Links", + "description": "each list relation the node has, mapped to its route; empty when none" }, - "facets": { - "type": "integer", - "title": "Facets" + "gaps": { + "items": { + "type": "string" + }, + "type": "array", + "title": "Gaps", + "description": "the member path of every value this door cannot know" + }, + "built_from": { + "additionalProperties": { + "type": "string" + }, + "propertyNames": { + "enum": [ + "code_index", + "origin_catalogue", + "coverage_index", + "membership" + ] + }, + "type": "object", + "title": "Built From", + "description": "the build of each table the response read" + }, + "kind": { + "type": "string", + "const": "code_system", + "title": "Kind", + "default": "code_system" + }, + "code_system": { + "$ref": "#/components/schemas/CodeSystemBlock" } }, "type": "object", "required": [ - "places", - "entities", - "first_year", - "last_year", - "sources", - "facets" + "ref", + "label", + "types", + "description", + "links", + "gaps", + "built_from", + "kind", + "code_system" ], - "title": "GraphAvailabilitySummary", - "description": "The variable across every source." + "title": "CodeSystemNode" }, - "BaseIdentity": { + "ColumnOptionModel": { "properties": { - "identity_version": { + "name": { "type": "string", - "const": "spec1", - "title": "Identity Version", - "description": "the identity domain separator this Spec was hashed under", - "default": "spec1" + "title": "Name" }, - "shape": { - "oneOf": [ + "kind": { + "type": "string", + "title": "Kind" + }, + "droppable": { + "type": "boolean", + "title": "Droppable" + }, + "distinct": { + "anyOf": [ { - "$ref": "#/components/schemas/IdentityShapeSchema" + "type": "integer" }, { - "$ref": "#/components/schemas/IdentityShapePin" + "type": "null" } ], - "title": "Shape", - "description": "the shape this Spec was hashed under", - "discriminator": { - "propertyName": "kind", - "mapping": { - "stat_var": "#/components/schemas/IdentityShapePin", - "statvar_schema": "#/components/schemas/IdentityShapeSchema" - } - } + "title": "Distinct" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "name", + "kind", + "droppable" + ], + "title": "ColumnOptionModel", + "description": "One frame column, verbatim from `materialise.profile.ColumnProfile`." + }, + "CompiledScope": { + "properties": { + "spec_id": { + "type": "string", + "title": "Spec Id", + "description": "the spec_id of `identity`" }, - "slots": { + "identity": { + "$ref": "#/components/schemas/BaseIdentity", + "description": "the compiled identity" + }, + "components": { "items": { - "$ref": "#/components/schemas/IdentitySlot" + "$ref": "#/components/schemas/Component" }, "type": "array", - "maxItems": 64, - "title": "Slots", - "description": "the what/how slots that feed identity -- where/when/source are excluded. A what/how property the identity leaves out is one no member it serves asserts: an identity over a family with no total carries only the slots the request binds or opens, or its one breakdown, so a member asserting any other is excluded" - }, - "entities": { - "additionalProperties": { - "items": { - "type": "string", - "maxLength": 1024 - }, - "type": "array", - "maxItems": 1024, - "minItems": 1 - }, - "type": "object", - "maxProperties": 16, - "title": "Entities", - "description": "the bound entities, keyed by role (observationAbout/origin/destination); {} when none were bound -- always present, never omitted. A role that appears carries at least one dcid: the identity core refuses a role with zero members, so an empty list must not be expressible here" - }, - "requested_window": { - "oneOf": [ - { - "$ref": "#/components/schemas/IdentityWindowAll" - }, - { - "$ref": "#/components/schemas/IdentityWindowLatest" - }, - { - "$ref": "#/components/schemas/IdentityWindowRange" - } + "minItems": 1, + "title": "Components", + "description": "one for a plain Spec, one per series of a composite" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "spec_id", + "identity", + "components" + ], + "title": "CompiledScope", + "description": "The identity the active options compile to." + }, + "Component": { + "properties": { + "role": { + "type": "string", + "enum": [ + "whole", + "bilateral", + "imputed", + "headline_net", + "headline_ge" ], - "title": "Requested Window", - "description": "the requested date window this Spec was hashed under; always present -- {\"kind\": \"all\"} means no date was requested at all", - "discriminator": { - "propertyName": "kind", - "mapping": { - "all": "#/components/schemas/IdentityWindowAll", - "latest": "#/components/schemas/IdentityWindowLatest", - "range": "#/components/schemas/IdentityWindowRange" - } - } + "title": "Role", + "description": "what the component holds" }, - "facets": { + "periods": { "anyOf": [ { - "additionalProperties": { - "oneOf": [ - { - "$ref": "#/components/schemas/IdentityBindingValue" - }, - { - "$ref": "#/components/schemas/IdentityBindingSet" - }, + "items": { + "prefixItems": [ { - "$ref": "#/components/schemas/IdentityFacetValueRequest" + "type": "integer" }, { - "$ref": "#/components/schemas/IdentityFacetValueAbsent" + "type": "integer" } - ] + ], + "type": "array", + "maxItems": 2, + "minItems": 2 }, - "type": "object" + "type": "array" }, { "type": "null" } ], - "title": "Facets", - "description": "sparse facet bindings (provenance/measurementMethod/unit); omitted entirely when no facet axis is bound, never an empty object. A facet axis that appears is bound -- value, set, or (unit axis only) the request form -- never unbound: the identity core refuses an unbound facet binding state, since a sparse map omits what is not bound rather than carrying it as unbound" + "title": "Periods", + "description": "the years the component serves; None for every year" }, - "open_roles": { + "provenance": { "anyOf": [ { - "items": { - "$ref": "#/components/schemas/RoleAxis" - }, - "type": "array" + "type": "string" }, { "type": "null" } - ], - "title": "Open Roles", - "description": "the flow axes asked for member by member (every creditor, every donor), sorted and de-duplicated; omitted when none is. A role absent from both entities and open_roles asks for the total over that role. An open role is never also an entities key, and a pinned shape (kind='stat_var') carries none" - } - }, - "additionalProperties": false, - "type": "object", - "required": [ - "shape", - "slots", - "requested_window" - ], - "title": "BaseIdentity", - "description": "The spec1 identity-core projection document for one Spec: exactly what\ngets hashed to produce its spec_id, serialised once and echoed back\nverbatim -- never re-derived by a second, parallel implementation.\n\nEvery Spec carries one, on `Spec.definition.identity` (see\n`SpecDefinition`). A dataset_resubmit identity entry posts a prior Spec's own\n`definition.identity` byte-for-byte as its edited `identity`. Directional\nentities live directly in `identity.entities.origin` and\n`identity.entities.destination`. StatVar members are graph state, derived from the\nidentity, and no member here.\n\nThe document is hashed whole. `\"spec_\"` plus the first 32 hex digits of\nthe SHA-256 of its RFC 8785 serialisation, with null members omitted, is\nthe Spec's spec_id." - }, - "Binding": { - "properties": { - "provenance": { - "type": "string", - "title": "Provenance" + ], + "title": "Provenance", + "description": "the component's provenance dcid; None when unbound" }, - "measurementMethod": { + "content_version": { "anyOf": [ { "type": "string" @@ -4045,197 +7158,247 @@ "type": "null" } ], - "title": "Measurementmethod" + "title": "Content Version", + "description": "the content version of the component's frame; None until it is minted" }, - "unit": { + "stat_vars": { "anyOf": [ { - "type": "string" + "type": "integer" }, { "type": "null" } ], - "title": "Unit" + "title": "Stat Vars", + "description": "how many StatVars a mint of the component serves, whose rows the composite sums with the other components'; None for a plain Spec, or where the code index does not settle the component's members" + }, + "identity": { + "$ref": "#/components/schemas/BaseIdentity", + "description": "the component's own identity" } }, + "additionalProperties": false, "type": "object", "required": [ - "provenance", - "measurementMethod", - "unit" + "role", + "identity" ], - "title": "GraphAvailabilityBinding", - "description": "The `scope.facets` values that request a series from Datasets, in its leading unit." + "title": "Component", + "description": "One series the compiled identity is served from." }, - "BindingSet": { + "ComponentBody": { "properties": { - "kind": { - "type": "string", - "const": "set", - "title": "Kind", - "description": "binding kind discriminator", - "default": "set" - }, - "values": { - "items": { - "$ref": "#/components/schemas/SlotValue" - }, - "type": "array", - "minItems": 2, - "title": "Values", - "description": "two or more members, all in scope (a union)" + "intent": { + "additionalProperties": true, + "type": "object", + "title": "Intent" }, - "set_ref": { + "composition_id": { "anyOf": [ { - "$ref": "#/components/schemas/GraphRef" + "type": "string" }, { "type": "null" } ], - "description": "the group the set was drawn from, when one exists" + "title": "Composition Id" } }, "additionalProperties": false, "type": "object", "required": [ - "values" + "intent" ], - "title": "BindingSet", - "description": "A slot bound to two or more taxonomy members, all in scope." + "title": "ComponentBody", + "description": "The create and revise routes' shared request body. `extra=\"forbid\"`\nis what refuses a body carrying `session`/`caller`. An undeclared\nfield fails pydantic validation, which\n`presentation_api.refusals.request_validation_spec` classifies as\n`request_invalid` with no door-level code needed, `retryable` false. A\nrevise's `composition_id` is passed straight through to\n`write_component`, which refuses it (composition membership is\ncreate-only); this model does not distinguish the two routes." }, - "BindingUnbound": { + "ComponentReadResponse": { "properties": { - "kind": { + "component_id": { "type": "string", - "const": "unbound", - "title": "Kind", - "description": "explicit whole slot in scope, NOT null/missing", - "default": "unbound" - } - }, - "additionalProperties": false, - "type": "object", - "title": "BindingUnbound", - "description": "A slot explicitly open to the whole slot in scope, NOT null or missing." - }, - "BindingValue": { - "properties": { - "kind": { + "title": "Component Id", + "description": "the read component's own id" + }, + "revision": { + "type": "integer", + "title": "Revision", + "description": "the revision this read reports" + }, + "catalog_version": { "type": "string", - "const": "value", - "title": "Kind", - "description": "binding kind discriminator", - "default": "value" + "title": "Catalog Version", + "description": "the catalogue release this revision minted under" }, - "value": { - "$ref": "#/components/schemas/SlotValue", - "description": "exactly one taxonomy member" + "composition_id": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Composition Id", + "description": "the composition this component belongs to, null outside one" + }, + "composition_revision": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ], + "title": "Composition Revision", + "description": "the composition's current head revision, null outside one" + }, + "stored_intent": { + "additionalProperties": true, + "type": "object", + "title": "Stored Intent", + "description": "this revision's own stored intent, exactly as minted" + }, + "fact_summary": { + "$ref": "#/components/schemas/FactSummaryModel", + "description": "the closed, token-capped fact summary this revision reports" + }, + "resolved_payload": { + "additionalProperties": true, + "type": "object", + "title": "Resolved Payload", + "description": "the revision's stored resolved payload, verbatim: the catalogue envelope {schema_version, catalog_version, component_id, revision, provenance, component}, validated against the catalogue release's envelope schema (dfo-spec-kit envelope.schema.json) when minted. GET /api/presentation/release serves the pinned release's envelope_schema and the component_schemas its component field $refs by $id; every payload this door serves carries that pinned catalog_version." + }, + "retention": { + "anyOf": [ + { + "$ref": "#/components/schemas/RetentionModel" + }, + { + "type": "null" + } + ], + "description": "how long the frame this reply draws can still be fetched, counted from when DFO stored it. It is the stored frame on a read and the named frame on a render. A card's frame stays in the 30-day working tier until a share first includes the card. Once `held_until` has passed the frame can refuse `frame_unavailable`. Fetch the card's data with latest=True to draw from current data. Null for a card that draws no frame, or one whose frame DFO holds no version record of" } }, "additionalProperties": false, "type": "object", "required": [ - "value" + "component_id", + "revision", + "catalog_version", + "composition_id", + "composition_revision", + "stored_intent", + "fact_summary", + "resolved_payload" ], - "title": "BindingValue", - "description": "A slot bound to exactly one taxonomy member." + "title": "ComponentReadResponse", + "description": "`GET /api/presentation/components/{component_id}`'s 200 body." }, - "BreadthDim": { + "ComposedUnit": { "properties": { - "label": { - "type": "string", - "title": "Label", - "description": "the dimension, e.g. providers, years, methods, sources" + "numerator": { + "anyOf": [ + { + "$ref": "#/components/schemas/SimpleUnit" + }, + { + "$ref": "#/components/schemas/VariableSide" + } + ], + "title": "Numerator" }, - "count": { - "type": "integer", - "title": "Count", - "description": "e.g. 36, 22, 3" + "denominator": { + "anyOf": [ + { + "$ref": "#/components/schemas/SimpleUnit" + }, + { + "$ref": "#/components/schemas/VariableSide" + } + ], + "title": "Denominator" } }, "additionalProperties": false, "type": "object", "required": [ - "label", - "count" + "numerator", + "denominator" ], - "title": "BreadthDim", - "description": "One breadth dimension with its cardinality." + "title": "ComposedUnit", + "description": "A quotient's unit: the numerator's unit per the denominator's. Either side may be a\nvariable." }, - "BundleOptionModel": { + "ComposedUnitModel": { "properties": { - "state": { - "type": "string", - "title": "State" + "numerator": { + "anyOf": [ + { + "type": "string" + }, + { + "$ref": "#/components/schemas/ConvertedUnitModel" + }, + { + "$ref": "#/components/schemas/CountedStatVarModel" + } + ], + "title": "Numerator", + "description": "the unit of the measure divided" }, - "reason": { + "denominator": { "anyOf": [ { "type": "string" }, { - "type": "null" + "$ref": "#/components/schemas/ConvertedUnitModel" + }, + { + "$ref": "#/components/schemas/CountedStatVarModel" } ], - "title": "Reason" + "title": "Denominator", + "description": "the unit of the measure divided by" } }, "additionalProperties": false, "type": "object", "required": [ - "state" + "numerator", + "denominator" ], - "title": "BundleOptionModel" + "title": "ComposedUnitModel", + "description": "The unit of a quotient of two measures, read ` per `.\n\nEach side is a unit's graph name (its ref when the graph has none), a converted unit, or\nthe StatVar a unit-less side counts." }, - "CandidateSet": { + "Constraint": { "properties": { - "ordering": { - "type": "string", - "enum": [ - "broadest_first", - "intent_rank" - ], - "title": "Ordering", - "description": "how `specs` below is ordered -- see the two orderings described above" - }, - "max_candidates": { - "type": "integer", - "title": "Max Candidates", - "description": "the maximum number of candidates applied" - }, - "specs": { - "items": { - "$ref": "#/components/schemas/Spec", - "description": "the resolved Spec answering this part. Parts whose specs share a spec_id are one reading of the data, the same series, entities and years. A later part that folds into an earlier part's spec carries binding_folded. A part posted with separate: true never folds and keeps its own part, so two separate parts can carry one spec_id by request. Parts sharing a spec_id can differ in assumptions, so a client never dedupes parts by spec_id" - }, - "type": "array", - "minItems": 2, - "title": "Specs", - "description": "2 <= len <= max_candidates; full Specs, ordered per `ordering` above" - }, - "truncated": { - "type": "boolean", - "title": "Truncated", - "description": "false when every eligible, semantically distinct candidate shape found for this query is present in specs; true when the engine's own candidate budget dropped an eligible shape before it could be considered, or max_candidates itself cut the ordered list short" + "property": { + "$ref": "#/components/schemas/NodeRef" + }, + "value": { + "$ref": "#/components/schemas/NodeRef" } }, - "additionalProperties": false, "type": "object", "required": [ - "ordering", - "max_candidates", - "specs", - "truncated" + "property", + "value" ], - "title": "CandidateSet", - "description": "A set of 2..N competing Specs, presented in the order named by ``ordering``.\n\n``ordering=\"intent_rank\"``: the order the status rule offers the readings in. A first\nanswer always uses it. The elected reading comes first, then its rivals in menu order,\neach stating why it is offered (``ResolvedSpec.basis``). Where the elected reading holds\nno data and several siblings differing from it only on the measurement qualifier do,\nthose siblings are the set, in menu order, without it. Where a place named without a\ndirection holds data under both, the elected reading under each direction is offered.\n\n``ordering=\"broadest_first\"``: a posted candidates entry that names it\n(``ResubmitCandidatesEntry``) keeps its posted order and states this ordering back. No\nfirst answer uses it.\n\nEach candidate carries its own heading and byline inside its own\n``resolved.rendered_sentence``/``resolved.sentence_plan``. There is no separate parallel sentence array, and a\ncandidate's Spec is a returned Spec like any other. The part's own\nsentence opens with how many readings there are and states, for each\nshown candidate, the source and span that set it apart." + "title": "GraphDefinitionConstraint", + "description": "One constraint: the property and the value the variable fixes it at." }, - "CandidatesPart": { + "ContinentNode": { "properties": { - "variable_text": { + "ref": { + "type": "string", + "title": "Ref", + "description": "the node's dcid" + }, + "label": { "anyOf": [ { "type": "string" @@ -4244,35 +7407,104 @@ "type": "null" } ], - "title": "Variable Text", - "description": "the variable text this part answers, in the order asked. This part's position in Resolution.parts equals the same variable_index every SSE event keyed by variable_index uses (ShapeEvent, StepEvent, SentenceEvent). Every dataset_resubmit entry kind (identity, candidates, placeholder, and parsed through its nested ParsedPart) requires its own posted variable_text, so this field is always the posted text echoed back onto the rebuilt part, never null. Null only when the whole posted query was empty or whitespace-only (raw_text door), which refuses variable_not_resolved before extraction runs and so has no text to name." - }, - "separate": { - "type": "boolean", - "title": "Separate", - "description": "true when this part was asked beside the others to be compared with them. A client resubmitting an identity, candidate set, or placeholder posts this flag on that entry to preserve the comparison. Two parts marked separate that resolve to one reading carry the same spec_id and stay two parts. False, the default, is omitted", - "default": false + "title": "Label", + "description": "the node's name; for a Provenance, its parent Dataset's name where it has one. Null, and named in gaps, when the graph gives none" }, - "warnings": { + "types": { "items": { - "$ref": "#/components/schemas/Warning" + "type": "string" }, "type": "array", - "title": "Warnings", - "description": "this part's own run-health signals. A part folded into an earlier part's spec (see DefinitePart.spec) carries binding_folded alone. The merged spec's own resolved warnings live only on the first part that carries it. An unfolded part carries the warnings raised while resolving this part, plus observations_omitted on a candidates part when response_options.include_observations was set." + "title": "Types", + "description": "the node's typeOf values, as the graph holds them" }, - "timing_ms": { + "description": { "anyOf": [ { - "$ref": "#/components/schemas/Timing" + "type": "string" }, { "type": "null" } ], - "description": "this part's own latency breakdown, where by_step names only the phases this part ran and total sums them, leaving out the shape_* stages nested inside shape. Excludes the shared, once-per-request steps (e.g. extract), which diagnostics.timing_ms.by_step carries once for the whole request; distinct too from diagnostics.timing_ms.total, the whole request's wall-clock elapsed time." + "title": "Description", + "description": "the node's prose in the graph; null when it has none" }, - "rendered_sentence": { + "links": { + "additionalProperties": { + "type": "string" + }, + "propertyNames": { + "enum": [ + "codes", + "children", + "members", + "countries", + "datasets", + "variables", + "facets" + ] + }, + "type": "object", + "title": "Links", + "description": "each list relation the node has, mapped to its route; empty when none" + }, + "gaps": { + "items": { + "type": "string" + }, + "type": "array", + "title": "Gaps", + "description": "the member path of every value this door cannot know" + }, + "built_from": { + "additionalProperties": { + "type": "string" + }, + "propertyNames": { + "enum": [ + "code_index", + "origin_catalogue", + "coverage_index", + "membership" + ] + }, + "type": "object", + "title": "Built From", + "description": "the build of each table the response read" + }, + "kind": { + "type": "string", + "const": "continent", + "title": "Kind", + "default": "continent" + }, + "continent": { + "$ref": "#/components/schemas/PlaceBlock" + } + }, + "type": "object", + "required": [ + "ref", + "label", + "types", + "description", + "links", + "gaps", + "built_from", + "kind", + "continent" + ], + "title": "ContinentNode" + }, + "ContinentalUnionNode": { + "properties": { + "ref": { + "type": "string", + "title": "Ref", + "description": "the node's dcid" + }, + "label": { "anyOf": [ { "type": "string" @@ -4281,648 +7513,788 @@ "type": "null" } ], - "title": "Rendered Sentence", - "description": "a human-readable string. For candidates, a header naming how many readings there are ('3 readings.'), then each shown candidate's heading and a byline led by the source and span that set it apart; for no_data, a heading in the same claim form naming the entity, measure, and counterpart that were checked. Either ends with the text of this part's departures, in order, and a candidates part's then closes with its assumptions clause. For a definite part this stays null or omitted: the confirmation sentence (heading and byline) lives at spec.resolved.rendered_sentence, and its departures reach the envelope's composed sentence." + "title": "Label", + "description": "the node's name; for a Provenance, its parent Dataset's name where it has one. Null, and named in gaps, when the graph gives none" }, - "sentence_plan": { - "anyOf": [ - { - "items": { - "$ref": "#/components/schemas/SentenceToken" - }, - "type": "array" - }, - { - "type": "null" - } - ], - "title": "Sentence Plan", - "description": "the ordered token form of rendered_sentence, present whenever it is. For a definite part this stays null or omitted. spec.resolved.sentence_plan carries the confirmation sentence's own plan instead." + "types": { + "items": { + "type": "string" + }, + "type": "array", + "title": "Types", + "description": "the node's typeOf values, as the graph holds them" }, - "restatement": { + "description": { "anyOf": [ { - "$ref": "#/components/schemas/ParsedPart" + "type": "string" }, { "type": "null" } ], - "description": "the ParsedPart that reproduces this part's own resolution inputs -- the same entities, resolved time window, unit text, and source text the engine actually used to resolve this one leg -- so a client holding this part alone can copy it straight into a fresh ParsedInput.parts entry and re-resolve it faithfully, without flattening it into the whole query's variable_text the way variable_text alone would. Canonical, not verbatim: for a raw_text part, time_text is the equivalent phrase this door's own time grammar recognises (e.g. '2015 to 2020'), not the user's original words, since the engine's date extraction keeps only the structured window and discards the phrasing. Null whenever this part has no faithful echo to give. On a dataset_resubmit entry's identity/candidates/placeholder kinds, which post an identity or stub rather than a phrase and have no per-part resolution inputs to echo -- a dataset_resubmit parsed entry, genuinely re-resolved from its own posted ParsedPart, carries a real one like any parsed-door part. Also null when this leg's entity was bound to a directional role axis (origin/destination) and no door-supplied role named that axis, since an echo without the axis would resubmit the request with that entity reversed. Also null when one of this leg's own inputs does not fit ParsedPart's own field caps, since a truncated echo would misrepresent what was actually resolved." - }, - "entity_refs": { - "items": { - "$ref": "#/components/schemas/EntityRefs" - }, - "type": "array", - "title": "Entity Refs", - "description": "the binding of each entity of `restatement`, one per restatement.entities row, in row order, so a client can tell which node a text such as 'G7' bound. A response field kept off `restatement`, which posts back unchanged. The binding is the one the answer reads: for a candidates part, the elected reading's; for a part folded into an earlier part's spec, its own. [] when `restatement` is null or names no entity" + "title": "Description", + "description": "the node's prose in the graph; null when it has none" }, - "operations": { - "items": { - "$ref": "#/components/schemas/Operation" + "links": { + "additionalProperties": { + "type": "string" }, - "type": "array", - "title": "Operations", - "description": "the operations the question asks for over this part's data, in query order; the engine echoes them onto the part it resolves. Empty when the question asks for none" - }, - "departures": { - "items": { - "$ref": "#/components/schemas/Departure" + "propertyNames": { + "enum": [ + "codes", + "children", + "members", + "countries", + "datasets", + "variables", + "facets" + ] }, - "type": "array", - "title": "Departures", - "description": "every way this part's answer differs from what its request asked, ordered by how much each changes the number: closest_match, measure_not_applied, operation_not_applied, breakdown_not_applied, entity_unavailable, year_unavailable, modelled_values, group_read_as_members, whole_total_read, whole_total_unpublished, direction_discarded, direction_inferred, scope_limited. [] when the answer is what was asked. A client that renders its own sentence reads them here; each one's text also closes the sentence that carries this part (see Departure.text). A warning on the same part reports run health and stays separate" + "type": "object", + "title": "Links", + "description": "each list relation the node has, mapped to its route; empty when none" }, - "assumptions": { + "gaps": { "items": { - "$ref": "#/components/schemas/Assumption" + "type": "string" }, "type": "array", - "title": "Assumptions", - "description": "every value the engine filled that the request did not ask for, in clause order. Declared defaults come first, in the order of the Spec's trace.slot_filters, then open roles, then the place scope. A declared default is a slot the request left open that its code system's or shape's declared default fixed, named by the bound code's full label. An open role is a flow role no request word asked for, read across every entity on it with data. It is either a role the role scope default filled (resolved.scope on that axis), whatever its member count, served as one series per member where the shape declares the role, or a role the heading states with no entity of its own ('from 164 providers', 'owed to all creditors'), served as the total over its members. A role the identity binds in entities or lists in open_roles, that one of the part's operations runs over ('top 5 donors'), or that the request's words asked every member of ('all donors'), is asked. The place scope is a request that named no place, read across every place with data. Every door fills assumptions. A definite part reads them from its Spec, a candidates part carries the items every list in CandidatesPart.reading_assumptions holds alike, text included, and no_data and unsupported parts carry []. A dataset_resubmit identity entry posts every slot bound, so its part states the items of the entry's assumptions echo that still hold (see ResubmitIdentityEntry.assumptions), and a candidates entry reads each reading with its candidate's echo (see ResubmitCandidate.assumptions). The sentence that carries this part closes with them as one segment='assumption' clause ('Assumed: official development assistance; every provider.'), after its departures. [] when the answer fills nothing" - }, - "status": { - "type": "string", - "const": "candidates", - "title": "Status", - "description": "this part's variable was genuinely ambiguous" - }, - "candidates": { - "$ref": "#/components/schemas/CandidateSet", - "description": "2..N competing Specs" + "title": "Gaps", + "description": "the member path of every value this door cannot know" }, - "reading_assumptions": { + "built_from": { "additionalProperties": { - "items": { - "$ref": "#/components/schemas/Assumption" - }, - "type": "array" + "type": "string" + }, + "propertyNames": { + "enum": [ + "code_index", + "origin_catalogue", + "coverage_index", + "membership" + ] }, "type": "object", - "title": "Reading Assumptions", - "description": "each shown reading's own assumptions, keyed by its Spec's spec_id (candidates.specs[].spec_id). Each list is the one a definite part answering that Spec for this part's request carries, read with the part's operations and the axes the request's words asked every member of. The part's own assumptions are the items every list here holds alike, text included, so an open role one reading reads, or an item two readings word differently ('every provider' against 'every creditor'), is stated here alone. A client that picks a reading posts its identity as a dataset_resubmit identity entry and echoes reading_assumptions[spec_id] as the entry's assumptions, so the picked answer states what that reading assumed. A client that edits the set echoes each reading's entry as its candidate's assumptions. [] for a reading that assumes nothing" - } - }, - "additionalProperties": false, - "type": "object", - "required": [ - "status", - "candidates" - ], - "title": "CandidatesPart", - "description": "This part's variable was genuinely ambiguous; two or more distinct specs compete." - }, - "CanonicalDefinition": { - "properties": { - "schema_version": { - "type": "integer", - "const": 1, - "title": "Schema Version", - "description": "the wire version this definition was written under" + "title": "Built From", + "description": "the build of each table the response read" }, - "spec_id": { + "kind": { "type": "string", - "title": "Spec Id", - "description": "the caller-supplied spec_id this definition must hash to" + "const": "continental_union", + "title": "Kind", + "default": "continental_union" }, - "identity": { - "additionalProperties": true, - "type": "object", - "title": "Identity", - "description": "the identity-core document, shaped as search.models.identity.BaseIdentity and published at GET /api/search/schema" + "continental_union": { + "$ref": "#/components/schemas/PlaceBlock" } }, - "additionalProperties": false, "type": "object", "required": [ - "schema_version", - "spec_id", - "identity" + "ref", + "label", + "types", + "description", + "links", + "gaps", + "built_from", + "kind", + "continental_union" ], - "title": "CanonicalDefinition", - "description": "One canonical definition, exactly as the contract shapes it: the wire\nversion it was written under, its own spec_id (required -- the register\ndoor always verifies a supplied id, never mints one for a definition),\nand its identity-core document." + "title": "ContinentalUnionNode" }, - "CapabilitiesResponse": { + "ConversionCurrency": { "properties": { - "capability_version": { + "code": { "type": "string", - "title": "Capability Version", - "description": "a content hash over every capability-bearing field of the release this deployment serves" + "title": "Code", + "description": "the ISO 4217 code a unit request names the currency by" }, - "catalog_version": { + "noun": { "type": "string", - "title": "Catalog Version", - "description": "the catalogue release this deployment serves" + "title": "Noun", + "description": "the plural English noun the sentence's unit token names the currency by ('euros', 'Guatemalan quetzales')" }, - "build": { - "type": "string", - "title": "Build", - "description": "the commit sha the image was built from, the same value the x-dfo-commit response header carries" - } - }, - "additionalProperties": false, - "type": "object", - "required": [ - "capability_version", - "catalog_version", - "build" - ], - "title": "CapabilitiesResponse", - "description": "`GET /api/presentation/capabilities`'s body. It carries this\nsurface's own hashed `capability_version` beside the unhashed\n`catalog_version`." - }, - "CapabilityDefaultPolicy": { - "properties": { - "name": { - "type": "string", - "title": "Name", - "description": "the declared default policy's name" + "current_years": { + "anyOf": [ + { + "$ref": "#/components/schemas/TimeWindow" + }, + { + "type": "null" + } + ], + "description": "the first and last years a current-price request in this currency shows, the longest run of consecutive years, inside the years the answer serves (download.window), in which the recipe's exchange-rate table holds a rate for this currency and for the native currency of every facet the answer serves. It equals download.window when the conversion keeps every served year. With no download.window, the run the tables hold. Null when no year converts" }, - "live": { - "type": "boolean", - "title": "Live", - "description": "whether this deployment honours the declared default" + "constant_years": { + "anyOf": [ + { + "$ref": "#/components/schemas/TimeWindow" + }, + { + "type": "null" + } + ], + "description": "the first and last years a constant-price request in this currency shows, at any base year from base_year_min to base_year_max, the longest run of consecutive years, read as current_years is, in which the exchange-rate table holds a rate for the native currency of every facet the answer serves and the deflator table a value for at least one entity the answer serves on the recipe's deflator role, bound or open. The conversion leaves out an entity's rows in the years its deflator lacks, and the answer names them (deflator_missing_omitted). Null when no year converts or no base year exists" }, - "default": { + "base_year_min": { "anyOf": [ { - "type": "boolean" + "type": "integer" }, { "type": "null" } ], - "title": "Default", - "description": "the current default value, when this policy is a boolean toggle" + "title": "Base Year Min", + "description": "the first base year a constant-price request in this currency converts at. With base_year_max it spans the run of consecutive years, ending at the latest, in which the deflator table holds an actual value, the exchange-rate table a rate for the currency, and the deflator table a value for at least one entity the answer serves on the recipe's deflator role. The conversion leaves out every row of an entity whose deflator lacks the base year, and the answer names it (deflator_missing_omitted). Null when no such year exists" + }, + "base_year_max": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ], + "title": "Base Year Max", + "description": "the last base year a constant-price request in this currency converts at" } }, + "additionalProperties": false, "type": "object", "required": [ - "name", - "live" + "code", + "noun", + "current_years", + "constant_years", + "base_year_min", + "base_year_max" ], - "title": "CapabilityDefaultPolicy", - "description": "One declared default policy: whether it is live, and its current\ndefault value when it is a simple boolean toggle." + "title": "ConversionCurrency", + "description": "One currency a unit request can convert this answer to, with the years each price\nbasis converts. A request whose tables leave out some of the years the answer serves\nshows the years stated here, and departs `year_unavailable` naming the table." }, - "CapabilityFormat": { + "ConvertedUnitModel": { "properties": { - "name": { + "currency": { "type": "string", - "title": "Name", - "description": "csv, xlsx, or parquet" + "title": "Currency", + "description": "the ISO 4217 code of the currency the values are in" }, - "live": { - "type": "boolean", - "title": "Live", - "description": "whether this deployment can render this format" + "prices": { + "type": "string", + "enum": [ + "current", + "constant" + ], + "title": "Prices", + "description": "the price basis of the values" + }, + "base_year": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ], + "title": "Base Year", + "description": "the base year of constant prices, absent for current prices" } }, + "additionalProperties": false, "type": "object", "required": [ - "name", - "live" + "currency", + "prices" ], - "title": "CapabilityFormat", - "description": "One output rendering's liveness in this deployment." + "title": "ConvertedUnitModel", + "description": "A converted unit, as the frame's `unit` cell states it." }, - "CapabilityKind": { + "CountedEntityYearsModel": { "properties": { - "name": { - "type": "string", - "title": "Name", - "description": "spec_id or statvar_set" + "count": { + "type": "integer", + "title": "Count", + "description": "how many entities there are" }, - "live": { - "type": "boolean", - "title": "Live", - "description": "whether this deployment's mint door dispatches this kind" + "entities": { + "items": { + "$ref": "#/components/schemas/EntityYearsModel" + }, + "type": "array", + "title": "Entities", + "description": "the first ten of them, sorted" } }, + "additionalProperties": false, "type": "object", "required": [ - "name", - "live" + "count", + "entities" ], - "title": "CapabilityKind", - "description": "One mint-request `kind`'s liveness in this deployment." + "title": "CountedEntityYearsModel", + "description": "The entities a conversion left rows out of, each with its years: how many, and the\nfirst ten, sorted (`materialise.codes.CountedEntityYears`). The message states the count\nand names none, so a reader labels the refs." }, - "CatalogueAnswer": { + "CountedRefsModel": { "properties": { - "schema_version": { + "count": { "type": "integer", - "const": 1, - "title": "Schema Version", - "description": "contract schema version; exactly 1 for v1. Required on every response.", - "default": 1 - }, - "query_echo": { - "$ref": "#/components/schemas/QueryEcho", - "description": "what the response was understood to be answering" - }, - "diagnostics": { - "$ref": "#/components/schemas/Diagnostics", - "description": "run health, warnings, timing, build stamp" - }, - "kind": { - "type": "string", - "const": "catalogue", - "title": "Kind", - "description": "discriminator for a response to a question about what DFO holds", - "default": "catalogue" + "title": "Count", + "description": "how many there are" }, - "scope": { - "$ref": "#/components/schemas/Scope-Output", - "description": "the place the question named, when it named a country" + "refs": { + "items": { + "type": "string" + }, + "type": "array", + "title": "Refs", + "description": "the `dcid:` refs of the first five of them, ten for omitted_entities, in the order the field's warning states" } }, "additionalProperties": false, "type": "object", "required": [ - "query_echo", - "diagnostics", - "scope", - "kind" + "count", + "refs" ], - "title": "CatalogueAnswer", - "description": "A resolve response to a question that asks what DFO holds and names\nneither an indicator nor a subject, such as \"what data do you have?\". It\ncarries the country the question named, when the resolver confirms one." + "title": "CountedRefsModel", + "description": "The things of one kind a warning counts: how many, and the `dcid:` refs of the first\nfive of them (the first ten for a conversion's left-out `omitted_entities`;\n`materialise.codes.CountedRefs`). A message states the count and may name none, so a\nreader labels the refs. A group's members come in request order and entities sorted;\nfor `withheld_by_registry`, `unserved_entities` come in the order the request names them\nand `withheld_provenances` in the order they first occur across those places; for\n`un_system_unavailable`, `unserved_entities` come in the order the UN reads recorded them." }, - "CatalogueExampleSentence": { + "CountedStatVarModel": { "properties": { - "text": { - "type": "string", - "title": "Text", - "description": "the template filled with the place's name" - }, - "template": { - "type": "string", - "title": "Template", - "description": "the sentence with a {place} slot" - }, "stat_var": { "type": "string", "title": "Stat Var", - "description": "the StatVar the sentence resolves to" + "description": "the StatVar's `dcid:`-prefixed ref, as the frame holds it" }, - "place": { + "label": { "type": "string", - "title": "Place", - "description": "the country dcid the sentence is filled with" + "title": "Label", + "description": "the StatVar's graph name, or its ref without `dcid:` when the graph has none" } }, "additionalProperties": false, "type": "object", "required": [ - "text", - "template", "stat_var", - "place" + "label" ], - "title": "CatalogueExampleSentence", - "description": "An example sentence a client offers and runs as a query." + "title": "CountedStatVarModel", + "description": "One side of a composed unit whose measure declares no unit, named by its StatVar." }, - "CatalogueResponse": { + "CountryNode": { "properties": { - "catalogue_version": { + "ref": { "type": "string", - "title": "Catalogue Version", - "description": "the published build this body comes from" + "title": "Ref", + "description": "the node's dcid" }, - "counts": { + "label": { "anyOf": [ { - "$ref": "#/components/schemas/Counts" + "type": "string" }, { - "$ref": "#/components/schemas/PlaceCounts" + "type": "null" } ], - "title": "Counts", - "description": "global counts, or the counts at the requested place" + "title": "Label", + "description": "the node's name; for a Provenance, its parent Dataset's name where it has one. Null, and named in gaps, when the graph gives none" }, - "examples": { + "types": { "items": { - "$ref": "#/components/schemas/CatalogueExampleSentence" + "type": "string" }, "type": "array", - "title": "Examples" - } - }, - "additionalProperties": false, - "type": "object", - "required": [ - "catalogue_version", - "counts", - "examples" - ], - "title": "CatalogueResponse", - "description": "What DFO holds and example sentences to ask of it." - }, - "Cause": { - "description": "The `cause` extension: why a refusal fired, beneath its own top-level\n`code` -- present only on a refusal that carries one (`recipe_not_declared`,\n`rate_coverage_gap`, `operation_failed`). On `operation_failed`, `code` is\nthe failed operation's refusal code. Mirrors `alternatives`/`truncated`'s\nown extension style: `entities` names what the cause concerns (entity or\n`entity@year` keys), capped, with `truncated` set when the cap cut items\nshort.", - "properties": { - "code": { - "description": "the cause code: a sub-cause such as nominal_undeclared, recipe_undeclared, or rate_missing, or on operation_failed the failed operation's own refusal code", - "title": "Code", - "type": "string" + "title": "Types", + "description": "the node's typeOf values, as the graph holds them" }, - "entities": { - "description": "the entity or entity@year keys this cause concerns, in the order given, capped at 10; empty for a cause that names no entity", + "description": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Description", + "description": "the node's prose in the graph; null when it has none" + }, + "links": { + "additionalProperties": { + "type": "string" + }, + "propertyNames": { + "enum": [ + "codes", + "children", + "members", + "countries", + "datasets", + "variables", + "facets" + ] + }, + "type": "object", + "title": "Links", + "description": "each list relation the node has, mapped to its route; empty when none" + }, + "gaps": { "items": { "type": "string" }, - "maxItems": 10, - "title": "Entities", - "type": "array" + "type": "array", + "title": "Gaps", + "description": "the member path of every value this door cannot know" + }, + "built_from": { + "additionalProperties": { + "type": "string" + }, + "propertyNames": { + "enum": [ + "code_index", + "origin_catalogue", + "coverage_index", + "membership" + ] + }, + "type": "object", + "title": "Built From", + "description": "the build of each table the response read" }, - "truncated": { - "default": false, - "description": "true when the entities cap cut items short", - "title": "Truncated", - "type": "boolean" - } - }, - "required": [ - "code" - ], - "title": "Cause", - "type": "object" - }, - "ChangeEntry": { - "properties": { "kind": { "type": "string", - "enum": [ - "added", - "changed", - "deprecated", - "removed", - "fixed", - "security" - ], + "const": "country", "title": "Kind", - "description": "the Keep a Changelog group the change sits under" + "default": "country" }, - "note": { - "type": "string", - "title": "Note", - "description": "the change, as CommonMark" + "country": { + "$ref": "#/components/schemas/PlaceBlock" } }, "type": "object", "required": [ + "ref", + "label", + "types", + "description", + "links", + "gaps", + "built_from", "kind", - "note" + "country" ], - "title": "ChangeEntry", - "description": "One change in a release." + "title": "CountryNode" }, - "ChangeModel": { + "Counts": { "properties": { - "kind": { - "type": "string", - "title": "Kind", - "description": "the Keep a Changelog group, lowercase: added, changed, deprecated, removed, fixed or security" + "indicators": { + "type": "integer", + "title": "Indicators", + "description": "distinct StatVars search can serve: base, DFO and coverage variables" }, - "note": { - "type": "string", - "title": "Note", - "description": "the change, as CommonMark" + "datasets": { + "type": "integer", + "title": "Datasets", + "description": "distinct source-index entries of the admitted provenances" + }, + "publishers": { + "type": "integer", + "title": "Publishers", + "description": "distinct sources of the admitted provenances" + }, + "countries": { + "type": "integer", + "title": "Countries", + "description": "countries with base data in the origin catalogue or coverage rows" + }, + "aid": { + "$ref": "#/components/schemas/AidCounts" } }, "additionalProperties": false, "type": "object", "required": [ - "kind", - "note" + "indicators", + "datasets", + "publishers", + "countries", + "aid" ], - "title": "ChangeModel", - "description": "One change in a release of a source's DFO pipeline." + "title": "Counts", + "description": "What DFO holds, counted from one origin catalogue build and one\ncoverage index build." }, - "ChangedFieldModel": { + "CoverageBare": { "properties": { - "field": { + "kind": { "type": "string", - "title": "Field", - "description": "the intent field this entry reports" + "const": "bare", + "title": "Kind", + "description": "coverage kind discriminator", + "default": "bare" }, - "prior": { - "anyOf": [ - {}, - { - "type": "null" - } - ], - "title": "Prior", - "description": "the field's value before the write, for a disclosed scalar" + "has_data": { + "type": "boolean", + "title": "Has Data", + "description": "whether the region has any observations" }, - "new": { + "window": { "anyOf": [ - {}, + { + "$ref": "#/components/schemas/TimeWindow" + }, { "type": "null" } ], - "title": "New", - "description": "the field's value after the write, for a disclosed scalar" + "description": "the date window, when known" } }, "additionalProperties": false, "type": "object", "required": [ - "field" + "has_data" ], - "title": "ChangedFieldModel", - "description": "One entry of `changed[]`. `prior` and `new` are present only for a\nscalar field the write set changed. An array or object field carries\n`field` alone." + "title": "CoverageBare", + "description": "Observation footprint with no count or dimensions; an honest could-not-count." }, - "Choice": { + "CoverageBreadth": { "properties": { - "chosen": { - "$ref": "#/components/schemas/StepRef" + "kind": { + "type": "string", + "const": "breadth", + "title": "Kind", + "description": "coverage kind discriminator", + "default": "breadth" }, - "others": { - "items": { - "$ref": "#/components/schemas/StepRef" - }, - "type": "array", - "maxItems": 32, - "title": "Others" + "has_data": { + "type": "boolean", + "title": "Has Data", + "description": "whether the region has any observations" }, - "ranking": { + "dimensions": { "items": { - "type": "string", - "pattern": "^[a-z][a-z0-9_]{0,63}$" + "$ref": "#/components/schemas/BreadthDim" }, "type": "array", - "maxItems": 8, "minItems": 1, - "title": "Ranking" + "title": "Dimensions", + "description": "non-empty on breadth; structured dimension counts" + }, + "window": { + "anyOf": [ + { + "$ref": "#/components/schemas/TimeWindow" + }, + { + "type": "null" + } + ], + "description": "the date window this breadth applies to" } }, "additionalProperties": false, "type": "object", "required": [ - "chosen", - "others", - "ranking" + "has_data", + "dimensions" ], - "title": "Choice", - "description": "A choice of source at mint: the source chosen, the others it was chosen over, and the\nranking it applied, in order." + "title": "CoverageBreadth", + "description": "Observation footprint expressed as structured breadth dimensions." }, - "CitationModel": { + "CoverageDimension": { "properties": { - "text": { + "label": { "type": "string", - "title": "Text" + "title": "Label" }, - "sources": { - "items": { - "$ref": "#/components/schemas/CitationSource" - }, - "type": "array", - "title": "Sources" + "count": { + "type": "integer", + "title": "Count" + }, + "axis": { + "anyOf": [ + { + "$ref": "#/components/schemas/RoleAxis" + }, + { + "type": "null" + } + ] + }, + "noun": { + "anyOf": [ + { + "$ref": "#/components/schemas/DimensionNoun" + }, + { + "type": "null" + } + ], + "description": "what the members this dimension counts are called, by the frame's flow family: provider and recipient for aid, creditor and debtor for debt. Absent for a dimension on no flow axis, such as `years`, and on a version stored without it" } }, "additionalProperties": false, "type": "object", "required": [ - "text", - "sources" + "label", + "count" ], - "title": "CitationModel" + "title": "CoverageDimension", + "description": "One coverage dimension. `axis` is `axis_for_role(label)`: the flow axis of a dimension\nlabelled by a declared role, and `None` for `years` and unmapped roles. Validation derives\nit, so a stored body written without it carries it once loaded. `noun` is set at the mint\nfrom the version's flow family (`dfo_platform.roles.role_wording`), which the label and\naxis do not fix, so a body stored without it carries none (`year_coverage_counted`): a\n`None` noun is left out of every dump." }, - "CitationSource": { + "CoverageExact": { "properties": { - "ref": { + "kind": { "type": "string", - "title": "Ref" + "const": "exact", + "title": "Kind", + "description": "coverage kind discriminator", + "default": "exact" }, - "label": { + "has_data": { + "type": "boolean", + "title": "Has Data", + "description": "whether the exact observation_count has observations in the resolved window, or in full history when window is absent" + }, + "observation_count": { + "type": "integer", + "title": "Observation Count", + "description": "exact distinct (date, facet) observation pairs for resolved stat_vars and entities in the resolved window, or full history when window is absent" + }, + "evidence": { "type": "string", - "title": "Label" + "enum": [ + "facet_metadata", + "observed" + ], + "title": "Evidence", + "description": "provenance of observation_count. 'facet_metadata': the count comes from the graph's facet index and no observation series was delivered for this spec in this payload. 'observed': a preview series was delivered for this spec in this payload, and observation_count is still the facet-index count, now backed by fetchable data. A streaming response's `response` event ships before any observation fetch, so it always carries 'facet_metadata'; its trailing `observations` event carries the series. dfo-apis wire field outside the spec-kit contract.", + "default": "facet_metadata" }, - "processing_level": { + "dimensions": { "anyOf": [ { - "type": "string" + "items": { + "$ref": "#/components/schemas/BreadthDim" + }, + "type": "array" }, { "type": "null" } ], - "title": "Processing Level" + "title": "Dimensions", + "description": "optional per-facet breadth dimensions; the observations dimension is window-narrowed to agree with observation_count when window is set, lifetime otherwise" }, - "license": { + "window": { "anyOf": [ { - "type": "string" + "$ref": "#/components/schemas/TimeWindow" }, { "type": "null" } ], - "title": "License" + "description": "the date window this count applies to" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "has_data", + "observation_count" + ], + "title": "CoverageExact", + "description": "Observation footprint with an exact count for its resolved window." + }, + "CoverageModel": { + "properties": { + "rows": { + "type": "integer", + "title": "Rows" }, - "license_type": { + "dimensions": { + "items": { + "$ref": "#/components/schemas/CoverageDimension" + }, + "type": "array", + "title": "Dimensions" + }, + "window": { "anyOf": [ { - "type": "string" + "additionalProperties": true, + "type": "object" }, { "type": "null" } ], - "title": "License Type" + "title": "Window" }, - "license_url": { + "recent_years": { "anyOf": [ { - "type": "string" + "items": { + "$ref": "#/components/schemas/YearCoverage" + }, + "type": "array" }, { "type": "null" } ], - "title": "License Url" + "title": "Recent Years", + "description": "three calendar years, newest first, each with the counts the coverage index held of the series the frame's run read when the version was minted. They end at the newest year a counted series held up to the year the index was built in, so a year after the frame's can hold data the frame leaves out. Stated for a latest window and for a named year at or after the year a latest window serves, and absent for an earlier named year" }, - "url": { + "elected_year": { "anyOf": [ { - "type": "string" + "type": "integer" }, { "type": "null" } ], - "title": "Url" + "title": "Elected Year", + "description": "the year a latest window served when the version was minted. It is the frame's year under a latest window. A frame of a named year after it holds a year a latest window passes over" }, - "source": { + "fullest_year": { "anyOf": [ { - "$ref": "#/components/schemas/CitedSourceNode" + "$ref": "#/components/schemas/YearCoverage" }, { "type": "null" } - ] + ], + "description": "the year holding the most series of the ten calendar years ending at the newest of `recent_years`, stated when it is earlier than those three and the frame's year holds under the share of its series a latest window's year must hold" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "rows", + "dimensions" + ], + "title": "CoverageModel", + "description": "A frame's row and dimension counts and its applied window.\n\n`recent_years`, `elected_year` and `fullest_year` set the frame's one year beside the\nyears around it (`datasets_api.manifest.year_coverage`). They are counted once, when\nthe version is minted, and stored with it, all three or none, so every read of the\nversion states the same ones. A `None` member is left out of every dump." + }, + "CreateComponentBody": { + "properties": { + "intent": { + "additionalProperties": true, + "type": "object", + "title": "Intent" }, - "data_commons": { + "composition_id": { "anyOf": [ { - "$ref": "#/components/schemas/CitedDataCommons" + "type": "string" }, { "type": "null" } - ] + ], + "title": "Composition Id" }, - "documentation": { + "write_token": { "anyOf": [ { - "$ref": "#/components/schemas/CitedDocumentation" + "type": "string" }, { "type": "null" } - ] + ], + "title": "Write Token", + "description": "a cmw_ token this client minted for the new component: \"cmw_\" + secrets.token_urlsafe(16) or an equivalent CSPRNG, 22 url-safe base64 characters after the prefix. It becomes the component's write token and keys the create: a retry with the same write_token, intent and composition_id returns the first create's reply, and a different request with it is refused as request_invalid. Mint a new one for each create. Not allowed with composition_id \"new\"." } }, "additionalProperties": false, "type": "object", "required": [ - "ref", - "label" + "intent" ], - "title": "CitationSource", - "description": "One cited source, named through\n`materialise.provenance_doc.read_source_citations`. `label`, `url`,\n`source`, `data_commons`, the licence fields and `documentation` come\nfrom the origin catalogue where it lists `ref`, and from the graph\notherwise: `license` is the licence's label, `license_type` its\n`licenseType` dcid and `license_url` its terms page. `license`, `license_type`,\n`license_url` and `url` are `None` where neither the catalogue nor the graph declares one. `source`\nand `data_commons` are `None` for a ref the catalogue does not list.\n`documentation` is the source's documentation at first mint, `None` when\nnothing documents the source or its graph read failed. A mint\nleaves a stored citation as it is. A bundle render fills every field but\n`ref`, `label` and `processing_level` that is `None` from a live read for\nthat render only (`datasets_api.manifest.healed_citation`), and every set\nfield wins." + "title": "CreateComponentBody", + "description": "The create route's body. `write_token` is checked by `write_component`, which refuses a\nmalformed token, or one sent with `composition_id` \"new\", as `request_invalid`." }, - "CitedDataCommons": { + "CreateReplyResponse": { "properties": { - "id": { + "component_id": { + "type": "string", + "title": "Component Id", + "description": "the newly minted component's own id" + }, + "revision": { + "type": "integer", + "title": "Revision", + "description": "the first revision a create mints, always 1" + }, + "catalog_version": { + "type": "string", + "title": "Catalog Version", + "description": "the catalogue release this revision minted under" + }, + "composition_id": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Composition Id", + "description": "the composition this component belongs to, null outside one" + }, + "composition_revision": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ], + "title": "Composition Revision", + "description": "the composition's current head revision, null outside one" + }, + "changed": { + "items": { + "$ref": "#/components/schemas/ChangedFieldModel" + }, + "type": "array", + "title": "Changed", + "description": "always empty, since a create carries no prior intent to compare against" + }, + "fact_summary": { + "$ref": "#/components/schemas/FactSummaryModel", + "description": "the closed, token-capped fact summary this revision reports" + }, + "resolved_payload": { + "additionalProperties": true, + "type": "object", + "title": "Resolved Payload", + "description": "the revision's stored resolved payload, verbatim: the catalogue envelope {schema_version, catalog_version, component_id, revision, provenance, component}, validated against the catalogue release's envelope schema (dfo-spec-kit envelope.schema.json) when minted. GET /api/presentation/release serves the pinned release's envelope_schema and the component_schemas its component field $refs by $id; every payload this door serves carries that pinned catalog_version." + }, + "affordance": { "type": "string", - "enum": [ - "dfo", - "base", - "un_system" - ], - "title": "Id" + "title": "Affordance", + "description": "this door's own line naming the revise and read routes for this component" }, - "label": { + "write_token": { "type": "string", - "title": "Label" - } - }, - "additionalProperties": false, - "type": "object", - "required": [ - "id", - "label" - ], - "title": "CitedDataCommons", - "description": "The Data Commons that serves a cited provenance." - }, - "CitedDocumentation": { - "properties": { - "publisher": { + "title": "Write Token", + "description": "the cmw_ token that grants revising this component, sent back as the x-dfo-write-token header. A server-minted token appears only in this reply; a token the create sent as write_token is echoed, and a replayed create returns it again." + }, + "composition_write_token": { "anyOf": [ { "type": "string" @@ -4931,34 +8303,85 @@ "type": "null" } ], - "title": "Publisher", - "description": "the publishing organisation" + "title": "Composition Write Token", + "description": "the cpw_ token that grants creating components into the composition this create started with composition_id \"new\", sent back as the x-dfo-write-token header. Present only on that create." }, - "description": { + "retention": { "anyOf": [ { - "type": "string" + "$ref": "#/components/schemas/RetentionModel" }, { "type": "null" } ], - "title": "Description", - "description": "what the source holds" + "description": "how long the frame the new card draws can still be fetched, as a read states it. The frame is held for 30 days from when DFO stored it, until a share first includes the card. Null for a card that draws no frame, or one whose frame DFO holds no version record of" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "component_id", + "revision", + "catalog_version", + "composition_id", + "composition_revision", + "changed", + "fact_summary", + "resolved_payload", + "affordance", + "write_token" + ], + "title": "CreateReplyResponse", + "description": "`POST /api/presentation/components`'s 201 body. It carries\n`WriteReplyResponse`'s fields plus this door's own `affordance` line\nnaming the freshly minted component's revise and read routes." + }, + "CreateShareBody": { + "properties": { + "cards": { + "items": { + "$ref": "#/components/schemas/ShareCardBody" + }, + "type": "array", + "maxItems": 24, + "title": "Cards", + "description": "the cards in slot order. Two entries may name the same revision. A card share takes at least one, a canvas any number, a search or conversation share none" }, - "source_data_url": { + "latest": { + "type": "boolean", + "title": "Latest", + "description": "true for a live share that follows new data and takes replacements, false for a snapshot that keeps the versions its cards draw now, for good" + }, + "title": { "anyOf": [ { - "type": "string" + "type": "string", + "maxLength": 300, + "minLength": 1 }, { "type": "null" } ], - "title": "Source Data Url", - "description": "where the raw data downloads from" + "title": "Title", + "description": "the share's title" }, - "attribution": { + "kind": { + "type": "string", + "enum": [ + "card", + "canvas", + "search", + "conversation" + ], + "title": "Kind", + "description": "what the share publishes. The website renders a canvas, search or conversation share from its payload. A conversation share is a snapshot", + "default": "card" + }, + "payload": { + "$ref": "#/components/schemas/JsonValue", + "description": "website-owned JSON stored with the share as given and read back on GET, at most 10485760 bytes as compact UTF-8" + }, + "write_token": { "anyOf": [ { "type": "string" @@ -4967,10 +8390,21 @@ "type": "null" } ], - "title": "Attribution", - "description": "the citation text the publisher asks for, verbatim" - }, - "update_cadence": { + "title": "Write Token", + "description": "a shw_ token this client minted for the new share: \"shw_\" + secrets.token_urlsafe(16) or an equivalent CSPRNG, 22 url-safe base64 characters after the prefix. It becomes the share's write token and keys the create. A retry with the same write_token and body answers the first share, spending no allowance, and a different body with it is refused as request_invalid. Mint a new one for each create." + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "latest" + ], + "title": "CreateShareBody", + "description": "A create's body. `latest` has no default, because a live link and a fixed one answer\ndifferent questions under a public URL." + }, + "DataBuilds": { + "properties": { + "graph_generation": { "anyOf": [ { "type": "string" @@ -4979,10 +8413,10 @@ "type": "null" } ], - "title": "Update Cadence", - "description": "how often the source updates, as display text such as 'Quarterly'; an unrecognised ISO 8601 duration passes through as stored" + "title": "Graph Generation", + "description": "the graph generation token: the graph service's Cloud Run revisions last read, joined with +; null while unknown" }, - "last_update": { + "origin_catalogue": { "anyOf": [ { "type": "string" @@ -4991,10 +8425,10 @@ "type": "null" } ], - "title": "Last Update", - "description": "the date of the DFO's last refresh of the source" + "title": "Origin Catalogue", + "description": "build id of the origin catalogue this request is bound to" }, - "years_covered": { + "coverage_index": { "anyOf": [ { "type": "string" @@ -5003,10 +8437,10 @@ "type": "null" } ], - "title": "Years Covered", - "description": "YYYY or YYYY-YYYY" + "title": "Coverage Index", + "description": "build id of the series coverage index; null when none is loaded" }, - "granularity": { + "code_index": { "anyOf": [ { "type": "string" @@ -5015,39 +8449,15 @@ "type": "null" } ], - "title": "Granularity", - "description": "such as 'Annual, by provider and recipient'" - }, - "currencies": { - "items": { - "type": "string" - }, - "type": "array", - "title": "Currencies", - "description": "sorted ISO 4217 codes of the source's currencies" - }, - "transformation_log": { - "items": { - "$ref": "#/components/schemas/TransformationStepModel" - }, - "type": "array", - "title": "Transformation Log" - }, - "version_history": { - "items": { - "$ref": "#/components/schemas/ReleaseModel" - }, - "type": "array", - "title": "Version History", - "description": "the DFO pipeline's releases, newest first" + "title": "Code Index", + "description": "content hash of the packaged code index export" } }, - "additionalProperties": false, "type": "object", - "title": "CitedDocumentation", - "description": "A cited source's documentation at first mint, read by\n`materialise.provenance_doc.read_provenance_doc`, the reader behind\n`GET /api/graph/documentation/{ref}`. Each member is `None` or empty where the graph\ndocuments nothing." + "title": "GraphDataBuilds", + "description": "The data builds this process serves, each null where it is unknown or absent." }, - "CitedSourceNode": { + "DatasetEntry": { "properties": { "ref": { "type": "string", @@ -5056,76 +8466,27 @@ "label": { "type": "string", "title": "Label" - } - }, - "additionalProperties": false, - "type": "object", - "required": [ - "ref", - "label" - ], - "title": "CitedSourceNode", - "description": "The Data Commons `Source` node behind a cited provenance. On the UN\nSystem Data Commons it is the agency provenance itself." - }, - "CodeBlock": { - "properties": { - "code_system": { - "anyOf": [ - { - "$ref": "#/components/schemas/NodeRef" - }, - { - "type": "null" - } - ], - "description": "the system's graph node, such as `CRSPurposeCodeEnum`" - }, - "property": { - "type": "string", - "title": "Property", - "description": "the constraint property the code is a value of" }, - "code": { - "type": "string", - "title": "Code" + "provenances": { + "items": { + "$ref": "#/components/schemas/ProvenanceEntry" + }, + "type": "array", + "title": "Provenances" }, - "parent": { + "description": { "anyOf": [ { - "$ref": "#/components/schemas/NodeRef" + "type": "string" }, { "type": "null" } ], - "description": "the code it specialises; null for a root" - }, - "synonyms": { - "items": { - "type": "string" - }, - "type": "array", - "title": "Synonyms" - } - }, - "type": "object", - "required": [ - "code_system", - "property", - "code", - "parent", - "synonyms" - ], - "title": "GraphCodeBlock", - "description": "A code's detail block." - }, - "CodeItem": { - "properties": { - "ref": { - "type": "string", - "title": "Ref" + "title": "Description", + "description": "its sole Provenance's description, as `details.description`; null when it has several" }, - "label": { + "license_type": { "anyOf": [ { "type": "string" @@ -5134,13 +8495,10 @@ "type": "null" } ], - "title": "Label" - }, - "code": { - "type": "string", - "title": "Code" + "title": "License Type", + "description": "licence label every Provenance agrees on, as `license.type`; null when they disagree or one has none" }, - "parent": { + "update_cadence": { "anyOf": [ { "type": "string" @@ -5148,68 +8506,50 @@ { "type": "null" } - ], - "title": "Parent", - "description": "the parent code's dcid; null for a top-level code" - } - }, - "type": "object", - "required": [ - "ref", - "label", - "code", - "parent" - ], - "title": "GraphCodeItem", - "description": "A code in a `codes` or `children` list, with its code and its parent's dcid." - }, - "CodeMappingEntry": { - "properties": { - "endpoint": { - "type": "string", - "title": "Endpoint" - }, - "channel": { - "type": "string", - "title": "Channel" + ], + "title": "Update Cadence", + "description": "release cadence label every Provenance agrees on, as `license.update_cadence`; null when they disagree or one has none" }, - "doors": { + "years_covered": { "anyOf": [ { - "items": { - "type": "string" - }, - "type": "array" + "type": "string" }, { "type": "null" } ], - "title": "Doors" + "title": "Years Covered", + "description": "`YYYY` or `YYYY-YYYY` span of its Provenances' observation dates, as `scope_and_units.years_covered`; null when either end is unknown" }, - "http_status": { + "source_url": { "anyOf": [ { - "type": "integer" + "type": "string" }, { "type": "null" } ], - "title": "Http Status" + "title": "Source Url", + "description": "the publication's page, as `details.source_url`: the Dataset's url, else its sole Provenance's" } }, "type": "object", "required": [ - "endpoint", - "channel", - "doors", - "http_status" + "ref", + "label", + "provenances", + "description", + "license_type", + "update_cadence", + "years_covered", + "source_url" ], - "title": "CodeMappingEntry", - "description": "One endpoint/channel combination a registered code is permitted on.\nMirrors `dfo_spec_kit.registry.CodeMapping`'s fields. `doors` and\n`http_status` are null when the registry entry omits them." + "title": "DatasetEntry", + "description": "A Dataset and the admitted provenances that belong to it. A provenance with\nno Dataset forms its own entry, keyed by the provenance, so `ref` and `label`\nare the provenance's and `provenances` holds that one provenance.\n\nThe card facts (`description`, `license_type`, `update_cadence`,\n`years_covered`, `source_url`) equal the same members of\n`GET /api/graph/documentation/{ref}` for the graph the loaded catalogue\nbuild read. They are null on UN System Data Commons entries." }, - "CodeNode": { + "DatasetNode": { "properties": { "ref": { "type": "string", @@ -5293,12 +8633,12 @@ }, "kind": { "type": "string", - "const": "code", + "const": "dataset", "title": "Kind", - "default": "code" + "default": "dataset" }, - "code": { - "$ref": "#/components/schemas/CodeBlock" + "dataset": { + "$ref": "#/components/schemas/SourceBlock" } }, "type": "object", @@ -5311,32 +8651,106 @@ "gaps", "built_from", "kind", - "code" + "dataset" ], - "title": "CodeNode" + "title": "DatasetNode" }, - "CodeRegistryEntry": { + "DatasetResubmitInput": { "properties": { - "code": { + "kind": { "type": "string", - "title": "Code" + "const": "dataset_resubmit", + "title": "Kind", + "description": "discriminator for dataset-level re-resolution across every part", + "default": "dataset_resubmit" }, - "classification": { + "entries": { + "items": { + "oneOf": [ + { + "$ref": "#/components/schemas/ResubmitIdentityEntry" + }, + { + "$ref": "#/components/schemas/ResubmitCandidatesEntry" + }, + { + "$ref": "#/components/schemas/ResubmitPlaceholderEntry" + }, + { + "$ref": "#/components/schemas/ResubmitParsedEntry" + } + ], + "discriminator": { + "propertyName": "entry_kind", + "mapping": { + "candidates": "#/components/schemas/ResubmitCandidatesEntry", + "identity": "#/components/schemas/ResubmitIdentityEntry", + "parsed": "#/components/schemas/ResubmitParsedEntry", + "placeholder": "#/components/schemas/ResubmitPlaceholderEntry" + } + } + }, + "type": "array", + "maxItems": 6, + "minItems": 1, + "title": "Entries", + "description": "one entry per response part, in response part order; a single-entry request whose entry is an identity re-resolves exactly that one part" + }, + "raw_query": { "anyOf": [ { "type": "string", - "enum": [ - "refusal", - "warning" - ] + "maxLength": 2000, + "minLength": 1 }, { "type": "null" } ], - "title": "Classification" + "title": "Raw Query", + "description": "original query text, for echo only; does not affect resolution" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "entries" + ], + "title": "DatasetResubmitInput", + "description": "Re-resolve every part of a multi-variable result in one request, so an\nedit to one part cannot leave the other parts' composed sentence or fold\nstale (see `envelope.make_response` / `conjoin.combine_regions`, the\ncombiner every entry kind here is routed through).\n\n`entries` supplies one entry per response part, in response part order;\neach entry edits against its own base, never a dataset-level one. There\nis no spec registry, so every entry carries its full identity and this\ndoor reads no server-side state." + }, + "DatasetRoot": { + "properties": { + "spec_id": { + "type": "string", + "pattern": "^spec_[0-9a-f]{32}$", + "title": "Spec Id" }, - "definition": { + "content_version": { + "type": "string", + "pattern": "^cv_[0-9a-f]{32}$", + "title": "Content Version" + }, + "rendering": { + "$ref": "#/components/schemas/RootRendering" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "spec_id", + "content_version" + ], + "title": "DatasetRoot", + "description": "A dataset version, as a ref member names it." + }, + "DatasetVersion": { + "properties": { + "content_version": { + "type": "string", + "title": "Content Version" + }, + "base_content_version": { "anyOf": [ { "type": "string" @@ -5345,42 +8759,38 @@ "type": "null" } ], - "title": "Definition" + "title": "Base Content Version", + "description": "the raw version a derived version (a full groupby collapse, a party-totals cut, or both) was rendered from. Null on every other version" }, - "lifecycle": { - "anyOf": [ - { - "type": "string", - "enum": [ - "active", - "retired" - ] - }, - { - "type": "null" - } + "rendering": { + "type": "string", + "enum": [ + "plain", + "groupby", + "without_party_totals", + "not_recorded" ], - "title": "Lifecycle" - }, - "mappings": { - "items": { - "$ref": "#/components/schemas/CodeMappingEntry" - }, - "type": "array", - "title": "Mappings" + "title": "Rendering", + "description": "plain: a raw version, which is also what a groupby sum or a party-totals cut that left the frame unchanged is stored under. groupby: a collapse, summed by `groupby`, of the frame or of its party-totals cut when `without_party_totals` is true. without_party_totals: the frame without its party totals, unsummed. not_recorded: a derived version with no linked file recording its options" }, - "title": { + "groupby": { "anyOf": [ { - "type": "string" + "$ref": "#/components/schemas/GroupbyOptions" }, { "type": "null" } ], - "title": "Title" + "description": "the groupby a collapse was summed by, as its file's rendering records it. Null unless `rendering` is groupby" }, - "detail": { + "without_party_totals": { + "type": "boolean", + "title": "Without Party Totals", + "description": "true when the derived version's frame leaves out the group totals of its open party roles, as its file's rendering records it. Absent when false", + "default": false + }, + "enrichment_stamp": { "anyOf": [ { "type": "string" @@ -5389,98 +8799,77 @@ "type": "null" } ], - "title": "Detail" + "title": "Enrichment Stamp", + "description": "the `enrichment_stamp` a file of this version holding party-kind cells, rendered now, carries (`ArtifactEntryModel.enrichment_stamp`): the answering code index's digest, the page's `enrichment_stamp`, when the version's frame holds a party role. Absent when it holds none, since a file of it then holds no party-kind cell and carries no stamp under any code index. A version that stored neither an output profile nor a party-free link lists the digest" } }, + "additionalProperties": false, "type": "object", "required": [ - "code", - "classification", - "definition", - "lifecycle", - "mappings", - "title", - "detail" + "content_version", + "base_content_version", + "rendering", + "groupby" ], - "title": "CodeRegistryEntry", - "description": "The wire shape of a successful `GET /codes/{code}` lookup, not the\n`ProblemDetails`/`Envelope` shape that carries `capability_version`,\n`trace_id`, and `type`. `dfo_platform.version` hashes this shape by\ncalling `registry_entry_body` through the `codes` module attribute, so\nany change here moves `PLATFORM_CAPABILITY_VERSION`.\n\n`classification`, `definition`, `lifecycle` and `mappings` come from\n`dfo_spec_kit.registry.REGISTRY`. `title` and `detail` come from the\nmerged refusal catalogue. Either source can lack the code. `title` and\n`detail` are null for a code the merged catalogue does not carry (a\nwarning, or a no-data reason), while `classification`, `definition` and\n`lifecycle` are null and `mappings` is empty for a code absent from the\nregistry. A client sees a missing source as null fields on a present\ncode, not as a vanished key set." + "title": "DatasetVersion" }, - "CodeSystemBlock": { + "DatasetVersionsPage": { "properties": { - "property": { - "type": "string", - "title": "Property", - "description": "the constraint property the system governs" + "schema_version": { + "type": "integer", + "const": 1, + "title": "Schema Version", + "default": 1 }, - "plain_name": { + "spec_id": { "type": "string", - "title": "Plain Name", - "description": "the property's plain name, such as `sector`" - }, - "declarations": { - "$ref": "#/components/schemas/CodeSystemDeclarations" - }, - "code_count": { - "type": "integer", - "title": "Code Count", - "description": "how many codes the code index holds for the system" - } - }, - "type": "object", - "required": [ - "property", - "plain_name", - "declarations", - "code_count" - ], - "title": "GraphCodeSystemBlock", - "description": "A code system's detail block." - }, - "CodeSystemDeclarations": { - "properties": { - "hierarchical": { - "type": "boolean", - "title": "Hierarchical", - "description": "whether its codes nest through specializationOf" + "title": "Spec Id" }, - "disjoint_from_children": { - "type": "boolean", - "title": "Disjoint From Children", - "description": "whether a parent code's records sit apart from its children's, so a parent's total is its own records plus its descendants' (CRS purposes); false where a parent row already totals its children (DAC1 aid types)" + "enrichment_stamp": { + "type": "string", + "title": "Enrichment Stamp", + "description": "the digest of the party kinds, classes and whole-total markers the answering code index holds, the one a file rendered now carries (`ArtifactEntryModel.enrichment_stamp`). A frame naming a file that asks for a party-kind column adds it to its name, so a frame named under another stamp does not match" }, - "summable": { - "type": "boolean", - "title": "Summable", - "description": "whether sibling values can rebuild a parent total" + "versions": { + "items": { + "$ref": "#/components/schemas/DatasetVersion" + }, + "type": "array", + "title": "Versions", + "description": "stored versions that are not revoked, newest first" }, - "absent_reading": { - "type": "string", - "enum": [ - "not_declared", - "aggregate" + "next_cursor": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } ], - "title": "Absent Reading", - "description": "how a variable that does not declare the property reads" + "title": "Next Cursor", + "description": "continues the list after this page's last version; null when complete" + }, + "complete": { + "type": "boolean", + "title": "Complete", + "description": "true when this page reaches the end of the list" } }, + "additionalProperties": false, "type": "object", "required": [ - "hierarchical", - "disjoint_from_children", - "summable", - "absent_reading" + "spec_id", + "enrichment_stamp", + "versions", + "next_cursor", + "complete" ], - "title": "GraphCodeSystemDeclarations", - "description": "The rules a code system declares (`code_index.types.CodeSystemDeclaration`)." + "title": "DatasetVersionsPage" }, - "CodeSystemNode": { + "DateRange": { "properties": { - "ref": { - "type": "string", - "title": "Ref", - "description": "the node's dcid" - }, - "label": { + "start": { "anyOf": [ { "type": "string" @@ -5489,18 +8878,10 @@ "type": "null" } ], - "title": "Label", - "description": "the node's name; for a Provenance, its parent Dataset's name where it has one. Null, and named in gaps, when the graph gives none" - }, - "types": { - "items": { - "type": "string" - }, - "type": "array", - "title": "Types", - "description": "the node's typeOf values, as the graph holds them" + "title": "Start", + "description": "first served date, e.g. '2012'" }, - "description": { + "end": { "anyOf": [ { "type": "string" @@ -5509,120 +8890,105 @@ "type": "null" } ], - "title": "Description", - "description": "the node's prose in the graph; null when it has none" - }, - "links": { - "additionalProperties": { - "type": "string" - }, - "propertyNames": { - "enum": [ - "codes", - "children", - "members", - "countries", - "datasets", - "variables", - "facets" - ] - }, - "type": "object", - "title": "Links", - "description": "each list relation the node has, mapped to its route; empty when none" + "title": "End", + "description": "last served date, e.g. '2022'" + } + }, + "additionalProperties": false, + "type": "object", + "title": "DateRange", + "description": "The first and last dates of the points an answer serves for a StatVar." + }, + "DeclinedAnswer": { + "properties": { + "schema_version": { + "type": "integer", + "const": 1, + "title": "Schema Version", + "description": "contract schema version; exactly 1 for v1. Required on every response.", + "default": 1 }, - "gaps": { - "items": { - "type": "string" - }, - "type": "array", - "title": "Gaps", - "description": "the member path of every value this door cannot know" + "query_echo": { + "$ref": "#/components/schemas/QueryEcho", + "description": "what the response was understood to be answering" }, - "built_from": { - "additionalProperties": { - "type": "string" - }, - "propertyNames": { - "enum": [ - "code_index", - "origin_catalogue", - "coverage_index", - "membership" - ] - }, - "type": "object", - "title": "Built From", - "description": "the build of each table the response read" + "diagnostics": { + "$ref": "#/components/schemas/Diagnostics", + "description": "run health, warnings, timing, build stamp" }, "kind": { "type": "string", - "const": "code_system", + "const": "declined", "title": "Kind", - "default": "code_system" + "description": "discriminator for a response to a question search does not answer", + "default": "declined" }, - "code_system": { - "$ref": "#/components/schemas/CodeSystemBlock" + "reason": { + "type": "string", + "enum": [ + "out_of_scope", + "requires_analysis" + ], + "title": "Reason", + "description": "why search declined: 'out_of_scope' when no part of the question asks for a published statistic about a place, a population or a financial flow; 'requires_analysis' when the subject is in scope but the question asks for an argument and names no data to show" + }, + "scope": { + "$ref": "#/components/schemas/Scope-Output", + "description": "the place the question named, when it named a country" } }, + "additionalProperties": false, "type": "object", "required": [ - "ref", - "label", - "types", - "description", - "links", - "gaps", - "built_from", - "kind", - "code_system" + "query_echo", + "diagnostics", + "reason", + "scope", + "kind" ], - "title": "CodeSystemNode" + "title": "DeclinedAnswer", + "description": "A resolve response to a question search does not answer." }, - "ColumnOptionModel": { + "DefinitePart": { "properties": { - "name": { - "type": "string", - "title": "Name" - }, - "kind": { - "type": "string", - "title": "Kind" + "variable_text": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Variable Text", + "description": "the variable text this part answers, in the order asked. This part's position in Resolution.parts equals the same variable_index every SSE event keyed by variable_index uses (ShapeEvent, StepEvent, SentenceEvent). Every dataset_resubmit entry kind (identity, candidates, placeholder, and parsed through its nested ParsedPart) requires its own posted variable_text, so this field is always the posted text echoed back onto the rebuilt part, never null. Null only when the whole posted query was empty or whitespace-only (raw_text door), which refuses variable_not_resolved before extraction runs and so has no text to name." }, - "droppable": { + "separate": { "type": "boolean", - "title": "Droppable" + "title": "Separate", + "description": "true when this part was asked beside the others to be compared with them. A client resubmitting an identity, candidate set, or placeholder posts this flag on that entry to preserve the comparison. Two parts marked separate that resolve to one reading carry the same spec_id and stay two parts. False, the default, is omitted", + "default": false }, - "distinct": { + "warnings": { + "items": { + "$ref": "#/components/schemas/Warning" + }, + "type": "array", + "title": "Warnings", + "description": "this part's own run-health signals. A part folded into an earlier part's spec (see DefinitePart.spec) carries binding_folded alone. The merged spec's own resolved warnings live only on the first part that carries it. An unfolded part carries the warnings raised while resolving this part, plus observations_omitted on a candidates part when response_options.include_observations was set." + }, + "timing_ms": { "anyOf": [ { - "type": "integer" + "$ref": "#/components/schemas/Timing" }, { "type": "null" } ], - "title": "Distinct" - } - }, - "additionalProperties": false, - "type": "object", - "required": [ - "name", - "kind", - "droppable" - ], - "title": "ColumnOptionModel", - "description": "One frame column, verbatim from `materialise.profile.ColumnProfile`." - }, - "ComponentBody": { - "properties": { - "intent": { - "additionalProperties": true, - "type": "object", - "title": "Intent" + "description": "this part's own latency breakdown, where by_step names only the phases this part ran and total sums them, leaving out the shape_* stages nested inside shape. Excludes the shared, once-per-request steps (e.g. extract), which diagnostics.timing_ms.by_step carries once for the whole request; distinct too from diagnostics.timing_ms.total, the whole request's wall-clock elapsed time." }, - "composition_id": { + "rendered_sentence": { "anyOf": [ { "type": "string" @@ -5630,298 +8996,222 @@ { "type": "null" } - ], - "title": "Composition Id" - } - }, - "additionalProperties": false, - "type": "object", - "required": [ - "intent" - ], - "title": "ComponentBody", - "description": "The create and revise routes' shared request body. `extra=\"forbid\"`\nis what refuses a body carrying `session`/`caller`. An undeclared\nfield fails pydantic validation, which\n`presentation_api.refusals.request_validation_spec` classifies as\n`request_invalid` with no door-level code needed, `retryable` false. A\nrevise's `composition_id` is passed straight through to\n`write_component`, which refuses it (composition membership is\ncreate-only); this model does not distinguish the two routes." - }, - "ComponentReadResponse": { - "properties": { - "component_id": { - "type": "string", - "title": "Component Id", - "description": "the read component's own id" - }, - "revision": { - "type": "integer", - "title": "Revision", - "description": "the revision this read reports" - }, - "catalog_version": { - "type": "string", - "title": "Catalog Version", - "description": "the catalogue release this revision minted under" + ], + "title": "Rendered Sentence", + "description": "a human-readable string. For candidates, a header naming how many readings there are ('3 readings.'), then each shown candidate's heading and a byline led by the source and span that set it apart; for no_data, a heading in the same claim form naming the entity, measure, and counterpart that were checked. Either ends with the text of this part's departures, in order, and a candidates part's then closes with its assumptions clause. For a definite part this stays null or omitted: the confirmation sentence (heading and byline) lives at spec.resolved.rendered_sentence, and its departures reach the envelope's composed sentence." }, - "composition_id": { + "sentence_plan": { "anyOf": [ { - "type": "string" + "items": { + "$ref": "#/components/schemas/SentenceToken" + }, + "type": "array" }, { "type": "null" } ], - "title": "Composition Id", - "description": "the composition this component belongs to, null outside one" + "title": "Sentence Plan", + "description": "the ordered token form of rendered_sentence, present whenever it is. For a definite part this stays null or omitted. spec.resolved.sentence_plan carries the confirmation sentence's own plan instead." }, - "composition_revision": { + "restatement": { "anyOf": [ { - "type": "integer" + "$ref": "#/components/schemas/ParsedPart" }, { "type": "null" } ], - "title": "Composition Revision", - "description": "the composition's current head revision, null outside one" + "description": "the ParsedPart that reproduces this part's own resolution inputs -- the same entities, resolved time window, unit text, and source text the engine actually used to resolve this one leg -- so a client holding this part alone can copy it straight into a fresh ParsedInput.parts entry and re-resolve it faithfully, without flattening it into the whole query's variable_text the way variable_text alone would. Canonical, not verbatim: for a raw_text part, time_text is the equivalent phrase this door's own time grammar recognises (e.g. '2015 to 2020'), not the user's original words, since the engine's date extraction keeps only the structured window and discards the phrasing. Null whenever this part has no faithful echo to give. On a dataset_resubmit entry's identity/candidates/placeholder kinds, which post an identity or stub rather than a phrase and have no per-part resolution inputs to echo -- a dataset_resubmit parsed entry, genuinely re-resolved from its own posted ParsedPart, carries a real one like any parsed-door part. Also null when this leg's entity was bound to a directional role axis (origin/destination) and no door-supplied role named that axis, since an echo without the axis would resubmit the request with that entity reversed. Also null when one of this leg's own inputs does not fit ParsedPart's own field caps, since a truncated echo would misrepresent what was actually resolved." }, - "stored_intent": { - "additionalProperties": true, - "type": "object", - "title": "Stored Intent", - "description": "this revision's own stored intent, exactly as minted" + "entity_refs": { + "items": { + "$ref": "#/components/schemas/EntityRefs" + }, + "type": "array", + "title": "Entity Refs", + "description": "the binding of each entity of `restatement`, one per restatement.entities row, in row order, so a client can tell which node a text such as 'G7' bound. A response field kept off `restatement`, which posts back unchanged. The binding is the one the answer reads: for a candidates part, the elected reading's; for a part folded into an earlier part's spec, its own. [] when `restatement` is null or names no entity" }, - "fact_summary": { - "$ref": "#/components/schemas/FactSummaryModel", - "description": "the closed, token-capped fact summary this revision reports" + "operations": { + "items": { + "$ref": "#/components/schemas/Operation" + }, + "type": "array", + "title": "Operations", + "description": "the operations the question asks for over this part's data, in query order; the engine echoes them onto the part it resolves. Empty when the question asks for none" }, - "resolved_payload": { - "additionalProperties": true, - "type": "object", - "title": "Resolved Payload", - "description": "the revision's stored resolved payload, verbatim: the catalogue envelope {schema_version, catalog_version, component_id, revision, provenance, component}, validated against the catalogue release's envelope schema (dfo-spec-kit envelope.schema.json) when minted. GET /api/presentation/release serves the pinned release's envelope_schema and the component_schemas its component field $refs by $id; every payload this door serves carries that pinned catalog_version." + "departures": { + "items": { + "$ref": "#/components/schemas/Departure" + }, + "type": "array", + "title": "Departures", + "description": "every way this part's answer differs from what its request asked, ordered by how much each changes the number: closest_match, measure_not_applied, operation_not_applied, breakdown_not_applied, entity_unavailable, member_unavailable, year_unavailable, modelled_values, group_read_as_members, whole_total_read, whole_total_unpublished, direction_discarded, direction_inferred, scope_limited. [] when the answer is what was asked. A client that renders its own sentence reads them here; each one's text also closes the sentence that carries this part (see Departure.text). A warning on the same part reports run health and stays separate" + }, + "assumptions": { + "items": { + "$ref": "#/components/schemas/Assumption" + }, + "type": "array", + "title": "Assumptions", + "description": "every value the engine filled that the request did not ask for, in clause order. Declared defaults come first, in the order of the Spec's trace.slot_filters, then open roles, then the place scope. A declared default is a slot the request left open that its code system's or shape's declared default fixed, named by the bound code's full label. An open role is a flow role no request word asked for, read across every entity on it with data. It is either a role the role scope default filled (resolved.scope on that axis), whatever its member count, served as one series per member where the shape declares the role, or a role the heading states with no entity of its own ('from 164 providers', 'owed to all creditors'), served as the total over its members. A role the identity binds in entities or lists in open_roles, that one of the part's operations runs over ('top 5 donors'), or that the request's words asked every member of ('all donors'), is asked. The place scope is a request that named no place, read across every place with data. Every door fills assumptions. A definite part reads them from its Spec, a candidates part carries the items every list in CandidatesPart.reading_assumptions holds alike, text included, and no_data and unsupported parts carry []. A dataset_resubmit identity entry posts every slot bound, so its part states the items of the entry's assumptions echo that still hold (see ResubmitIdentityEntry.assumptions), and a candidates entry reads each reading with its candidate's echo (see ResubmitCandidate.assumptions). The sentence that carries this part closes with them as one segment='assumption' clause ('Assumed: official development assistance; every provider.'), after its departures. [] when the answer fills nothing" + }, + "status": { + "type": "string", + "const": "definite", + "title": "Status", + "description": "one answer was resolved" + }, + "spec": { + "$ref": "#/components/schemas/Spec", + "description": "the resolved Spec answering this part. Parts whose specs share a spec_id are one reading of the data, the same series, entities and years. A later part that folds into an earlier part's spec carries binding_folded. A part posted with separate: true never folds and keeps its own part, so two separate parts can carry one spec_id by request. Parts sharing a spec_id can differ in assumptions, so a client never dedupes parts by spec_id" } }, "additionalProperties": false, "type": "object", "required": [ - "component_id", - "revision", - "catalog_version", - "composition_id", - "composition_revision", - "stored_intent", - "fact_summary", - "resolved_payload" + "status", + "spec" ], - "title": "ComponentReadResponse", - "description": "`GET /api/presentation/components/{component_id}`'s 200 body." + "title": "DefinitePart", + "description": "One unambiguous answer was resolved for this part." }, - "ComposedUnit": { + "DefinitionMembersRequest": { "properties": { - "numerator": { - "anyOf": [ - { - "$ref": "#/components/schemas/SimpleUnit" - }, - { - "$ref": "#/components/schemas/VariableSide" - } - ], - "title": "Numerator" + "schema_version": { + "type": "integer", + "const": 1, + "title": "Schema Version", + "default": 1 }, - "denominator": { + "definition": { "anyOf": [ { - "$ref": "#/components/schemas/SimpleUnit" + "$ref": "#/components/schemas/CanonicalDefinition" }, { - "$ref": "#/components/schemas/VariableSide" + "type": "null" } - ], - "title": "Denominator" + ] } }, "additionalProperties": false, "type": "object", - "required": [ - "numerator", - "denominator" - ], - "title": "ComposedUnit", - "description": "A quotient's unit: the numerator's unit per the denominator's. Either side may be a\nvariable." + "title": "DefinitionMembersRequest", + "description": "Body of `POST /api/datasets/{id}/members`. It may carry the canonical `definition` a\nsearch response gives for `id`, so the route answers before any mint registers it.\n\nA registered id needs no `definition`. A supplied one is admitted as a mint admits a\n`spec_id` sidecar: `definition.spec_id` must equal the path id, and the identity must hash\nto it. Nothing is written." }, - "ComposedUnitModel": { + "DefinitionModel": { "properties": { - "numerator": { - "anyOf": [ - { - "type": "string" - }, - { - "$ref": "#/components/schemas/ConvertedUnitModel" - }, - { - "$ref": "#/components/schemas/CountedStatVarModel" - } - ], - "title": "Numerator", - "description": "the unit of the measure divided" + "schema_version": { + "type": "integer", + "title": "Schema Version" }, - "denominator": { - "anyOf": [ - { - "type": "string" - }, - { - "$ref": "#/components/schemas/ConvertedUnitModel" - }, - { - "$ref": "#/components/schemas/CountedStatVarModel" - } - ], - "title": "Denominator", - "description": "the unit of the measure divided by" + "spec_id": { + "type": "string", + "title": "Spec Id" + }, + "identity": { + "additionalProperties": true, + "type": "object", + "title": "Identity", + "description": "the identity-core document, shaped as search.models.identity.BaseIdentity and published at GET /api/search/schema" } }, "additionalProperties": false, "type": "object", "required": [ - "numerator", - "denominator" + "schema_version", + "spec_id", + "identity" ], - "title": "ComposedUnitModel", - "description": "The unit of a quotient of two measures, read ` per `.\n\nEach side is a unit's graph name (its ref when the graph has none), a converted unit, or\nthe StatVar a unit-less side counts." + "title": "DefinitionModel" }, - "Constraint": { + "DefinitionOptionsRequest": { "properties": { - "property": { - "$ref": "#/components/schemas/NodeRef" + "schema_version": { + "type": "integer", + "const": 1, + "title": "Schema Version", + "default": 1 }, - "value": { - "$ref": "#/components/schemas/NodeRef" + "definition": { + "$ref": "#/components/schemas/CanonicalDefinition" } }, + "additionalProperties": false, "type": "object", "required": [ - "property", - "value" - ], - "title": "GraphDefinitionConstraint", - "description": "One constraint: the property and the value the variable fixes it at." - }, - "ContinentNode": { - "properties": { - "ref": { - "type": "string", - "title": "Ref", - "description": "the node's dcid" - }, - "label": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Label", - "description": "the node's name; for a Provenance, its parent Dataset's name where it has one. Null, and named in gaps, when the graph gives none" - }, - "types": { - "items": { - "type": "string" - }, - "type": "array", - "title": "Types", - "description": "the node's typeOf values, as the graph holds them" - }, - "description": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Description", - "description": "the node's prose in the graph; null when it has none" - }, - "links": { - "additionalProperties": { - "type": "string" - }, - "propertyNames": { - "enum": [ - "codes", - "children", - "members", - "countries", - "datasets", - "variables", - "facets" - ] - }, - "type": "object", - "title": "Links", - "description": "each list relation the node has, mapped to its route; empty when none" - }, - "gaps": { - "items": { - "type": "string" - }, - "type": "array", - "title": "Gaps", - "description": "the member path of every value this door cannot know" + "definition" + ], + "title": "DefinitionOptionsRequest", + "description": "Body of `POST /api/datasets/{id}/options`. It carries the canonical `definition` a search\nresponse gives for `id`, so the options route answers for an id no mint has registered.\n\nThe route admits and registers the definition as a `spec_id` mint registers its sidecar.\n`definition.spec_id` must equal the path id, and the identity must hash to it." + }, + "DefinitionResponse": { + "properties": { + "schema_version": { + "type": "integer", + "const": 1, + "title": "Schema Version", + "default": 1 }, - "built_from": { - "additionalProperties": { - "type": "string" - }, - "propertyNames": { - "enum": [ - "code_index", - "origin_catalogue", - "coverage_index", - "membership" - ] - }, - "type": "object", - "title": "Built From", - "description": "the build of each table the response read" + "definition": { + "$ref": "#/components/schemas/CanonicalDefinition" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "schema_version", + "definition" + ], + "title": "DefinitionResponse", + "description": "The register door's response: the verified\nidentity, echoed back whole." + }, + "DefinitionText": { + "properties": { + "of": { + "$ref": "#/components/schemas/NodeRef", + "description": "the part the text defines" }, - "kind": { + "text": { "type": "string", - "const": "continent", - "title": "Kind", - "default": "continent" - }, - "continent": { - "$ref": "#/components/schemas/PlaceBlock" + "title": "Text" } }, "type": "object", "required": [ - "ref", - "label", - "types", - "description", - "links", - "gaps", - "built_from", - "kind", - "continent" + "of", + "text" ], - "title": "ContinentNode" + "title": "GraphDefinitionText", + "description": "The graph's prose for one part of a definition." }, - "ContinentalUnionNode": { + "Departure": { "properties": { - "ref": { + "code": { "type": "string", - "title": "Ref", - "description": "the node's dcid" + "enum": [ + "closest_match", + "measure_not_applied", + "operation_not_applied", + "breakdown_not_applied", + "entity_unavailable", + "member_unavailable", + "year_unavailable", + "modelled_values", + "group_read_as_members", + "whole_total_read", + "whole_total_unpublished", + "direction_discarded", + "direction_inferred", + "scope_limited" + ], + "title": "Code", + "description": "what kind of departure this is. 'closest_match': the answer shows the nearest measure the graph holds, not the one asked; a client draws a muted 'Closest match:' lead before the heading, and on a candidates part, whose readings stand in for a measure with no data, once before the first reading. 'measure_not_applied': a named measure qualifier was not applied. 'operation_not_applied': an operation the request named (a share, a ranking) was not run, so the amounts behind it are shown. 'breakdown_not_applied': a breakdown the request named was not applied, so the total is shown. 'entity_unavailable': an entity the request named holds no values in the series the answer reads, one departure per role; for a role the request named as a group, asked is the request's words for the group and the text counts the members without values; the text names any source holding values there that Search does not read. 'member_unavailable': a variable of the answer holds no values under the source, unit and method a reading reads, so it shows none; asked names those variables and shown the source read, and the text names that source and its unit, so each reading of a candidates part states its own; editing the source or the set binding that names the variables clears it. 'year_unavailable': a named year or range falls outside the years served. 'modelled_values': the served values are modelled or estimated. 'group_read_as_members': a named group was read as its member entities; on a flow role the text names the amounts the group's published total counts that no member holds, and, for a group whose published total is not its members' sum, says the source publishes its own figure for the group. 'whole_total_read': a flow side is read as its whole population, the total its source publishes for every party of that side (official donors (DAC) for 'official donors' or a donor side the request named nothing on or summed over; official and private donors (DAC) for 'all donors'); the text says what the total holds and how to list the side's members: in the question's words ('by donor') on the raw_text door, with open_roles on the others. 'whole_total_unpublished': the request named a whole population ('all donors', 'all recipients') on a side whose dataset publishes no total of it and holds no party outside it, so the side is left unnamed and the answer covers every party the dataset holds there; asked is the request's words, and the text names the dataset. 'direction_discarded': a flow direction the request's own words named was not applied. 'direction_inferred': a place the request named without a direction is read on the one direction that holds data, which over names. 'scope_limited': a no_data answer's check covered only values the engine chose, which the request did not name; its text names only what the check covered ('This check covered only ODA.')" }, - "label": { + "binding_ref": { "anyOf": [ { "type": "string" @@ -5930,18 +9220,10 @@ "type": "null" } ], - "title": "Label", - "description": "the node's name; for a Provenance, its parent Dataset's name where it has one. Null, and named in gaps, when the graph gives none" - }, - "types": { - "items": { - "type": "string" - }, - "type": "array", - "title": "Types", - "description": "the node's typeOf values, as the graph holds them" + "title": "Binding Ref", + "description": "the identity binding whose edit clears this departure ('when:' for a year, 'how:' for a measure value, 'where:' or 'origin:' for a role's entities, 'unit:' for the price basis, 'source:' for the source); null for a departure no binding edit clears, such as an operation the engine does not run. A client links the departure to the sentence token carrying the same binding_ref when the plan has one; a candidates or no_data plan, and a how slot the heading leaves silent, may carry no such token" }, - "description": { + "asked": { "anyOf": [ { "type": "string" @@ -5950,264 +9232,259 @@ "type": "null" } ], - "title": "Description", - "description": "the node's prose in the graph; null when it has none" - }, - "links": { - "additionalProperties": { - "type": "string" - }, - "propertyNames": { - "enum": [ - "codes", - "children", - "members", - "countries", - "datasets", - "variables", - "facets" - ] - }, - "type": "object", - "title": "Links", - "description": "each list relation the node has, mapped to its route; empty when none" - }, - "gaps": { - "items": { - "type": "string" - }, - "type": "array", - "title": "Gaps", - "description": "the member path of every value this door cannot know" + "title": "Asked", + "description": "what the request named, in its own wording; null when it named nothing" }, - "built_from": { - "additionalProperties": { - "type": "string" - }, - "propertyNames": { - "enum": [ - "code_index", - "origin_catalogue", - "coverage_index", - "membership" - ] - }, - "type": "object", - "title": "Built From", - "description": "the build of each table the response read" + "shown": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Shown", + "description": "what the answer shows instead, as the heading states it; null when nothing" }, - "kind": { + "text": { "type": "string", - "const": "continental_union", - "title": "Kind", - "default": "continental_union" + "minLength": 1, + "title": "Text", + "description": "the departure as one or two short sentences for people: 'You asked for 2030. The data ends in 2024, so this shows 1973 to 2024.' On a no_data part no text claims the part shows anything. The envelope's composed sentence carries the same text as a segment='departure' token after its part's heading and byline, and so does the rendered_sentence of a part that is not definite" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "code", + "text" + ], + "title": "Departure", + "description": "One way this part's answer differs from what its request asked, stated\nfor people in `text` and for code in `code`, `asked`, and `shown`.\n\nDepartures live on the part (`_PartBase.departures`).\n`spec.resolved.rendered_sentence` states what the answer is, and a\ndeparture states how that differs from the request that produced it." + }, + "DeploymentFacetPolicy": { + "properties": { + "policy": { + "type": "string", + "title": "Policy", + "description": "the deployment default policy's own id" }, - "continental_union": { - "$ref": "#/components/schemas/PlaceBlock" + "version": { + "type": "string", + "title": "Version", + "description": "the policy id's own version" } }, "type": "object", "required": [ - "ref", - "label", - "types", - "description", - "links", - "gaps", - "built_from", - "kind", - "continental_union" + "policy", + "version" ], - "title": "ContinentalUnionNode" + "title": "DeploymentFacetPolicy", + "description": "This deployment's own default-facet policy: what an unbound facet\naxis falls back to once `default_facet_policies_live` (a graph-declared,\nper-StatVar policy) is `false`. See `docs/datasets-facet-policy.md`." }, - "ConversionCurrency": { + "DerivedManifest": { "properties": { - "code": { + "spec_id": { "type": "string", - "title": "Code", - "description": "the ISO 4217 code a unit request names the currency by" + "pattern": "^ops_[0-9a-f]{32}$", + "title": "Spec Id" }, - "noun": { + "content_version": { "type": "string", - "title": "Noun", - "description": "the plural English noun the sentence's unit token names the currency by ('euros', 'Guatemalan quetzales')" + "pattern": "^ocv_[0-9a-f]{32}$", + "title": "Content Version" }, - "current_years": { + "retention": { + "$ref": "#/components/schemas/RetentionModel" + }, + "citation": { + "$ref": "#/components/schemas/CitationModel", + "description": "the sources of every root, each once" + }, + "recipe": { "anyOf": [ { - "$ref": "#/components/schemas/TimeWindow" + "$ref": "#/components/schemas/DerivedRecipe" }, { "type": "null" } ], - "description": "the first and last years a current-price request in this currency shows, the longest run of consecutive years, inside the years the answer serves (download.window), in which the recipe's exchange-rate table holds a rate for this currency and for the native currency of every facet the answer serves. It equals download.window when the conversion keeps every served year. With no download.window, the run the tables hold. Null when no year converts" + "description": "null for a frame stored without a recipe" }, - "constant_years": { - "anyOf": [ - { - "$ref": "#/components/schemas/TimeWindow" + "roots": { + "items": { + "$ref": "#/components/schemas/DerivedManifestRoot" + }, + "type": "array", + "title": "Roots", + "description": "each root dataset version once, in order" + }, + "resolved_periods": { + "items": { + "additionalProperties": { + "$ref": "#/components/schemas/JsonValue" }, - { - "type": "null" - } - ], - "description": "the first and last years a constant-price request in this currency shows, at any base year from base_year_min to base_year_max, the longest run of consecutive years, read as current_years is, in which the exchange-rate table holds a rate for the native currency of every facet the answer serves and the deflator table a value for at least one entity the answer serves on the recipe's deflator role, bound or open. The conversion leaves out an entity's rows in the years its deflator lacks, and the answer names them (deflator_missing_omitted). Null when no year converts or no base year exists" + "type": "object" + }, + "type": "array", + "title": "Resolved Periods", + "description": "each period the recipe states relative to the latest, with its period" }, - "base_year_min": { + "anchor": { "anyOf": [ { - "type": "integer" + "$ref": "#/components/schemas/RecipeAnchor" }, { "type": "null" } ], - "title": "Base Year Min", - "description": "the first base year a constant-price request in this currency converts at. With base_year_max it spans the run of consecutive years, ending at the latest, in which the deflator table holds an actual value, the exchange-rate table a rate for the currency, and the deflator table a value for at least one entity the answer serves on the recipe's deflator role. The conversion leaves out every row of an entity whose deflator lacks the base year, and the answer names it (deflator_missing_omitted). Null when no such year exists" + "description": "the latest period of the rolling anchor and the series without a row at it" }, - "base_year_max": { + "left_out": { "anyOf": [ { - "type": "integer" + "items": { + "$ref": "#/components/schemas/RecipeDroppedSeries" + }, + "type": "array" }, { "type": "null" } ], - "title": "Base Year Max", - "description": "the last base year a constant-price request in this currency converts at" - } - }, - "additionalProperties": false, - "type": "object", - "required": [ - "code", - "noun", - "current_years", - "constant_years", - "base_year_min", - "base_year_max" - ], - "title": "ConversionCurrency", - "description": "One currency a unit request can convert this answer to, with the years each price\nbasis converts. A request whose tables leave out some of the years the answer serves\nshows the years stated here, and departs `year_unavailable` naming the table." - }, - "ConvertedUnitModel": { - "properties": { - "currency": { - "type": "string", - "title": "Currency", - "description": "the ISO 4217 code of the currency the values are in" - }, - "prices": { - "type": "string", - "enum": [ - "current", - "constant" - ], - "title": "Prices", - "description": "the price basis of the values" + "title": "Left Out", + "description": "every series a step of the recipe dropped for a data gap, step by step; null for a recipe stored without them" }, - "base_year": { + "left_out_complete": { "anyOf": [ { - "type": "integer" + "type": "boolean" }, { "type": "null" } ], - "title": "Base Year", - "description": "the base year of constant prices, absent for current prices" + "title": "Left Out Complete", + "description": "false when the steps dropped more series than `left_out` lists" } }, "additionalProperties": false, "type": "object", "required": [ - "currency", - "prices" + "spec_id", + "content_version", + "retention", + "citation", + "recipe", + "roots", + "resolved_periods", + "anchor", + "left_out", + "left_out_complete" ], - "title": "ConvertedUnitModel", - "description": "A converted unit, as the frame's `unit` cell states it." + "title": "DerivedManifest", + "description": "What a client builds a derived Dataset from. See the module docstring." }, - "CountedEntityYearsModel": { + "DerivedManifestRoot": { "properties": { - "count": { - "type": "integer", - "title": "Count", - "description": "how many entities there are" + "spec_id": { + "type": "string", + "title": "Spec Id" }, - "entities": { - "items": { - "$ref": "#/components/schemas/EntityYearsModel" + "content_version": { + "type": "string", + "title": "Content Version" + }, + "rendering": { + "additionalProperties": { + "$ref": "#/components/schemas/JsonValue" }, - "type": "array", - "title": "Entities", - "description": "the first ten of them, sorted" + "type": "object", + "title": "Rendering" } }, "additionalProperties": false, "type": "object", "required": [ - "count", - "entities" + "spec_id", + "content_version", + "rendering" ], - "title": "CountedEntityYearsModel", - "description": "The entities a conversion left rows out of, each with its years: how many, and the\nfirst ten, sorted (`materialise.codes.CountedEntityYears`). The message states the count\nand names none, so a reader labels the refs." + "title": "DerivedManifestRoot" }, - "CountedRefsModel": { + "DerivedRecipe": { "properties": { - "count": { - "type": "integer", - "title": "Count", - "description": "how many there are" + "normal_form_hash": { + "type": "string", + "title": "Normal Form Hash" }, - "refs": { + "replay_key": { + "type": "string", + "title": "Replay Key" + }, + "execution_identity": { + "type": "string", + "title": "Execution Identity" + }, + "tree": { + "additionalProperties": { + "$ref": "#/components/schemas/JsonValue" + }, + "type": "object", + "title": "Tree", + "description": "the recipe's op-spec tree" + }, + "roots": { "items": { - "type": "string" + "$ref": "#/components/schemas/JsonValue" }, "type": "array", - "title": "Refs", - "description": "the `dcid:` refs of the first five of them, ten for omitted_entities: a group's members in request order, entities sorted" + "title": "Roots", + "description": "how the recipe read each root dataset" } }, "additionalProperties": false, "type": "object", "required": [ - "count", - "refs" + "normal_form_hash", + "replay_key", + "execution_identity", + "tree", + "roots" ], - "title": "CountedRefsModel", - "description": "The things of one kind a warning counts: how many, and the `dcid:` refs of the first\nfive, or ten for a conversion's left-out entities (`materialise.codes.CountedRefs`). The message states the count and names none, so a\nreader labels the refs." + "title": "DerivedRecipe" }, - "CountedStatVarModel": { + "DerivedRoot": { "properties": { - "stat_var": { + "spec_id": { "type": "string", - "title": "Stat Var", - "description": "the StatVar's `dcid:`-prefixed ref, as the frame holds it" + "pattern": "^ops_[0-9a-f]{32}$", + "title": "Spec Id" }, - "label": { + "content_version": { "type": "string", - "title": "Label", - "description": "the StatVar's graph name, or its ref without `dcid:` when the graph has none" + "pattern": "^ocv_[0-9a-f]{32}$", + "title": "Content Version" } }, "additionalProperties": false, "type": "object", "required": [ - "stat_var", - "label" + "spec_id", + "content_version" ], - "title": "CountedStatVarModel", - "description": "One side of a composed unit whose measure declares no unit, named by its StatVar." + "title": "DerivedRoot", + "description": "A frame an earlier analysis stored." }, - "CountryNode": { + "DescribedProperty": { "properties": { "ref": { "type": "string", - "title": "Ref", - "description": "the node's dcid" + "title": "Ref" }, "label": { "anyOf": [ @@ -6218,448 +9495,415 @@ "type": "null" } ], - "title": "Label", - "description": "the node's name; for a Provenance, its parent Dataset's name where it has one. Null, and named in gaps, when the graph gives none" - }, - "types": { - "items": { - "type": "string" - }, - "type": "array", - "title": "Types", - "description": "the node's typeOf values, as the graph holds them" - }, - "description": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Description", - "description": "the node's prose in the graph; null when it has none" - }, - "links": { - "additionalProperties": { - "type": "string" - }, - "propertyNames": { - "enum": [ - "codes", - "children", - "members", - "countries", - "datasets", - "variables", - "facets" - ] - }, - "type": "object", - "title": "Links", - "description": "each list relation the node has, mapped to its route; empty when none" - }, - "gaps": { - "items": { - "type": "string" - }, - "type": "array", - "title": "Gaps", - "description": "the member path of every value this door cannot know" - }, - "built_from": { - "additionalProperties": { - "type": "string" - }, - "propertyNames": { - "enum": [ - "code_index", - "origin_catalogue", - "coverage_index", - "membership" - ] - }, - "type": "object", - "title": "Built From", - "description": "the build of each table the response read" - }, - "kind": { - "type": "string", - "const": "country", - "title": "Kind", - "default": "country" - }, - "country": { - "$ref": "#/components/schemas/PlaceBlock" - } - }, - "type": "object", - "required": [ - "ref", - "label", - "types", - "description", - "links", - "gaps", - "built_from", - "kind", - "country" - ], - "title": "CountryNode" - }, - "Counts": { - "properties": { - "indicators": { - "type": "integer", - "title": "Indicators", - "description": "distinct StatVars search can serve: base, DFO and coverage variables" - }, - "datasets": { - "type": "integer", - "title": "Datasets", - "description": "distinct source-index entries of the admitted provenances" - }, - "publishers": { - "type": "integer", - "title": "Publishers", - "description": "distinct sources of the admitted provenances" - }, - "countries": { - "type": "integer", - "title": "Countries", - "description": "countries with base data in the origin catalogue or coverage rows" - }, - "aid": { - "$ref": "#/components/schemas/AidCounts" + "title": "Label" } }, "additionalProperties": false, "type": "object", "required": [ - "indicators", - "datasets", - "publishers", - "countries", - "aid" + "ref", + "label" ], - "title": "Counts", - "description": "What DFO holds, counted from one origin catalogue build and one\ncoverage index build." + "title": "DescribedProperty", + "description": "The open dimension a values page lists, and its label (`null` where none is known)." }, - "CoverageBare": { + "DescribedValue": { "properties": { - "kind": { + "ref": { "type": "string", - "const": "bare", - "title": "Kind", - "description": "coverage kind discriminator", - "default": "bare" - }, - "has_data": { - "type": "boolean", - "title": "Has Data", - "description": "whether the region has any observations" + "title": "Ref" }, - "window": { + "label": { "anyOf": [ { - "$ref": "#/components/schemas/TimeWindow" + "type": "string" }, { "type": "null" } ], - "description": "the date window, when known" + "title": "Label" + }, + "variables": { + "type": "integer", + "minimum": 0.0, + "title": "Variables" } }, "additionalProperties": false, "type": "object", "required": [ - "has_data" + "ref", + "label", + "variables" ], - "title": "CoverageBare", - "description": "Observation footprint with no count or dimensions; an honest could-not-count." + "title": "DescribedValue", + "description": "One value of an open dimension, its label (`null` where none is known), and how many of\nthe version's variables with data hold it." }, - "CoverageBreadth": { + "DescriptionValuesPage": { + "$id": "https://schemas.dfo.one.org/datasets/v1/description-values-page.json", "properties": { - "kind": { - "type": "string", - "const": "breadth", - "title": "Kind", - "description": "coverage kind discriminator", - "default": "breadth" - }, - "has_data": { - "type": "boolean", - "title": "Has Data", - "description": "whether the region has any observations" + "property": { + "$ref": "#/components/schemas/DescribedProperty" }, - "dimensions": { + "items": { "items": { - "$ref": "#/components/schemas/BreadthDim" + "$ref": "#/components/schemas/DescribedValue" }, "type": "array", - "minItems": 1, - "title": "Dimensions", - "description": "non-empty on breadth; structured dimension counts" + "title": "Items" }, - "window": { + "next_cursor": { "anyOf": [ { - "$ref": "#/components/schemas/TimeWindow" + "type": "string" }, { "type": "null" } ], - "description": "the date window this breadth applies to" + "title": "Next Cursor" + }, + "complete": { + "type": "boolean", + "title": "Complete" } }, "additionalProperties": false, "type": "object", "required": [ - "has_data", - "dimensions" + "property", + "items", + "next_cursor", + "complete" ], - "title": "CoverageBreadth", - "description": "Observation footprint expressed as structured breadth dimensions." + "title": "DescriptionValuesPage", + "description": "One page of `GET /api/datasets/{id}/{content_version}/description/values`: the values\nthe version's record holds for one open dimension, most variables first, ties ordered by\ndcid. `next_cursor` continues the list after the page's last value and is `null` on its\nlast page, where `complete` is true." }, - "CoverageDimension": { + "DiagnosticModel": { "properties": { - "label": { + "code": { "type": "string", - "title": "Label" + "title": "Code" }, - "count": { - "type": "integer", - "title": "Count" + "severity": { + "type": "string", + "title": "Severity" }, - "axis": { + "message": { + "type": "string", + "title": "Message" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "code", + "severity", + "message" + ], + "title": "DiagnosticModel", + "description": "One manifest diagnostic: a fact about how this response was produced that a developer\nreads and a dataset's description leaves out, since it states nothing about the data.\n`processing_level_undeclared` and `origin_catalogue_stale` are the codes it carries." + }, + "Diagnostics": { + "properties": { + "engine_build": { + "type": "string", + "title": "Engine Build", + "description": "the commit sha the image was built from, the same value the x-dfo-commit response header carries; distinct from schema_version" + }, + "trace_id": { + "type": "string", + "title": "Trace Id", + "description": "this request's trace_id, shared verbatim with every RFC 9457 problem-details body and the SSE stream's `done` event" + }, + "warnings": { + "items": { + "$ref": "#/components/schemas/Warning" + }, + "type": "array", + "title": "Warnings", + "description": "degraded-mode, applied-signal, partial-graph signals" + }, + "timing_ms": { "anyOf": [ { - "$ref": "#/components/schemas/RoleAxis" + "$ref": "#/components/schemas/Timing" }, { "type": "null" } - ] + ], + "description": "latency breakdown" }, - "noun": { + "llm_usage": { "anyOf": [ { - "$ref": "#/components/schemas/DimensionNoun" + "additionalProperties": { + "type": "integer" + }, + "type": "object" }, { "type": "null" } ], - "description": "what the members this dimension counts are called, by the frame's flow family: provider and recipient for aid, creditor and debtor for debt. Absent for a dimension on no flow axis, such as `years`, and on a version stored without it" + "title": "Llm Usage", + "description": "per-request LLM token counts {input_tokens, output_tokens, cached_tokens}, plus {jev_input_tokens, jev_output_tokens} when Jev answered a call, and uncounted_calls, the calls sent whose tokens no response reported" + }, + "timed_out": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "null" + } + ], + "title": "Timed Out", + "description": "True when the pipeline's soft deadline truncated this result to a partial response; False when it ran to completion. None on the SSE response event (whose `done` event carries the authoritative flag instead) -- only resolve_async's buffered ResolveResponse populates this, since a buffered caller has no `done` event of its own to read." } }, "additionalProperties": false, "type": "object", "required": [ - "label", - "count" + "engine_build", + "trace_id", + "warnings" ], - "title": "CoverageDimension", - "description": "One coverage dimension. `axis` is `axis_for_role(label)`: the flow axis of a dimension\nlabelled by a declared role, and `None` for `years` and unmapped roles. Validation derives\nit, so a stored body written without it carries it once loaded. `noun` is set at the mint\nfrom the version's flow family (`dfo_platform.roles.role_wording`), which the label and\naxis do not fix, so a body stored without it carries none (`year_coverage_counted`): a\n`None` noun is left out of every dump." + "title": "Diagnostics", + "description": "Run health, warnings, timing, and build stamp." }, - "CoverageExact": { + "DimensionNoun": { "properties": { - "kind": { + "singular": { "type": "string", - "const": "exact", - "title": "Kind", - "description": "coverage kind discriminator", - "default": "exact" - }, - "has_data": { - "type": "boolean", - "title": "Has Data", - "description": "whether the exact observation_count has observations in the resolved window, or in full history when window is absent" - }, - "observation_count": { - "type": "integer", - "title": "Observation Count", - "description": "exact distinct (date, facet) observation pairs for resolved stat_vars and entities in the resolved window, or full history when window is absent" + "title": "Singular" }, - "evidence": { + "plural": { + "type": "string", + "title": "Plural" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "singular", + "plural" + ], + "title": "DimensionNoun", + "description": "What one member of a flow dimension is called, and several of them." + }, + "DocumentErrorEntry": { + "properties": { + "member": { "type": "string", "enum": [ - "facet_metadata", - "observed" + "transformation_log", + "version_history", + "methodology.description", + "data_notes" ], - "title": "Evidence", - "description": "provenance of observation_count. 'facet_metadata': the count comes from the graph's facet index and no observation series was delivered for this spec in this payload. 'observed': a preview series was delivered for this spec in this payload, and observation_count is still the facet-index count, now backed by fetchable data. A streaming response's `response` event ships before any observation fetch, so it always carries 'facet_metadata'; its trailing `observations` event carries the series. dfo-apis wire field outside the spec-kit contract.", - "default": "facet_metadata" + "title": "Member", + "description": "the wire path the document fills" }, - "dimensions": { + "line": { "anyOf": [ { - "items": { - "$ref": "#/components/schemas/BreadthDim" - }, - "type": "array" + "type": "integer" }, { "type": "null" } ], - "title": "Dimensions", - "description": "optional per-facet breadth dimensions; the observations dimension is window-narrowed to agree with observation_count when window is set, lifetime otherwise" + "title": "Line", + "description": "1-based line in the decoded document where the problem starts, or null" }, - "window": { - "anyOf": [ - { - "$ref": "#/components/schemas/TimeWindow" - }, - { - "type": "null" - } + "reason": { + "type": "string", + "enum": [ + "undecodable", + "empty_document", + "content_outside_section", + "unexpected_heading_level", + "heading_not_plain_text", + "empty_heading", + "empty_section", + "disallowed_block", + "raw_html", + "hard_break", + "invalid_release_heading", + "missing_release_title", + "release_dates_not_descending", + "duplicate_release_date", + "unknown_change_kind", + "duplicate_change_kind", + "not_single_bullet_list", + "list_item_not_single_paragraph", + "document_too_large", + "nesting_too_deep", + "conflicting_values" ], - "description": "the date window this count applies to" + "title": "Reason", + "description": "the template rule the document breaks" } }, - "additionalProperties": false, "type": "object", "required": [ - "has_data", - "observation_count" + "member", + "line", + "reason" ], - "title": "CoverageExact", - "description": "Observation footprint with an exact count for its resolved window." + "title": "DocumentErrorEntry", + "description": "A Markdown document the source carries that this door could not serve.\nThe member it fills is empty and named in `gaps`." }, - "CoverageModel": { + "DownloadFacts": { "properties": { "rows": { - "type": "integer", - "title": "Rows" - }, - "dimensions": { - "items": { - "$ref": "#/components/schemas/CoverageDimension" - }, - "type": "array", - "title": "Dimensions" - }, - "window": { "anyOf": [ { - "additionalProperties": true, - "type": "object" + "type": "integer" }, { "type": "null" } ], - "title": "Window" + "title": "Rows", + "description": "the rows the definition's series serve: one per series and date, totals included. A long-layout CSV or XLSX keeps the rows where a role the Datasets options document lists in long_layout_totals holds a total out of its main table, so that table can hold fewer. Null when it could understate: a served member the coverage artifact does not hold" }, - "recent_years": { + "rows_exact": { + "type": "boolean", + "title": "Rows Exact", + "description": "true when rows equals the mint's coverage.rows. Under a unit request rows counts only the rows the conversion keeps: at constant prices each entity's rows in the years its deflator holds, none when it lacks the base year. False when rows is an upper bound: a unit request whose conversion cannot be read from the loaded conversion tables (none loaded, served facets under several recipes or in a unit that is no currency, or no single deflator role), or a series whose facets carry no complete date list. False when rows is null" + }, + "series": { "anyOf": [ { - "items": { - "$ref": "#/components/schemas/YearCoverage" - }, - "type": "array" + "type": "integer" }, { "type": "null" } ], - "title": "Recent Years", - "description": "three calendar years, newest first, each with the counts the coverage index held of the series the frame's run read when the version was minted. They end at the newest year a counted series held up to the year the index was built in, so a year after the frame's can hold data the frame leaves out. Stated for a latest window and for a named year at or after the year a latest window serves, and absent for an earlier named year" + "title": "Series", + "description": "the series in the file: distinct (StatVar, entities) with a point, the mint's series_count. Null when rows is null" }, - "elected_year": { + "window": { "anyOf": [ { - "type": "integer" + "$ref": "#/components/schemas/TimeWindow" }, { "type": "null" } ], - "title": "Elected Year", - "description": "the year a latest window served when the version was minted. It is the frame's year under a latest window. A frame of a named year after it holds a year a latest window passes over" + "description": "the first and last years of the file's points; null when rows is null" }, - "fullest_year": { + "licence": { "anyOf": [ { - "$ref": "#/components/schemas/YearCoverage" + "$ref": "#/components/schemas/DownloadLicence" }, { "type": "null" } ], - "description": "the year holding the most series of the ten calendar years ending at the newest of `recent_years`, stated when it is earlier than those three and the frame's year holds under the share of its series a latest window's year must hold" + "description": "the licence of the one provenance the answer serves, from the origin catalogue; null when it serves several, or the catalogue names no single licence for it" } }, "additionalProperties": false, "type": "object", "required": [ - "rows", - "dimensions" + "rows_exact" ], - "title": "CoverageModel", - "description": "A frame's row and dimension counts and its applied window.\n\n`recent_years`, `elected_year` and `fullest_year` set the frame's one year beside the\nyears around it (`datasets_api.manifest.year_coverage`). They are counted once, when\nthe version is minted, and stored with it, all three or none, so every read of the\nversion states the same ones. A `None` member is left out of every dump." + "title": "DownloadFacts", + "description": "What a Datasets mint of this Spec's definition writes in its default file (no\ngrouping), known before the first download. Rows and series count what the answer's\nread plan serves over the identity's whole window: every year for no window, the\nrange for a range, and each series' latest year for `latest`." }, - "CreateComponentBody": { + "DownloadLicence": { "properties": { - "intent": { - "additionalProperties": true, - "type": "object", - "title": "Intent" + "label": { + "type": "string", + "title": "Label", + "description": "the licence's name: the `name` of the licenseType node the provenances of the provenance's source-index entry agree on" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "label" + ], + "title": "DownloadLicence", + "description": "The licence of the provenance a Spec's file cites. Its terms page is on the\nprovenance's source page." + }, + "DroppedEntry": { + "properties": { + "entry": { + "$ref": "#/components/schemas/Entry", + "description": "the entry left out" }, - "composition_id": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } + "code": { + "type": "string", + "enum": [ + "carried_choice_not_applied", + "stated_choice_not_applied" ], - "title": "Composition Id" + "title": "Code", + "description": "carried_choice_not_applied for a carried entry, stated_choice_not_applied for an entry the request's words stated", + "default": "carried_choice_not_applied" }, - "write_token": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Write Token", - "description": "a cmw_ token this client minted for the new component: \"cmw_\" + secrets.token_urlsafe(16) or an equivalent CSPRNG, 22 url-safe base64 characters after the prefix. It becomes the component's write token and keys the create: a retry with the same write_token, intent and composition_id returns the first create's reply, and a different request with it is refused as request_invalid. Mint a new one for each create. Not allowed with composition_id \"new\"." + "cause": { + "type": "string", + "title": "Cause", + "description": "why the entry cannot apply: entry_on_axis (another entry settles the axis), axis_absent, option_unknown, the option's unavailability reason (a ScopeReasonCode), not_served when the option is available but the answer serves another, or, where compile weighs the entry, option_unavailable, conflicts_with_entry or the conflict that blocks it" } }, "additionalProperties": false, "type": "object", "required": [ - "intent" + "entry", + "cause" ], - "title": "CreateComponentBody", - "description": "The create route's body. `write_token` is checked by `write_component`, which refuses a\nmalformed token, or one sent with `composition_id` \"new\", as `request_invalid`." + "title": "DroppedEntry", + "description": "An entry left out because it cannot apply to this part: a carried entry, or on a\nfresh search an entry the request's words stated." }, - "CreateReplyResponse": { + "EnrichmentCoverageCountsModel": { "properties": { - "component_id": { - "type": "string", - "title": "Component Id", - "description": "the newly minted component's own id" + "entities": { + "type": "integer", + "title": "Entities" }, - "revision": { + "covered": { "type": "integer", - "title": "Revision", - "description": "the first revision a create mints, always 1" + "title": "Covered" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "entities", + "covered" + ], + "title": "EnrichmentCoverageCountsModel" + }, + "EnrichmentOptionModel": { + "properties": { + "column": { + "type": "string", + "title": "Column" }, - "catalog_version": { + "field": { "type": "string", - "title": "Catalog Version", - "description": "the catalogue release this revision minted under" + "title": "Field" }, - "composition_id": { + "token": { + "type": "string", + "title": "Token" + }, + "state": { + "type": "string", + "title": "State" + }, + "reason": { "anyOf": [ { "type": "string" @@ -6668,234 +9912,307 @@ "type": "null" } ], - "title": "Composition Id", - "description": "the composition this component belongs to, null outside one" + "title": "Reason" }, - "composition_revision": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ], - "title": "Composition Revision", - "description": "the composition's current head revision, null outside one" + "coverage": { + "$ref": "#/components/schemas/EnrichmentCoverageCountsModel" }, - "changed": { + "missing": { "items": { - "$ref": "#/components/schemas/ChangedFieldModel" + "$ref": "#/components/schemas/MissingEntityModel" }, "type": "array", - "title": "Changed", - "description": "always empty, since a create carries no prior intent to compare against" - }, - "fact_summary": { - "$ref": "#/components/schemas/FactSummaryModel", - "description": "the closed, token-capped fact summary this revision reports" + "title": "Missing" }, - "resolved_payload": { - "additionalProperties": true, - "type": "object", - "title": "Resolved Payload", - "description": "the revision's stored resolved payload, verbatim: the catalogue envelope {schema_version, catalog_version, component_id, revision, provenance, component}, validated against the catalogue release's envelope schema (dfo-spec-kit envelope.schema.json) when minted. GET /api/presentation/release serves the pinned release's envelope_schema and the component_schemas its component field $refs by $id; every payload this door serves carries that pinned catalog_version." + "truncated": { + "type": "boolean", + "title": "Truncated", + "default": false }, - "affordance": { + "in_long_layout": { + "type": "boolean", + "title": "In Long Layout", + "description": "true when a long-layout download writes this information with no columns token, so naming the token there adds nothing: {role}_label, and the party fields of a role on a flow axis, which its {role}_kind column reads in words. Pivot output and the frame layout write the column only when the token asks for it", + "default": false + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "column", + "field", + "token", + "state", + "coverage" + ], + "title": "EnrichmentOptionModel", + "description": "One `(entity column, field)` enrichment this deployment enables,\nwith `token` naming the exact `{column}_{field}` the `columns` option\naccepts to request it." + }, + "EntitiesBinding": { + "properties": { + "kind": { "type": "string", - "title": "Affordance", - "description": "this door's own line naming the revise and read routes for this component" + "const": "entities", + "title": "Kind", + "default": "entities" + }, + "role": { + "$ref": "#/components/schemas/RoleAxis", + "description": "the role the entities join" + }, + "add": { + "items": { + "type": "string" + }, + "type": "array", + "title": "Add", + "description": "the entity dcids the option adds, sorted; [] for the members alone" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "role", + "add" + ], + "title": "EntitiesBinding", + "description": "An option that adds entities to one role of the identity, beside its members." + }, + "EntityCounts": { + "properties": { + "parties": { + "type": "integer", + "title": "Parties", + "description": "entities with figures of their own" + }, + "private": { + "type": "integer", + "title": "Private", + "description": "the parties whose class is private, a subset of parties" + }, + "totals": { + "type": "integer", + "title": "Totals", + "description": "entities that hold other entities' figures" + }, + "residual": { + "type": "integer", + "title": "Residual", + "description": "entities holding figures no other entity does" + }, + "unclassified": { + "type": "integer", + "title": "Unclassified", + "description": "entities the code index does not list" + } + }, + "type": "object", + "required": [ + "parties", + "private", + "totals", + "residual", + "unclassified" + ], + "title": "GraphAvailabilityEntityCounts", + "description": "The distinct entities in one role, split by their kind in the code index." + }, + "EntityCoverage": { + "properties": { + "entity": { + "$ref": "#/components/schemas/StepRef" }, - "write_token": { - "type": "string", - "title": "Write Token", - "description": "the cmw_ token that grants revising this component, sent back as the x-dfo-write-token header. A server-minted token appears only in this reply; a token the create sent as write_token is echoed, and a replayed create returns it again." + "periods": { + "type": "integer", + "minimum": 0.0, + "title": "Periods" }, - "composition_write_token": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Composition Write Token", - "description": "the cpw_ token that grants creating components into the composition this create started with composition_id \"new\", sent back as the x-dfo-write-token header. Present only on that create." + "of": { + "type": "integer", + "minimum": 0.0, + "title": "Of" } }, "additionalProperties": false, "type": "object", "required": [ - "component_id", - "revision", - "catalog_version", - "composition_id", - "composition_revision", - "changed", - "fact_summary", - "resolved_payload", - "affordance", - "write_token" + "entity", + "periods", + "of" ], - "title": "CreateReplyResponse", - "description": "`POST /api/presentation/components`'s 201 body. It carries\n`WriteReplyResponse`'s fields plus this door's own `affordance` line\nnaming the freshly minted component's revise and read routes." + "title": "EntityCoverage", + "description": "How many of the window's periods one ranked entity holds." }, - "DataBuilds": { + "EntityGroup": { "properties": { - "graph_generation": { + "ref": { "anyOf": [ { - "type": "string" + "type": "string", + "maxLength": 1024 }, { "type": "null" } ], - "title": "Graph Generation", - "description": "the graph generation token: the graph service's Cloud Run revisions last read, joined with +; null while unknown" + "title": "Ref", + "description": "the group's own graph node, when the graph holds one; null otherwise" }, - "origin_catalogue": { + "label": { + "type": "string", + "maxLength": 120, + "minLength": 1, + "title": "Label", + "description": "the group's name as the request gave it, plain text" + }, + "entity_type": { "anyOf": [ { - "type": "string" + "type": "string", + "maxLength": 1024 }, { "type": "null" } ], - "title": "Origin Catalogue", - "description": "build id of the origin catalogue this request is bound to" + "title": "Entity Type", + "description": "the graph type of the group's own node, e.g. Continent, UNGeoRegion, ContinentalUnion; null when the graph holds no node for the group" }, - "coverage_index": { + "total": { "anyOf": [ { - "type": "string" + "type": "string", + "maxLength": 1024 }, { "type": "null" } ], - "title": "Coverage Index", - "description": "build id of the series coverage index; null when none is loaded" + "title": "Total", + "description": "the party the dataset publishes as the group's total, which the role binds in place of the members (DACAfrica for Africa); null when the role binds the members" }, - "code_index": { + "group_id": { "anyOf": [ { - "type": "string" + "type": "string", + "maxLength": 1024 }, { "type": "null" } ], - "title": "Code Index", - "description": "content hash of the packaged code index export" - } - }, - "type": "object", - "title": "GraphDataBuilds", - "description": "The data builds this process serves, each null where it is unknown or absent." - }, - "DatasetEntry": { - "properties": { - "ref": { - "type": "string", - "title": "Ref" - }, - "label": { - "type": "string", - "title": "Label" + "title": "Group Id", + "description": "the membership registry's id for a group the graph holds no node for, e.g. groups/OECD.DAC.Region.Asia; null when ref is set or the group is no registry group" }, - "provenances": { - "items": { - "$ref": "#/components/schemas/ProvenanceEntry" - }, - "type": "array", - "title": "Provenances" + "members": { + "anyOf": [ + { + "items": { + "type": "string", + "maxLength": 1024 + }, + "type": "array", + "maxItems": 1024 + }, + { + "type": "null" + } + ], + "title": "Members", + "description": "for a role that binds the group's published total (total), the group's members as the membership registry lists them, sorted, e.g. the 32 DAC member countries for DAC countries, total; the residuals a regional total counts beside them are not listed. Absent when the role binds the members or the registry lists none for the group. Derived on every answer; a posted value is ignored" }, - "description": { + "whole_of": { "anyOf": [ { - "type": "string" + "items": { + "type": "string", + "enum": [ + "official", + "private", + "residual" + ] + }, + "type": "array" }, { "type": "null" } ], - "title": "Description", - "description": "its sole Provenance's description, as `details.description`; null when it has several" + "title": "Whole Of", + "description": "the classes of party the role's whole population covers, sorted: official, private or residual, e.g. [\"official\"] for Official Donors, Total, which holds every official donor and no private one; absent for any other group" }, - "license_type": { + "holds_multilaterals": { "anyOf": [ { - "type": "string" + "type": "boolean" }, { "type": "null" } ], - "title": "License Type", - "description": "licence label every Provenance agrees on, as `license.type`; null when they disagree or one has none" + "title": "Holds Multilaterals", + "description": "for a donor role that binds a published total (total) or reads as its whole population (whole_of), whether that population holds a multilateral organisation (see ResolvedEntity.multilateral): false for DAC countries, total, whose members are countries, true for Official Donors, Total in DAC2a. Absent for any other group and for a total whose members the registry does not list. Derived on every answer; a posted value is ignored" }, - "update_cadence": { + "side_classes": { "anyOf": [ { - "type": "string" + "items": { + "type": "string", + "enum": [ + "official", + "private", + "residual" + ] + }, + "type": "array" }, { "type": "null" } ], - "title": "Update Cadence", - "description": "release cadence label every Provenance agrees on, as `license.update_cadence`; null when they disagree or one has none" + "title": "Side Classes", + "description": "for a role read as its whole population, the classes of party, totals aside, the answer's dataset publishes on that side, sorted, e.g. [\"official\", \"private\", \"residual\"] for donors in DAC2a; a class here and not in whole_of, such as \"private\", is outside the total. Absent for any other group. Derived from the identity on every answer; a posted value is ignored" }, - "years_covered": { + "left_out": { "anyOf": [ { - "type": "string" + "items": { + "type": "string" + }, + "type": "array", + "maxItems": 64 }, { "type": "null" } ], - "title": "Years Covered", - "description": "`YYYY` or `YYYY-YYYY` span of its Provenances' observation dates, as `scope_and_units.years_covered`; null when either end is unknown" + "title": "Left Out", + "description": "for a group the role reads as its members, the labels of the residuals the group's published total counts beside the members that the answer leaves out and its dataset publishes on the role's side, in the total's order, e.g. [\"Africa, unallocated by country (DAC)\"] for Africa read as its countries. Absent when the members leave nothing out, for a group the role reads as its total or whole population, and on a role outside a flow. Derived on every answer; a posted value is ignored" }, - "source_url": { + "sum_differs": { "anyOf": [ { - "type": "string" + "type": "boolean" }, { "type": "null" } ], - "title": "Source Url", - "description": "the publication's page, as `details.source_url`: the Dataset's url, else its sole Provenance's" + "title": "Sum Differs", + "description": "for a group the role reads as its members, true when the dataset publishes its own figure for the group's total and that figure is not the members' sum, so it can differ from one built from them. Absent otherwise. Derived on every answer; a posted value is ignored" } }, + "additionalProperties": false, "type": "object", "required": [ - "ref", - "label", - "provenances", - "description", - "license_type", - "update_cadence", - "years_covered", - "source_url" + "label" ], - "title": "DatasetEntry", - "description": "A Dataset and the admitted provenances that belong to it. A provenance with\nno Dataset forms its own entry, keyed by the provenance, so `ref` and `label`\nare the provenance's and `provenances` holds that one provenance.\n\nThe card facts (`description`, `license_type`, `update_cadence`,\n`years_covered`, `source_url`) equal the same members of\n`GET /api/graph/documentation/{ref}` for the graph the loaded catalogue\nbuild read. They are null on UN System Data Commons entries." + "title": "EntityGroup", + "description": "A named group whose members fill one entity role, as the request named it\n(\"EU member states\"). The members themselves are the role's dcids in\n`BaseIdentity.entities`. This records only that they were asked for as one\ngroup, so the heading can say \"the 27 EU member states\" after any edit that\nkeeps the role's members. A group the graph holds no node for, read from the\nmembership registry (\"Asia (DAC)\"), names the registry's id for it in\n`group_id`, so a resubmit restores it and the total its dataset publishes for it.\nA group whose `ref` is a continent or subregion\nthat the membership policy holds or omits (`MembershipPolicy.holds_region`)\nreads as its countries (\"the 54 countries in Africa\"), whatever its graph\ntype. `entity_type` is informational, and the reading keys on `ref`. When\nthe role binds the total its dataset publishes\nfor the group (\"Africa (DAC)\") in place of the members, `total` names that\nparty and the role's one dcid is it, and `members` lists the group's members as the\nmembership registry holds them, so a caller can tell whether a party sits inside the\ntotal. A role read as the whole population of\nits side, the source's total of every party there (\"Official Donors, Total\")\nor a union of such totals (\"all donors including private\"), states the\nclasses of party that population covers in `whole_of`, and the classes the answer's\ndataset publishes on that side in `side_classes`; a resubmit derives both from the\nidentity and the code index, whatever it posts. A role read as the group's members states\nthe residuals the group's total counts that the members leave out in `left_out`, and\nwhether the source publishes its own figure for the group in `sum_differs`\n(`spec_build.with_members_left_out`). A Spec serves its groups on\n`ResolvedSpec.entity_groups`, and a resubmit posts them beside the identity\n(`ResubmitIdentityEntry.entity_groups`, `ResubmitCandidate.entity_groups`)." }, - "DatasetNode": { + "EntityOptions": { "properties": { - "ref": { - "type": "string", - "title": "Ref", - "description": "the node's dcid" - }, - "label": { + "entity_ref": { "anyOf": [ { "type": "string" @@ -6904,286 +10221,305 @@ "type": "null" } ], - "title": "Label", - "description": "the node's name; for a Provenance, its parent Dataset's name where it has one. Null, and named in gaps, when the graph gives none" + "title": "Entity Ref", + "description": "dcid of the currently-bound directional entity; joins to an entry in SentenceToken.entity_refs. None means this role axis is open -- no entity is bound on it, and `options` is this axis's own candidate member set rather than a set the current binding could be swapped among. An open role axis omits this key entirely on both the buffered body and the SSE entity_options event, rather than emitting null -- the opposite of SlotOption.coverage's own explicit-null convention on that same SSE channel" }, - "types": { + "role": { + "$ref": "#/components/schemas/RoleAxis", + "description": "the flow axis these candidates apply to; present even when entity_ref is omitted so a selected candidate can be posted under the same identity.entities role" + }, + "options": { "items": { - "type": "string" + "$ref": "#/components/schemas/SlotOption" }, "type": "array", - "title": "Types", - "description": "the node's typeOf values, as the graph holds them" + "title": "Options", + "description": "candidate entities, reusing SlotOption for shape parity with slot_options" + }, + "truncated": { + "type": "boolean", + "title": "Truncated", + "description": "true when options is capped or deliberately count-only, so it is not the complete known candidate set; false when every known candidate is listed" + }, + "source": { + "type": "string", + "enum": [ + "observed", + "seed" + ], + "title": "Source", + "description": "'seed' for a hand-curated candidate set; 'observed' for candidates already confirmed while resolving this flow axis" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "role", + "options", + "truncated", + "source" + ], + "title": "EntityOptions", + "description": "Candidates for one directional entity axis.\n\nParallel to SlotOptions, but for a directional *entity* (an observation\nendpoint) rather than a constraint-property value. A role-bearing flow may\nexpose either its origin or destination axis here when that axis was left\nopen. The entry's ``role`` is the routing key a client uses to promote a\nselected candidate into ``identity.entities`` on a dataset_resubmit entry." + }, + "EntityRef": { + "properties": { + "ref": { + "type": "string", + "title": "Ref" }, - "description": { + "label": { + "type": "string", + "title": "Label" + }, + "kind": { "anyOf": [ { - "type": "string" + "type": "string", + "enum": [ + "country", + "continent", + "subregion", + "continental_union", + "place_other", + "aggregate", + "organisation", + "group", + "stat_var", + "code_system", + "code", + "unit", + "source", + "dataset", + "provenance", + "other" + ] }, { "type": "null" } ], - "title": "Description", - "description": "the node's prose in the graph; null when it has none" - }, - "links": { - "additionalProperties": { - "type": "string" - }, - "propertyNames": { - "enum": [ - "codes", - "children", - "members", - "countries", - "datasets", - "variables", - "facets" - ] - }, - "type": "object", - "title": "Links", - "description": "each list relation the node has, mapped to its route; empty when none" + "title": "Kind" + } + }, + "type": "object", + "required": [ + "ref", + "label", + "kind" + ], + "title": "GraphResolveEntity", + "description": "A reference with its kind. `kind` is `null` only for a `not_held` entity, which the\ngraph holds no node to classify." + }, + "EntityRefs": { + "properties": { + "text": { + "type": "string", + "title": "Text", + "description": "the entity text, equal to restatement.entities[i].text, where i is this entry's position in Part.entity_refs" }, - "gaps": { + "refs": { "items": { "type": "string" }, "type": "array", - "title": "Gaps", - "description": "the member path of every value this door cannot know" - }, - "built_from": { - "additionalProperties": { - "type": "string" - }, - "propertyNames": { - "enum": [ - "code_index", - "origin_catalogue", - "coverage_index", - "membership" - ] - }, - "type": "object", - "title": "Built From", - "description": "the build of each table the response read" - }, - "kind": { - "type": "string", - "const": "dataset", - "title": "Kind", - "default": "dataset" - }, - "dataset": { - "$ref": "#/components/schemas/SourceBlock" + "title": "Refs", + "description": "the refs the part's answer binds for `text`: a place gives its node; a group, continent or subregion bound as itself gives its own node, or the total its dataset publishes for it (G7 bound as GroupOfSeven); one bound as its members gives the set's own ref first (its node, else that total, else its registry id) and then the members, sorted. In a part refused before its places were bound, a text that resolved to one node gives that node, and a group or a set read as its members gives []. [] for an ambiguous text and one that resolved to no node or a node the answer does not bind" } }, + "additionalProperties": false, "type": "object", "required": [ - "ref", - "label", - "types", - "description", - "links", - "gaps", - "built_from", - "kind", - "dataset" + "text", + "refs" ], - "title": "DatasetNode" + "title": "EntityRefs", + "description": "The graph nodes one entity row of a part's restatement binds in the answer." }, - "DatasetResubmitInput": { + "EntityYearsModel": { "properties": { - "kind": { + "ref": { "type": "string", - "const": "dataset_resubmit", - "title": "Kind", - "description": "discriminator for dataset-level re-resolution across every part", - "default": "dataset_resubmit" + "title": "Ref", + "description": "the entity's `dcid:` ref" }, - "entries": { + "years": { "items": { - "oneOf": [ - { - "$ref": "#/components/schemas/ResubmitIdentityEntry" - }, - { - "$ref": "#/components/schemas/ResubmitCandidatesEntry" - }, - { - "$ref": "#/components/schemas/ResubmitPlaceholderEntry" - }, - { - "$ref": "#/components/schemas/ResubmitParsedEntry" - } - ], - "discriminator": { - "propertyName": "entry_kind", - "mapping": { - "candidates": "#/components/schemas/ResubmitCandidatesEntry", - "identity": "#/components/schemas/ResubmitIdentityEntry", - "parsed": "#/components/schemas/ResubmitParsedEntry", - "placeholder": "#/components/schemas/ResubmitPlaceholderEntry" - } - } + "type": "string" }, "type": "array", - "maxItems": 6, - "minItems": 1, - "title": "Entries", - "description": "one entry per response part, in response part order; a single-entry request whose entry is an identity re-resolves exactly that one part" - }, - "raw_query": { - "anyOf": [ - { - "type": "string", - "maxLength": 2000, - "minLength": 1 - }, - { - "type": "null" - } - ], - "title": "Raw Query", - "description": "original query text, for echo only; does not affect resolution" + "title": "Years", + "description": "the years left out, as runs of consecutive years, `1990-2001` or `2004`" } }, "additionalProperties": false, "type": "object", "required": [ - "entries" + "ref", + "years" ], - "title": "DatasetResubmitInput", - "description": "Re-resolve every part of a multi-variable result in one request, so an\nedit to one part cannot leave the other parts' composed sentence or fold\nstale (see `envelope.make_response` / `conjoin.combine_regions`, the\ncombiner every entry kind here is routed through).\n\n`entries` supplies one entry per response part, in response part order;\neach entry edits against its own base, never a dataset-level one. There\nis no spec registry, so every entry carries its full identity and this\ndoor reads no server-side state." + "title": "EntityYearsModel", + "description": "One entity a conversion left rows out of, and the years of those rows\n(`materialise.codes.EntityYears`)." }, - "DatasetVersion": { + "Entry": { "properties": { - "content_version": { + "axis": { "type": "string", - "title": "Content Version" - }, - "base_content_version": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } + "enum": [ + "sector", + "region", + "measure_basis", + "provider" ], - "title": "Base Content Version", - "description": "the raw version a derived version (a full groupby collapse, a party-totals cut, or both) was rendered from. Null on every other version" + "title": "Axis", + "description": "the axis the entry settles" }, - "rendering": { + "option_id": { + "type": "string", + "maxLength": 128, + "pattern": "^(sector|region|measure_basis|provider):[A-Za-z0-9_+]+$", + "title": "Option Id", + "description": "the option asked for; its prefix is `axis`" + }, + "provenance": { "type": "string", "enum": [ - "plain", - "groupby", - "without_party_totals", - "not_recorded" + "explicit", + "carried" ], - "title": "Rendering", - "description": "plain: a raw version, which is also what a groupby sum or a party-totals cut that left the frame unchanged is stored under. groupby: a collapse, summed by `groupby`, of the frame or of its party-totals cut when `without_party_totals` is true. without_party_totals: the frame without its party totals, unsummed. not_recorded: a derived version with no linked file recording its options" + "title": "Provenance", + "description": "explicit: the request's own words or a switch; carried: a choice the conversation settled on an earlier part, attached by axis and concept" }, - "groupby": { + "concept": { "anyOf": [ { - "$ref": "#/components/schemas/GroupbyOptions" + "type": "string", + "maxLength": 64 }, { "type": "null" } ], - "description": "the groupby a collapse was summed by, as its file's rendering records it. Null unless `rendering` is groupby" - }, - "without_party_totals": { - "type": "boolean", - "title": "Without Party Totals", - "description": "true when the derived version's frame leaves out the group totals of its open party roles, as its file's rendering records it. Absent when false", - "default": false + "title": "Concept", + "description": "the concept the entry was made for ('health'), so a carried entry attaches only to a part asking for that concept; None when the axis has no concept" }, - "enrichment_stamp": { - "anyOf": [ + "origin": { + "oneOf": [ { - "type": "string" + "$ref": "#/components/schemas/TextOrigin" }, { - "type": "null" + "$ref": "#/components/schemas/ChoiceOrigin" } ], - "title": "Enrichment Stamp", - "description": "the `enrichment_stamp` a file of this version holding party-kind cells, rendered now, carries (`ArtifactEntryModel.enrichment_stamp`): the answering code index's digest, the page's `enrichment_stamp`, when the version's frame holds a party role. Absent when it holds none, since a file of it then holds no party-kind cell and carries no stamp under any code index. A version that stored neither an output profile nor a party-free link lists the digest" + "title": "Origin", + "description": "where the entry was read or switched", + "discriminator": { + "propertyName": "kind", + "mapping": { + "choice": "#/components/schemas/ChoiceOrigin", + "text": "#/components/schemas/TextOrigin" + } + } + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "axis", + "option_id", + "provenance", + "origin" + ], + "title": "Entry", + "description": "One explicit or carried scope entry: an option the user asked for on one axis." + }, + "Exclusion": { + "properties": { + "ref": { + "type": "string", + "title": "Ref" + }, + "reason": { + "type": "string", + "enum": [ + "superseded_by_dfo", + "superseded_by_un_system" + ], + "title": "Reason", + "description": "superseded_by_dfo: an upstream copy of a dataset DFO imports. superseded_by_un_system: a UN System Data Commons agency's series replace it" + } + }, + "type": "object", + "required": [ + "ref", + "reason" + ], + "title": "Exclusion", + "description": "A provenance a base source holds that this deployment does not admit, because\nanother Data Commons supersedes it." + }, + "Expansion": { + "properties": { + "added": { + "items": { + "$ref": "#/components/schemas/GraphRef" + }, + "type": "array", + "minItems": 1, + "title": "Added", + "description": "descendant codes admitted beyond the slot's own bound value(s), in the code index's descendant-walk order. Never empty -- a slot whose expansion added nothing carries no Expansion at all (Slot.expansion is None), rather than one with added=[]" } }, "additionalProperties": false, "type": "object", "required": [ - "content_version", - "base_content_version", - "rendering", - "groupby" + "added" ], - "title": "DatasetVersion" + "title": "Expansion", + "description": "Codes a hierarchical value/set binding resolved to beyond its own bound\nvalue(s): the descendant codes admitted by walking the code index's\n`specializationOf` closure for a dimension the index declares\n`hierarchical` (code_index.query.CodeIndex.descendants).\n\nAdditive only. Never a substitute for `binding`, and never fed into spec\nidentity -- `BindingValue`/`BindingSet` are the sole identity-bearing wire\nform (see Slot.expansion's own docstring for why: identity is minted from\n`BindingSet.values`, built from the query's own drafted values, before\nresolution ever widens them). `added` never repeats a dcid already in the\nbinding's own value(s); it holds only what expansion contributed on top." }, - "DatasetVersionsPage": { + "ExportFormat": { + "type": "string", + "enum": [ + "csv", + "xlsx", + "parquet" + ] + }, + "ExportFrame": { "properties": { - "schema_version": { - "type": "integer", - "const": 1, - "title": "Schema Version", - "default": 1 - }, "spec_id": { "type": "string", + "pattern": "^(spec|ops)_[^/]+$", "title": "Spec Id" }, - "enrichment_stamp": { + "content_version": { "type": "string", - "title": "Enrichment Stamp", - "description": "the digest of the party kinds, classes and whole-total markers the answering code index holds, the one a file rendered now carries (`ArtifactEntryModel.enrichment_stamp`). A frame naming a file that asks for a party-kind column adds it to its name, so a frame named under another stamp does not match" - }, - "versions": { - "items": { - "$ref": "#/components/schemas/DatasetVersion" - }, - "type": "array", - "title": "Versions", - "description": "stored versions that are not revoked, newest first" - }, - "next_cursor": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Next Cursor", - "description": "continues the list after this page's last version; null when complete" - }, - "complete": { - "type": "boolean", - "title": "Complete", - "description": "true when this page reaches the end of the list" + "minLength": 1, + "title": "Content Version" } }, "additionalProperties": false, "type": "object", "required": [ "spec_id", - "enrichment_stamp", - "versions", - "next_cursor", - "complete" + "content_version" ], - "title": "DatasetVersionsPage" + "title": "ExportFrame", + "description": "One exact frame version: a dataset's `spec_` id or a derived frame's `ops_` id, and its\ncontent version." }, - "DateRange": { + "ExportLicence": { "properties": { - "start": { + "source": { + "type": "string", + "title": "Source", + "description": "the source's ref, the key of the licence deny-list" + }, + "label": { + "type": "string", + "title": "Label" + }, + "licence": { "anyOf": [ { "type": "string" @@ -7192,10 +10528,10 @@ "type": "null" } ], - "title": "Start", - "description": "first served date, e.g. '2012'" + "title": "Licence", + "description": "the licence's label; null where none is declared" }, - "end": { + "url": { "anyOf": [ { "type": "string" @@ -7204,105 +10540,176 @@ "type": "null" } ], - "title": "End", - "description": "last served date, e.g. '2022'" + "title": "Url", + "description": "the licence's terms page; null where none is declared" } }, "additionalProperties": false, "type": "object", - "title": "DateRange", - "description": "The first and last dates of the points an answer serves for a StatVar." + "required": [ + "source", + "label", + "licence", + "url" + ], + "title": "ExportLicence" }, - "DeclinedAnswer": { + "ExportRequestBody": { "properties": { - "schema_version": { + "frame": { + "anyOf": [ + { + "$ref": "#/components/schemas/ExportFrame" + }, + { + "$ref": "#/components/schemas/BareExportFrame" + } + ], + "title": "Frame", + "description": "the frame version to export, or `{spec_id}` alone for a dataset's newest version, which the answer's `frame` names" + }, + "format": { + "$ref": "#/components/schemas/ExportFormat", + "description": "the file format", + "default": "csv" + }, + "bundle": { + "type": "boolean", + "title": "Bundle", + "description": "true for a zip bundle of the file beside its README, datapackage.json and CITATION.cff", + "default": false + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "frame" + ], + "title": "ExportRequestBody", + "description": "`POST /api/datasets/exports`'s body: an `ExportRequest` whose frame may name a dataset id\nalone." + }, + "ExportResponse": { + "properties": { + "export_id": { + "type": "string", + "pattern": "^exp_[0-9a-f]{32}$", + "title": "Export Id" + }, + "url_path": { + "type": "string", + "title": "Url Path", + "description": "the export link's path, relative to the public site's origin. It needs no key and does not expire: each request answers 302 to a URL signed for five minutes" + }, + "file_name": { + "type": "string", + "title": "File Name" + }, + "media_type": { + "type": "string", + "title": "Media Type" + }, + "format": { + "$ref": "#/components/schemas/ExportFormat" + }, + "bundle": { + "type": "boolean", + "title": "Bundle" + }, + "bytes": { "type": "integer", - "const": 1, - "title": "Schema Version", - "description": "contract schema version; exactly 1 for v1. Required on every response.", - "default": 1 + "title": "Bytes" }, - "query_echo": { - "$ref": "#/components/schemas/QueryEcho", - "description": "what the response was understood to be answering" + "rows": { + "type": "integer", + "title": "Rows", + "description": "rows in the file's data table, header excluded" }, - "diagnostics": { - "$ref": "#/components/schemas/Diagnostics", - "description": "run health, warnings, timing, build stamp" + "columns": { + "type": "integer", + "title": "Columns", + "description": "columns in the file's data table" }, - "kind": { + "sha256": { "type": "string", - "const": "declined", - "title": "Kind", - "description": "discriminator for a response to a question search does not answer", - "default": "declined" + "title": "Sha256", + "description": "the hex SHA-256 of the file's bytes" }, - "reason": { + "frame": { + "$ref": "#/components/schemas/ExportFrame" + }, + "citation": { "type": "string", - "enum": [ - "out_of_scope", - "requires_analysis" - ], - "title": "Reason", - "description": "why search declined: 'out_of_scope' when no part of the question asks for a published statistic about a place, a population or a financial flow; 'requires_analysis' when the subject is in scope but the question asks for an argument and names no data to show" + "title": "Citation" }, - "scope": { - "$ref": "#/components/schemas/Scope-Output", - "description": "the place the question named, when it named a country" + "licences": { + "items": { + "$ref": "#/components/schemas/ExportLicence" + }, + "type": "array", + "title": "Licences", + "description": "each source of the frame once" + }, + "pinned": { + "type": "boolean", + "title": "Pinned", + "description": "true: the file is held in the pinned tier, kept for good" } }, "additionalProperties": false, "type": "object", "required": [ - "query_echo", - "diagnostics", - "reason", - "scope", - "kind" + "export_id", + "url_path", + "file_name", + "media_type", + "format", + "bundle", + "bytes", + "rows", + "columns", + "sha256", + "frame", + "citation", + "licences", + "pinned" ], - "title": "DeclinedAnswer", - "description": "A resolve response to a question search does not answer." + "title": "ExportResponse", + "description": "The facts of a prepared export. A repeat prepare answers the same facts." }, - "DefinitePart": { + "FacetItem": { "properties": { - "variable_text": { + "ref": { + "type": "string", + "title": "Ref" + }, + "label": { + "type": "null", + "title": "Label" + }, + "source": { + "$ref": "#/components/schemas/AvailabilitySource" + }, + "unit": { "anyOf": [ { - "type": "string" + "$ref": "#/components/schemas/NodeRef" }, { "type": "null" } - ], - "title": "Variable Text", - "description": "the variable text this part answers, in the order asked. This part's position in Resolution.parts equals the same variable_index every SSE event keyed by variable_index uses (ShapeEvent, StepEvent, SentenceEvent). Every dataset_resubmit entry kind (identity, candidates, placeholder, and parsed through its nested ParsedPart) requires its own posted variable_text, so this field is always the posted text echoed back onto the rebuilt part, never null. Null only when the whole posted query was empty or whitespace-only (raw_text door), which refuses variable_not_resolved before extraction runs and so has no text to name." - }, - "separate": { - "type": "boolean", - "title": "Separate", - "description": "true when this part was asked beside the others to be compared with them. A client resubmitting an identity, candidate set, or placeholder posts this flag on that entry to preserve the comparison. Two parts marked separate that resolve to one reading carry the same spec_id and stay two parts. False, the default, is omitted", - "default": false - }, - "warnings": { - "items": { - "$ref": "#/components/schemas/Warning" - }, - "type": "array", - "title": "Warnings", - "description": "this part's own run-health signals. A part folded into an earlier part's spec (see DefinitePart.spec) carries binding_folded alone. The merged spec's own resolved warnings live only on the first part that carries it. An unfolded part carries the warnings raised while resolving this part, plus observations_omitted on a candidates part when response_options.include_observations was set." + ] }, - "timing_ms": { + "measurement_method": { "anyOf": [ { - "$ref": "#/components/schemas/Timing" + "$ref": "#/components/schemas/NodeRef" }, { "type": "null" } - ], - "description": "this part's own latency breakdown, where by_step names only the phases this part ran and total sums them, leaving out the shape_* stages nested inside shape. Excludes the shared, once-per-request steps (e.g. extract), which diagnostics.timing_ms.by_step carries once for the whole request; distinct too from diagnostics.timing_ms.total, the whole request's wall-clock elapsed time." + ] }, - "rendered_sentence": { + "observation_period": { "anyOf": [ { "type": "string" @@ -7311,299 +10718,287 @@ "type": "null" } ], - "title": "Rendered Sentence", - "description": "a human-readable string. For candidates, a header naming how many readings there are ('3 readings.'), then each shown candidate's heading and a byline led by the source and span that set it apart; for no_data, a heading in the same claim form naming the entity, measure, and counterpart that were checked. Either ends with the text of this part's departures, in order, and a candidates part's then closes with its assumptions clause. For a definite part this stays null or omitted: the confirmation sentence (heading and byline) lives at spec.resolved.rendered_sentence, and its departures reach the envelope's composed sentence." + "title": "Observation Period" }, - "sentence_plan": { + "scaling": { "anyOf": [ { - "items": { - "$ref": "#/components/schemas/SentenceToken" - }, - "type": "array" + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Scaling" + }, + "first_year": { + "anyOf": [ + { + "type": "string" }, { "type": "null" } ], - "title": "Sentence Plan", - "description": "the ordered token form of rendered_sentence, present whenever it is. For a definite part this stays null or omitted. spec.resolved.sentence_plan carries the confirmation sentence's own plan instead." + "title": "First Year" }, - "restatement": { + "last_year": { "anyOf": [ { - "$ref": "#/components/schemas/ParsedPart" + "type": "string" }, { "type": "null" } ], - "description": "the ParsedPart that reproduces this part's own resolution inputs -- the same entities, resolved time window, unit text, and source text the engine actually used to resolve this one leg -- so a client holding this part alone can copy it straight into a fresh ParsedInput.parts entry and re-resolve it faithfully, without flattening it into the whole query's variable_text the way variable_text alone would. Canonical, not verbatim: for a raw_text part, time_text is the equivalent phrase this door's own time grammar recognises (e.g. '2015 to 2020'), not the user's original words, since the engine's date extraction keeps only the structured window and discards the phrasing. Null whenever this part has no faithful echo to give. On a dataset_resubmit entry's identity/candidates/placeholder kinds, which post an identity or stub rather than a phrase and have no per-part resolution inputs to echo -- a dataset_resubmit parsed entry, genuinely re-resolved from its own posted ParsedPart, carries a real one like any parsed-door part. Also null when this leg's entity was bound to a directional role axis (origin/destination) and no door-supplied role named that axis, since an echo without the axis would resubmit the request with that entity reversed. Also null when one of this leg's own inputs does not fit ParsedPart's own field caps, since a truncated echo would misrepresent what was actually resolved." - }, - "entity_refs": { - "items": { - "$ref": "#/components/schemas/EntityRefs" - }, - "type": "array", - "title": "Entity Refs", - "description": "the binding of each entity of `restatement`, one per restatement.entities row, in row order, so a client can tell which node a text such as 'G7' bound. A response field kept off `restatement`, which posts back unchanged. The binding is the one the answer reads: for a candidates part, the elected reading's; for a part folded into an earlier part's spec, its own. [] when `restatement` is null or names no entity" - }, - "operations": { - "items": { - "$ref": "#/components/schemas/Operation" - }, - "type": "array", - "title": "Operations", - "description": "the operations the question asks for over this part's data, in query order; the engine echoes them onto the part it resolves. Empty when the question asks for none" - }, - "departures": { - "items": { - "$ref": "#/components/schemas/Departure" - }, - "type": "array", - "title": "Departures", - "description": "every way this part's answer differs from what its request asked, ordered by how much each changes the number: closest_match, measure_not_applied, operation_not_applied, breakdown_not_applied, entity_unavailable, year_unavailable, modelled_values, group_read_as_members, whole_total_read, whole_total_unpublished, direction_discarded, direction_inferred, scope_limited. [] when the answer is what was asked. A client that renders its own sentence reads them here; each one's text also closes the sentence that carries this part (see Departure.text). A warning on the same part reports run health and stays separate" - }, - "assumptions": { - "items": { - "$ref": "#/components/schemas/Assumption" - }, - "type": "array", - "title": "Assumptions", - "description": "every value the engine filled that the request did not ask for, in clause order. Declared defaults come first, in the order of the Spec's trace.slot_filters, then open roles, then the place scope. A declared default is a slot the request left open that its code system's or shape's declared default fixed, named by the bound code's full label. An open role is a flow role no request word asked for, read across every entity on it with data. It is either a role the role scope default filled (resolved.scope on that axis), whatever its member count, served as one series per member where the shape declares the role, or a role the heading states with no entity of its own ('from 164 providers', 'owed to all creditors'), served as the total over its members. A role the identity binds in entities or lists in open_roles, that one of the part's operations runs over ('top 5 donors'), or that the request's words asked every member of ('all donors'), is asked. The place scope is a request that named no place, read across every place with data. Every door fills assumptions. A definite part reads them from its Spec, a candidates part carries the items every list in CandidatesPart.reading_assumptions holds alike, text included, and no_data and unsupported parts carry []. A dataset_resubmit identity entry posts every slot bound, so its part states the items of the entry's assumptions echo that still hold (see ResubmitIdentityEntry.assumptions), and a candidates entry reads each reading with its candidate's echo (see ResubmitCandidate.assumptions). The sentence that carries this part closes with them as one segment='assumption' clause ('Assumed: official development assistance; every provider.'), after its departures. [] when the answer fills nothing" - }, - "status": { - "type": "string", - "const": "definite", - "title": "Status", - "description": "one answer was resolved" + "title": "Last Year" }, - "spec": { - "$ref": "#/components/schemas/Spec", - "description": "the resolved Spec answering this part. Parts whose specs share a spec_id are one reading of the data, the same series, entities and years. A later part that folds into an earlier part's spec carries binding_folded. A part posted with separate: true never folds and keeps its own part, so two separate parts can carry one spec_id by request. Parts sharing a spec_id can differ in assumptions, so a client never dedupes parts by spec_id" - } - }, - "additionalProperties": false, - "type": "object", - "required": [ - "status", - "spec" - ], - "title": "DefinitePart", - "description": "One unambiguous answer was resolved for this part." - }, - "DefinitionMembersRequest": { - "properties": { - "schema_version": { + "observations": { "type": "integer", - "const": 1, - "title": "Schema Version", - "default": 1 + "title": "Observations" }, - "definition": { + "places": { "anyOf": [ { - "$ref": "#/components/schemas/CanonicalDefinition" + "type": "integer" }, { "type": "null" } - ] - } - }, - "additionalProperties": false, - "type": "object", - "title": "DefinitionMembersRequest", - "description": "Body of `POST /api/datasets/{id}/members`. It may carry the canonical `definition` a\nsearch response gives for `id`, so the route answers before any mint registers it.\n\nA registered id needs no `definition`. A supplied one is admitted as a mint admits a\n`spec_id` sidecar: `definition.spec_id` must equal the path id, and the identity must hash\nto it. Nothing is written." - }, - "DefinitionModel": { - "properties": { - "schema_version": { - "type": "integer", - "title": "Schema Version" - }, - "spec_id": { - "type": "string", - "title": "Spec Id" - }, - "identity": { - "additionalProperties": true, - "type": "object", - "title": "Identity", - "description": "the identity-core document, shaped as search.models.identity.BaseIdentity and published at GET /api/search/schema" + ], + "title": "Places", + "description": "null for a role-bearing variable" } }, - "additionalProperties": false, "type": "object", "required": [ - "schema_version", - "spec_id", - "identity" + "ref", + "label", + "source", + "unit", + "measurement_method", + "observation_period", + "scaling", + "first_year", + "last_year", + "observations", + "places" ], - "title": "DefinitionModel" + "title": "GraphFacetItem", + "description": "One facet of a variable, as the `facets` list relation serves it. `ref` is the facet id,\nwhich hashes the facet's metadata." }, - "DefinitionOptionsRequest": { + "FacetNationalCurrencyBinding": { "properties": { - "schema_version": { - "type": "integer", - "const": 1, - "title": "Schema Version", - "default": 1 - }, - "definition": { - "$ref": "#/components/schemas/CanonicalDefinition" + "national_currency": { + "$ref": "#/components/schemas/UnitCurrencyRole" } }, "additionalProperties": false, "type": "object", "required": [ - "definition" + "national_currency" ], - "title": "DefinitionOptionsRequest", - "description": "Body of `POST /api/datasets/{id}/options`. It carries the canonical `definition` a search\nresponse gives for `id`, so the options route answers for an id no mint has registered.\n\nThe route admits and registers the definition as a `spec_id` mint registers its sidecar.\n`definition.spec_id` must equal the path id, and the identity must hash to it." + "title": "FacetNationalCurrencyBinding", + "description": "The unit axis bound to each entity's own currency: at each entity `role`\nbinds, the facets whose unit is the one currency the graph's\n`nationalCurrencyOf` names for it, served as published and never converted.\nThe conversion request naming the same role (`UnitCurrencyRole`) converts\neach row into that currency instead." }, - "DefinitionResponse": { + "FacetOptions": { "properties": { - "schema_version": { - "type": "integer", - "const": 1, - "title": "Schema Version", - "default": 1 + "axis": { + "type": "string", + "title": "Axis", + "description": "the facet axis this option set belongs to (see FacetAxis)" }, - "definition": { - "$ref": "#/components/schemas/CanonicalDefinition" + "options": { + "items": { + "$ref": "#/components/schemas/SlotOption" + }, + "type": "array", + "title": "Options", + "description": "candidate values seen on the resolved candidates' own unfiltered observation facets, ranked by in-window observation-point count descending then ref ascending; a dcid the graph can't label falls back to the dcid itself as its own label rather than being dropped -- every value here already came off a confirmed observation facet, unlike a curated seed candidate. On the measurementMethod and unit axes, an option with no value.ref stands for the facets that declare no value on the axis, as Data Commons omits the member; it is listed only beside a declared value, ranks last among equal counts, and is pinned by posting identity.facets. as {state: 'value', ref: null}" + }, + "truncated": { + "type": "boolean", + "title": "Truncated", + "description": "true when options is bounded by SEARCH_MAX_OPTIONS rather than the full distinct set observed" + }, + "source": { + "type": "string", + "enum": [ + "observed", + "seed" + ], + "title": "Source", + "description": "always 'observed' -- a facet axis has no curated seed taxonomy" } }, "additionalProperties": false, "type": "object", "required": [ - "schema_version", - "definition" + "axis", + "options", + "truncated", + "source" ], - "title": "DefinitionResponse", - "description": "The register door's response: the verified\nidentity, echoed back whole." + "title": "FacetOptions", + "description": "The candidate set one facet axis (see ResolvedFacet) was chosen from:\nevery distinct value seen on the resolved candidates' own observation\nfacets, so a client can offer \"what else could I ask for\" alongside the\nserved answer.\n\nParallel to SlotOptions/EntityOptions, reusing SlotOption for shape\nparity. Unlike either, source is always \"observed\" -- a facet axis has\nno curated seed taxonomy -- and no option here ever carries a populated\nSlotOption.coverage: there is no separate confirm step for a facet\noption, the observed count already ranks the list." }, - "DefinitionText": { + "FacetRefBinding": { "properties": { - "of": { - "$ref": "#/components/schemas/NodeRef", - "description": "the part the text defines" - }, - "text": { - "type": "string", - "title": "Text" + "ref": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Ref" } }, + "additionalProperties": false, "type": "object", "required": [ - "of", - "text" + "ref" ], - "title": "GraphDefinitionText", - "description": "The graph's prose for one part of a definition." + "title": "FacetRefBinding", + "description": "A facet axis bound to a specific ref. Every axis accepts this form;\nthe unit axis alone also accepts `FacetUnitRequestBinding`, the\nconversion-request form (`currency`/`prices`/`base_year`), and\n`FacetNationalCurrencyBinding`. A null `ref` binds the facets that declare\nno value on the axis, and only `NULL_REF_FACET_AXES` accept it." }, - "Departure": { + "FactSummaryModel": { "properties": { - "code": { - "type": "string", - "enum": [ - "closest_match", - "measure_not_applied", - "operation_not_applied", - "breakdown_not_applied", - "entity_unavailable", - "year_unavailable", - "modelled_values", - "group_read_as_members", - "whole_total_read", - "whole_total_unpublished", - "direction_discarded", - "direction_inferred", - "scope_limited" + "changed": { + "items": { + "type": "string" + }, + "type": "array", + "title": "Changed", + "description": "the patch's own changed field names, empty for a create or a no-op write" + }, + "series": { + "items": { + "$ref": "#/components/schemas/FactSummarySeriesEntry" + }, + "type": "array", + "title": "Series", + "description": "every visible series this revision resolves, capped" + }, + "series_cut": { + "type": "integer", + "title": "Series Cut", + "description": "how many series the series cap and the token cap together dropped from this summary" + }, + "window": { + "anyOf": [ + { + "$ref": "#/components/schemas/WindowModel" + }, + { + "type": "null" + } ], - "title": "Code", - "description": "what kind of departure this is. 'closest_match': the answer shows the nearest measure the graph holds, not the one asked; a client draws a muted 'Closest match:' lead before the heading, and on a candidates part, whose readings stand in for a measure with no data, once before the first reading. 'measure_not_applied': a named measure qualifier was not applied. 'operation_not_applied': an operation the request named (a share, a ranking) was not run, so the amounts behind it are shown. 'breakdown_not_applied': a breakdown the request named was not applied, so the total is shown. 'entity_unavailable': an entity the request named holds no values in the series the answer reads, one departure per role; for a role the request named as a group, asked is the request's words for the group and the text counts the members without values; the text names any source holding values there that Search does not read. 'year_unavailable': a named year or range falls outside the years served. 'modelled_values': the served values are modelled or estimated. 'group_read_as_members': a named group was read as its member entities; on a flow role the text names the amounts the group's published total counts that no member holds, and, for a group whose published total is not its members' sum, says the source publishes its own figure for the group. 'whole_total_read': a flow side is read as its whole population, the total its source publishes for every party of that side (official donors (DAC) for 'official donors' or a donor side the request named nothing on or summed over; official and private donors (DAC) for 'all donors'); the text says what the total holds and how to list the side's members: in the question's words ('by donor') on the raw_text door, with open_roles on the others. 'whole_total_unpublished': the request named a whole population ('all donors', 'all recipients') on a side whose dataset publishes no total of it and holds no party outside it, so the side is left unnamed and the answer covers every party the dataset holds there; asked is the request's words, and the text names the dataset. 'direction_discarded': a flow direction the request's own words named was not applied. 'direction_inferred': a place the request named without a direction is read on the one direction that holds data, which over names. 'scope_limited': a no_data answer's check covered only values the engine chose, which the request did not name; its text names only what the check covered ('This check covered only ODA.')" + "description": "this component's own [start, end] period window, null where its type defines none" }, - "binding_ref": { + "unit": { "anyOf": [ { "type": "string" }, + { + "$ref": "#/components/schemas/ConvertedUnitModel" + }, + { + "$ref": "#/components/schemas/ComposedUnitModel" + }, { "type": "null" } ], - "title": "Binding Ref", - "description": "the identity binding whose edit clears this departure ('when:' for a year, 'how:' for a measure value, 'where:' or 'origin:' for a role's entities, 'unit:' for the price basis); null for a departure no binding edit clears, such as an operation the engine does not run. A client links the departure to the sentence token carrying the same binding_ref when the plan has one; a candidates or no_data plan, and a how slot the heading leaves silent, may carry no such token" + "title": "Unit", + "description": "this component's own unit, the value its resolved payload carries: a unit's graph name (its ref when the graph has none), a converted unit, or a composed unit. A line_chart or bar_chart reports its first series' unit and a table the unit every row shares. Null where the type defines none, the rows declare none, or a table's rows differ." }, - "asked": { + "change": { "anyOf": [ { - "type": "string" + "additionalProperties": true, + "type": "object" }, { "type": "null" } ], - "title": "Asked", - "description": "what the request named, in its own wording; null when it named nothing" + "title": "Change", + "description": "the stat_card's derived comparison between its two basis periods, null for every other member and for a stat_card whose intent carries no change" }, - "shown": { + "source_refs": { "anyOf": [ { - "type": "string" + "items": { + "type": "string" + }, + "type": "array" }, { "type": "null" } ], - "title": "Shown", - "description": "what the answer shows instead, as the heading states it; null when nothing" + "title": "Source Refs", + "description": "every distinct raw provenance ref a source_card's frame carries. It is null for every other member." }, - "text": { - "type": "string", - "minLength": 1, - "title": "Text", - "description": "the departure as one or two short sentences for people: 'You asked for 2030. The data ends in 2024, so this shows 1973 to 2024.' On a no_data part no text claims the part shows anything. The envelope's composed sentence carries the same text as a segment='departure' token after its part's heading and byline, and so does the rendered_sentence of a part that is not definite" + "defaults": { + "items": { + "$ref": "#/components/schemas/AppliedDefaultModel" + }, + "type": "array", + "title": "Defaults", + "description": "the choices this component made where its intent left one open, empty when it made none" } }, "additionalProperties": false, "type": "object", "required": [ - "code", - "text" + "changed", + "series", + "series_cut", + "window", + "unit", + "change", + "source_refs", + "defaults" ], - "title": "Departure", - "description": "One way this part's answer differs from what its request asked, stated\nfor people in `text` and for code in `code`, `asked`, and `shown`.\n\nDepartures live on the part (`_PartBase.departures`).\n`spec.resolved.rendered_sentence` states what the answer is, and a\ndeparture states how that differs from the request that produced it." + "title": "FactSummaryModel", + "description": "The closed, token-capped fact summary a revision reports." }, - "DeploymentFacetPolicy": { + "FactSummarySeriesEntry": { "properties": { - "policy": { - "type": "string", - "title": "Policy", - "description": "the deployment default policy's own id" + "id": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Id", + "description": "this series' own id, null when none could be assigned" }, - "version": { - "type": "string", - "title": "Version", - "description": "the policy id's own version" - } - }, - "type": "object", - "required": [ - "policy", - "version" - ], - "title": "DeploymentFacetPolicy", - "description": "This deployment's own default-facet policy: what an unbound facet\naxis falls back to once `default_facet_policies_live` (a graph-declared,\nper-StatVar policy) is `false`. See `docs/datasets-facet-policy.md`." - }, - "DescribedProperty": { - "properties": { - "ref": { + "label": { "type": "string", - "title": "Ref" + "title": "Label", + "description": "this series' own display label" }, - "label": { + "coordinates": { + "additionalProperties": true, + "type": "object", + "title": "Coordinates", + "description": "this series' own dimension coordinates" + }, + "point_count": { + "type": "integer", + "title": "Point Count", + "description": "how many of this series' points carry an observed value" + }, + "first_value": { "anyOf": [ { "type": "string" @@ -7612,25 +11007,10 @@ "type": "null" } ], - "title": "Label" - } - }, - "additionalProperties": false, - "type": "object", - "required": [ - "ref", - "label" - ], - "title": "DescribedProperty", - "description": "The open dimension a values page lists, and its label (`null` where none is known)." - }, - "DescribedValue": { - "properties": { - "ref": { - "type": "string", - "title": "Ref" + "title": "First Value", + "description": "this series' earliest observed value, formatted, null when it has none" }, - "label": { + "last_value": { "anyOf": [ { "type": "string" @@ -7639,38 +11019,38 @@ "type": "null" } ], - "title": "Label" - }, - "variables": { - "type": "integer", - "minimum": 0.0, - "title": "Variables" + "title": "Last Value", + "description": "this series' latest observed value, formatted, null when it has none" } }, "additionalProperties": false, "type": "object", "required": [ - "ref", + "id", "label", - "variables" + "coordinates", + "point_count", + "first_value", + "last_value" ], - "title": "DescribedValue", - "description": "One value of an open dimension, its label (`null` where none is known), and how many of\nthe version's variables with data hold it." + "title": "FactSummarySeriesEntry", + "description": "One `fact_summary.series[]` entry. It reports one visible series'\nidentity, point count and formatted boundary values." }, - "DescriptionValuesPage": { - "$id": "https://schemas.dfo.one.org/datasets/v1/description-values-page.json", + "FlowAccount": { + "type": "string", + "const": "provider" + }, + "FormatOptionModel": { "properties": { - "property": { - "$ref": "#/components/schemas/DescribedProperty" + "name": { + "type": "string", + "title": "Name" }, - "items": { - "items": { - "$ref": "#/components/schemas/DescribedValue" - }, - "type": "array", - "title": "Items" + "state": { + "type": "string", + "title": "State" }, - "next_cursor": { + "reason": { "anyOf": [ { "type": "string" @@ -7679,533 +11059,560 @@ "type": "null" } ], - "title": "Next Cursor" - }, - "complete": { - "type": "boolean", - "title": "Complete" + "title": "Reason" } }, "additionalProperties": false, "type": "object", "required": [ - "property", - "items", - "next_cursor", - "complete" + "name", + "state" ], - "title": "DescriptionValuesPage", - "description": "One page of `GET /api/datasets/{id}/{content_version}/description/values`: the values\nthe version's record holds for one open dimension, most variables first, ties ordered by\ndcid. `next_cursor` continues the list after the page's last value and is `null` on its\nlast page, where `complete` is true." + "title": "FormatOptionModel" }, - "DiagnosticModel": { + "FrameCurrent": { "properties": { - "code": { - "type": "string", - "title": "Code" - }, - "severity": { + "status": { "type": "string", - "title": "Severity" + "const": "current", + "title": "Status", + "default": "current" }, - "message": { - "type": "string", - "title": "Message" + "frame": { + "$ref": "#/components/schemas/FramePair", + "description": "the named frame, which is its rendering's current one" } }, "additionalProperties": false, "type": "object", "required": [ - "code", - "severity", - "message" + "frame" ], - "title": "DiagnosticModel", - "description": "One manifest diagnostic: a fact about how this response was produced that a developer\nreads and a dataset's description leaves out, since it states nothing about the data.\n`processing_level_undeclared` and `origin_catalogue_stale` are the codes it carries." + "title": "FrameCurrent" }, - "Diagnostics": { + "FrameDimensionMatch": { "properties": { - "engine_build": { - "type": "string", - "title": "Engine Build", - "description": "the commit sha the image was built from, the same value the x-dfo-commit response header carries; distinct from schema_version" - }, - "trace_id": { + "name": { "type": "string", - "title": "Trace Id", - "description": "this request's trace_id, shared verbatim with every RFC 9457 problem-details body and the SSE stream's `done` event" - }, - "warnings": { - "items": { - "$ref": "#/components/schemas/Warning" - }, - "type": "array", - "title": "Warnings", - "description": "degraded-mode, applied-signal, partial-graph signals" - }, - "timing_ms": { - "anyOf": [ - { - "$ref": "#/components/schemas/Timing" - }, - { - "type": "null" - } - ], - "description": "latency breakdown" - }, - "llm_usage": { - "anyOf": [ - { - "additionalProperties": { - "type": "integer" - }, - "type": "object" - }, - { - "type": "null" - } - ], - "title": "Llm Usage", - "description": "per-request LLM token counts {input_tokens, output_tokens, cached_tokens}, plus {jev_input_tokens, jev_output_tokens} when Jev answered a call" + "title": "Name", + "description": "this dimension's own column name" }, - "timed_out": { - "anyOf": [ - { - "type": "boolean" - }, - { - "type": "null" - } - ], - "title": "Timed Out", - "description": "True when the pipeline's soft deadline truncated this result to a partial response; False when it ran to completion. None on the SSE response event (whose `done` event carries the authoritative flag instead) -- only resolve_async's buffered ResolveResponse populates this, since a buffered caller has no `done` event of its own to read." + "values": { + "items": { + "type": "string" + }, + "type": "array", + "title": "Values", + "description": "this dimension's own values matching the query" + }, + "matched_count": { + "type": "integer", + "title": "Matched Count", + "description": "how many of this dimension's values matched the query" } }, "additionalProperties": false, "type": "object", "required": [ - "engine_build", - "trace_id", - "warnings" + "name", + "values", + "matched_count" ], - "title": "Diagnostics", - "description": "Run health, warnings, timing, and build stamp." + "title": "FrameDimensionMatch", + "description": "One dimension of a frame's query-filtered view (`?query=` given,\n`dimension` absent). Its values are filtered to those matching the\nquery." }, - "DimensionNoun": { + "FrameDimensionSummary": { "properties": { - "singular": { + "name": { "type": "string", - "title": "Singular" + "title": "Name", + "description": "this dimension's own column name" + }, + "values": { + "items": { + "type": "string" + }, + "type": "array", + "title": "Values", + "description": "this dimension's own values, capped" + }, + "total_count": { + "type": "integer", + "title": "Total Count", + "description": "this dimension's own value count before capping" + }, + "truncated": { + "type": "boolean", + "title": "Truncated", + "description": "whether this dimension's values list was capped" }, "plural": { - "type": "string", - "title": "Plural" + "type": "boolean", + "title": "Plural", + "description": "whether this frame's series hold more than one value of this dimension, a null counting as one; the estimates continuing a series hold its method, so they leave measurementMethod not plural" } }, "additionalProperties": false, "type": "object", "required": [ - "singular", + "name", + "values", + "total_count", + "truncated", "plural" ], - "title": "DimensionNoun", - "description": "What one member of a flow dimension is called, and several of them." + "title": "FrameDimensionSummary", + "description": "One dimension of a frame's structural view (`GET .../frames/{...}`\nwith neither `dimension` nor `query` given). Its values are capped to\nthe per-dimension listing cap." }, - "DocumentErrorEntry": { + "FrameDimensionValuesResponse": { "properties": { - "member": { + "dimension": { "type": "string", - "enum": [ - "transformation_log", - "version_history", - "methodology.description", - "data_notes" - ], - "title": "Member", - "description": "the wire path the document fills" + "title": "Dimension", + "description": "the dimension this response reports" }, - "line": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ], - "title": "Line", - "description": "1-based line in the decoded document where the problem starts, or null" + "values": { + "items": { + "type": "string" + }, + "type": "array", + "title": "Values", + "description": "every value this dimension carries, uncapped, or only the values matching `query` when it is given" }, - "reason": { - "type": "string", - "enum": [ - "undecodable", - "empty_document", - "content_outside_section", - "unexpected_heading_level", - "heading_not_plain_text", - "empty_heading", - "empty_section", - "disallowed_block", - "raw_html", - "hard_break", - "invalid_release_heading", - "missing_release_title", - "release_dates_not_descending", - "duplicate_release_date", - "unknown_change_kind", - "duplicate_change_kind", - "not_single_bullet_list", - "list_item_not_single_paragraph", - "document_too_large", - "nesting_too_deep", - "conflicting_values" - ], - "title": "Reason", - "description": "the template rule the document breaks" + "total_count": { + "type": "integer", + "title": "Total Count", + "description": "how many values this dimension carries, or how many match `query` when it is given" } }, + "additionalProperties": false, "type": "object", "required": [ - "member", - "line", - "reason" + "dimension", + "values", + "total_count" ], - "title": "DocumentErrorEntry", - "description": "A Markdown document the source carries that this door could not serve.\nThe member it fills is empty and named in `gaps`." + "title": "FrameDimensionValuesResponse", + "description": "`GET /api/presentation/frames/{spec_id}/{content_version}?dimension=`'s\nbody. It reports one dimension's full value list, read fresh and\nuncapped. Given alongside `?query=`, `values` and `total_count`\ndescribe only the values matching the query." }, - "DownloadFacts": { + "FrameFilteredViewResponse": { "properties": { - "rows": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ], - "title": "Rows", - "description": "the rows the definition's series serve: one per series and date, totals included. A long-layout CSV or XLSX keeps the rows where a role the Datasets options document lists in long_layout_totals holds a total out of its main table, so that table can hold fewer. Null when it could understate: a served member the coverage artifact does not hold" - }, - "rows_exact": { - "type": "boolean", - "title": "Rows Exact", - "description": "true when rows equals the mint's coverage.rows. Under a unit request rows counts only the rows the conversion keeps: at constant prices each entity's rows in the years its deflator holds, none when it lacks the base year. False when rows is an upper bound: a unit request whose conversion cannot be read from the loaded conversion tables (none loaded, served facets under several recipes or in a unit that is no currency, or no single deflator role), or a series whose facets carry no complete date list. False when rows is null" - }, - "series": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ], - "title": "Series", - "description": "the series in the file: distinct (StatVar, entities) with a point, the mint's series_count. Null when rows is null" + "dimensions": { + "items": { + "$ref": "#/components/schemas/FrameDimensionMatch" + }, + "type": "array", + "title": "Dimensions", + "description": "every dimension this frame declares, filtered" }, - "window": { - "anyOf": [ - { - "$ref": "#/components/schemas/TimeWindow" - }, - { - "type": "null" - } - ], - "description": "the first and last years of the file's points; null when rows is null" + "period_grain": { + "type": "string", + "title": "Period Grain", + "description": "this frame's own period grain" }, - "licence": { + "coverage": { "anyOf": [ { - "$ref": "#/components/schemas/DownloadLicence" + "prefixItems": [ + { + "type": "string" + }, + { + "type": "string" + } + ], + "type": "array", + "maxItems": 2, + "minItems": 2 }, { "type": "null" } ], - "description": "the licence of the one provenance the answer serves, from the origin catalogue; null when it serves several, or the catalogue names no single licence for it" + "title": "Coverage", + "description": "this frame's own [start, end] period coverage, null if it has none" } }, "additionalProperties": false, "type": "object", "required": [ - "rows_exact" + "dimensions", + "period_grain", + "coverage" ], - "title": "DownloadFacts", - "description": "What a Datasets mint of this Spec's definition writes in its default file (no\ngrouping), known before the first download. Rows and series count what the answer's\nread plan serves over the identity's whole window: every year for no window, the\nrange for a range, and each series' latest year for `latest`." + "title": "FrameFilteredViewResponse", + "description": "`GET /api/presentation/frames/{spec_id}/{content_version}?query=`'s\nbody (`dimension` absent). It reports every dimension this frame\ndeclares, filtered to values matching the query, counts kept." }, - "DownloadLicence": { + "FrameMoved": { "properties": { - "label": { + "status": { "type": "string", - "title": "Label", - "description": "the licence's name: the `name` of the licenseType node the provenances of the provenance's source-index entry agree on" - } - }, - "additionalProperties": false, - "type": "object", - "required": [ - "label" - ], - "title": "DownloadLicence", - "description": "The licence of the provenance a Spec's file cites. Its terms page is on the\nprovenance's source page." - }, - "EnrichmentCoverageCountsModel": { - "properties": { - "entities": { - "type": "integer", - "title": "Entities" + "const": "moved", + "title": "Status", + "default": "moved" }, - "covered": { - "type": "integer", - "title": "Covered" + "frame": { + "$ref": "#/components/schemas/FramePair", + "description": "the current frame of the named frame's rendering" } }, "additionalProperties": false, "type": "object", "required": [ - "entities", - "covered" + "frame" ], - "title": "EnrichmentCoverageCountsModel" + "title": "FrameMoved" }, - "EnrichmentOptionModel": { + "FramePair": { "properties": { - "column": { - "type": "string", - "title": "Column" - }, - "field": { - "type": "string", - "title": "Field" - }, - "token": { + "spec_id": { "type": "string", - "title": "Token" + "title": "Spec Id" }, - "state": { + "content_version": { "type": "string", - "title": "State" - }, - "reason": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Reason" - }, - "coverage": { - "$ref": "#/components/schemas/EnrichmentCoverageCountsModel" - }, - "missing": { - "items": { - "$ref": "#/components/schemas/MissingEntityModel" - }, - "type": "array", - "title": "Missing" - }, - "truncated": { - "type": "boolean", - "title": "Truncated", - "default": false + "title": "Content Version" } }, "additionalProperties": false, "type": "object", "required": [ - "column", - "field", - "token", - "state", - "coverage" + "spec_id", + "content_version" ], - "title": "EnrichmentOptionModel", - "description": "One `(entity column, field)` enrichment this deployment enables,\nwith `token` naming the exact `{column}_{field}` the `columns` option\naccepts to request it." + "title": "FramePair" }, - "EntityCounts": { + "FramePending": { "properties": { - "parties": { - "type": "integer", - "title": "Parties", - "description": "entities with figures of their own" - }, - "private": { - "type": "integer", - "title": "Private", - "description": "the parties whose class is private, a subset of parties" - }, - "totals": { - "type": "integer", - "title": "Totals", - "description": "entities that hold other entities' figures" + "status": { + "type": "string", + "const": "pending", + "title": "Status", + "default": "pending" }, - "residual": { - "type": "integer", - "title": "Residual", - "description": "entities holding figures no other entity does" + "operation_id": { + "type": "string", + "title": "Operation Id", + "description": "the queued rebuild, pollable on the operations route" }, - "unclassified": { - "type": "integer", - "title": "Unclassified", - "description": "entities the code index does not list" + "retry_after_s": { + "type": "number", + "title": "Retry After S", + "description": "seconds to wait before calling again" } }, + "additionalProperties": false, "type": "object", "required": [ - "parties", - "private", - "totals", - "residual", - "unclassified" + "operation_id", + "retry_after_s" ], - "title": "GraphAvailabilityEntityCounts", - "description": "The distinct entities in one role, split by their kind in the code index." + "title": "FramePending" }, - "EntityCoverage": { + "FrameStructuralViewResponse": { "properties": { - "entity": { - "$ref": "#/components/schemas/StepRef" + "dimensions": { + "items": { + "$ref": "#/components/schemas/FrameDimensionSummary" + }, + "type": "array", + "title": "Dimensions", + "description": "every dimension this frame declares" }, - "periods": { - "type": "integer", - "minimum": 0.0, - "title": "Periods" + "period_grain": { + "type": "string", + "title": "Period Grain", + "description": "this frame's own period grain" }, - "of": { + "coverage": { + "anyOf": [ + { + "prefixItems": [ + { + "type": "string" + }, + { + "type": "string" + } + ], + "type": "array", + "maxItems": 2, + "minItems": 2 + }, + { + "type": "null" + } + ], + "title": "Coverage", + "description": "this frame's own [start, end] period coverage, null if it has none" + }, + "series_count": { "type": "integer", - "minimum": 0.0, - "title": "Of" + "title": "Series Count", + "description": "how many distinct series this frame resolves" } }, "additionalProperties": false, "type": "object", "required": [ - "entity", - "periods", - "of" + "dimensions", + "period_grain", + "coverage", + "series_count" ], - "title": "EntityCoverage", - "description": "How many of the window's periods one ranked entity holds." + "title": "FrameStructuralViewResponse", + "description": "`GET /api/presentation/frames/{spec_id}/{content_version}`'s body\nwith neither `dimension` nor `query` given. It reports the frame's own\nstructural view, every dimension capped." }, - "EntityGroup": { + "Freshness": { "properties": { - "ref": { + "release_frequency": { "anyOf": [ { - "type": "string", - "maxLength": 1024 + "type": "string" }, { "type": "null" } ], - "title": "Ref", - "description": "the group's own graph node, when the graph holds one; null otherwise" - }, - "label": { - "type": "string", - "maxLength": 120, - "minLength": 1, - "title": "Label", - "description": "the group's name as the request gave it, plain text" + "title": "Release Frequency" }, - "entity_type": { + "release_frequency_label": { "anyOf": [ { - "type": "string", - "maxLength": 1024 + "type": "string" }, { "type": "null" } ], - "title": "Entity Type", - "description": "the graph type of the group's own node, e.g. Continent, UNGeoRegion, ContinentalUnion; null when the graph holds no node for the group" + "title": "Release Frequency Label" }, - "total": { + "refresh_type": { "anyOf": [ { - "type": "string", - "maxLength": 1024 + "type": "string" }, { "type": "null" } ], - "title": "Total", - "description": "the party the dataset publishes as the group's total, which the role binds in place of the members (DACAfrica for Africa); null when the role binds the members" + "title": "Refresh Type" + } + }, + "type": "object", + "required": [ + "release_frequency", + "release_frequency_label", + "refresh_type" + ], + "title": "Freshness", + "description": "A source's own refresh cadence, read from DCP provenance arcs that imports populate\nunevenly: `dc/base/WHO_COVID19` carries both `sourceReleaseFrequency` and\n`automaticRefreshType`, `dc/base/BIS_CentralBankPolicyRate` only the second, and\n`dc/base/WHO_GHO` neither. Nullability is the contract.\n\n`release_frequency` is the raw `sourceReleaseFrequency` ISO 8601 duration (`P1M`);\n`release_frequency_label` is `materialise.cadence.cadence_label`'s display label for it\n(`Monthly`), or the raw token when that module does not recognise it.\n\n`refresh_type` is `automaticRefreshType`'s value: how this deployment refreshes the\nsource, such as `GCPCloudRunAutomaticRefresh`, or the sentinel `NoAutomaticRefresh`." + }, + "GraphRef": { + "properties": { + "ref": { + "type": "string", + "title": "Ref", + "description": "the graph identifier" + }, + "label": { + "type": "string", + "title": "Label", + "description": "plain-language display name, read from the graph" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "ref", + "label" + ], + "title": "GraphRef", + "description": "Every graph identifier in the contract." + }, + "GraphSchema": { + "properties": { + "schemas": { + "additionalProperties": { + "additionalProperties": true, + "type": "object" + }, + "type": "object", + "title": "Schemas", + "description": "JSON Schema of each served request and response body, keyed by name" + }, + "capabilities": { + "type": "string", + "title": "Capabilities", + "description": "path of this surface's capability document" + } + }, + "type": "object", + "required": [ + "schemas", + "capabilities" + ], + "title": "GraphSchema", + "description": "The full `GET /api/graph/schema` document." + }, + "GroupNode": { + "properties": { + "ref": { + "type": "string", + "title": "Ref", + "description": "the node's dcid" }, - "group_id": { + "label": { "anyOf": [ { - "type": "string", - "maxLength": 1024 + "type": "string" }, { "type": "null" } ], - "title": "Group Id", - "description": "the membership registry's id for a group the graph holds no node for, e.g. groups/OECD.DAC.Region.Asia; null when ref is set or the group is no registry group" + "title": "Label", + "description": "the node's name; for a Provenance, its parent Dataset's name where it has one. Null, and named in gaps, when the graph gives none" }, - "whole_of": { + "types": { + "items": { + "type": "string" + }, + "type": "array", + "title": "Types", + "description": "the node's typeOf values, as the graph holds them" + }, + "description": { "anyOf": [ { - "items": { - "type": "string", - "enum": [ - "official", - "private", - "residual" - ] - }, - "type": "array" + "type": "string" }, { "type": "null" } ], - "title": "Whole Of", - "description": "the classes of party the role's whole population covers, sorted: official, private or residual, e.g. [\"official\"] for Official Donors, Total, which holds every official donor and no private one; absent for any other group" + "title": "Description", + "description": "the node's prose in the graph; null when it has none" }, - "side_classes": { + "links": { + "additionalProperties": { + "type": "string" + }, + "propertyNames": { + "enum": [ + "codes", + "children", + "members", + "countries", + "datasets", + "variables", + "facets" + ] + }, + "type": "object", + "title": "Links", + "description": "each list relation the node has, mapped to its route; empty when none" + }, + "gaps": { + "items": { + "type": "string" + }, + "type": "array", + "title": "Gaps", + "description": "the member path of every value this door cannot know" + }, + "built_from": { + "additionalProperties": { + "type": "string" + }, + "propertyNames": { + "enum": [ + "code_index", + "origin_catalogue", + "coverage_index", + "membership" + ] + }, + "type": "object", + "title": "Built From", + "description": "the build of each table the response read" + }, + "kind": { + "type": "string", + "const": "group", + "title": "Kind", + "default": "group" + }, + "group": { + "$ref": "#/components/schemas/MembershipBlock" + } + }, + "type": "object", + "required": [ + "ref", + "label", + "types", + "description", + "links", + "gaps", + "built_from", + "kind", + "group" + ], + "title": "GroupNode" + }, + "GroupbyOptions": { + "properties": { + "by": { + "items": { + "type": "string", + "minLength": 1 + }, + "type": "array", + "minItems": 1, + "uniqueItems": true, + "title": "By" + }, + "op": { + "type": "string", + "const": "sum", + "title": "Op" + }, + "levels": { "anyOf": [ { - "items": { - "type": "string", - "enum": [ - "official", - "private", - "residual" - ] + "additionalProperties": { + "type": "integer", + "maximum": 99.0, + "minimum": 0.0 }, - "type": "array" + "type": "object", + "minProperties": 1 }, { "type": "null" } ], - "title": "Side Classes", - "description": "for a role read as its whole population, the classes of party, totals aside, the answer's dataset publishes on that side, sorted, e.g. [\"official\", \"private\", \"residual\"] for donors in DAC2a; a class here and not in whole_of, such as \"private\", is outside the total. Absent for any other group. Derived from the identity on every answer; a posted value is ignored" + "title": "Levels", + "description": "code system -> depth: roll each kept code up to its ancestor at that depth (0 = root codes); a code shallower than the depth stays as itself, under its own label" } }, "additionalProperties": false, "type": "object", "required": [ - "label" + "by", + "op" ], - "title": "EntityGroup", - "description": "A named group whose members fill one entity role, as the request named it\n(\"EU member states\"). The members themselves are the role's dcids in\n`BaseIdentity.entities`. This records only that they were asked for as one\ngroup, so the heading can say \"the 27 EU member states\" after any edit that\nkeeps the role's members. A group the graph holds no node for, read from the\nmembership registry (\"Asia (DAC)\"), names the registry's id for it in\n`group_id`, so a resubmit restores it and the total its dataset publishes for it.\nA group whose `ref` is a continent or subregion\nthat the membership policy holds or omits (`MembershipPolicy.holds_region`)\nreads as its countries (\"the 54 countries in Africa\"), whatever its graph\ntype. `entity_type` is informational, and the reading keys on `ref`. When\nthe role binds the total its dataset publishes\nfor the group (\"Africa (DAC)\") in place of the members, `total` names that\nparty and the role's one dcid is it. A role read as the whole population of\nits side, the source's total of every party there (\"Official Donors, Total\")\nor a union of such totals (\"all donors including private\"), states the\nclasses of party that population covers in `whole_of`, and the classes the answer's\ndataset publishes on that side in `side_classes`; a resubmit derives both from the\nidentity and the code index, whatever it posts. A Spec serves its groups on\n`ResolvedSpec.entity_groups`, and a resubmit posts them beside the identity\n(`ResubmitIdentityEntry.entity_groups`, `ResubmitCandidate.entity_groups`)." + "title": "GroupbyOptions", + "description": "`options.groupby`: a safe roll-up that keeps exactly the axes named\nin `by`, one row per distinct combination of their values. Every other\ngraph-declared summable axis a frame decoded is summed away, `stat_var`\nincluded. `by` names what a caller wants to see, the opposite of\n`groupby_sum`'s own \"collapse this axis\" reading. `sum` is the only op\nthis closed reshape list allows.\n\nEvery `by` entry names a code system some deployment declaration marks\nsummable, a role/entity column (`materialise.roles.KNOWN_ROLE_NAMES`),\n`stat_var`, or a column every frame carries regardless of shape; any\nother name refuses `rollup_not_summable`\n(`datasets_api.groupby.refuse_unknown_by_axes`). A declared axis this\nframe's StatVars do not decode is left out of the collapse set\n(`datasets_api.groupby.collapse_axes`).\n\n`levels` rolls a kept hierarchical axis up to one depth of its parent\nchain before the sum: each code becomes its ancestor at that depth, and\ndepth 0 is the root codes. Each key must also appear in `by`, and must\nbe one of the capabilities document's `groupby_level_axes`\n(`datasets_api.render.check_options_supported`)." }, - "EntityOptions": { + "GroupbyOptionsModel": { "properties": { - "entity_ref": { + "state": { + "type": "string", + "title": "State" + }, + "reason": { "anyOf": [ { "type": "string" @@ -8214,368 +11621,232 @@ "type": "null" } ], - "title": "Entity Ref", - "description": "dcid of the currently-bound directional entity; joins to an entry in SentenceToken.entity_refs. None means this role axis is open -- no entity is bound on it, and `options` is this axis's own candidate member set rather than a set the current binding could be swapped among. An open role axis omits this key entirely on both the buffered body and the SSE entity_options event, rather than emitting null -- the opposite of SlotOption.coverage's own explicit-null convention on that same SSE channel" - }, - "role": { - "$ref": "#/components/schemas/RoleAxis", - "description": "the flow axis these candidates apply to; present even when entity_ref is omitted so a selected candidate can be posted under the same identity.entities role" + "title": "Reason" }, - "options": { + "axes": { "items": { - "$ref": "#/components/schemas/SlotOption" + "additionalProperties": true, + "type": "object" }, "type": "array", - "title": "Options", - "description": "candidate entities, reusing SlotOption for shape parity with slot_options" - }, - "truncated": { - "type": "boolean", - "title": "Truncated", - "description": "true when options is capped or deliberately count-only, so it is not the complete known candidate set; false when every known candidate is listed" - }, - "source": { - "type": "string", - "enum": [ - "observed", - "seed" - ], - "title": "Source", - "description": "'seed' for a hand-curated candidate set; 'observed' for candidates already confirmed while resolving this flow axis" + "title": "Axes" } }, "additionalProperties": false, "type": "object", "required": [ - "role", - "options", - "truncated", - "source" + "state" ], - "title": "EntityOptions", - "description": "Candidates for one directional entity axis.\n\nParallel to SlotOptions, but for a directional *entity* (an observation\nendpoint) rather than a constraint-property value. A role-bearing flow may\nexpose either its origin or destination axis here when that axis was left\nopen. The entry's ``role`` is the routing key a client uses to promote a\nselected candidate into ``identity.entities`` on a dataset_resubmit entry." + "title": "GroupbyOptionsModel", + "description": "`axes` names the axes a `groupby.by` request may keep: every other\ndeclared-summable axis a frame decoded is collapsed into it. Empty\nwhile `state` is `unavailable`." }, - "EntityRef": { + "Headline": { "properties": { - "ref": { - "type": "string", - "title": "Ref" + "year": { + "type": "integer", + "title": "Year", + "description": "the year the counts are for. For a latest window it is the elected year: of the three calendar years ending at the newest year a variable's series hold, at or before the year the coverage artifact was built, the newest one that at least half as many series hold as the fullest of the three, and with several variables the newest year any of them elects. For a named window it is the latest year any served series has an observation inside the window" }, - "label": { - "type": "string", - "title": "Label" + "year_named": { + "type": "boolean", + "title": "Year Named", + "description": "whether the request itself named a year or a range of years, rather than defaulting to one, independent of whether those years include the shown `year`" }, - "kind": { + "named_window": { "anyOf": [ { - "type": "string", - "enum": [ - "country", - "continent", - "subregion", - "continental_union", - "place_other", - "aggregate", - "organisation", - "group", - "stat_var", - "code_system", - "code", - "unit", - "source", - "dataset", - "provenance", - "other" - ] + "$ref": "#/components/schemas/TimeWindow" }, { "type": "null" } ], - "title": "Kind" - } - }, - "type": "object", - "required": [ - "ref", - "label", - "kind" - ], - "title": "GraphResolveEntity", - "description": "A reference with its kind. `kind` is `null` only for a `not_held` entity, which the\ngraph holds no node to classify." - }, - "EntityRefs": { - "properties": { - "text": { - "type": "string", - "title": "Text", - "description": "the entity text, equal to restatement.entities[i].text, where i is this entry's position in Part.entity_refs" + "description": "the year or years the request named: equal bounds for one year, an absent bound for an open range; null when no year was named. The counts are for `year` alone, whatever this window holds" + }, + "observations": { + "type": "integer", + "title": "Observations", + "description": "exact observation count across served series in year" + }, + "series": { + "type": "integer", + "title": "Series", + "description": "exact series count with an observation in year" }, - "refs": { + "role_counts": { + "additionalProperties": { + "type": "integer" + }, + "type": "object", + "title": "Role Counts", + "description": "distinct dcid count per role active in year, keyed by the graph's own role property dcid (e.g. financingProvider, financingRecipient) -- never by a donor/recipient label, so the wire stays aligned with Data Commons' own names" + }, + "recent_years": { "items": { - "type": "string" + "$ref": "#/components/schemas/HeadlineYear" }, "type": "array", - "title": "Refs", - "description": "the refs the part's answer binds for `text`: a place gives its node; a group, continent or subregion bound as itself gives its own node, or the total its dataset publishes for it (G7 bound as GroupOfSeven); one bound as its members gives the set's own ref first (its node, else that total, else its registry id) and then the members, sorted. [] for an ambiguous text, one that resolved to no node or a node the answer does not bind, and every text of a part refused before its places were bound" + "minItems": 1, + "title": "Recent Years", + "description": "the counts for three calendar years, newest first, so a newest year with far fewer series than the years before it reads as incomplete. For a latest window they are raw counts over every series the answer holds, ending at the newest year any of them holds at or before the year the coverage artifact was built, or at the newest year any holds when none holds a year that early; `year` is one of the three: the newest year a variable heads, which is the year it elected or, for a variable that elects none, such as one of monthly data, its newest year at or before the build year. When no variable holds a year that early, each heads its newest year. `observations`, `series` and `role_counts` count only the variables heading it. For a named window they end at `year`, the first entry repeats `observations`, `series` and `role_counts`, and the earlier years count whether or not `named_window` reaches them. A year with no data is kept with zero counts. The list stops at the first year the coverage artifact represents, so it can hold fewer than three entries" } }, "additionalProperties": false, "type": "object", "required": [ - "text", - "refs" + "year", + "year_named", + "observations", + "series", + "role_counts", + "recent_years" ], - "title": "EntityRefs", - "description": "The graph nodes one entity row of a part's restatement binds in the answer." + "title": "Headline", + "description": "The exact, one-year summary of a role-bearing answer's own served\npopulation: the year `CoverageIndex.headline` (series_coverage) heads the\nanswer with, whether that year was the one the question named, the exact\nobservation and series count in that year alone, and how many distinct dcids\neach role carries in it. `series_coverage.index.Headline`'s own docstring is\nthe source of truth for why `observations` and `series` are always equal\nunder this schema.\n\nThe counts are those of the year the answer's read plan serves. Under a `latest`\nwindow that is the year its variables elect (`CoverageIndex.elected_years`), which\nthe preview and a mint of the Spec serve too. Under a named window it is the latest\nyear with data in that window, so a question naming 2015 to 2020 counts the latest\nof those years with data. `named_window` carries the years it named.\n\nAttached to every role-bearing answer (named-destination confirmed and\nopen-axis discovered alike), never to a non-role-bearing one: coverage\nonly exists for role-bearing series (series_coverage.schema's own scope\nnote), and computing this is a free in-memory bitmask operation, not a\nnetwork read, so there is no population-size reason to withhold it from\na narrow answer the way the per-series preview stays capped at 20\nregardless of how broad the answer is." }, - "EntityYearsModel": { + "HeadlineYear": { "properties": { - "ref": { - "type": "string", - "title": "Ref", - "description": "the entity's `dcid:` ref" + "year": { + "type": "integer", + "title": "Year", + "description": "the calendar year these counts are for" }, - "years": { - "items": { - "type": "string" + "observations": { + "type": "integer", + "title": "Observations", + "description": "exact observation count across served series in year" + }, + "series": { + "type": "integer", + "title": "Series", + "description": "exact series count with an observation in year" + }, + "role_counts": { + "additionalProperties": { + "type": "integer" }, - "type": "array", - "title": "Years", - "description": "the years left out, as runs of consecutive years, `1990-2001` or `2004`" + "type": "object", + "title": "Role Counts", + "description": "distinct dcid count per role active in year, keyed by the graph's own role property dcid; a role with no dcid in the year is absent" } }, "additionalProperties": false, "type": "object", "required": [ - "ref", - "years" + "year", + "observations", + "series", + "role_counts" ], - "title": "EntityYearsModel", - "description": "One entity a conversion left rows out of, and the years of those rows\n(`materialise.codes.EntityYears`)." + "title": "HeadlineYear", + "description": "The exact counts for one calendar year of a role-bearing answer's served\npopulation: observations and series with an observation in it, and how many\ndistinct dcids each role carries. A year with no data counts zero." }, - "Exclusion": { + "HealthResponse": { "properties": { - "ref": { + "status": { "type": "string", - "title": "Ref" + "const": "ok", + "title": "Status", + "description": "always \"ok\" for a 200 response" }, - "reason": { + "build": { "type": "string", - "enum": [ - "superseded_by_dfo", - "superseded_by_un_system" - ], - "title": "Reason", - "description": "superseded_by_dfo: an upstream copy of a dataset DFO imports. superseded_by_un_system: a UN System Data Commons agency's series replace it" + "title": "Build", + "description": "the commit sha the image was built from, the same value the x-dfo-commit response header carries, \"unknown\" on a checkout run with no DFO_BUILD_COMMIT set" + }, + "capability_version": { + "type": "string", + "title": "Capability Version", + "description": "this surface's own capability_version token" } }, "type": "object", "required": [ - "ref", - "reason" + "status", + "build", + "capability_version" ], - "title": "Exclusion", - "description": "A provenance a base source holds that this deployment does not admit, because\nanother Data Commons supersedes it." + "title": "HealthResponse", + "description": "`GET /healthz`'s own response body, shared across every surface." }, - "Expansion": { + "IdentityBindingExact": { "properties": { - "added": { - "items": { - "$ref": "#/components/schemas/GraphRef" - }, - "type": "array", - "minItems": 1, - "title": "Added", - "description": "descendant codes admitted beyond the slot's own bound value(s), in the code index's descendant-walk order. Never empty -- a slot whose expansion added nothing carries no Expansion at all (Slot.expansion is None), rather than one with added=[]" + "state": { + "type": "string", + "const": "exact", + "title": "State", + "default": "exact" + }, + "ref": { + "type": "string", + "maxLength": 1024, + "title": "Ref", + "description": "the bound dcid, denoting that code alone" } }, "additionalProperties": false, "type": "object", "required": [ - "added" + "ref" ], - "title": "Expansion", - "description": "Codes a hierarchical value/set binding resolved to beyond its own bound\nvalue(s): the descendant codes admitted by walking the code index's\n`specializationOf` closure for a dimension the index declares\n`hierarchical` (code_index.query.CodeIndex.descendants).\n\nAdditive only. Never a substitute for `binding`, and never fed into spec\nidentity -- `BindingValue`/`BindingSet` are the sole identity-bearing wire\nform (see Slot.expansion's own docstring for why: identity is minted from\n`BindingSet.values`, built from the query's own drafted values, before\nresolution ever widens them). `added` never repeats a dcid already in the\nbinding's own value(s); it holds only what expansion contributed on top." + "title": "IdentityBindingExact", + "description": "A single bound dcid, denoting that code alone -- never its subtree,\neven where the code is a hierarchical (non-leaf) code (see\n`docs/identity-v1.md` in `spec-kit` for the denotation rule: `value`\ndenotes a hierarchical code's whole subtree, `exact` denotes the code\nalone). Slot-only: `_build_facet_binding` refuses `exact` on a facet.\nNo engine `Binding` arm maps onto this state and no minting site\nproduces it -- see `IdentityBinding`'s own docstring." }, - "FacetItem": { + "IdentityBindingSet": { "properties": { - "ref": { + "state": { "type": "string", - "title": "Ref" - }, - "label": { - "type": "null", - "title": "Label" - }, - "source": { - "$ref": "#/components/schemas/AvailabilitySource" - }, - "unit": { - "anyOf": [ - { - "$ref": "#/components/schemas/NodeRef" - }, - { - "type": "null" - } - ] - }, - "measurement_method": { - "anyOf": [ - { - "$ref": "#/components/schemas/NodeRef" - }, - { - "type": "null" - } - ] - }, - "observation_period": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Observation Period" - }, - "scaling": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Scaling" - }, - "first_year": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "First Year" - }, - "last_year": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Last Year" - }, - "observations": { - "type": "integer", - "title": "Observations" + "const": "set", + "title": "State", + "default": "set" }, - "places": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ], - "title": "Places", - "description": "null for a role-bearing variable" - } - }, - "type": "object", - "required": [ - "ref", - "label", - "source", - "unit", - "measurement_method", - "observation_period", - "scaling", - "first_year", - "last_year", - "observations", - "places" - ], - "title": "GraphFacetItem", - "description": "One facet of a variable, as the `facets` list relation serves it. `ref` is the facet id,\nwhich hashes the facet's metadata." - }, - "FacetNationalCurrencyBinding": { - "properties": { - "national_currency": { - "$ref": "#/components/schemas/UnitCurrencyRole" + "refs": { + "items": { + "type": "string", + "maxLength": 1024 + }, + "type": "array", + "maxItems": 1024, + "minItems": 1, + "title": "Refs", + "description": "the bound dcids (dfo_spec_kit sorts and de-duplicates)" } }, "additionalProperties": false, "type": "object", "required": [ - "national_currency" + "refs" ], - "title": "FacetNationalCurrencyBinding", - "description": "The unit axis bound to each entity's own currency: at each entity `role`\nbinds, the facets whose unit is the one currency the graph's\n`nationalCurrencyOf` names for it, served as published and never converted.\nThe conversion request naming the same role (`UnitCurrencyRole`) converts\neach row into that currency instead." + "title": "IdentityBindingSet", + "description": "A bound dcid set, in the identity core's own binding wire shape." }, - "FacetOptions": { + "IdentityBindingUnbound": { "properties": { - "axis": { - "type": "string", - "title": "Axis", - "description": "the facet axis this option set belongs to (see FacetAxis)" - }, - "options": { - "items": { - "$ref": "#/components/schemas/SlotOption" - }, - "type": "array", - "title": "Options", - "description": "candidate values seen on the resolved candidates' own unfiltered observation facets, ranked by in-window observation-point count descending then ref ascending; a dcid the graph can't label falls back to the dcid itself as its own label rather than being dropped -- every value here already came off a confirmed observation facet, unlike a curated seed candidate. On the measurementMethod and unit axes, an option with no value.ref stands for the facets that declare no value on the axis, as Data Commons omits the member; it is listed only beside a declared value, ranks last among equal counts, and is pinned by posting identity.facets. as {state: 'value', ref: null}" - }, - "truncated": { - "type": "boolean", - "title": "Truncated", - "description": "true when options is bounded by SEARCH_MAX_OPTIONS rather than the full distinct set observed" - }, - "source": { + "state": { "type": "string", - "enum": [ - "observed", - "seed" - ], - "title": "Source", - "description": "always 'observed' -- a facet axis has no curated seed taxonomy" + "const": "unbound", + "title": "State", + "default": "unbound" } }, "additionalProperties": false, "type": "object", - "required": [ - "axis", - "options", - "truncated", - "source" - ], - "title": "FacetOptions", - "description": "The candidate set one facet axis (see ResolvedFacet) was chosen from:\nevery distinct value seen on the resolved candidates' own observation\nfacets, so a client can offer \"what else could I ask for\" alongside the\nserved answer.\n\nParallel to SlotOptions/EntityOptions, reusing SlotOption for shape\nparity. Unlike either, source is always \"observed\" -- a facet axis has\nno curated seed taxonomy -- and no option here ever carries a populated\nSlotOption.coverage: there is no separate confirm step for a facet\noption, the observed count already ranks the list." + "title": "IdentityBindingUnbound", + "description": "An unbound slot/facet binding." }, - "FacetRefBinding": { + "IdentityBindingValue": { "properties": { + "state": { + "type": "string", + "const": "value", + "title": "State", + "default": "value" + }, "ref": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Ref" + "type": "string", + "maxLength": 1024, + "title": "Ref", + "description": "the bound dcid" } }, "additionalProperties": false, @@ -8583,758 +11854,558 @@ "required": [ "ref" ], - "title": "FacetRefBinding", - "description": "A facet axis bound to a specific ref. Every axis accepts this form;\nthe unit axis alone also accepts `FacetUnitRequestBinding`, the\nconversion-request form (`currency`/`prices`/`base_year`), and\n`FacetNationalCurrencyBinding`. A null `ref` binds the facets that declare\nno value on the axis, and only `NULL_REF_FACET_AXES` accept it." + "title": "IdentityBindingValue", + "description": "A single bound dcid, in the identity core's own binding wire shape." }, - "FactSummaryModel": { + "IdentityCurrencyRole": { "properties": { - "changed": { - "items": { - "type": "string" - }, - "type": "array", - "title": "Changed", - "description": "the patch's own changed field names, empty for a create or a no-op write" - }, - "series": { - "items": { - "$ref": "#/components/schemas/FactSummarySeriesEntry" - }, - "type": "array", - "title": "Series", - "description": "every visible series this revision resolves, capped" - }, - "series_cut": { - "type": "integer", - "title": "Series Cut", - "description": "how many series the series cap and the token cap together dropped from this summary" - }, - "window": { - "anyOf": [ - { - "$ref": "#/components/schemas/WindowModel" - }, - { - "type": "null" - } - ], - "description": "this component's own [start, end] period window, null where its type defines none" - }, - "unit": { - "anyOf": [ - { - "type": "string" - }, - { - "$ref": "#/components/schemas/ConvertedUnitModel" - }, - { - "$ref": "#/components/schemas/ComposedUnitModel" - }, - { - "type": "null" - } - ], - "title": "Unit", - "description": "this component's own unit, the value its resolved payload carries: a unit's graph name (its ref when the graph has none), a converted unit, or a composed unit. A line_chart or bar_chart reports its first series' unit and a table the unit every row shares. Null where the type defines none, the rows declare none, or a table's rows differ." - }, - "change": { - "anyOf": [ - { - "additionalProperties": true, - "type": "object" - }, - { - "type": "null" - } - ], - "title": "Change", - "description": "the stat_card's derived comparison between its two basis periods, null for every other member and for a stat_card whose intent carries no change" - }, - "source_refs": { - "anyOf": [ - { - "items": { - "type": "string" - }, - "type": "array" - }, - { - "type": "null" - } + "role": { + "type": "string", + "enum": [ + "observationAbout", + "origin", + "destination" ], - "title": "Source Refs", - "description": "every distinct raw provenance ref a source_card's frame carries. It is null for every other member." - }, - "defaults": { - "items": { - "$ref": "#/components/schemas/AppliedDefaultModel" - }, - "type": "array", - "title": "Defaults", - "description": "the choices this component made where its intent left one open, empty when it made none" + "title": "Role", + "description": "the entity role whose bound entity's currency this request means" } }, "additionalProperties": false, "type": "object", "required": [ - "changed", - "series", - "series_cut", - "window", - "unit", - "change", - "source_refs", - "defaults" + "role" ], - "title": "FactSummaryModel", - "description": "The closed, token-capped fact summary a revision reports." + "title": "IdentityCurrencyRole", + "description": "The role-shaped form of a unit request's `currency`: the currency of\nthe entity bound to this spec role, resolved per row. Field-for-field mirror\nof the identity core's own `_CURRENCY_ROLE_KEYS`/`_CURRENCY_ROLES`\n(`dfo_spec_kit.identity`'s `_build_currency`, the object arm)." }, - "FactSummarySeriesEntry": { + "IdentityFacetValueAbsent": { "properties": { - "id": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Id", - "description": "this series' own id, null when none could be assigned" - }, - "label": { + "state": { "type": "string", - "title": "Label", - "description": "this series' own display label" - }, - "coordinates": { - "additionalProperties": true, - "type": "object", - "title": "Coordinates", - "description": "this series' own dimension coordinates" - }, - "point_count": { - "type": "integer", - "title": "Point Count", - "description": "how many of this series' points carry an observed value" - }, - "first_value": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "First Value", - "description": "this series' earliest observed value, formatted, null when it has none" + "const": "value", + "title": "State", + "default": "value" }, - "last_value": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Last Value", - "description": "this series' latest observed value, formatted, null when it has none" + "ref": { + "type": "null", + "title": "Ref", + "description": "null: the facet declares no value on this axis" } }, "additionalProperties": false, "type": "object", "required": [ - "id", - "label", - "coordinates", - "point_count", - "first_value", - "last_value" - ], - "title": "FactSummarySeriesEntry", - "description": "One `fact_summary.series[]` entry. It reports one visible series'\nidentity, point count and formatted boundary values." - }, - "FlowAccount": { - "type": "string", - "const": "provider" + "ref" + ], + "title": "IdentityFacetValueAbsent", + "description": "A measurementMethod or unit facet bound to no declared value:\n`{\"state\": \"value\", \"ref\": null}` asks for the facets that declare no value\non the axis, the ones Data Commons serves without that member. An unbound\naxis admits every facet; this binding admits only those without a value.\nMirrors the identity core's null facet ref (`docs/identity-v1.md` in\n`spec-kit`). `ref` serialises as `null` even under `exclude_none`, since\nthe identity core refuses a value binding with neither `ref` nor `request`." }, - "FormatOptionModel": { + "IdentityFacetValueRequest": { "properties": { - "name": { - "type": "string", - "title": "Name" - }, "state": { "type": "string", - "title": "State" + "const": "value", + "title": "State", + "default": "value" }, - "reason": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Reason" + "request": { + "$ref": "#/components/schemas/IdentityUnitRequest", + "description": "the completed unit-conversion request" } }, "additionalProperties": false, "type": "object", "required": [ - "name", - "state" + "request" ], - "title": "FormatOptionModel" + "title": "IdentityFacetValueRequest", + "description": "A unit-axis facet bound via the request form: \"serve whatever facet\nhonours this completed currency/prices/base_year request\" rather than a\nliteral graph ref. `state` reuses the value-state spelling since this is\nstill a single-valued binding to the identity core -- `request` is what\ndistinguishes it from `IdentityBindingValue`'s `ref` form (see\n`_facet_binding_tag`, this union's discriminator)." }, - "FrameCurrent": { + "IdentityShapeDenominatorRef": { "properties": { - "status": { + "ref": { "type": "string", - "const": "current", - "title": "Status", - "default": "current" - }, - "frame": { - "$ref": "#/components/schemas/FramePair", - "description": "the named frame, which is its rendering's current one" + "maxLength": 1024, + "title": "Ref", + "description": "the resolved denominator StatVar's dcid" } }, "additionalProperties": false, "type": "object", "required": [ - "frame" + "ref" ], - "title": "FrameCurrent" + "title": "IdentityShapeDenominatorRef", + "description": "The described arm's `measurement_denominator`, resolved to a dcid." }, - "FrameDimensionMatch": { + "IdentityShapeDenominatorUnresolved": { "properties": { - "name": { - "type": "string", - "title": "Name", - "description": "this dimension's own column name" - }, - "values": { - "items": { - "type": "string" - }, - "type": "array", - "title": "Values", - "description": "this dimension's own values matching the query" - }, - "matched_count": { - "type": "integer", - "title": "Matched Count", - "description": "how many of this dimension's values matched the query" + "unresolved": { + "type": "boolean", + "const": true, + "title": "Unresolved", + "description": "always the literal true -- the arc exists but names no dcid", + "default": true } }, "additionalProperties": false, "type": "object", - "required": [ - "name", - "values", - "matched_count" - ], - "title": "FrameDimensionMatch", - "description": "One dimension of a frame's query-filtered view (`?query=` given,\n`dimension` absent). Its values are filtered to those matching the\nquery." + "title": "IdentityShapeDenominatorUnresolved", + "description": "The described arm's `measurement_denominator`, present on the graph but\nnever resolved to a dcid (e.g. a dcid-less ProvisionalNode) -- distinct\nfrom the member being absent entirely, which means no denominator arc\nexists at all." }, - "FrameDimensionSummary": { + "IdentityShapePin": { "properties": { - "name": { + "kind": { "type": "string", - "title": "Name", - "description": "this dimension's own column name" - }, - "values": { - "items": { - "type": "string" - }, - "type": "array", - "title": "Values", - "description": "this dimension's own values, capped" - }, - "total_count": { - "type": "integer", - "title": "Total Count", - "description": "this dimension's own value count before capping" - }, - "truncated": { - "type": "boolean", - "title": "Truncated", - "description": "whether this dimension's values list was capped" + "const": "stat_var", + "title": "Kind", + "default": "stat_var" }, - "plural": { - "type": "boolean", - "title": "Plural", - "description": "whether this frame's series hold more than one value of this dimension, a null counting as one; the estimates continuing a series hold its method, so they leave measurementMethod not plural" + "id": { + "type": "string", + "maxLength": 1024, + "title": "Id", + "description": "the pinned StatVar's dcid" } }, "additionalProperties": false, "type": "object", "required": [ - "name", - "values", - "total_count", - "truncated", - "plural" + "id" ], - "title": "FrameDimensionSummary", - "description": "One dimension of a frame's structural view (`GET .../frames/{...}`\nwith neither `dimension` nor `query` given). Its values are capped to\nthe per-dimension listing cap." + "title": "IdentityShapePin", + "description": "The pinned-ask arm of the identity core's `shape` union\n(`kind: \"stat_var\"`): a single StatVar dcid, minted by Datasets'\nstatvar_set. See `BaseIdentity`'s cross-member validator -- when this arm\nis chosen, `slots` must be empty." }, - "FrameDimensionValuesResponse": { + "IdentityShapeSchema": { "properties": { - "dimension": { + "kind": { "type": "string", - "title": "Dimension", - "description": "the dimension this response reports" + "const": "statvar_schema", + "title": "Kind", + "default": "statvar_schema" }, - "values": { - "items": { - "type": "string" - }, - "type": "array", - "title": "Values", - "description": "every value this dimension carries, uncapped, or only the values matching `query` when it is given" + "population_type": { + "anyOf": [ + { + "type": "string", + "maxLength": 1024 + }, + { + "type": "null" + } + ], + "title": "Population Type", + "description": "the graph populationType dcid" }, - "total_count": { - "type": "integer", - "title": "Total Count", - "description": "how many values this dimension carries, or how many match `query` when it is given" + "measured_property": { + "anyOf": [ + { + "type": "string", + "maxLength": 1024 + }, + { + "type": "null" + } + ], + "title": "Measured Property", + "description": "the graph measuredProperty dcid" + }, + "stat_type": { + "anyOf": [ + { + "type": "string", + "maxLength": 1024 + }, + { + "type": "null" + } + ], + "title": "Stat Type", + "description": "the graph statType dcid, e.g. measuredValue" + }, + "measurement_qualifier": { + "anyOf": [ + { + "type": "string", + "maxLength": 1024 + }, + { + "type": "null" + } + ], + "title": "Measurement Qualifier", + "description": "the graph measurementQualifier dcid, present only when the measured property is qualified" + }, + "measurement_denominator": { + "anyOf": [ + { + "oneOf": [ + { + "$ref": "#/components/schemas/IdentityShapeDenominatorRef" + }, + { + "$ref": "#/components/schemas/IdentityShapeDenominatorUnresolved" + } + ] + }, + { + "type": "null" + } + ], + "title": "Measurement Denominator", + "description": "the graph measurementDenominator, present only on a ratio or per-capita measure: {'ref': dcid} when resolved, {'unresolved': true} when the arc exists but names no dcid" } }, "additionalProperties": false, "type": "object", - "required": [ - "dimension", - "values", - "total_count" - ], - "title": "FrameDimensionValuesResponse", - "description": "`GET /api/presentation/frames/{spec_id}/{content_version}?dimension=`'s\nbody. It reports one dimension's full value list, read fresh and\nuncapped. Given alongside `?query=`, `values` and `total_count`\ndescribe only the values matching the query." + "title": "IdentityShapeSchema", + "description": "The described-ask arm of the identity core's `shape` union\n(`kind: \"statvar_schema\"`): up to five sparse schema members mapping 1:1\nonto Search's FiveTuple (see `engine.shape.identity_shape_for`, the\nadapter that builds this from a ShapeDraft's or a grounded wire Shape's\nfive-tuple dcids). Minted by Search for every standard and family shape.\n\nEvery member is optional and sparse -- an absent member contributes no\nbytes, the same sparse rule the facets map follows -- but an arm\ndescribing nothing is invalid: at least one member must be present (see\n`_at_least_one_schema_member`)." }, - "FrameFilteredViewResponse": { + "IdentitySlot": { "properties": { - "dimensions": { - "items": { - "$ref": "#/components/schemas/FrameDimensionMatch" - }, - "type": "array", - "title": "Dimensions", - "description": "every dimension this frame declares, filtered" - }, - "period_grain": { + "property": { "type": "string", - "title": "Period Grain", - "description": "this frame's own period grain" + "maxLength": 1024, + "title": "Property", + "description": "the constraint property dcid" }, - "coverage": { - "anyOf": [ + "binding": { + "oneOf": [ + { + "$ref": "#/components/schemas/IdentityBindingValue" + }, + { + "$ref": "#/components/schemas/IdentityBindingSet" + }, { - "prefixItems": [ - { - "type": "string" - }, - { - "type": "string" - } - ], - "type": "array", - "maxItems": 2, - "minItems": 2 + "$ref": "#/components/schemas/IdentityBindingUnbound" }, { - "type": "null" + "$ref": "#/components/schemas/IdentityBindingExact" } ], - "title": "Coverage", - "description": "this frame's own [start, end] period coverage, null if it has none" + "title": "Binding", + "description": "this slot's bound state", + "discriminator": { + "propertyName": "state", + "mapping": { + "exact": "#/components/schemas/IdentityBindingExact", + "set": "#/components/schemas/IdentityBindingSet", + "unbound": "#/components/schemas/IdentityBindingUnbound", + "value": "#/components/schemas/IdentityBindingValue" + } + } } }, "additionalProperties": false, "type": "object", "required": [ - "dimensions", - "period_grain", - "coverage" + "property", + "binding" ], - "title": "FrameFilteredViewResponse", - "description": "`GET /api/presentation/frames/{spec_id}/{content_version}?query=`'s\nbody (`dimension` absent). It reports every dimension this frame\ndeclares, filtered to values matching the query, counts kept." + "title": "IdentitySlot", + "description": "One what/how slot's identity contribution: property dcid + binding state.\n\nNever a where/when/source slot: `where` is carried by entity roles instead,\n`when` is carried by `requested_window` instead, and `source` is carried by\n`facets.provenance` instead -- all three would otherwise hash resolved\ngraph state rather than what was actually asked. Every IdentitySlot here\ncarries a real constraint property by construction of the shape grammar." }, - "FrameMoved": { + "IdentityUnitRequest": { "properties": { - "status": { + "currency": { + "anyOf": [ + { + "type": "string", + "pattern": "^[A-Z]{3}$" + }, + { + "$ref": "#/components/schemas/IdentityCurrencyRole" + } + ], + "title": "Currency", + "description": "the requested currency, upper-case ISO 4217 (e.g. 'USD'), or a role object" + }, + "prices": { "type": "string", - "const": "moved", - "title": "Status", - "default": "moved" + "enum": [ + "current", + "constant" + ], + "title": "Prices", + "description": "'current' (nominal) prices, or 'constant' (real, base_year-anchored) prices" }, - "frame": { - "$ref": "#/components/schemas/FramePair", - "description": "the current frame of the named frame's rendering" + "base_year": { + "anyOf": [ + { + "type": "integer", + "maximum": 9007199254740991.0, + "minimum": -9007199254740991.0 + }, + { + "type": "null" + } + ], + "title": "Base Year", + "description": "required exactly when prices=='constant'; absent when prices=='current'" } }, "additionalProperties": false, "type": "object", "required": [ - "frame" + "currency", + "prices" ], - "title": "FrameMoved" + "title": "IdentityUnitRequest", + "description": "A completed unit-conversion request, in the identity core's own wire\nshape (`dfo_spec_kit.identity`'s `_build_unit_request`) -- legal only\ninside a unit-axis facet binding's `request` member\n(`IdentityFacetValueRequest`; see `BaseIdentity`'s model validator, which\nrefuses this form on any other axis).\n\nField-for-field mirror of the identity core's own `_UNIT_REQUEST_KEYS`\nschema: `currency` is upper-case ISO 4217 or a role object naming\nthe spec role whose bound entity's currency to use (see\n`IdentityCurrency`; the identity core NFC-normalises a string spelling\nbut does not case-fold, so a lower-case currency refuses here rather\nthan silently normalising to a different meaning at hash time), `prices`\nis current (nominal) or constant (real, anchored to\n`base_year`), and `base_year` is present exactly when `prices==\"constant\"`\n-- both directions enforced below, matching the identity core's own\n`invalid_unit_request` pair of checks. `base_year` is `StrictInt`,\nmatching `_require_integral_number`'s own exclusion of `bool` (a Python\n`int` subclass) and of numeric strings -- a lax `int` field would coerce\nJSON `true` to `1` and `\"2023\"` to `2023`, hashing a malformed request\nunder an unintended base year instead of refusing it. Under simultaneous\nviolations\n(e.g. a lower-case currency together with a missing base_year) the two\nlayers can report a different invariant first: this model's per-field\n`currency` pattern validates ahead of `_base_year_matches_prices` (a\n`mode=\"after\"` validator, which never runs once a field has already\nfailed), while the identity core checks `prices`-vs-`base_year` before\nthe currency regex. Same HTTP status/code either way -- message content\nonly." }, - "FramePair": { + "IdentityWindowAll": { "properties": { - "spec_id": { - "type": "string", - "title": "Spec Id" - }, - "content_version": { + "kind": { "type": "string", - "title": "Content Version" + "const": "all", + "title": "Kind", + "default": "all" } }, "additionalProperties": false, "type": "object", - "required": [ - "spec_id", - "content_version" - ], - "title": "FramePair" + "title": "IdentityWindowAll", + "description": "No date signal was requested at all." }, - "FramePending": { + "IdentityWindowLatest": { "properties": { - "status": { - "type": "string", - "const": "pending", - "title": "Status", - "default": "pending" - }, - "operation_id": { + "kind": { "type": "string", - "title": "Operation Id", - "description": "the queued rebuild, pollable on the operations route" - }, - "retry_after_s": { - "type": "number", - "title": "Retry After S", - "description": "seconds to wait before calling again" + "const": "latest", + "title": "Kind", + "default": "latest" } }, "additionalProperties": false, "type": "object", - "required": [ - "operation_id", - "retry_after_s" - ], - "title": "FramePending" + "title": "IdentityWindowLatest", + "description": "An explicit latest-ask: re-resolve to whatever year is CURRENTLY latest." }, - "FrameStructuralViewResponse": { + "IdentityWindowRange": { "properties": { - "dimensions": { - "items": { - "$ref": "#/components/schemas/FrameDimensionSummary" - }, - "type": "array", - "title": "Dimensions", - "description": "every dimension this frame declares" - }, - "period_grain": { + "kind": { "type": "string", - "title": "Period Grain", - "description": "this frame's own period grain" + "const": "range", + "title": "Kind", + "default": "range" }, - "coverage": { + "start_year": { "anyOf": [ { - "prefixItems": [ - { - "type": "string" - }, - { - "type": "string" - } - ], - "type": "array", - "maxItems": 2, - "minItems": 2 + "type": "integer", + "maximum": 9007199254740991.0, + "minimum": -9007199254740991.0 }, { "type": "null" } ], - "title": "Coverage", - "description": "this frame's own [start, end] period coverage, null if it has none" + "title": "Start Year", + "description": "absent means open-ended start" }, - "series_count": { - "type": "integer", - "title": "Series Count", - "description": "how many distinct series this frame resolves" - } - }, - "additionalProperties": false, - "type": "object", - "required": [ - "dimensions", - "period_grain", - "coverage", - "series_count" - ], - "title": "FrameStructuralViewResponse", - "description": "`GET /api/presentation/frames/{spec_id}/{content_version}`'s body\nwith neither `dimension` nor `query` given. It reports the frame's own\nstructural view, every dimension capped." - }, - "Freshness": { - "properties": { - "release_frequency": { + "end_year": { "anyOf": [ { - "type": "string" + "type": "integer", + "maximum": 9007199254740991.0, + "minimum": -9007199254740991.0 }, { "type": "null" } ], - "title": "Release Frequency" - }, - "release_frequency_label": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } + "title": "End Year", + "description": "absent means open-ended end" + } + }, + "additionalProperties": false, + "type": "object", + "title": "IdentityWindowRange", + "description": "A concrete requested date range; at least one bound is always present." + }, + "JsonValue": {}, + "LedgerStep": { + "properties": { + "axis": { + "type": "string", + "enum": [ + "sector", + "region", + "measure_basis", + "provider" ], - "title": "Release Frequency Label" + "title": "Axis", + "description": "the axis switched" }, - "refresh_type": { + "prior": { "anyOf": [ { - "type": "string" + "$ref": "#/components/schemas/Entry" }, { "type": "null" } ], - "title": "Refresh Type" + "description": "the entry the switch replaced; None for a default" + }, + "applied": { + "$ref": "#/components/schemas/Entry", + "description": "the entry the switch applied" + }, + "revision": { + "type": "integer", + "minimum": 0.0, + "title": "Revision", + "description": "the plan revision the switch was made on" } }, + "additionalProperties": false, "type": "object", "required": [ - "release_frequency", - "release_frequency_label", - "refresh_type" + "axis", + "prior", + "applied", + "revision" ], - "title": "Freshness", - "description": "A source's own refresh cadence, read from DCP provenance arcs that imports populate\nunevenly: `dc/base/WHO_COVID19` carries both `sourceReleaseFrequency` and\n`automaticRefreshType`, `dc/base/BIS_CentralBankPolicyRate` only the second, and\n`dc/base/WHO_GHO` neither. Nullability is the contract.\n\n`release_frequency` is the raw `sourceReleaseFrequency` ISO 8601 duration (`P1M`);\n`release_frequency_label` is `materialise.cadence.cadence_label`'s display label for it\n(`Monthly`), or the raw token when that module does not recognise it.\n\n`refresh_type` is `automaticRefreshType`'s value: how this deployment refreshes the\nsource, such as `GCPCloudRunAutomaticRefresh`, or the sentinel `NoAutomaticRefresh`." + "title": "LedgerStep", + "description": "One switch: the entry it replaced and the entry it applied.\n\nSearch answers with `ledger: []`. A client that records its switches fills it, and can\nundo one by posting the prior entry back." }, - "GraphRef": { + "LeftOut": { "properties": { - "ref": { + "reason": { "type": "string", - "title": "Ref", - "description": "the graph identifier" + "pattern": "^[a-z][a-z0-9_]{0,63}$", + "title": "Reason" + }, + "count": { + "type": "integer", + "minimum": 0.0, + "title": "Count" + }, + "of": { + "type": "string", + "enum": [ + "entities", + "periods", + "entity_periods", + "pooled_entities" + ], + "title": "Of" }, - "label": { + "role": { "type": "string", - "title": "Label", - "description": "plain-language display name, read from the graph" + "pattern": "^[a-z][A-Za-z0-9]{0,63}$", + "title": "Role" } }, "additionalProperties": false, "type": "object", "required": [ - "ref", - "label" + "reason", + "count", + "of" ], - "title": "GraphRef", - "description": "Every graph identifier in the contract." + "title": "LeftOut", + "description": "One data gap: why some data was left out, how many, and of what. The caller's own\nselection is a parameter and never appears here.\n\nA `pooled_entities` count is of the distinct parties of one pooled role, named in `role`,\nacross all the step's inputs. Those parties are never among the entities the step kept.\nOnly that `of` takes a `role`, and it requires one." }, - "GraphSchema": { + "LeftOutSeriesBody": { "properties": { - "schemas": { + "root": { + "type": "integer", + "minimum": 0.0, + "title": "Root", + "description": "the population the series belongs to, by position" + }, + "coordinates": { "additionalProperties": { - "additionalProperties": true, - "type": "object" + "type": "string" }, "type": "object", - "title": "Schemas", - "description": "JSON Schema of each served request and response body, keyed by name" - }, - "capabilities": { - "type": "string", - "title": "Capabilities", - "description": "path of this surface's capability document" + "title": "Coordinates" } }, + "additionalProperties": false, "type": "object", "required": [ - "schemas", - "capabilities" + "root", + "coordinates" ], - "title": "GraphSchema", - "description": "The full `GET /api/graph/schema` document." + "title": "LeftOutSeriesBody" }, - "GroupNode": { + "Manifest": { "properties": { - "ref": { + "schema_version": { + "type": "integer", + "title": "Schema Version", + "default": 1 + }, + "definition": { + "$ref": "#/components/schemas/DefinitionModel" + }, + "content_version": { "type": "string", - "title": "Ref", - "description": "the node's dcid" + "title": "Content Version" }, - "label": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Label", - "description": "the node's name; for a Provenance, its parent Dataset's name where it has one. Null, and named in gaps, when the graph gives none" + "prepared_at": { + "type": "string", + "format": "date-time", + "title": "Prepared At" }, - "types": { - "items": { - "type": "string" - }, - "type": "array", - "title": "Types", - "description": "the node's typeOf values, as the graph holds them" + "coverage": { + "$ref": "#/components/schemas/CoverageModel" }, - "description": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Description", - "description": "the node's prose in the graph; null when it has none" + "citation": { + "$ref": "#/components/schemas/CitationModel" }, - "links": { - "additionalProperties": { - "type": "string" - }, - "propertyNames": { - "enum": [ - "codes", - "children", - "members", - "countries", - "datasets", - "variables", - "facets" - ] - }, - "type": "object", - "title": "Links", - "description": "each list relation the node has, mapped to its route; empty when none" + "trace": { + "$ref": "#/components/schemas/TraceModel" }, - "gaps": { + "warnings": { "items": { - "type": "string" + "$ref": "#/components/schemas/WarningModel" }, "type": "array", - "title": "Gaps", - "description": "the member path of every value this door cannot know" + "title": "Warnings" }, - "built_from": { - "additionalProperties": { - "type": "string" - }, - "propertyNames": { - "enum": [ - "code_index", - "origin_catalogue", - "coverage_index", - "membership" - ] + "diagnostics": { + "items": { + "$ref": "#/components/schemas/DiagnosticModel" }, - "type": "object", - "title": "Built From", - "description": "the build of each table the response read" - }, - "kind": { - "type": "string", - "const": "group", - "title": "Kind", - "default": "group" + "type": "array", + "title": "Diagnostics", + "description": "facts about how this response was produced, for developers: a citation whose sources declare no processing level, and an origin catalogue past its staleness limit. A version stores none; each response states its own" }, - "group": { - "$ref": "#/components/schemas/MembershipBlock" - } - }, - "type": "object", - "required": [ - "ref", - "label", - "types", - "description", - "links", - "gaps", - "built_from", - "kind", - "group" - ], - "title": "GroupNode" - }, - "GroupbyOptions": { - "properties": { - "by": { + "artifacts": { "items": { - "type": "string", - "minLength": 1 + "$ref": "#/components/schemas/ArtifactEntryModel" }, "type": "array", - "minItems": 1, - "uniqueItems": true, - "title": "By" - }, - "op": { - "type": "string", - "const": "sum", - "title": "Op" + "title": "Artifacts", + "description": "every servable artifact for this rendering, in a fixed order: every data artifact first, the series-statistics/1 artifact (rendering.statistics == 'series') last, if present. A caller selecting the data artifact should check rendering rather than take the first entry, but the order itself is a stable contract, not an accident of storage" }, - "levels": { + "series_count": { "anyOf": [ { - "additionalProperties": { - "type": "integer", - "maximum": 99.0, - "minimum": 0.0 - }, - "type": "object", - "minProperties": 1 + "type": "integer" }, { "type": "null" } ], - "title": "Levels", - "description": "code system -> depth: roll each kept code up to its ancestor at that depth (0 = root codes); a code shallower than the depth stays as itself, under its own label" - } - }, - "additionalProperties": false, - "type": "object", - "required": [ - "by", - "op" - ], - "title": "GroupbyOptions", - "description": "`options.groupby`: a safe roll-up that keeps exactly the axes named\nin `by`, one row per distinct combination of their values. Every other\ngraph-declared summable axis a frame decoded is summed away, `stat_var`\nincluded. `by` names what a caller wants to see, the opposite of\n`groupby_sum`'s own \"collapse this axis\" reading. `sum` is the only op\nthis closed reshape list allows.\n\nEvery `by` entry names a code system some deployment declaration marks\nsummable, a role/entity column (`materialise.roles.KNOWN_ROLE_NAMES`),\n`stat_var`, or a column every frame carries regardless of shape; any\nother name refuses `rollup_not_summable`\n(`datasets_api.groupby.refuse_unknown_by_axes`). A declared axis this\nframe's StatVars do not decode is left out of the collapse set\n(`datasets_api.groupby.collapse_axes`).\n\n`levels` rolls a kept hierarchical axis up to one depth of its parent\nchain before the sum: each code becomes its ancestor at that depth, and\ndepth 0 is the root codes. Each key must also appear in `by`, and must\nbe one of the capabilities document's `groupby_level_axes`\n(`datasets_api.render.check_options_supported`)." - }, - "GroupbyOptionsModel": { - "properties": { - "state": { - "type": "string", - "title": "State" + "title": "Series Count" }, - "reason": { + "output_options": { + "anyOf": [ + { + "$ref": "#/components/schemas/OutputOptionsModel" + }, + { + "type": "null" + } + ] + }, + "series_coverage_stamp": { "anyOf": [ { "type": "string" @@ -9343,827 +12414,1037 @@ "type": "null" } ], - "title": "Reason" - }, - "axes": { - "items": { - "additionalProperties": true, - "type": "object" - }, - "type": "array", - "title": "Axes" - } - }, - "additionalProperties": false, - "type": "object", - "required": [ - "state" - ], - "title": "GroupbyOptionsModel", - "description": "`axes` names the axes a `groupby.by` request may keep: every other\ndeclared-summable axis a frame decoded is collapsed into it. Empty\nwhile `state` is `unavailable`." - }, - "Headline": { - "properties": { - "year": { - "type": "integer", - "title": "Year", - "description": "the year the counts are for. For a latest window it is the elected year: of the three calendar years ending at the newest year a variable's series hold, at or before the year the coverage artifact was built, the newest one that at least half as many series hold as the fullest of the three, and with several variables the newest year any of them elects. For a named window it is the latest year any served series has an observation inside the window" - }, - "year_named": { - "type": "boolean", - "title": "Year Named", - "description": "whether the request itself named a year or a range of years, rather than defaulting to one, independent of whether those years include the shown `year`" + "title": "Series Coverage Stamp", + "description": "the series_coverage artifact stamp this request's sync-admission estimate was computed against, kept as lineage only. content_version is a pure function of the frame and does not fold this in. Not the same coverage as the 'coverage' field above (materialise.window.Coverage's row/dimension/window report)" }, - "named_window": { + "retention": { "anyOf": [ { - "$ref": "#/components/schemas/TimeWindow" + "$ref": "#/components/schemas/RetentionModel" }, { "type": "null" } ], - "description": "the year or years the request named: equal bounds for one year, an absent bound for an open range; null when no year was named. The counts are for `year` alone, whatever this window holds" - }, - "observations": { - "type": "integer", - "title": "Observations", - "description": "exact observation count across served series in year" - }, - "series": { - "type": "integer", - "title": "Series", - "description": "exact series count with an observation in year" - }, - "role_counts": { - "additionalProperties": { - "type": "integer" - }, - "type": "object", - "title": "Role Counts", - "description": "distinct dcid count per role active in year, keyed by the graph's own role property dcid (e.g. financingProvider, financingRecipient) -- never by a donor/recipient label, so the wire stays aligned with Data Commons' own names" - }, - "recent_years": { - "items": { - "$ref": "#/components/schemas/HeadlineYear" - }, - "type": "array", - "minItems": 1, - "title": "Recent Years", - "description": "the counts for three calendar years, newest first, so a newest year with far fewer series than the years before it reads as incomplete. For a latest window they are raw counts over every series the answer holds, ending at the newest year any of them holds at or before the year the coverage artifact was built, or at the newest year any holds when none holds a year that early; `year` is one of the three: the newest year a variable heads, which is the year it elected or, for a variable that elects none, such as one of monthly data, its newest year at or before the build year. When no variable holds a year that early, each heads its newest year. `observations`, `series` and `role_counts` count only the variables heading it. For a named window they end at `year`, the first entry repeats `observations`, `series` and `role_counts`, and the earlier years count whether or not `named_window` reaches them. A year with no data is kept with zero counts. The list stops at the first year the coverage artifact represents, so it can hold fewer than three entries" - } - }, - "additionalProperties": false, - "type": "object", - "required": [ - "year", - "year_named", - "observations", - "series", - "role_counts", - "recent_years" - ], - "title": "Headline", - "description": "The exact, one-year summary of a role-bearing answer's own served\npopulation: the year `CoverageIndex.headline` (series_coverage) heads the\nanswer with, whether that year was the one the question named, the exact\nobservation and series count in that year alone, and how many distinct dcids\neach role carries in it. `series_coverage.index.Headline`'s own docstring is\nthe source of truth for why `observations` and `series` are always equal\nunder this schema.\n\nThe counts are those of the year the answer's read plan serves. Under a `latest`\nwindow that is the year its variables elect (`CoverageIndex.elected_years`), which\nthe preview and a mint of the Spec serve too. Under a named window it is the latest\nyear with data in that window, so a question naming 2015 to 2020 counts the latest\nof those years with data. `named_window` carries the years it named.\n\nAttached to every role-bearing answer (named-destination confirmed and\nopen-axis discovered alike), never to a non-role-bearing one: coverage\nonly exists for role-bearing series (series_coverage.schema's own scope\nnote), and computing this is a free in-memory bitmask operation, not a\nnetwork read, so there is no population-size reason to withhold it from\na narrow answer the way the per-series preview stays capped at 20\nregardless of how broad the answer is." - }, - "HeadlineYear": { - "properties": { - "year": { - "type": "integer", - "title": "Year", - "description": "the calendar year these counts are for" - }, - "observations": { - "type": "integer", - "title": "Observations", - "description": "exact observation count across served series in year" - }, - "series": { - "type": "integer", - "title": "Series", - "description": "exact series count with an observation in year" - }, - "role_counts": { - "additionalProperties": { - "type": "integer" - }, - "type": "object", - "title": "Role Counts", - "description": "distinct dcid count per role active in year, keyed by the graph's own role property dcid; a role with no dcid in the year is absent" + "description": "how long this version can still be fetched: the retention of the frame every file renders from (a derived version's base frame). Each door sets it on its response" } }, "additionalProperties": false, "type": "object", "required": [ - "year", - "observations", - "series", - "role_counts" + "definition", + "content_version", + "prepared_at", + "coverage", + "citation", + "trace", + "artifacts" ], - "title": "HeadlineYear", - "description": "The exact counts for one calendar year of a role-bearing answer's served\npopulation: observations and series with an observation in it, and how many\ndistinct dcids each role carries. A year with no data counts zero." + "title": "Manifest", + "description": "`trace` is a plain dict at run time, since `materialise.trace.ManifestTrace.to_dict()`\nis already this field's wire shape. Its type (`TraceModel`) fixes the shape of\n`party_totals_left_out` and leaves every other key open.\n\n`series_count` is the number of distinct series this definition\nresolves, as the version's description counts them (`statistics.SeriesFigures.series`): a\nseries and the estimates continuing it count once, though the statistics artifact holds a\nrow for each method. `None` means a version record minted before this field existed, whose old\ninline `statistics` no fact carries. The per-series detail itself lives in the\n`series-statistics/1` Parquet artifact every door that returns a\n`Manifest` lists in `artifacts` whenever `series_count` is not `None`\n(`datasets_api.render.render_and_store_series_statistics`), never\ninline on this model.\n\n`output_options` is `None` on a version record minted before the field\nexisted, the same convention `series_count` uses.\n\n`prepared_at` is when this version was first prepared, written once at its\nfirst mint and stored with it, so every re-mint and re-render reads the same\ninstant." }, - "HealthResponse": { + "Matched": { "properties": { - "status": { - "type": "string", - "const": "ok", - "title": "Status", - "description": "always \"ok\" for a 200 response" - }, - "build": { + "text": { "type": "string", - "title": "Build", - "description": "the commit sha the image was built from, the same value the x-dfo-commit response header carries, \"unknown\" on a checkout run with no DFO_BUILD_COMMIT set" + "title": "Text" }, - "capability_version": { + "as": { "type": "string", - "title": "Capability Version", - "description": "this surface's own capability_version token" + "enum": [ + "name", + "alias", + "code" + ], + "title": "As" } }, "type": "object", "required": [ - "status", - "build", - "capability_version" + "text", + "as" ], - "title": "HealthResponse", - "description": "`GET /healthz`'s own response body, shared across every surface." + "title": "GraphResolveMatched", + "description": "The listed text the input matched, and whether it is the entity's name, an alias, or a\ncode. A phrase naming a group's members (\"EU countries\") matches as `alias`." }, - "IdentityBindingExact": { + "Measure": { "properties": { - "state": { - "type": "string", - "const": "exact", - "title": "State", - "default": "exact" - }, - "ref": { + "label": { "type": "string", - "maxLength": 1024, - "title": "Ref", - "description": "the bound dcid, denoting that code alone" + "title": "Label", + "description": "the measure's noun phrase, such as `net disbursements`" } }, - "additionalProperties": false, "type": "object", "required": [ - "ref" + "label" ], - "title": "IdentityBindingExact", - "description": "A single bound dcid, denoting that code alone -- never its subtree,\neven where the code is a hierarchical (non-leaf) code (see\n`docs/identity-v1.md` in `spec-kit` for the denotation rule: `value`\ndenotes a hierarchical code's whole subtree, `exact` denotes the code\nalone). Slot-only: `_build_facet_binding` refuses `exact` on a facet.\nNo engine `Binding` arm maps onto this state and no minting site\nproduces it -- see `IdentityBinding`'s own docstring." + "title": "GraphDefinitionMeasure", + "description": "What the variable counts or sums, as the code index names it." }, - "IdentityBindingSet": { + "MeasureAxisValue": { "properties": { - "state": { + "axis": { "type": "string", - "const": "set", - "title": "State", - "default": "set" + "title": "Axis", + "description": "the declared measure-axis identifier (code_index.types.MeasureAxis.axis), e.g. 'measuredProperty' or a constraint-property dcid such as 'financialFlowType'" }, - "refs": { - "items": { - "type": "string", - "maxLength": 1024 - }, - "type": "array", - "maxItems": 1024, - "minItems": 1, - "title": "Refs", - "description": "the bound dcids (dfo_spec_kit sorts and de-duplicates)" + "value": { + "$ref": "#/components/schemas/GraphRef", + "description": "the value's dcid and the measure index's label for it, e.g. Gross" } }, "additionalProperties": false, "type": "object", "required": [ - "refs" + "axis", + "value" ], - "title": "IdentityBindingSet", - "description": "A bound dcid set, in the identity core's own binding wire shape." - }, - "IdentityBindingUnbound": { - "properties": { - "state": { - "type": "string", - "const": "unbound", - "title": "State", - "default": "unbound" - } - }, - "additionalProperties": false, - "type": "object", - "title": "IdentityBindingUnbound", - "description": "An unbound slot/facet binding." + "title": "MeasureAxisValue", + "description": "One measure axis and the value a measure partition holds on it (see\nResolvedSpec.measure_axis_values)." }, - "IdentityBindingValue": { + "MemberItem": { "properties": { - "state": { - "type": "string", - "const": "value", - "title": "State", - "default": "value" - }, "ref": { "type": "string", - "maxLength": 1024, - "title": "Ref", - "description": "the bound dcid" + "title": "Ref" + }, + "label": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Label" } }, - "additionalProperties": false, "type": "object", "required": [ - "ref" + "ref", + "label" ], - "title": "IdentityBindingValue", - "description": "A single bound dcid, in the identity core's own binding wire shape." + "title": "GraphMemberItem", + "description": "One item of a list: its dcid and the owner's label for it, `null` where the owner holds\nno name." }, - "IdentityCurrencyRole": { + "MembersEnvelope": { + "$id": "https://schemas.dfo.one.org/datasets/v1/members-envelope.json", "properties": { - "role": { + "schema_version": { + "type": "integer", + "const": 1, + "title": "Schema Version", + "default": 1 + }, + "spec_id": { "type": "string", - "enum": [ - "observationAbout", - "origin", - "destination" + "pattern": "^spec_", + "title": "Spec Id" + }, + "members": { + "items": { + "$ref": "#/components/schemas/ServedMember" + }, + "type": "array", + "title": "Members" + }, + "served_count": { + "type": "integer", + "title": "Served Count" + }, + "family_member_count": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ], + "title": "Family Member Count" + }, + "family_member_digest": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } ], - "title": "Role", - "description": "the entity role whose bound entity's currency this request means" + "title": "Family Member Digest" } }, "additionalProperties": false, "type": "object", "required": [ - "role" + "schema_version", + "spec_id", + "members", + "served_count", + "family_member_count", + "family_member_digest" ], - "title": "IdentityCurrencyRole", - "description": "The role-shaped form of a unit request's `currency`: the currency of\nthe entity bound to this spec role, resolved per row. Field-for-field mirror\nof the identity core's own `_CURRENCY_ROLE_KEYS`/`_CURRENCY_ROLES`\n(`dfo_spec_kit.identity`'s `_build_currency`, the object arm)." + "title": "MembersEnvelope", + "description": "`POST /api/datasets/{id}/members`'s response: the members a mint of the spec serves,\nresolved without materialising a frame.\n\n`members` lists them sorted by `ref`, and `served_count` counts them.\n`family_member_count` and `family_member_digest` state the whole population the identity\nadmits, before a broader member's dominated members are dropped, as a mint's\n`trace.family_member_count` and `trace.family_member_digest` state it; both are `null`\nwhen member resolution cannot state that population." }, - "IdentityFacetValueAbsent": { + "MembersPage": { "properties": { - "state": { - "type": "string", - "const": "value", - "title": "State", - "default": "value" - }, "ref": { - "type": "null", + "type": "string", "title": "Ref", - "description": "null: the facet declares no value on this axis" - } - }, - "additionalProperties": false, - "type": "object", - "required": [ - "ref" - ], - "title": "IdentityFacetValueAbsent", - "description": "A measurementMethod or unit facet bound to no declared value:\n`{\"state\": \"value\", \"ref\": null}` asks for the facets that declare no value\non the axis, the ones Data Commons serves without that member. An unbound\naxis admits every facet; this binding admits only those without a value.\nMirrors the identity core's null facet ref (`docs/identity-v1.md` in\n`spec-kit`). `ref` serialises as `null` even under `exclude_none`, since\nthe identity core refuses a value binding with neither `ref` nor `request`." - }, - "IdentityFacetValueRequest": { - "properties": { - "state": { + "description": "the node whose list this is" + }, + "relation": { "type": "string", - "const": "value", - "title": "State", - "default": "value" + "enum": [ + "codes", + "children", + "datasets", + "variables", + "members", + "countries", + "facets" + ], + "title": "Relation" }, - "request": { - "$ref": "#/components/schemas/IdentityUnitRequest", - "description": "the completed unit-conversion request" + "projection": { + "anyOf": [ + { + "$ref": "#/components/schemas/Projection" + }, + { + "type": "null" + } + ], + "description": "the membership projection listed; null for a relation that takes none" + }, + "as_of": { + "anyOf": [ + { + "type": "string", + "format": "date" + }, + { + "type": "null" + } + ], + "title": "As Of", + "description": "the date membership was read at; null for today" + }, + "items": { + "items": { + "anyOf": [ + { + "$ref": "#/components/schemas/CodeItem" + }, + { + "$ref": "#/components/schemas/FacetItem" + }, + { + "$ref": "#/components/schemas/MemberItem" + } + ] + }, + "type": "array", + "title": "Items" + }, + "next_cursor": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Next Cursor", + "description": "the cursor for the next page; null when this page ends the list" + }, + "complete": { + "type": "boolean", + "title": "Complete", + "description": "whether the walk reached the end of a list the owner holds in full" + }, + "total": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ], + "title": "Total", + "description": "the list's length; null where the list is partial" + }, + "gaps": { + "items": { + "type": "string" + }, + "type": "array", + "title": "Gaps", + "description": "the code of each way the list is partial" + }, + "built_from": { + "additionalProperties": { + "type": "string" + }, + "propertyNames": { + "enum": [ + "code_index", + "origin_catalogue", + "coverage_index", + "membership" + ] + }, + "type": "object", + "title": "Built From", + "description": "the build of each table the list read" } }, - "additionalProperties": false, "type": "object", "required": [ - "request" + "ref", + "relation", + "projection", + "as_of", + "items", + "next_cursor", + "complete", + "total", + "gaps", + "built_from" ], - "title": "IdentityFacetValueRequest", - "description": "A unit-axis facet bound via the request form: \"serve whatever facet\nhonours this completed currency/prices/base_year request\" rather than a\nliteral graph ref. `state` reuses the value-state spelling since this is\nstill a single-valued binding to the identity core -- `request` is what\ndistinguishes it from `IdentityBindingValue`'s `ref` form (see\n`_facet_binding_tag`, this union's discriminator)." + "title": "GraphMembersPage", + "description": "One page of `GET /api/graph/node/{dcid}/members`." }, - "IdentityShapeDenominatorRef": { + "MembershipBlock": { "properties": { - "ref": { - "type": "string", - "maxLength": 1024, - "title": "Ref", - "description": "the resolved denominator StatVar's dcid" + "authority": { + "$ref": "#/components/schemas/Authority" + }, + "as_of": { + "anyOf": [ + { + "type": "string", + "format": "date" + }, + { + "type": "null" + } + ], + "title": "As Of", + "description": "the date the read asked for; null for today" + }, + "effective_date": { + "anyOf": [ + { + "type": "string", + "format": "date" + }, + { + "type": "null" + } + ], + "title": "Effective Date", + "description": "the latest membership change on or before the date; null for an undated membership" + }, + "projections": { + "items": { + "$ref": "#/components/schemas/ProjectionCount" + }, + "type": "array", + "title": "Projections" } }, - "additionalProperties": false, "type": "object", "required": [ - "ref" + "authority", + "as_of", + "effective_date", + "projections" ], - "title": "IdentityShapeDenominatorRef", - "description": "The described arm's `measurement_denominator`, resolved to a dcid." - }, - "IdentityShapeDenominatorUnresolved": { - "properties": { - "unresolved": { - "type": "boolean", - "const": true, - "title": "Unresolved", - "description": "always the literal true -- the arc exists but names no dcid", - "default": true - } - }, - "additionalProperties": false, - "type": "object", - "title": "IdentityShapeDenominatorUnresolved", - "description": "The described arm's `measurement_denominator`, present on the graph but\nnever resolved to a dcid (e.g. a dcid-less ProvisionalNode) -- distinct\nfrom the member being absent entirely, which means no denominator arc\nexists at all." + "title": "GraphMembershipBlock", + "description": "A group's or region's membership under its declared authority." }, - "IdentityShapePin": { + "Methodology": { "properties": { - "kind": { - "type": "string", - "const": "stat_var", - "title": "Kind", - "default": "stat_var" - }, - "id": { - "type": "string", - "maxLength": 1024, - "title": "Id", - "description": "the pinned StatVar's dcid" + "description": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Description", + "description": "how the publisher collects and compiles the data, as CommonMark" } }, - "additionalProperties": false, "type": "object", "required": [ - "id" + "description" ], - "title": "IdentityShapePin", - "description": "The pinned-ask arm of the identity core's `shape` union\n(`kind: \"stat_var\"`): a single StatVar dcid, minted by Datasets'\nstatvar_set. See `BaseIdentity`'s cross-member validator -- when this arm\nis chosen, `slots` must be empty." + "title": "Methodology" }, - "IdentityShapeSchema": { + "MintOptions": { "properties": { - "kind": { + "format": { "type": "string", - "const": "statvar_schema", - "title": "Kind", - "default": "statvar_schema" + "enum": [ + "csv", + "xlsx", + "parquet" + ], + "title": "Format", + "default": "csv" }, - "population_type": { + "bundle": { + "type": "boolean", + "title": "Bundle", + "default": true + }, + "groupby": { "anyOf": [ { - "type": "string", - "maxLength": 1024 + "$ref": "#/components/schemas/GroupbyOptions" }, { "type": "null" } - ], - "title": "Population Type", - "description": "the graph populationType dcid" + ] }, - "measured_property": { + "pivot": { "anyOf": [ { - "type": "string", - "maxLength": 1024 + "$ref": "#/components/schemas/PivotOptions" }, { "type": "null" } - ], - "title": "Measured Property", - "description": "the graph measuredProperty dcid" + ] }, - "stat_type": { + "columns": { "anyOf": [ { - "type": "string", - "maxLength": 1024 + "items": { + "type": "string", + "minLength": 1 + }, + "type": "array" }, { "type": "null" } ], - "title": "Stat Type", - "description": "the graph statType dcid, e.g. measuredValue" + "uniqueItems": true, + "title": "Columns" }, - "measurement_qualifier": { + "without_party_totals": { + "type": "boolean", + "title": "Without Party Totals", + "default": false + }, + "enrichment": { "anyOf": [ { "type": "string", - "maxLength": 1024 + "const": "default" }, { "type": "null" } ], - "title": "Measurement Qualifier", - "description": "the graph measurementQualifier dcid, present only when the measured property is qualified" + "title": "Enrichment", + "description": "\"default\" adds the version's default enrichment columns, chosen once it is built from the roles its frame holds: each of observationAbout, financingProvider and financingRecipient it holds takes its _type column, and a flow party role adds party_kind, party_class and party_whole. They join `columns`, or are the columns when it names none, so the result is the request that names them" }, - "measurement_denominator": { + "layout": { "anyOf": [ { - "oneOf": [ - { - "$ref": "#/components/schemas/IdentityShapeDenominatorRef" - }, - { - "$ref": "#/components/schemas/IdentityShapeDenominatorUnresolved" - } - ] + "type": "string", + "const": "frame" }, { "type": "null" } ], - "title": "Measurement Denominator", - "description": "the graph measurementDenominator, present only on a ratio or per-capita measure: {'ref': dcid} when resolved, {'unresolved': true} when the arc exists but names no dcid" + "title": "Layout" } }, "additionalProperties": false, "type": "object", - "title": "IdentityShapeSchema", - "description": "The described-ask arm of the identity core's `shape` union\n(`kind: \"statvar_schema\"`): up to five sparse schema members mapping 1:1\nonto Search's FiveTuple (see `engine.shape.identity_shape_for`, the\nadapter that builds this from a ShapeDraft's or a grounded wire Shape's\nfive-tuple dcids). Minted by Search for every standard and family shape.\n\nEvery member is optional and sparse -- an absent member contributes no\nbytes, the same sparse rule the facets map follows -- but an arm\ndescribing nothing is invalid: at least one member must be present (see\n`_at_least_one_schema_member`)." + "title": "MintOptions", + "description": "Rendering-only, never hashed into identity. `format`/`bundle`/`pivot`/\n`columns`/`groupby`/`without_party_totals` are this deployment's live rendering surface. A\n`groupby.by` entry names a code system some deployment declaration\nmarks summable, a role/entity column, `stat_var`, or a column every\nframe carries regardless of shape; any other name refuses\n`rollup_not_summable` (`datasets_api.groupby.refuse_unknown_by_axes`).\nA declared axis this frame did not decode is simply absent from the\ncollapse-set computation, not an error (see\n`datasets_api.groupby.collapse_axes`); an unsafe collapse refuses\n`rollup_not_summable` too, naming the axis and precondition\n(`materialise.reshape.groupby_sum`,\n`datasets_api.groupby.refuse_stat_var_collision`,\n`datasets_api.groupby.refuse_decode_gaps`). A `columns` entry naming a\nrecognised-but-disabled enrichment field refuses `capability_unavailable`.\n`columns` selects the table and decoded columns it names. A list that names\nonly enrichment fields selects nothing: every default column stays,\ndecoded columns included, and the enrichments are added. A list that mixes\na table column with an enrichment selects. Without a pivot, a list that\nnames no decoded column keeps all of them, `status` is accepted and left\nout, `_label` is written by default (a list naming it keeps\n``), and the written order follows the long layout\n(`materialise.projection`) whatever order the list names.\n\n`layout: \"frame\"` writes a bare parquet file in the frame layout instead\nof the long layout: the frame's grammar columns as reshaped, with\ndecoded axes as `stat_var_`, `status` kept, and a converted\nunit as its JCS request text. `columns` then selects over those columns,\nas it does for pivot output. It refuses with `bundle: true`, a `pivot`,\nor a format other than parquet.\n\n`enrichment: \"default\"` asks for the version's default enrichment columns\n(`datasets_api.default_enrichment`), resolved once the version is built: they join `columns`,\nor are `columns` when it names none, and the option is dropped before the rendering is keyed,\nrendered or recorded, so the answer is that of a request naming the resolved columns.\n\n`without_party_totals: true` leaves out the rows whose party, on a flow party role the\nserved identity binds no entity on, the code index declares a group total\n(`datasets_api.party_totals`). It runs on the frame before any reshape, so a `groupby`\nsums members alone. A cut that leaves rows out mints a version of its own, as a `groupby`\ncollapse does; one that leaves nothing out serves the frame's own version." }, - "IdentitySlot": { + "MintRequest": { "properties": { - "property": { - "type": "string", - "maxLength": 1024, - "title": "Property", - "description": "the constraint property dcid" + "schema_version": { + "type": "integer", + "const": 1, + "title": "Schema Version", + "default": 1 }, - "binding": { + "input": { "oneOf": [ { - "$ref": "#/components/schemas/IdentityBindingValue" + "$ref": "#/components/schemas/SpecIdInput" }, { - "$ref": "#/components/schemas/IdentityBindingSet" - }, + "$ref": "#/components/schemas/StatVarSetInput" + } + ], + "title": "Input", + "discriminator": { + "propertyName": "kind", + "mapping": { + "spec_id": "#/components/schemas/SpecIdInput", + "statvar_set": "#/components/schemas/StatVarSetInput" + } + } + }, + "options": { + "$ref": "#/components/schemas/MintOptions" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "input" + ], + "title": "MintRequest", + "description": "Body of `POST /api/datasets`: one `input` and the render `options`." + }, + "MissingEntityModel": { + "properties": { + "ref": { + "type": "string", + "title": "Ref" + }, + "label": { + "type": "string", + "title": "Label" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "ref", + "label" + ], + "title": "MissingEntityModel" + }, + "NationalCurrency": { + "properties": { + "currencies": { + "type": "integer", + "title": "Currencies" + }, + "places": { + "type": "integer", + "title": "Places" + } + }, + "type": "object", + "required": [ + "currencies", + "places" + ], + "title": "GraphAvailabilityNationalCurrency", + "description": "The units that are each covered place's own currency." + }, + "NearestRealSpec": { + "properties": { + "spec_id": { + "type": "string", + "title": "Spec Id", + "description": "deterministic hash of (shape + canonical slot bindings); permalink-safe, dedup key, golden-comparison handle, cache key" + }, + "definition": { + "$ref": "#/components/schemas/SpecDefinition", + "description": "the canonical definition this Spec was resolved from: {schema_version, identity}, the same shape Unsupported.definition uses. definition.identity is the identity-core projection this spec_id was minted from, serialised once and never re-derived; hashing it reproduces spec_id by construction. Post definition.identity back byte-for-byte as ResubmitIdentityPayload.identity to edit this Spec. Directional entities remain nested in identity.entities." + }, + "resolved": { + "$ref": "#/components/schemas/ResolvedSpec", + "description": "the engine's report of what it did with the ask: stat_vars, entities, coverage, trace, and every other display/diagnostic field. Never hashed; see ResolvedSpec" + }, + "relaxation": { + "$ref": "#/components/schemas/Relaxation", + "description": "the definition part this suggestion relaxed, and the value(s) it dropped" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "spec_id", + "definition", + "resolved", + "relaxation" + ], + "title": "NearestRealSpec", + "description": "A nearest_real suggestion: a full Spec found by relaxing one constraint\nbinding and re-confirming the result against the live graph.\n\nGraph-re-confirmed only, never fabricated. See relaxation for which\nbinding was dropped to find it." + }, + "NewestFrameDimensionValuesResponse": { + "properties": { + "spec_id": { + "type": "string", + "title": "Spec Id", + "description": "the served id of the dataset read, which differs from the requested id when that id now serves under another" + }, + "content_version": { + "type": "string", + "title": "Content Version", + "description": "the version of the dataset read, its newest" + }, + "dimension": { + "type": "string", + "title": "Dimension", + "description": "the dimension this response reports" + }, + "values": { + "items": { + "type": "string" + }, + "type": "array", + "title": "Values", + "description": "every value this dimension carries, uncapped, or only the values matching `query` when it is given" + }, + "total_count": { + "type": "integer", + "title": "Total Count", + "description": "how many values this dimension carries, or how many match `query` when it is given" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "spec_id", + "content_version", + "dimension", + "values", + "total_count" + ], + "title": "NewestFrameDimensionValuesResponse", + "description": "`GET /api/presentation/frames/{spec_id}?dimension=`'s body: one dimension's values in\nthe frame it resolved, and that frame's pair." + }, + "NewestFrameFilteredViewResponse": { + "properties": { + "spec_id": { + "type": "string", + "title": "Spec Id", + "description": "the served id of the dataset read, which differs from the requested id when that id now serves under another" + }, + "content_version": { + "type": "string", + "title": "Content Version", + "description": "the version of the dataset read, its newest" + }, + "dimensions": { + "items": { + "$ref": "#/components/schemas/FrameDimensionMatch" + }, + "type": "array", + "title": "Dimensions", + "description": "every dimension this frame declares, filtered" + }, + "period_grain": { + "type": "string", + "title": "Period Grain", + "description": "this frame's own period grain" + }, + "coverage": { + "anyOf": [ { - "$ref": "#/components/schemas/IdentityBindingUnbound" + "prefixItems": [ + { + "type": "string" + }, + { + "type": "string" + } + ], + "type": "array", + "maxItems": 2, + "minItems": 2 }, { - "$ref": "#/components/schemas/IdentityBindingExact" + "type": "null" } ], - "title": "Binding", - "description": "this slot's bound state", - "discriminator": { - "propertyName": "state", - "mapping": { - "exact": "#/components/schemas/IdentityBindingExact", - "set": "#/components/schemas/IdentityBindingSet", - "unbound": "#/components/schemas/IdentityBindingUnbound", - "value": "#/components/schemas/IdentityBindingValue" - } - } + "title": "Coverage", + "description": "this frame's own [start, end] period coverage, null if it has none" } }, "additionalProperties": false, "type": "object", "required": [ - "property", - "binding" + "spec_id", + "content_version", + "dimensions", + "period_grain", + "coverage" ], - "title": "IdentitySlot", - "description": "One what/how slot's identity contribution: property dcid + binding state.\n\nNever a where/when/source slot: `where` is carried by entity roles instead,\n`when` is carried by `requested_window` instead, and `source` is carried by\n`facets.provenance` instead -- all three would otherwise hash resolved\ngraph state rather than what was actually asked. Every IdentitySlot here\ncarries a real constraint property by construction of the shape grammar." + "title": "NewestFrameFilteredViewResponse", + "description": "`GET /api/presentation/frames/{spec_id}?query=`'s body: the filtered view of the frame\nit resolved, and that frame's pair." }, - "IdentityUnitRequest": { + "NewestFrameStructuralViewResponse": { "properties": { - "currency": { - "anyOf": [ - { - "type": "string", - "pattern": "^[A-Z]{3}$" - }, - { - "$ref": "#/components/schemas/IdentityCurrencyRole" - } - ], - "title": "Currency", - "description": "the requested currency, upper-case ISO 4217 (e.g. 'USD'), or a role object" + "spec_id": { + "type": "string", + "title": "Spec Id", + "description": "the served id of the dataset read, which differs from the requested id when that id now serves under another" }, - "prices": { + "content_version": { "type": "string", - "enum": [ - "current", - "constant" - ], - "title": "Prices", - "description": "'current' (nominal) prices, or 'constant' (real, base_year-anchored) prices" + "title": "Content Version", + "description": "the version of the dataset read, its newest" }, - "base_year": { + "dimensions": { + "items": { + "$ref": "#/components/schemas/FrameDimensionSummary" + }, + "type": "array", + "title": "Dimensions", + "description": "every dimension this frame declares" + }, + "period_grain": { + "type": "string", + "title": "Period Grain", + "description": "this frame's own period grain" + }, + "coverage": { "anyOf": [ { - "type": "integer", - "maximum": 9007199254740991.0, - "minimum": -9007199254740991.0 + "prefixItems": [ + { + "type": "string" + }, + { + "type": "string" + } + ], + "type": "array", + "maxItems": 2, + "minItems": 2 }, { "type": "null" } ], - "title": "Base Year", - "description": "required exactly when prices=='constant'; absent when prices=='current'" + "title": "Coverage", + "description": "this frame's own [start, end] period coverage, null if it has none" + }, + "series_count": { + "type": "integer", + "title": "Series Count", + "description": "how many distinct series this frame resolves" } }, "additionalProperties": false, "type": "object", "required": [ - "currency", - "prices" + "spec_id", + "content_version", + "dimensions", + "period_grain", + "coverage", + "series_count" ], - "title": "IdentityUnitRequest", - "description": "A completed unit-conversion request, in the identity core's own wire\nshape (`dfo_spec_kit.identity`'s `_build_unit_request`) -- legal only\ninside a unit-axis facet binding's `request` member\n(`IdentityFacetValueRequest`; see `BaseIdentity`'s model validator, which\nrefuses this form on any other axis).\n\nField-for-field mirror of the identity core's own `_UNIT_REQUEST_KEYS`\nschema: `currency` is upper-case ISO 4217 or a role object naming\nthe spec role whose bound entity's currency to use (see\n`IdentityCurrency`; the identity core NFC-normalises a string spelling\nbut does not case-fold, so a lower-case currency refuses here rather\nthan silently normalising to a different meaning at hash time), `prices`\nis current (nominal) or constant (real, anchored to\n`base_year`), and `base_year` is present exactly when `prices==\"constant\"`\n-- both directions enforced below, matching the identity core's own\n`invalid_unit_request` pair of checks. `base_year` is `StrictInt`,\nmatching `_require_integral_number`'s own exclusion of `bool` (a Python\n`int` subclass) and of numeric strings -- a lax `int` field would coerce\nJSON `true` to `1` and `\"2023\"` to `2023`, hashing a malformed request\nunder an unintended base year instead of refusing it. Under simultaneous\nviolations\n(e.g. a lower-case currency together with a missing base_year) the two\nlayers can report a different invariant first: this model's per-field\n`currency` pattern validates ahead of `_base_year_matches_prices` (a\n`mode=\"after\"` validator, which never runs once a field has already\nfailed), while the identity core checks `prices`-vs-`base_year` before\nthe currency regex. Same HTTP status/code either way -- message content\nonly." - }, - "IdentityWindowAll": { - "properties": { - "kind": { - "type": "string", - "const": "all", - "title": "Kind", - "default": "all" - } - }, - "additionalProperties": false, - "type": "object", - "title": "IdentityWindowAll", - "description": "No date signal was requested at all." - }, - "IdentityWindowLatest": { - "properties": { - "kind": { - "type": "string", - "const": "latest", - "title": "Kind", - "default": "latest" - } - }, - "additionalProperties": false, - "type": "object", - "title": "IdentityWindowLatest", - "description": "An explicit latest-ask: re-resolve to whatever year is CURRENTLY latest." + "title": "NewestFrameStructuralViewResponse", + "description": "`GET /api/presentation/frames/{spec_id}`'s body with neither `dimension` nor `query`\ngiven: the structural view of the frame it resolved, and that frame's pair." }, - "IdentityWindowRange": { + "NoData": { "properties": { - "kind": { + "reason": { "type": "string", - "const": "range", - "title": "Kind", - "default": "range" + "enum": [ + "source_not_resolved", + "source_ambiguous", + "source_code_not_held", + "source_code_ambiguous", + "source_code_shares_variable", + "entity_not_resolved", + "entity_ambiguous", + "entity_set_too_large", + "entity_role_not_admitted", + "variable_not_resolved", + "role_not_resolved", + "unit_not_resolved", + "rate_coverage_gap", + "no_matching_slice", + "binding_mismatch", + "denominator_not_available", + "no_observations", + "facet_not_available", + "role_incompatible", + "role_signature_incompatible", + "qualifier_not_bound", + "timed_out" + ], + "title": "Reason", + "description": "why nothing could be returned, in contract resolution order. \"entity_not_resolved\" means a named entity could not be resolved to a graph node; \"entity_ambiguous\" means a named entity matched more than one graph candidate and none could be preferred over the others, distinct from \"entity_not_resolved\", where no node matched at all; \"entity_role_not_admitted\" means a named entity resolved to exactly one graph node, but no role any candidate shape declares admits that node's graph type -- the entity is real, just not the kind of thing this query's data is reported for; \"entity_set_too_large\" means every named entity resolved, but the places the request names, counting the members of each group or region among them and summed over the roles they sit on, exceed what the engine binds in one request -- distinct from every other entity_* reason, where one entity, not the size of the set, is what failed; \"variable_not_resolved\" means no StatVar matched the variable text (e.g. an absent posted stat_var_dcid or entity, or no measure match at all); \"role_not_resolved\" means the query names a role the engine could not resolve; \"unit_not_resolved\" means the unit binder could not classify a token in the requested unit phrase against its lexicons; \"no_matching_slice\" means the measure matched fine, but the requested combination has no corresponding data series -- the constructed/derived variable does not exist in the graph at all. Covers an identity resubmit refine edit with no confirmable sibling StatVar for the edited slice, and a dev-finance scheme x purpose x recipient combination that was never published as a series, on raw-text and resubmit alike; \"binding_mismatch\" means the variable resolved and graph-confirmed StatVars exist, but none satisfies the requested slot bindings, either because a resolved value on a bound property mismatched or because the StatVar's value on a bound property is present but could not be read (an unresolvable dcid); distinct from \"no_matching_slice\" (the combination was never published at all) and \"variable_not_resolved\" (no StatVar matched at all); \"denominator_not_available\" means the query asks for a normalised form (per person, per area, a rate or a share) or names a denominator, and the matched series is not in that form or divides by another base; \"no_observations\" means a StatVar WAS confirmed to exist but has no observation at the resolved entity (it exists, but not data here); \"facet_not_available\" means observations exist at the entity, none under the requested facet values; \"role_incompatible\" means the role is real, and the StatVar does not declare it; \"role_signature_incompatible\" means the resolved StatVars carry incompatible role signatures and no partition into candidates was possible; \"source_code_not_held\" means no variable held under the part's source_code by a source search serves can answer the part: no served source holds the code, the part's sources exclude every source that does, or the code's variables cannot answer the part as asked; \"source_code_ambiguous\" means two of the part's sources hold its source_code; \"source_code_shares_variable\" means the source_code's variables answer other codes of its source too, so search cannot serve the code alone; \"qualifier_not_bound\" means the variable resolved to a series family, but a narrowing term the request's text named bound no constraint slot: no code system in the packaged index carries it, or its registered rows landed in no binding; \"timed_out\" means the request reached its time limit before this part was answered (diagnostics.timed_out is true); the question may hold data, so asking it again, alone or narrower, can answer it" }, - "start_year": { + "cause": { "anyOf": [ { - "type": "integer", - "maximum": 9007199254740991.0, - "minimum": -9007199254740991.0 + "$ref": "#/components/schemas/Cause" }, { "type": "null" } ], - "title": "Start Year", - "description": "absent means open-ended start" + "description": "why this refusal fired, present only for reason=rate_coverage_gap (the structured door's same-named ProblemDetails extension); omitted on every other reason" }, - "end_year": { + "category": { + "type": "string", + "enum": [ + "unresolved", + "absent" + ], + "title": "Category", + "description": "derived from reason, never independently settable: \"entity_not_resolved\", \"entity_ambiguous\", \"entity_set_too_large\", \"entity_role_not_admitted\", \"variable_not_resolved\", \"role_not_resolved\", \"source_not_resolved\", \"source_ambiguous\", \"source_code_not_held\", \"source_code_ambiguous\", \"source_code_shares_variable\", \"unit_not_resolved\", and \"timed_out\" are \"unresolved\" (the request could not be read into the graph); every other code is \"absent\" (the read request names a place holding nothing)", + "default": "absent" + }, + "message": { "anyOf": [ { - "type": "integer", - "maximum": 9007199254740991.0, - "minimum": -9007199254740991.0 + "type": "string" }, { "type": "null" } ], - "title": "End Year", - "description": "absent means open-ended end" - } - }, - "additionalProperties": false, - "type": "object", - "title": "IdentityWindowRange", - "description": "A concrete requested date range; at least one bound is always present." - }, - "JsonValue": {}, - "LeftOut": { - "properties": { - "reason": { - "type": "string", - "pattern": "^[a-z][a-z0-9_]{0,63}$", - "title": "Reason" - }, - "count": { - "type": "integer", - "minimum": 0.0, - "title": "Count" - }, - "of": { - "type": "string", - "enum": [ - "entities", - "periods", - "entity_periods", - "pooled_entities" - ], - "title": "Of" - }, - "role": { - "type": "string", - "pattern": "^[a-z][A-Za-z0-9]{0,63}$", - "title": "Role" - } - }, - "additionalProperties": false, - "type": "object", - "required": [ - "reason", - "count", - "of" - ], - "title": "LeftOut", - "description": "One data gap: why some data was left out, how many, and of what. The caller's own\nselection is a parameter and never appears here.\n\nA `pooled_entities` count is of the distinct parties of one pooled role, named in `role`,\nacross all the step's inputs. Those parties are never among the entities the step kept.\nOnly that `of` takes a `role`, and it requires one." - }, - "Manifest": { - "properties": { - "schema_version": { - "type": "integer", - "title": "Schema Version", - "default": 1 + "title": "Message", + "description": "the plain-language sentence for reason, naming the query terms it concerns where the reason has them (the indicator, place, or category wording), so a client can show a person the reason beside its code. Every no_data part the engine returns sets it. Clients must not parse it" }, - "definition": { - "$ref": "#/components/schemas/DefinitionModel" + "nearest_real": { + "anyOf": [ + { + "items": { + "$ref": "#/components/schemas/NearestRealSpec" + }, + "type": "array" + }, + { + "type": "null" + } + ], + "title": "Nearest Real", + "description": "optional; up to two real, grounded specs found by relaxing one constraint at a time and re-confirming against the live graph. Each carries its own relaxation naming the definition part relaxed and the value(s) it dropped. Shaped by response_options and banded by confidence like any returned spec. Distinct from flagged_match (the elected variable itself) and alternate_match (a different variable). nearest_real varies the SAME variable's own constraints, never the variable." }, - "content_version": { - "type": "string", - "title": "Content Version" + "gate": { + "anyOf": [ + { + "type": "string", + "enum": [ + "no_member_has_data_at_place", + "no_member_asserts_bound_properties", + "only_alternate_has_data" + ] + }, + { + "type": "null" + } + ], + "title": "Gate", + "description": "optional; the failed quality gate's code from the platform registry, one of the three registry gate codes (no_member_has_data_at_place, no_member_asserts_bound_properties, only_alternate_has_data). The single home for the code regardless of which near-match field carries the Spec: present exactly when flagged_match or alternate_match is present, except a role_incompatible refusal before or during materialise whose flagged_match records the confirmed elected identity without a gate (role incompatibility prevents an availability verdict), a qualifier_not_bound refusal, whose flagged_match records the graph-confirmed elected spec without a gate because the qualifier guard refuses before an availability verdict exists, or a denominator_not_available refusal, whose flagged_match records the elected spec the form or denominator check refused. Absent on every other no_data outcome. At most one of flagged_match and alternate_match is present at a time." }, - "prepared_at": { - "type": "string", - "format": "date-time", - "title": "Prepared At" + "flagged_match": { + "anyOf": [ + { + "$ref": "#/components/schemas/Spec" + }, + { + "type": "null" + } + ], + "description": "optional; the elected variable's own Spec, present whenever gate fired and a groundable identity exists for the elected shape, or for a role_incompatible, qualifier_not_bound or denominator_not_available refusal that records its graph-confirmed identity without a gate: role incompatibility prevents an availability verdict, the qualifier guard refuses before one exists, and the denominator check refuses the series for its form, not its data. See gate for which check failed. available_at_place is False and confidence is low on gate=no_member_has_data_at_place; both stay at their not-assessed default (None) on gate=no_member_asserts_bound_properties, since there is no resolved place to be unavailable at. Absent on gate=only_alternate_has_data, where no groundable Spec for the elected shape exists; alternate_match carries the substitute the engine found instead. Distinct from nearest_real, up to two constraint-RELAXED specs that DO have data nearby. flagged_match is the elected variable itself, unavailable as the request asked for it." }, - "coverage": { - "$ref": "#/components/schemas/CoverageModel" + "alternate_match": { + "anyOf": [ + { + "$ref": "#/components/schemas/Spec" + }, + { + "type": "null" + } + ], + "description": "optional; a categorically different, data-bearing variable the request did not elect, present exactly when gate == 'only_alternate_has_data'. elected_count still counts the variable the request actually asked for; alternate_match is the one substitute the engine found nearby with observations of its own. Distinct from flagged_match (the elected variable itself, present on the other two gates) and from nearest_real (up to two constraint-relaxed variants of the SAME variable). alternate_match always names a different variable." }, - "citation": { - "$ref": "#/components/schemas/CitationModel" + "elected_count": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ], + "title": "Elected Count", + "description": "optional; how many StatVars the request actually elected. Present whenever the elected shape's variable identity was graph-confirmed, whatever no_data reason or gate the outcome ultimately carries. None when the outcome stops short of a graph-confirmed identity altogether (variable_not_resolved, role_not_resolved, role_signature_incompatible, and binding_mismatch all resolve no StatVar to count). Counts the SAME variable as flagged_match whenever flagged_match is present. On gate=only_alternate_has_data, where flagged_match is absent, elected_count still counts the variable the request elected, distinct from alternate_match's different variable." }, - "trace": { - "additionalProperties": true, - "type": "object", - "title": "Trace" + "entity_terms": { + "items": { + "type": "string" + }, + "type": "array", + "title": "Entity Terms", + "description": "the query entity text responsible for the outcome, in query order: every entity the engine could not resolve for entity_not_resolved, every ambiguous wording for entity_ambiguous, every resolved-but-unadmitted entity for entity_role_not_admitted, every name whose flow direction the query leaves untold for role_not_resolved, and every whole population the query directs to the other side of the flow for role_incompatible, which is empty when the refusal has another cause. Empty for every other no_data reason. This structured list is the client-facing source of those terms; rendered_sentence may quote the same wording for people, but clients must not parse it." }, - "warnings": { + "ambiguous_entities": { "items": { - "$ref": "#/components/schemas/WarningModel" + "$ref": "#/components/schemas/AmbiguousEntityGroup" }, "type": "array", - "title": "Warnings" + "title": "Ambiguous Entities", + "description": "every ambiguous wording responsible for an entity_ambiguous outcome, in query order, each paired with the graph candidates it could name. Empty for every other no_data reason. Invariant: every group's `text` equals some restatement.entities[i].text on the same part. Additive to entity_terms, which carries the same wordings as bare strings; rendered_sentence is unaffected by this field and quotes the same wordings and candidate names for people, but clients must not parse it." }, - "diagnostics": { + "source_terms": { "items": { - "$ref": "#/components/schemas/DiagnosticModel" + "type": "string" }, "type": "array", - "title": "Diagnostics", - "description": "facts about how this response was produced, for developers: a citation whose sources declare no processing level, and an origin catalogue past its staleness limit. A version stores none; each response states its own" + "title": "Source Terms", + "description": "the source wordings responsible for a source-resolution outcome, in query order: every included wording that matched no admitted source for source_not_resolved, every ambiguous wording for source_ambiguous, and the part's source_code for source_code_not_held, source_code_ambiguous and source_code_shares_variable. Empty for every other no_data reason. rendered_sentence may quote the same wording for people, but clients must not parse it." }, - "artifacts": { + "ambiguous_sources": { "items": { - "$ref": "#/components/schemas/ArtifactEntryModel" + "$ref": "#/components/schemas/AmbiguousSourceGroup" }, "type": "array", - "title": "Artifacts", - "description": "every servable artifact for this rendering, in a fixed order: every data artifact first, the series-statistics/1 artifact (rendering.statistics == 'series') last, if present. A caller selecting the data artifact should check rendering rather than take the first entry, but the order itself is a stable contract, not an accident of storage" + "title": "Ambiguous Sources", + "description": "every ambiguous source wording responsible for a source_ambiguous outcome, in query order, each paired with the admitted sources it could name, and for source_code_ambiguous the part's source_code paired with the provenances holding it. Empty for every other no_data reason. A client posts the matching entry of options." }, - "series_count": { + "unit_alternatives": { "anyOf": [ { - "type": "integer" + "items": { + "$ref": "#/components/schemas/UnitAlternative" + }, + "type": "array" }, { "type": "null" } ], - "title": "Series Count" + "title": "Unit Alternatives", + "description": "the currencies a unit_not_resolved outcome offers, in the binder's order: the candidate ISO codes for an ambiguous currency name with no declared alias (XOF, XAF and CHF for 'francs'), or the role shapes for a role-relative currency phrase beside entities on two roles. Absent on every other outcome, and on a unit_not_resolved outcome the binder offers no candidates for" }, - "output_options": { + "unbound_qualifiers": { + "items": { + "$ref": "#/components/schemas/ResolvedQualifier" + }, + "type": "array", + "title": "Unbound Qualifiers", + "description": "the ResolvedQualifier entries responsible for a qualifier_not_bound outcome, in query order: every entry from flagged_match.resolved.trace.query_qualifiers whose disposition is not \"bound\" (\"unbound\": a named code row exists but no final binding covers it; \"no_vocabulary\": the text names no code at all), then, for a part naming or leaving out sources, each source it could not bind, an \"unbound\" entry under the source's label whose named holds the source's references. Empty for every other no_data reason. This structured list is the client-facing source of which terms went unrecognised, alongside each one's own disposition; rendered_sentence may quote the same wording for people, but clients must not parse it." + }, + "denominator": { "anyOf": [ { - "$ref": "#/components/schemas/OutputOptionsModel" + "$ref": "#/components/schemas/NoDataDenominator" }, { "type": "null" } - ] + ], + "description": "the denominator the question named and the one the flagged match divides by, set on every denominator_not_available refusal the engine returns after electing a series; null for every other no_data reason. A client can offer the flagged match, or fetch its nearest_real level and the denominator asked and divide them" }, - "series_coverage_stamp": { + "options": { + "items": { + "$ref": "#/components/schemas/NoDataOption" + }, + "type": "array", + "title": "Options", + "description": "one ready request per choice of an entity_ambiguous, source_ambiguous, source_code_ambiguous, role_not_resolved or unit_not_resolved refusal, in query then candidate order. An entity option pins the candidate on every row with the ambiguous wording and every entity that resolved to one node; named groups, sets read as members and other ambiguous wordings stay unpinned, so a second ambiguity refuses again with the first pick kept. A candidate that is a group's own node, asked for its members, posts the group's registry name with no dcid, and has no option when no registry name resolves to the group alone. A source option sets the candidate's ref on the ambiguous mention; a source-code option names the holding provenance as the part's only included source. A role option states a direction for every name the question left unstated, so that every axis the shape declares a role on and the part does not ask open holds a place, offered while that gives at most six readings. A unit option names one of unit_alternatives in place of the ambiguous currency words. An option whose part breaks the ParsedPart bounds, or states a direction its own wording contradicts, is left out. Empty for other reasons; when the part's inputs exceed the ParsedPart bounds; on a role_not_resolved refusal with more than six readings, with no reading that leaves a place on every such axis, whose readings were all read with none holding data, or that the shape refused before placing names; and on a unit_not_resolved refusal without unit_alternatives" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "reason" + ], + "title": "NoData", + "description": "Outcome when no grounded result can be returned." + }, + "NoDataDenominator": { + "properties": { + "asked": { "anyOf": [ { - "type": "string" + "$ref": "#/components/schemas/GraphRef" }, { "type": "null" } ], - "title": "Series Coverage Stamp", - "description": "the series_coverage artifact stamp this request's sync-admission estimate was computed against, kept as lineage only. content_version is a pure function of the frame and does not fold this in. Not the same coverage as the 'coverage' field above (materialise.window.Coverage's row/dimension/window report)" + "description": "the denominator the question named, as the search read it from the bases the candidate series divide by; null when the question named none, or named one that no candidate series divides by" }, - "retention": { + "found": { "anyOf": [ { - "$ref": "#/components/schemas/RetentionModel" + "$ref": "#/components/schemas/GraphRef" }, { "type": "null" } ], - "description": "how long this version can still be fetched: the retention of the frame every file renders from (a derived version's base frame). Each door sets it on its response" + "description": "the denominator the flagged match divides by; null when it states none (a level such as an amount in US dollars, or a series whose name alone gives its base)" } }, "additionalProperties": false, "type": "object", - "required": [ - "definition", - "content_version", - "prepared_at", - "coverage", - "citation", - "trace", - "artifacts" - ], - "title": "Manifest", - "description": "`trace` stays a plain dict, since `materialise.trace.ManifestTrace.to_dict()`\nis already this field's exact wire shape.\n\n`series_count` is the number of distinct series this definition\nresolves, as the version's description counts them (`statistics.SeriesFigures.series`): a\nseries and the estimates continuing it count once, though the statistics artifact holds a\nrow for each method. `None` means a version record minted before this field existed, whose old\ninline `statistics` no fact carries. The per-series detail itself lives in the\n`series-statistics/1` Parquet artifact every door that returns a\n`Manifest` lists in `artifacts` whenever `series_count` is not `None`\n(`datasets_api.render.render_and_store_series_statistics`), never\ninline on this model.\n\n`output_options` is `None` on a version record minted before the field\nexisted, the same convention `series_count` uses.\n\n`prepared_at` is when this version was first prepared, written once at its\nfirst mint and stored with it, so every re-mint and re-render reads the same\ninstant." + "title": "NoDataDenominator", + "description": "The denominators a denominator_not_available refusal compared: the one the question\nnamed and the one its flagged match divides by -- NoData.denominator." }, - "Matched": { + "NoDataOption": { "properties": { - "text": { - "type": "string", - "title": "Text" + "mentions": { + "items": { + "type": "string" + }, + "type": "array", + "title": "Mentions", + "description": "the request's own words this option settles, in query order: the ambiguous entity wording, the ambiguous source wording, the part's source_code, the part's unit_text, or for role_not_resolved every name whose direction the option states" }, - "as": { - "type": "string", - "enum": [ - "name", - "alias", - "code" - ], - "title": "As" - } - }, - "type": "object", - "required": [ - "text", - "as" - ], - "title": "GraphResolveMatched", - "description": "The listed text the input matched, and whether it is the entity's name, an alias, or a\ncode. A phrase naming a group's members (\"EU countries\") matches as `alias`." - }, - "Measure": { - "properties": { "label": { "type": "string", "title": "Label", - "description": "the measure's noun phrase, such as `net disbursements`" - } - }, - "type": "object", - "required": [ - "label" - ], - "title": "GraphDefinitionMeasure", - "description": "What the variable counts or sums, as the code index names it." - }, - "MeasureAxisValue": { - "properties": { - "axis": { - "type": "string", - "title": "Axis", - "description": "the declared measure-axis identifier (code_index.types.MeasureAxis.axis), e.g. 'measuredProperty' or a constraint-property dcid such as 'financialFlowType'" + "description": "the choice in words for a menu: the candidate's display name, prefixed 'Excluding' for a source the part excludes; for role_not_resolved the direction the option reads, such as 'France to Germany' or 'To Kenya and Uganda'; for a role currency the role's currency, such as \"recipient's currency\". Clients must not parse it" }, - "value": { - "$ref": "#/components/schemas/GraphRef", - "description": "the value's dcid and the measure index's label for it, e.g. Gross" + "data_query": { + "$ref": "#/components/schemas/ParsedInput", + "description": "a one-part parsed input settling this choice only. Post it unchanged as the input of /api/search/resolve; its one part is a dataset_resubmit parsed entry's part. A second ambiguous wording refuses again. Whether data exists for it is not checked" + }, + "entity_choice": { + "anyOf": [ + { + "type": "integer", + "minimum": 0.0 + }, + { + "type": "null" + } + ], + "title": "Entity Choice", + "description": "for an entity_ambiguous option, the index into NoData.ambiguous_entities of the group this option settles; null on every other option. Two groups can share one wording ('aid from Congo to Congo' asks 'Congo' for each end), so a client groups an entity menu by this index, never by mentions, and joins it to the sentence slot token with the same entity_choice" } }, "additionalProperties": false, "type": "object", "required": [ - "axis", - "value" + "mentions", + "label", + "data_query" ], - "title": "MeasureAxisValue", - "description": "One measure axis and the value a measure partition holds on it (see\nResolvedSpec.measure_axis_values)." + "title": "NoDataOption", + "description": "One answer to the choice a no_data refusal asks for: the words it settles, a label\nfor people, and the request that settles them. It is one entry of NoData.options." }, - "MemberItem": { + "NoDataPart": { "properties": { - "ref": { - "type": "string", - "title": "Ref" - }, - "label": { + "variable_text": { "anyOf": [ { "type": "string" @@ -10172,54 +13453,35 @@ "type": "null" } ], - "title": "Label" - } - }, - "type": "object", - "required": [ - "ref", - "label" - ], - "title": "GraphMemberItem", - "description": "One item of a list: its dcid and the owner's label for it, `null` where the owner holds\nno name." - }, - "MembersEnvelope": { - "$id": "https://schemas.dfo.one.org/datasets/v1/members-envelope.json", - "properties": { - "schema_version": { - "type": "integer", - "const": 1, - "title": "Schema Version", - "default": 1 + "title": "Variable Text", + "description": "the variable text this part answers, in the order asked. This part's position in Resolution.parts equals the same variable_index every SSE event keyed by variable_index uses (ShapeEvent, StepEvent, SentenceEvent). Every dataset_resubmit entry kind (identity, candidates, placeholder, and parsed through its nested ParsedPart) requires its own posted variable_text, so this field is always the posted text echoed back onto the rebuilt part, never null. Null only when the whole posted query was empty or whitespace-only (raw_text door), which refuses variable_not_resolved before extraction runs and so has no text to name." }, - "spec_id": { - "type": "string", - "pattern": "^spec_", - "title": "Spec Id" + "separate": { + "type": "boolean", + "title": "Separate", + "description": "true when this part was asked beside the others to be compared with them. A client resubmitting an identity, candidate set, or placeholder posts this flag on that entry to preserve the comparison. Two parts marked separate that resolve to one reading carry the same spec_id and stay two parts. False, the default, is omitted", + "default": false }, - "members": { + "warnings": { "items": { - "$ref": "#/components/schemas/ServedMember" + "$ref": "#/components/schemas/Warning" }, "type": "array", - "title": "Members" - }, - "served_count": { - "type": "integer", - "title": "Served Count" + "title": "Warnings", + "description": "this part's own run-health signals. A part folded into an earlier part's spec (see DefinitePart.spec) carries binding_folded alone. The merged spec's own resolved warnings live only on the first part that carries it. An unfolded part carries the warnings raised while resolving this part, plus observations_omitted on a candidates part when response_options.include_observations was set." }, - "family_member_count": { + "timing_ms": { "anyOf": [ { - "type": "integer" + "$ref": "#/components/schemas/Timing" }, { "type": "null" } ], - "title": "Family Member Count" + "description": "this part's own latency breakdown, where by_step names only the phases this part ran and total sums them, leaving out the shape_* stages nested inside shape. Excludes the shared, once-per-request steps (e.g. extract), which diagnostics.timing_ms.by_step carries once for the whole request; distinct too from diagnostics.timing_ms.total, the whole request's wall-clock elapsed time." }, - "family_member_digest": { + "rendered_sentence": { "anyOf": [ { "type": "string" @@ -10228,1420 +13490,1900 @@ "type": "null" } ], - "title": "Family Member Digest" - } - }, - "additionalProperties": false, - "type": "object", - "required": [ - "schema_version", - "spec_id", - "members", - "served_count", - "family_member_count", - "family_member_digest" - ], - "title": "MembersEnvelope", - "description": "`POST /api/datasets/{id}/members`'s response: the members a mint of the spec serves,\nresolved without materialising a frame.\n\n`members` lists them sorted by `ref`, and `served_count` counts them.\n`family_member_count` and `family_member_digest` state the whole population the identity\nadmits, before a broader member's dominated members are dropped, as a mint's\n`trace.family_member_count` and `trace.family_member_digest` state it; both are `null`\nwhen member resolution cannot state that population." - }, - "MembersPage": { - "properties": { - "ref": { - "type": "string", - "title": "Ref", - "description": "the node whose list this is" + "title": "Rendered Sentence", + "description": "a human-readable string. For candidates, a header naming how many readings there are ('3 readings.'), then each shown candidate's heading and a byline led by the source and span that set it apart; for no_data, a heading in the same claim form naming the entity, measure, and counterpart that were checked. Either ends with the text of this part's departures, in order, and a candidates part's then closes with its assumptions clause. For a definite part this stays null or omitted: the confirmation sentence (heading and byline) lives at spec.resolved.rendered_sentence, and its departures reach the envelope's composed sentence." }, - "relation": { - "type": "string", - "enum": [ - "codes", - "children", - "datasets", - "variables", - "members", - "countries", - "facets" + "sentence_plan": { + "anyOf": [ + { + "items": { + "$ref": "#/components/schemas/SentenceToken" + }, + "type": "array" + }, + { + "type": "null" + } ], - "title": "Relation" + "title": "Sentence Plan", + "description": "the ordered token form of rendered_sentence, present whenever it is. For a definite part this stays null or omitted. spec.resolved.sentence_plan carries the confirmation sentence's own plan instead." }, - "projection": { + "restatement": { "anyOf": [ { - "$ref": "#/components/schemas/Projection" + "$ref": "#/components/schemas/ParsedPart" }, { "type": "null" } ], - "description": "the membership projection listed; null for a relation that takes none" + "description": "the ParsedPart that reproduces this part's own resolution inputs -- the same entities, resolved time window, unit text, and source text the engine actually used to resolve this one leg -- so a client holding this part alone can copy it straight into a fresh ParsedInput.parts entry and re-resolve it faithfully, without flattening it into the whole query's variable_text the way variable_text alone would. Canonical, not verbatim: for a raw_text part, time_text is the equivalent phrase this door's own time grammar recognises (e.g. '2015 to 2020'), not the user's original words, since the engine's date extraction keeps only the structured window and discards the phrasing. Null whenever this part has no faithful echo to give. On a dataset_resubmit entry's identity/candidates/placeholder kinds, which post an identity or stub rather than a phrase and have no per-part resolution inputs to echo -- a dataset_resubmit parsed entry, genuinely re-resolved from its own posted ParsedPart, carries a real one like any parsed-door part. Also null when this leg's entity was bound to a directional role axis (origin/destination) and no door-supplied role named that axis, since an echo without the axis would resubmit the request with that entity reversed. Also null when one of this leg's own inputs does not fit ParsedPart's own field caps, since a truncated echo would misrepresent what was actually resolved." }, - "as_of": { + "entity_refs": { + "items": { + "$ref": "#/components/schemas/EntityRefs" + }, + "type": "array", + "title": "Entity Refs", + "description": "the binding of each entity of `restatement`, one per restatement.entities row, in row order, so a client can tell which node a text such as 'G7' bound. A response field kept off `restatement`, which posts back unchanged. The binding is the one the answer reads: for a candidates part, the elected reading's; for a part folded into an earlier part's spec, its own. [] when `restatement` is null or names no entity" + }, + "operations": { + "items": { + "$ref": "#/components/schemas/Operation" + }, + "type": "array", + "title": "Operations", + "description": "the operations the question asks for over this part's data, in query order; the engine echoes them onto the part it resolves. Empty when the question asks for none" + }, + "departures": { + "items": { + "$ref": "#/components/schemas/Departure" + }, + "type": "array", + "title": "Departures", + "description": "every way this part's answer differs from what its request asked, ordered by how much each changes the number: closest_match, measure_not_applied, operation_not_applied, breakdown_not_applied, entity_unavailable, member_unavailable, year_unavailable, modelled_values, group_read_as_members, whole_total_read, whole_total_unpublished, direction_discarded, direction_inferred, scope_limited. [] when the answer is what was asked. A client that renders its own sentence reads them here; each one's text also closes the sentence that carries this part (see Departure.text). A warning on the same part reports run health and stays separate" + }, + "assumptions": { + "items": { + "$ref": "#/components/schemas/Assumption" + }, + "type": "array", + "title": "Assumptions", + "description": "every value the engine filled that the request did not ask for, in clause order. Declared defaults come first, in the order of the Spec's trace.slot_filters, then open roles, then the place scope. A declared default is a slot the request left open that its code system's or shape's declared default fixed, named by the bound code's full label. An open role is a flow role no request word asked for, read across every entity on it with data. It is either a role the role scope default filled (resolved.scope on that axis), whatever its member count, served as one series per member where the shape declares the role, or a role the heading states with no entity of its own ('from 164 providers', 'owed to all creditors'), served as the total over its members. A role the identity binds in entities or lists in open_roles, that one of the part's operations runs over ('top 5 donors'), or that the request's words asked every member of ('all donors'), is asked. The place scope is a request that named no place, read across every place with data. Every door fills assumptions. A definite part reads them from its Spec, a candidates part carries the items every list in CandidatesPart.reading_assumptions holds alike, text included, and no_data and unsupported parts carry []. A dataset_resubmit identity entry posts every slot bound, so its part states the items of the entry's assumptions echo that still hold (see ResubmitIdentityEntry.assumptions), and a candidates entry reads each reading with its candidate's echo (see ResubmitCandidate.assumptions). The sentence that carries this part closes with them as one segment='assumption' clause ('Assumed: official development assistance; every provider.'), after its departures. [] when the answer fills nothing" + }, + "status": { + "type": "string", + "const": "no_data", + "title": "Status", + "description": "nothing to return" + }, + "no_data": { + "$ref": "#/components/schemas/NoData", + "description": "the reason" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "status", + "no_data" + ], + "title": "NoDataPart", + "description": "Nothing could be returned for this part." + }, + "NodeRef": { + "properties": { + "ref": { + "type": "string", + "title": "Ref" + }, + "label": { "anyOf": [ { - "type": "string", - "format": "date" + "type": "string" }, { "type": "null" } ], - "title": "As Of", - "description": "the date membership was read at; null for today" - }, - "items": { + "title": "Label" + } + }, + "type": "object", + "required": [ + "ref", + "label" + ], + "title": "GraphNodeRef", + "description": "A graph reference. `label` is `null` when the target is not held, carries no `name`, or\ncarries only a `name` equal to its own dcid." + }, + "NodesRequest": { + "properties": { + "dcids": { + "items": { + "type": "string", + "maxLength": 512, + "pattern": "^[A-Za-z0-9_.\\-]+(?:/[A-Za-z0-9_.\\-]+)*$" + }, + "type": "array", + "maxItems": 50, + "minItems": 1, + "title": "Dcids" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "dcids" + ], + "title": "GraphNodesRequest", + "description": "`dcids`: 1 to `NODES_MAX_DCIDS` node dcids read as one batch, in one DCP-read\nexecutor job. Each dcid matches the GET route's `{dcid}` path syntax and its 512-character\nceiling." + }, + "NodesResponse": { + "properties": { + "nodes": { "items": { "anyOf": [ { - "$ref": "#/components/schemas/CodeItem" - }, - { - "$ref": "#/components/schemas/FacetItem" + "oneOf": [ + { + "$ref": "#/components/schemas/StatVarNode" + }, + { + "$ref": "#/components/schemas/CodeSystemNode" + }, + { + "$ref": "#/components/schemas/CodeNode" + }, + { + "$ref": "#/components/schemas/GroupNode" + }, + { + "$ref": "#/components/schemas/CountryNode" + }, + { + "$ref": "#/components/schemas/ContinentNode" + }, + { + "$ref": "#/components/schemas/SubregionNode" + }, + { + "$ref": "#/components/schemas/ContinentalUnionNode" + }, + { + "$ref": "#/components/schemas/PlaceOtherNode" + }, + { + "$ref": "#/components/schemas/OrganisationNode" + }, + { + "$ref": "#/components/schemas/AggregateNode" + }, + { + "$ref": "#/components/schemas/UnitNode" + }, + { + "$ref": "#/components/schemas/SourceNode" + }, + { + "$ref": "#/components/schemas/DatasetNode" + }, + { + "$ref": "#/components/schemas/ProvenanceNode" + }, + { + "$ref": "#/components/schemas/OtherNode" + } + ], + "discriminator": { + "propertyName": "kind", + "mapping": { + "aggregate": "#/components/schemas/AggregateNode", + "code": "#/components/schemas/CodeNode", + "code_system": "#/components/schemas/CodeSystemNode", + "continent": "#/components/schemas/ContinentNode", + "continental_union": "#/components/schemas/ContinentalUnionNode", + "country": "#/components/schemas/CountryNode", + "dataset": "#/components/schemas/DatasetNode", + "group": "#/components/schemas/GroupNode", + "organisation": "#/components/schemas/OrganisationNode", + "other": "#/components/schemas/OtherNode", + "place_other": "#/components/schemas/PlaceOtherNode", + "provenance": "#/components/schemas/ProvenanceNode", + "source": "#/components/schemas/SourceNode", + "stat_var": "#/components/schemas/StatVarNode", + "subregion": "#/components/schemas/SubregionNode", + "unit": "#/components/schemas/UnitNode" + } + } }, { - "$ref": "#/components/schemas/MemberItem" + "$ref": "#/components/schemas/NotHeldEntry" } ] }, "type": "array", - "title": "Items" - }, - "next_cursor": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Next Cursor", - "description": "the cursor for the next page; null when this page ends the list" - }, - "complete": { - "type": "boolean", - "title": "Complete", - "description": "whether the walk reached the end of a list the owner holds in full" - }, - "total": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ], - "title": "Total", - "description": "the list's length; null where the list is partial" - }, - "gaps": { - "items": { - "type": "string" - }, - "type": "array", - "title": "Gaps", - "description": "the code of each way the list is partial" - }, - "built_from": { - "additionalProperties": { - "type": "string" - }, - "propertyNames": { - "enum": [ - "code_index", - "origin_catalogue", - "coverage_index", - "membership" - ] - }, - "type": "object", - "title": "Built From", - "description": "the build of each table the list read" + "title": "Nodes" } }, "type": "object", "required": [ - "ref", - "relation", - "projection", - "as_of", - "items", - "next_cursor", - "complete", - "total", - "gaps", - "built_from" + "nodes" ], - "title": "GraphMembersPage", - "description": "One page of `GET /api/graph/node/{dcid}/members`." + "title": "NodesResponse", + "description": "`nodes` is index-aligned with the request's `dcids`: a repeated dcid repeats its\nentry. Each entry is the body `GET /api/graph/node/{dcid}` returns for that dcid, or a\n`not_held` entry where that route answers 404." }, - "MembershipBlock": { + "NotHeldEntry": { "properties": { - "authority": { - "$ref": "#/components/schemas/Authority" - }, - "as_of": { - "anyOf": [ - { - "type": "string", - "format": "date" - }, - { - "type": "null" - } - ], - "title": "As Of", - "description": "the date the read asked for; null for today" - }, - "effective_date": { - "anyOf": [ - { - "type": "string", - "format": "date" - }, - { - "type": "null" - } - ], - "title": "Effective Date", - "description": "the latest membership change on or before the date; null for an undated membership" + "ref": { + "type": "string", + "title": "Ref" }, - "projections": { - "items": { - "$ref": "#/components/schemas/ProjectionCount" - }, - "type": "array", - "title": "Projections" + "status": { + "type": "string", + "const": "not_held", + "title": "Status", + "default": "not_held" } }, "type": "object", "required": [ - "authority", - "as_of", - "effective_date", - "projections" + "ref", + "status" ], - "title": "GraphMembershipBlock", - "description": "A group's or region's membership under its declared authority." + "title": "GraphNotHeldEntry", + "description": "A batch entry for a dcid where `GET /api/graph/node/{dcid}` answers 404\n`node_not_held`." }, - "Methodology": { + "ObservationPoint": { "properties": { - "description": { + "date": { + "type": "string", + "title": "Date", + "description": "the observation date, e.g. '2018'" + }, + "value": { "anyOf": [ { - "type": "string" + "type": "number" }, { "type": "null" } ], - "title": "Description", - "description": "how the publisher collects and compiles the data, as CommonMark" + "title": "Value", + "description": "the observed value; null when the graph reports a date with no value" } }, + "additionalProperties": false, "type": "object", "required": [ - "description" + "date", + "value" ], - "title": "Methodology" + "title": "ObservationPoint", + "description": "One (date, value) pair from a resolved StatVar's observation series." }, - "MintOptions": { + "ObservationSeries": { "properties": { - "format": { - "type": "string", - "enum": [ - "csv", - "xlsx", - "parquet" - ], - "title": "Format", - "default": "csv" + "stat_var": { + "$ref": "#/components/schemas/SeriesStatVarRef", + "description": "the StatVar these points observe" }, - "bundle": { - "type": "boolean", - "title": "Bundle", - "default": true + "entities": { + "items": { + "$ref": "#/components/schemas/SeriesEntityRef" + }, + "type": "array", + "title": "Entities", + "description": "the role tuple this series observes -- one entry for a standard single-role series (role='observationAbout'), two for a dev-finance bilateral series (role='origin' and role='destination')" }, - "groupby": { - "anyOf": [ - { - "$ref": "#/components/schemas/GroupbyOptions" - }, - { - "type": "null" - } - ] + "axes": { + "items": { + "$ref": "#/components/schemas/SeriesAxisRef" + }, + "type": "array", + "title": "Axes", + "description": "one entry per constraint the StatVar declares with a resolved value, ordered by property dcid; empty for a StatVar with no constraints. A client names each property from the Spec's slots" }, - "pivot": { - "anyOf": [ - { - "$ref": "#/components/schemas/PivotOptions" - }, - { - "type": "null" - } - ] + "points": { + "items": { + "$ref": "#/components/schemas/ObservationPoint" + }, + "type": "array", + "title": "Points", + "description": "chronological observation points from the series' lead observation facet (see SpecObservations), plus the points of the same source's estimates continuing the series past the lead's last period when it has any -- the `modelled_values` departure marks those -- filtered to the spec's requested window when one exists; the full in-window series when SpecObservations.truncated is false, else at most the latest points (bounded by the server's preview-points setting and its per-series row limit)" }, - "columns": { - "anyOf": [ - { - "items": { - "type": "string", - "minLength": 1 - }, - "type": "array" - }, - { - "type": "null" - } - ], - "uniqueItems": true, - "title": "Columns" + "total_obs": { + "type": "integer", + "title": "Total Obs", + "description": "this series' SELECTED facet's in-window point count (before truncation) -- a per-series figure alongside SpecObservations.total_obs's aggregate across every series. For a scope-defaulted bulk latest-only series (no requested window), this is the coverage probe's all-time obs_count for that entity's selected facet -- the in-window count too, since no window narrows it" + }, + "source_refs": { + "items": { + "$ref": "#/components/schemas/ProvenanceRef" + }, + "type": "array", + "title": "Source Refs", + "description": "provenance of the lead observation facet these points were read from (the facet selected for this series -- see SpecObservations)" }, - "without_party_totals": { - "type": "boolean", - "title": "Without Party Totals", - "default": false + "facet": { + "additionalProperties": { + "$ref": "#/components/schemas/SeriesFacetRef" + }, + "type": "object", + "title": "Facet", + "description": "this series' lead observation facet, per axis (provenance/measurementMethod/unit); the estimates continuing the series keep the lead's entry; sparse -- an axis the facet carries no value for is absent, never a null placeholder. provenance here always agrees with source_refs, since both derive from the same lead facet" }, - "layout": { + "conversion": { "anyOf": [ { - "type": "string", - "const": "frame" + "$ref": "#/components/schemas/ObservationSeriesConversion" }, { "type": "null" } ], - "title": "Layout" + "description": "what recipe and tables converted this series' points to the requested currency; absent on a series served in its native facet" } }, "additionalProperties": false, "type": "object", - "title": "MintOptions", - "description": "Rendering-only, never hashed into identity. `format`/`bundle`/`pivot`/\n`columns`/`groupby`/`without_party_totals` are this deployment's live rendering surface. A\n`groupby.by` entry names a code system some deployment declaration\nmarks summable, a role/entity column, `stat_var`, or a column every\nframe carries regardless of shape; any other name refuses\n`rollup_not_summable` (`datasets_api.groupby.refuse_unknown_by_axes`).\nA declared axis this frame did not decode is simply absent from the\ncollapse-set computation, not an error (see\n`datasets_api.groupby.collapse_axes`); an unsafe collapse refuses\n`rollup_not_summable` too, naming the axis and precondition\n(`materialise.reshape.groupby_sum`,\n`datasets_api.groupby.refuse_stat_var_collision`,\n`datasets_api.groupby.refuse_decode_gaps`). A `columns` entry naming a\nrecognised-but-disabled enrichment field refuses `capability_unavailable`.\n`columns` selects the table and decoded columns it names. A list that names\nonly enrichment fields selects nothing: every default column stays,\ndecoded columns included, and the enrichments are added. A list that mixes\na table column with an enrichment selects. Without a pivot, a list that\nnames no decoded column keeps all of them, `status` is accepted and left\nout, `_label` is written by default (a list naming it keeps\n``), and the written order follows the long layout\n(`materialise.projection`) whatever order the list names.\n\n`layout: \"frame\"` writes a bare parquet file in the frame layout instead\nof the long layout: the frame's grammar columns as reshaped, with\ndecoded axes as `stat_var_`, `status` kept, and a converted\nunit as its JCS request text. `columns` then selects over those columns,\nas it does for pivot output. It refuses with `bundle: true`, a `pivot`,\nor a format other than parquet.\n\n`without_party_totals: true` leaves out the rows whose party, on a flow party role the\nserved identity binds no entity on, the code index declares a group total\n(`datasets_api.party_totals`). It runs on the frame before any reshape, so a `groupby`\nsums members alone. A cut that leaves rows out mints a version of its own, as a `groupby`\ncollapse does; one that leaves nothing out serves the frame's own version." + "required": [ + "stat_var", + "entities", + "points", + "total_obs" + ], + "title": "ObservationSeries", + "description": "One (stat_var, role tuple) pair's observation points, in chronological order." }, - "MintRequest": { + "ObservationSeriesConversion": { "properties": { - "schema_version": { - "type": "integer", - "const": 1, - "title": "Schema Version", - "default": 1 + "recipe_id": { + "type": "string", + "title": "Recipe Id", + "description": "the ConversionRecipe.recipe_id that produced these points" }, - "input": { - "oneOf": [ + "table_provenance": { + "$ref": "#/components/schemas/SeriesFacetRef", + "description": "the Provenance node both the exchange-rate and (when present) deflator tables loaded under" + }, + "exchange_rate_table_version": { + "type": "string", + "title": "Exchange Rate Table Version", + "description": "the exchange-rate table's own version" + }, + "deflator_table_version": { + "anyOf": [ { - "$ref": "#/components/schemas/SpecIdInput" + "type": "string" }, { - "$ref": "#/components/schemas/StatVarSetInput" + "type": "null" } ], - "title": "Input", - "discriminator": { - "propertyName": "kind", - "mapping": { - "spec_id": "#/components/schemas/SpecIdInput", - "statvar_set": "#/components/schemas/StatVarSetInput" - } - } - }, - "options": { - "$ref": "#/components/schemas/MintOptions" - } - }, - "additionalProperties": false, - "type": "object", - "required": [ - "input" - ], - "title": "MintRequest", - "description": "Body of `POST /api/datasets`: one `input` and the render `options`." - }, - "MissingEntityModel": { - "properties": { - "ref": { - "type": "string", - "title": "Ref" - }, - "label": { - "type": "string", - "title": "Label" - } - }, - "additionalProperties": false, - "type": "object", - "required": [ - "ref", - "label" - ], - "title": "MissingEntityModel" - }, - "NationalCurrency": { - "properties": { - "currencies": { - "type": "integer", - "title": "Currencies" + "title": "Deflator Table Version", + "description": "the deflator table's own version; absent for a current-prices conversion" }, - "places": { + "fallback_count": { "type": "integer", - "title": "Places" - } - }, - "type": "object", - "required": [ - "currencies", - "places" - ], - "title": "GraphAvailabilityNationalCurrency", - "description": "The units that are each covered place's own currency." - }, - "NearestRealSpec": { - "properties": { - "spec_id": { - "type": "string", - "title": "Spec Id", - "description": "deterministic hash of (shape + canonical slot bindings); permalink-safe, dedup key, golden-comparison handle, cache key" + "title": "Fallback Count", + "description": "rows whose deflator-role entity was substituted with the recipe's fallback entity" }, - "definition": { - "$ref": "#/components/schemas/SpecDefinition", - "description": "the canonical definition this Spec was resolved from: {schema_version, identity}, the same shape Unsupported.definition uses. definition.identity is the identity-core projection this spec_id was minted from, serialised once and never re-derived; hashing it reproduces spec_id by construction. Post definition.identity back byte-for-byte as ResubmitIdentityPayload.identity to edit this Spec. Directional entities remain nested in identity.entities." + "fallback_examples": { + "items": { + "$ref": "#/components/schemas/SeriesConversionFallbackExample" + }, + "type": "array", + "title": "Fallback Examples", + "description": "a capped, sorted sample of the substituted (entity, fallback_entity) pairs" }, - "resolved": { - "$ref": "#/components/schemas/ResolvedSpec", - "description": "the engine's report of what it did with the ask: stat_vars, entities, coverage, trace, and every other display/diagnostic field. Never hashed; see ResolvedSpec" + "projected_count": { + "type": "integer", + "title": "Projected Count", + "description": "rows whose rate/deflator term was sourced from a projected table row" }, - "relaxation": { - "$ref": "#/components/schemas/Relaxation", - "description": "the definition part this suggestion relaxed, and the value(s) it dropped" + "projected_examples": { + "items": { + "type": "string" + }, + "type": "array", + "title": "Projected Examples", + "description": "a capped, sorted sample of the affected 'entity@year' keys" } }, "additionalProperties": false, "type": "object", "required": [ - "spec_id", - "definition", - "resolved", - "relaxation" + "recipe_id", + "table_provenance", + "exchange_rate_table_version", + "fallback_count", + "projected_count" ], - "title": "NearestRealSpec", - "description": "A nearest_real suggestion: a full Spec found by relaxing one constraint\nbinding and re-confirming the result against the live graph.\n\nGraph-re-confirmed only, never fabricated. See relaxation for which\nbinding was dropped to find it." + "title": "ObservationSeriesConversion", + "description": "What produced a converted series' points: the recipe and table\nversions, and the fallback/projected markers a caller reads off them.\nModelled on materialise.convert.ConversionRecord, whose own docstring\nthis field's members mirror. Omits ConversionRecord.native_currency:\na caller trusting or reproducing the number needs what recipe and\ntables produced it, not what currency it started from -- facet.unit\nalready names the currency the points are actually in." }, - "NoData": { + "ObservationsOmission": { "properties": { "reason": { "type": "string", "enum": [ - "source_not_resolved", - "source_ambiguous", - "source_code_not_held", - "source_code_ambiguous", - "source_code_shares_variable", - "entity_not_resolved", - "entity_ambiguous", - "entity_set_too_large", - "entity_role_not_admitted", - "variable_not_resolved", - "role_not_resolved", - "unit_not_resolved", - "rate_coverage_gap", - "no_matching_slice", - "binding_mismatch", - "denominator_not_available", - "no_observations", - "facet_not_available", - "role_incompatible", - "role_signature_incompatible", - "qualifier_not_bound", - "timed_out" + "observations_timed_out", + "observations_no_matching_source", + "observations_windowed_scope_unsupported", + "observations_converted_scope_unsupported", + "observations_no_dispatchable_facet", + "observations_bulk_fetch_failed", + "observations_probe_failed", + "observations_preview_too_large", + "observations_nothing_to_probe", + "observations_clients_unavailable", + "observations_no_points" ], "title": "Reason", - "description": "why nothing could be returned, in contract resolution order. \"entity_not_resolved\" means a named entity could not be resolved to a graph node; \"entity_ambiguous\" means a named entity matched more than one graph candidate and none could be preferred over the others, distinct from \"entity_not_resolved\", where no node matched at all; \"entity_role_not_admitted\" means a named entity resolved to exactly one graph node, but no role any candidate shape declares admits that node's graph type -- the entity is real, just not the kind of thing this query's data is reported for; \"entity_set_too_large\" means every named entity resolved, but the places the request names, counting the members of each group or region among them and summed over the roles they sit on, exceed what the engine binds in one request -- distinct from every other entity_* reason, where one entity, not the size of the set, is what failed; \"variable_not_resolved\" means no StatVar matched the variable text (e.g. an absent posted stat_var_dcid or entity, or no measure match at all); \"role_not_resolved\" means the query names a role the engine could not resolve; \"unit_not_resolved\" means the unit binder could not classify a token in the requested unit phrase against its lexicons; \"no_matching_slice\" means the measure matched fine, but the requested combination has no corresponding data series -- the constructed/derived variable does not exist in the graph at all. Covers an identity resubmit refine edit with no confirmable sibling StatVar for the edited slice, and a dev-finance scheme x purpose x recipient combination that was never published as a series, on raw-text and resubmit alike; \"binding_mismatch\" means the variable resolved and graph-confirmed StatVars exist, but none satisfies the requested slot bindings, either because a resolved value on a bound property mismatched or because the StatVar's value on a bound property is present but could not be read (an unresolvable dcid); distinct from \"no_matching_slice\" (the combination was never published at all) and \"variable_not_resolved\" (no StatVar matched at all); \"denominator_not_available\" means the query asks for a normalised form (per person, per area, a rate or a share) or names a denominator, and the matched series is not in that form or divides by another base; \"no_observations\" means a StatVar WAS confirmed to exist but has no observation at the resolved entity (it exists, but not data here); \"facet_not_available\" means observations exist at the entity, none under the requested facet values; \"role_incompatible\" means the role is real, and the StatVar does not declare it; \"role_signature_incompatible\" means the resolved StatVars carry incompatible role signatures and no partition into candidates was possible; \"source_code_not_held\" means no variable held under the part's source_code by a source search serves can answer the part: no served source holds the code, the part's sources exclude every source that does, or the code's variables cannot answer the part as asked; \"source_code_ambiguous\" means two of the part's sources hold its source_code; \"source_code_shares_variable\" means the source_code's variables answer other codes of its source too, so search cannot serve the code alone; \"qualifier_not_bound\" means the variable resolved to a series family, but a narrowing term the request's text named bound no constraint slot: no code system in the packaged index carries it, or its registered rows landed in no binding; \"timed_out\" means the request reached its time limit before this part was answered (diagnostics.timed_out is true); the question may hold data, so asking it again, alone or narrower, can answer it" + "description": "machine-readable cause, equal to the accompanying Warning's code when one fires" }, - "cause": { + "message": { + "type": "string", + "title": "Message", + "description": "human-readable explanation, safe to render directly" + }, + "pairs": { "anyOf": [ { - "$ref": "#/components/schemas/Cause" + "type": "integer" }, { "type": "null" } ], - "description": "why this refusal fired, present only for reason=rate_coverage_gap (the structured door's same-named ProblemDetails extension); omitted on every other reason" + "title": "Pairs", + "description": "observations_preview_too_large only: the count that was too large" }, - "category": { - "type": "string", - "enum": [ - "unresolved", - "absent" + "cap": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } ], - "title": "Category", - "description": "derived from reason, never independently settable: \"entity_not_resolved\", \"entity_ambiguous\", \"entity_set_too_large\", \"entity_role_not_admitted\", \"variable_not_resolved\", \"role_not_resolved\", \"source_not_resolved\", \"source_ambiguous\", \"source_code_not_held\", \"source_code_ambiguous\", \"source_code_shares_variable\", \"unit_not_resolved\", and \"timed_out\" are \"unresolved\" (the request could not be read into the graph); every other code is \"absent\" (the read request names a place holding nothing)", - "default": "absent" + "title": "Cap", + "description": "observations_preview_too_large only: the ceiling it exceeded" + }, + "dispatched": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ], + "title": "Dispatched", + "description": "observations_no_points/observations_probe_failed/observations_no_matching_source/observations_timed_out: pairs actually dispatched" + }, + "empty": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ], + "title": "Empty", + "description": "observations_no_points only: dispatched pairs that carried no data on their own facet" }, - "message": { + "hard_failed": { "anyOf": [ { - "type": "string" + "type": "integer" }, { "type": "null" } ], - "title": "Message", - "description": "the plain-language sentence for reason, naming the query terms it concerns where the reason has them (the indicator, place, or category wording), so a client can show a person the reason beside its code. Every no_data part the engine returns sets it. Clients must not parse it" + "title": "Hard Failed", + "description": "observations_no_points (always 0) and observations_probe_failed: dispatched pairs whose fetch itself failed" }, - "nearest_real": { + "facet_rejected": { "anyOf": [ { - "items": { - "$ref": "#/components/schemas/NearestRealSpec" - }, - "type": "array" + "type": "integer" }, { "type": "null" } ], - "title": "Nearest Real", - "description": "optional; up to two real, grounded specs found by relaxing one constraint at a time and re-confirming against the live graph. Each carries its own relaxation naming the definition part relaxed and the value(s) it dropped. Shaped by response_options and banded by confidence like any returned spec. Distinct from flagged_match (the elected variable itself) and alternate_match (a different variable). nearest_real varies the SAME variable's own constraints, never the variable." + "title": "Facet Rejected", + "description": "observations_no_points (always 0) and observations_no_matching_source: dispatched pairs a bound facet_filter rejected" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "reason", + "message" + ], + "title": "ObservationsOmission", + "description": "Why a SpecObservations payload carries no series, made unconditional:\nevery _fetch_observations call that reaches a \"nothing to show\" outcome\nsets this field instead of leaving the whole payload absent, so a client\nis never left guessing which of at least a dozen distinct causes\nproduced an empty preview.\n\nreason is a warning code from search.engine.region.codes (see\nObservationsOmissionReason's own docstring for the closed vocabulary and\nwhy it is duplicated here rather than imported) -- the SAME code the\naccompanying Warning carries when one is also emitted, so a client reads\none vocabulary rather than two. Not every reason accompanies a Warning:\na genuinely uninteresting omission (nothing was ever there to probe)\ncarries no diagnostic Warning of its own, but always carries this field.\n\nThe converse also holds, and the pairing is not exhaustive: a reason\narriving as a bare Warning with `omitted` absent means partial coverage,\nnot absence -- a fetch that delivered some series would never set this\nfield, but can warn (`observations_probe_failed` on a partially hard-\nfailed fetch, and `observations_timed_out` on one some of whose pairs\ncrossed the deadline).\n\nWhenever `omitted` is set, SpecObservations.series is `[]`, total_obs is\n`0`, and truncated is `false`, so a client reading `series ?? []` and\nignoring `omitted` sees an ordinary empty result, with no schema_version\nbump needed to stay compatible.\n\npairs/cap: populated only for reason==\"observations_preview_too_large\" --\nthe (stat_var, role_tuple) pair (or pair x elected-combination\ndispatch-item, or distinct-stat_var) count that was compared against the\nceiling it crossed, and that ceiling itself. Lets a client render \"this\nselection has {pairs} series, above the {cap} the preview fetches\"\nwithout re-deriving either number.\n\ndispatched: how many (stat_var, role_tuple) pairs this call actually\ndispatched. Populated for reason==\"observations_no_points\",\n\"observations_probe_failed\", \"observations_no_matching_source\", and\n\"observations_timed_out\" -- every reason a dispatch actually happened\nfor; None for a reason reached before dispatch (e.g.\n\"observations_nothing_to_probe\").\n\nempty: dispatched pairs that carried no data on their own facet.\nPopulated only for reason==\"observations_no_points\".\n\nhard_failed: dispatched pairs whose fetch itself failed. Populated for\nreason==\"observations_no_points\" (always 0 there -- a nonzero count\nmeans reason is \"observations_probe_failed\" instead) and for\n\"observations_probe_failed\" itself (the nonzero count that produced\nthat reason); None elsewhere.\n\nfacet_rejected: dispatched pairs a bound facet_filter (or currency\nconversion) rejected. Populated for reason==\"observations_no_points\"\n(always 0 there -- a nonzero count means reason is\n\"observations_no_matching_source\" instead) and for\n\"observations_no_matching_source\" itself; None elsewhere.\n\nEvery field left None where the branch that produced this omission has\nno meaningful count for it." + }, + "OpenAxisValueCount": { + "properties": { + "value": { + "$ref": "#/components/schemas/GraphRef", + "description": "the declared value" }, - "gate": { + "count": { + "type": "integer", + "title": "Count", + "description": "how many distinct served members declare this value" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "value", + "count" + ], + "title": "OpenAxisValueCount", + "description": "One declared value on an open constraint axis and how many served members\ndeclare it (see OpenConstraintAxisFact.values)." + }, + "OpenConstraintAxisFact": { + "properties": { + "property": { + "type": "string", + "title": "Property", + "description": "the constraint property dcid this fact is about" + }, + "varies": { + "type": "boolean", + "title": "Varies", + "description": "False when every served member that declares a value for this axis declares the same one (including when none of them declare one at all, since declaring nothing is itself an agreeing value here, the same rule resolved.alternative_measures' own observed-partition read applies); True when they differ" + }, + "value": { "anyOf": [ { - "type": "string", - "enum": [ - "no_member_has_data_at_place", - "no_member_asserts_bound_properties", - "only_alternate_has_data" - ] + "$ref": "#/components/schemas/GraphRef" }, { "type": "null" } ], - "title": "Gate", - "description": "optional; the failed quality gate's code from the platform registry, one of the three registry gate codes (no_member_has_data_at_place, no_member_asserts_bound_properties, only_alternate_has_data). The single home for the code regardless of which near-match field carries the Spec: present exactly when flagged_match or alternate_match is present, except a role_incompatible refusal before or during materialise whose flagged_match records the confirmed elected identity without a gate (role incompatibility prevents an availability verdict), a qualifier_not_bound refusal, whose flagged_match records the graph-confirmed elected spec without a gate because the qualifier guard refuses before an availability verdict exists, or a denominator_not_available refusal, whose flagged_match records the elected spec the form or denominator check refused. Absent on every other no_data outcome. At most one of flagged_match and alternate_match is present at a time." + "description": "the single value every served member that declares one for this axis agrees on; present only when varies is False and at least one member declares a value, absent when varies is True or every member declares nothing" }, - "flagged_match": { + "distinct_count": { + "type": "integer", + "title": "Distinct Count", + "description": "how many distinct declared values the served members actually exhibit for this axis, not counting a member that declares nothing. 0 when every member declares nothing, 1 when varies is False and value is set. Counted over the served members' own declarations, independent of this response's observation window: a query's applied when-slot narrows which observation points are returned, not which constraint values a member declares, so this count is never scoped to that window the way an observation-count field on this contract is" + }, + "undeclared_count": { + "type": "integer", + "title": "Undeclared Count", + "description": "how many served members declare no value at all for this axis. A member whose arc names the axis but never resolved to a dcid counts here too, the same as a member that never asserted the axis at all" + }, + "values": { + "items": { + "$ref": "#/components/schemas/OpenAxisValueCount" + }, + "type": "array", + "title": "Values", + "description": "every declared value with the number of served members declaring it, highest count first, then by dcid. Each served StatVar counts once, also after a merge of answers that serve it more than once, so the counts plus undeclared_count sum to the distinct served members. Labels as for value" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "property", + "varies", + "distinct_count", + "undeclared_count" + ], + "title": "OpenConstraintAxisFact", + "description": "One constraint axis the query left open, and what this Spec's own\nserved StatVar members exhibit on it (see ResolvedSpec.open_axis_facts):\nwhether they agree on a single declared value or differ, what that\nagreed value is when one exists, how many distinct values the axis\nactually served, and how many declare none at all." + }, + "Operation": { + "properties": { + "verb": { + "type": "string", + "enum": [ + "rank", + "aggregate", + "growth", + "share_of", + "explain", + "forecast", + "report" + ], + "title": "Verb", + "description": "what the question asks to compute: rank, aggregate, growth, share_of, explain, forecast, or report" + }, + "phrase": { + "type": "string", + "maxLength": 200, + "minLength": 1, + "title": "Phrase", + "description": "the query wording that asks for the operation, e.g. 'top 5 donors'; one line with no control characters or line separators, and not blank" + }, + "over": { "anyOf": [ { - "$ref": "#/components/schemas/Spec" + "type": "string", + "enum": [ + "place", + "origin", + "destination", + "category", + "year" + ] }, { "type": "null" } ], - "description": "optional; the elected variable's own Spec, present whenever gate fired and a groundable identity exists for the elected shape, or for a role_incompatible, qualifier_not_bound or denominator_not_available refusal that records its graph-confirmed identity without a gate: role incompatibility prevents an availability verdict, the qualifier guard refuses before one exists, and the denominator check refuses the series for its form, not its data. See gate for which check failed. available_at_place is False and confidence is low on gate=no_member_has_data_at_place; both stay at their not-assessed default (None) on gate=no_member_asserts_bound_properties, since there is no resolved place to be unavailable at. Absent on gate=only_alternate_has_data, where no groundable Spec for the elected shape exists; alternate_match carries the substitute the engine found instead. Distinct from nearest_real, up to two constraint-RELAXED specs that DO have data nearby. flagged_match is the elected variable itself, unavailable as the request asked for it." + "title": "Over", + "description": "the axis the operation runs across (place, origin, destination, category, or year); null when the verb names none, as explain does. The part leaves this axis open, so its data covers every value the operation needs" }, - "alternate_match": { + "target_year": { "anyOf": [ { - "$ref": "#/components/schemas/Spec" + "type": "integer", + "maximum": 2200.0, + "minimum": 1000.0 }, { "type": "null" } ], - "description": "optional; a categorically different, data-bearing variable the request did not elect, present exactly when gate == 'only_alternate_has_data'. elected_count still counts the variable the request actually asked for; alternate_match is the one substitute the engine found nearby with observations of its own. Distinct from flagged_match (the elected variable itself, present on the other two gates) and from nearest_real (up to two constraint-relaxed variants of the SAME variable). alternate_match always names a different variable." + "title": "Target Year", + "description": "the year a forecast projects to, e.g. 2050 for 'forecast aid to Ethiopia to 2050'; set only on a forecast, a four-digit year up to 2200. The raw_text door sets it only to a year after the current one, and leaves it null when the question names none; a posted value is taken as given within the bound, whatever today's date. It is kept apart from the part's time_text, the years whose data the part fetches, and does not affect resolution" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "verb", + "phrase" + ], + "title": "Operation", + "description": "One computation the question asks for over a part's data, which search\ndoes not perform: the part answers with the data the operation needs, and\nthe operation rides on the part for a client to perform or hand on." + }, + "OperationEnvelope": { + "properties": { + "operation_id": { + "type": "string", + "pattern": "^op_", + "title": "Operation Id", + "description": "`op_` plus the SHA-256 of the subject and its sorted member dcids, the origin catalogue build, and the rendering key. A repeat submission with the same identity joins the running operation and returns this id. Synchronous builds coalesce per API instance only." }, - "elected_count": { + "status": { + "type": "string", + "enum": [ + "pending", + "running", + "done", + "failed" + ], + "title": "Status" + }, + "poll": { "anyOf": [ { - "type": "integer" + "type": "string" }, { "type": "null" } ], - "title": "Elected Count", - "description": "optional; how many StatVars the request actually elected. Present whenever the elected shape's variable identity was graph-confirmed, whatever no_data reason or gate the outcome ultimately carries. None when the outcome stops short of a graph-confirmed identity altogether (variable_not_resolved, role_not_resolved, role_signature_incompatible, and binding_mismatch all resolve no StatVar to count). Counts the SAME variable as flagged_match whenever flagged_match is present. On gate=only_alternate_has_data, where flagged_match is absent, elected_count still counts the variable the request elected, distinct from alternate_match's different variable." - }, - "entity_terms": { - "items": { - "type": "string" - }, - "type": "array", - "title": "Entity Terms", - "description": "the query entity text responsible for the outcome, in query order: every entity the engine could not resolve for entity_not_resolved, every ambiguous wording for entity_ambiguous, every resolved-but-unadmitted entity for entity_role_not_admitted, every name whose flow direction the query leaves untold for role_not_resolved, and every whole population the query directs to the other side of the flow for role_incompatible, which is empty when the refusal has another cause. Empty for every other no_data reason. This structured list is the client-facing source of those terms; rendered_sentence may quote the same wording for people, but clients must not parse it." - }, - "ambiguous_entities": { - "items": { - "$ref": "#/components/schemas/AmbiguousEntityGroup" - }, - "type": "array", - "title": "Ambiguous Entities", - "description": "every ambiguous wording responsible for an entity_ambiguous outcome, in query order, each paired with the graph candidates it could name. Empty for every other no_data reason. Invariant: every group's `text` equals some restatement.entities[i].text on the same part. Additive to entity_terms, which carries the same wordings as bare strings; rendered_sentence is unaffected by this field and quotes the same wordings and candidate names for people, but clients must not parse it." - }, - "source_terms": { - "items": { - "type": "string" - }, - "type": "array", - "title": "Source Terms", - "description": "the source wordings responsible for a source-resolution outcome, in query order: every included wording that matched no admitted source for source_not_resolved, every ambiguous wording for source_ambiguous, and the part's source_code for source_code_not_held, source_code_ambiguous and source_code_shares_variable. Empty for every other no_data reason. rendered_sentence may quote the same wording for people, but clients must not parse it." - }, - "ambiguous_sources": { - "items": { - "$ref": "#/components/schemas/AmbiguousSourceGroup" - }, - "type": "array", - "title": "Ambiguous Sources", - "description": "every ambiguous source wording responsible for a source_ambiguous outcome, in query order, each paired with the admitted sources it could name, and for source_code_ambiguous the part's source_code paired with the provenances holding it. Empty for every other no_data reason. A client posts the matching entry of options." + "title": "Poll" }, - "unit_alternatives": { + "retry_after_ms": { "anyOf": [ { - "items": { - "$ref": "#/components/schemas/UnitAlternative" - }, - "type": "array" + "type": "integer" }, { "type": "null" } ], - "title": "Unit Alternatives", - "description": "the currencies a unit_not_resolved outcome offers, in the binder's order: the candidate ISO codes for an ambiguous currency name with no declared alias (XOF, XAF and CHF for 'francs'), or the role shapes for a role-relative currency phrase beside entities on two roles. Absent on every other outcome, and on a unit_not_resolved outcome the binder offers no candidates for" - }, - "unbound_qualifiers": { - "items": { - "$ref": "#/components/schemas/ResolvedQualifier" - }, - "type": "array", - "title": "Unbound Qualifiers", - "description": "the ResolvedQualifier entries responsible for a qualifier_not_bound outcome, in query order: every entry from flagged_match.resolved.trace.query_qualifiers whose disposition is not \"bound\" (\"unbound\": a named code row exists but no final binding covers it; \"no_vocabulary\": the text names no code at all), then, for a part naming or leaving out sources, each source it could not bind, an \"unbound\" entry under the source's label whose named holds the source's references. Empty for every other no_data reason. This structured list is the client-facing source of which terms went unrecognised, alongside each one's own disposition; rendered_sentence may quote the same wording for people, but clients must not parse it." + "title": "Retry After Ms", + "description": "Milliseconds to wait before the next poll. Present on the 202 submit response and on every pending or running poll. Absent on a done poll. It grows as the build runs, at a quarter of the time since the operation's current submission, from 1,500 to 8,000. The `Retry-After` response header carries the same value in whole seconds, rounded up." }, - "denominator": { + "progress": { "anyOf": [ { - "$ref": "#/components/schemas/NoDataDenominator" + "$ref": "#/components/schemas/OperationProgress" }, { "type": "null" } - ], - "description": "the denominator the question named and the one the flagged match divides by, set on every denominator_not_available refusal the engine returns after electing a series; null for every other no_data reason. A client can offer the flagged match, or fetch its nearest_real level and the denominator asked and divide them" + ] + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "operation_id", + "status" + ], + "title": "OperationEnvelope" + }, + "OperationProgress": { + "properties": { + "rows_written": { + "type": "integer", + "title": "Rows Written" }, - "options": { - "items": { - "$ref": "#/components/schemas/NoDataOption" - }, - "type": "array", - "title": "Options", - "description": "one ready request per choice of an entity_ambiguous, source_ambiguous, source_code_ambiguous, role_not_resolved or unit_not_resolved refusal, in query then candidate order. An entity option pins the candidate on every row with the ambiguous wording and every entity that resolved to one node; named groups, sets read as members and other ambiguous wordings stay unpinned, so a second ambiguity refuses again with the first pick kept. A candidate that is a group's own node, asked for its members, posts the group's registry name with no dcid, and has no option when no registry name resolves to the group alone. A source option sets the candidate's ref on the ambiguous mention; a source-code option names the holding provenance as the part's only included source. A role option states a direction for every name the question left unstated, so that every axis the shape declares a role on and the part does not ask open holds a place, offered while that gives at most six readings. A unit option names one of unit_alternatives in place of the ambiguous currency words. An option whose part breaks the ParsedPart bounds, or states a direction its own wording contradicts, is left out. Empty for other reasons; when the part's inputs exceed the ParsedPart bounds; on a role_not_resolved refusal with more than six readings, with no reading that leaves a place on every such axis, whose readings were all read with none holding data, or that the shape refused before placing names; and on a unit_not_resolved refusal without unit_alternatives" + "estimate_rows": { + "type": "integer", + "title": "Estimate Rows" } }, "additionalProperties": false, "type": "object", "required": [ - "reason" + "rows_written", + "estimate_rows" ], - "title": "NoData", - "description": "Outcome when no grounded result can be returned." + "title": "OperationProgress", + "description": "`rows_written` against `estimate_rows`, read live off\n`datasets.operation` at poll time (`datasets_api.operation_store\n.Operation`). Present on a `pending`/`running` operation's own\nenvelope; omitted from the `202` submit envelope (nothing has run\nyet) and from a terminal (`done`/`failed`) operation's own envelope,\nwhose outcome the sibling `manifest` field, or the poll route's own\n`operation_failed` refusal, already carries in full." }, - "NoDataDenominator": { + "OperationResource": { + "$id": "https://schemas.dfo.one.org/datasets/v1/operation-resource.json", "properties": { - "asked": { + "operation": { + "$ref": "#/components/schemas/OperationEnvelope" + }, + "manifest": { "anyOf": [ { - "$ref": "#/components/schemas/GraphRef" + "additionalProperties": true, + "type": "object" }, { "type": "null" } ], - "description": "the denominator the question named, as the search read it from the bases the candidate series divide by; null when the question named none, or named one that no candidate series divides by" + "title": "Manifest" }, - "found": { + "error": { "anyOf": [ { - "$ref": "#/components/schemas/GraphRef" + "additionalProperties": true, + "type": "object" }, { "type": "null" } ], - "description": "the denominator the flagged match divides by; null when it states none (a level such as an amount in US dollars, or a series whose name alone gives its base)" + "title": "Error" } }, "additionalProperties": false, "type": "object", - "title": "NoDataDenominator", - "description": "The denominators a denominator_not_available refusal compared: the one the question\nnamed and the one its flagged match divides by -- NoData.denominator." + "required": [ + "operation" + ], + "title": "OperationResource", + "description": "`GET /api/datasets/operations/{operation_id}`'s poll response. The\ncapability document reports `operation_envelope_active: true`, and this\nis the shape the route returns for a known operation id in `pending`,\n`running`, or `done` state. A `failed` operation raises the platform's\nordinary refusal path instead (`operation_failed`), and an unknown or\nunauthorized-`done` id answers 404 `operation_not_found` -- neither\nreturns this shape.\n\n`manifest` is set only once `operation.status == \"done\"`: the same\nmanifest a synchronous mint returns, read at poll time\n(`datasets_api.doors.meta`'s operations route reuses `datasets_api\n.doors.snapshot.read_snapshot_manifest` against the operation's own\nstored `subject_id`/`content_version`). `error` models a `failed`\noperation's outcome inline with this resource's own shape, but the\ndoor never populates it: a `failed` operation raises the platform's\nordinary refusal path instead (`operation_failed`, a bare RFC 9457\nbody, the same pattern `operation_not_found` already uses on this\nroute -- see the registry's own `datasets.operations` mapping), so a\npoll never reaches this model at all once the underlying operation\nhas failed. `error` stays declared for schema completeness -- this is\na contract-stable, immutable-`$id` shape -- but no code path fills it." }, - "NoDataOption": { + "Option": { "properties": { - "mentions": { - "items": { - "type": "string" - }, - "type": "array", - "title": "Mentions", - "description": "the request's own words this option settles, in query order: the ambiguous entity wording, the ambiguous source wording, the part's source_code, the part's unit_text, or for role_not_resolved every name whose direction the option states" + "option_id": { + "type": "string", + "maxLength": 128, + "pattern": "^(sector|region|measure_basis|provider):[A-Za-z0-9_+]+$", + "title": "Option Id", + "description": "the option's id" }, "label": { "type": "string", "title": "Label", - "description": "the choice in words for a menu: the candidate's display name, prefixed 'Excluding' for a source the part excludes; for role_not_resolved the direction the option reads, such as 'France to Germany' or 'To Kenya and Uganda'; for a role currency the role's currency, such as \"recipient's currency\". Clients must not parse it" - }, - "data_query": { - "$ref": "#/components/schemas/ParsedInput", - "description": "a one-part parsed input settling this choice only. Post it unchanged as the input of /api/search/resolve; its one part is a dataset_resubmit parsed entry's part. A second ambiguous wording refuses again. Whether data exists for it is not checked" + "description": "the option for a reader" }, - "entity_choice": { - "anyOf": [ + "binding": { + "oneOf": [ { - "type": "integer", - "minimum": 0.0 + "$ref": "#/components/schemas/SlotBinding" }, { - "type": "null" + "$ref": "#/components/schemas/EntitiesBinding" + }, + { + "$ref": "#/components/schemas/ShapeBinding" + }, + { + "$ref": "#/components/schemas/ProviderBinding" } ], - "title": "Entity Choice", - "description": "for an entity_ambiguous option, the index into NoData.ambiguous_entities of the group this option settles; null on every other option. Two groups can share one wording ('aid from Congo to Congo' asks 'Congo' for each end), so a client groups an entity menu by this index, never by mentions, and joins it to the sentence slot token with the same entity_choice" + "title": "Binding", + "description": "what the option binds in the identity", + "discriminator": { + "propertyName": "kind", + "mapping": { + "entities": "#/components/schemas/EntitiesBinding", + "provider": "#/components/schemas/ProviderBinding", + "shape": "#/components/schemas/ShapeBinding", + "slot": "#/components/schemas/SlotBinding" + } + } + }, + "availability": { + "$ref": "#/components/schemas/OptionAvailability", + "description": "whether a switch to it can be served" } }, "additionalProperties": false, "type": "object", "required": [ - "mentions", + "option_id", "label", - "data_query" + "binding", + "availability" ], - "title": "NoDataOption", - "description": "One answer to the choice a no_data refusal asks for: the words it settles, a label\nfor people, and the request that settles them. It is one entry of NoData.options." + "title": "Option", + "description": "One value a scope choice can take." }, - "NoDataPart": { + "OptionAvailability": { "properties": { - "variable_text": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } + "status": { + "type": "string", + "enum": [ + "available", + "partial", + "unavailable" ], - "title": "Variable Text", - "description": "the variable text this part answers, in the order asked. This part's position in Resolution.parts equals the same variable_index every SSE event keyed by variable_index uses (ShapeEvent, StepEvent, SentenceEvent). Every dataset_resubmit entry kind (identity, candidates, placeholder, and parsed through its nested ParsedPart) requires its own posted variable_text, so this field is always the posted text echoed back onto the rebuilt part, never null. Null only when the whole posted query was empty or whitespace-only (raw_text door), which refuses variable_not_resolved before extraction runs and so has no text to name." - }, - "separate": { - "type": "boolean", - "title": "Separate", - "description": "true when this part was asked beside the others to be compared with them. A client resubmitting an identity, candidate set, or placeholder posts this flag on that entry to preserve the comparison. Two parts marked separate that resolve to one reading carry the same spec_id and stay two parts. False, the default, is omitted", - "default": false - }, - "warnings": { - "items": { - "$ref": "#/components/schemas/Warning" - }, - "type": "array", - "title": "Warnings", - "description": "this part's own run-health signals. A part folded into an earlier part's spec (see DefinitePart.spec) carries binding_folded alone. The merged spec's own resolved warnings live only on the first part that carries it. An unfolded part carries the warnings raised while resolving this part, plus observations_omitted on a candidates part when response_options.include_observations was set." + "title": "Status", + "description": "available, partial or unavailable" }, - "timing_ms": { + "years": { "anyOf": [ { - "$ref": "#/components/schemas/Timing" + "items": { + "prefixItems": [ + { + "type": "integer" + }, + { + "type": "integer" + } + ], + "type": "array", + "maxItems": 2, + "minItems": 2 + }, + "type": "array" }, { "type": "null" } ], - "description": "this part's own latency breakdown, where by_step names only the phases this part ran and total sums them, leaving out the shape_* stages nested inside shape. Excludes the shared, once-per-request steps (e.g. extract), which diagnostics.timing_ms.by_step carries once for the whole request; distinct too from diagnostics.timing_ms.total, the whole request's wall-clock elapsed time." + "title": "Years", + "description": "the years a partial option covers, as closed spans; None otherwise" }, - "rendered_sentence": { + "code": { "anyOf": [ { - "type": "string" + "type": "string", + "enum": [ + "provider_not_offered", + "imputed_coverage", + "basis_not_published", + "residuals_need_summed_region", + "conflicts_with", + "carried_choice_not_applied", + "stated_choice_not_applied", + "option_not_covered", + "contributions_counted" + ] }, { "type": "null" } ], - "title": "Rendered Sentence", - "description": "a human-readable string. For candidates, a header naming how many readings there are ('3 readings.'), then each shown candidate's heading and a byline led by the source and span that set it apart; for no_data, a heading in the same claim form naming the entity, measure, and counterpart that were checked. Either ends with the text of this part's departures, in order, and a candidates part's then closes with its assumptions clause. For a definite part this stays null or omitted: the confirmation sentence (heading and byline) lives at spec.resolved.rendered_sentence, and its departures reach the envelope's composed sentence." + "title": "Code", + "description": "why the option is partial or unavailable; None when available" }, - "sentence_plan": { + "detail": { + "additionalProperties": { + "type": "string" + }, + "type": "object", + "title": "Detail", + "description": "the code's parameters: `why` for provider_not_offered, `dataset` for basis_not_published and contributions_counted, `entry` and `cause` for conflicts_with" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "status" + ], + "title": "OptionAvailability", + "description": "Whether an option can be served, and why not." + }, + "OptionsEnvelope": { + "properties": { + "schema_version": { + "type": "integer", + "title": "Schema Version", + "default": 1 + }, + "definition": { + "$ref": "#/components/schemas/DefinitionModel" + }, + "content_version": { + "type": "string", + "title": "Content Version" + }, + "coverage": { + "$ref": "#/components/schemas/CoverageModel" + }, + "output_options": { "anyOf": [ { - "items": { - "$ref": "#/components/schemas/SentenceToken" - }, - "type": "array" + "$ref": "#/components/schemas/OutputOptionsModel" }, { "type": "null" } - ], - "title": "Sentence Plan", - "description": "the ordered token form of rendered_sentence, present whenever it is. For a definite part this stays null or omitted. spec.resolved.sentence_plan carries the confirmation sentence's own plan instead." + ] }, - "restatement": { + "warnings": { + "items": { + "$ref": "#/components/schemas/WarningModel" + }, + "type": "array", + "title": "Warnings" + }, + "trace": { + "$ref": "#/components/schemas/TraceModel" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "definition", + "content_version", + "coverage", + "trace" + ], + "title": "OptionsEnvelope", + "description": "`GET /api/datasets/{id}/options`'s response. It is the projection\nof a materialising door's manifest onto the fields this route's callers\nneed (content_version, coverage, output_options, warnings, trace). The\nroute serves with no rendering (`doors.definition._serve_spec_options`),\nso no reshape runs and `warnings` here excludes reshape-level warnings\nsuch as `enrichment_unavailable`." + }, + "OptionsFor": { + "properties": { + "role": { + "type": "string", + "title": "Role", + "description": "the resolved entity role to enumerate candidates for (e.g. 'origin', 'destination', 'observationAbout' -- the vocabulary is derived per family, not frozen here). Deliberately a plain str, NEVER a Literal or enum: the target is checked only AFTER the posted identity resolves to StatVars, refusing option_target_invalid (422) for a role the resolved family does not carry. A Literal/enum would instead refuse an unrecognised role at the pydantic validation layer as request_invalid (400), before resolution ever runs -- do not tighten this to an enum." + }, + "scope": { "anyOf": [ { - "$ref": "#/components/schemas/ParsedPart" + "type": "string", + "enum": [ + "peers", + "children" + ] }, { "type": "null" } ], - "description": "the ParsedPart that reproduces this part's own resolution inputs -- the same entities, resolved time window, unit text, and source text the engine actually used to resolve this one leg -- so a client holding this part alone can copy it straight into a fresh ParsedInput.parts entry and re-resolve it faithfully, without flattening it into the whole query's variable_text the way variable_text alone would. Canonical, not verbatim: for a raw_text part, time_text is the equivalent phrase this door's own time grammar recognises (e.g. '2015 to 2020'), not the user's original words, since the engine's date extraction keeps only the structured window and discards the phrasing. Null whenever this part has no faithful echo to give. On a dataset_resubmit entry's identity/candidates/placeholder kinds, which post an identity or stub rather than a phrase and have no per-part resolution inputs to echo -- a dataset_resubmit parsed entry, genuinely re-resolved from its own posted ParsedPart, carries a real one like any parsed-door part. Also null when this leg's entity was bound to a directional role axis (origin/destination) and no door-supplied role named that axis, since an echo without the axis would resubmit the request with that entity reversed. Also null when one of this leg's own inputs does not fit ParsedPart's own field caps, since a truncated echo would misrepresent what was actually resolved." - }, - "entity_refs": { - "items": { - "$ref": "#/components/schemas/EntityRefs" - }, - "type": "array", - "title": "Entity Refs", - "description": "the binding of each entity of `restatement`, one per restatement.entities row, in row order, so a client can tell which node a text such as 'G7' bound. A response field kept off `restatement`, which posts back unchanged. The binding is the one the answer reads: for a candidates part, the elected reading's; for a part folded into an earlier part's spec, its own. [] when `restatement` is null or names no entity" - }, - "operations": { - "items": { - "$ref": "#/components/schemas/Operation" - }, - "type": "array", - "title": "Operations", - "description": "the operations the question asks for over this part's data, in query order; the engine echoes them onto the part it resolves. Empty when the question asks for none" - }, - "departures": { - "items": { - "$ref": "#/components/schemas/Departure" - }, - "type": "array", - "title": "Departures", - "description": "every way this part's answer differs from what its request asked, ordered by how much each changes the number: closest_match, measure_not_applied, operation_not_applied, breakdown_not_applied, entity_unavailable, year_unavailable, modelled_values, group_read_as_members, whole_total_read, whole_total_unpublished, direction_discarded, direction_inferred, scope_limited. [] when the answer is what was asked. A client that renders its own sentence reads them here; each one's text also closes the sentence that carries this part (see Departure.text). A warning on the same part reports run health and stays separate" + "title": "Scope", + "description": "which candidate universe to enumerate for a role whose options are derived from the graph rather than a curated list; absent means 'peers'. 'peers' enumerates entities sharing the bound entity's own type; 'children' enumerates entities contained in it. Roles backed by a curated candidate list ignore this member, having only one universe to draw from. Naming a role alone cannot distinguish the two readings -- peers of a country and the regions within it are both 'options for observationAbout' -- and only the peers reading is recoverable from the identity, so without this member the contained-in reading is unreachable rather than merely unrequested." + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "role" + ], + "title": "OptionsFor", + "description": "Which resolved entity role the options door enumerates candidates for.\n\nWrapped in its own object (rather than a bare string field) so the wire\nbody reads `\"for\": {\"role\": \"destination\"}`, matching the contract's\nenvelope shape on both the request and the echoed response." + }, + "OptionsRequest": { + "properties": { + "schema_version": { + "type": "integer", + "const": 1, + "title": "Schema Version", + "description": "contract version the caller targets", + "default": 1 }, - "assumptions": { - "items": { - "$ref": "#/components/schemas/Assumption" - }, - "type": "array", - "title": "Assumptions", - "description": "every value the engine filled that the request did not ask for, in clause order. Declared defaults come first, in the order of the Spec's trace.slot_filters, then open roles, then the place scope. A declared default is a slot the request left open that its code system's or shape's declared default fixed, named by the bound code's full label. An open role is a flow role no request word asked for, read across every entity on it with data. It is either a role the role scope default filled (resolved.scope on that axis), whatever its member count, served as one series per member where the shape declares the role, or a role the heading states with no entity of its own ('from 164 providers', 'owed to all creditors'), served as the total over its members. A role the identity binds in entities or lists in open_roles, that one of the part's operations runs over ('top 5 donors'), or that the request's words asked every member of ('all donors'), is asked. The place scope is a request that named no place, read across every place with data. Every door fills assumptions. A definite part reads them from its Spec, a candidates part carries the items every list in CandidatesPart.reading_assumptions holds alike, text included, and no_data and unsupported parts carry []. A dataset_resubmit identity entry posts every slot bound, so its part states the items of the entry's assumptions echo that still hold (see ResubmitIdentityEntry.assumptions), and a candidates entry reads each reading with its candidate's echo (see ResubmitCandidate.assumptions). The sentence that carries this part closes with them as one segment='assumption' clause ('Assumed: official development assistance; every provider.'), after its departures. [] when the answer fills nothing" + "identity": { + "$ref": "#/components/schemas/BaseIdentity", + "description": "the identity to resolve and enumerate candidate options for" }, - "status": { - "type": "string", - "const": "no_data", - "title": "Status", - "description": "nothing to return" + "for": { + "$ref": "#/components/schemas/OptionsFor", + "description": "which resolved entity role to enumerate candidate options for" }, - "no_data": { - "$ref": "#/components/schemas/NoData", - "description": "the reason" + "include_coverage": { + "type": "boolean", + "title": "Include Coverage", + "description": "when true, the engine probes each returned option for observation coverage (e.g. 'Kenya — 205 obs') and populates SlotOption.coverage; false (the default) never fires the extra probe, so this is opt-in latency, not a hidden cost on the hot path. The only resolution option this door reads -- unlike /resolve's ResolveOptions, this door has no candidate cap or sentence concept, so it carries this one field directly rather than nesting a response_options object with members it would never use.", + "default": false } }, "additionalProperties": false, "type": "object", "required": [ - "status", - "no_data" + "identity", + "for" ], - "title": "NoDataPart", - "description": "Nothing could be returned for this part." + "title": "OptionsRequest", + "description": "Request body for the options door (POST /api/search/options): enumerate\nthe candidate set for one resolved entity role of a posted identity.\n\nAn identity block only. The door derives the identity's own StatVar\npopulation server-side (engine.options.population.options_population)\nrather than resolving a Spec through the resubmit path.\n\nvalidate_by_name=False (with validate_by_alias=True, the pydantic default\npairing made explicit here): the published schema declares only the alias\n`for`, and this model is otherwise extra=\"forbid\", so a wire body must be\nrejected for posting the internal Python attribute name `for_` instead --\naccepting both would let a client bypass the declared schema through the\nimplementation-detail spelling. `for_` exists only because `for` is a\nPython reserved word and cannot itself be an attribute name; every\nconstructor call (internal code, tests) builds this model through the\nalias instead, e.g. ``OptionsRequest(identity=..., **{\"for\": OptionsFor(...)})``." }, - "NodeRef": { + "OptionsResponse": { "properties": { - "ref": { - "type": "string", - "title": "Ref" + "schema_version": { + "type": "integer", + "const": 1, + "title": "Schema Version", + "description": "contract schema version; exactly 1 for v1", + "default": 1 }, - "label": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Label" + "diagnostics": { + "$ref": "#/components/schemas/Diagnostics", + "description": "run health, warnings, timing, build stamp" + }, + "for": { + "$ref": "#/components/schemas/OptionsFor", + "description": "the role this response's options were enumerated for, echoed back from the request" + }, + "options": { + "$ref": "#/components/schemas/OptionsSet", + "description": "the enumerated candidate set" } }, + "additionalProperties": false, "type": "object", "required": [ - "ref", - "label" + "diagnostics", + "for", + "options" ], - "title": "GraphNodeRef", - "description": "A graph reference. `label` is `null` when the target is not held, carries no `name`, or\ncarries only a `name` equal to its own dcid." + "title": "OptionsResponse", + "description": "Response for POST /api/search/options: `{schema_version, diagnostics,\nfor, options}`. Carries no semantic status: the door either refuses\n(through the same shared identity validation a dataset_resubmit identity\nentry runs) or returns options -- possibly an empty\nlist -- with no definite/candidates/no_data three-way to report on top.\n\nOmits graph_revision: no revision concept exists anywhere in src/ --\nnothing tracks the graph the way engine_build tracks the code build -- so\nstamping one here would assert a graph fact this deployment cannot back.\nLeft out deliberately rather than filled with something untrue." }, - "NodesRequest": { + "OptionsSet": { "properties": { - "dcids": { + "items": { "items": { - "type": "string", - "maxLength": 512, - "pattern": "^[A-Za-z0-9_.\\-]+(?:/[A-Za-z0-9_.\\-]+)*$" + "$ref": "#/components/schemas/SlotOption" }, "type": "array", - "maxItems": 50, - "minItems": 1, - "title": "Dcids" + "title": "Items", + "description": "candidate values, deterministically ordered; a dcid that failed to resolve a label is omitted rather than fabricated" + }, + "truncated": { + "type": "boolean", + "title": "Truncated", + "description": "true when items was capped before every candidate could be checked" } }, "additionalProperties": false, "type": "object", "required": [ - "dcids" + "items", + "truncated" ], - "title": "GraphNodesRequest", - "description": "`dcids`: 1 to `NODES_MAX_DCIDS` node dcids read as one batch, in one DCP-read\nexecutor job. Each dcid matches the GET route's `{dcid}` path syntax and its 512-character\nceiling." + "title": "OptionsSet", + "description": "The enumerated candidate set an options-door request returns.\n\nItems reuse SlotOption for shape parity with slot_options/entity_options\n({value, coverage}) rather than a simpler {ref, label, obs_count} shape --\nthe richer coverage form is what the engine already serves. An\nempty list is itself a valid result (e.g. the current recipient's\nvariable truly has no other recipient with data), not an error.\n\nCarries no graph_revision -- see OptionsResponse's docstring for why." }, - "NodesResponse": { + "OrganisationNode": { "properties": { - "nodes": { + "ref": { + "type": "string", + "title": "Ref", + "description": "the node's dcid" + }, + "label": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Label", + "description": "the node's name; for a Provenance, its parent Dataset's name where it has one. Null, and named in gaps, when the graph gives none" + }, + "types": { "items": { - "anyOf": [ - { - "oneOf": [ - { - "$ref": "#/components/schemas/StatVarNode" - }, - { - "$ref": "#/components/schemas/CodeSystemNode" - }, - { - "$ref": "#/components/schemas/CodeNode" - }, - { - "$ref": "#/components/schemas/GroupNode" - }, - { - "$ref": "#/components/schemas/CountryNode" - }, - { - "$ref": "#/components/schemas/ContinentNode" - }, - { - "$ref": "#/components/schemas/SubregionNode" - }, - { - "$ref": "#/components/schemas/ContinentalUnionNode" - }, - { - "$ref": "#/components/schemas/PlaceOtherNode" - }, - { - "$ref": "#/components/schemas/OrganisationNode" - }, - { - "$ref": "#/components/schemas/AggregateNode" - }, - { - "$ref": "#/components/schemas/UnitNode" - }, - { - "$ref": "#/components/schemas/SourceNode" - }, - { - "$ref": "#/components/schemas/DatasetNode" - }, - { - "$ref": "#/components/schemas/ProvenanceNode" - }, - { - "$ref": "#/components/schemas/OtherNode" - } - ], - "discriminator": { - "propertyName": "kind", - "mapping": { - "aggregate": "#/components/schemas/AggregateNode", - "code": "#/components/schemas/CodeNode", - "code_system": "#/components/schemas/CodeSystemNode", - "continent": "#/components/schemas/ContinentNode", - "continental_union": "#/components/schemas/ContinentalUnionNode", - "country": "#/components/schemas/CountryNode", - "dataset": "#/components/schemas/DatasetNode", - "group": "#/components/schemas/GroupNode", - "organisation": "#/components/schemas/OrganisationNode", - "other": "#/components/schemas/OtherNode", - "place_other": "#/components/schemas/PlaceOtherNode", - "provenance": "#/components/schemas/ProvenanceNode", - "source": "#/components/schemas/SourceNode", - "stat_var": "#/components/schemas/StatVarNode", - "subregion": "#/components/schemas/SubregionNode", - "unit": "#/components/schemas/UnitNode" - } - } - }, - { - "$ref": "#/components/schemas/NotHeldEntry" - } + "type": "string" + }, + "type": "array", + "title": "Types", + "description": "the node's typeOf values, as the graph holds them" + }, + "description": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Description", + "description": "the node's prose in the graph; null when it has none" + }, + "links": { + "additionalProperties": { + "type": "string" + }, + "propertyNames": { + "enum": [ + "codes", + "children", + "members", + "countries", + "datasets", + "variables", + "facets" + ] + }, + "type": "object", + "title": "Links", + "description": "each list relation the node has, mapped to its route; empty when none" + }, + "gaps": { + "items": { + "type": "string" + }, + "type": "array", + "title": "Gaps", + "description": "the member path of every value this door cannot know" + }, + "built_from": { + "additionalProperties": { + "type": "string" + }, + "propertyNames": { + "enum": [ + "code_index", + "origin_catalogue", + "coverage_index", + "membership" ] }, - "type": "array", - "title": "Nodes" - } - }, - "type": "object", - "required": [ - "nodes" - ], - "title": "NodesResponse", - "description": "`nodes` is index-aligned with the request's `dcids`: a repeated dcid repeats its\nentry. Each entry is the body `GET /api/graph/node/{dcid}` returns for that dcid, or a\n`not_held` entry where that route answers 404." - }, - "NotHeldEntry": { - "properties": { - "ref": { - "type": "string", - "title": "Ref" + "type": "object", + "title": "Built From", + "description": "the build of each table the response read" }, - "status": { + "kind": { "type": "string", - "const": "not_held", - "title": "Status", - "default": "not_held" + "const": "organisation", + "title": "Kind", + "default": "organisation" + }, + "organisation": { + "$ref": "#/components/schemas/PartyBlock" } }, "type": "object", "required": [ "ref", - "status" + "label", + "types", + "description", + "links", + "gaps", + "built_from", + "kind", + "organisation" ], - "title": "GraphNotHeldEntry", - "description": "A batch entry for a dcid where `GET /api/graph/node/{dcid}` answers 404\n`node_not_held`." + "title": "OrganisationNode" }, - "ObservationPoint": { + "OtherNode": { "properties": { - "date": { + "ref": { "type": "string", - "title": "Date", - "description": "the observation date, e.g. '2018'" + "title": "Ref", + "description": "the node's dcid" }, - "value": { + "label": { "anyOf": [ { - "type": "number" + "type": "string" }, { "type": "null" } ], - "title": "Value", - "description": "the observed value; null when the graph reports a date with no value" + "title": "Label", + "description": "the node's name; for a Provenance, its parent Dataset's name where it has one. Null, and named in gaps, when the graph gives none" + }, + "types": { + "items": { + "type": "string" + }, + "type": "array", + "title": "Types", + "description": "the node's typeOf values, as the graph holds them" + }, + "description": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Description", + "description": "the node's prose in the graph; null when it has none" + }, + "links": { + "additionalProperties": { + "type": "string" + }, + "propertyNames": { + "enum": [ + "codes", + "children", + "members", + "countries", + "datasets", + "variables", + "facets" + ] + }, + "type": "object", + "title": "Links", + "description": "each list relation the node has, mapped to its route; empty when none" + }, + "gaps": { + "items": { + "type": "string" + }, + "type": "array", + "title": "Gaps", + "description": "the member path of every value this door cannot know" + }, + "built_from": { + "additionalProperties": { + "type": "string" + }, + "propertyNames": { + "enum": [ + "code_index", + "origin_catalogue", + "coverage_index", + "membership" + ] + }, + "type": "object", + "title": "Built From", + "description": "the build of each table the response read" + }, + "kind": { + "type": "string", + "const": "other", + "title": "Kind", + "default": "other" } }, - "additionalProperties": false, "type": "object", "required": [ - "date", - "value" + "ref", + "label", + "types", + "description", + "links", + "gaps", + "built_from", + "kind" ], - "title": "ObservationPoint", - "description": "One (date, value) pair from a resolved StatVar's observation series." + "title": "OtherNode", + "description": "A node no other kind fits. `types` and `description` carry what the graph holds." }, - "ObservationSeries": { + "OutputOptionsModel": { "properties": { - "stat_var": { - "$ref": "#/components/schemas/SeriesStatVarRef", - "description": "the StatVar these points observe" + "capability_version": { + "type": "string", + "title": "Capability Version" }, - "entities": { + "columns": { "items": { - "$ref": "#/components/schemas/SeriesEntityRef" + "$ref": "#/components/schemas/ColumnOptionModel" }, "type": "array", - "title": "Entities", - "description": "the role tuple this series observes -- one entry for a standard single-role series (role='observationAbout'), two for a dev-finance bilateral series (role='origin' and role='destination')" + "title": "Columns" }, - "axes": { + "formats": { "items": { - "$ref": "#/components/schemas/SeriesAxisRef" + "$ref": "#/components/schemas/FormatOptionModel" }, "type": "array", - "title": "Axes", - "description": "one entry per constraint the StatVar declares with a resolved value, ordered by property dcid; empty for a StatVar with no constraints. A client names each property from the Spec's slots" + "title": "Formats" }, - "points": { + "bundle": { + "$ref": "#/components/schemas/BundleOptionModel" + }, + "enrichments": { "items": { - "$ref": "#/components/schemas/ObservationPoint" + "$ref": "#/components/schemas/EnrichmentOptionModel" }, "type": "array", - "title": "Points", - "description": "chronological observation points from the series' lead observation facet (see SpecObservations), plus the points of the same source's estimates continuing the series past the lead's last period when it has any -- the `modelled_values` departure marks those -- filtered to the spec's requested window when one exists; the full in-window series when SpecObservations.truncated is false, else at most the latest points (bounded by the server's preview-points setting and its per-series row limit)" + "title": "Enrichments" }, - "total_obs": { - "type": "integer", - "title": "Total Obs", - "description": "this series' SELECTED facet's in-window point count (before truncation) -- a per-series figure alongside SpecObservations.total_obs's aggregate across every series. For a scope-defaulted bulk latest-only series (no requested window), this is the coverage probe's all-time obs_count for that entity's selected facet -- the in-window count too, since no window narrows it" + "long_layout_defaults": { + "items": { + "type": "string" + }, + "type": "array", + "title": "Long Layout Defaults", + "description": "the enrichment tokens a long-layout download writes with no columns option, in column order: every role's {role}_label, and {role}_kind for every role on a flow axis, the party's kind in words: official or private on the provider or creditor side, country or organisation on the recipient or debtor side, total, whole total (a total that holds every party of its group in that row's dataset and year) or unallocated. Naming one in columns gives the same column once" }, - "source_refs": { + "long_layout_totals": { "items": { - "$ref": "#/components/schemas/ProvenanceRef" + "type": "string" }, "type": "array", - "title": "Source Refs", - "description": "provenance of the lead observation facet these points were read from (the facet selected for this series -- see SpecObservations)" + "title": "Long Layout Totals", + "description": "the roles whose total rows ({role}_kind is total or whole total) a long-layout CSV or XLSX download keeps out of its main table. A private party stays in it. A role is listed when the definition binds it to several entities one of which the code index declares a total, or leaves it open and the code index lists a total on its axis in a dataset the definition read (any dataset, when the read selected none). A role bound to several parties holds no total row and is not listed. A bundle's CSV writes those rows to a second data file, data/-totals.csv; an XLSX writes them on a second sheet, totals. A bare CSV has no README and drops them, so this list names the roles whose totals it drops. Parquet, a pivot and the frame layout keep every row. Empty when no role can hold a total row" + }, + "pivots": { + "items": { + "$ref": "#/components/schemas/PivotOptionModel" + }, + "type": "array", + "title": "Pivots" + }, + "groupby": { + "$ref": "#/components/schemas/GroupbyOptionsModel" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "capability_version", + "columns", + "formats", + "bundle", + "enrichments", + "long_layout_defaults", + "long_layout_totals", + "pivots", + "groupby" + ], + "title": "OutputOptionsModel", + "description": "The reshape options this frame supports, joined from its stored\n`materialise.profile.OutputProfile` and the current capability\ndocument." + }, + "ParsedEntity": { + "properties": { + "text": { + "type": "string", + "maxLength": 128, + "minLength": 1, + "title": "Text", + "description": "the entity's text as the caller identified it: the request's own words for it, which name resolution reads and a rendered sentence quotes" + }, + "name": { + "anyOf": [ + { + "type": "string", + "maxLength": 128, + "minLength": 1 + }, + { + "type": "null" + } + ], + "title": "Name", + "description": "the entity's name, when its words (`text`) could name more than one entity and no `dcid` pins it: the row's identity, which keys its role and members within the part. Name resolution reads `text` with `name` beside it, as the raw-text door reads a query's words beside the name extraction gave them, so two rows whose words are alike stay two entities. Words that differ from `name` only in case read as `name`, and one `name` posted with two texts that differ beyond case in a part refuses `request_invalid`. Without it, `text` is the identity; a `name` equal to `text` is the field left out, and a `name` beside a `dcid` is invalid. A row no dcid pins whose identity, its `name` or else its `text`, is a dcid another row of the part pins refuses `request_invalid` at the row" + }, + "role_text": { + "anyOf": [ + { + "type": "string", + "maxLength": 64, + "minLength": 1 + }, + { + "type": "null" + } + ], + "title": "Role Text", + "description": "the caller's free-form role hint for this entity, when available; recognised words (case-insensitive) are 'from'/'to' and synonyms such as donor/provider/funder/source/creditor/lender/exporter for the 'from' side, recipient/beneficiary/debtor/borrower/importer for the 'to' side -- unrecognised text warns role_text_not_recognised and the entity is treated as undirected" }, - "facet": { - "additionalProperties": { - "$ref": "#/components/schemas/SeriesFacetRef" - }, - "type": "object", - "title": "Facet", - "description": "this series' lead observation facet, per axis (provenance/measurementMethod/unit); the estimates continuing the series keep the lead's entry; sparse -- an axis the facet carries no value for is absent, never a null placeholder. provenance here always agrees with source_refs, since both derive from the same lead facet" + "dcid": { + "anyOf": [ + { + "type": "string", + "minLength": 1 + }, + { + "type": "null" + } + ], + "title": "Dcid", + "description": "an optional caller-pinned dcid for this entity, naming exactly which graph node `text` refers to -- the door a client with a candidate's dcid in hand (e.g. from NoData.ambiguous_entities) posts through, instead of relying on name resolution to disambiguate `text` on its own. When present, this entity's name resolution is skipped: the pinned dcid seeds the entry's pre_resolved map directly, still confirmed against the graph. An unconfirmable dcid (absent from the graph, or present but type-less) refuses invalid_role_ref (422). `text` stays required and is not re-derived from the dcid; it is still what a rendered sentence and any further restatement echo back. The dcid is the row's identity, so rows pinning one dcid under different texts are one entity, whose words are the first row's. A row no dcid pins whose `name`, or else `text`, is this dcid refuses request_invalid at that row." }, - "conversion": { + "members": { "anyOf": [ { - "$ref": "#/components/schemas/ObservationSeriesConversion" + "type": "boolean" }, { "type": "null" } ], - "description": "what recipe and tables converted this series' points to the requested currency; absent on a series served in its native facet" + "title": "Members", + "description": "true asks for the members of the set `text` names, each as its own series: the countries of a continent or UN subregion, or the members of a group. It has no effect on a single place. Text whose wording names members, such as 'EU member states', reads as true without the flag. With a pinned `dcid` it is honoured for a continent or subregion that the membership policy holds or omits, whatever the node's graph type, and refuses request_invalid for a group's own node, whose members a pin cannot supply. One part names a set once on each flow end its `role_text` gives, so one entity can be asked for as its members on one end and whole on the other; the same entity posted with both values on one end, or with both values and a row with no recognised `role_text`, refuses request_invalid" } }, "additionalProperties": false, "type": "object", "required": [ - "stat_var", - "entities", - "points", - "total_obs" + "text" ], - "title": "ObservationSeries", - "description": "One (stat_var, role tuple) pair's observation points, in chronological order." + "title": "ParsedEntity", + "description": "One entity mentioned in a parsed part, with an optional caller-supplied role hint." }, - "ObservationSeriesConversion": { + "ParsedInput": { "properties": { - "recipe_id": { + "kind": { "type": "string", - "title": "Recipe Id", - "description": "the ConversionRecipe.recipe_id that produced these points" - }, - "table_provenance": { - "$ref": "#/components/schemas/SeriesFacetRef", - "description": "the Provenance node both the exchange-rate and (when present) deflator tables loaded under" + "const": "parsed", + "title": "Kind", + "description": "discriminator for pre-parsed input", + "default": "parsed" }, - "exchange_rate_table_version": { - "type": "string", - "title": "Exchange Rate Table Version", - "description": "the exchange-rate table's own version" + "parts": { + "items": { + "$ref": "#/components/schemas/ParsedPart" + }, + "type": "array", + "maxItems": 6, + "minItems": 1, + "title": "Parts", + "description": "one entry per variable ask; conjunctions pre-split by the caller. Parts that are byte-identical across every field collapse to one before resolution, so the response's own parts list can hold fewer entries than this list." }, - "deflator_table_version": { + "raw_query": { "anyOf": [ { - "type": "string" + "type": "string", + "maxLength": 2000, + "minLength": 1 }, { "type": "null" } ], - "title": "Deflator Table Version", - "description": "the deflator table's own version; absent for a current-prices conversion" - }, - "fallback_count": { - "type": "integer", - "title": "Fallback Count", - "description": "rows whose deflator-role entity was substituted with the recipe's fallback entity" - }, - "fallback_examples": { - "items": { - "$ref": "#/components/schemas/SeriesConversionFallbackExample" - }, - "type": "array", - "title": "Fallback Examples", - "description": "a capped, sorted sample of the substituted (entity, fallback_entity) pairs" + "title": "Raw Query", + "description": "original query text, for echo only; does not affect resolution" }, - "projected_count": { - "type": "integer", - "title": "Projected Count", - "description": "rows whose rate/deflator term was sourced from a projected table row" + "user_message": { + "anyOf": [ + { + "type": "string", + "maxLength": 4000, + "minLength": 1 + }, + { + "type": "null" + } + ], + "title": "User Message", + "description": "the user's own message for the turn, as written. On a request of one part, the scope words it states ('bilateral', 'excluding multilateral', 'net', 'gross', 'grant equivalent', 'commitments') become explicit scope entries and 'total' a total intent, read in place of the part's variable_text. A request of several parts reads each part's own variable_text, so one part's words never reach another. None reads the part's variable_text" }, - "projected_examples": { - "items": { - "type": "string" - }, - "type": "array", - "title": "Projected Examples", - "description": "a capped, sorted sample of the affected 'entity@year' keys" + "carried_entries": { + "anyOf": [ + { + "items": { + "$ref": "#/components/schemas/Entry" + }, + "type": "array", + "maxItems": 16 + }, + { + "type": "null" + } + ], + "title": "Carried Entries", + "description": "the scope entries earlier searches of the conversation settled, each with provenance carried, from their resolved.scope_choices. Each attaches to the parts that settle its axis, and an entry made for a concept only to a part asking for that concept. An explicit entry on the same axis wins; a carried entry a part cannot take is reported in that part's resolved.scope_choices.dropped_entries. None carries none" } }, "additionalProperties": false, "type": "object", "required": [ - "recipe_id", - "table_provenance", - "exchange_rate_table_version", - "fallback_count", - "projected_count" + "parts" ], - "title": "ObservationSeriesConversion", - "description": "What produced a converted series' points: the recipe and table\nversions, and the fallback/projected markers a caller reads off them.\nModelled on materialise.convert.ConversionRecord, whose own docstring\nthis field's members mirror. Omits ConversionRecord.native_currency:\na caller trusting or reproducing the number needs what recipe and\ntables produced it, not what currency it started from -- facet.unit\nalready names the currency the points are actually in." + "title": "ParsedInput", + "description": "Pre-parsed input: one or more variable parts supplied directly by the caller,\nskipping natural-language extraction." }, - "ObservationsOmission": { + "ParsedPart": { "properties": { - "reason": { + "variable_text": { "type": "string", - "enum": [ - "observations_timed_out", - "observations_no_matching_source", - "observations_windowed_scope_unsupported", - "observations_converted_scope_unsupported", - "observations_no_dispatchable_facet", - "observations_bulk_fetch_failed", - "observations_probe_failed", - "observations_preview_too_large", - "observations_nothing_to_probe", - "observations_clients_unavailable", - "observations_no_points" + "maxLength": 200, + "minLength": 1, + "title": "Variable Text", + "description": "the variable's text as the caller identified it" + }, + "entities": { + "anyOf": [ + { + "items": { + "$ref": "#/components/schemas/ParsedEntity" + }, + "type": "array", + "maxItems": 16 + }, + { + "type": "null" + } ], - "title": "Reason", - "description": "machine-readable cause, equal to the accompanying Warning's code when one fires" + "title": "Entities", + "description": "entities associated with this part's variable, when available; null, omitted, or an empty list all mean no entity was named for this part, resolving the variable globally/entity-less -- the same meaning a raw_text query with no extracted place carries" }, - "message": { - "type": "string", - "title": "Message", - "description": "human-readable explanation, safe to render directly" + "time_text": { + "anyOf": [ + { + "type": "string", + "maxLength": 100, + "minLength": 1 + }, + { + "type": "null" + } + ], + "title": "Time Text", + "description": "this part's time expression, when available; recognised forms include a bare four-digit year, 'YYYY to YYYY' or 'YYYY-YYYY', 'from YYYY to YYYY', 'between YYYY and YYYY', a latest end as in 'between YYYY and the latest' or 'YYYY to latest', 'since YYYY', 'latest', 'latest year available', 'most recent', and 'last N years'. Anything else resolves dateless with a time_text_not_parsed warning, whose message lists every form" }, - "pairs": { + "unit_text": { "anyOf": [ { - "type": "integer" + "type": "string", + "maxLength": 100, + "minLength": 1 }, { "type": "null" } ], - "title": "Pairs", - "description": "observations_preview_too_large only: the count that was too large" + "title": "Unit Text", + "description": "this part's requested unit or measurement basis, when available; recognised phrasing names a currency (ISO 4217 code or curated name/alias), a price basis (current or constant prices), and/or a base year (e.g. '2015 US dollars', 'constant prices, 2015 base year'). A phrase this text failed to parse cleanly resolves no_data with unit_not_resolved; a phrase the request grammar cannot express at all resolves unsupported with unit_request_unsupported. A phrase the grammar CAN express is checked against this deployment's own unit data: a currency/prices/base_year combination no unit this deployment carries expresses at all resolves unsupported with facet_binding_unsupported; one this deployment can express but that matches no candidate observation resolves no_data with facet_not_available; a match resolves definite, applying the completed request to the resolved spec's identity and carrying request_basis on resolved.facets.unit" }, - "cap": { + "sources": { + "items": { + "$ref": "#/components/schemas/SourceMention" + }, + "type": "array", + "maxItems": 8, + "title": "Sources", + "description": "the data sources this part names or excludes, in query order. Empty, the part answers from the sources the engine elects. A restatement echoes each mention with the reference it resolved to" + }, + "source_text": { "anyOf": [ { - "type": "integer" + "type": "string", + "maxLength": 200, + "minLength": 1 }, { "type": "null" } ], - "title": "Cap", - "description": "observations_preview_too_large only: the ceiling it exceeded" + "title": "Source Text", + "description": "deprecated: post `sources` instead. Read as one included mention with this text, appended to `sources`" }, - "dispatched": { + "provenance": { "anyOf": [ { - "type": "integer" + "type": "string", + "maxLength": 200, + "minLength": 1 }, { "type": "null" } ], - "title": "Dispatched", - "description": "observations_no_points/observations_probe_failed/observations_no_matching_source/observations_timed_out: pairs actually dispatched" + "title": "Provenance", + "description": "deprecated: post `sources` instead. Read as one included mention with this ref, appended to `sources`. The served request schema lists the code index's declared datasets under this field, each with its label, description and opt-in flag" }, - "empty": { + "source_code": { "anyOf": [ { - "type": "integer" + "type": "string", + "maxLength": 64, + "minLength": 1 + }, + { + "type": "null" + } + ], + "title": "Source Code", + "description": "a publisher's own series code for this part's variable, such as the World Bank's DT.TDS.DEGG.CD, when the user or a skill gives one. Compared upper-cased, it names the variables the publisher gives that code, and the part answers from them in place of matching variable_text; variable_text, entities and open_roles still choose among them. A code is never a constraint and narrows nothing else. A code whose variables cannot answer the part, because no source search serves holds it, the part's sources leave out every source holding it, or its variables cannot answer the part as asked, resolves no_data with source_code_not_held, its message naming the cause; a code two of the part's sources hold resolves no_data with source_code_ambiguous until `sources` names one; a code whose variable another code of its source also names resolves no_data with source_code_shares_variable, naming those codes" + }, + "operations": { + "items": { + "$ref": "#/components/schemas/Operation" + }, + "type": "array", + "maxItems": 8, + "title": "Operations", + "description": "the operations the question asks for over this part's data, in query order; the engine echoes them onto the part it resolves. Empty when the question asks for none" + }, + "open_roles": { + "anyOf": [ + { + "items": { + "type": "string", + "maxLength": 64, + "minLength": 1 + }, + "type": "array", + "maxItems": 2 }, { "type": "null" } ], - "title": "Empty", - "description": "observations_no_points only: dispatched pairs that carried no data on their own facet" + "title": "Open Roles", + "description": "the roles this part asks for member by member, at most one word per flow axis, e.g. ['creditor'] for 'debt service paid to each creditor'. Each is a role_text word: creditor, donor, recipient, debtor, origin, destination, or a synonym. Where the answer's family declares the role, the answer holds one series per member of it and its identity states the axis in open_roles; a role named in neither entities nor open_roles reads as the total over that role. An unrecognised word, or a role one of this part's entities binds through role_text, refuses request_invalid. An operation whose over is origin or destination opens that axis too" }, - "hard_failed": { + "separate": { + "type": "boolean", + "title": "Separate", + "description": "true when this part is asked beside the others to be compared with them, as in 'health ODA versus education ODA': it answers as its own part and never folds into another part of the same shape (binding_folded). False, the default, folds parts that share a shape into one set answer. Two parts marked separate that resolve to one reading carry the same spec_id and stay two parts", + "default": false + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "variable_text" + ], + "title": "ParsedPart", + "description": "One variable ask within a parsed request, with its own entities, time, unit, and source." + }, + "PartScope": { + "properties": { + "id": { + "type": "string", + "title": "Id", + "description": "the scope's id: the spec_id of `base`" + }, + "base": { + "$ref": "#/components/schemas/SpecDefinition", + "description": "the identity the part resolved; its bindings carry the constraints" + }, + "rule_version": { + "type": "string", + "title": "Rule Version", + "description": "the hash of the declaration tables compiled against" + }, + "entries": { + "items": { + "$ref": "#/components/schemas/Entry" + }, + "type": "array", + "title": "Entries", + "description": "the explicit and carried entries applied, the input a switch posts back" + }, + "dropped_entries": { + "items": { + "$ref": "#/components/schemas/DroppedEntry" + }, + "type": "array", + "title": "Dropped Entries", + "description": "the entries left out, each with its code and cause: carried entries the part cannot take, and on a fresh search the stated entries it cannot serve" + }, + "choices": { + "items": { + "$ref": "#/components/schemas/ScopeChoice" + }, + "type": "array", + "title": "Choices", + "description": "one per axis the part settles" + }, + "compiled": { + "$ref": "#/components/schemas/CompiledScope", + "description": "what the active options compile to" + }, + "ledger": { + "items": { + "$ref": "#/components/schemas/LedgerStep" + }, + "type": "array", + "title": "Ledger", + "description": "the switches made, newest last; the server keeps none, so [] on the wire" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "id", + "base", + "rule_version", + "entries", + "choices", + "compiled" + ], + "title": "PartScope", + "description": "Every scope choice of one part, the entries that settled them and the identity they\ncompile to." + }, + "PartyBlock": { + "properties": { + "roles": { "anyOf": [ { - "type": "integer" + "items": { + "type": "string" + }, + "type": "array" }, { "type": "null" } ], - "title": "Hard Failed", - "description": "observations_no_points (always 0) and observations_probe_failed: dispatched pairs whose fetch itself failed" + "title": "Roles", + "description": "the role properties a node of these types can fill, by the role ranges the graph declares (rangeIncludes and its subClassOf closure); null when that read failed" + } + }, + "type": "object", + "required": [ + "roles" + ], + "title": "GraphPartyBlock", + "description": "An organisation's or aggregate's detail block." + }, + "PartyTotalsLeftOutModel": { + "properties": { + "role": { + "type": "string", + "title": "Role", + "description": "the party role whose rows lost the totals" }, - "facet_rejected": { + "provenance": { "anyOf": [ { - "type": "integer" + "type": "string" }, { "type": "null" } ], - "title": "Facet Rejected", - "description": "observations_no_points (always 0) and observations_no_matching_source: dispatched pairs a bound facet_filter rejected" + "title": "Provenance", + "description": "the dataset whose rows lost the totals, null for rows with no provenance. Absent on a version recorded before the trace named the provenance, whose totals left the rows of every dataset" + }, + "entities": { + "items": { + "type": "string" + }, + "type": "array", + "title": "Entities", + "description": "the dcid refs of the totals left out, in ref order" } }, "additionalProperties": false, "type": "object", "required": [ - "reason", - "message" + "role", + "entities" ], - "title": "ObservationsOmission", - "description": "Why a SpecObservations payload carries no series, made unconditional:\nevery _fetch_observations call that reaches a \"nothing to show\" outcome\nsets this field instead of leaving the whole payload absent, so a client\nis never left guessing which of at least a dozen distinct causes\nproduced an empty preview.\n\nreason is a warning code from search.engine.region.codes (see\nObservationsOmissionReason's own docstring for the closed vocabulary and\nwhy it is duplicated here rather than imported) -- the SAME code the\naccompanying Warning carries when one is also emitted, so a client reads\none vocabulary rather than two. Not every reason accompanies a Warning:\na genuinely uninteresting omission (nothing was ever there to probe)\ncarries no diagnostic Warning of its own, but always carries this field.\n\nThe converse also holds, and the pairing is not exhaustive: a reason\narriving as a bare Warning with `omitted` absent means partial coverage,\nnot absence -- a fetch that delivered some series would never set this\nfield, but can warn (`observations_probe_failed` on a partially hard-\nfailed fetch, and `observations_timed_out` on one some of whose pairs\ncrossed the deadline).\n\nWhenever `omitted` is set, SpecObservations.series is `[]`, total_obs is\n`0`, and truncated is `false`, so a client reading `series ?? []` and\nignoring `omitted` sees an ordinary empty result, with no schema_version\nbump needed to stay compatible.\n\npairs/cap: populated only for reason==\"observations_preview_too_large\" --\nthe (stat_var, role_tuple) pair (or pair x elected-combination\ndispatch-item, or distinct-stat_var) count that was compared against the\nceiling it crossed, and that ceiling itself. Lets a client render \"this\nselection has {pairs} series, above the {cap} the preview fetches\"\nwithout re-deriving either number.\n\ndispatched: how many (stat_var, role_tuple) pairs this call actually\ndispatched. Populated for reason==\"observations_no_points\",\n\"observations_probe_failed\", \"observations_no_matching_source\", and\n\"observations_timed_out\" -- every reason a dispatch actually happened\nfor; None for a reason reached before dispatch (e.g.\n\"observations_nothing_to_probe\").\n\nempty: dispatched pairs that carried no data on their own facet.\nPopulated only for reason==\"observations_no_points\".\n\nhard_failed: dispatched pairs whose fetch itself failed. Populated for\nreason==\"observations_no_points\" (always 0 there -- a nonzero count\nmeans reason is \"observations_probe_failed\" instead) and for\n\"observations_probe_failed\" itself (the nonzero count that produced\nthat reason); None elsewhere.\n\nfacet_rejected: dispatched pairs a bound facet_filter (or currency\nconversion) rejected. Populated for reason==\"observations_no_points\"\n(always 0 there -- a nonzero count means reason is\n\"observations_no_matching_source\" instead) and for\n\"observations_no_matching_source\" itself; None elsewhere.\n\nEvery field left None where the branch that produced this omission has\nno meaningful count for it." + "title": "PartyTotalsLeftOutModel", + "description": "One role's group totals a `without_party_totals` cut left out of one provenance's rows\n(`datasets_api.party_totals.PartyTotalsCut.trace_entries`). An entry without a\n`provenance`, which a version recorded before the trace named the provenance holds, left its\nparties out of the rows of every dataset." }, - "OpenAxisValueCount": { + "PeriodCoverage": { "properties": { - "value": { - "$ref": "#/components/schemas/GraphRef", - "description": "the declared value" + "period": { + "type": "string", + "maxLength": 32, + "minLength": 1, + "title": "Period" }, - "count": { + "entities": { "type": "integer", - "title": "Count", - "description": "how many distinct served members declare this value" + "minimum": 0.0, + "title": "Entities" } }, "additionalProperties": false, "type": "object", "required": [ - "value", - "count" + "period", + "entities" ], - "title": "OpenAxisValueCount", - "description": "One declared value on an open constraint axis and how many served members\ndeclare it (see OpenConstraintAxisFact.values)." + "title": "PeriodCoverage", + "description": "How many entities one period's total covers." }, - "OpenConstraintAxisFact": { + "PinRequest": { "properties": { - "property": { - "type": "string", - "title": "Property", - "description": "the constraint property dcid this fact is about" - }, - "varies": { - "type": "boolean", - "title": "Varies", - "description": "False when every served member that declares a value for this axis declares the same one (including when none of them declare one at all, since declaring nothing is itself an agreeing value here, the same rule resolved.alternative_measures' own observed-partition read applies); True when they differ" - }, - "value": { - "anyOf": [ - { - "$ref": "#/components/schemas/GraphRef" - }, - { - "type": "null" - } - ], - "description": "the single value every served member that declares one for this axis agrees on; present only when varies is False and at least one member declares a value, absent when varies is True or every member declares nothing" - }, - "distinct_count": { + "schema_version": { "type": "integer", - "title": "Distinct Count", - "description": "how many distinct declared values the served members actually exhibit for this axis, not counting a member that declares nothing. 0 when every member declares nothing, 1 when varies is False and value is set. Counted over the served members' own declarations, independent of this response's observation window: a query's applied when-slot narrows which observation points are returned, not which constraint values a member declares, so this count is never scoped to that window the way an observation-count field on this contract is" + "const": 1, + "title": "Schema Version", + "description": "contract schema version; exactly 1 for v1", + "default": 1 }, - "undeclared_count": { + "artifact_digest": { + "type": "string", + "pattern": "^sha256:", + "title": "Artifact Digest", + "description": "the exact bytes to pin, e.g. 'sha256:3e7a...'" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "artifact_digest" + ], + "title": "PinRequest" + }, + "PinResponse": { + "properties": { + "schema_version": { "type": "integer", - "title": "Undeclared Count", - "description": "how many served members declare no value at all for this axis. A member whose arc names the axis but never resolved to a dcid counts here too, the same as a member that never asserted the axis at all" + "const": 1, + "title": "Schema Version", + "default": 1 }, - "values": { - "items": { - "$ref": "#/components/schemas/OpenAxisValueCount" - }, - "type": "array", - "title": "Values", - "description": "every declared value with the number of served members declaring it, highest count first, then by dcid. Each served StatVar counts once, also after a merge of answers that serve it more than once, so the counts plus undeclared_count sum to the distinct served members. Labels as for value" + "pinned": { + "$ref": "#/components/schemas/PinnedCoordinates" } }, "additionalProperties": false, "type": "object", "required": [ - "property", - "varies", - "distinct_count", - "undeclared_count" + "pinned" ], - "title": "OpenConstraintAxisFact", - "description": "One constraint axis the query left open, and what this Spec's own\nserved StatVar members exhibit on it (see ResolvedSpec.open_axis_facts):\nwhether they agree on a single declared value or differ, what that\nagreed value is when one exists, how many distinct values the axis\nactually served, and how many declare none at all." + "title": "PinResponse" }, - "Operation": { + "PinnedCoordinates": { "properties": { - "verb": { - "type": "string", - "enum": [ - "rank", - "aggregate", - "growth", - "share_of", - "explain", - "forecast", - "report" - ], - "title": "Verb", - "description": "what the question asks to compute: rank, aggregate, growth, share_of, explain, forecast, or report" - }, - "phrase": { + "id": { "type": "string", - "maxLength": 200, - "minLength": 1, - "title": "Phrase", - "description": "the query wording that asks for the operation, e.g. 'top 5 donors'; one line with no control characters or line separators, and not blank" - }, - "over": { - "anyOf": [ - { - "type": "string", - "enum": [ - "place", - "origin", - "destination", - "category", - "year" - ] - }, - { - "type": "null" - } - ], - "title": "Over", - "description": "the axis the operation runs across (place, origin, destination, category, or year); null when the verb names none, as explain does. The part leaves this axis open, so its data covers every value the operation needs" - }, - "target_year": { - "anyOf": [ - { - "type": "integer", - "maximum": 2200.0, - "minimum": 1000.0 - }, - { - "type": "null" - } - ], - "title": "Target Year", - "description": "the year a forecast projects to, e.g. 2050 for 'forecast aid to Ethiopia to 2050'; set only on a forecast, a four-digit year up to 2200. The raw_text door sets it only to a year after the current one, and leaves it null when the question names none; a posted value is taken as given within the bound, whatever today's date. It is kept apart from the part's time_text, the years whose data the part fetches, and does not affect resolution" + "title": "Id", + "description": "the spec_id from the path" + }, + "content_version": { + "type": "string", + "title": "Content Version" + }, + "artifact_digest": { + "type": "string", + "title": "Artifact Digest" + }, + "pinned_at": { + "type": "string", + "title": "Pinned At" } }, "additionalProperties": false, "type": "object", "required": [ - "verb", - "phrase" + "id", + "content_version", + "artifact_digest", + "pinned_at" ], - "title": "Operation", - "description": "One computation the question asks for over a part's data, which search\ndoes not perform: the part answers with the data the operation needs, and\nthe operation rides on the part for a client to perform or hand on." + "title": "PinnedCoordinates" }, - "OperationEnvelope": { + "PivotOptionModel": { "properties": { - "operation_id": { + "index": { "type": "string", - "pattern": "^op_", - "title": "Operation Id", - "description": "`op_` plus the SHA-256 of the subject and its sorted member dcids, the origin catalogue build, and the rendering key. A repeat submission with the same identity joins the running operation and returns this id. Synchronous builds coalesce per API instance only." + "title": "Index" }, - "status": { + "columns": { "type": "string", - "enum": [ - "pending", - "running", - "done", - "failed" - ], - "title": "Status" + "title": "Columns" }, - "poll": { + "state": { + "type": "string", + "title": "State" + }, + "reason": { "anyOf": [ { "type": "string" @@ -11650,272 +15392,147 @@ "type": "null" } ], - "title": "Poll" + "title": "Reason" }, - "retry_after_ms": { + "varying": { "anyOf": [ { - "type": "integer" + "items": { + "$ref": "#/components/schemas/VaryingColumnModel" + }, + "type": "array" }, { "type": "null" } ], - "title": "Retry After Ms", - "description": "Milliseconds to wait before the next poll. Present on the 202 submit response and on every pending or running poll. Absent on a done poll. It grows as the build runs, at a quarter of the time since the operation's current submission, from 1,500 to 8,000. The `Retry-After` response header carries the same value in whole seconds, rounded up." + "title": "Varying" }, - "progress": { + "width": { "anyOf": [ { - "$ref": "#/components/schemas/OperationProgress" + "type": "integer" }, { "type": "null" } - ] - } - }, - "additionalProperties": false, - "type": "object", - "required": [ - "operation_id", - "status" - ], - "title": "OperationEnvelope" - }, - "OperationProgress": { - "properties": { - "rows_written": { - "type": "integer", - "title": "Rows Written" - }, - "estimate_rows": { - "type": "integer", - "title": "Estimate Rows" - } - }, - "additionalProperties": false, - "type": "object", - "required": [ - "rows_written", - "estimate_rows" - ], - "title": "OperationProgress", - "description": "`rows_written` against `estimate_rows`, read live off\n`datasets.operation` at poll time (`datasets_api.operation_store\n.Operation`). Present on a `pending`/`running` operation's own\nenvelope; omitted from the `202` submit envelope (nothing has run\nyet) and from a terminal (`done`/`failed`) operation's own envelope,\nwhose outcome the sibling `manifest` field, or the poll route's own\n`operation_failed` refusal, already carries in full." - }, - "OperationResource": { - "$id": "https://schemas.dfo.one.org/datasets/v1/operation-resource.json", - "properties": { - "operation": { - "$ref": "#/components/schemas/OperationEnvelope" + ], + "title": "Width" }, - "manifest": { + "cells": { "anyOf": [ { - "additionalProperties": true, - "type": "object" + "type": "integer" }, { "type": "null" } ], - "title": "Manifest" + "title": "Cells" }, - "error": { + "unavailable_formats": { "anyOf": [ { - "additionalProperties": true, - "type": "object" + "items": { + "$ref": "#/components/schemas/UnavailableFormatModel" + }, + "type": "array" }, { "type": "null" } ], - "title": "Error" + "title": "Unavailable Formats" } }, "additionalProperties": false, "type": "object", "required": [ - "operation" + "index", + "columns", + "state" ], - "title": "OperationResource", - "description": "`GET /api/datasets/operations/{operation_id}`'s poll response. The\ncapability document reports `operation_envelope_active: true`, and this\nis the shape the route returns for a known operation id in `pending`,\n`running`, or `done` state. A `failed` operation raises the platform's\nordinary refusal path instead (`operation_failed`), and an unknown or\nunauthorized-`done` id answers 404 `operation_not_found` -- neither\nreturns this shape.\n\n`manifest` is set only once `operation.status == \"done\"`: the same\nmanifest a synchronous mint returns, read at poll time\n(`datasets_api.doors.meta`'s operations route reuses `datasets_api\n.doors.snapshot.read_snapshot_manifest` against the operation's own\nstored `subject_id`/`content_version`). `error` models a `failed`\noperation's outcome inline with this resource's own shape, but the\ndoor never populates it: a `failed` operation raises the platform's\nordinary refusal path instead (`operation_failed`, a bare RFC 9457\nbody, the same pattern `operation_not_found` already uses on this\nroute -- see the registry's own `datasets.operations` mapping), so a\npoll never reaches this model at all once the underlying operation\nhas failed. `error` stays declared for schema completeness -- this is\na contract-stable, immutable-`$id` shape -- but no code path fills it." + "title": "PivotOptionModel", + "description": "One ordered `(index, columns)` pivot pair. `varying` is populated\nfor a `pivot_not_unique` refusal caused by a duplicate key group. A\nstringification collision, where distinct `columns` values share an\noutput column name, is also `unavailable` as `pivot_not_unique`, with\nno `varying` since no duplicate key group exists. `width` and `cells`\nare populated only when the pair is feasible." }, - "OptionsEnvelope": { + "PivotOptions": { "properties": { - "schema_version": { - "type": "integer", - "title": "Schema Version", - "default": 1 - }, - "definition": { - "$ref": "#/components/schemas/DefinitionModel" - }, - "content_version": { + "index": { "type": "string", - "title": "Content Version" - }, - "coverage": { - "$ref": "#/components/schemas/CoverageModel" - }, - "output_options": { - "anyOf": [ - { - "$ref": "#/components/schemas/OutputOptionsModel" - }, - { - "type": "null" - } - ] - }, - "warnings": { - "items": { - "$ref": "#/components/schemas/WarningModel" - }, - "type": "array", - "title": "Warnings" + "minLength": 1, + "title": "Index" }, - "trace": { - "additionalProperties": true, - "type": "object", - "title": "Trace" - } - }, - "additionalProperties": false, - "type": "object", - "required": [ - "definition", - "content_version", - "coverage", - "trace" - ], - "title": "OptionsEnvelope", - "description": "`GET /api/datasets/{id}/options`'s response. It is the projection\nof a materialising door's manifest onto the fields this route's callers\nneed (content_version, coverage, output_options, warnings, trace). The\nroute serves with no rendering (`doors.definition._serve_spec_options`),\nso no reshape runs and `warnings` here excludes reshape-level warnings\nsuch as `enrichment_unavailable`." - }, - "OptionsFor": { - "properties": { - "role": { + "columns": { "type": "string", - "title": "Role", - "description": "the resolved entity role to enumerate candidates for (e.g. 'origin', 'destination', 'observationAbout' -- the vocabulary is derived per family, not frozen here). Deliberately a plain str, NEVER a Literal or enum: the target is checked only AFTER the posted identity resolves to StatVars, refusing option_target_invalid (422) for a role the resolved family does not carry. A Literal/enum would instead refuse an unrecognised role at the pydantic validation layer as request_invalid (400), before resolution ever runs -- do not tighten this to an enum." - }, - "scope": { - "anyOf": [ - { - "type": "string", - "enum": [ - "peers", - "children" - ] - }, - { - "type": "null" - } - ], - "title": "Scope", - "description": "which candidate universe to enumerate for a role whose options are derived from the graph rather than a curated list; absent means 'peers'. 'peers' enumerates entities sharing the bound entity's own type; 'children' enumerates entities contained in it. Roles backed by a curated candidate list ignore this member, having only one universe to draw from. Naming a role alone cannot distinguish the two readings -- peers of a country and the regions within it are both 'options for observationAbout' -- and only the peers reading is recoverable from the identity, so without this member the contained-in reading is unreachable rather than merely unrequested." - } - }, - "additionalProperties": false, - "type": "object", - "required": [ - "role" - ], - "title": "OptionsFor", - "description": "Which resolved entity role the options door enumerates candidates for.\n\nWrapped in its own object (rather than a bare string field) so the wire\nbody reads `\"for\": {\"role\": \"destination\"}`, matching the contract's\nenvelope shape on both the request and the echoed response." - }, - "OptionsRequest": { - "properties": { - "schema_version": { - "type": "integer", - "const": 1, - "title": "Schema Version", - "description": "contract version the caller targets", - "default": 1 - }, - "identity": { - "$ref": "#/components/schemas/BaseIdentity", - "description": "the identity to resolve and enumerate candidate options for" - }, - "for": { - "$ref": "#/components/schemas/OptionsFor", - "description": "which resolved entity role to enumerate candidate options for" - }, - "include_coverage": { - "type": "boolean", - "title": "Include Coverage", - "description": "when true, the engine probes each returned option for observation coverage (e.g. 'Kenya — 205 obs') and populates SlotOption.coverage; false (the default) never fires the extra probe, so this is opt-in latency, not a hidden cost on the hot path. The only resolution option this door reads -- unlike /resolve's ResolveOptions, this door has no candidate cap or sentence concept, so it carries this one field directly rather than nesting a response_options object with members it would never use.", - "default": false + "minLength": 1, + "title": "Columns" } }, "additionalProperties": false, "type": "object", "required": [ - "identity", - "for" + "index", + "columns" ], - "title": "OptionsRequest", - "description": "Request body for the options door (POST /api/search/options): enumerate\nthe candidate set for one resolved entity role of a posted identity.\n\nAn identity block only. The door derives the identity's own StatVar\npopulation server-side (engine.options.population.options_population)\nrather than resolving a Spec through the resubmit path.\n\nvalidate_by_name=False (with validate_by_alias=True, the pydantic default\npairing made explicit here): the published schema declares only the alias\n`for`, and this model is otherwise extra=\"forbid\", so a wire body must be\nrejected for posting the internal Python attribute name `for_` instead --\naccepting both would let a client bypass the declared schema through the\nimplementation-detail spelling. `for_` exists only because `for` is a\nPython reserved word and cannot itself be an attribute name; every\nconstructor call (internal code, tests) builds this model through the\nalias instead, e.g. ``OptionsRequest(identity=..., **{\"for\": OptionsFor(...)})``." + "title": "PivotOptions", + "description": "`options.pivot`: long-to-wide, `index` and `columns` each naming\nexactly one column." }, - "OptionsResponse": { - "properties": { - "schema_version": { - "type": "integer", - "const": 1, - "title": "Schema Version", - "description": "contract schema version; exactly 1 for v1", - "default": 1 - }, - "diagnostics": { - "$ref": "#/components/schemas/Diagnostics", - "description": "run health, warnings, timing, build stamp" - }, - "for": { - "$ref": "#/components/schemas/OptionsFor", - "description": "the role this response's options were enumerated for, echoed back from the request" + "PlaceBlock": { + "properties": { + "contained_in": { + "items": { + "$ref": "#/components/schemas/NodeRef" + }, + "type": "array", + "title": "Contained In", + "description": "the containedInPlace targets" }, - "options": { - "$ref": "#/components/schemas/OptionsSet", - "description": "the enumerated candidate set" + "membership": { + "anyOf": [ + { + "$ref": "#/components/schemas/MembershipBlock" + }, + { + "type": "null" + } + ] } }, - "additionalProperties": false, "type": "object", "required": [ - "diagnostics", - "for", - "options" + "contained_in", + "membership" ], - "title": "OptionsResponse", - "description": "Response for POST /api/search/options: `{schema_version, diagnostics,\nfor, options}`. Carries no semantic status: the door either refuses\n(through the same shared identity validation a dataset_resubmit identity\nentry runs) or returns options -- possibly an empty\nlist -- with no definite/candidates/no_data three-way to report on top.\n\nOmits graph_revision: no revision concept exists anywhere in src/ --\nnothing tracks the graph the way engine_build tracks the code build -- so\nstamping one here would assert a graph fact this deployment cannot back.\nLeft out deliberately rather than filled with something untrue." + "title": "GraphPlaceBlock", + "description": "A place's detail block. `membership` is set for a region the membership policy holds." }, - "OptionsSet": { + "PlaceCounts": { "properties": { - "items": { - "items": { - "$ref": "#/components/schemas/SlotOption" - }, - "type": "array", - "title": "Items", - "description": "candidate values, deterministically ordered; a dcid that failed to resolve a label is omitted rather than fabricated" + "publishers": { + "type": "integer", + "title": "Publishers", + "description": "distinct sources with data at the country" }, - "truncated": { - "type": "boolean", - "title": "Truncated", - "description": "true when items was capped before every candidate could be checked" + "variables": { + "type": "integer", + "title": "Variables", + "description": "distinct StatVars with data at the country" + }, + "aid": { + "$ref": "#/components/schemas/AidCounts" } }, "additionalProperties": false, "type": "object", "required": [ - "items", - "truncated" + "publishers", + "variables", + "aid" ], - "title": "OptionsSet", - "description": "The enumerated candidate set an options-door request returns.\n\nItems reuse SlotOption for shape parity with slot_options/entity_options\n({value, coverage}) rather than a simpler {ref, label, obs_count} shape --\nthe richer coverage form is what the engine already serves. An\nempty list is itself a valid result (e.g. the current recipient's\nvariable truly has no other recipient with data), not an error.\n\nCarries no graph_revision -- see OptionsResponse's docstring for why." + "title": "PlaceCounts", + "description": "What DFO holds at one country. For aid, `donors` counts the donors to\nthe country and `recipients` the recipients of its own aid." }, - "OrganisationNode": { + "PlaceOtherNode": { "properties": { "ref": { "type": "string", @@ -11999,12 +15616,12 @@ }, "kind": { "type": "string", - "const": "organisation", + "const": "place_other", "title": "Kind", - "default": "organisation" + "default": "place_other" }, - "organisation": { - "$ref": "#/components/schemas/PartyBlock" + "place_other": { + "$ref": "#/components/schemas/PlaceBlock" } }, "type": "object", @@ -12017,11 +15634,104 @@ "gaps", "built_from", "kind", - "organisation" + "place_other" ], - "title": "OrganisationNode" + "title": "PlaceOtherNode" }, - "OtherNode": { + "PriceBasisWords": { + "properties": { + "prices": { + "type": "string", + "enum": [ + "current", + "constant" + ], + "title": "Prices" + }, + "base_year": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ], + "title": "Base Year" + } + }, + "type": "object", + "required": [ + "prices", + "base_year" + ], + "title": "GraphPriceBasis", + "description": "Current or constant prices, with the base year of constant prices when known." + }, + "Projection": { + "type": "string", + "enum": [ + "countries", + "other_states", + "territories", + "former_states", + "institutions" + ], + "title": "Projection", + "description": "A named cut of a membership by member class." + }, + "ProjectionCount": { + "properties": { + "projection": { + "$ref": "#/components/schemas/Projection" + }, + "count": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ], + "title": "Count", + "description": "members under the projection; null when the authority does not record it" + }, + "complete": { + "type": "boolean", + "title": "Complete", + "description": "false when the authority does not record the projection, or is known to hold it only in part (`membership_incomplete`)" + } + }, + "type": "object", + "required": [ + "projection", + "count", + "complete" + ], + "title": "GraphProjectionCount", + "description": "One projection of a membership and its member count at the block's date." + }, + "ProvenanceEntry": { + "properties": { + "ref": { + "type": "string", + "title": "Ref" + }, + "label": { + "type": "string", + "title": "Label" + } + }, + "type": "object", + "required": [ + "ref", + "label" + ], + "title": "ProvenanceEntry", + "description": "One admitted provenance: its dcid and the provenance table's name for it." + }, + "ProvenanceNode": { "properties": { "ref": { "type": "string", @@ -12105,9 +15815,12 @@ }, "kind": { "type": "string", - "const": "other", + "const": "provenance", "title": "Kind", - "default": "other" + "default": "provenance" + }, + "provenance": { + "$ref": "#/components/schemas/SourceBlock" } }, "type": "object", @@ -12116,353 +15829,286 @@ "label", "types", "description", - "links", - "gaps", - "built_from", - "kind" - ], - "title": "OtherNode", - "description": "A node no other kind fits. `types` and `description` carry what the graph holds." - }, - "OutputOptionsModel": { - "properties": { - "capability_version": { - "type": "string", - "title": "Capability Version" - }, - "columns": { - "items": { - "$ref": "#/components/schemas/ColumnOptionModel" - }, - "type": "array", - "title": "Columns" - }, - "formats": { - "items": { - "$ref": "#/components/schemas/FormatOptionModel" - }, - "type": "array", - "title": "Formats" - }, - "bundle": { - "$ref": "#/components/schemas/BundleOptionModel" - }, - "enrichments": { - "items": { - "$ref": "#/components/schemas/EnrichmentOptionModel" - }, - "type": "array", - "title": "Enrichments" - }, - "long_layout_defaults": { - "items": { - "type": "string" - }, - "type": "array", - "title": "Long Layout Defaults", - "description": "the enrichment tokens a long-layout download writes with no columns option, in column order: every role's {role}_label, and {role}_kind for every role on a flow axis, the party's kind in words: official or private on the provider or creditor side, country or organisation on the recipient or debtor side, total, whole total (a total that holds every party of its group in that row's dataset and year) or unallocated. Naming one in columns gives the same column once" - }, - "long_layout_totals": { - "items": { - "type": "string" - }, - "type": "array", - "title": "Long Layout Totals", - "description": "the roles whose total rows ({role}_kind is total or whole total) a long-layout CSV or XLSX download keeps out of its main table. A private party stays in it. A role is listed when the definition binds it to several entities one of which the code index declares a total, or leaves it open and the code index lists a total on its axis in a dataset the definition read (any dataset, when the read selected none). A role bound to several parties holds no total row and is not listed. A bundle's CSV writes those rows to a second data file, data/-totals.csv; an XLSX writes them on a second sheet, totals. A bare CSV has no README and drops them, so this list names the roles whose totals it drops. Parquet, a pivot and the frame layout keep every row. Empty when no role can hold a total row" - }, - "pivots": { - "items": { - "$ref": "#/components/schemas/PivotOptionModel" - }, - "type": "array", - "title": "Pivots" - }, - "groupby": { - "$ref": "#/components/schemas/GroupbyOptionsModel" - } - }, - "additionalProperties": false, - "type": "object", - "required": [ - "capability_version", - "columns", - "formats", - "bundle", - "enrichments", - "long_layout_defaults", - "long_layout_totals", - "pivots", - "groupby" + "links", + "gaps", + "built_from", + "kind", + "provenance" ], - "title": "OutputOptionsModel", - "description": "The reshape options this frame supports, joined from its stored\n`materialise.profile.OutputProfile` and the current capability\ndocument." + "title": "ProvenanceNode" }, - "ParsedEntity": { + "ProvenanceRef": { "properties": { - "text": { + "ref": { "type": "string", - "maxLength": 128, - "minLength": 1, - "title": "Text", - "description": "the entity's text as the caller identified it: the request's own words for it, which name resolution reads and a rendered sentence quotes" + "title": "Ref", + "description": "the graph identifier" }, - "name": { - "anyOf": [ - { - "type": "string", - "maxLength": 128, - "minLength": 1 - }, - { - "type": "null" - } - ], - "title": "Name", - "description": "the entity's name, when its words (`text`) could name more than one entity and no `dcid` pins it: the row's identity, which keys its role and members within the part. Name resolution reads `text` with `name` beside it, as the raw-text door reads a query's words beside the name extraction gave them, so two rows whose words are alike stay two entities. Words that differ from `name` only in case read as `name`, and one `name` posted with two texts that differ beyond case in a part refuses `request_invalid`. Without it, `text` is the identity; a `name` equal to `text` is the field left out, and a `name` beside a `dcid` is invalid. A row no dcid pins whose identity, its `name` or else its `text`, is a dcid another row of the part pins refuses `request_invalid` at the row" + "label": { + "type": "string", + "title": "Label", + "description": "plain-language display name, read from the graph" }, - "role_text": { + "source": { "anyOf": [ { - "type": "string", - "maxLength": 64, - "minLength": 1 + "$ref": "#/components/schemas/SourceRef" }, { "type": "null" } ], - "title": "Role Text", - "description": "the caller's free-form role hint for this entity, when available; recognised words (case-insensitive) are 'from'/'to' and synonyms such as donor/provider/funder/source/creditor/lender/exporter for the 'from' side, recipient/beneficiary/debtor/borrower/importer for the 'to' side -- unrecognised text warns role_text_not_recognised and the entity is treated as undirected" + "description": "the organisation behind the provenance" }, - "dcid": { + "data_commons": { "anyOf": [ { - "type": "string", - "minLength": 1 + "$ref": "#/components/schemas/search__models__grammar__DataCommonsRef" }, { "type": "null" } ], - "title": "Dcid", - "description": "an optional caller-pinned dcid for this entity, naming exactly which graph node `text` refers to -- the door a client with a candidate's dcid in hand (e.g. from NoData.ambiguous_entities) posts through, instead of relying on name resolution to disambiguate `text` on its own. When present, this entity's name resolution is skipped: the pinned dcid seeds the entry's pre_resolved map directly, still confirmed against the graph. An unconfirmable dcid (absent from the graph, or present but type-less) refuses invalid_role_ref (422). `text` stays required and is not re-derived from the dcid; it is still what a rendered sentence and any further restatement echo back. The dcid is the row's identity, so rows pinning one dcid under different texts are one entity, whose words are the first row's. A row no dcid pins whose `name`, or else `text`, is this dcid refuses request_invalid at that row." + "description": "the Data Commons the provenance's data comes from" }, - "members": { - "anyOf": [ - { - "type": "boolean" - }, - { - "type": "null" - } - ], - "title": "Members", - "description": "true asks for the members of the set `text` names, each as its own series: the countries of a continent or UN subregion, or the members of a group. It has no effect on a single place. Text whose wording names members, such as 'EU member states', reads as true without the flag. With a pinned `dcid` it is honoured for a continent or subregion that the membership policy holds or omits, whatever the node's graph type, and refuses request_invalid for a group's own node, whose members a pin cannot supply. One part names a set once: the same entity posted with both values refuses request_invalid" + "documentation": { + "type": "string", + "title": "Documentation", + "description": "the Graph API route of the provenance's document, GET /api/graph/documentation/{dcid}" } }, "additionalProperties": false, "type": "object", "required": [ - "text" + "ref", + "label" ], - "title": "ParsedEntity", - "description": "One entity mentioned in a parsed part, with an optional caller-supplied role hint." + "title": "ProvenanceRef", + "description": "A provenance on the wire: its dcid and label, the source behind it, the\nData Commons its data comes from, and the route of its document, which\nfollows from the dcid. `label`, `source` and `data_commons` come from the\norigin catalogue's provenance table. A provenance the table does not list\ncarries its graph label and neither `source` nor `data_commons`, and is\nomitted when the graph has no label for it." }, - "ParsedInput": { + "ProviderBinding": { "properties": { "kind": { "type": "string", - "const": "parsed", + "const": "provider", "title": "Kind", - "description": "discriminator for pre-parsed input", - "default": "parsed" + "default": "provider" }, - "parts": { - "items": { - "$ref": "#/components/schemas/ParsedPart" - }, - "type": "array", - "maxItems": 6, - "minItems": 1, - "title": "Parts", - "description": "one entry per variable ask; conjunctions pre-split by the caller. Parts that are byte-identical across every field collapse to one before resolution, so the response's own parts list can hold fewer entries than this list." + "scope": { + "type": "string", + "enum": [ + "bilateral", + "inclusive", + "contributions", + "multilateral" + ], + "title": "Scope", + "description": "bilateral flows alone, with imputed shares of multilateral spending, with core contributions to multilaterals, or the core contributions alone, as a published donor total counts them" }, - "raw_query": { + "window": { "anyOf": [ { - "type": "string", - "maxLength": 2000, - "minLength": 1 + "prefixItems": [ + { + "type": "integer" + }, + { + "type": "integer" + } + ], + "type": "array", + "maxItems": 2, + "minItems": 2 }, { "type": "null" } ], - "title": "Raw Query", - "description": "original query text, for echo only; does not affect resolution" + "title": "Window", + "description": "the years the option sets as the requested window, first and last: the latest run of years both tables of the inclusive scope cover, when they cover fewer than the part asks for, or the one latest year both cover for a part asking for the latest year; None when the option keeps the part's window" + }, + "provenance": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Provenance", + "description": "the composite provenance the inclusive scope binds as the identity's source, which stacks the part's bilateral flows on the imputed multilateral line of its own table; None for every other scope" } }, "additionalProperties": false, "type": "object", "required": [ - "parts" + "scope" ], - "title": "ParsedInput", - "description": "Pre-parsed input: one or more variable parts supplied directly by the caller,\nskipping natural-language extraction." + "title": "ProviderBinding", + "description": "An option that sets whose spending the answer counts." }, - "ParsedPart": { + "PublishFrameRequest": { "properties": { - "variable_text": { + "schema_version": { + "type": "integer", + "const": 1, + "title": "Schema Version", + "description": "contract schema version; exactly 1 for v1", + "default": 1 + }, + "spec_id": { "type": "string", - "maxLength": 200, - "minLength": 1, - "title": "Variable Text", - "description": "the variable's text as the caller identified it" + "pattern": "^ops_[0-9a-f]{6,64}$", + "title": "Spec Id", + "description": "the derived frame's own op-spec hash id, ops_-prefixed" }, - "entities": { - "anyOf": [ - { - "items": { - "$ref": "#/components/schemas/ParsedEntity" - }, - "type": "array", - "maxItems": 16 - }, - { - "type": "null" - } - ], - "title": "Entities", - "description": "entities associated with this part's variable, when available; null, omitted, or an empty list all mean no entity was named for this part, resolving the variable globally/entity-less -- the same meaning a raw_text query with no extracted place carries" + "content_version": { + "type": "string", + "pattern": "^ocv_[0-9a-f]{6,64}$", + "title": "Content Version", + "description": "the derived frame's own toolkit content version, ocv_-prefixed" }, - "time_text": { - "anyOf": [ - { - "type": "string", - "maxLength": 100, - "minLength": 1 - }, - { - "type": "null" - } - ], - "title": "Time Text", - "description": "this part's time expression, when available; recognised forms include a bare four-digit year, 'YYYY to YYYY' or 'YYYY-YYYY', 'from YYYY to YYYY', 'between YYYY and YYYY', a latest end as in 'between YYYY and the latest' or 'YYYY to latest', 'since YYYY', 'latest', 'latest year available', 'most recent', and 'last N years'. Anything else resolves dateless with a time_text_not_parsed warning, whose message lists every form" + "role_keys": { + "items": { + "type": "string", + "maxLength": 1024 + }, + "type": "array", + "maxItems": 16, + "title": "Role Keys", + "description": "`dfo_frame_grammar.Frame.build`'s own `role_keys` argument; empty is a valid subject-only frame with no role columns, `build_frame` accepts it, so no minimum is imposed here. Bounded at 16 entries, each at most 1024 characters, a schema fact rather than a deployment ceiling -- see this module's own docstring" }, - "unit_text": { - "anyOf": [ - { - "type": "string", - "maxLength": 100, - "minLength": 1 + "rows": { + "items": { + "additionalProperties": { + "anyOf": [ + { + "additionalProperties": { + "anyOf": [ + { + "type": "string", + "maxLength": 1024 + }, + { + "additionalProperties": { + "type": "string", + "maxLength": 200, + "pattern": "^dcid:." + }, + "type": "object", + "maxProperties": 1 + }, + { + "additionalProperties": { + "anyOf": [ + { + "type": "string", + "maxLength": 1024 + }, + { + "type": "integer" + }, + { + "type": "number" + }, + { + "type": "boolean" + }, + { + "type": "null" + } + ] + }, + "type": "object", + "maxProperties": 3 + } + ] + }, + "type": "object", + "maxProperties": 2 + }, + { + "additionalProperties": { + "anyOf": [ + { + "type": "string", + "maxLength": 1024 + }, + { + "type": "integer" + }, + { + "type": "number" + }, + { + "type": "boolean" + }, + { + "type": "null" + } + ] + }, + "type": "object", + "maxProperties": 3 + }, + { + "anyOf": [ + { + "type": "string", + "maxLength": 1024 + }, + { + "type": "integer" + }, + { + "type": "number" + }, + { + "type": "boolean" + }, + { + "type": "null" + } + ] + } + ] }, - { - "type": "null" - } - ], - "title": "Unit Text", - "description": "this part's requested unit or measurement basis, when available; recognised phrasing names a currency (ISO 4217 code or curated name/alias), a price basis (current or constant prices), and/or a base year (e.g. '2015 US dollars', 'constant prices, 2015 base year'). A phrase this text failed to parse cleanly resolves no_data with unit_not_resolved; a phrase the request grammar cannot express at all resolves unsupported with unit_request_unsupported. A phrase the grammar CAN express is checked against this deployment's own unit data: a currency/prices/base_year combination no unit this deployment carries expresses at all resolves unsupported with facet_binding_unsupported; one this deployment can express but that matches no candidate observation resolves no_data with facet_not_available; a match resolves definite, applying the completed request to the resolved spec's identity and carrying request_basis on resolved.facets.unit" - }, - "sources": { - "items": { - "$ref": "#/components/schemas/SourceMention" + "type": "object", + "maxProperties": 22 }, "type": "array", - "maxItems": 8, - "title": "Sources", - "description": "the data sources this part names or excludes, in query order. Empty, the part answers from the sources the engine elects. A restatement echoes each mention with the reference it resolved to" - }, - "source_text": { - "anyOf": [ - { - "type": "string", - "maxLength": 200, - "minLength": 1 - }, - { - "type": "null" - } - ], - "title": "Source Text", - "description": "deprecated: post `sources` instead. Read as one included mention with this text, appended to `sources`" - }, - "provenance": { - "anyOf": [ - { - "type": "string", - "maxLength": 200, - "minLength": 1 - }, - { - "type": "null" - } - ], - "title": "Provenance", - "description": "deprecated: post `sources` instead. Read as one included mention with this ref, appended to `sources`. The served request schema lists the code index's declared datasets under this field, each with its label, description and opt-in flag" - }, - "source_code": { - "anyOf": [ - { - "type": "string", - "maxLength": 64, - "minLength": 1 - }, - { - "type": "null" - } - ], - "title": "Source Code", - "description": "a publisher's own series code for this part's variable, such as the World Bank's DT.TDS.DEGG.CD, when the user or a skill gives one. Compared upper-cased, it names the variables the publisher gives that code, and the part answers from them in place of matching variable_text; variable_text, entities and open_roles still choose among them. A code is never a constraint and narrows nothing else. A code whose variables cannot answer the part, because no source search serves holds it, the part's sources leave out every source holding it, or its variables cannot answer the part as asked, resolves no_data with source_code_not_held, its message naming the cause; a code two of the part's sources hold resolves no_data with source_code_ambiguous until `sources` names one; a code whose variable another code of its source also names resolves no_data with source_code_shares_variable, naming those codes" + "maxItems": 1000000, + "title": "Rows", + "description": "`dfo_frame_grammar.Frame.build`'s own `rows` argument; empty is a valid frame (an analysis verb whose filter matches nothing produces exactly this), `build_frame` accepts it, so no minimum is imposed here. Each row is bounded at 22 keys; the outer list is bounded at 1000000 rows, a fixed schema backstop, well above doors.publish's own fixed PUBLISH_MAX_ROWS that actually governs `len(rows)` at publish time -- see this module's own docstring for why the two are not the same kind of cap. A cell is a scalar, or under `unit` alone a mapping of scalars bounded at 3 entries or a composed unit, `numerator` over `denominator`, each a unit ref, a mapping of scalars, or `{stat_var}` -- see this module's own docstring for the shapes refused at parse time" }, - "operations": { + "input_content_versions": { "items": { - "$ref": "#/components/schemas/Operation" + "type": "string", + "pattern": "^(?:cv_[0-9a-f]{32}|ocv_[0-9a-f]{6,64})$" }, "type": "array", - "maxItems": 8, - "title": "Operations", - "description": "the operations the question asks for over this part's data, in query order; the engine echoes them onto the part it resolves. Empty when the question asks for none" + "maxItems": 256, + "minItems": 1, + "title": "Input Content Versions", + "description": "every input frame's own frame-grammar content_version this derived frame was computed from. Bounded at 256 entries, a schema fact rather than a deployment ceiling -- see this module's own docstring" }, - "open_roles": { + "recipe": { "anyOf": [ { - "items": { - "type": "string", - "maxLength": 64, - "minLength": 1 - }, - "type": "array", - "maxItems": 2 + "$ref": "#/components/schemas/Recipe" }, { "type": "null" } ], - "title": "Open Roles", - "description": "the roles this part asks for member by member, at most one word per flow axis, e.g. ['creditor'] for 'debt service paid to each creditor'. Each is a role_text word: creditor, donor, recipient, debtor, origin, destination, or a synonym. Where the answer's family declares the role, the answer holds one series per member of it and its identity states the axis in open_roles; a role named in neither entities nor open_roles reads as the total over that role. An unrecognised word, or a role one of this part's entities binds through role_text, refuses request_invalid. An operation whose over is origin or destination opens that axis too" + "description": "the recipe that produced this frame. The door stores it beside the version, outside the body a republish is compared on, so a republish may add one to a frame published without it and may omit one the frame already holds" }, - "separate": { - "type": "boolean", - "title": "Separate", - "description": "true when this part is asked beside the others to be compared with them, as in 'health ODA versus education ODA': it answers as its own part and never folds into another part of the same shape (binding_folded). False, the default, folds parts that share a shape into one set answer. Two parts marked separate that resolve to one reading carry the same spec_id and stay two parts", - "default": false - } - }, - "additionalProperties": false, - "type": "object", - "required": [ - "variable_text" - ], - "title": "ParsedPart", - "description": "One variable ask within a parsed request, with its own entities, time, unit, and source." - }, - "PartyBlock": { - "properties": { - "roles": { + "steps": { "anyOf": [ { "items": { - "type": "string" + "$ref": "#/components/schemas/Step" }, "type": "array" }, @@ -12470,64 +16116,22 @@ "type": "null" } ], - "title": "Roles", - "description": "the role properties a node of these types can fill, by the role ranges the graph declares (rangeIncludes and its subClassOf closure); null when that read failed" - } - }, - "type": "object", - "required": [ - "roles" - ], - "title": "GraphPartyBlock", - "description": "An organisation's or aggregate's detail block." - }, - "PeriodCoverage": { - "properties": { - "period": { - "type": "string", - "maxLength": 32, - "minLength": 1, - "title": "Period" - }, - "entities": { - "type": "integer", - "minimum": 0.0, - "title": "Entities" - } - }, - "additionalProperties": false, - "type": "object", - "required": [ - "period", - "entities" - ], - "title": "PeriodCoverage", - "description": "How many entities one period's total covers." - }, - "PinRequest": { - "properties": { - "schema_version": { - "type": "integer", - "const": 1, - "title": "Schema Version", - "description": "contract schema version; exactly 1 for v1", - "default": 1 - }, - "artifact_digest": { - "type": "string", - "pattern": "^sha256:", - "title": "Artifact Digest", - "description": "the exact bytes to pin, e.g. 'sha256:3e7a...'" + "title": "Steps", + "description": "the frame's step records, one per operation that computed it, in order, in the shape of dfo-spec-kit's step schema. `op` is any operation name. At most 62 steps and 65536 bytes of canonical JSON; step ids are distinct, an input that names a step names an earlier one, and only a `retrieve` step's `input` names a version, which at least one does. The versions `retrieve` steps name are the frame's root inputs, which `input_content_versions`, the immediate input frames, need not list. Absent when the publish carries none" } }, "additionalProperties": false, "type": "object", "required": [ - "artifact_digest" + "spec_id", + "content_version", + "role_keys", + "rows", + "input_content_versions" ], - "title": "PinRequest" + "title": "PublishFrameRequest" }, - "PinResponse": { + "PublishFrameResponse": { "properties": { "schema_version": { "type": "integer", @@ -12535,23 +16139,22 @@ "title": "Schema Version", "default": 1 }, - "pinned": { - "$ref": "#/components/schemas/PinnedCoordinates" + "published": { + "$ref": "#/components/schemas/PublishedFrameCoordinates" } }, "additionalProperties": false, "type": "object", "required": [ - "pinned" + "published" ], - "title": "PinResponse" + "title": "PublishFrameResponse" }, - "PinnedCoordinates": { + "PublishedFrameCoordinates": { "properties": { - "id": { + "spec_id": { "type": "string", - "title": "Id", - "description": "the spec_id from the path" + "title": "Spec Id" }, "content_version": { "type": "string", @@ -12561,1727 +16164,1686 @@ "type": "string", "title": "Artifact Digest" }, - "pinned_at": { - "type": "string", - "title": "Pinned At" + "created": { + "type": "boolean", + "title": "Created", + "description": "true when this call newly recorded the version row; false when an identical publish of this exact pair had already been recorded (the idempotent replay path)" } }, "additionalProperties": false, "type": "object", "required": [ - "id", + "spec_id", "content_version", "artifact_digest", - "pinned_at" + "created" ], - "title": "PinnedCoordinates" + "title": "PublishedFrameCoordinates" }, - "PivotOptionModel": { + "QueryEcho": { "properties": { - "index": { - "type": "string", - "title": "Index" - }, - "columns": { - "type": "string", - "title": "Columns" - }, - "state": { + "entry_path": { "type": "string", - "title": "State" - }, - "reason": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Reason" - }, - "varying": { - "anyOf": [ - { - "items": { - "$ref": "#/components/schemas/VaryingColumnModel" - }, - "type": "array" - }, - { - "type": "null" - } + "enum": [ + "raw_text", + "parsed", + "dataset_resubmit" ], - "title": "Varying" + "title": "Entry Path", + "description": "which input was used" }, - "width": { + "raw_query": { "anyOf": [ { - "type": "integer" + "type": "string" }, { "type": "null" } ], - "title": "Width" + "title": "Raw Query", + "description": "the original query text, when one was supplied" }, - "cells": { + "normalized_query": { "anyOf": [ { - "type": "integer" + "type": "string" }, { "type": "null" } ], - "title": "Cells" + "title": "Normalized Query", + "description": "normalised query text, when extraction ran" }, - "unavailable_formats": { - "anyOf": [ - { - "items": { - "$ref": "#/components/schemas/UnavailableFormatModel" - }, - "type": "array" - }, - { - "type": "null" - } - ], - "title": "Unavailable Formats" + "extract_skipped": { + "type": "boolean", + "title": "Extract Skipped", + "description": "true when the extraction step was skipped for this request" } }, "additionalProperties": false, "type": "object", "required": [ - "index", - "columns", - "state" + "entry_path", + "extract_skipped" ], - "title": "PivotOptionModel", - "description": "One ordered `(index, columns)` pivot pair. `varying` is populated\nfor a `pivot_not_unique` refusal caused by a duplicate key group. A\nstringification collision, where distinct `columns` values share an\noutput column name, is also `unavailable` as `pivot_not_unique`, with\nno `varying` since no duplicate key group exists. `width` and `cells`\nare populated only when the pair is feasible." + "title": "QueryEcho", + "description": "What the response was understood to be answering." }, - "PivotOptions": { + "RawTextInput": { "properties": { - "index": { + "kind": { "type": "string", - "minLength": 1, - "title": "Index" + "const": "raw_text", + "title": "Kind", + "description": "discriminator for natural-language query input", + "default": "raw_text" }, - "columns": { + "query": { "type": "string", - "minLength": 1, - "title": "Columns" + "title": "Query", + "description": "the user's natural-language request" } }, "additionalProperties": false, "type": "object", "required": [ - "index", - "columns" + "query" ], - "title": "PivotOptions", - "description": "`options.pivot`: long-to-wide, `index` and `columns` each naming\nexactly one column." + "title": "RawTextInput", + "description": "Natural-language query input. The engine extracts, resolves, and grounds it." }, - "PlaceBlock": { + "Recipe": { "properties": { - "contained_in": { + "schema_version": { + "type": "integer", + "const": 1, + "title": "Schema Version", + "description": "recipe schema version; exactly 1" + }, + "normal_form_hash": { + "type": "string", + "pattern": "^rnf_[0-9a-f]{32}$", + "title": "Normal Form Hash", + "description": "hash of the recipe's normal form, in which every derived input is replaced by its own recipe, every root by its dataset spec_id and rendering, and every literal a rolling overlay governs is dropped. Two frames replayed from one recipe on different data share it" + }, + "replay_key": { + "type": "string", + "pattern": "^rpk_[0-9a-f]{32}$", + "title": "Replay Key", + "description": "hash of the normal form hash, the root dataset pairs, and the execution identity. It names the one frame replayed from them" + }, + "execution_identity": { + "type": "string", + "maxLength": 1024, + "minLength": 1, + "title": "Execution Identity", + "description": "the engine, grammar, and reduction versions that ran the recipe" + }, + "tree": { + "additionalProperties": { + "$ref": "#/components/schemas/JsonValue" + }, + "type": "object", + "title": "Tree", + "description": "the op-spec tree, opaque here; analysis-mcp owns its shape" + }, + "roots": { "items": { - "$ref": "#/components/schemas/NodeRef" + "$ref": "#/components/schemas/JsonValue" }, "type": "array", - "title": "Contained In", - "description": "the containedInPlace targets" + "title": "Roots", + "description": "how each root dataset was minted, opaque here; analysis-mcp owns its shape" }, - "membership": { + "anchor": { "anyOf": [ { - "$ref": "#/components/schemas/MembershipBlock" + "$ref": "#/components/schemas/RecipeAnchor" }, { "type": "null" } - ] + ], + "description": "the rolling anchor, or null for a recipe with no rolling period" + }, + "left_out": { + "anyOf": [ + { + "$ref": "#/components/schemas/RecipeLeftOut" + }, + { + "type": "null" + } + ], + "description": "the series each step dropped for a data gap, as the run that stored the recipe computed them; null for a recipe stored without them" } }, + "additionalProperties": false, "type": "object", "required": [ - "contained_in", - "membership" + "schema_version", + "normal_form_hash", + "replay_key", + "execution_identity", + "tree", + "roots" ], - "title": "GraphPlaceBlock", - "description": "A place's detail block. `membership` is set for a region the membership policy holds." + "title": "Recipe" }, - "PlaceCounts": { + "RecipeAnchor": { "properties": { - "publishers": { - "type": "integer", - "title": "Publishers", - "description": "distinct sources with data at the country" + "period": { + "type": "string", + "maxLength": 1024, + "minLength": 1, + "title": "Period", + "description": "a period label at the frame's grain" }, - "variables": { - "type": "integer", - "title": "Variables", - "description": "distinct StatVars with data at the country" + "rule": { + "type": "string", + "const": "half1", + "title": "Rule", + "description": "the anchor rule: the newest period at least half of the series hold" }, - "aid": { - "$ref": "#/components/schemas/AidCounts" + "left_out": { + "items": { + "$ref": "#/components/schemas/RecipeLeftOutSeries" + }, + "type": "array", + "title": "Left Out" } }, "additionalProperties": false, "type": "object", "required": [ - "publishers", - "variables", - "aid" + "period", + "rule", + "left_out" ], - "title": "PlaceCounts", - "description": "What DFO holds at one country. For aid, `donors` counts the donors to\nthe country and `recipients` the recipients of its own aid." + "title": "RecipeAnchor", + "description": "The period a rolling recipe's `latest` resolved to, and the series it left out." }, - "PlaceOtherNode": { + "RecipeDroppedSeries": { "properties": { - "ref": { - "type": "string", - "title": "Ref", - "description": "the node's dcid" - }, - "label": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Label", - "description": "the node's name; for a Provenance, its parent Dataset's name where it has one. Null, and named in gaps, when the graph gives none" - }, - "types": { - "items": { + "coordinates": { + "additionalProperties": { "type": "string" }, - "type": "array", - "title": "Types", - "description": "the node's typeOf values, as the graph holds them" + "type": "object", + "title": "Coordinates", + "description": "the series' dimension values, column name to value, as the step read them" }, - "description": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } + "step": { + "$ref": "#/components/schemas/RecipeStepRef" + }, + "side": { + "type": "string", + "enum": [ + "data", + "other" ], - "title": "Description", - "description": "the node's prose in the graph; null when it has none" + "title": "Side", + "description": "the step input the series came from, in the analysis call's words" }, - "links": { - "additionalProperties": { - "type": "string" - }, - "propertyNames": { - "enum": [ - "codes", - "children", - "members", - "countries", - "datasets", - "variables", - "facets" - ] - }, - "type": "object", - "title": "Links", - "description": "each list relation the node has, mapped to its route; empty when none" + "reason": { + "type": "string", + "maxLength": 1024, + "minLength": 1, + "title": "Reason", + "description": "the engine's exclusion reason" }, - "gaps": { + "rows": { + "type": "integer", + "minimum": 1.0, + "title": "Rows", + "description": "the rows of the series the step left out" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "coordinates", + "step", + "side", + "reason", + "rows" + ], + "title": "RecipeDroppedSeries", + "description": "One series a step of the recipe dropped for missing or unusable data (a data gap, such\nas a growth endpoint the series lacks or a key the other side holds no partner for)." + }, + "RecipeLeftOut": { + "properties": { + "series": { "items": { - "type": "string" + "$ref": "#/components/schemas/RecipeDroppedSeries" }, "type": "array", - "title": "Gaps", - "description": "the member path of every value this door cannot know" - }, - "built_from": { - "additionalProperties": { - "type": "string" - }, - "propertyNames": { - "enum": [ - "code_index", - "origin_catalogue", - "coverage_index", - "membership" - ] - }, - "type": "object", - "title": "Built From", - "description": "the build of each table the response read" - }, - "kind": { - "type": "string", - "const": "place_other", - "title": "Kind", - "default": "place_other" + "maxItems": 2000, + "title": "Series" }, - "place_other": { - "$ref": "#/components/schemas/PlaceBlock" + "complete": { + "type": "boolean", + "title": "Complete", + "description": "false when the steps dropped more series than listed" } }, + "additionalProperties": false, "type": "object", "required": [ - "ref", - "label", - "types", - "description", - "links", - "gaps", - "built_from", - "kind", - "place_other" + "series", + "complete" ], - "title": "PlaceOtherNode" + "title": "RecipeLeftOut", + "description": "Every series the recipe's steps dropped for a data gap, at most\n`MAX_RECIPE_LEFT_OUT_SERIES`, and whether that is all of them." }, - "PriceBasisWords": { + "RecipeLeftOutSeries": { "properties": { - "prices": { - "type": "string", - "enum": [ - "current", - "constant" - ], - "title": "Prices" + "root": { + "type": "integer", + "minimum": 0.0, + "title": "Root", + "description": "index of the population the series belongs to, in the order of the recipe's populations: one per root dataset" }, - "base_year": { + "coordinates": { + "additionalProperties": { + "type": "string", + "maxLength": 1024, + "minLength": 1 + }, + "type": "object", + "title": "Coordinates", + "description": "the series' dimension values, column name to value. Holds `stat_var` or at least one entity-role column" + }, + "label": { "anyOf": [ { - "type": "integer" + "type": "string", + "maxLength": 1024, + "minLength": 1 }, { "type": "null" } ], - "title": "Base Year" + "title": "Label", + "description": "the series' display name. Optional: a reader of the recipe resolves the name from `coordinates` when it is absent" } }, + "additionalProperties": false, "type": "object", "required": [ - "prices", - "base_year" + "root", + "coordinates" ], - "title": "GraphPriceBasis", - "description": "Current or constant prices, with the base year of constant prices when known." + "title": "RecipeLeftOutSeries", + "description": "One series a rolling anchor left out: it holds no row at the anchor period.\n\n`coordinates` must name the series, since a reader labels it from them: they hold\n`stat_var`, or at least one entity-role column, which is any column other than the frame\ngrammar's fixed columns (`stat_var`, `time_period`, `value`, `unit`, `status`) and its\nfacet identity columns (`measurementMethod`, `provenance`). Empty coordinates, and\ncoordinates of only those other columns, are refused." }, - "Projection": { - "type": "string", - "enum": [ - "countries", - "other_states", - "territories", - "former_states", - "institutions" + "RecipeStepRef": { + "properties": { + "verb": { + "type": "string", + "maxLength": 1024, + "minLength": 1, + "title": "Verb" + }, + "node": { + "type": "integer", + "minimum": 0.0, + "title": "Node" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "verb", + "node" ], - "title": "Projection", - "description": "A named cut of a membership by member class." + "title": "RecipeStepRef", + "description": "A derived node of a recipe's `tree`: its verb and its index in depth-first order, the\ntree's top node first and each node before its inputs, slots in the tree's order." }, - "ProjectionCount": { + "RecipeWriteResponse": { "properties": { - "projection": { - "$ref": "#/components/schemas/Projection" + "spec_id": { + "type": "string", + "title": "Spec Id" }, - "count": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ], - "title": "Count", - "description": "members under the projection; null when the authority does not record it" + "content_version": { + "type": "string", + "title": "Content Version" }, - "complete": { + "created": { "type": "boolean", - "title": "Complete", - "description": "false when the authority does not record the projection, or is known to hold it only in part (`membership_incomplete`)" + "title": "Created", + "description": "true when this call stored the recipe; false when the frame already held a recipe with the same normal_form_hash and replay_key" } }, + "additionalProperties": false, "type": "object", "required": [ - "projection", - "count", - "complete" + "spec_id", + "content_version", + "created" ], - "title": "GraphProjectionCount", - "description": "One projection of a membership and its member count at the block's date." + "title": "RecipeWriteResponse" }, - "ProvenanceEntry": { + "RefRoot": { "properties": { "ref": { - "type": "string", - "title": "Ref" - }, - "label": { - "type": "string", - "title": "Label" + "$ref": "#/components/schemas/_Ref" } }, + "additionalProperties": false, "type": "object", "required": [ - "ref", - "label" + "ref" ], - "title": "ProvenanceEntry", - "description": "One admitted provenance: its dcid and the provenance table's name for it." + "title": "RefRoot", + "description": "A DatasetRef, read as its one member." }, - "ProvenanceNode": { + "RefreshFrameRequest": { "properties": { - "ref": { + "spec_id": { "type": "string", - "title": "Ref", - "description": "the node's dcid" - }, - "label": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Label", - "description": "the node's name; for a Provenance, its parent Dataset's name where it has one. Null, and named in gaps, when the graph gives none" - }, - "types": { - "items": { - "type": "string" - }, - "type": "array", - "title": "Types", - "description": "the node's typeOf values, as the graph holds them" - }, - "description": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Description", - "description": "the node's prose in the graph; null when it has none" - }, - "links": { - "additionalProperties": { - "type": "string" - }, - "propertyNames": { - "enum": [ - "codes", - "children", - "members", - "countries", - "datasets", - "variables", - "facets" - ] - }, - "type": "object", - "title": "Links", - "description": "each list relation the node has, mapped to its route; empty when none" - }, - "gaps": { - "items": { - "type": "string" - }, - "type": "array", - "title": "Gaps", - "description": "the member path of every value this door cannot know" - }, - "built_from": { - "additionalProperties": { - "type": "string" - }, - "propertyNames": { - "enum": [ - "code_index", - "origin_catalogue", - "coverage_index", - "membership" - ] - }, - "type": "object", - "title": "Built From", - "description": "the build of each table the response read" + "maxLength": 200, + "pattern": "^(?:spec|ops)_[^/\\s]+$", + "title": "Spec Id" }, - "kind": { + "content_version": { "type": "string", - "const": "provenance", - "title": "Kind", - "default": "provenance" + "maxLength": 200, + "pattern": "^(?:cv|ocv)_[^/\\s]+$", + "title": "Content Version" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "spec_id", + "content_version" + ], + "title": "RefreshFrameRequest", + "description": "The frame to refresh. An `ops_` id is accepted by the grammar and refused\n`frame_not_refreshable`." + }, + "RegisterRequest": { + "properties": { + "schema_version": { + "type": "integer", + "const": 1, + "title": "Schema Version", + "description": "contract schema version; exactly 1 for v1" }, - "provenance": { - "$ref": "#/components/schemas/SourceBlock" + "definition": { + "$ref": "#/components/schemas/CanonicalDefinition", + "description": "the canonical definition to register" } }, + "additionalProperties": false, "type": "object", "required": [ - "ref", - "label", - "types", - "description", - "links", - "gaps", - "built_from", - "kind", - "provenance" + "schema_version", + "definition" ], - "title": "ProvenanceNode" + "title": "RegisterRequest", + "description": "`POST /api/datasets/register`'s body: one canonical `definition`.\n`unsupported_schema_version` (the top-level `schema_version` field's own\nrefusal) and any other shape failure surface through the platform's\ngeneric `RequestValidationError` handling." }, - "ProvenanceRef": { + "RelatedMeasure": { "properties": { - "ref": { - "type": "string", - "title": "Ref", - "description": "the graph identifier" + "stat_var": { + "$ref": "#/components/schemas/GraphRef", + "description": "the StatVar this measure reads, labelled with its graph name, or its dcid when it has none" }, - "label": { + "definition": { + "$ref": "#/components/schemas/SpecDefinition", + "description": "the measure's own {schema_version, spec_id, identity}" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "stat_var", + "definition" + ], + "title": "RelatedMeasure", + "description": "One other StatVar from the StatVarGroup this Spec's one StatVar belongs to (see\nResolvedSpec.related_measures), with data at the Spec's places.\n\n`definition` is minted from the member's own five-tuple and constraint values, with this\nSpec's entities and requested window and no facets, since a unit or source this Spec\npins belongs to its own measure. Post `definition` back as `identity` on a\ndataset_resubmit identity entry to switch onto this measure." + }, + "Relaxation": { + "properties": { + "axis": { "type": "string", - "title": "Label", - "description": "plain-language display name, read from the graph" - }, - "source": { - "anyOf": [ - { - "$ref": "#/components/schemas/SourceRef" - }, - { - "type": "null" - } + "enum": [ + "what", + "how", + "where", + "when", + "source" ], - "description": "the organisation behind the provenance" + "title": "Axis", + "description": "the slot axis whose binding was relaxed" }, - "data_commons": { + "property_dcid": { "anyOf": [ { - "$ref": "#/components/schemas/search__models__grammar__DataCommonsRef" + "type": "string" }, { "type": "null" } ], - "description": "the Data Commons the provenance's data comes from" + "title": "Property Dcid", + "description": "the constraint property dcid the relaxed slot carried, when one exists" }, - "documentation": { - "type": "string", - "title": "Documentation", - "description": "the Graph API route of the provenance's document, GET /api/graph/documentation/{dcid}" + "dropped_value_dcids": { + "items": { + "type": "string" + }, + "type": "array", + "title": "Dropped Value Dcids", + "description": "the taxonomy member dcid(s) the relaxed binding dropped" } }, "additionalProperties": false, "type": "object", "required": [ - "ref", - "label" + "axis", + "dropped_value_dcids" ], - "title": "ProvenanceRef", - "description": "A provenance on the wire: its dcid and label, the source behind it, the\nData Commons its data comes from, and the route of its document, which\nfollows from the dcid. `label`, `source` and `data_commons` come from the\norigin catalogue's provenance table. A provenance the table does not list\ncarries its graph label and neither `source` nor `data_commons`, and is\nomitted when the graph has no label for it." + "title": "Relaxation", + "description": "Which definition part a nearest_real suggestion relaxed to find data.\n\nCaptured at the point a constraint binding is dropped and the resulting,\nwidened request is re-confirmed against the live graph (see\nNearestRealSpec). Names the definition part relaxed (axis + the\nconstraint property it carried) and the value(s) it dropped." }, - "PublishFrameRequest": { + "ReleaseDocumentResponse": { "properties": { + "catalog_version": { + "type": "string", + "title": "Catalog Version", + "description": "the catalogue release this deployment serves" + }, "schema_version": { "type": "integer", - "const": 1, "title": "Schema Version", - "description": "contract schema version; exactly 1 for v1", - "default": 1 - }, - "spec_id": { - "type": "string", - "pattern": "^ops_[0-9a-f]{6,64}$", - "title": "Spec Id", - "description": "the derived frame's own op-spec hash id, ops_-prefixed" - }, - "content_version": { - "type": "string", - "pattern": "^ocv_[0-9a-f]{6,64}$", - "title": "Content Version", - "description": "the derived frame's own toolkit content version, ocv_-prefixed" + "description": "the envelope schema version this release resolves against" }, - "role_keys": { + "member_types": { "items": { - "type": "string", - "maxLength": 1024 + "type": "string" }, "type": "array", - "maxItems": 16, - "title": "Role Keys", - "description": "`dfo_frame_grammar.Frame.build`'s own `role_keys` argument; empty is a valid subject-only frame with no role columns, `build_frame` accepts it, so no minimum is imposed here. Bounded at 16 entries, each at most 1024 characters, a schema fact rather than a deployment ceiling -- see this module's own docstring" + "title": "Member Types", + "description": "every component type this release's catalogue defines" }, - "rows": { + "constraint_ids": { "items": { - "additionalProperties": { - "anyOf": [ - { - "additionalProperties": { - "anyOf": [ - { - "type": "string", - "maxLength": 1024 - }, - { - "additionalProperties": { - "type": "string", - "maxLength": 200, - "pattern": "^dcid:." - }, - "type": "object", - "maxProperties": 1 - }, - { - "additionalProperties": { - "anyOf": [ - { - "type": "string", - "maxLength": 1024 - }, - { - "type": "integer" - }, - { - "type": "number" - }, - { - "type": "boolean" - }, - { - "type": "null" - } - ] - }, - "type": "object", - "maxProperties": 3 - } - ] - }, - "type": "object", - "maxProperties": 2 - }, - { - "additionalProperties": { - "anyOf": [ - { - "type": "string", - "maxLength": 1024 - }, - { - "type": "integer" - }, - { - "type": "number" - }, - { - "type": "boolean" - }, - { - "type": "null" - } - ] - }, - "type": "object", - "maxProperties": 3 - }, - { - "anyOf": [ - { - "type": "string", - "maxLength": 1024 - }, - { - "type": "integer" - }, - { - "type": "number" - }, - { - "type": "boolean" - }, - { - "type": "null" - } - ] - } - ] - }, - "type": "object", - "maxProperties": 22 + "type": "string" }, "type": "array", - "maxItems": 1000000, - "title": "Rows", - "description": "`dfo_frame_grammar.Frame.build`'s own `rows` argument; empty is a valid frame (an analysis verb whose filter matches nothing produces exactly this), `build_frame` accepts it, so no minimum is imposed here. Each row is bounded at 22 keys; the outer list is bounded at 1000000 rows, a fixed schema backstop, well above doors.publish's own fixed PUBLISH_MAX_ROWS that actually governs `len(rows)` at publish time -- see this module's own docstring for why the two are not the same kind of cap. A cell is a scalar, or under `unit` alone a mapping of scalars bounded at 3 entries or a composed unit, `numerator` over `denominator`, each a unit ref, a mapping of scalars, or `{stat_var}` -- see this module's own docstring for the shapes refused at parse time" + "title": "Constraint Ids", + "description": "every constraint id this release's registry enforces" + }, + "retry_modes": { + "additionalProperties": { + "type": "string" + }, + "type": "object", + "title": "Retry Modes", + "description": "`retry_modes` is the headline mode per code, and the per-response `retryable` boolean is the authoritative value for every code. `schema_invalid` and `frame_unavailable` vary by cause, and `request_invalid` is always false although its headline mode is `correct_and_retry`." + }, + "envelope_schema": { + "additionalProperties": true, + "type": "object", + "title": "Envelope Schema", + "description": "the envelope JSON Schema this release's assembler validates a minted envelope against; every create/revise/read body's `resolved_payload` conforms to it" }, - "input_content_versions": { - "items": { - "type": "string", - "pattern": "^(?:cv_[0-9a-f]{32}|ocv_[0-9a-f]{6,64})$" + "component_schemas": { + "additionalProperties": { + "additionalProperties": true, + "type": "object" }, - "type": "array", - "maxItems": 256, - "minItems": 1, - "title": "Input Content Versions", - "description": "every input frame's own frame-grammar content_version this derived frame was computed from. Bounded at 256 entries, a schema fact rather than a deployment ceiling -- see this module's own docstring" + "type": "object", + "title": "Component Schemas", + "description": "each member type's own component JSON Schema, keyed by member type. `envelope_schema`'s `component` field `$ref`s these schemas by their own `$id`, which otherwise resolves nowhere, so a client validating `resolved_payload` resolves those `$ref`s against this map" }, - "recipe": { - "anyOf": [ - { - "$ref": "#/components/schemas/Recipe" - }, - { - "type": "null" - } - ], - "description": "the recipe that produced this frame. The door stores it beside the version, outside the body a republish is compared on, so a republish may add one to a frame published without it and may omit one the frame already holds" + "intent_schemas_tolerant": { + "additionalProperties": { + "additionalProperties": true, + "type": "object" + }, + "type": "object", + "title": "Intent Schemas Tolerant", + "description": "each member type's own tolerant intent schema" }, - "steps": { - "anyOf": [ - { - "items": { - "$ref": "#/components/schemas/Step" - }, - "type": "array" - }, - { - "type": "null" - } - ], - "title": "Steps", - "description": "the frame's step records, one per operation that computed it, in order, in the shape of dfo-spec-kit's step schema. `op` is any operation name. At most 62 steps and 65536 bytes of canonical JSON; step ids are distinct, an input that names a step names an earlier one, and only a `retrieve` step's `input` names a version, which at least one does. The versions `retrieve` steps name are the frame's root inputs, which `input_content_versions`, the immediate input frames, need not list. Absent when the publish carries none" + "minimal_intents": { + "additionalProperties": { + "additionalProperties": true, + "type": "object" + }, + "type": "object", + "title": "Minimal Intents", + "description": "each member type's own minimal legal intent" } }, "additionalProperties": false, "type": "object", "required": [ - "spec_id", - "content_version", - "role_keys", - "rows", - "input_content_versions" + "catalog_version", + "schema_version", + "member_types", + "constraint_ids", + "retry_modes", + "envelope_schema", + "component_schemas", + "intent_schemas_tolerant", + "minimal_intents" ], - "title": "PublishFrameRequest" + "title": "ReleaseDocumentResponse", + "description": "`GET /api/presentation/release`'s body. It carries the pinned\ncatalogue release's own identity and the vocabulary a client needs\nto mount tools without a second, out-of-band fetch of the catalogue\nbundle." }, - "PublishFrameResponse": { + "ReleaseModel": { "properties": { - "schema_version": { - "type": "integer", - "const": 1, - "title": "Schema Version", - "default": 1 + "date": { + "type": "string", + "title": "Date", + "description": "the release date, YYYY-MM-DD" }, - "published": { - "$ref": "#/components/schemas/PublishedFrameCoordinates" + "title": { + "type": "string", + "title": "Title", + "description": "the release title, plain text" + }, + "changes": { + "items": { + "$ref": "#/components/schemas/ChangeModel" + }, + "type": "array", + "title": "Changes" } }, "additionalProperties": false, "type": "object", "required": [ - "published" + "date", + "title" ], - "title": "PublishFrameResponse" + "title": "ReleaseModel", + "description": "One release of a source's DFO pipeline." }, - "PublishedFrameCoordinates": { + "RenderBody": { "properties": { - "spec_id": { - "type": "string", - "title": "Spec Id" - }, - "content_version": { - "type": "string", - "title": "Content Version" - }, - "artifact_digest": { - "type": "string", - "title": "Artifact Digest" - }, - "created": { - "type": "boolean", - "title": "Created", - "description": "true when this call newly recorded the version row; false when an identical publish of this exact pair had already been recorded (the idempotent replay path)" + "frame": { + "$ref": "#/components/schemas/RenderFrame" } }, "additionalProperties": false, "type": "object", "required": [ - "spec_id", - "content_version", - "artifact_digest", - "created" + "frame" ], - "title": "PublishedFrameCoordinates" + "title": "RenderBody", + "description": "The frame to draw the revision on." }, - "QueryEcho": { + "RenderFrame": { "properties": { - "entry_path": { + "spec_id": { "type": "string", - "enum": [ - "raw_text", - "parsed", - "dataset_resubmit" - ], - "title": "Entry Path", - "description": "which input was used" - }, - "raw_query": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Raw Query", - "description": "the original query text, when one was supplied" - }, - "normalized_query": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Normalized Query", - "description": "normalised query text, when extraction ran" + "title": "Spec Id" }, - "extract_skipped": { - "type": "boolean", - "title": "Extract Skipped", - "description": "true when the extraction step was skipped for this request" + "content_version": { + "type": "string", + "title": "Content Version" } }, "additionalProperties": false, "type": "object", "required": [ - "entry_path", - "extract_skipped" + "spec_id", + "content_version" ], - "title": "QueryEcho", - "description": "What the response was understood to be answering." + "title": "RenderFrame" }, - "RawTextInput": { + "ReplayedFrameResponse": { "properties": { - "kind": { + "spec_id": { "type": "string", - "const": "raw_text", - "title": "Kind", - "description": "discriminator for natural-language query input", - "default": "raw_text" + "title": "Spec Id" }, - "query": { + "content_version": { "type": "string", - "title": "Query", - "description": "the user's natural-language request" + "title": "Content Version" } }, "additionalProperties": false, "type": "object", "required": [ - "query" + "spec_id", + "content_version" ], - "title": "RawTextInput", - "description": "Natural-language query input. The engine extracts, resolves, and grounds it." + "title": "ReplayedFrameResponse" }, - "Recipe": { + "Resolution": { "properties": { "schema_version": { "type": "integer", "const": 1, "title": "Schema Version", - "description": "recipe schema version; exactly 1" + "description": "contract schema version; exactly 1 for v1. Required on every response.", + "default": 1 }, - "normal_form_hash": { - "type": "string", - "pattern": "^rnf_[0-9a-f]{32}$", - "title": "Normal Form Hash", - "description": "hash of the recipe's normal form, in which every derived input is replaced by its own recipe, every root by its dataset spec_id and rendering, and every literal a rolling overlay governs is dropped. Two frames replayed from one recipe on different data share it" + "query_echo": { + "$ref": "#/components/schemas/QueryEcho", + "description": "what the response was understood to be answering" }, - "replay_key": { - "type": "string", - "pattern": "^rpk_[0-9a-f]{32}$", - "title": "Replay Key", - "description": "hash of the normal form hash, the root dataset pairs, and the execution identity. It names the one frame replayed from them" + "diagnostics": { + "$ref": "#/components/schemas/Diagnostics", + "description": "run health, warnings, timing, build stamp" }, - "execution_identity": { + "kind": { "type": "string", - "maxLength": 1024, - "minLength": 1, - "title": "Execution Identity", - "description": "the engine, grammar, and reduction versions that ran the recipe" - }, - "tree": { - "additionalProperties": { - "$ref": "#/components/schemas/JsonValue" - }, - "type": "object", - "title": "Tree", - "description": "the op-spec tree, opaque here; analysis-mcp owns its shape" + "const": "resolution", + "title": "Kind", + "description": "discriminator for a response that resolved the question into data", + "default": "resolution" }, - "roots": { + "parts": { "items": { - "$ref": "#/components/schemas/JsonValue" + "oneOf": [ + { + "$ref": "#/components/schemas/DefinitePart" + }, + { + "$ref": "#/components/schemas/CandidatesPart" + }, + { + "$ref": "#/components/schemas/NoDataPart" + }, + { + "$ref": "#/components/schemas/UnsupportedPart" + } + ], + "discriminator": { + "propertyName": "status", + "mapping": { + "candidates": "#/components/schemas/CandidatesPart", + "definite": "#/components/schemas/DefinitePart", + "no_data": "#/components/schemas/NoDataPart", + "unsupported": "#/components/schemas/UnsupportedPart" + } + } }, "type": "array", - "title": "Roots", - "description": "how each root dataset was minted, opaque here; analysis-mcp owns its shape" + "minItems": 1, + "title": "Parts", + "description": "one entry per variable asked, in query order" }, - "anchor": { + "rendered_sentence": { "anyOf": [ { - "$ref": "#/components/schemas/RecipeAnchor" + "type": "string" }, { "type": "null" } ], - "description": "the rolling anchor, or null for a recipe with no rolling period" + "title": "Rendered Sentence", + "description": "the envelope-level confirmation sentence describing the whole query, composed across every part's own sentence in query order. When every contributing part is definite, their headings join into one sentence. A qualifier axis (where, when, or source, each a wire value of axis, plus origin, identified by role=='origin' instead since SentenceAxis has no 'origin' member) whose bound value agrees across every contributing part is stated once after the joined phrases, a possessive lead every part shares opens the sentence once, and the byline follows once. A qualifier that differs stays inline in each part's own phrase. The response falls back to one sentence per part, each part's own text left exactly as that part rendered it, when a part is still resolving, when the parts' bylines differ, or when a differing qualifier's connective opens with a comma (a period range). A part still resolving contributes up to three tokens of its own: an optional prefix text token, its own variable_text as an editable slot, and a text token stating the outcome. A lone part that is not definite composes to exactly that part's own sentence. After the headings and bylines, each part's departures follow in part order as segment='departure' tokens carrying that part's part_index. This is the one sentence that writes out a definite part's departures. The parts' assumptions close the sentence as segment='assumption' tokens. A joined sentence takes one clause, each item carrying the part_index of its part and an item two parts share carrying none. A sentence written part by part takes each part's own clause after its departures. There, a part whose sentence and clause both repeat an earlier part's is stated once with it, that sentence and clause carrying no part_index, followed by each part's own departures, and a part whose clause differs keeps its own sentence. On a mixed resolution with at least one definite part, the sentence opens 'Answered N of M parts.', where N counts the definite parts, folded ones included, and M is len(parts)." + }, + "sentence_plan": { + "anyOf": [ + { + "items": { + "$ref": "#/components/schemas/SentenceToken" + }, + "type": "array" + }, + { + "type": "null" + } + ], + "title": "Sentence Plan", + "description": "the ordered token form of rendered_sentence, present under the same condition; null or omitted otherwise. Composed the same way rendered_sentence is, from every part's own sentence_plan -- see SentenceToken.part_index for how a client recovers which parts[i] each variable phrase and attached qualifier belongs to, and which tokens are shared skeleton (an inter-phrase connective, a hoisted shared qualifier, the terminal '.', or the shared ' ' the per-part fallback puts between two sentences) rather than any one part's own. On a mixed resolution with at least one definite part, the plan opens with two segment='coverage' tokens carrying no part_index, 'Answered N of M parts.' and ' '. A mixed resolution with no definite part has no opener." + }, + "skills": { + "anyOf": [ + { + "additionalProperties": { + "$ref": "#/components/schemas/Skill" + }, + "type": "object" + }, + { + "type": "null" + } + ], + "title": "Skills", + "description": "every skill named by any Spec.resolved.skills across this response's parts, keyed by id -- each id any Spec carries is a key here, and each key's front matter is carried once regardless of how many Specs name it. Present under response_options.include_skills; null when the option is off, {} when it is on and no Spec matched anything." + }, + "status": { + "type": "string", + "enum": [ + "definite", + "candidates", + "no_data", + "unsupported", + "mixed" + ], + "title": "Status", + "description": "the parts' shared status when every part agrees, or 'mixed' when two or more parts differ; derived from parts, never independently settable", + "readOnly": true } }, - "additionalProperties": false, "type": "object", "required": [ - "schema_version", - "normal_form_hash", - "replay_key", - "execution_identity", - "tree", - "roots" + "query_echo", + "diagnostics", + "parts", + "status", + "kind" ], - "title": "Recipe" + "title": "Resolution", + "description": "A resolve response that resolved the question into data: one part per\nvariable asked, in query order, each a complete outcome carrying its own\nstatus and payload.\n\nA single-variable query is one part, so `status` reads that one part's\nstatus directly. A query in which extraction found no variable is also\none part, whose `variable_text` is the whole query text.\n\n`status` below is a computed field that rides in every serialised\nresponse body without being a settable input, so this class stays a\nplain `BaseModel`, which allows unknown fields. `StrictModel` forbids them,\nwhich would make `Resolution.model_validate` reject its own `model_dump()`\noutput, breaking every round-trip a client or this codebase does on a\nfetched response body. A posted `status` is ignored and recomputed.\n\nUsage::\n\n resp = RESOLVE_RESPONSE_ADAPTER.validate_python(obj)\n if resp.kind == \"resolution\":\n resp.status # \"definite\" | \"candidates\" | \"no_data\" | \"unsupported\" | \"mixed\"\n resp.parts[0].status # this part's own status" }, - "RecipeAnchor": { + "ResolutionTrace": { "properties": { - "period": { - "type": "string", - "maxLength": 1024, - "minLength": 1, - "title": "Period", - "description": "a period label at the frame's grain" + "resolved_entities": { + "items": { + "$ref": "#/components/schemas/GraphRef" + }, + "type": "array", + "title": "Resolved Entities", + "description": "every entity" }, - "rule": { - "type": "string", - "const": "half1", - "title": "Rule", - "description": "the anchor rule: the newest period at least half of the series hold" + "resolved_sources": { + "items": { + "$ref": "#/components/schemas/ProvenanceRef" + }, + "type": "array", + "title": "Resolved Sources", + "description": "every dataset/source (a Data Commons provenance)" }, - "left_out": { + "slot_filters": { "items": { - "$ref": "#/components/schemas/RecipeLeftOutSeries" + "$ref": "#/components/schemas/ResolvedFilter" }, "type": "array", - "title": "Left Out" - } - }, - "additionalProperties": false, - "type": "object", - "required": [ - "period", - "rule", - "left_out" - ], - "title": "RecipeAnchor", - "description": "The period a rolling recipe's `latest` resolved to, and the series it left out." - }, - "RecipeLeftOutSeries": { - "properties": { - "root": { - "type": "integer", - "minimum": 0.0, - "title": "Root", - "description": "index of the population the series belongs to, in the order of the recipe's populations: one per root dataset" + "title": "Slot Filters", + "description": "each applied bind decision, slot by slot" }, - "coordinates": { - "additionalProperties": { - "type": "string", - "maxLength": 1024, - "minLength": 1 + "query_qualifiers": { + "items": { + "$ref": "#/components/schemas/ResolvedQualifier" }, - "type": "object", - "title": "Coordinates", - "description": "the series' dimension values, column name to value. Holds `stat_var` or at least one entity-role column" + "type": "array", + "title": "Query Qualifiers", + "description": "each narrowing term the request's text named, and what became of it (see ResolvedQualifier). Defaulted empty: a dataset_resubmit identity entry carries no query text to re-derive this from, and every hand-built fixture and same-shape merge that predates this field still validates." }, - "label": { + "requested_window": { "anyOf": [ + { + "$ref": "#/components/schemas/TimeWindow" + }, { "type": "string", - "maxLength": 1024, - "minLength": 1 + "const": "latest" }, { "type": "null" } ], - "title": "Label", - "description": "the series' display name. Optional: a reader of the recipe resolves the name from `coordinates` when it is absent" - } - }, - "additionalProperties": false, - "type": "object", - "required": [ - "root", - "coordinates" - ], - "title": "RecipeLeftOutSeries", - "description": "One series a rolling anchor left out: it holds no row at the anchor period.\n\n`coordinates` must name the series, since a reader labels it from them: they hold\n`stat_var`, or at least one entity-role column, which is any column other than the frame\ngrammar's fixed columns (`stat_var`, `time_period`, `value`, `unit`, `status`) and its\nfacet identity columns (`measurementMethod`, `provenance`). Empty coordinates, and\ncoordinates of only those other columns, are refused." - }, - "RecipeWriteResponse": { - "properties": { - "spec_id": { - "type": "string", - "title": "Spec Id" + "title": "Requested Window", + "description": "the date window originally requested (query intent), independent of coverage narrowing; None when no date was requested. The literal \"latest\" means the query explicitly asked for the most-recent/current value -- distinct from None (no date signal at all), since a resubmit of a \"latest\" spec must re-resolve to whatever year is CURRENTLY latest, not pin to the year this response happened to resolve. spec_id is anchored on this value, not on the served window, so identity stays stable across a resubmit even when coverage narrows the dates. Preserve the returned Spec.definition.identity when resubmitting; if editing it, carry this value at ResubmitIdentityPayload.identity.requested_window to keep that stability." }, - "content_version": { - "type": "string", - "title": "Content Version" + "capability_version": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Capability Version", + "description": "the deployment capability version that produced this Spec, shared verbatim with GET /api/search/capabilities and every problem-details body's own capability_version. None only in hand-built fixtures that predate this field; every engine-produced Spec populates it." }, - "created": { - "type": "boolean", - "title": "Created", - "description": "true when this call stored the recipe; false when the frame already held a recipe with the same normal_form_hash and replay_key" - } - }, - "additionalProperties": false, - "type": "object", - "required": [ - "spec_id", - "content_version", - "created" - ], - "title": "RecipeWriteResponse" - }, - "RefreshFrameRequest": { - "properties": { - "spec_id": { - "type": "string", - "maxLength": 200, - "pattern": "^(?:spec|ops)_[^/\\s]+$", - "title": "Spec Id" + "default_reading": { + "anyOf": [ + { + "$ref": "#/components/schemas/TraceDefaultReading" + }, + { + "type": "null" + } + ], + "description": "what the default price-basis reading did before bind (see TraceDefaultReading); None when no bind ran for this Spec, as on a resubmit, or in hand-built fixtures that predate this field" }, - "content_version": { - "type": "string", - "maxLength": 200, - "pattern": "^(?:cv|ocv)_[^/\\s]+$", - "title": "Content Version" + "stated_form": { + "anyOf": [ + { + "type": "string", + "enum": [ + "per_person", + "per_head_base", + "per_area", + "rate", + "share" + ] + }, + { + "type": "null" + } + ], + "title": "Stated Form", + "description": "the normalised form the quantity read found in the question when no wording pattern named one (\"debt to GDP\" asks for a rate), and which the answer was then checked against; None when a wording pattern named the form, when the question asks for none, and when no bind ran for this Spec" + }, + "conversion": { + "anyOf": [ + { + "$ref": "#/components/schemas/TraceConversion" + }, + { + "type": "null" + } + ], + "description": "always absent: conversion is recorded per series in resolved.observations.series[].conversion (see TraceConversion)" } }, "additionalProperties": false, "type": "object", "required": [ - "spec_id", - "content_version" + "resolved_entities", + "resolved_sources", + "slot_filters" ], - "title": "RefreshFrameRequest", - "description": "The frame to refresh. An `ops_` id is accepted by the grammar and refused\n`frame_not_refreshable`." + "title": "ResolutionTrace", + "description": "Consolidated record of how the query was understood." }, - "RegisterRequest": { + "ResolveOptions": { "properties": { - "schema_version": { - "type": "integer", - "const": 1, - "title": "Schema Version", - "description": "contract schema version; exactly 1 for v1" + "include_option_coverage": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "null" + } + ], + "title": "Include Option Coverage", + "description": "when true, the engine probes each top-level interpretation and candidate Spec's slot_options for observation coverage (e.g. 'Kenya — 205 obs') and populates SlotOption.coverage; false/absent (the default) never fires the extra probes, so this is opt-in latency, not a hidden cost on the hot path. Delivery differs by transport, for every input kind: over SSE (Accept: text/event-stream), coverage arrives via trailing slot_options/entity_options events emitted after the response event, and the response event's own Spec.resolved.slot_options / entity_options stay coverage=null; on the buffered JSON body, coverage is embedded directly in the returned Spec. Spec.resolved.facet_options is computed whether or not this is set; over SSE with this set, it arrives in trailing facet_options events instead of the response event." }, - "definition": { - "$ref": "#/components/schemas/CanonicalDefinition", - "description": "the canonical definition to register" + "include_observations": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "null" + } + ], + "title": "Include Observations", + "description": "when true (the default is false -- absent also means false), the engine populates Spec.resolved.observations with the resolved answer's observation values: the full series when small enough, otherwise a bounded latest-points preview. This per-spec fetch runs only after the engine commits to a definite spec, including a promoted candidate; a multi-candidate response keeps per-candidate metadata and coverage without fetching observations. Delivery mirrors include_option_coverage's transport split: over SSE, observations arrive via a trailing observations event emitted after the response event, and the response event's own Spec.resolved.observations stays null or omitted; on the buffered JSON body, observations are embedded directly in the returned Spec." + }, + "include_skills": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "null" + } + ], + "title": "Include Skills", + "description": "when true (the default is false -- absent also means false), the engine matches every resolved Spec's bound graph nodes (its shape's structural anchors and the dcids its bound constraint slots name) and its selected provenance (facets.provenance.ref, when one provenance serves every series) against the shared skills index and populates Spec.resolved.skills with the matching skill ids: skills matched through a graph node first, nearest-attachment-first, then skills matched only through the provenance, by id; [] when nothing matched. The response's own skills map then carries every named skill's front matter once, keyed by id. When the shared skills index has not yet built a first snapshot, the response carries the skills_index_unavailable diagnostics warning instead and no Spec gets a populated skills field; when a snapshot is available but its own build may have left out a published skill or served one excluded or understated (a read stopped at a budget or bound, the build's content budget ran out before a skill's turn, or a build step failed), the response instead carries the skills_index_incomplete diagnostics warning alongside whatever matches it did serve; a part with no resolved spec (no_data, unsupported) carries the part-scoped skills_not_matchable warning, since it binds no graph nodes to match against." } }, "additionalProperties": false, "type": "object", - "required": [ - "schema_version", - "definition" - ], - "title": "RegisterRequest", - "description": "`POST /api/datasets/register`'s body: one canonical `definition`.\n`unsupported_schema_version` (the top-level `schema_version` field's own\nrefusal) and any other shape failure surface through the platform's\ngeneric `RequestValidationError` handling." + "title": "ResolveOptions", + "description": "Optional resolution parameters the caller may supply." }, - "RelatedMeasure": { + "ResolveResponse": { "properties": { - "stat_var": { - "$ref": "#/components/schemas/GraphRef", - "description": "the StatVar this measure reads, labelled with its graph name, or its dcid when it has none" - }, - "definition": { - "$ref": "#/components/schemas/SpecDefinition", - "description": "the measure's own {schema_version, spec_id, identity}" + "results": { + "items": { + "$ref": "#/components/schemas/ResolveResult" + }, + "type": "array", + "title": "Results" } }, - "additionalProperties": false, "type": "object", "required": [ - "stat_var", - "definition" + "results" ], - "title": "RelatedMeasure", - "description": "One other StatVar from the StatVarGroup this Spec's one StatVar belongs to (see\nResolvedSpec.related_measures), with data at the Spec's places.\n\n`definition` is minted from the member's own five-tuple and constraint values, with this\nSpec's entities and requested window and no facets, since a unit or source this Spec\npins belongs to its own measure. Post `definition` back as `identity` on a\ndataset_resubmit identity entry to switch onto this measure." + "title": "GraphResolveResponse", + "description": "`results` is index-aligned with the request's `texts`." }, - "Relaxation": { + "ResolveResult": { "properties": { - "axis": { + "input": { + "type": "string", + "title": "Input" + }, + "status": { "type": "string", "enum": [ - "what", - "how", - "where", - "when", - "source" + "resolved", + "ambiguous", + "not_found", + "not_held" ], - "title": "Axis", - "description": "the slot axis whose binding was relaxed" + "title": "Status" }, - "property_dcid": { + "entity": { "anyOf": [ { - "type": "string" + "$ref": "#/components/schemas/EntityRef" }, { "type": "null" } - ], - "title": "Property Dcid", - "description": "the constraint property dcid the relaxed slot carried, when one exists" - }, - "dropped_value_dcids": { - "items": { - "type": "string" - }, - "type": "array", - "title": "Dropped Value Dcids", - "description": "the taxonomy member dcid(s) the relaxed binding dropped" - } - }, - "additionalProperties": false, - "type": "object", - "required": [ - "axis", - "dropped_value_dcids" - ], - "title": "Relaxation", - "description": "Which definition part a nearest_real suggestion relaxed to find data.\n\nCaptured at the point a constraint binding is dropped and the resulting,\nwidened request is re-confirmed against the live graph (see\nNearestRealSpec). Names the definition part relaxed (axis + the\nconstraint property it carried) and the value(s) it dropped." - }, - "ReleaseDocumentResponse": { - "properties": { - "catalog_version": { - "type": "string", - "title": "Catalog Version", - "description": "the catalogue release this deployment serves" - }, - "schema_version": { - "type": "integer", - "title": "Schema Version", - "description": "the envelope schema version this release resolves against" + ] }, - "member_types": { - "items": { - "type": "string" - }, - "type": "array", - "title": "Member Types", - "description": "every component type this release's catalogue defines" + "matched": { + "anyOf": [ + { + "$ref": "#/components/schemas/Matched" + }, + { + "type": "null" + } + ] }, - "constraint_ids": { - "items": { - "type": "string" - }, - "type": "array", - "title": "Constraint Ids", - "description": "every constraint id this release's registry enforces" + "reading": { + "anyOf": [ + { + "type": "string", + "enum": [ + "members", + "entity" + ] + }, + { + "type": "null" + } + ], + "title": "Reading" }, - "retry_modes": { - "additionalProperties": { - "type": "string" - }, - "type": "object", - "title": "Retry Modes", - "description": "`retry_modes` is the headline mode per code, and the per-response `retryable` boolean is the authoritative value for every code. `schema_invalid` and `frame_unavailable` vary by cause, and `request_invalid` is always false although its headline mode is `correct_and_retry`." + "projection": { + "anyOf": [ + { + "$ref": "#/components/schemas/Projection" + }, + { + "type": "null" + } + ] }, - "envelope_schema": { - "additionalProperties": true, - "type": "object", - "title": "Envelope Schema", - "description": "the envelope JSON Schema this release's assembler validates a minted envelope against; every create/revise/read body's `resolved_payload` conforms to it" + "member_count": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ], + "title": "Member Count" }, - "component_schemas": { - "additionalProperties": { - "additionalProperties": true, - "type": "object" - }, - "type": "object", - "title": "Component Schemas", - "description": "each member type's own component JSON Schema, keyed by member type. `envelope_schema`'s `component` field `$ref`s these schemas by their own `$id`, which otherwise resolves nowhere, so a client validating `resolved_payload` resolves those `$ref`s against this map" + "members": { + "anyOf": [ + { + "type": "string" + }, + { + "items": { + "$ref": "#/components/schemas/NodeRef" + }, + "type": "array" + }, + { + "type": "null" + } + ], + "title": "Members" }, - "intent_schemas_tolerant": { - "additionalProperties": { - "additionalProperties": true, - "type": "object" - }, - "type": "object", - "title": "Intent Schemas Tolerant", - "description": "each member type's own tolerant intent schema" + "candidates": { + "anyOf": [ + { + "items": { + "$ref": "#/components/schemas/EntityRef" + }, + "type": "array" + }, + { + "type": "null" + } + ], + "title": "Candidates" }, - "minimal_intents": { - "additionalProperties": { - "additionalProperties": true, - "type": "object" - }, - "type": "object", - "title": "Minimal Intents", - "description": "each member type's own minimal legal intent" + "near_matches": { + "anyOf": [ + { + "items": { + "$ref": "#/components/schemas/EntityRef" + }, + "type": "array" + }, + { + "type": "null" + } + ], + "title": "Near Matches" } }, - "additionalProperties": false, "type": "object", "required": [ - "catalog_version", - "schema_version", - "member_types", - "constraint_ids", - "retry_modes", - "envelope_schema", - "component_schemas", - "intent_schemas_tolerant", - "minimal_intents" + "input", + "status", + "entity", + "matched", + "reading", + "projection", + "member_count", + "members", + "candidates", + "near_matches" ], - "title": "ReleaseDocumentResponse", - "description": "`GET /api/presentation/release`'s body. It carries the pinned\ncatalogue release's own identity and the vocabulary a client needs\nto mount tools without a second, out-of-band fetch of the catalogue\nbundle." + "title": "GraphResolveResult", + "description": "One text's outcome. `input` echoes the text; fields a status does not use are `null`.\n\n- `resolved`: `entity`, `matched` and `reading`. A group or region adds `projection`,\n `member_count` and `members`: the list route's link, or the members inline (at most\n 256) when the request expanded them. The three are `null` for a region the membership\n policy does not hold. `near_matches` lists up to 3 other places or organisations of the\n requested kinds that share the name (\"Georgia\" resolves to the country, with the US\n state `geoId/13` here), else `null`. When `kinds` removed the first match, a node of a\n requested kind sharing the name resolves in its place and `near_matches` lists the\n removed match (\"Georgia\" with `kinds: [\"place_other\"]` resolves to `geoId/13`, with\n the country here).\n- `ambiguous`: `candidates`, in the resolver's order. When `kinds` removed the first\n match and up to 3 nodes of a requested kind share the name, `near_matches` lists the\n removed match, else `null`.\n- `not_found`: `near_matches`, hints for a person; a program should pick none by id.\n- `not_held`: `entity`, the id the resolver named, which does not open on the node route.\n\n`reading` is `members` when the text names a group's members (\"EU countries\"), else\n`entity`." }, - "ReleaseModel": { + "ResolvedEntity": { "properties": { - "date": { + "ref": { "type": "string", - "title": "Date", - "description": "the release date, YYYY-MM-DD" + "title": "Ref", + "description": "the resolved entity's dcid" }, - "title": { - "type": "string", - "title": "Title", - "description": "the release title, plain text" + "label": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Label", + "description": "plain-language display name" }, - "changes": { - "items": { - "$ref": "#/components/schemas/ChangeModel" - }, - "type": "array", - "title": "Changes" - } - }, - "additionalProperties": false, - "type": "object", - "required": [ - "date", - "title" - ], - "title": "ReleaseModel", - "description": "One release of a source's DFO pipeline." - }, - "RenderBody": { - "properties": { - "frame": { - "$ref": "#/components/schemas/RenderFrame" - } - }, - "additionalProperties": false, - "type": "object", - "required": [ - "frame" - ], - "title": "RenderBody", - "description": "The frame to draw the revision on." - }, - "RenderFrame": { - "properties": { - "spec_id": { - "type": "string", - "title": "Spec Id" + "entity_type": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Entity Type", + "description": "e.g. Country, AdministrativeArea1, Organization" }, - "content_version": { - "type": "string", - "title": "Content Version" - } - }, - "additionalProperties": false, - "type": "object", - "required": [ - "spec_id", - "content_version" - ], - "title": "RenderFrame" - }, - "ReplayedFrameResponse": { - "properties": { - "spec_id": { + "role": { "type": "string", - "title": "Spec Id" + "enum": [ + "observationAbout", + "origin", + "destination" + ], + "title": "Role", + "description": "the role key this entity plays; observationAbout, origin, or destination" }, - "content_version": { - "type": "string", - "title": "Content Version" + "multilateral": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "null" + } + ], + "title": "Multilateral", + "description": "true for an origin entity that is a multilateral organisation, an official organisation such as IDA or the EU institutions, whose outflows spend the core contributions its funders made to it, so a donor total counting those contributions already holds them; absent for every other entity" + }, + "confidence": { + "anyOf": [ + { + "type": "string", + "enum": [ + "high", + "medium", + "low" + ] + }, + { + "type": "null" + } + ], + "title": "Confidence", + "description": "the engine's confidence in this entity resolution; None when not assessed -- no entity-resolution confidence signal exists yet, so this ships None on every entity today" } }, "additionalProperties": false, "type": "object", "required": [ - "spec_id", - "content_version" + "ref", + "role" ], - "title": "ReplayedFrameResponse" + "title": "ResolvedEntity", + "description": "One resolved entity on the wire, under `resolved.entities`: the flat\nprojection of the engine's own `Entity` -- `ref`/`entity_type` collapse from\na `GraphRef` to a bare dcid/label pair, and `role` collapses from the\nengine's richer role model to the role-key string it already derives from\n(the identity core's own vocabulary, so this never adds a second mapping)." }, - "Resolution": { + "ResolvedFacet": { "properties": { - "schema_version": { - "type": "integer", - "const": 1, - "title": "Schema Version", - "description": "contract schema version; exactly 1 for v1. Required on every response.", - "default": 1 - }, - "query_echo": { - "$ref": "#/components/schemas/QueryEcho", - "description": "what the response was understood to be answering" - }, - "diagnostics": { - "$ref": "#/components/schemas/Diagnostics", - "description": "run health, warnings, timing, build stamp" - }, - "kind": { + "basis": { "type": "string", - "const": "resolution", - "title": "Kind", - "description": "discriminator for a response that resolved the question into data", - "default": "resolution" + "enum": [ + "bound", + "declared_default", + "fallback" + ], + "title": "Basis", + "description": "'bound' when this axis was constrained by the request, 'declared_default' when an unbound axis was completed from a declared deployment policy, 'fallback' when neither applies and the deployment policy supplied the value: facets holding a point in the requested years first, then DFO's facets for a variable both DFO and base Data Commons hold, then the most places or role tuples covered there, then the most requested years the span covers, then most observations, then the latest observation, then a deterministic tie-break" }, - "parts": { - "items": { - "oneOf": [ - { - "$ref": "#/components/schemas/DefinitePart" - }, - { - "$ref": "#/components/schemas/CandidatesPart" - }, - { - "$ref": "#/components/schemas/NoDataPart" - }, - { - "$ref": "#/components/schemas/UnsupportedPart" - } - ], - "discriminator": { - "propertyName": "status", - "mapping": { - "candidates": "#/components/schemas/CandidatesPart", - "definite": "#/components/schemas/DefinitePart", - "no_data": "#/components/schemas/NoDataPart", - "unsupported": "#/components/schemas/UnsupportedPart" - } + "ref": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" } - }, - "type": "array", - "minItems": 1, - "title": "Parts", - "description": "one entry per variable asked, in query order" + ], + "title": "Ref", + "description": "the axis's resolved dcid, present when one distinct value served every carried series; absent when selection is 'per_series'" + }, + "label": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Label", + "description": "best-effort display label for ref; present only alongside ref" }, - "rendered_sentence": { + "currency": { "anyOf": [ { - "type": "string" + "type": "string", + "pattern": "^[A-Z]{3}$" }, { "type": "null" } ], - "title": "Rendered Sentence", - "description": "the envelope-level confirmation sentence describing the whole query, composed across every part's own sentence in query order. When every contributing part is definite, their headings join into one sentence. A qualifier axis (where, when, or source, each a wire value of axis, plus origin, identified by role=='origin' instead since SentenceAxis has no 'origin' member) whose bound value agrees across every contributing part is stated once after the joined phrases, a possessive lead every part shares opens the sentence once, and the byline follows once. A qualifier that differs stays inline in each part's own phrase. The response falls back to one sentence per part, each part's own text left exactly as that part rendered it, when a part is still resolving, when the parts' bylines differ, or when a differing qualifier's connective opens with a comma (a period range). A part still resolving contributes up to three tokens of its own: an optional prefix text token, its own variable_text as an editable slot, and a text token stating the outcome. A lone part that is not definite composes to exactly that part's own sentence. After the headings and bylines, each part's departures follow in part order as segment='departure' tokens carrying that part's part_index. This is the one sentence that writes out a definite part's departures. The parts' assumptions close the sentence as segment='assumption' tokens. A joined sentence takes one clause, each item carrying the part_index of its part and an item two parts share carrying none. A sentence written part by part takes each part's own clause after its departures. There, a part whose sentence and clause both repeat an earlier part's is stated once with it, that sentence and clause carrying no part_index, followed by each part's own departures, and a part whose clause differs keeps its own sentence. On a mixed resolution with at least one definite part, the sentence opens 'Answered N of M parts.', where N counts the definite parts, folded ones included, and M is len(parts)." + "title": "Currency", + "description": "unit axis only, alongside ref: the ISO 4217 code of the currency ref is denominated in, from the graph's currency units (CurrencyUSD, USDollar and the base Data Commons Currency members such as INR); absent when ref is no currency. The sentence reads it: US dollars go to the byline's unit token, any other currency stays in the heading" }, - "sentence_plan": { + "source": { "anyOf": [ { - "items": { - "$ref": "#/components/schemas/SentenceToken" - }, - "type": "array" + "$ref": "#/components/schemas/SourceRef" }, { "type": "null" } ], - "title": "Sentence Plan", - "description": "the ordered token form of rendered_sentence, present under the same condition; null or omitted otherwise. Composed the same way rendered_sentence is, from every part's own sentence_plan -- see SentenceToken.part_index for how a client recovers which parts[i] each variable phrase and attached qualifier belongs to, and which tokens are shared skeleton (an inter-phrase connective, a hoisted shared qualifier, the terminal '.', or the shared ' ' the per-part fallback puts between two sentences) rather than any one part's own. On a mixed resolution with at least one definite part, the plan opens with two segment='coverage' tokens carrying no part_index, 'Answered N of M parts.' and ' '. A mixed resolution with no definite part has no opener." + "description": "provenance axis only, alongside ref: the organisation behind the provenance, from the origin catalogue" }, - "skills": { + "data_commons": { "anyOf": [ { - "additionalProperties": { - "$ref": "#/components/schemas/Skill" - }, - "type": "object" + "$ref": "#/components/schemas/search__models__grammar__DataCommonsRef" }, { "type": "null" } ], - "title": "Skills", - "description": "every skill named by any Spec.resolved.skills across this response's parts, keyed by id -- each id any Spec carries is a key here, and each key's front matter is carried once regardless of how many Specs name it. Present under response_options.include_skills; null when the option is off, {} when it is on and no Spec matched anything." - }, - "status": { - "type": "string", - "enum": [ - "definite", - "candidates", - "no_data", - "unsupported", - "mixed" - ], - "title": "Status", - "description": "the parts' shared status when every part agrees, or 'mixed' when two or more parts differ; derived from parts, never independently settable", - "readOnly": true - } - }, - "type": "object", - "required": [ - "query_echo", - "diagnostics", - "parts", - "status", - "kind" - ], - "title": "Resolution", - "description": "A resolve response that resolved the question into data: one part per\nvariable asked, in query order, each a complete outcome carrying its own\nstatus and payload.\n\nA single-variable query is one part, so `status` reads that one part's\nstatus directly. A query in which extraction found no variable is also\none part, whose `variable_text` is the whole query text.\n\n`status` below is a computed field that rides in every serialised\nresponse body without being a settable input, so this class stays a\nplain `BaseModel`, which allows unknown fields. `StrictModel` forbids them,\nwhich would make `Resolution.model_validate` reject its own `model_dump()`\noutput, breaking every round-trip a client or this codebase does on a\nfetched response body. A posted `status` is ignored and recomputed.\n\nUsage::\n\n resp = RESOLVE_RESPONSE_ADAPTER.validate_python(obj)\n if resp.kind == \"resolution\":\n resp.status # \"definite\" | \"candidates\" | \"no_data\" | \"unsupported\" | \"mixed\"\n resp.parts[0].status # this part's own status" - }, - "ResolutionTrace": { - "properties": { - "resolved_entities": { - "items": { - "$ref": "#/components/schemas/GraphRef" - }, - "type": "array", - "title": "Resolved Entities", - "description": "every entity" - }, - "resolved_sources": { - "items": { - "$ref": "#/components/schemas/ProvenanceRef" - }, - "type": "array", - "title": "Resolved Sources", - "description": "every dataset/source (a Data Commons provenance)" - }, - "slot_filters": { - "items": { - "$ref": "#/components/schemas/ResolvedFilter" - }, - "type": "array", - "title": "Slot Filters", - "description": "each applied bind decision, slot by slot" - }, - "query_qualifiers": { - "items": { - "$ref": "#/components/schemas/ResolvedQualifier" - }, - "type": "array", - "title": "Query Qualifiers", - "description": "each narrowing term the request's text named, and what became of it (see ResolvedQualifier). Defaulted empty: a dataset_resubmit identity entry carries no query text to re-derive this from, and every hand-built fixture and same-shape merge that predates this field still validates." + "description": "provenance axis only, alongside ref: the Data Commons the provenance's data comes from" }, - "requested_window": { + "documentation": { "anyOf": [ { - "$ref": "#/components/schemas/TimeWindow" - }, - { - "type": "string", - "const": "latest" + "type": "string" }, { "type": "null" } ], - "title": "Requested Window", - "description": "the date window originally requested (query intent), independent of coverage narrowing; None when no date was requested. The literal \"latest\" means the query explicitly asked for the most-recent/current value -- distinct from None (no date signal at all), since a resubmit of a \"latest\" spec must re-resolve to whatever year is CURRENTLY latest, not pin to the year this response happened to resolve. spec_id is anchored on this value, not on the served window, so identity stays stable across a resubmit even when coverage narrows the dates. Preserve the returned Spec.definition.identity when resubmitting; if editing it, carry this value at ResubmitIdentityPayload.identity.requested_window to keep that stability." + "title": "Documentation", + "description": "provenance axis only, alongside ref: the Graph API route of the provenance's document, GET /api/graph/documentation/{dcid}" }, - "capability_version": { + "account": { "anyOf": [ { - "type": "string" + "$ref": "#/components/schemas/FlowAccount" }, { "type": "null" } ], - "title": "Capability Version", - "description": "the deployment capability version that produced this Spec, shared verbatim with GET /api/search/capabilities and every problem-details body's own capability_version. None only in hand-built fixtures that predate this field; every engine-produced Spec populates it." + "description": "provenance axis only, alongside ref: whose account of a flow the provenance gives, when ref is a dataset the code index declares; 'provider' when it reports flows as their providers record them" }, - "default_reading": { + "selection": { "anyOf": [ { - "$ref": "#/components/schemas/TraceDefaultReading" + "type": "string", + "const": "per_series" }, { "type": "null" } ], - "description": "what the default price-basis reading did before bind (see TraceDefaultReading); None when no bind ran for this Spec, as on a resubmit, or in hand-built fixtures that predate this field" + "title": "Selection", + "description": "'per_series' when the carried series select different values on this axis; present in place of ref/label, never alongside them" }, - "stated_form": { + "refs": { "anyOf": [ { - "type": "string", - "enum": [ - "per_person", - "per_head_base", - "per_area", - "rate", - "share" - ] + "items": { + "type": "string" + }, + "type": "array" }, { "type": "null" } ], - "title": "Stated Form", - "description": "the normalised form the quantity read found in the question when no wording pattern named one (\"debt to GDP\" asks for a rate), and which the answer was then checked against; None when a wording pattern named the form, when the question asks for none, and when no bind ran for this Spec" + "title": "Refs", + "description": "unit axis only, alongside selection 'per_series': the distinct unit dcids the carried series select, in series order; a series selecting no unit adds none" }, - "conversion": { + "request_basis": { "anyOf": [ { - "$ref": "#/components/schemas/TraceConversion" + "additionalProperties": { + "type": "string", + "enum": [ + "bound", + "declared_default", + "fallback" + ] + }, + "type": "object" }, { "type": "null" } ], - "description": "always absent: conversion is recorded per series in resolved.observations.series[].conversion (see TraceConversion)" + "title": "Request Basis", + "description": "per-member basis (currency/prices/base_year) for a unit axis bound through the request form; present only on the unit axis, alongside either ref/label or selection" } }, "additionalProperties": false, "type": "object", "required": [ - "resolved_entities", - "resolved_sources", - "slot_filters" + "basis" ], - "title": "ResolutionTrace", - "description": "Consolidated record of how the query was understood." + "title": "ResolvedFacet", + "description": "One facet axis's resolved value on a Spec (see ResolvedSpec.facets):\nwhich value backed the answer's observations, and why.\n\nbasis is always present. ref/label are present when one distinct value\nserved every carried series; selection carries \"per_series\" in their\nplace when the carried series select different values on this axis, and\nthe two never appear together. On the unit axis, refs lists those units.\nrequest_basis joins either shape, present only on the unit axis, only\nwhen unit was bound through the request form (currency/prices/base_year),\none basis value per member the request named.\n\nFields are flat and optional, validated by a model validator, rather\nthan a discriminated ref/selection union. basis and request_basis are\nshared by both the single-ref and per-series shapes, so a union would\nduplicate them across arms for a mechanical gain (moving the\nref/selection XOR to the type level) without expressing the\nrequest_basis-only-on-unit constraint, since that constraint is about\nwhich AXIS a ResolvedFacet lives under (see ResolvedSpec.facets), not\nits ref/selection shape. This is also response-only data, never\ndeserialized from untrusted client bytes, so a runtime validator is\nthe right tool for catching an illegal engine-side construction." }, - "ResolveOptions": { + "ResolvedFilter": { "properties": { - "include_option_coverage": { + "key": { + "$ref": "#/components/schemas/SlotKey", + "description": "the slot identity" + }, + "binding_kind": { + "type": "string", + "enum": [ + "value", + "set", + "unbound" + ], + "title": "Binding Kind", + "description": "which binding state was applied" + }, + "refs": { + "items": { + "$ref": "#/components/schemas/GraphRef" + }, + "type": "array", + "title": "Refs", + "description": "the bound graph objects (empty for unbound)" + }, + "provenance": { + "type": "string", + "enum": [ + "binder", + "text_recognized", + "measure_elected", + "declared_default", + "declared_grouping" + ], + "title": "Provenance", + "description": "whether the bind call's own election produced this value, a code row recognised in the query's own text forced it, a sector concept the text named bound its declared grouping of codes, or the measure-family election forced it on an axis the binder left open", + "default": "binder" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "key", + "binding_kind", + "refs" + ], + "title": "ResolvedFilter", + "description": "One applied bind decision, slot by slot." + }, + "ResolvedQualifier": { + "properties": { + "text": { + "type": "string", + "title": "Text", + "description": "verbatim span of the source text that named the term: variable_text, query_text, or a dropped qualifier phrase" + }, + "named": { + "items": { + "$ref": "#/components/schemas/GraphRef" + }, + "type": "array", + "title": "Named", + "description": "every code row the span names in the packaged index, any code system, and every measure value it names that the answer does not carry; empty when none did" + }, + "slot": { "anyOf": [ { - "type": "boolean" + "type": "string" }, { "type": "null" } ], - "title": "Include Option Coverage", - "description": "when true, the engine probes each top-level interpretation and candidate Spec's slot_options for observation coverage (e.g. 'Kenya — 205 obs') and populates SlotOption.coverage; false/absent (the default) never fires the extra probes, so this is opt-in latency, not a hidden cost on the hot path. Delivery differs by transport, for every input kind: over SSE (Accept: text/event-stream), coverage arrives via trailing slot_options/entity_options events emitted after the response event, and the response event's own Spec.resolved.slot_options / entity_options stay coverage=null; on the buffered JSON body, coverage is embedded directly in the returned Spec. Spec.resolved.facet_options is computed whether or not this is set; over SSE with this set, it arrives in trailing facet_options events instead of the response event." + "title": "Slot", + "description": "property dcid of the slot_filters entry whose binding consumed this term, or, on an unbound value the answer's shape has a slot for but leaves unmet, that slot's property; None otherwise" + }, + "disposition": { + "type": "string", + "enum": [ + "bound", + "unbound", + "no_vocabulary" + ], + "title": "Disposition", + "description": "\"bound\" when a final binding covers a named row (or a descendant of one); \"unbound\" when a code row was named but no binding covers it, or a measure value was named that the answer does not carry; \"no_vocabulary\" when the term names neither" + }, + "start": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ], + "title": "Start", + "description": "character offset where the term starts in the variable phrase" + }, + "end": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ], + "title": "End", + "description": "character offset where the term ends in the variable phrase" }, - "include_observations": { + "evidence": { "anyOf": [ { - "type": "boolean" + "type": "string", + "enum": [ + "label", + "synonym", + "model", + "uncovered", + "unavailable", + "unsupported" + ] }, { "type": "null" } ], - "title": "Include Observations", - "description": "when true (the default is false -- absent also means false), the engine populates Spec.resolved.observations with the resolved answer's observation values: the full series when small enough, otherwise a bounded latest-points preview. This per-spec fetch runs only after the engine commits to a definite spec, including a promoted candidate; a multi-candidate response keeps per-candidate metadata and coverage without fetching observations. Delivery mirrors include_option_coverage's transport split: over SSE, observations arrive via a trailing observations event emitted after the response event, and the response event's own Spec.resolved.observations stays null or omitted; on the buffered JSON body, observations are embedded directly in the returned Spec." + "title": "Evidence", + "description": "what read the term: a code label or synonym, the bind model, \"uncovered\" for words no reader covers on the elected shape, unbound beside a recognised code or naming a measure value the answer does not carry, and no_vocabulary beside none when the binder rated them as not stated by its series, \"unavailable\" for a code no table holds, \"unsupported\" for a distinction no binding expresses" }, - "include_skills": { + "operation": { "anyOf": [ { - "type": "boolean" + "type": "string", + "enum": [ + "union", + "refinement" + ] }, { "type": "null" } ], - "title": "Include Skills", - "description": "when true (the default is false -- absent also means false), the engine matches every resolved Spec's bound graph nodes (its shape's structural anchors and the dcids its bound constraint slots name) and its selected provenance (facets.provenance.ref, when one provenance serves every series) against the shared skills index and populates Spec.resolved.skills with the matching skill ids: skills matched through a graph node first, nearest-attachment-first, then skills matched only through the provenance, by id; [] when nothing matched. The response's own skills map then carries every named skill's front matter once, keyed by id. When the shared skills index has not yet built a first snapshot, the response carries the skills_index_unavailable diagnostics warning instead and no Spec gets a populated skills field; when a snapshot is available but its own build may have left out a published skill or served one excluded or understated (a read stopped at a budget or bound, the build's content budget ran out before a skill's turn, or a build step failed), the response instead carries the skills_index_incomplete diagnostics warning alongside whatever matches it did serve; a part with no resolved spec (no_data, unsupported) carries the part-scoped skills_not_matchable warning, since it binds no graph nodes to match against." + "title": "Operation", + "description": "how the term's codes combine with another term's on one code system: a union of both, or a refinement to the narrower" + }, + "selected": { + "items": { + "$ref": "#/components/schemas/GraphRef" + }, + "type": "array", + "title": "Selected", + "description": "the codes the term asked for before the combination simplified them" } }, "additionalProperties": false, "type": "object", - "title": "ResolveOptions", - "description": "Optional resolution parameters the caller may supply." + "required": [ + "text", + "named", + "disposition" + ], + "title": "ResolvedQualifier", + "description": "One narrowing term the request's text named, and what became of it.\n\nThe term's text can come from the variable phrase, from the verbatim\n`query_text`, or from an admitted qualifier tie (see\n`_resolve_query_qualifiers`). `text` is the verbatim span of whichever\nsource named it. `named` is every code row -- any system -- that span\nnames in the packaged index, and every measure value it names that the\nanswer does not carry (a dcid of the index's measure values, such as\n`amountMobilised`);\nempty when the text names neither (a `no_vocabulary` term). `slot`\nis the constraint property dcid of the `slot_filters` entry whose\nbinding consumed the term, or, on an `\"unbound\"` value the answer's shape\nhas a slot for but leaves unmet, that slot's property; `None` otherwise.\n`disposition` is\n`\"bound\"` when some final binding on a named row's code system covers\nit (that row or a descendant), `\"unbound\"` when a code row was named but\nno binding covers it or a measure value was named that the answer does not\ncarry, and `\"no_vocabulary\"` when the term names neither: an LLM-reported\nphrase (`bind`'s own `unplaced` output) that no taxonomy in this\ndeployment's index can express, an exclusion or comparison phrase\n(`\"unsupported\"`), or words beside no code the binder rated as not stated\non the elected shape (`\"uncovered\"`).\n\n`start` and `end` locate the term in the part's variable phrase. `evidence` says what\nread it, and `None` means a code's label or synonym matched the term as the query\nspelled it, the reading every recognised span records:\n\n- `\"label\"` and `\"synonym\"` name a match on a code's label or synonym; no record sets\n them, since a recognised span records `None`.\n- `\"model\"` marks a phrase the bind model read through a code it chose from the\n phrase's candidate menu, a lexical hit of the menu or a descendant of one\n (`phase_rank_bind._model_records`); `named` holds the chosen codes.\n- `\"uncovered\"` marks words no reader covers on the elected shape\n (`phase_rank_bind._coverage_records`). Beside a recognised code they are recorded\n `\"unbound\"` with that code's rows as `named`. On a shape the measure index describes,\n a word that every name of a measure value's reading holds names that value when no\n span names it and the answer does not carry it, and its record adds the value to\n `named`. Beside no code such a word is recorded `\"unbound\"` naming the value, whatever\n the binder rates it; \"mobilised\" names `amountMobilised` on an amount series. Other\n words beside no code are recorded `\"no_vocabulary\"` with `named` empty when the\n binder rates them below `SearchSettings.stated_word_bar` as not stated by the shape's\n series; a word it rates at the bar or above, or leaves unrated, reads as stated.\n- `\"unavailable\"` marks a code term the elected shape cannot apply: one naming only\n codes no shape can bind, or, on a part naming a dataset, one no row of that dataset\n holds (`phase_rank_bind._unavailable_qualifiers`), recorded `\"unbound\"`.\n- `\"unsupported\"` marks an exclusion or comparison phrase no binding expresses\n (`phase_rank_bind._unsupported_records`), recorded `\"no_vocabulary\"`.\n\n`operation` and `selected` describe how the term's codes combine with\nanother term's on one code system, and the codes it asked for before that\ncombination simplified." }, - "ResolveResponse": { + "ResolvedScope": { "properties": { - "results": { + "axis": { + "type": "string", + "enum": [ + "observationAbout", + "origin", + "destination" + ], + "title": "Axis", + "description": "the role-keyed axis the request left unnamed and the engine defaulted" + }, + "members": { "items": { - "$ref": "#/components/schemas/ResolveResult" + "$ref": "#/components/schemas/ResolvedEntity" }, "type": "array", - "title": "Results" + "title": "Members", + "description": "every entity on axis this Spec's read plan serves, sorted by ref; each carries role == axis and a best-effort label/entity_type from a batched graph read, None when the graph has neither" } }, + "additionalProperties": false, "type": "object", "required": [ - "results" + "axis", + "members" ], - "title": "GraphResolveResponse", - "description": "`results` is index-aligned with the request's `texts`." + "title": "ResolvedScope", + "description": "The full member set of an entity axis this Spec's request left unnamed\n(see ResolvedSpec.scope).\n\n``axis`` is observationAbout when place defaulting expanded a place-less\nrequest, and origin or destination when directional-role defaulting\nexpanded a role-bearing request. ``members`` lists the entities on that axis\nthe answer's read plan serves, the ones a coverage breadth dimension for the\nsame axis counts. members is the single-element [\"Earth\"] list when the query\nresolved as a worldwide total.\nThe response-level diagnostics may include place_scope_defaulted or\nrole_scope_defaulted for such resolution, but those warnings are not a\nper-Spec one-to-one representation of this field. The scope lives outside\nBaseIdentity, the spec hash, and resolved.entities: a resubmit of the\nsame definition rediscovers it from the live graph." }, - "ResolveResult": { + "ResolvedSpec": { "properties": { - "input": { - "type": "string", - "title": "Input" + "shape": { + "$ref": "#/components/schemas/Shape", + "description": "the structural family chosen" }, - "status": { - "type": "string", - "enum": [ - "resolved", - "ambiguous", - "not_found", - "not_held" - ], - "title": "Status" + "slots": { + "items": { + "$ref": "#/components/schemas/Slot" + }, + "type": "array", + "title": "Slots", + "description": "one entry per slot the shape defines, each in a binding state. Its what/how entries are the identity's slots, so a what/how property it leaves out is one no served member asserts" }, - "entity": { + "inapplicable_slots": { + "items": { + "type": "string" + }, + "type": "array", + "title": "Inapplicable Slots", + "description": "the slots whose property none of the resolved StatVars declares, listed by property dcid; empty when every slot applies. Joins to resolved.slots[*].key.property.ref. Applicability is graph state, so it is reported here and the slot itself reads 'unbound' in the definition either way. It is never a member of BaseIdentity, never hashed." + }, + "unresolved_slots": { + "items": { + "type": "string" + }, + "type": "array", + "title": "Unresolved Slots", + "description": "the slots whose property is present but unresolved on at least one resolved StatVar (the graph asserted a value for this axis but could not resolve it to a dcid), listed by property dcid; empty when no such slot exists. Joins to resolved.slots[*].key.property.ref, and is disjoint from inapplicable_slots: a property is either never asserted by any resolved StatVar (inapplicable_slots), present but unreadable on one (this field), or neither (a genuinely open axis). The slot itself reads 'unbound' in the definition in every one of these cases; it is never a member of BaseIdentity, never hashed." + }, + "stat_vars": { + "$ref": "#/components/schemas/ResolvedStatVars", + "description": "resolved StatVar(s) inside the region, and the scope they were drawn from" + }, + "entities": { + "items": { + "$ref": "#/components/schemas/ResolvedEntity" + }, + "type": "array", + "title": "Entities", + "description": "resolved entities the data is about; may be empty if where is unbound" + }, + "entity_groups": { "anyOf": [ { - "$ref": "#/components/schemas/EntityRef" + "additionalProperties": { + "$ref": "#/components/schemas/EntityGroup" + }, + "type": "object" }, { "type": "null" } - ] + ], + "title": "Entity Groups", + "description": "the named group each role's entities stand for, keyed by the role key the entities above carry: each group whose members are exactly the entities definition.identity binds on that role. The heading names a role by its group and member count ('the 27 EU member states') in place of its members. None when no role was asked for as a group" }, - "matched": { - "anyOf": [ + "coverage": { + "oneOf": [ { - "$ref": "#/components/schemas/Matched" + "$ref": "#/components/schemas/CoverageExact" }, { - "type": "null" - } - ] - }, - "reading": { - "anyOf": [ - { - "type": "string", - "enum": [ - "members", - "entity" - ] + "$ref": "#/components/schemas/CoverageBreadth" }, { - "type": "null" + "$ref": "#/components/schemas/CoverageBare" } ], - "title": "Reading" + "title": "Coverage", + "description": "observation footprint", + "discriminator": { + "propertyName": "kind", + "mapping": { + "bare": "#/components/schemas/CoverageBare", + "breadth": "#/components/schemas/CoverageBreadth", + "exact": "#/components/schemas/CoverageExact" + } + } }, - "projection": { + "headline": { "anyOf": [ { - "$ref": "#/components/schemas/Projection" + "$ref": "#/components/schemas/Headline" }, { "type": "null" } - ] + ], + "description": "exact latest-year summary for a role-bearing answer (see Headline); None for a non-role-bearing Spec, which coverage above already answers exactly or approximately enough that no separate latest-year summary is computed" }, - "member_count": { + "download": { "anyOf": [ { - "type": "integer" + "$ref": "#/components/schemas/DownloadFacts" }, { "type": "null" } ], - "title": "Member Count" + "description": "the rows, series, years and licence of the file a mint of this Spec writes (see DownloadFacts). None when the Spec has no read plan: a no-data answer, or same-shape parts merged into one Spec" }, - "members": { + "coverage_stamp": { "anyOf": [ { "type": "string" }, - { - "items": { - "$ref": "#/components/schemas/NodeRef" - }, - "type": "array" - }, { "type": "null" } ], - "title": "Members" + "title": "Coverage Stamp", + "description": "the coverage artifact's own data-version stamp this Spec's role-bearing population and headline were confirmed against (series_coverage.CoverageManifest.stamp); None for a non-role-bearing Spec, which never consults coverage. The graph-derived analogue of this stamp (graph_generation) is not itself a wire field; this is coverage's own, published because coverage is a second, independently-versioned data source an answer can be stale against" }, - "candidates": { + "scope": { "anyOf": [ { - "items": { - "$ref": "#/components/schemas/EntityRef" - }, - "type": "array" + "$ref": "#/components/schemas/ResolvedScope" }, { "type": "null" } ], - "title": "Candidates" + "description": "the full member set of an entity axis this Spec's resolution defaulted (see ResolvedScope): observationAbout for place defaulting, or origin/destination for directional-role defaulting. Response-level diagnostics may carry place_scope_defaulted or role_scope_defaulted, but warning presence is not an exact per-Spec equivalence; None when this Spec did not default an entity axis" }, - "near_matches": { + "facets": { + "additionalProperties": { + "$ref": "#/components/schemas/ResolvedFacet" + }, + "type": "object", + "title": "Facets", + "description": "the facet axis values of the series this Spec's read plan serves, the series its observations carry (see ResolvedFacet); the same whether or not observations are included or deferred to a trailing SSE event. Sparse, meaning an axis no served series carries is omitted, never a null placeholder. {} when the Spec serves no series" + }, + "observations": { "anyOf": [ { - "items": { - "$ref": "#/components/schemas/EntityRef" - }, - "type": "array" + "$ref": "#/components/schemas/SpecObservations" }, { "type": "null" } ], - "title": "Near Matches" - } - }, - "type": "object", - "required": [ - "input", - "status", - "entity", - "matched", - "reading", - "projection", - "member_count", - "members", - "candidates", - "near_matches" - ], - "title": "GraphResolveResult", - "description": "One text's outcome. `input` echoes the text; fields a status does not use are `null`.\n\n- `resolved`: `entity`, `matched` and `reading`. A group or region adds `projection`,\n `member_count` and `members`: the list route's link, or the members inline (at most\n 256) when the request expanded them. The three are `null` for a region the membership\n policy does not hold. `near_matches` lists up to 3 other places or organisations of the\n requested kinds that share the name (\"Georgia\" resolves to the country, with the US\n state `geoId/13` here), else `null`. When `kinds` removed the first match, a node of a\n requested kind sharing the name resolves in its place and `near_matches` lists the\n removed match (\"Georgia\" with `kinds: [\"place_other\"]` resolves to `geoId/13`, with\n the country here).\n- `ambiguous`: `candidates`, in the resolver's order. When `kinds` removed the first\n match and up to 3 nodes of a requested kind share the name, `near_matches` lists the\n removed match, else `null`.\n- `not_found`: `near_matches`, hints for a person; a program should pick none by id.\n- `not_held`: `entity`, the id the resolver named, which does not open on the node route.\n\n`reading` is `members` when the text names a group's members (\"EU countries\"), else\n`entity`." - }, - "ResolvedEntity": { - "properties": { - "ref": { - "type": "string", - "title": "Ref", - "description": "the resolved entity's dcid" + "description": "the observation values behind coverage above; None when not resolved for this Spec (e.g. no entity to probe, or response_options.include_observations is false), when ResolveOptions.include_observations opts into deferred SSE delivery (populated instead via a trailing observations event, mirroring slot_options/entity_options' own coverage-probe transport split), or for a candidates-status entry, nearest_real, or flagged_match spec (this iteration only populates it on a primary definite answer)." + }, + "slot_options": { + "items": { + "$ref": "#/components/schemas/SlotOptions" + }, + "type": "array", + "title": "Slot Options", + "description": "the candidate set each bound slot was chosen from, one entry per slot with a non-empty taxonomy; omits when/source and any slot with no observed or seeded values. spec_id does not depend on this field, so it never affects permalinks or dedup." + }, + "entity_options": { + "items": { + "$ref": "#/components/schemas/EntityOptions" + }, + "type": "array", + "title": "Entity Options", + "description": "candidate sets for directional origin or destination axes. An entry whose entity_ref is omitted describes an axis the role-bearing query left open; its role selects the identity.entities key for a resubmit, and the matching role_axis_facts entry reports that axis's member count. An entry with an entity_ref describes alternatives to a bound axis. Empty when the family has no directional entity-option concept. spec_id does not depend on this field." }, - "label": { + "facet_options": { + "items": { + "$ref": "#/components/schemas/FacetOptions" + }, + "type": "array", + "title": "Facet Options", + "description": "the candidate set each facet axis (provenance/measurementMethod/unit) was chosen from, one entry per axis with at least one value observed on the resolved candidates' unfiltered facets; an axis with no observed value is omitted, never an empty entry. Computed for every definite Spec and every candidate. Over SSE with response_options.include_option_coverage set, the entries arrive as trailing facet_options events and this list stays empty. Unlike slot_options, this has no bind-time baseline to fall back to. spec_id does not depend on this field." + }, + "rendered_sentence": { "anyOf": [ { "type": "string" @@ -14290,30 +17852,27 @@ "type": "null" } ], - "title": "Label", - "description": "plain-language display name" + "title": "Rendered Sentence", + "description": "the editable confirmation sentence for this spec, present on every Spec a part shows; None on an equivalent_readings entry. It holds the heading and the byline only (see SentenceToken.segment): 'Germany's gross ODA disbursements to Kenya, 1973 to 2024. Current US dollars · OECD Creditor Reporting System (CRS).' It states what this Spec is and nothing about the request that produced it, so it reads the same after a dataset_resubmit and serves as the Spec's label. The part that carries this Spec states how it departs from the request (_PartBase.departures)" }, - "entity_type": { + "sentence_plan": { "anyOf": [ { - "type": "string" + "items": { + "$ref": "#/components/schemas/SentenceToken" + }, + "type": "array" }, { "type": "null" } ], - "title": "Entity Type", - "description": "e.g. Country, AdministrativeArea1, Organization" + "title": "Sentence Plan", + "description": "the ordered token form of rendered_sentence, tying its tokens to definition parts; present under the same condition, None otherwise. Every token's segment is 'heading' or 'byline'" }, - "role": { - "type": "string", - "enum": [ - "observationAbout", - "origin", - "destination" - ], - "title": "Role", - "description": "the role key this entity plays; observationAbout, origin, or destination" + "trace": { + "$ref": "#/components/schemas/ResolutionTrace", + "description": "consolidated record of how the query was understood" }, "confidence": { "anyOf": [ @@ -14330,90 +17889,113 @@ } ], "title": "Confidence", - "description": "the engine's confidence in this entity resolution; None when not assessed -- no entity-resolution confidence signal exists yet, so this ships None on every entity today" - } - }, - "additionalProperties": false, - "type": "object", - "required": [ - "ref", - "role" - ], - "title": "ResolvedEntity", - "description": "One resolved entity on the wire, under `resolved.entities`: the flat\nprojection of the engine's own `Entity` -- `ref`/`entity_type` collapse from\na `GraphRef` to a bare dcid/label pair, and `role` collapses from the\nengine's richer role model to the role-key string it already derives from\n(the identity core's own vocabulary, so this never adds a second mapping)." - }, - "ResolvedFacet": { - "properties": { + "description": "qualitative, relative retrieval confidence for this interpretation; None when not assessed. Bands are heuristic and may be retuned without a schema-version bump." + }, "basis": { - "type": "string", - "enum": [ - "bound", - "declared_default", - "fallback" + "anyOf": [ + { + "type": "string", + "enum": [ + "structural", + "nominated", + "twin", + "direction", + "breakdown" + ] + }, + { + "type": "null" + } ], "title": "Basis", - "description": "'bound' when this axis was constrained by the request, 'declared_default' when an unbound axis was completed from a declared deployment policy, 'fallback' when neither applies and the deployment policy supplied the value: facets holding a point in the requested years first, then DFO's facets for a variable both DFO and base Data Commons hold, then the most places or role tuples covered there, then the most requested years the span covers, then most observations, then the latest observation, then a deterministic tie-break" + "description": "why the part offers this Spec as one of its candidates: 'structural', a reading that differs from the elected one only on a stat type, price basis or denominator the request leaves open; 'nominated', a reading the model named as a genuine reading of the request's phrase; 'twin', an equivalent reading of the elected one, offered where the elected one holds no data; 'direction', the same reading with the other direction for a place the request names without one, which a client shows as a direction prompt; 'breakdown', the same measure broken down by another set of slots, offered when its family holds no total and the request names no breakdown that serves a member. The elected reading, listed first, carries none. None on a definite answer and on every Spec outside CandidateSet.specs." }, - "ref": { + "available_at_place": { "anyOf": [ { - "type": "string" + "type": "boolean" }, { "type": "null" } ], - "title": "Ref", - "description": "the axis's resolved dcid, present when one distinct value served every carried series; absent when selection is 'per_series'" + "title": "Available At Place", + "description": "whether this spec has lifetime availability at the resolved place, independent of the coverage window. True = confirmed at place; False = the variable matched but has no observation here (the flagged_match case); None = not assessed (no place entity, or a named family such as dev-finance). CoverageExact.has_data may be False for a requested window even when this field is True." }, - "label": { + "equivalent_readings": { "anyOf": [ { - "type": "string" + "items": { + "$ref": "#/components/schemas/Spec" + }, + "type": "array" }, { "type": "null" } ], - "title": "Label", - "description": "best-effort display label for ref; present only alongside ref" + "title": "Equivalent Readings", + "description": "other StatVar(s) confirmed to encode the same real-world indicator as this Spec. Each entry is a full Spec carrying identity and the material needed to re-resolve onto it: its definition.identity, spec_id, and resolved StatVar dcids provide everything ResubmitIdentityPayload requires. Its rendered_sentence, sentence_plan, facet_options, and observations come from re-resolving onto it on a dataset_resubmit identity entry, not from this response. This Spec's own answer stands on its own regardless. Switching to a named entry is optional, offered for its source vocabulary's own coverage. None when no such encoding is known. Never a member of BaseIdentity, never hashed, and never populated on its own entries in turn. An entry's own equivalent_readings is always empty." }, - "currency": { + "skills": { "anyOf": [ { - "type": "string", - "pattern": "^[A-Z]{3}$" + "items": { + "type": "string" + }, + "type": "array" }, { "type": "null" } ], - "title": "Currency", - "description": "unit axis only, alongside ref: the ISO 4217 code of the currency ref is denominated in, from the graph's currency units (CurrencyUSD, USDollar and the base Data Commons Currency members such as INR); absent when ref is no currency. The sentence reads it: US dollars go to the byline's unit token, any other currency stays in the heading" + "title": "Skills", + "description": "ids of the skills this Spec's bound graph nodes and selected provenance call for, matched against the shared skills index, most specific first: skills matched through a graph node by hop, then breadth, and skills matched only through the provenance last; present under the include_skills option. None = the request did not ask; [] = it asked and nothing matched." }, - "source": { + "alternative_measures": { "anyOf": [ { - "$ref": "#/components/schemas/SourceRef" + "items": { + "$ref": "#/components/schemas/SpecAlternativeMeasure" + }, + "type": "array" }, { "type": "null" } ], - "description": "provenance axis only, alongside ref: the organisation behind the provenance, from the origin catalogue" + "title": "Alternative Measures", + "description": "every other measure this Spec could equally answer with -- either another populated partition from the same family as the one this Spec's own served rows exhibit (retrieval.bound_values.observed_measure_family), or a genuinely distinct also_plausible candidate whose only difference from this Spec is measured_property (measurement_denominator held equal), folded in here instead of left as a second candidates entry -- each with its own identity, a disambiguating label, and the axis of the sentence token whose menu offers it: 'what' entries are the measure switch beside measure_label below, 'unit' entries the price-basis options of the byline's unit token (binding_ref 'unit:'). A partition or folded candidate with no authored label is left out. None when this Spec's shape carries no measure family at all and no measure-sibling candidate was folded in, or its served rows span more than one partition; a served partition with every sibling unlabelled, or with none, still publishes []. Never a member of BaseIdentity, never hashed." }, - "data_commons": { + "measure_label": { "anyOf": [ { - "$ref": "#/components/schemas/search__models__grammar__DataCommonsRef" + "type": "string" }, { "type": "null" } ], - "description": "provenance axis only, alongside ref: the Data Commons the provenance's data comes from" + "title": "Measure Label", + "description": "the readable label for the measure partition this Spec's own served rows exhibit, composed the same way as each 'what' alternative_measures entry's label: what a switch built from those entries would show as currently selected. It names no price basis ('gross disbursements', not 'gross disbursements (nominal)'). Current or constant prices belong to the unit, which the byline's unit token states. None under the same condition alternative_measures is None" }, - "documentation": { + "measure_label_axes": { + "items": { + "type": "string" + }, + "type": "array", + "title": "Measure Label Axes", + "description": "the declared measure-axis identifiers (code_index.types.MeasureAxis.axis, e.g. 'measuredProperty', 'measurementQualifier', or a constraint-property dcid such as a financial-flow-type or netting-basis axis) that measure_label was composed from. Every axis the served partition carries a value on is included here, whether or not its value appears in measure_label's own text. A renderer uses this to keep a bound how-slot sharing one of these property dcids from repeating what measure_label already said. Always [] when measure_label is None." + }, + "measure_axis_values": { + "items": { + "$ref": "#/components/schemas/MeasureAxisValue" + }, + "type": "array", + "title": "Measure Axis Values", + "description": "each axis in measure_label_axes with the value the served partition holds on it, in the same order, including values the query never named (a declared default such as Gross or Nominal). Labels come from the measure index. Always [] when measure_label is None. Never a member of BaseIdentity, never hashed." + }, + "concept_label": { "anyOf": [ { "type": "string" @@ -14422,296 +18004,305 @@ "type": "null" } ], - "title": "Documentation", - "description": "provenance axis only, alongside ref: the Graph API route of the provenance's document, GET /api/graph/documentation/{dcid}" + "title": "Concept Label", + "description": "what this Spec's series count, in a reader's words, with no measure basis, codes, provider scope or dataset: the sector the identity binds where it binds one ('health' for CRS 120 and 130 together, ONE's grouping; 'basic health' for CRS 122), else the values the served members share outside the measure axes, which shape.label states in brackets after measure_label ('official development assistance'). A composite carries its table identity's concept label. None when the shape has no measure partition and binds no sector. Never a member of BaseIdentity, never hashed." }, - "account": { + "published_tables": { "anyOf": [ { - "$ref": "#/components/schemas/FlowAccount" + "type": "string" }, { "type": "null" } ], - "description": "provenance axis only, alongside ref: whose account of a flow the provenance gives, when ref is a dataset the code index declares; 'provider' when it reports flows as their providers record them" + "title": "Published Tables", + "description": "the names of the tables this Spec's figures are published in, with no provider scope: the elected dataset's label ('OECD Creditor Reporting System (CRS)'), or for a composite the labels of the tables its components read, joined ('OECD Creditor Reporting System (CRS) and ONE Imputed Multilateral Sectors'). None when no provenance was elected. Never a member of BaseIdentity, never hashed." }, - "selection": { + "related_group": { "anyOf": [ { - "type": "string", - "const": "per_series" + "$ref": "#/components/schemas/GraphRef" }, { "type": "null" } ], - "title": "Selection", - "description": "'per_series' when the carried series select different values on this axis; present in place of ref/label, never alongside them" + "description": "the StatVarGroup related_measures come from: the smallest group this Spec's one StatVar belongs to that holds 2 to 40 members, ties broken by group dcid. None when related_measures is None or []" }, - "request_basis": { + "related_measures": { "anyOf": [ { - "additionalProperties": { - "type": "string", - "enum": [ - "bound", - "declared_default", - "fallback" - ] + "items": { + "$ref": "#/components/schemas/RelatedMeasure" }, - "type": "object" + "type": "array" }, { "type": "null" } ], - "title": "Request Basis", - "description": "per-member basis (currency/prices/base_year) for a unit axis bound through the request form; present only on the unit axis, alongside either ref/label or selection" - } - }, - "additionalProperties": false, - "type": "object", - "required": [ - "basis" - ], - "title": "ResolvedFacet", - "description": "One facet axis's resolved value on a Spec (see ResolvedSpec.facets):\nwhich value backed the answer's observations, and why.\n\nbasis is always present. ref/label are present when one distinct value\nserved every carried series; selection carries \"per_series\" in their\nplace when the carried series select different values on this axis --\nnever alongside ref/label. request_basis joins either shape, present\nonly on the unit axis, only when unit was bound through the request form\n(currency/prices/base_year), one basis value per member the request\nnamed.\n\nFields are flat and optional, validated by a model validator, rather\nthan a discriminated ref/selection union. basis and request_basis are\nshared by both the single-ref and per-series shapes, so a union would\nduplicate them across arms for a mechanical gain (moving the\nref/selection XOR to the type level) without expressing the\nrequest_basis-only-on-unit constraint, since that constraint is about\nwhich AXIS a ResolvedFacet lives under (see ResolvedSpec.facets), not\nits ref/selection shape. This is also response-only data, never\ndeserialized from untrusted client bytes, so a runtime validator is\nthe right tool for catching an illegal engine-side construction." - }, - "ResolvedFilter": { - "properties": { - "key": { - "$ref": "#/components/schemas/SlotKey", - "description": "the slot identity" - }, - "binding_kind": { - "type": "string", - "enum": [ - "value", - "set", - "unbound" - ], - "title": "Binding Kind", - "description": "which binding state was applied" - }, - "refs": { - "items": { - "$ref": "#/components/schemas/GraphRef" - }, - "type": "array", - "title": "Refs", - "description": "the bound graph objects (empty for unbound)" + "title": "Related Measures", + "description": "up to 5 other members of related_group with data at every place this Spec names (and in its requested years when it names a range), ordered by the years they share with this Spec's StatVar there, then by dcid. Only a definite Spec that serves exactly one StatVar, has no measure family (measure_label is None) and names places with no roles carries a list; [] when no group qualifies or no other member has data there. None for any other Spec, and when the graph reads failed or ran past their deadline. Never a member of BaseIdentity, never hashed." }, - "provenance": { - "type": "string", - "enum": [ - "binder", - "text_recognized", - "measure_elected", - "declared_default" + "open_axis_facts": { + "anyOf": [ + { + "items": { + "$ref": "#/components/schemas/OpenConstraintAxisFact" + }, + "type": "array" + }, + { + "type": "null" + } ], - "title": "Provenance", - "description": "whether the bind call's own election produced this value, a code row recognised in the query's own text forced it, or the measure-family election forced it on an axis the binder left open", - "default": "binder" - } - }, - "additionalProperties": false, - "type": "object", - "required": [ - "key", - "binding_kind", - "refs" - ], - "title": "ResolvedFilter", - "description": "One applied bind decision, slot by slot." - }, - "ResolvedQualifier": { - "properties": { - "text": { - "type": "string", - "title": "Text", - "description": "verbatim span of the source text that named the term: variable_text, query_text, or a dropped qualifier phrase" - }, - "named": { - "items": { - "$ref": "#/components/schemas/GraphRef" - }, - "type": "array", - "title": "Named", - "description": "every code row the span names in the packaged index, any code system, and every measure value it names that the answer does not carry; empty when none did" + "title": "Open Axis Facts", + "description": "one entry per constraint axis this Spec's own served StatVar members declare (an arc naming the property, resolved or not) that the query left unbound, each naming the axis's property and what those members exhibit on it: whether they agree on a value (varies=False) or differ (varies=True), and undeclared_count for how many declare none at all. None when this Spec's served members declare no constraint property the query left open at all. This is distinct from an open axis every member declares nothing for, which still publishes its own entry (varies=False, undeclared_count equal to the served member count). Never a member of BaseIdentity, never hashed." }, - "slot": { + "role_axis_facts": { "anyOf": [ { - "type": "string" + "items": { + "$ref": "#/components/schemas/RoleAxisFact" + }, + "type": "array" }, { "type": "null" } ], - "title": "Slot", - "description": "property dcid of the slot_filters entry whose binding consumed this term, or, on an unbound value the answer's shape has a slot for but leaves unmet, that slot's property; None otherwise" - }, - "disposition": { - "type": "string", - "enum": [ - "bound", - "unbound", - "no_vocabulary" - ], - "title": "Disposition", - "description": "\"bound\" when a final binding covers a named row (or a descendant of one); \"unbound\" when a code row was named but no binding covers it, or a measure value was named that the answer does not carry; \"no_vocabulary\" when the term names neither" + "title": "Role Axis Facts", + "description": "one entry per directional role axis (origin/destination) this role-bearing Spec's query left open, naming the axis and the member population its own confirmation already resolved (see RoleAxisFact). None when this Spec is not role-bearing, or is role-bearing but every role axis its shape declares carries a bound entity. Never a member of BaseIdentity, never hashed." }, - "start": { + "unit_conversion": { "anyOf": [ { - "type": "integer" + "$ref": "#/components/schemas/UnitConversion" }, { "type": "null" } ], - "title": "Start", - "description": "character offset where the term starts in the variable phrase" + "description": "the currencies and price bases a unit request can convert this answer to. Null when the served members' unit is no currency, no conversion recipe converts them (a stock, a series not in nominal prices, or a provenance that declares no recipe), the recipe's tables lack the native currency's rate in a served year, so nothing converts, or no conversion catalogue is loaded, which the part's unit_conversion_unavailable warning states. Never a member of BaseIdentity, never hashed." }, - "end": { + "scope_choices": { "anyOf": [ { - "type": "integer" + "$ref": "#/components/schemas/PartScope" }, { "type": "null" } ], - "title": "End", - "description": "character offset where the term ends in the variable phrase" + "description": "how the part this Spec answers was counted: one ScopeChoice per axis a declared rule or the request settled (sector, region, measure basis, provider scope), with its options and their availability, the explicit and carried entries applied, and the identity they compile to (see PartScope). To switch an option, post base.identity as identity on a dataset_resubmit identity entry, with entries as scope_entries, the entry on the switched axis replaced by the switch: one entry per axis. None when no axis was settled and no scope entries were posted. Never a member of BaseIdentity, never hashed." + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "shape", + "slots", + "stat_vars", + "entities", + "coverage", + "trace" + ], + "title": "ResolvedSpec", + "description": "What the graph held at resolution time: the engine's report of what it\ndid with the ask. Meant for display and diagnostics, never hashed;\n`Spec.spec_id` depends only on `Spec.definition.identity`. Beside the\ncontract's own `resolved` member list (`stat_vars`, `inapplicable_slots`,\n`unresolved_slots`, `entities`, `coverage`, `headline`, `facets`, `observations`,\n`rendered_sentence`/`sentence_plan`, `slot_options`/`entity_options`,\n`trace`, `confidence`), this also carries the engine's own supersets\n(`shape`, `slots`, `available_at_place`) that slot_options/sentence_plan\njoin against and the eval harness scores." + }, + "ResolvedStatVars": { + "properties": { + "member_count": { + "type": "integer", + "title": "Member Count", + "description": "how many members are confirmed to carry observations at this resolve's own probe entities; see this model's own docstring for how this differs from resolved.shape.member_count" }, - "evidence": { + "member_count_exact": { + "type": "boolean", + "title": "Member Count Exact", + "description": "True when member_count is a true total; False when it is a floor -- the population being at least member_count large, not exactly member_count -- because it was measured over a capped recall sample, because the probe stopped once the answer's member was confirmed, or because it is a where-axis merge's max() of its members' own counts rather than a computed union. Defaults to True, correct for a caller that has not measured otherwise", + "default": true + }, + "served_count": { "anyOf": [ { - "type": "string", - "enum": [ - "label", - "synonym", - "model", - "uncovered", - "unavailable", - "unsupported" - ] + "type": "integer" }, { "type": "null" } ], - "title": "Evidence", - "description": "what read the term: a code label or synonym, the bind model, \"uncovered\" for words no reader covers on the elected shape, unbound beside a recognised code or naming a measure value the answer does not carry, and no_vocabulary beside none when the binder rated them as not stated by its series, \"unavailable\" for a code no table holds, \"unsupported\" for a distinction no binding expresses" + "title": "Served Count", + "description": "how many StatVars a Datasets mint of this Spec's definition serves, the length of its trace.resolved_stat_vars; 1 for a single series. Null when the membership is unsettled: Search answered from members the mint may not serve, and the part carries membership_unverified" }, - "operation": { + "data_date_range": { "anyOf": [ { - "type": "string", - "enum": [ - "union", - "refinement" - ] + "$ref": "#/components/schemas/DateRange" }, { "type": "null" } ], - "title": "Operation", - "description": "how the term's codes combine with another term's on one code system: a union of both, or a refinement to the narrower" + "description": "the earliest first date and latest last date of the points the answer's read plan serves over its StatVars; null when it serves none" }, - "selected": { + "source_codes": { "items": { - "$ref": "#/components/schemas/GraphRef" + "$ref": "#/components/schemas/SourceCode" }, "type": "array", - "title": "Selected", - "description": "the codes the term asked for before the combination simplified them" + "title": "Source Codes", + "description": "the publisher series codes of the StatVars the answer serves, sorted by provenance then code and without repeats; left out when no served StatVar has a code. They identify the series a publisher files these StatVars under, and the answer is the same with or without them. A code names the whole answer only where its entry is exact" } }, "additionalProperties": false, "type": "object", "required": [ - "text", - "named", - "disposition" + "member_count" ], - "title": "ResolvedQualifier", - "description": "One narrowing term the request's text named, and what became of it.\n\nThe term's text can come from the variable phrase, from the verbatim\n`query_text`, or from an admitted qualifier tie (see\n`_resolve_query_qualifiers`). `text` is the verbatim span of whichever\nsource named it. `named` is every code row -- any system -- that span\nnames in the packaged index, and every measure value it names that the\nanswer does not carry (a dcid of the index's measure values, such as\n`amountMobilised`);\nempty when the text names neither (a `no_vocabulary` term). `slot`\nis the constraint property dcid of the `slot_filters` entry whose\nbinding consumed the term, or, on an `\"unbound\"` value the answer's shape\nhas a slot for but leaves unmet, that slot's property; `None` otherwise.\n`disposition` is\n`\"bound\"` when some final binding on a named row's code system covers\nit (that row or a descendant), `\"unbound\"` when a code row was named but\nno binding covers it or a measure value was named that the answer does not\ncarry, and `\"no_vocabulary\"` when the term names neither: an LLM-reported\nphrase (`bind`'s own `unplaced` output) that no taxonomy in this\ndeployment's index can express, an exclusion or comparison phrase\n(`\"unsupported\"`), or words beside no code the binder rated as not stated\non the elected shape (`\"uncovered\"`).\n\n`start` and `end` locate the term in the part's variable phrase. `evidence` says what\nread it, and `None` means a code's label or synonym matched the term as the query\nspelled it, the reading every recognised span records:\n\n- `\"label\"` and `\"synonym\"` name a match on a code's label or synonym; no record sets\n them, since a recognised span records `None`.\n- `\"model\"` marks a phrase the bind model read through a code it chose from the\n phrase's candidate menu, a lexical hit of the menu or a descendant of one\n (`phase_rank_bind._model_records`); `named` holds the chosen codes.\n- `\"uncovered\"` marks words no reader covers on the elected shape\n (`phase_rank_bind._coverage_records`). Beside a recognised code they are recorded\n `\"unbound\"` with that code's rows as `named`. On a shape the measure index describes,\n a word that every name of a measure value's reading holds names that value when no\n span names it and the answer does not carry it, and its record adds the value to\n `named`. Beside no code such a word is recorded `\"unbound\"` naming the value, whatever\n the binder rates it; \"mobilised\" names `amountMobilised` on an amount series. Other\n words beside no code are recorded `\"no_vocabulary\"` with `named` empty when the\n binder rates them below `SearchSettings.stated_word_bar` as not stated by the shape's\n series; a word it rates at the bar or above, or leaves unrated, reads as stated.\n- `\"unavailable\"` marks a code term the elected shape cannot apply: one naming only\n codes no shape can bind, or, on a part naming a dataset, one no row of that dataset\n holds (`phase_rank_bind._unavailable_qualifiers`), recorded `\"unbound\"`.\n- `\"unsupported\"` marks an exclusion or comparison phrase no binding expresses\n (`phase_rank_bind._unsupported_records`), recorded `\"no_vocabulary\"`.\n\n`operation` and `selected` describe how the term's codes combine with\nanother term's on one code system, and the codes it asked for before that\ncombination simplified." + "title": "ResolvedStatVars", + "description": "`resolved.stat_vars` on the wire: how many StatVars the answer holds, how many a\nDatasets mint of the Spec's definition serves, and the dates the answer serves over\nthem. The members themselves stay off the wire; `POST /api/datasets/{id}/members`\nlists the ones a mint serves.\n\nmember_count is the population confirmed to carry observations at this\nresolve's own probe entities, not resolved.shape.member_count's\nbindings-admitted population. The two differ for two reasons. A member the\nshape's bindings admit can carry no observation at the resolved place. And on\na role-bearing shape the answer reads one role class of the admitted members:\nwhere a total stands for its breakdowns the breakdowns are folded into it, so a\ndonor-only answer can state 255 admitted members beside 1 confirmed while every\none of the 255 holds data. On a standard (non-role-bearing) shape this population can itself\nbe a floor: the packaged code index does not source members for every\nshape family, so a shape outside it falls back to its recall sample, the\nmembers recall found, and member_count cannot exceed what that sample\nadmitted. An answer naming one member of a family too large for one read stops\nreading once that member is confirmed, so member_count counts the members read: \"latest\nlife expectancy data\" reads the family's total and not its other 350 members. A\nwhere-axis merge (same_shape.py, \"population\nof Kenya and Uganda\") publishes max() of its members' own member_count\nrather than the sum, since the same StatVar is typically confirmed at\nevery member's own place and summing would double-count the\nintersection -- max() is a true lower bound of the union. member_count_exact\nrecords which of these applies.\n\nserved_count is the mint's own count, a function of the definition alone: the\nStatVars a Datasets mint of `definition` serves, the length of its\n`trace.resolved_stat_vars`. It is stated whenever Search settled the membership the\nmint resolves: a family the code index decides, or a family the mint's member walk\nsettled for this definition. Null when Search answers from members it could not\nsettle, which the part flags with a `membership_unverified` warning." }, - "ResolvedScope": { + "ResubmitCandidate": { "properties": { - "axis": { - "type": "string", - "enum": [ - "observationAbout", - "origin", - "destination" + "identity": { + "$ref": "#/components/schemas/BaseIdentity", + "description": "this candidate's complete identity" + }, + "entity_groups": { + "anyOf": [ + { + "additionalProperties": { + "$ref": "#/components/schemas/EntityGroup" + }, + "propertyNames": { + "enum": [ + "observationAbout", + "origin", + "destination" + ] + }, + "type": "object" + }, + { + "type": "null" + } ], - "title": "Axis", - "description": "the role-keyed axis the request left unnamed and the engine defaulted" + "title": "Entity Groups", + "description": "the named group each role's entities were asked for as, keyed by entity role key. Post a prior Spec's resolved.entity_groups beside any identity derived from that Spec. A group is kept when it posts a dcid and the graph's members of that node are exactly the identity's entities on the role; any other group, including one on a role the identity binds no entity on, is dropped" }, - "members": { - "items": { - "$ref": "#/components/schemas/ResolvedEntity" - }, - "type": "array", - "title": "Members", - "description": "every entity on axis this Spec's read plan serves, sorted by ref; each carries role == axis and a best-effort label/entity_type from a batched graph read, None when the graph has neither" + "assumptions": { + "anyOf": [ + { + "items": { + "$ref": "#/components/schemas/Assumption" + }, + "type": "array", + "maxItems": 67 + }, + { + "type": "null" + } + ], + "title": "Assumptions", + "description": "the assumptions of the reading this candidate rebuilds, echoed as the response gave them, which are the candidates part's reading_assumptions under the reading's spec_id. The rebuilt reading's reading_assumptions entry states the echoed items that still hold, each worded from the rebuilt reading by the rule ResubmitIdentityEntry.assumptions states, and the rebuilt part's assumptions are the items every reading_assumptions list holds alike. An item the echo lacks is not stated, so an edit of a defaulted slot to another value drops that default, and [], the echo of a reading that stated none, states none. None, the default, means the client echoes nothing for this reading, which yields what a fresh request would: no declared default, since the posted identity binds every slot, and the open roles and place scope the reading reads" } }, "additionalProperties": false, "type": "object", "required": [ - "axis", - "members" + "identity" ], - "title": "ResolvedScope", - "description": "The full member set of an entity axis this Spec's request left unnamed\n(see ResolvedSpec.scope).\n\n``axis`` is observationAbout when place defaulting expanded a place-less\nrequest, and origin or destination when directional-role defaulting\nexpanded a role-bearing request. ``members`` lists the entities on that axis\nthe answer's read plan serves, the ones a coverage breadth dimension for the\nsame axis counts. members is the single-element [\"Earth\"] list when the query\nresolved as a worldwide total.\nThe response-level diagnostics may include place_scope_defaulted or\nrole_scope_defaulted for such resolution, but those warnings are not a\nper-Spec one-to-one representation of this field. The scope lives outside\nBaseIdentity, the spec hash, and resolved.entities: a resubmit of the\nsame definition rediscovers it from the live graph." + "title": "ResubmitCandidate", + "description": "One candidate identity within a `candidates` dataset_resubmit entry. The\nengine derives its StatVar members as it does for an identity entry." }, - "ResolvedSpec": { + "ResubmitCandidatesEntry": { "properties": { - "shape": { - "$ref": "#/components/schemas/Shape", - "description": "the structural family chosen" + "entry_kind": { + "type": "string", + "const": "candidates", + "title": "Entry Kind", + "description": "discriminator for a candidate-set dataset_resubmit entry", + "default": "candidates" }, - "slots": { - "items": { - "$ref": "#/components/schemas/Slot" - }, - "type": "array", - "title": "Slots", - "description": "one entry per slot the shape defines, each in a binding state. Its what/how entries are the identity's slots, so a what/how property it leaves out is one no served member asserts" + "variable_text": { + "type": "string", + "maxLength": 200, + "minLength": 1, + "title": "Variable Text", + "description": "this part's variable text, echoed back onto the rebuilt part" }, - "inapplicable_slots": { - "items": { - "type": "string" - }, - "type": "array", - "title": "Inapplicable Slots", - "description": "the slots whose property none of the resolved StatVars declares, listed by property dcid; empty when every slot applies. Joins to resolved.slots[*].key.property.ref. Applicability is graph state, so it is reported here and the slot itself reads 'unbound' in the definition either way. It is never a member of BaseIdentity, never hashed." + "ordering": { + "type": "string", + "enum": [ + "broadest_first", + "intent_rank" + ], + "title": "Ordering", + "description": "how `candidates` below was ordered when this set was first produced; echoed back verbatim onto the rebuilt candidates part, never recomputed" }, - "unresolved_slots": { + "truncated": { + "type": "boolean", + "title": "Truncated", + "description": "echoed back verbatim onto the rebuilt candidates part -- see CandidateSet.truncated for what this flags" + }, + "candidates": { "items": { - "type": "string" + "$ref": "#/components/schemas/ResubmitCandidate" }, "type": "array", - "title": "Unresolved Slots", - "description": "the slots whose property is present but unresolved on at least one resolved StatVar (the graph asserted a value for this axis but could not resolve it to a dcid), listed by property dcid; empty when no such slot exists. Joins to resolved.slots[*].key.property.ref, and is disjoint from inapplicable_slots: a property is either never asserted by any resolved StatVar (inapplicable_slots), present but unreadable on one (this field), or neither (a genuinely open axis). The slot itself reads 'unbound' in the definition in every one of these cases; it is never a member of BaseIdentity, never hashed." + "maxItems": 50, + "minItems": 2, + "title": "Candidates", + "description": "the competing candidates to re-materialise, in posted order, always -- the rebuilt CandidateSet.specs preserves this exact order. Refused request_invalid, at the engine rather than here, when the posted count exceeds this deployment's own ceiling -- readable in advance as caps.max_candidates from GET /api/search/capabilities" }, - "stat_vars": { - "$ref": "#/components/schemas/ResolvedStatVars", - "description": "resolved StatVar(s) inside the region, and the scope they were drawn from" + "separate": { + "type": "boolean", + "title": "Separate", + "description": "true when this part is asked beside the others to be compared with them; it is kept apart from same-shape sibling parts. False, the default, folds parts that share a shape into one set answer", + "default": false }, - "entities": { + "operations": { "items": { - "$ref": "#/components/schemas/ResolvedEntity" + "$ref": "#/components/schemas/Operation" }, "type": "array", - "title": "Entities", - "description": "resolved entities the data is about; may be empty if where is unbound" + "maxItems": 8, + "title": "Operations", + "description": "the operations the question asks for over this part's data, in query order; the engine echoes them onto the part it resolves. Empty when the question asks for none" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "variable_text", + "ordering", + "truncated", + "candidates" + ], + "title": "ResubmitCandidatesEntry", + "description": "One part re-materialised from a posted set of competing candidate\nidentities, through the promote path, in posted order, always. `ordering`\nnames the display rule this set already used, restated rather than\nrecomputed: the order rests on the bind model's election and the availability\nreads of the first answer, which do not round-trip -- see `Ordering` and\n`outcomes.CandidateSet`. This entry carries no\n`max_candidates` field: `CandidateSet.max_candidates` on the response is\nnot posted back and is always server-computed, never client-supplied." + }, + "ResubmitIdentityEntry": { + "properties": { + "entry_kind": { + "type": "string", + "const": "identity", + "title": "Entry Kind", + "description": "discriminator for a single-identity dataset_resubmit entry", + "default": "identity" + }, + "variable_text": { + "type": "string", + "maxLength": 200, + "minLength": 1, + "title": "Variable Text", + "description": "this part's variable text, echoed back onto the rebuilt part" + }, + "identity": { + "$ref": "#/components/schemas/BaseIdentity", + "description": "the complete identity. Post a prior Spec.definition.identity byte-for-byte for a no-op resubmit; change nested members, including entities.origin or entities.destination, to edit that definition" }, "entity_groups": { "anyOf": [ @@ -14719,6 +18310,13 @@ "additionalProperties": { "$ref": "#/components/schemas/EntityGroup" }, + "propertyNames": { + "enum": [ + "observationAbout", + "origin", + "destination" + ] + }, "type": "object" }, { @@ -14726,692 +18324,818 @@ } ], "title": "Entity Groups", - "description": "the named group each role's entities stand for, keyed by the role key the entities above carry: each group whose members are exactly the entities definition.identity binds on that role. The heading names a role by its group and member count ('the 27 EU member states') in place of its members. None when no role was asked for as a group" + "description": "the named group each role's entities were asked for as, keyed by entity role key. Post a prior Spec's resolved.entity_groups beside any identity derived from that Spec. A group is kept when it posts a dcid and the graph's members of that node are exactly the identity's entities on the role; any other group, including one on a role the identity binds no entity on, is dropped" }, - "coverage": { - "oneOf": [ - { - "$ref": "#/components/schemas/CoverageExact" - }, - { - "$ref": "#/components/schemas/CoverageBreadth" - }, - { - "$ref": "#/components/schemas/CoverageBare" - } - ], - "title": "Coverage", - "description": "observation footprint", - "discriminator": { - "propertyName": "kind", - "mapping": { - "bare": "#/components/schemas/CoverageBare", - "breadth": "#/components/schemas/CoverageBreadth", - "exact": "#/components/schemas/CoverageExact" - } - } + "separate": { + "type": "boolean", + "title": "Separate", + "description": "true when this part is asked beside the others to be compared with them; it is kept apart from same-shape sibling parts. False, the default, folds parts that share a shape into one set answer", + "default": false }, - "headline": { + "operations": { + "items": { + "$ref": "#/components/schemas/Operation" + }, + "type": "array", + "maxItems": 8, + "title": "Operations", + "description": "the operations the question asks for over this part's data, in query order; the engine echoes them onto the part it resolves. Empty when the question asks for none" + }, + "assumptions": { "anyOf": [ { - "$ref": "#/components/schemas/Headline" + "items": { + "$ref": "#/components/schemas/Assumption" + }, + "type": "array", + "maxItems": 67 }, { "type": "null" } ], - "description": "exact latest-year summary for a role-bearing answer (see Headline); None for a non-role-bearing Spec, which coverage above already answers exactly or approximately enough that no separate latest-year summary is computed" + "title": "Assumptions", + "description": "the assumptions of the part this entry rebuilds, echoed as the response gave them. For a definite part these are its assumptions. For a reading picked from a candidates part they are that part's reading_assumptions under the reading's spec_id. The rebuilt part states the echoed items that still hold, each worded from the rebuilt answer: a declared_default whose slot (binding_ref) still binds the echoed refs, an open_role whose axis the answer still reads across every member with no entity of the identity's, and a place_scope on an answer that still names no place. An item the echo lacks is not stated, since the posted identity or its edit asked for it. An edit of a defaulted slot to another value therefore drops that default, and [], the echo of a part that stated none, states none. None, the default, means the client echoes nothing, and the part states what a fresh request would: no declared default, since the posted identity binds every slot, and the open roles and place scope the answer reads. The engine cannot tell an echoed default from one the caller writes for a slot it chose itself, and states such an item while the slot binds its refs. An echo shapes only the caller's own response" }, - "download": { + "scope_entries": { "anyOf": [ { - "$ref": "#/components/schemas/DownloadFacts" + "items": { + "$ref": "#/components/schemas/Entry" + }, + "type": "array", + "maxItems": 16 }, { "type": "null" } ], - "description": "the rows, series, years and licence of the file a mint of this Spec writes (see DownloadFacts). None when the Spec has no read plan: a no-data answer, or same-shape parts merged into one Spec" + "title": "Scope Entries", + "description": "the part's explicit and carried scope entries, one per axis: the entries of its resolved.scope_choices, with the entry on a switched axis replaced by the switch, an explicit entry whose origin names the choice, posted with that scope's base.identity as identity. An entry posted with no concept on an axis asked for a concept takes that concept, which the response's entries echo. The engine compiles them over identity and resolves the result, whose resolved.scope_choices states every choice, the entries applied and the carried entries left out. Refuses requested_option_unavailable (422) for an explicit entry this part cannot serve and conflicting_requested_options (422) for two that cannot hold together. None, the default, resolves identity as posted" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "variable_text", + "identity" + ], + "title": "ResubmitIdentityEntry", + "description": "One part re-resolved from a single identity -- the payload\n`ResubmitIdentityPayload` carries, plus the text echo and operations every\ndataset_resubmit entry needs." + }, + "ResubmitParsedEntry": { + "properties": { + "entry_kind": { + "type": "string", + "const": "parsed", + "title": "Entry Kind", + "description": "discriminator for a re-parsed dataset_resubmit entry", + "default": "parsed" }, - "coverage_stamp": { + "part": { + "$ref": "#/components/schemas/ParsedPart", + "description": "this part's resolution inputs -- normally a prior response part's own Part.restatement, posted back verbatim or edited, and resolved through the same per-part machinery the parsed door uses" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "part" + ], + "title": "ResubmitParsedEntry", + "description": "One part genuinely re-resolved through the parsed door's own per-part\npath, from a client-edited restatement of a sibling's own resolution\ninputs (`Part.restatement`) -- re-parsed, where `placeholder` only\nrestates a stub. `part` already carries a required `variable_text` and\nits own `operations`, so this entry needs no separate top-level echo\nfields the way the other three kinds do. Costs one LLM bind per edit, the\ndoor's one entry kind that touches the LLM client at all." + }, + "ResubmitPlaceholderEntry": { + "properties": { + "entry_kind": { + "type": "string", + "const": "placeholder", + "title": "Entry Kind", + "description": "discriminator for a stub dataset_resubmit entry", + "default": "placeholder" + }, + "variable_text": { + "type": "string", + "maxLength": 200, + "minLength": 1, + "title": "Variable Text", + "description": "this part's variable text, echoed back onto the rebuilt part" + }, + "status": { + "type": "string", + "enum": [ + "no_data", + "unsupported" + ], + "title": "Status", + "description": "which stub outcome to restate for this part" + }, + "reason": { "anyOf": [ { - "type": "string" + "type": "string", + "enum": [ + "source_not_resolved", + "source_ambiguous", + "source_code_not_held", + "source_code_ambiguous", + "source_code_shares_variable", + "entity_not_resolved", + "entity_ambiguous", + "entity_set_too_large", + "entity_role_not_admitted", + "variable_not_resolved", + "role_not_resolved", + "unit_not_resolved", + "rate_coverage_gap", + "no_matching_slice", + "binding_mismatch", + "denominator_not_available", + "no_observations", + "facet_not_available", + "role_incompatible", + "role_signature_incompatible", + "qualifier_not_bound", + "timed_out" + ] }, { "type": "null" } ], - "title": "Coverage Stamp", - "description": "the coverage artifact's own data-version stamp this Spec's role-bearing population and headline were confirmed against (series_coverage.CoverageManifest.stamp); None for a non-role-bearing Spec, which never consults coverage. The graph-derived analogue of this stamp (graph_generation) is not itself a wire field; this is coverage's own, published because coverage is a second, independently-versioned data source an answer can be stale against" + "title": "Reason", + "description": "the NoData.reason to restate onto the rebuilt part; required when status is no_data, refused when status is unsupported" }, - "scope": { + "code": { "anyOf": [ { - "$ref": "#/components/schemas/ResolvedScope" + "type": "string" }, { "type": "null" } ], - "description": "the full member set of an entity axis this Spec's resolution defaulted (see ResolvedScope): observationAbout for place defaulting, or origin/destination for directional-role defaulting. Response-level diagnostics may carry place_scope_defaulted or role_scope_defaulted, but warning presence is not an exact per-Spec equivalence; None when this Spec did not default an entity axis" + "title": "Code", + "description": "the reason, a code from the platform registry, to restate onto the rebuilt part's Unsupported.code; required when status is unsupported, refused when status is no_data" }, - "facets": { - "additionalProperties": { - "$ref": "#/components/schemas/ResolvedFacet" + "separate": { + "type": "boolean", + "title": "Separate", + "description": "true when this part is asked beside the others to be compared with them; it is kept apart from same-shape sibling parts. False, the default, folds parts that share a shape into one set answer", + "default": false + }, + "operations": { + "items": { + "$ref": "#/components/schemas/Operation" }, - "type": "object", - "title": "Facets", - "description": "the facet axis values of the series this Spec's read plan serves, the series its observations carry (see ResolvedFacet); the same whether or not observations are included or deferred to a trailing SSE event. Sparse, meaning an axis no served series carries is omitted, never a null placeholder. {} when the Spec serves no series" + "type": "array", + "maxItems": 8, + "title": "Operations", + "description": "the operations the question asks for over this part's data, in query order; the engine echoes them onto the part it resolves. Empty when the question asks for none" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "variable_text", + "status" + ], + "title": "ResubmitPlaceholderEntry", + "description": "One part restated as a stub from a no_data/unsupported outcome the\nclient already holds -- zero graph round-trips, zero LLM calls. Carried\nforward unresolved so its sibling parts' composed sentence and fold can\nstill be computed across the whole dataset; the engine stamps a\npart-scoped `part_restated` info warning on the rebuilt part." + }, + "RetentionModel": { + "properties": { + "pinned": { + "type": "boolean", + "title": "Pinned", + "description": "whether the frame the version's files render from is in the pinned tier, which has no expiry" }, - "observations": { + "held_until": { "anyOf": [ { - "$ref": "#/components/schemas/SpecObservations" + "type": "string", + "format": "date-time" }, { "type": "null" } ], - "description": "the observation values behind coverage above; None when not resolved for this Spec (e.g. no entity to probe, or response_options.include_observations is false), when ResolveOptions.include_observations opts into deferred SSE delivery (populated instead via a trailing observations event, mirroring slot_options/entity_options' own coverage-probe transport split), or for a candidates-status entry, nearest_real, or flagged_match spec (this iteration only populates it on a primary definite answer)." - }, - "slot_options": { - "items": { - "$ref": "#/components/schemas/SlotOptions" - }, - "type": "array", - "title": "Slot Options", - "description": "the candidate set each bound slot was chosen from, one entry per slot with a non-empty taxonomy; omits when/source and any slot with no observed or seeded values. spec_id does not depend on this field, so it never affects permalinks or dedup." - }, - "entity_options": { - "items": { - "$ref": "#/components/schemas/EntityOptions" - }, - "type": "array", - "title": "Entity Options", - "description": "candidate sets for directional origin or destination axes. An entry whose entity_ref is omitted describes an axis the role-bearing query left open; its role selects the identity.entities key for a resubmit, and the matching role_axis_facts entry reports that axis's member count. An entry with an entity_ref describes alternatives to a bound axis. Empty when the family has no directional entity-option concept. spec_id does not depend on this field." - }, - "facet_options": { - "items": { - "$ref": "#/components/schemas/FacetOptions" - }, - "type": "array", - "title": "Facet Options", - "description": "the candidate set each facet axis (provenance/measurementMethod/unit) was chosen from, one entry per axis with at least one value observed on the resolved candidates' unfiltered facets; an axis with no observed value is omitted, never an empty entry. Computed for every definite Spec and every candidate. Over SSE with response_options.include_option_coverage set, the entries arrive as trailing facet_options events and this list stays empty. Unlike slot_options, this has no bind-time baseline to fall back to. spec_id does not depend on this field." + "title": "Held Until", + "description": "when the working-tier frame stops being guaranteed, 30 days after it was stored. A download of the frame after `held_until`, while its bytes survive, renews it for 30 days. After it, a file selector or download link request that must render its file again renews the frame for 30 days if the frame's bytes survive, and otherwise refuses `artifact_expired`. A rebuild of unchanged data through `GET /api/datasets/{id}` or `POST /api/datasets` stores the frame again. Absent when pinned. It can be in the past" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "pinned" + ], + "title": "RetentionModel", + "description": "How long a version can still be fetched, which `datasets_api.retention` computes when a\ndoor serves the version. No stored body holds it." + }, + "RoleAxis": { + "type": "string", + "enum": [ + "origin", + "destination" + ] + }, + "RoleAxisFact": { + "properties": { + "role": { + "$ref": "#/components/schemas/RoleAxis", + "description": "which flow axis this fact is about" }, - "rendered_sentence": { + "member_count": { "anyOf": [ { - "type": "string" + "type": "integer" }, { "type": "null" } ], - "title": "Rendered Sentence", - "description": "the editable confirmation sentence for this spec, present on every Spec a part shows; None on an equivalent_readings entry. It holds the heading and the byline only (see SentenceToken.segment): 'Germany's gross ODA disbursements to Kenya, 1973 to 2024. Current US dollars · OECD Creditor Reporting System (CRS).' It states what this Spec is and nothing about the request that produced it, so it reads the same after a dataset_resubmit and serves as the Spec's label. The part that carries this Spec states how it departs from the request (_PartBase.departures)" + "title": "Member Count", + "description": "how many entities this axis' open scope resolves to, leaving out the group totals the code index declares beside their members (party_kind total), as the default download leaves them out; a scope of totals alone counts them all. None when the count could not be established without a read this response chose not to make (e.g. a discovered opposite axis whose own role index was omitted after a cap trip); the fact still publishes in that case, naming the axis as open with an explicit unknown rather than staying silent about it" }, - "sentence_plan": { + "members_available": { + "type": "boolean", + "title": "Members Available", + "description": "whether the member list this count summarises is itself known and could be enumerated (e.g. through entity_options or the options door), not just counted. False exactly when member_count is None" + }, + "holds_multilaterals": { "anyOf": [ { - "items": { - "$ref": "#/components/schemas/SentenceToken" - }, - "type": "array" + "type": "boolean" }, { "type": "null" } ], - "title": "Sentence Plan", - "description": "the ordered token form of rendered_sentence, tying its tokens to definition parts; present under the same condition, None otherwise. Every token's segment is 'heading' or 'byline'" - }, - "trace": { - "$ref": "#/components/schemas/ResolutionTrace", - "description": "consolidated record of how the query was understood" + "title": "Holds Multilaterals", + "description": "for the origin axis, whether its open population holds a multilateral organisation (see ResolvedEntity.multilateral), read from the member list where it is known and otherwise from the parties the served datasets publish on the axis: true for the CRS's donors. Absent for the destination axis" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "role", + "member_count", + "members_available" + ], + "title": "RoleAxisFact", + "description": "One directional role axis (origin or destination) a role-bearing\nSpec's query left open, and what this Spec's own confirmation already\nknows about its member scope (see ResolvedSpec.role_axis_facts).\n\nUnlike OpenConstraintAxisFact, a role axis has no declared value of its\nown that could vary across served members -- the axis is a place a flow\nentity binds, not a constraint members assert -- so this carries no\nvaries/undeclared_count of its own; it carries only what a role axis\ngenuinely has: a population size and whether that population is known." + }, + "RootEntry": { + "properties": { + "ref": { + "type": "string", + "title": "Ref" }, - "confidence": { + "label": { "anyOf": [ { - "type": "string", - "enum": [ - "high", - "medium", - "low" - ] + "type": "string" }, { "type": "null" } ], - "title": "Confidence", - "description": "qualitative, relative retrieval confidence for this interpretation; None when not assessed. Bands are heuristic and may be retuned without a schema-version bump." + "title": "Label" }, - "basis": { + "count": { + "type": "integer", + "title": "Count", + "description": "codes for a code system, members under the default projection for a group or region, Datasets for a source" + } + }, + "type": "object", + "required": [ + "ref", + "label", + "count" + ], + "title": "GraphRootEntry", + "description": "A place to start listing from, with the length of its list." + }, + "RootRendering": { + "properties": { + "without_party_totals": { + "type": "boolean", + "title": "Without Party Totals", + "default": false + }, + "columns": { "anyOf": [ { - "type": "string", - "enum": [ - "structural", - "nominated", - "twin", - "direction", - "breakdown" - ] + "items": { + "type": "string", + "maxLength": 200, + "minLength": 1 + }, + "type": "array", + "maxItems": 32 }, { "type": "null" } ], - "title": "Basis", - "description": "why the part offers this Spec as one of its candidates: 'structural', a reading that differs from the elected one only on a stat type, price basis or denominator the request leaves open; 'nominated', a reading the model named as a genuine reading of the request's phrase; 'twin', an equivalent reading of the elected one, offered where the elected one holds no data; 'direction', the same reading with the other direction for a place the request names without one, which a client shows as a direction prompt; 'breakdown', the same measure broken down by another set of slots, offered when its family holds no total and the request names no breakdown that serves a member. The elected reading, listed first, carries none. None on a definite answer and on every Spec outside CandidateSet.specs." + "title": "Columns" }, - "available_at_place": { + "groupby": { "anyOf": [ { - "type": "boolean" + "$ref": "#/components/schemas/GroupbyOptions" }, { "type": "null" } - ], - "title": "Available At Place", - "description": "whether this spec has lifetime availability at the resolved place, independent of the coverage window. True = confirmed at place; False = the variable matched but has no observation here (the flagged_match case); None = not assessed (no place entity, or a named family such as dev-finance). CoverageExact.has_data may be False for a requested window even when this field is True." + ] + } + }, + "additionalProperties": false, + "type": "object", + "title": "RootRendering", + "description": "How a dataset root's frame is read. `columns` left out takes the enrichment its\ndataset's roles need (`default_enrichment`); `[]` reads the stored frame\nalone. `groupby` reads the frame summed as a mint with that `options.groupby` sums it." + }, + "Roots": { + "properties": { + "code_systems": { + "items": { + "$ref": "#/components/schemas/RootEntry" + }, + "type": "array", + "title": "Code Systems" }, - "equivalent_readings": { + "groups": { + "items": { + "$ref": "#/components/schemas/RootEntry" + }, + "type": "array", + "title": "Groups" + }, + "regions": { + "items": { + "$ref": "#/components/schemas/RootEntry" + }, + "type": "array", + "title": "Regions" + }, + "sources": { + "items": { + "$ref": "#/components/schemas/RootEntry" + }, + "type": "array", + "title": "Sources" + }, + "built_from": { + "additionalProperties": { + "type": "string" + }, + "propertyNames": { + "enum": [ + "code_index", + "origin_catalogue", + "coverage_index", + "membership" + ] + }, + "type": "object", + "title": "Built From", + "description": "the build of each table the document read" + } + }, + "type": "object", + "required": [ + "code_systems", + "groups", + "regions", + "sources", + "built_from" + ], + "title": "GraphRoots", + "description": "`GET /api/graph/roots`: where to start listing. Each list is ordered by dcid." + }, + "Scope-Input": { + "properties": { + "window": { "anyOf": [ { - "items": { - "$ref": "#/components/schemas/Spec" - }, - "type": "array" + "oneOf": [ + { + "$ref": "#/components/schemas/WindowAll" + }, + { + "$ref": "#/components/schemas/WindowLatest" + }, + { + "$ref": "#/components/schemas/WindowRange" + } + ], + "discriminator": { + "propertyName": "kind", + "mapping": { + "all": "#/components/schemas/WindowAll", + "latest": "#/components/schemas/WindowLatest", + "range": "#/components/schemas/WindowRange" + } + } }, { "type": "null" } ], - "title": "Equivalent Readings", - "description": "other StatVar(s) confirmed to encode the same real-world indicator as this Spec. Each entry is a full Spec carrying identity and the material needed to re-resolve onto it: its definition.identity, spec_id, and resolved StatVar dcids provide everything ResubmitIdentityPayload requires. Its rendered_sentence, sentence_plan, facet_options, and observations come from re-resolving onto it on a dataset_resubmit identity entry, not from this response. This Spec's own answer stands on its own regardless. Switching to a named entry is optional, offered for its source vocabulary's own coverage. None when no such encoding is known. Never a member of BaseIdentity, never hashed, and never populated on its own entries in turn. An entry's own equivalent_readings is always empty." + "title": "Window", + "description": "the years to serve. Replaces the spec's window whole" }, - "skills": { + "entities": { "anyOf": [ { - "items": { - "type": "string" + "additionalProperties": { + "items": { + "type": "string" + }, + "type": "array" }, - "type": "array" + "type": "object" }, { "type": "null" } ], - "title": "Skills", - "description": "ids of the skills this Spec's bound graph nodes and selected provenance call for, matched against the shared skills index, most specific first: skills matched through a graph node by hop, then breadth, and skills matched only through the provenance last; present under the include_skills option. None = the request did not ask; [] = it asked and nothing matched." + "title": "Entities", + "description": "role name to dcids. Replaces the spec's whole entity binding. A role this map omits is unbound, so a client narrowing one role repeats the spec's other roles, and {} unbinds every bound role. An open role the map binds is no longer open" }, - "alternative_measures": { + "facets": { "anyOf": [ { - "items": { - "$ref": "#/components/schemas/SpecAlternativeMeasure" + "additionalProperties": { + "oneOf": [ + { + "$ref": "#/components/schemas/FacetRefBinding" + }, + { + "oneOf": [ + { + "$ref": "#/components/schemas/UnitCurrentPricesRequestBinding" + }, + { + "$ref": "#/components/schemas/UnitConstantPricesRequestBinding" + } + ], + "discriminator": { + "propertyName": "prices", + "mapping": { + "constant": "#/components/schemas/UnitConstantPricesRequestBinding", + "current": "#/components/schemas/UnitCurrentPricesRequestBinding" + } + } + }, + { + "$ref": "#/components/schemas/FacetNationalCurrencyBinding" + } + ] }, - "type": "array" + "type": "object" }, { "type": "null" } ], - "title": "Alternative Measures", - "description": "every other measure this Spec could equally answer with -- either another populated partition from the same family as the one this Spec's own served rows exhibit (retrieval.bound_values.observed_measure_family), or a genuinely distinct also_plausible candidate whose only difference from this Spec is measured_property (measurement_denominator held equal), folded in here instead of left as a second candidates entry -- each with its own identity, a disambiguating label, and the axis of the sentence token whose menu offers it: 'what' entries are the measure switch beside measure_label below, 'unit' entries the price-basis options of the byline's unit token (binding_ref 'unit:'). A partition or folded candidate with no authored label is left out. None when this Spec's shape carries no measure family at all and no measure-sibling candidate was folded in, or its served rows span more than one partition; a served partition with every sibling unlabelled, or with none, still publishes []. Never a member of BaseIdentity, never hashed." - }, - "measure_label": { + "title": "Facets", + "description": "axis to binding. Replaces the spec's whole facet binding" + } + }, + "additionalProperties": false, + "type": "object", + "title": "Scope", + "description": "The `scope` block a mint request may carry. On a `spec_id` input each\nsupplied member replaces the stored spec's value for that member whole,\nand an omitted member keeps the spec's value. On a `statvar_set` input,\nwhich has no stored spec, an omitted member is unbound (everything).\n`window` narrows the result to `all`, `latest`, or a\n`start_year`/`end_year` range. `entities` binds role names to non-empty\nlists of dcids (a role's values must each be non-empty and must not\ncontain `+` or `,`). `facets` binds a known axis (`provenance`,\n`measurementMethod`, `unit`) to a specific ref, or `measurementMethod`\nor `unit` to a null ref. The `unit` axis alone may instead carry a\nconversion request (`FacetUnitRequestBinding`) or ask for each entity's\nown currency (`FacetNationalCurrencyBinding`)." + }, + "Scope-Output": { + "properties": { + "place": { "anyOf": [ { - "type": "string" + "$ref": "#/components/schemas/GraphRef" }, { "type": "null" } ], - "title": "Measure Label", - "description": "the readable label for the measure partition this Spec's own served rows exhibit, composed the same way as each 'what' alternative_measures entry's label: what a switch built from those entries would show as currently selected. It names no price basis ('gross disbursements', not 'gross disbursements (nominal)'). Current or constant prices belong to the unit, which the byline's unit token states. None under the same condition alternative_measures is None" - }, - "measure_label_axes": { + "description": "the country the question named, when the engine confirmed it as a country; null when the question named no place or named one that is not a confirmed country" + } + }, + "additionalProperties": false, + "type": "object", + "title": "AnswerScope", + "description": "What a catalogue or declined answer was scoped to. Titled apart from the\ndatasets API's own `Scope`, which the composed app's OpenAPI also publishes." + }, + "ScopeAndUnits": { + "properties": { + "countries": { "items": { "type": "string" }, "type": "array", - "title": "Measure Label Axes", - "description": "the declared measure-axis identifiers (code_index.types.MeasureAxis.axis, e.g. 'measuredProperty', 'measurementQualifier', or a constraint-property dcid such as a financial-flow-type or netting-basis axis) that measure_label was composed from. Every axis the served partition carries a value on is included here, whether or not its value appears in measure_label's own text. A renderer uses this to keep a bound how-slot sharing one of these property dcids from repeating what measure_label already said. Always [] when measure_label is None." - }, - "measure_axis_values": { - "items": { - "$ref": "#/components/schemas/MeasureAxisValue" - }, - "type": "array", - "title": "Measure Axis Values", - "description": "each axis in measure_label_axes with the value the served partition holds on it, in the same order, including values the query never named (a declared default such as Gross or Nominal). Labels come from the measure index. Always [] when measure_label is None. Never a member of BaseIdentity, never hashed." + "title": "Countries" }, - "related_group": { + "years_covered": { "anyOf": [ { - "$ref": "#/components/schemas/GraphRef" + "type": "string" }, { "type": "null" } ], - "description": "the StatVarGroup related_measures come from: the smallest group this Spec's one StatVar belongs to that holds 2 to 40 members, ties broken by group dcid. None when related_measures is None or []" + "title": "Years Covered" }, - "related_measures": { + "granularity": { "anyOf": [ { - "items": { - "$ref": "#/components/schemas/RelatedMeasure" - }, - "type": "array" + "type": "string" }, { "type": "null" } ], - "title": "Related Measures", - "description": "up to 5 other members of related_group with data at every place this Spec names (and in its requested years when it names a range), ordered by the years they share with this Spec's StatVar there, then by dcid. Only a definite Spec that serves exactly one StatVar, has no measure family (measure_label is None) and names places with no roles carries a list; [] when no group qualifies or no other member has data there. None for any other Spec, and when the graph reads failed or ran past their deadline. Never a member of BaseIdentity, never hashed." + "title": "Granularity" }, - "open_axis_facts": { - "anyOf": [ - { - "items": { - "$ref": "#/components/schemas/OpenConstraintAxisFact" - }, - "type": "array" - }, - { - "type": "null" - } - ], - "title": "Open Axis Facts", - "description": "one entry per constraint axis this Spec's own served StatVar members declare (an arc naming the property, resolved or not) that the query left unbound, each naming the axis's property and what those members exhibit on it: whether they agree on a value (varies=False) or differ (varies=True), and undeclared_count for how many declare none at all. None when this Spec's served members declare no constraint property the query left open at all. This is distinct from an open axis every member declares nothing for, which still publishes its own entry (varies=False, undeclared_count equal to the served member count). Never a member of BaseIdentity, never hashed." + "currencies": { + "items": { + "type": "string" + }, + "type": "array", + "title": "Currencies" + } + }, + "type": "object", + "required": [ + "countries", + "years_covered", + "granularity", + "currencies" + ], + "title": "ScopeAndUnits", + "description": "`countries` is always `[]`. `years_covered` is filled where the graph\nhas it. `currencies` lists every currency unit the coverage index gives the\nsource's Provenances, sorted, and `granularity` is filled where it gives\none period and axis pair for the source." + }, + "ScopeChoice": { + "properties": { + "id": { + "type": "string", + "title": "Id", + "description": "':'" }, - "role_axis_facts": { - "anyOf": [ - { - "items": { - "$ref": "#/components/schemas/RoleAxisFact" - }, - "type": "array" - }, - { - "type": "null" - } + "axis": { + "type": "string", + "enum": [ + "sector", + "region", + "measure_basis", + "provider" ], - "title": "Role Axis Facts", - "description": "one entry per directional role axis (origin/destination) this role-bearing Spec's query left open, naming the axis and the member population its own confirmation already resolved (see RoleAxisFact). None when this Spec is not role-bearing, or is role-bearing but every role axis its shape declares carries a bound entity. Never a member of BaseIdentity, never hashed." + "title": "Axis", + "description": "the axis" }, - "unit_conversion": { - "anyOf": [ - { - "$ref": "#/components/schemas/UnitConversion" - }, - { - "type": "null" - } + "rule": { + "type": "string", + "title": "Rule", + "description": "the declared rule that settled the axis" + }, + "provenance": { + "type": "string", + "enum": [ + "explicit", + "carried", + "default" ], - "description": "the currencies and price bases a unit request can convert this answer to. Null when the served members' unit is no currency, no conversion recipe converts them (a stock, a series not in nominal prices, or a provenance that declares no recipe), the recipe's tables lack the native currency's rate in a served year, so nothing converts, or no conversion catalogue is loaded, which the part's unit_conversion_unavailable warning states. Never a member of BaseIdentity, never hashed." + "title": "Provenance", + "description": "what settled the active option" + }, + "active": { + "type": "string", + "maxLength": 128, + "pattern": "^(sector|region|measure_basis|provider):[A-Za-z0-9_+]+$", + "title": "Active", + "description": "the option the compiled identity holds" + }, + "options": { + "items": { + "$ref": "#/components/schemas/Option" + }, + "type": "array", + "minItems": 1, + "title": "Options", + "description": "every option, in declared order" } }, "additionalProperties": false, "type": "object", "required": [ - "shape", - "slots", - "stat_vars", - "entities", - "coverage", - "trace" + "id", + "axis", + "rule", + "provenance", + "active", + "options" ], - "title": "ResolvedSpec", - "description": "What the graph held at resolution time: the engine's report of what it\ndid with the ask. Meant for display and diagnostics, never hashed;\n`Spec.spec_id` depends only on `Spec.definition.identity`. Beside the\ncontract's own `resolved` member list (`stat_vars`, `inapplicable_slots`,\n`unresolved_slots`, `entities`, `coverage`, `headline`, `facets`, `observations`,\n`rendered_sentence`/`sentence_plan`, `slot_options`/`entity_options`,\n`trace`, `confidence`), this also carries the engine's own supersets\n(`shape`, `slots`, `available_at_place`) that slot_options/sentence_plan\njoin against and the eval harness scores." + "title": "ScopeChoice", + "description": "How one axis of the part was counted, and the options it could take." }, - "ResolvedStatVars": { + "SentenceToken": { "properties": { - "member_count": { - "type": "integer", - "title": "Member Count", - "description": "how many members are confirmed to carry observations at this resolve's own probe entities; see this model's own docstring for how this differs from resolved.shape.member_count" + "kind": { + "type": "string", + "enum": [ + "text", + "slot" + ], + "title": "Kind", + "description": "'text' is invariant wording: a connective carrying its own surrounding whitespace (' for ', ' to '), a possessive suffix (\"'s\"), a bare ' '/', ' separator, the terminal '.', or a departure sentence; 'slot' is a slot- or entity-bound phrase, or on an entity_ambiguous no_data plan the ambiguous wording itself, which a client hangs the candidate menu on. A client that does not recognise a kind should render its text as plain text regardless." }, - "member_count_exact": { - "type": "boolean", - "title": "Member Count Exact", - "description": "True when member_count is a true total; False when it is a floor -- the population being at least member_count large, not exactly member_count -- because it was measured over a capped recall sample, because the probe stopped once the answer's member was confirmed, or because it is a where-axis merge's max() of its members' own counts rather than a computed union. Defaults to True, correct for a caller that has not measured otherwise", - "default": true + "text": { + "type": "string", + "title": "Text", + "description": "the rendered text for this token; empty string for a slot with nothing bound" }, - "served_count": { + "axis": { "anyOf": [ { - "type": "integer" + "type": "string", + "enum": [ + "what", + "how", + "where", + "when", + "source", + "unit", + "method" + ] }, { "type": "null" } ], - "title": "Served Count", - "description": "how many StatVars a Datasets mint of this Spec's definition serves, the length of its trace.resolved_stat_vars; 1 for a single series. Null when the membership is unsettled: Search answered from members the mint may not serve, and the part carries membership_unverified" + "title": "Axis", + "description": "the grammatical axis this token fills, when kind=='slot': one of the request-slot axes, 'unit' for the byline's unit of measure, or 'method' for the byline's measurement method, which no request slot carries. The unit token's binding_ref is 'unit:', and its options are the Spec's resolved.alternative_measures entries with axis 'unit': the price-basis siblings (current and constant prices) where the graph holds both. The method token appears only when the identity binds measurementMethod (a ref, a null ref, or a set), after the source token; its binding_ref is 'method:', its text the bound method's label without a trailing full stop or 'No stated method' for a null ref, and its options the Spec's facet_options entry with axis 'measurementMethod'" }, - "data_date_range": { + "segment": { + "type": "string", + "enum": [ + "coverage", + "heading", + "byline", + "departure", + "assumption" + ], + "title": "Segment", + "description": "the part of the sentence this token belongs to: 'coverage' (the 'Answered N of M parts.' a mixed envelope sentence opens with, never on a part's or a Spec's own plan), 'heading' (what the answer is), 'byline' (latest-year label, unit, source, and a bound method), 'departure' (the text of one Departure on the same part, never on a Spec's own plan), or 'assumption' (the closing clause naming what the answer assumed, from the parts' assumptions, never on a Spec's own plan). A client styles each segment as a block; the plain join of every token's text still equals rendered_sentence", + "default": "heading" + }, + "property_dcid": { "anyOf": [ { - "$ref": "#/components/schemas/DateRange" + "type": "string" }, { "type": "null" } ], - "description": "the earliest first date and latest last date of the points the answer's read plan serves over its StatVars; null when it serves none" - }, - "source_codes": { - "items": { - "$ref": "#/components/schemas/SourceCode" - }, - "type": "array", - "title": "Source Codes", - "description": "the publisher series codes of the StatVars the answer serves, sorted by provenance then code and without repeats; left out when no served StatVar has a code. They identify the series a publisher files these StatVars under, and the answer is the same with or without them. A code names the whole answer only where its entry is exact" - } - }, - "additionalProperties": false, - "type": "object", - "required": [ - "member_count" - ], - "title": "ResolvedStatVars", - "description": "`resolved.stat_vars` on the wire: how many StatVars the answer holds, how many a\nDatasets mint of the Spec's definition serves, and the dates the answer serves over\nthem. The members themselves stay off the wire; `POST /api/datasets/{id}/members`\nlists the ones a mint serves.\n\nmember_count is the population confirmed to carry observations at this\nresolve's own probe entities, not resolved.shape.member_count's\nbindings-admitted population. The two differ for two reasons. A member the\nshape's bindings admit can carry no observation at the resolved place. And on\na role-bearing shape the answer reads one role class of the admitted members:\nwhere a total stands for its breakdowns the breakdowns are folded into it, so a\ndonor-only answer can state 255 admitted members beside 1 confirmed while every\none of the 255 holds data. On a standard (non-role-bearing) shape this population can itself\nbe a floor: the packaged code index does not source members for every\nshape family, so a shape outside it falls back to its recall sample, the\nmembers recall found, and member_count cannot exceed what that sample\nadmitted. An answer naming one member of a family too large for one read stops\nreading once that member is confirmed, so member_count counts the members read: \"latest\nlife expectancy data\" reads the family's total and not its other 350 members. A\nwhere-axis merge (same_shape.py, \"population\nof Kenya and Uganda\") publishes max() of its members' own member_count\nrather than the sum, since the same StatVar is typically confirmed at\nevery member's own place and summing would double-count the\nintersection -- max() is a true lower bound of the union. member_count_exact\nrecords which of these applies.\n\nserved_count is the mint's own count, a function of the definition alone: the\nStatVars a Datasets mint of `definition` serves, the length of its\n`trace.resolved_stat_vars`. It is stated whenever Search settled the membership the\nmint resolves: a family the code index decides, or a family the mint's member walk\nsettled for this definition. Null when Search answers from members it could not\nsettle, which the part flags with a `membership_unverified` warning." - }, - "ResubmitCandidate": { - "properties": { - "identity": { - "$ref": "#/components/schemas/BaseIdentity", - "description": "this candidate's complete identity" + "title": "Property Dcid", + "description": "the constraint property dcid this token renders, when one exists; null or omitted for property-less axes (when/source), for a shape-label fallback phrase with no backing slot, and for entity-role tokens with no backing where slot. Set on a 'destination' entity-role token when the shape declares a where slot backing that axis (e.g. dev-finance)." }, - "entity_groups": { + "role": { "anyOf": [ { - "additionalProperties": { - "$ref": "#/components/schemas/EntityGroup" - }, - "propertyNames": { - "enum": [ - "observationAbout", - "origin", - "destination" - ] - }, - "type": "object" + "$ref": "#/components/schemas/RoleAxis" }, { "type": "null" } ], - "title": "Entity Groups", - "description": "the named group each role's entities were asked for as, keyed by entity role key. Post a prior Spec's resolved.entity_groups beside any identity derived from that Spec. A group is kept when it posts a dcid and the graph's members of that node are exactly the identity's entities on the role; any other group, including one on a role the identity binds no entity on, is dropped" + "description": "origin/destination when this token renders a directional entity role (the flow's two endpoints read back), or the directional scope an unbound where slot resolved to. entity_refs is the discriminator: non-empty on the entity read-back, empty on the unbound-where-slot fallback. binding_ref is not: an entity read-back carries binding_ref too whenever the shape declares a where slot backing the 'destination' axis (e.g. dev-finance), the same condition under which the unbound-where-slot fallback always carries it, so a present binding_ref value never separates the two. Both kinds join to the Spec.resolved.entity_options entry on the same role. A third token sits on an entity_ambiguous no_data plan, which has no Spec: the ambiguous wording, with the role the request gave it (null when it gave none), no entity_refs and no binding_ref, and text equal to one NoData.ambiguous_entities[i].text on the same part, the i its entity_choice names. The client titles that wording's candidate menu by this role and posts the pick's entry of NoData.options." }, - "assumptions": { + "entity_choice": { "anyOf": [ { - "items": { - "$ref": "#/components/schemas/Assumption" - }, - "type": "array", - "maxItems": 67 + "type": "integer", + "minimum": 0.0 + }, + { + "type": "null" + } + ], + "title": "Entity Choice", + "description": "on the slot token an entity_ambiguous no_data plan marks for an ambiguous wording, the index into NoData.ambiguous_entities of the group it asks, on the part its part_index names in an envelope plan. The NoData.options with the same entity_choice form that slot's menu. Null on every other token" + }, + "binding_ref": { + "anyOf": [ + { + "type": "string" }, { "type": "null" } ], - "title": "Assumptions", - "description": "the assumptions of the reading this candidate rebuilds, echoed as the response gave them, which are the candidates part's reading_assumptions under the reading's spec_id. The rebuilt reading's reading_assumptions entry states the echoed items that still hold, each worded from the rebuilt reading by the rule ResubmitIdentityEntry.assumptions states, and the rebuilt part's assumptions are the items every reading_assumptions list holds alike. An item the echo lacks is not stated, so an edit of a defaulted slot to another value drops that default, and [], the echo of a reading that stated none, states none. None, the default, means the client echoes nothing for this reading, which yields what a fresh request would: no declared default, since the posted identity binds every slot, and the open roles and place scope the reading reads" - } - }, - "additionalProperties": false, - "type": "object", - "required": [ - "identity" - ], - "title": "ResubmitCandidate", - "description": "One candidate identity within a `candidates` dataset_resubmit entry. The\nengine derives its StatVar members as it does for an identity entry." - }, - "ResubmitCandidatesEntry": { - "properties": { - "entry_kind": { - "type": "string", - "const": "candidates", - "title": "Entry Kind", - "description": "discriminator for a candidate-set dataset_resubmit entry", - "default": "candidates" - }, - "variable_text": { - "type": "string", - "maxLength": 200, - "minLength": 1, - "title": "Variable Text", - "description": "this part's variable text, echoed back onto the rebuilt part" - }, - "ordering": { - "type": "string", - "enum": [ - "broadest_first", - "intent_rank" - ], - "title": "Ordering", - "description": "how `candidates` below was ordered when this set was first produced; echoed back verbatim onto the rebuilt candidates part, never recomputed" - }, - "truncated": { - "type": "boolean", - "title": "Truncated", - "description": "echoed back verbatim onto the rebuilt candidates part -- see CandidateSet.truncated for what this flags" + "title": "Binding Ref", + "description": "join key correlating this token to its Spec.resolved.slots / SlotOptions entry: 'axis:property_dcid', i.e. SlotKey.as_ref() (matching Slot.key and SlotOptions.key). Set for a slot-backed token, and also for a 'destination' entity-role token when the shape declares a where slot backing that axis (e.g. dev-finance) -- see entity_refs for the entity side of that token. The byline's unit token carries 'unit:', which no slot backs; its options are the resolved.alternative_measures entries with axis 'unit'. The byline's method token carries 'method:', which no slot backs either. Null or omitted for plain connective text, a shape-label fallback phrase with no backing slot, and 'origin'/unbacked-'destination' entity-role tokens." }, - "candidates": { + "entity_refs": { "items": { - "$ref": "#/components/schemas/ResubmitCandidate" + "type": "string" }, "type": "array", - "maxItems": 50, - "minItems": 2, - "title": "Candidates", - "description": "the competing candidates to re-materialise, in posted order, always -- the rebuilt CandidateSet.specs preserves this exact order. Refused request_invalid, at the engine rather than here, when the posted count exceeds this deployment's own ceiling -- readable in advance as caps.max_candidates from GET /api/search/capabilities" - }, - "separate": { - "type": "boolean", - "title": "Separate", - "description": "true when this part is asked beside the others to be compared with them; it is kept apart from same-shape sibling parts. False, the default, folds parts that share a shape into one set answer", - "default": false + "title": "Entity Refs", + "description": "entity dcids this token renders, set on the entity read-back, one of the two token kinds role marks (see role's own docstring for the other, the unbound-where-slot fallback, which leaves entity_refs empty even though it too carries role) -- a directional entity read-back has no Spec.resolved.slots entry of its own, though a 'destination' token may additionally carry binding_ref when a backing where slot exists (e.g. dev-finance); one dcid per entity in the token's group, in the same order as the entities joined into this token's text -- e.g. a 'destination' token reading 'Ethiopia, Kenya, and Uganda' carries all three dcids, so a client can tell a 3-entity answer from a 1-entity one without parsing rendered text. Empty when role is unset, and this emptiness, not binding_ref, is the join rule that separates the two role-bearing kinds." }, - "operations": { + "states": { "items": { - "$ref": "#/components/schemas/Operation" + "type": "string" }, "type": "array", - "maxItems": 8, - "title": "Operations", - "description": "the operations the question asks for over this part's data, in query order; the engine echoes them onto the part it resolves. Empty when the question asks for none" - } - }, - "additionalProperties": false, - "type": "object", - "required": [ - "variable_text", - "ordering", - "truncated", - "candidates" - ], - "title": "ResubmitCandidatesEntry", - "description": "One part re-materialised from a posted set of competing candidate\nidentities, through the promote path, in posted order, always. `ordering`\nnames the display rule this set already used, restated rather than\nrecomputed: the order rests on the bind model's election and the availability\nreads of the first answer, which do not round-trip -- see `Ordering` and\n`outcomes.CandidateSet`. This entry carries no\n`max_candidates` field: `CandidateSet.max_candidates` on the response is\nnot posted back and is always server-computed, never client-supplied." - }, - "ResubmitIdentityEntry": { - "properties": { - "entry_kind": { - "type": "string", - "const": "identity", - "title": "Entry Kind", - "description": "discriminator for a single-identity dataset_resubmit entry", - "default": "identity" - }, - "variable_text": { - "type": "string", - "maxLength": 200, - "minLength": 1, - "title": "Variable Text", - "description": "this part's variable text, echoed back onto the rebuilt part" - }, - "identity": { - "$ref": "#/components/schemas/BaseIdentity", - "description": "the complete identity. Post a prior Spec.definition.identity byte-for-byte for a no-op resubmit; change nested members, including entities.origin or entities.destination, to edit that definition" + "title": "States", + "description": "the refs a heading or byline slot token states, so a client edits each from this token: its own binding_ref, then each binding the renderer left silent because this token's text already says it. Refs read as binding_ref does ('how:crsTypeOfFlow', 'where:', 'origin:', 'unit:'), plus 'axis:' for a measure axis no slot carries ('axis:nettingBasis'). The measure noun states the measure axes its label or authored noun carries, the how values it names, and the agreed open axes beside it; a StatVar name or graph name states the how values it folds. The byline's unit token states 'unit:' and, when it names a price basis, the measurementQualifier axis. The byline's source token states 'source:', which is also its binding_ref where the answer binds a source slot. The byline's method token states 'method:', its binding_ref, and while the identity binds no method no token states 'method:'. Empty on a token with empty text, on text tokens, and outside heading and byline slot tokens. Within one part, no ref appears on two tokens with text. A bound slot, an unbound slot with options, or a role that no token states is stated nowhere in the sentence (a boolean member, an adjectival fold dropped whole, an open role with no count), and a client offers it apart from the sentence with its current value. On the envelope plan a token with no part_index states its refs for every part it stands for" }, - "entity_groups": { + "distinguishes": { "anyOf": [ { - "additionalProperties": { - "$ref": "#/components/schemas/EntityGroup" - }, - "propertyNames": { - "enum": [ - "observationAbout", - "origin", - "destination" - ] - }, - "type": "object" + "type": "boolean" }, { "type": "null" } ], - "title": "Entity Groups", - "description": "the named group each role's entities were asked for as, keyed by entity role key. Post a prior Spec's resolved.entity_groups beside any identity derived from that Spec. A group is kept when it posts a dcid and the graph's members of that node are exactly the identity's entities on the role; any other group, including one on a role the identity binds no entity on, is dropped" - }, - "separate": { - "type": "boolean", - "title": "Separate", - "description": "true when this part is asked beside the others to be compared with them; it is kept apart from same-shape sibling parts. False, the default, folds parts that share a shape into one set answer", - "default": false - }, - "operations": { - "items": { - "$ref": "#/components/schemas/Operation" - }, - "type": "array", - "maxItems": 8, - "title": "Operations", - "description": "the operations the question asks for over this part's data, in query order; the engine echoes them onto the part it resolves. Empty when the question asks for none" + "title": "Distinguishes", + "description": "true when this token's text differs from the same-bucket text on another candidate in the same CandidateSet; null or omitted on every other token, including every token on a Spec rendered outside a candidate set" }, - "assumptions": { + "part_index": { "anyOf": [ { - "items": { - "$ref": "#/components/schemas/Assumption" - }, - "type": "array", - "maxItems": 67 + "type": "integer" }, { "type": "null" } ], - "title": "Assumptions", - "description": "the assumptions of the part this entry rebuilds, echoed as the response gave them. For a definite part these are its assumptions. For a reading picked from a candidates part they are that part's reading_assumptions under the reading's spec_id. The rebuilt part states the echoed items that still hold, each worded from the rebuilt answer: a declared_default whose slot (binding_ref) still binds the echoed refs, an open_role whose axis the answer still reads across every member with no entity of the identity's, and a place_scope on an answer that still names no place. An item the echo lacks is not stated, since the posted identity or its edit asked for it. An edit of a defaulted slot to another value therefore drops that default, and [], the echo of a part that stated none, states none. None, the default, means the client echoes nothing, and the part states what a fresh request would: no declared default, since the posted identity binds every slot, and the open roles and place scope the answer reads. The engine cannot tell an echoed default from one the caller writes for a slot it chose itself, and states such an item while the slot binds its refs. An echo shapes only the caller's own response" - } - }, - "additionalProperties": false, - "type": "object", - "required": [ - "variable_text", - "identity" - ], - "title": "ResubmitIdentityEntry", - "description": "One part re-resolved from a single identity -- the payload\n`ResubmitIdentityPayload` carries, plus the text echo and operations every\ndataset_resubmit entry needs." - }, - "ResubmitParsedEntry": { - "properties": { - "entry_kind": { - "type": "string", - "const": "parsed", - "title": "Entry Kind", - "description": "discriminator for a re-parsed dataset_resubmit entry", - "default": "parsed" - }, - "part": { - "$ref": "#/components/schemas/ParsedPart", - "description": "this part's resolution inputs -- normally a prior response part's own Part.restatement, posted back verbatim or edited, and resolved through the same per-part machinery the parsed door uses" + "title": "Part Index", + "description": "this token's position in Resolution.parts, when this plan is the envelope-level composed sentence (Resolution.sentence_plan) and this token belongs to exactly one part's own contribution -- a variable phrase token, or a qualifier attached to it because it did not agree across every part, or a token of a part composed as its own sentence. Null carries four distinct readings a client must not conflate: on a part's own plan (DefinitePart.spec.resolved.sentence_plan, or the candidates/no_data/unsupported sentence_plan on _PartBase) the field has no meaning at all and is never set; on a composer-minted token, it means the token belongs to the sentence as a whole rather than to any one part (the Oxford-joined ' and '/', ', the plan's own terminal '.', the shared ' ' the per-part fallback puts between two sentences, the 'coverage' opener, and an assumptions clause's lead, separators and '.' when no one part carries every item it names are all such tokens); on a token every contributing part states alike and the join states once (a hoisted qualifier on the where, when, or source axis, each a wire value of axis, or the origin role, identified by role=='origin' instead since SentenceAxis has no 'origin' member; a shared possessive lead; the shared byline; or a heading or byline token of a part a later part folded into, binding_folded, which both parts state) it means the token no longer describes a single variable; and on an 'assumption' item it means more than one part assumed it, and each part's own assumptions list says which." } }, "additionalProperties": false, "type": "object", "required": [ - "part" + "kind", + "text" ], - "title": "ResubmitParsedEntry", - "description": "One part genuinely re-resolved through the parsed door's own per-part\npath, from a client-edited restatement of a sibling's own resolution\ninputs (`Part.restatement`) -- re-parsed, where `placeholder` only\nrestates a stub. `part` already carries a required `variable_text` and\nits own `operations`, so this entry needs no separate top-level echo\nfields the way the other three kinds do. Costs one LLM bind per edit, the\ndoor's one entry kind that touches the LLM client at all." + "title": "SentenceToken", + "description": "One token in the ordered sentence plan: a \"text\" token (invariant\nwording such as a connective, a bare separator, the terminal period, or a\ndeparture sentence) or a \"slot\" token (a slot- or entity-bound phrase, or\nthe wording of an ambiguous entity).\n\n``rendered_sentence`` (the flat string) is the plain concatenation of every\ntoken's ``text``, in order. The two are computed together and cannot drift.\nA \"slot\" token with nothing bound appears too, with ``text=\"\"``: the same\ntoken structure serves a loading skeleton (before binding is known) and the\nfinal sentence (after it is). The first non-empty token's text is\ncapitalised.\n\nEvery token belongs to one ``segment``. The heading states what the answer\nis: actor, measure noun, counterpart, and period, in possessive order, one\nslot token per axis (\"Germany's gross ODA disbursements to Kenya, 1973 to\n2024\"). A unit that changes the magnitude (per capita, percent of GDP, PPP\ninternational dollars) stays in the heading. The byline follows it: the\nlatest-year label when one applies, the plain unit with its price basis\n(\"current US dollars\", \"constant 2022 US dollars\") as a slot token with\naxis \"unit\", the source, and, when the identity binds measurementMethod, the\nmethod as a slot token with axis \"method\". Departures come next, then the\nassumptions clause, and both sit only on a part's or the envelope's sentence, so\n``spec.resolved.sentence_plan`` carries neither." }, - "ResubmitPlaceholderEntry": { + "Series": { "properties": { - "entry_kind": { - "type": "string", - "const": "placeholder", - "title": "Entry Kind", - "description": "discriminator for a stub dataset_resubmit entry", - "default": "placeholder" - }, - "variable_text": { - "type": "string", - "maxLength": 200, - "minLength": 1, - "title": "Variable Text", - "description": "this part's variable text, echoed back onto the rebuilt part" + "measurement_method": { + "anyOf": [ + { + "$ref": "#/components/schemas/NodeRef" + }, + { + "type": "null" + } + ], + "description": "null when no facet states a method: no stated method" }, - "status": { - "type": "string", - "enum": [ - "no_data", - "unsupported" + "observation_period": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } ], - "title": "Status", - "description": "which stub outcome to restate for this part" + "title": "Observation Period" }, - "reason": { + "scaling": { "anyOf": [ { - "type": "string", - "enum": [ - "source_not_resolved", - "source_ambiguous", - "source_code_not_held", - "source_code_ambiguous", - "source_code_shares_variable", - "entity_not_resolved", - "entity_ambiguous", - "entity_set_too_large", - "entity_role_not_admitted", - "variable_not_resolved", - "role_not_resolved", - "unit_not_resolved", - "rate_coverage_gap", - "no_matching_slice", - "binding_mismatch", - "denominator_not_available", - "no_observations", - "facet_not_available", - "role_incompatible", - "role_signature_incompatible", - "qualifier_not_bound", - "timed_out" - ] + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Scaling" + }, + "first_year": { + "anyOf": [ + { + "type": "string" }, { "type": "null" } ], - "title": "Reason", - "description": "the NoData.reason to restate onto the rebuilt part; required when status is no_data, refused when status is unsupported" + "title": "First Year" }, - "code": { + "last_year": { "anyOf": [ { "type": "string" @@ -15420,109 +19144,112 @@ "type": "null" } ], - "title": "Code", - "description": "the reason, a code from the platform registry, to restate onto the rebuilt part's Unsupported.code; required when status is unsupported, refused when status is no_data" + "title": "Last Year" }, - "separate": { - "type": "boolean", - "title": "Separate", - "description": "true when this part is asked beside the others to be compared with them; it is kept apart from same-shape sibling parts. False, the default, folds parts that share a shape into one set answer", - "default": false + "places": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ], + "title": "Places", + "description": "null for a role-bearing variable" }, - "operations": { - "items": { - "$ref": "#/components/schemas/Operation" - }, - "type": "array", - "maxItems": 8, - "title": "Operations", - "description": "the operations the question asks for over this part's data, in query order; the engine echoes them onto the part it resolves. Empty when the question asks for none" + "observations": { + "type": "integer", + "title": "Observations" + }, + "units": { + "$ref": "#/components/schemas/UnitsFold" + }, + "binding": { + "$ref": "#/components/schemas/Binding" } }, - "additionalProperties": false, "type": "object", "required": [ - "variable_text", - "status" + "measurement_method", + "observation_period", + "scaling", + "first_year", + "last_year", + "places", + "observations", + "units", + "binding" ], - "title": "ResubmitPlaceholderEntry", - "description": "One part restated as a stub from a no_data/unsupported outcome the\nclient already holds -- zero graph round-trips, zero LLM calls. Carried\nforward unresolved so its sibling parts' composed sentence and fold can\nstill be computed across the whole dataset; the engine stamps a\npart-scoped `part_restated` info warning on the rebuilt part." + "title": "GraphAvailabilitySeries", + "description": "A source's facets sharing a measurement method, period and scaling." }, - "RetentionModel": { + "SeriesAxisRef": { "properties": { - "pinned": { - "type": "boolean", - "title": "Pinned", - "description": "whether the frame the version's files render from is in the pinned tier, which has no expiry" + "property": { + "type": "string", + "title": "Property", + "description": "the constraint property's dcid, e.g. 'crsPurpose'" }, - "held_until": { - "anyOf": [ - { - "type": "string", - "format": "date-time" - }, - { - "type": "null" - } - ], - "title": "Held Until", - "description": "when the working-tier frame stops being guaranteed, 30 days after it was stored. A download of the frame after `held_until`, while its bytes survive, renews it for 30 days. After it, a file selector or download link request that must render its file again renews the frame for 30 days if the frame's bytes survive, and otherwise refuses `artifact_expired`. A rebuild of unchanged data through `GET /api/datasets/{id}` or `POST /api/datasets` stores the frame again. Absent when pinned. It can be in the past" + "ref": { + "type": "string", + "title": "Ref", + "description": "the dcid of the value the StatVar holds on property" + }, + "label": { + "type": "string", + "title": "Label", + "description": "display label for ref: its graph label, else the dcid's tail split into lower-case words" } }, "additionalProperties": false, "type": "object", "required": [ - "pinned" + "property", + "ref", + "label" ], - "title": "RetentionModel", - "description": "How long a version can still be fetched, which `datasets_api.retention` computes when a\ndoor serves the version. No stored body holds it." - }, - "RoleAxis": { - "type": "string", - "enum": [ - "origin", - "destination" - ] + "title": "SeriesAxisRef", + "description": "One constraint of a series' StatVar (see ObservationSeries.axes)." }, - "RoleAxisFact": { + "SeriesConversionFallbackExample": { "properties": { - "role": { - "$ref": "#/components/schemas/RoleAxis", - "description": "which flow axis this fact is about" - }, - "member_count": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ], - "title": "Member Count", - "description": "how many entities this axis' open scope resolves to, leaving out the group totals the code index declares beside their members (party_kind total), as the default download leaves them out; a scope of totals alone counts them all. None when the count could not be established without a read this response chose not to make (e.g. a discovered opposite axis whose own role index was omitted after a cap trip); the fact still publishes in that case, naming the axis as open with an explicit unknown rather than staying silent about it" + "entity": { + "type": "string", + "title": "Entity", + "description": "the entity dcid absent from the deflator table" }, - "members_available": { - "type": "boolean", - "title": "Members Available", - "description": "whether the member list this count summarises is itself known and could be enumerated (e.g. through entity_options or the options door), not just counted. False exactly when member_count is None" + "fallback_entity": { + "type": "string", + "title": "Fallback Entity", + "description": "the recipe's fallback entity substituted for it" } }, "additionalProperties": false, "type": "object", "required": [ - "role", - "member_count", - "members_available" + "entity", + "fallback_entity" ], - "title": "RoleAxisFact", - "description": "One directional role axis (origin or destination) a role-bearing\nSpec's query left open, and what this Spec's own confirmation already\nknows about its member scope (see ResolvedSpec.role_axis_facts).\n\nUnlike OpenConstraintAxisFact, a role axis has no declared value of its\nown that could vary across served members -- the axis is a place a flow\nentity binds, not a constraint members assert -- so this carries no\nvaries/undeclared_count of its own; it carries only what a role axis\ngenuinely has: a population size and whether that population is known." + "title": "SeriesConversionFallbackExample", + "description": "One entity a converted series' recipe substituted with its own\nfallback entity, because the substituted entity carried no row at all\nin the deflator table (see ObservationSeriesConversion.fallback_examples)." }, - "RootEntry": { + "SeriesEntityRef": { "properties": { + "role": { + "type": "string", + "enum": [ + "observationAbout", + "origin", + "destination" + ], + "title": "Role", + "description": "observationAbout, origin, or destination" + }, "ref": { "type": "string", - "title": "Ref" + "title": "Ref", + "description": "the entity's dcid" }, "label": { "anyOf": [ @@ -15533,205 +19260,106 @@ "type": "null" } ], - "title": "Label" + "title": "Label", + "description": "best-effort display label for ref; None when unresolved, never fabricated" }, - "count": { - "type": "integer", - "title": "Count", - "description": "codes for a code system, members under the default projection for a group or region, Datasets for a source" + "party_kind": { + "anyOf": [ + { + "type": "string", + "enum": [ + "party", + "total", + "residual" + ] + }, + { + "type": "null" + } + ], + "title": "Party Kind", + "description": "on an origin or destination entity, what the party is beside the others on its side: 'party' (a country, territory or organisation), 'total' (other parties' figures, so a sum across the role that counts it counts its members twice) or 'residual' (figures no other party holds), as the code index lists it. Absent for a party the index does not list, and on observationAbout" } }, + "additionalProperties": false, "type": "object", "required": [ - "ref", - "label", - "count" + "role", + "ref" ], - "title": "GraphRootEntry", - "description": "A place to start listing from, with the length of its list." + "title": "SeriesEntityRef", + "description": "One entity in a series' role tuple (see ObservationSeries.entities)." }, - "Roots": { + "SeriesFacetRef": { "properties": { - "code_systems": { - "items": { - "$ref": "#/components/schemas/RootEntry" - }, - "type": "array", - "title": "Code Systems" - }, - "groups": { - "items": { - "$ref": "#/components/schemas/RootEntry" - }, - "type": "array", - "title": "Groups" - }, - "regions": { - "items": { - "$ref": "#/components/schemas/RootEntry" - }, - "type": "array", - "title": "Regions" - }, - "sources": { - "items": { - "$ref": "#/components/schemas/RootEntry" - }, - "type": "array", - "title": "Sources" + "ref": { + "type": "string", + "title": "Ref", + "description": "the facet's dcid for this axis" }, - "built_from": { - "additionalProperties": { - "type": "string" - }, - "propertyNames": { - "enum": [ - "code_index", - "origin_catalogue", - "coverage_index", - "membership" - ] - }, - "type": "object", - "title": "Built From", - "description": "the build of each table the document read" - } - }, - "type": "object", - "required": [ - "code_systems", - "groups", - "regions", - "sources", - "built_from" - ], - "title": "GraphRoots", - "description": "`GET /api/graph/roots`: where to start listing. Each list is ordered by dcid." - }, - "Scope-Input": { - "properties": { - "window": { + "label": { "anyOf": [ { - "oneOf": [ - { - "$ref": "#/components/schemas/WindowAll" - }, - { - "$ref": "#/components/schemas/WindowLatest" - }, - { - "$ref": "#/components/schemas/WindowRange" - } - ], - "discriminator": { - "propertyName": "kind", - "mapping": { - "all": "#/components/schemas/WindowAll", - "latest": "#/components/schemas/WindowLatest", - "range": "#/components/schemas/WindowRange" - } - } + "type": "string" }, { "type": "null" } ], - "title": "Window", - "description": "the years to serve. Replaces the spec's window whole" + "title": "Label", + "description": "best-effort display label for ref; None when unresolved, never fabricated" }, - "entities": { + "source": { "anyOf": [ { - "additionalProperties": { - "items": { - "type": "string" - }, - "type": "array" - }, - "type": "object" + "$ref": "#/components/schemas/SourceRef" }, { "type": "null" } ], - "title": "Entities", - "description": "role name to dcids. Replaces the spec's whole entity binding. A role this map omits is unbound, so a client narrowing one role repeats the spec's other roles, and {} unbinds every bound role. An open role the map binds is no longer open" + "description": "provenance axis only: the organisation behind the provenance, from the origin catalogue; absent for a provenance the catalogue does not list" }, - "facets": { + "data_commons": { "anyOf": [ { - "additionalProperties": { - "oneOf": [ - { - "$ref": "#/components/schemas/FacetRefBinding" - }, - { - "oneOf": [ - { - "$ref": "#/components/schemas/UnitCurrentPricesRequestBinding" - }, - { - "$ref": "#/components/schemas/UnitConstantPricesRequestBinding" - } - ], - "discriminator": { - "propertyName": "prices", - "mapping": { - "constant": "#/components/schemas/UnitConstantPricesRequestBinding", - "current": "#/components/schemas/UnitCurrentPricesRequestBinding" - } - } - }, - { - "$ref": "#/components/schemas/FacetNationalCurrencyBinding" - } - ] - }, - "type": "object" + "$ref": "#/components/schemas/search__models__grammar__DataCommonsRef" }, { "type": "null" } ], - "title": "Facets", - "description": "axis to binding. Replaces the spec's whole facet binding" - } - }, - "additionalProperties": false, - "type": "object", - "title": "Scope", - "description": "The `scope` block a mint request may carry. On a `spec_id` input each\nsupplied member replaces the stored spec's value for that member whole,\nand an omitted member keeps the spec's value. On a `statvar_set` input,\nwhich has no stored spec, an omitted member is unbound (everything).\n`window` narrows the result to `all`, `latest`, or a\n`start_year`/`end_year` range. `entities` binds role names to non-empty\nlists of dcids (a role's values must each be non-empty and must not\ncontain `+` or `,`). `facets` binds a known axis (`provenance`,\n`measurementMethod`, `unit`) to a specific ref, or `measurementMethod`\nor `unit` to a null ref. The `unit` axis alone may instead carry a\nconversion request (`FacetUnitRequestBinding`) or ask for each entity's\nown currency (`FacetNationalCurrencyBinding`)." - }, - "Scope-Output": { - "properties": { - "place": { + "description": "provenance axis only: the Data Commons the provenance's data comes from; absent for a provenance the catalogue does not list" + }, + "documentation": { "anyOf": [ { - "$ref": "#/components/schemas/GraphRef" + "type": "string" }, { "type": "null" } ], - "description": "the country the question named, when the engine confirmed it as a country; null when the question named no place or named one that is not a confirmed country" + "title": "Documentation", + "description": "provenance axis only: the Graph API route of the provenance's document, GET /api/graph/documentation/{dcid}" } }, "additionalProperties": false, "type": "object", - "title": "AnswerScope", - "description": "What a catalogue or declined answer was scoped to. Titled apart from the\ndatasets API's own `Scope`, which the composed app's OpenAPI also publishes." + "required": [ + "ref" + ], + "title": "SeriesFacetRef", + "description": "One axis's value on a single series' selected observation facet (see\nObservationSeries.facet)." }, - "ScopeAndUnits": { + "SeriesStatVarRef": { "properties": { - "countries": { - "items": { - "type": "string" - }, - "type": "array", - "title": "Countries" + "ref": { + "type": "string", + "title": "Ref", + "description": "the StatVar dcid these points observe" }, - "years_covered": { + "label": { "anyOf": [ { "type": "string" @@ -15740,9 +19368,26 @@ "type": "null" } ], - "title": "Years Covered" + "title": "Label", + "description": "a row's own distinguishing label: composed from ref's own constraint values when it has any beyond its shape's shared five-tuple, else ref's plain resolved display name; None when unresolved, never fabricated" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "ref" + ], + "title": "SeriesStatVarRef", + "description": "A series' StatVar identity ({ref, label} -- mirrors SeriesFacetRef's shape)." + }, + "ServedMember": { + "properties": { + "ref": { + "type": "string", + "pattern": "^dcid:", + "title": "Ref" }, - "granularity": { + "label": { "anyOf": [ { "type": "string" @@ -15751,113 +19396,128 @@ "type": "null" } ], - "title": "Granularity" + "title": "Label" }, - "currencies": { + "roles": { "items": { "type": "string" }, "type": "array", - "title": "Currencies" + "title": "Roles" + }, + "constraints": { + "additionalProperties": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "type": "object", + "title": "Constraints" } }, + "additionalProperties": false, "type": "object", "required": [ - "countries", - "years_covered", - "granularity", - "currencies" + "ref", + "label", + "roles", + "constraints" ], - "title": "ScopeAndUnits", - "description": "`countries` is always `[]`. `years_covered` is filled where the graph\nhas it. `currencies` lists every currency unit the coverage index gives the\nsource's Provenances, sorted, and `granularity` is filled where it gives\none period and axis pair for the source." + "title": "ServedMember", + "description": "One StatVar a definition serves: its `dcid:`-prefixed `ref`, as the manifest trace's\n`resolved_stat_vars` names it, its graph `label` (`null` when the graph holds none), the\n`roles` it declares, and its `constraints`, each constraint property with its value\n(`null` when the StatVar leaves it unbound)." }, - "SentenceToken": { + "Shape": { "properties": { - "kind": { + "shape_id": { "type": "string", - "enum": [ - "text", - "slot" - ], - "title": "Kind", - "description": "'text' is invariant wording: a connective carrying its own surrounding whitespace (' for ', ' to '), a possessive suffix (\"'s\"), a bare ' '/', ' separator, the terminal '.', or a departure sentence; 'slot' is a slot- or entity-bound phrase, or on an entity_ambiguous no_data plan the ambiguous wording itself, which a client hangs the candidate menu on. A client that does not recognise a kind should render its text as plain text regardless." + "title": "Shape Id", + "description": "stable id of this structural family" }, - "text": { + "label": { "type": "string", - "title": "Text", - "description": "the rendered text for this token; empty string for a slot with nothing bound" + "title": "Label", + "description": "plain-language name of what the reading serves: a composed measure label, the served series' name, or the family's name" }, - "axis": { + "population_type": { "anyOf": [ { - "type": "string", - "enum": [ - "what", - "how", - "where", - "when", - "source", - "unit", - "method" - ] + "$ref": "#/components/schemas/GraphRef" }, { "type": "null" } ], - "title": "Axis", - "description": "the grammatical axis this token fills, when kind=='slot': one of the request-slot axes, 'unit' for the byline's unit of measure, or 'method' for the byline's measurement method, which no request slot carries. The unit token's binding_ref is 'unit:', and its options are the Spec's resolved.alternative_measures entries with axis 'unit': the price-basis siblings (current and constant prices) where the graph holds both. The method token appears only when the identity binds measurementMethod (a ref, a null ref, or a set), after the source token; its binding_ref is 'method:', its text the bound method's label without a trailing full stop or 'No stated method' for a null ref, and its options the Spec's facet_options entry with axis 'measurementMethod'" + "description": "the graph populationType; None when the StatVar does not assert it (custom-DC imports may omit any five-tuple arc)" }, - "segment": { - "type": "string", - "enum": [ - "coverage", - "heading", - "byline", - "departure", - "assumption" + "measured_property": { + "anyOf": [ + { + "$ref": "#/components/schemas/GraphRef" + }, + { + "type": "null" + } ], - "title": "Segment", - "description": "the part of the sentence this token belongs to: 'coverage' (the 'Answered N of M parts.' a mixed envelope sentence opens with, never on a part's or a Spec's own plan), 'heading' (what the answer is), 'byline' (latest-year label, unit, source, and a bound method), 'departure' (the text of one Departure on the same part, never on a Spec's own plan), or 'assumption' (the closing clause naming what the answer assumed, from the parts' assumptions, never on a Spec's own plan). A client styles each segment as a block; the plain join of every token's text still equals rendered_sentence", - "default": "heading" + "description": "the graph measuredProperty; None when the StatVar does not assert it (custom-DC imports may omit any five-tuple arc)" }, - "property_dcid": { + "stat_type": { "anyOf": [ { - "type": "string" + "$ref": "#/components/schemas/GraphRef" }, { "type": "null" } ], - "title": "Property Dcid", - "description": "the constraint property dcid this token renders, when one exists; null or omitted for property-less axes (when/source), for a shape-label fallback phrase with no backing slot, and for entity-role tokens with no backing where slot. Set on a 'destination' entity-role token when the shape declares a where slot backing that axis (e.g. dev-finance)." + "description": "the graph statType, e.g. measuredValue; None when the StatVar does not assert it (custom-DC imports may omit any five-tuple arc)" }, - "role": { + "measurement_qualifier": { "anyOf": [ { - "$ref": "#/components/schemas/RoleAxis" + "$ref": "#/components/schemas/GraphRef" }, { "type": "null" } ], - "description": "origin/destination when this token renders a directional entity role (the flow's two endpoints read back), or the directional scope an unbound where slot resolved to. entity_refs is the discriminator: non-empty on the entity read-back, empty on the unbound-where-slot fallback. binding_ref is not: an entity read-back carries binding_ref too whenever the shape declares a where slot backing the 'destination' axis (e.g. dev-finance), the same condition under which the unbound-where-slot fallback always carries it, so a present binding_ref value never separates the two. Both kinds join to the Spec.resolved.entity_options entry on the same role. A third token sits on an entity_ambiguous no_data plan, which has no Spec: the ambiguous wording, with the role the request gave it (null when it gave none), no entity_refs and no binding_ref, and text equal to one NoData.ambiguous_entities[i].text on the same part, the i its entity_choice names. The client titles that wording's candidate menu by this role and posts the pick's entry of NoData.options." + "description": "structural anchor; present only when the measured property is qualified" }, - "entity_choice": { + "measurement_denominator": { "anyOf": [ { - "type": "integer", - "minimum": 0.0 + "$ref": "#/components/schemas/GraphRef" }, { "type": "null" } ], - "title": "Entity Choice", - "description": "on the slot token an entity_ambiguous no_data plan marks for an ambiguous wording, the index into NoData.ambiguous_entities of the group it asks, on the part its part_index names in an envelope plan. The NoData.options with the same entity_choice form that slot's menu. Null on every other token" + "description": "a structural anchor, present only on a ratio or per-capita measure. Holds the measurementDenominator arc's target dcid for a resolved StatVar or for a dangling target that itself carries a dcid. Is None both when no denominator arc exists at all and when the arc's target carries no dcid. A null value here does not by itself establish that no denominator arc exists. Read measurement_denominator_unresolved alongside it to tell the two apart" + }, + "measurement_denominator_unresolved": { + "type": "boolean", + "title": "Measurement Denominator Unresolved", + "description": "true when the measurementDenominator arc is present and its target is a ProvisionalNode the graph defines no real StatVar for, whether or not that target carries a dcid. False when no denominator arc exists at all, or when the arc names a confirmed StatVar. A client should read this flag before trusting measurement_denominator on its own. A null ref is consistent with either no arc (this flag false) or a dcid-less dangling target (this flag true), and a populated ref is consistent with either a confirmed StatVar (this flag false) or a dcid-bearing dangling target (this flag true)", + "default": false + }, + "slot_keys": { + "items": { + "$ref": "#/components/schemas/SlotKey" + }, + "type": "array", + "title": "Slot Keys", + "description": "the constraint and facet slots this family exposes, in display order" + }, + "member_count": { + "type": "integer", + "title": "Member Count", + "description": "the size of the resolved population behind this response: how many StatVars the shape's current bindings admit, narrowing as a slot binds and widening again as one is cleared" }, - "binding_ref": { + "member_digest": { "anyOf": [ { "type": "string" @@ -15866,73 +19526,72 @@ "type": "null" } ], - "title": "Binding Ref", - "description": "join key correlating this token to its Spec.resolved.slots / SlotOptions entry: 'axis:property_dcid', i.e. SlotKey.as_ref() (matching Slot.key and SlotOptions.key). Set for a slot-backed token, and also for a 'destination' entity-role token when the shape declares a where slot backing that axis (e.g. dev-finance) -- see entity_refs for the entity side of that token. The byline's unit token carries 'unit:', which no slot backs; its options are the resolved.alternative_measures entries with axis 'unit'. The byline's method token carries 'method:', which no slot backs either. Null or omitted for plain connective text, a shape-label fallback phrase with no backing slot, and 'origin'/unbacked-'destination' entity-role tokens." + "title": "Member Digest", + "description": "lowercase sha256 hex of the RFC 8785 (JCS) canonical JSON of the sorted list of bare dcids (no 'dcid:' prefix) of the family a Datasets mint of this Spec's definition resolves, the mint's trace.family_member_digest: every row of the family the code index resolves, or every member the mint's member walk confirms when it read every candidate. Null when Search did not settle that family for this definition, and when its walk proved the members from a window it did not read to the end, so it cannot name every member of the family" }, - "entity_refs": { - "items": { - "type": "string" - }, - "type": "array", - "title": "Entity Refs", - "description": "entity dcids this token renders, set on the entity read-back, one of the two token kinds role marks (see role's own docstring for the other, the unbound-where-slot fallback, which leaves entity_refs empty even though it too carries role) -- a directional entity read-back has no Spec.resolved.slots entry of its own, though a 'destination' token may additionally carry binding_ref when a backing where slot exists (e.g. dev-finance); one dcid per entity in the token's group, in the same order as the entities joined into this token's text -- e.g. a 'destination' token reading 'Ethiopia, Kenya, and Uganda' carries all three dcids, so a client can tell a 3-entity answer from a 1-entity one without parsing rendered text. Empty when role is unset, and this emptiness, not binding_ref, is the join rule that separates the two role-bearing kinds." + "refine_supported": { + "type": "boolean", + "title": "Refine Supported", + "description": "true unless the shape's StatVar(s) are ratio-backed (with _AsAFractionOf_ tokens), which construct-and-confirm sibling StatVars cannot refine", + "default": false }, - "states": { + "data_commons": { "items": { - "type": "string" + "$ref": "#/components/schemas/search__models__grammar__DataCommonsRef" }, "type": "array", - "title": "States", - "description": "the refs a heading or byline slot token states, so a client edits each from this token: its own binding_ref, then each binding the renderer left silent because this token's text already says it. Refs read as binding_ref does ('how:crsTypeOfFlow', 'where:', 'origin:', 'unit:'), plus 'axis:' for a measure axis no slot carries ('axis:nettingBasis'). The measure noun states the measure axes its label or authored noun carries, the how values it names, and the agreed open axes beside it; a StatVar name or graph name states the how values it folds. The byline's unit token states 'unit:' and, when it names a price basis, the measurementQualifier axis. The byline's source token states 'source:', which is also its binding_ref where the answer binds a source slot. The byline's method token states 'method:', its binding_ref, and while the identity binds no method no token states 'method:'. Empty on a token with empty text, on text tokens, and outside heading and byline slot tokens. Within one part, no ref appears on two tokens with text. A bound slot, an unbound slot with options, or a role that no token states is stated nowhere in the sentence (a boolean member, an adjectival fold dropped whole, an open role with no count), and a client offers it apart from the sentence with its current value. On the envelope plan a token with no part_index states its refs for every part it stands for" - }, - "distinguishes": { - "anyOf": [ - { - "type": "boolean" - }, - { - "type": "null" - } - ], - "title": "Distinguishes", - "description": "true when this token's text differs from the same-bucket text on another candidate in the same CandidateSet; null or omitted on every other token, including every token on a Spec rendered outside a candidate set" + "title": "Data Commons", + "description": "every Data Commons holding admitted data for a member StatVar, in the order dfo, base, un_system; a Data Commons by Google variable lists dfo as well when the Observatory's own imports hold it. Empty when the engine derived the shape without its members" }, - "part_index": { + "upstream": { "anyOf": [ { - "type": "integer" + "$ref": "#/components/schemas/ShapeUpstream" }, { "type": "null" } ], - "title": "Part Index", - "description": "this token's position in Resolution.parts, when this plan is the envelope-level composed sentence (Resolution.sentence_plan) and this token belongs to exactly one part's own contribution -- a variable phrase token, or a qualifier attached to it because it did not agree across every part, or a token of a part composed as its own sentence. Null carries four distinct readings a client must not conflate: on a part's own plan (DefinitePart.spec.resolved.sentence_plan, or the candidates/no_data/unsupported sentence_plan on _PartBase) the field has no meaning at all and is never set; on a composer-minted token, it means the token belongs to the sentence as a whole rather than to any one part (the Oxford-joined ' and '/', ', the plan's own terminal '.', the shared ' ' the per-part fallback puts between two sentences, the 'coverage' opener, and an assumptions clause's lead, separators and '.' when no one part carries every item it names are all such tokens); on a token every contributing part states alike and the join states once (a hoisted qualifier on the where, when, or source axis, each a wire value of axis, or the origin role, identified by role=='origin' instead since SentenceAxis has no 'origin' member; a shared possessive lead; the shared byline; or a heading or byline token of a part a later part folded into, binding_folded, which both parts state) it means the token no longer describes a single variable; and on an 'assumption' item it means more than one part assumed it, and each part's own assumptions list says which." + "description": "the one source and Data Commons every member's data comes through, present only for a shape outside the Observatory's own imports whose members the origin catalogue places under exactly one source" } }, "additionalProperties": false, "type": "object", "required": [ - "kind", - "text" + "shape_id", + "label", + "slot_keys", + "member_count" ], - "title": "SentenceToken", - "description": "One token in the ordered sentence plan: a \"text\" token (invariant\nwording such as a connective, a bare separator, the terminal period, or a\ndeparture sentence) or a \"slot\" token (a slot- or entity-bound phrase, or\nthe wording of an ambiguous entity).\n\n``rendered_sentence`` (the flat string) is the plain concatenation of every\ntoken's ``text``, in order. The two are computed together and cannot drift.\nA \"slot\" token with nothing bound appears too, with ``text=\"\"``: the same\ntoken structure serves a loading skeleton (before binding is known) and the\nfinal sentence (after it is). The first non-empty token's text is\ncapitalised.\n\nEvery token belongs to one ``segment``. The heading states what the answer\nis: actor, measure noun, counterpart, and period, in possessive order, one\nslot token per axis (\"Germany's gross ODA disbursements to Kenya, 1973 to\n2024\"). A unit that changes the magnitude (per capita, percent of GDP, PPP\ninternational dollars) stays in the heading. The byline follows it: the\nlatest-year label when one applies, the plain unit with its price basis\n(\"current US dollars\", \"constant 2022 US dollars\") as a slot token with\naxis \"unit\", the source, and, when the identity binds measurementMethod, the\nmethod as a slot token with axis \"method\". Departures come next, then the\nassumptions clause, and both sit only on a part's or the envelope's sentence, so\n``spec.resolved.sentence_plan`` carries neither." + "title": "Shape", + "description": "The structural family chosen for the query." }, - "Series": { + "ShapeBinding": { "properties": { - "measurement_method": { + "kind": { + "type": "string", + "const": "shape", + "title": "Kind", + "default": "shape" + }, + "measured_property": { + "type": "string", + "title": "Measured Property", + "description": "the measured property dcid" + }, + "netting_basis": { "anyOf": [ { - "$ref": "#/components/schemas/NodeRef" + "type": "string" }, { "type": "null" } ], - "description": "null when no facet states a method: no stated method" + "title": "Netting Basis", + "description": "the netting basis code dcid; None when the measure carries none" }, - "observation_period": { + "provenance": { "anyOf": [ { "type": "string" @@ -15941,20 +19600,154 @@ "type": "null" } ], - "title": "Observation Period" + "title": "Provenance", + "description": "the composite provenance the option binds as the identity's source, which serves the measure from its declared components (the OECD headline: net flows to 2017, grant equivalents from 2018); None for a measure served from one table" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "measured_property", + "netting_basis" + ], + "title": "ShapeBinding", + "description": "An option that sets the identity's measure and netting basis." + }, + "ShapeUpstream": { + "properties": { + "source": { + "$ref": "#/components/schemas/SourceRef", + "description": "the organisation behind every member's data" }, - "scaling": { + "data_commons": { + "$ref": "#/components/schemas/search__models__grammar__DataCommonsRef", + "description": "the Data Commons serving that data" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "source", + "data_commons" + ], + "title": "ShapeUpstream", + "description": "The one source, and the Data Commons serving it, behind every member of\nan upstream shape." + }, + "ShareCardBody": { + "properties": { + "component_id": { + "type": "string", + "title": "Component Id", + "description": "the card's cmp_ id" + }, + "revision": { + "type": "integer", + "minimum": 1.0, + "title": "Revision", + "description": "the card revision the slot shows" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "component_id", + "revision" + ], + "title": "ShareCardBody", + "description": "One card revision a share shows." + }, + "ShareCardModel": { + "properties": { + "component_id": { + "type": "string", + "title": "Component Id", + "description": "the card's cmp_ id" + }, + "revision": { + "type": "integer", + "title": "Revision", + "description": "the card revision the slot shows" + }, + "frame": { "anyOf": [ { - "type": "string" + "$ref": "#/components/schemas/ShareFrameModel" }, { "type": "null" } ], - "title": "Scaling" + "description": "the frame the card revision draws, null for a card that draws none or an imported slot whose frame was not recorded" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "component_id", + "revision", + "frame" + ], + "title": "ShareCardModel", + "description": "The card revision a slot shows." + }, + "ShareCardsBody": { + "properties": { + "cards": { + "items": { + "$ref": "#/components/schemas/ShareCardBody" + }, + "type": "array", + "maxItems": 24, + "title": "Cards", + "description": "the cards in slot order. Two entries may name the same revision. A card share takes at least one, a canvas any number, a search or conversation share none" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "cards" + ], + "title": "ShareCardsBody", + "description": "A replace's body: the cards the share's next revision shows, slot 1 first. The share's\nkind sets how many it takes, as on create." + }, + "ShareFrameModel": { + "properties": { + "spec_id": { + "type": "string", + "title": "Spec Id", + "description": "the frame's spec_ or ops_ id" }, - "first_year": { + "content_version": { + "type": "string", + "title": "Content Version", + "description": "the frame's cv_ or ocv_ content version" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "spec_id", + "content_version" + ], + "title": "ShareFrameModel", + "description": "The frame a slot's card revision draws." + }, + "ShareHistoryResponse": { + "properties": { + "id": { + "type": "string", + "title": "Id", + "description": "the share's id" + }, + "served": { + "items": { + "$ref": "#/components/schemas/ShareServedModel" + }, + "type": "array", + "title": "Served", + "description": "what each slot showed, newest first, an entry each time it changed, up to the page's limit" + }, + "next": { "anyOf": [ { "type": "string" @@ -15963,9 +19756,41 @@ "type": "null" } ], - "title": "First Year" + "title": "Next", + "description": "the cursor of the next page, to send as before, or null on the last page" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "id", + "served", + "next" + ], + "title": "ShareHistoryResponse", + "description": "`GET /api/presentation/shares/{share_id}/history`'s 200 body." + }, + "ShareImport": { + "properties": { + "kind": { + "type": "string", + "enum": [ + "card", + "canvas", + "search", + "conversation" + ], + "title": "Kind" }, - "last_year": { + "mode": { + "type": "string", + "enum": [ + "live", + "snapshot" + ], + "title": "Mode" + }, + "owner": { "anyOf": [ { "type": "string" @@ -15974,114 +19799,113 @@ "type": "null" } ], - "title": "Last Year" + "title": "Owner" }, - "places": { + "created_at": { + "type": "string", + "format": "date-time", + "title": "Created At" + }, + "title": { "anyOf": [ { - "type": "integer" + "type": "string" }, { "type": "null" } ], - "title": "Places", - "description": "null for a role-bearing variable" - }, - "observations": { - "type": "integer", - "title": "Observations" - }, - "units": { - "$ref": "#/components/schemas/UnitsFold" + "title": "Title" }, - "binding": { - "$ref": "#/components/schemas/Binding" - } - }, - "type": "object", - "required": [ - "measurement_method", - "observation_period", - "scaling", - "first_year", - "last_year", - "places", - "observations", - "units", - "binding" - ], - "title": "GraphAvailabilitySeries", - "description": "A source's facets sharing a measurement method, period and scaling." - }, - "SeriesAxisRef": { - "properties": { - "property": { - "type": "string", - "title": "Property", - "description": "the constraint property's dcid, e.g. 'crsPurpose'" + "slots": { + "items": { + "$ref": "#/components/schemas/_ExportSlot" + }, + "type": "array", + "title": "Slots" }, - "ref": { - "type": "string", - "title": "Ref", - "description": "the dcid of the value the StatVar holds on property" + "payload": { + "$ref": "#/components/schemas/JsonValue" }, - "label": { - "type": "string", - "title": "Label", - "description": "display label for ref: its graph label, else the dcid's tail split into lower-case words" + "write_token_sha256": { + "anyOf": [ + { + "type": "string", + "pattern": "^[0-9a-f]{64}$" + }, + { + "type": "null" + } + ], + "title": "Write Token Sha256", + "description": "the lowercase hex SHA-256 of the share's shw_ write token, null for a guest's share. A digest needs an owner" } }, "additionalProperties": false, "type": "object", "required": [ - "property", - "ref", - "label" + "kind", + "mode", + "owner", + "created_at", + "title", + "slots", + "payload", + "write_token_sha256" ], - "title": "SeriesAxisRef", - "description": "One constraint of a series' StatVar (see ObservationSeries.axes)." + "title": "ShareImport", + "description": "One website share as its export line states it, less the id, with the digest of the\nwrite token the website holds for it." }, - "SeriesConversionFallbackExample": { + "ShareImportResponse": { "properties": { - "entity": { + "id": { "type": "string", - "title": "Entity", - "description": "the entity dcid absent from the deflator table" + "title": "Id", + "description": "the share's id, 8 letters and digits, as the path names it" }, - "fallback_entity": { - "type": "string", - "title": "Fallback Entity", - "description": "the recipe's fallback entity substituted for it" + "imported": { + "type": "boolean", + "title": "Imported", + "description": "true when this call stored the share, false when an earlier import had" } }, "additionalProperties": false, "type": "object", "required": [ - "entity", - "fallback_entity" + "id", + "imported" ], - "title": "SeriesConversionFallbackExample", - "description": "One entity a converted series' recipe substituted with its own\nfallback entity, because the substituted entity carried no row at all\nin the deflator table (see ObservationSeriesConversion.fallback_examples)." + "title": "ShareImportResponse", + "description": "`PUT /api/presentation/shares/{share_id}/import`'s 201 and 200 body." }, - "SeriesEntityRef": { + "ShareReadResponse": { "properties": { - "role": { + "id": { + "type": "string", + "title": "Id", + "description": "the share's id, 8 letters and digits" + }, + "kind": { "type": "string", "enum": [ - "observationAbout", - "origin", - "destination" + "card", + "canvas", + "search", + "conversation" ], - "title": "Role", - "description": "observationAbout, origin, or destination" + "title": "Kind", + "description": "what the share publishes" }, - "ref": { + "mode": { "type": "string", - "title": "Ref", - "description": "the entity's dcid" + "enum": [ + "live", + "snapshot" + ], + "title": "Mode", + "description": "live follows new data, snapshot keeps the versions its cards drew when it was made" }, - "label": { + "title": { "anyOf": [ { "type": "string" @@ -16090,44 +19914,55 @@ "type": "null" } ], - "title": "Label", - "description": "best-effort display label for ref; None when unresolved, never fabricated" + "title": "Title", + "description": "the share's title, null when it has none" }, - "party_kind": { - "anyOf": [ - { - "type": "string", - "enum": [ - "party", - "total", - "residual" - ] - }, - { - "type": "null" - } - ], - "title": "Party Kind", - "description": "on an origin or destination entity, what the party is beside the others on its side: 'party' (a country, territory or organisation), 'total' (other parties' figures, so a sum across the role that counts it counts its members twice) or 'residual' (figures no other party holds), as the code index lists it. Absent for a party the index does not list, and on observationAbout" + "revision": { + "type": "integer", + "title": "Revision", + "description": "the share's latest revision" + }, + "slots": { + "items": { + "$ref": "#/components/schemas/ShareSlotModel" + }, + "type": "array", + "title": "Slots", + "description": "every slot the share has had, in order. Search and conversation shares have none" + }, + "payload": { + "title": "Payload", + "description": "website-owned JSON stored with the share as given, null when there is none" + }, + "created_at": { + "type": "string", + "title": "Created At", + "description": "when the share was made, as an ISO 8601 timestamp" } }, "additionalProperties": false, "type": "object", "required": [ - "role", - "ref" + "id", + "kind", + "mode", + "title", + "revision", + "slots", + "payload", + "created_at" ], - "title": "SeriesEntityRef", - "description": "One entity in a series' role tuple (see ObservationSeries.entities)." + "title": "ShareReadResponse", + "description": "`GET /api/presentation/shares/{share_id}`'s 200 body. It omits the write token." }, - "SeriesFacetRef": { + "ShareRetentionModel": { "properties": { - "ref": { - "type": "string", - "title": "Ref", - "description": "the facet's dcid for this axis" + "pinned": { + "type": "boolean", + "title": "Pinned", + "description": "whether the frame is in the pinned tier, with no expiry" }, - "label": { + "held_until": { "anyOf": [ { "type": "string" @@ -16136,285 +19971,412 @@ "type": "null" } ], - "title": "Label", - "description": "best-effort display label for ref; None when unresolved, never fabricated" + "title": "Held Until", + "description": "when a working-tier frame stops being guaranteed, 30 days after DFO stored it, and absent when pinned" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "pinned" + ], + "title": "ShareRetentionModel", + "description": "How long a served frame can still be fetched." + }, + "ShareServedModel": { + "properties": { + "slot": { + "type": "integer", + "title": "Slot", + "description": "the slot, from 1" }, - "source": { + "component_id": { "anyOf": [ { - "$ref": "#/components/schemas/SourceRef" + "type": "string" }, { "type": "null" } ], - "description": "provenance axis only: the organisation behind the provenance, from the origin catalogue; absent for a provenance the catalogue does not list" + "title": "Component Id", + "description": "the card the slot showed, null when a replace left the slot empty" }, - "data_commons": { + "revision": { "anyOf": [ { - "$ref": "#/components/schemas/search__models__grammar__DataCommonsRef" + "type": "integer" }, { "type": "null" } ], - "description": "provenance axis only: the Data Commons the provenance's data comes from; absent for a provenance the catalogue does not list" + "title": "Revision", + "description": "the card revision the slot showed, null when the slot was empty" }, - "documentation": { + "frame": { "anyOf": [ { - "type": "string" + "$ref": "#/components/schemas/ShareFrameModel" }, { "type": "null" } ], - "title": "Documentation", - "description": "provenance axis only: the Graph API route of the provenance's document, GET /api/graph/documentation/{dcid}" - } - }, - "additionalProperties": false, - "type": "object", - "required": [ - "ref" - ], - "title": "SeriesFacetRef", - "description": "One axis's value on a single series' selected observation facet (see\nObservationSeries.facet)." - }, - "SeriesStatVarRef": { - "properties": { - "ref": { - "type": "string", - "title": "Ref", - "description": "the StatVar dcid these points observe" + "description": "the frame served, null when the slot was empty" }, - "label": { + "rendering": { "anyOf": [ { - "type": "string" + "additionalProperties": true, + "type": "object" }, { "type": "null" } ], - "title": "Label", - "description": "a row's own distinguishing label: composed from ref's own constraint values when it has any beyond its shape's shared five-tuple, else ref's plain resolved display name; None when unresolved, never fabricated" - } - }, - "additionalProperties": false, - "type": "object", - "required": [ - "ref" - ], - "title": "SeriesStatVarRef", - "description": "A series' StatVar identity ({ref, label} -- mirrors SeriesFacetRef's shape)." - }, - "ServedMember": { - "properties": { - "ref": { + "title": "Rendering", + "description": "the rendering the card revision recorded for its frame, null when unrecorded or when the slot was empty" + }, + "first_served_at": { "type": "string", - "pattern": "^dcid:", - "title": "Ref" + "title": "First Served At", + "description": "when the slot began to show this, ISO 8601: the write or the first read that served it" }, - "label": { + "retention": { "anyOf": [ { - "type": "string" + "$ref": "#/components/schemas/ShareRetentionModel" }, { "type": "null" } ], - "title": "Label" - }, - "roles": { - "items": { - "type": "string" - }, - "type": "array", - "title": "Roles" + "description": "the frame's retention, null when DFO holds no record of it or the slot was empty" }, - "constraints": { - "additionalProperties": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "type": "object", - "title": "Constraints" + "fetchable": { + "type": "boolean", + "title": "Fetchable", + "description": "whether the frame's retention still holds, false when the slot was empty" } }, "additionalProperties": false, "type": "object", "required": [ - "ref", - "label", - "roles", - "constraints" + "slot", + "component_id", + "revision", + "frame", + "rendering", + "first_served_at", + "retention", + "fetchable" ], - "title": "ServedMember", - "description": "One StatVar a definition serves: its `dcid:`-prefixed `ref`, as the manifest trace's\n`resolved_stat_vars` names it, its graph `label` (`null` when the graph holds none), the\n`roles` it declares, and its `constraints`, each constraint property with its value\n(`null` when the StatVar leaves it unbound)." + "title": "ShareServedModel", + "description": "One entry of what a share's slot showed: a frame it served, or no card." }, - "Shape": { + "ShareSlotCardResponse": { "properties": { - "shape_id": { + "component_id": { "type": "string", - "title": "Shape Id", - "description": "stable id of this structural family" + "title": "Component Id", + "description": "the read component's own id" }, - "label": { + "revision": { + "type": "integer", + "title": "Revision", + "description": "the revision this read reports" + }, + "catalog_version": { "type": "string", - "title": "Label", - "description": "plain-language name of what the reading serves: a composed measure label, the served series' name, or the family's name" + "title": "Catalog Version", + "description": "the catalogue release this revision minted under" }, - "population_type": { + "composition_id": { "anyOf": [ { - "$ref": "#/components/schemas/GraphRef" + "type": "string" }, { "type": "null" } ], - "description": "the graph populationType; None when the StatVar does not assert it (custom-DC imports may omit any five-tuple arc)" + "title": "Composition Id", + "description": "the composition this component belongs to, null outside one" }, - "measured_property": { + "composition_revision": { "anyOf": [ { - "$ref": "#/components/schemas/GraphRef" + "type": "integer" }, { "type": "null" } ], - "description": "the graph measuredProperty; None when the StatVar does not assert it (custom-DC imports may omit any five-tuple arc)" + "title": "Composition Revision", + "description": "the composition's current head revision, null outside one" + }, + "stored_intent": { + "additionalProperties": true, + "type": "object", + "title": "Stored Intent", + "description": "this revision's own stored intent, exactly as minted" + }, + "fact_summary": { + "$ref": "#/components/schemas/FactSummaryModel", + "description": "the closed, token-capped fact summary this revision reports" + }, + "resolved_payload": { + "additionalProperties": true, + "type": "object", + "title": "Resolved Payload", + "description": "the revision's stored resolved payload, verbatim: the catalogue envelope {schema_version, catalog_version, component_id, revision, provenance, component}, validated against the catalogue release's envelope schema (dfo-spec-kit envelope.schema.json) when minted. GET /api/presentation/release serves the pinned release's envelope_schema and the component_schemas its component field $refs by $id; every payload this door serves carries that pinned catalog_version." }, - "stat_type": { + "retention": { "anyOf": [ { - "$ref": "#/components/schemas/GraphRef" + "$ref": "#/components/schemas/RetentionModel" }, { "type": "null" } ], - "description": "the graph statType, e.g. measuredValue; None when the StatVar does not assert it (custom-DC imports may omit any five-tuple arc)" + "description": "how long the frame the card is drawn on can still be fetched, counted from when DFO stored it. Null for a card that draws no frame, or one whose frame DFO holds no version record of" }, - "measurement_qualifier": { - "anyOf": [ - { - "$ref": "#/components/schemas/GraphRef" - }, - { - "type": "null" - } + "freshness": { + "type": "string", + "enum": [ + "current", + "stale", + "pending" ], - "description": "structural anchor; present only when the measured property is qualified" + "title": "Freshness", + "description": "as the slot's data route states it: current, the newest data DFO found at its last check or a snapshot's own frame; pending, newer data is building and the card is drawn on the last check's frame; stale, DFO could not check, or the card cannot be drawn on the newer data, and the card is drawn on an older frame" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "component_id", + "revision", + "catalog_version", + "composition_id", + "composition_revision", + "stored_intent", + "fact_summary", + "resolved_payload", + "freshness" + ], + "title": "ShareSlotCardResponse", + "description": "`GET /api/presentation/shares/{share_id}/slots/{slot}`'s body: the slot's card as a\ncomponent read states it, drawn on the frame the slot serves." + }, + "ShareSlotDataResponse": { + "properties": { + "share_id": { + "type": "string", + "title": "Share Id", + "description": "the share's id" }, - "measurement_denominator": { - "anyOf": [ - { - "$ref": "#/components/schemas/GraphRef" - }, - { - "type": "null" - } + "slot": { + "type": "integer", + "title": "Slot", + "description": "the slot's number, from 1" + }, + "mode": { + "type": "string", + "enum": [ + "live", + "snapshot" ], - "description": "a structural anchor, present only on a ratio or per-capita measure. Holds the measurementDenominator arc's target dcid for a resolved StatVar or for a dangling target that itself carries a dcid. Is None both when no denominator arc exists at all and when the arc's target carries no dcid. A null value here does not by itself establish that no denominator arc exists. Read measurement_denominator_unresolved alongside it to tell the two apart" + "title": "Mode", + "description": "the share's mode" }, - "measurement_denominator_unresolved": { - "type": "boolean", - "title": "Measurement Denominator Unresolved", - "description": "true when the measurementDenominator arc is present and its target is a ProvisionalNode the graph defines no real StatVar for, whether or not that target carries a dcid. False when no denominator arc exists at all, or when the arc names a confirmed StatVar. A client should read this flag before trusting measurement_denominator on its own. A null ref is consistent with either no arc (this flag false) or a dcid-less dangling target (this flag true), and a populated ref is consistent with either a confirmed StatVar (this flag false) or a dcid-bearing dangling target (this flag true)", - "default": false + "freshness": { + "type": "string", + "enum": [ + "current", + "stale", + "pending" + ], + "title": "Freshness", + "description": "current: the newest data DFO found at its last check, at most 15 minutes ago, or a snapshot's own rows; pending: newer data is building and these rows are the last check's; stale: DFO could not check, or the card cannot be drawn on the newer data, and these rows are older" }, - "slot_keys": { + "component_id": { + "type": "string", + "title": "Component Id", + "description": "the card the slot shows" + }, + "revision": { + "type": "integer", + "title": "Revision", + "description": "the card revision the slot shows" + }, + "frame": { + "$ref": "#/components/schemas/ShareFrameModel", + "description": "the frame these rows come from" + }, + "rows": { "items": { - "$ref": "#/components/schemas/SlotKey" + "additionalProperties": true, + "type": "object" }, "type": "array", - "title": "Slot Keys", - "description": "the constraint and facet slots this family exposes, in display order" - }, - "member_count": { + "title": "Rows", + "description": "the rows behind every value the card shows, one object per row, keyed by the columns of the card's data file" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "share_id", + "slot", + "mode", + "freshness", + "component_id", + "revision", + "frame", + "rows" + ], + "title": "ShareSlotDataResponse", + "description": "`GET /api/presentation/shares/{share_id}/slots/{slot}/data`'s JSON body." + }, + "ShareSlotModel": { + "properties": { + "slot": { "type": "integer", - "title": "Member Count", - "description": "the size of the resolved population behind this response: how many StatVars the shape's current bindings admit, narrowing as a slot binds and widening again as one is cleared" + "title": "Slot", + "description": "the slot's number, from 1" }, - "member_digest": { + "card": { "anyOf": [ { - "type": "string" + "$ref": "#/components/schemas/ShareCardModel" }, { "type": "null" } ], - "title": "Member Digest", - "description": "lowercase sha256 hex of the RFC 8785 (JCS) canonical JSON of the sorted list of bare dcids (no 'dcid:' prefix) of the family a Datasets mint of this Spec's definition resolves, the mint's trace.family_member_digest: every row of the family the code index resolves, or every member the mint's member walk confirms when it read every candidate. Null when Search did not settle that family for this definition, and when its walk proved the members from a window it did not read to the end, so it cannot name every member of the family" + "description": "the card the slot shows, null for a slot a replacement with fewer cards left empty" }, - "refine_supported": { - "type": "boolean", - "title": "Refine Supported", - "description": "true unless the shape's StatVar(s) are ratio-backed (with _AsAFractionOf_ tokens), which construct-and-confirm sibling StatVars cannot refine", - "default": false + "data_url": { + "type": "string", + "title": "Data Url", + "description": "the slot's JSON data URL" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "slot", + "card", + "data_url" + ], + "title": "ShareSlotModel", + "description": "One numbered slot of a share." + }, + "ShareWriteResponse": { + "properties": { + "id": { + "type": "string", + "title": "Id", + "description": "the share's id, 8 letters and digits" }, - "data_commons": { + "url": { + "type": "string", + "title": "Url", + "description": "the share's page on the public website, /s/" + }, + "embed_url": { + "type": "string", + "title": "Embed Url", + "description": "the share's embeddable page, /embed/" + }, + "data_urls": { "items": { - "$ref": "#/components/schemas/search__models__grammar__DataCommonsRef" + "type": "string" }, "type": "array", - "title": "Data Commons", - "description": "every Data Commons holding admitted data for a member StatVar, in the order dfo, base, un_system; a Data Commons by Google variable lists dfo as well when the Observatory's own imports hold it. Empty when the engine derived the shape without its members" + "title": "Data Urls", + "description": "one JSON data URL per slot, in slot order. A slot keeps its URL across replacements, so data_urls[0] always reads the share's first slot" }, - "upstream": { - "anyOf": [ - { - "$ref": "#/components/schemas/ShapeUpstream" - }, - { - "type": "null" - } - ], - "description": "the one source and Data Commons every member's data comes through, present only for a shape outside the Observatory's own imports whose members the origin catalogue places under exactly one source" + "revision": { + "type": "integer", + "title": "Revision", + "description": "the share revision this write made, 1 on a create" + }, + "latest": { + "type": "boolean", + "title": "Latest", + "description": "true for a live share, which follows new data, false for a snapshot, which keeps the versions its cards drew when it was made" } }, "additionalProperties": false, "type": "object", "required": [ - "shape_id", - "label", - "slot_keys", - "member_count" + "id", + "url", + "embed_url", + "data_urls", + "revision", + "latest" ], - "title": "Shape", - "description": "The structural family chosen for the query." + "title": "ShareWriteResponse", + "description": "`PUT /api/presentation/shares/{share_id}`'s 200 body: where the replaced share lives." }, - "ShapeUpstream": { + "SharedResponse": { "properties": { - "source": { - "$ref": "#/components/schemas/SourceRef", - "description": "the organisation behind every member's data" + "id": { + "type": "string", + "title": "Id", + "description": "the share's id, 8 letters and digits" }, - "data_commons": { - "$ref": "#/components/schemas/search__models__grammar__DataCommonsRef", - "description": "the Data Commons serving that data" + "url": { + "type": "string", + "title": "Url", + "description": "the share's page on the public website, /s/" + }, + "embed_url": { + "type": "string", + "title": "Embed Url", + "description": "the share's embeddable page, /embed/" + }, + "data_urls": { + "items": { + "type": "string" + }, + "type": "array", + "title": "Data Urls", + "description": "one JSON data URL per slot, in slot order. A slot keeps its URL across replacements, so data_urls[0] always reads the share's first slot" + }, + "revision": { + "type": "integer", + "title": "Revision", + "description": "the share revision this write made, 1 on a create" + }, + "latest": { + "type": "boolean", + "title": "Latest", + "description": "true for a live share, which follows new data, false for a snapshot, which keeps the versions its cards drew when it was made" + }, + "write_token": { + "type": "string", + "title": "Write Token", + "description": "the shw_ token that grants replacing and deleting this share, sent back as the x-dfo-write-token header. It appears only in this reply, so keep it secret" } }, "additionalProperties": false, "type": "object", "required": [ - "source", - "data_commons" + "id", + "url", + "embed_url", + "data_urls", + "revision", + "latest", + "write_token" ], - "title": "ShapeUpstream", - "description": "The one source, and the Data Commons serving it, behind every member of\nan upstream shape." + "title": "SharedResponse", + "description": "`POST /api/presentation/shares`'s 201 body." }, "SimpleUnit": { "properties": { @@ -16550,6 +20512,79 @@ "title": "Slot", "description": "One slot in the chosen shape, with its current binding state." }, + "SlotBinding": { + "properties": { + "kind": { + "type": "string", + "const": "slot", + "title": "Kind", + "default": "slot" + }, + "slot": { + "type": "string", + "title": "Slot", + "description": "the slot's constraint property dcid" + }, + "state": { + "type": "string", + "enum": [ + "value", + "set" + ], + "title": "State", + "description": "one code, or a set of codes" + }, + "refs": { + "items": { + "type": "string" + }, + "type": "array", + "minItems": 1, + "title": "Refs", + "description": "the bound code dcids, sorted" + }, + "window": { + "anyOf": [ + { + "prefixItems": [ + { + "type": "integer" + }, + { + "type": "integer" + } + ], + "type": "array", + "maxItems": 2, + "minItems": 2 + }, + { + "type": "null" + } + ], + "title": "Window", + "description": "the years the option sets as the requested window, first and last: on a published donor total over a range or every year, the latest run of years every donor holds the other total in, when they hold fewer than the part asks for; on one asking for the latest year, the one year the pool's read of the other total elects, whether or not it is the part's own; None when the option keeps the part's window" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "slot", + "state", + "refs" + ], + "title": "SlotBinding", + "description": "An option that binds one what/how slot of the identity." + }, + "SlotFormat": { + "type": "string", + "enum": [ + "json", + "csv", + "xlsx", + "parquet" + ] + }, "SlotKey": { "properties": { "axis": { @@ -17809,12 +21844,31 @@ "additionalProperties": false, "type": "object", "required": [ - "series", - "total_obs", - "truncated" + "series", + "total_obs", + "truncated" + ], + "title": "SpecObservations", + "description": "The observation values behind a Spec's coverage.\n\nAn opt-in bounded preview, or the full series when the resolved answer is\nsmall enough to ship in full -- see truncated. Describes the SAME (stat_var,\nentity) selection Spec.resolved.coverage already reports, so the numbers here never\ndescribe a different variable than what coverage summarises.\n\nEach series carries one lead observation facet's points, never a union\nacross facets: a StatVar/entity pair can have several reporting facets\n(e.g. commitments vs disbursements, current vs constant prices), and\nmerging their points chronologically would interleave same-dated points\nfrom incompatible series into one meaningless line. The one exception is\nthe same source's estimates continuing the lead past its last period: the\nseries carries their points after the lead's, `facet` names the lead, and\nthe `modelled_values` departure marks the estimates. One facet group is\nselected per StatVar instead, across every place and role tuple the answer\nnames: among facets holding a point in the requested years (all facets when\nnone does), DFO's facets first for a variable both DFO and base Data\nCommons hold, then the one covering the most places or role tuples there,\nthen the most requested years, then the most observations, then the latest\nobservation, then a deterministic tie-break." + }, + "SpecRoot": { + "properties": { + "spec_id": { + "type": "string", + "pattern": "^spec_[0-9a-f]{32}$", + "title": "Spec Id" + }, + "rendering": { + "$ref": "#/components/schemas/RootRendering" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "spec_id" ], - "title": "SpecObservations", - "description": "The observation values behind a Spec's coverage.\n\nAn opt-in bounded preview, or the full series when the resolved answer is\nsmall enough to ship in full -- see truncated. Describes the SAME (stat_var,\nentity) selection Spec.resolved.coverage already reports, so the numbers here never\ndescribe a different variable than what coverage summarises.\n\nEach series carries one lead observation facet's points, never a union\nacross facets: a StatVar/entity pair can have several reporting facets\n(e.g. commitments vs disbursements, current vs constant prices), and\nmerging their points chronologically would interleave same-dated points\nfrom incompatible series into one meaningless line. The one exception is\nthe same source's estimates continuing the lead past its last period: the\nseries carries their points after the lead's, `facet` names the lead, and\nthe `modelled_values` departure marks the estimates. One facet group is\nselected per StatVar instead, across every place and role tuple the answer\nnames: among facets holding a point in the requested years (all facets when\nnone does), DFO's facets first for a variable both DFO and base Data\nCommons hold, then the one covering the most places or role tuples there,\nthen the most requested years, then the most observations, then the latest\nobservation, then a deterministic tie-break." + "title": "SpecRoot", + "description": "A Spec, read at its dataset's newest version." }, "StatVarBlock": { "properties": { @@ -18158,6 +22212,88 @@ "title": "Step", "description": "One operation: its inputs by role, its one fixed policy, the caller's own choices,\nwhat it kept, what data gaps it left out, the unit it produces, and, for an operation\nthat writes a new variable (sum, quotient, share, comparison), that variable's bare dcid in\n`stat_var`.\n\nA step takes either `input` or `inputs`, or neither, never both. `stat_var` is the bare\ndcid of the variable a step that makes a new one (a sum, quotient, share or comparison)\nwrites its rows under. `sides` holds, by input role, each role column whose slice of that\ninput holds one entity, with that entity's ref. A comparison records it." }, + "StepInputs": { + "properties": { + "data": { + "oneOf": [ + { + "$ref": "#/components/schemas/StepNode" + }, + { + "$ref": "#/components/schemas/RefRoot" + }, + { + "$ref": "#/components/schemas/DerivedRoot" + }, + { + "$ref": "#/components/schemas/DatasetRoot" + }, + { + "$ref": "#/components/schemas/SpecRoot" + } + ], + "title": "Data" + }, + "other": { + "anyOf": [ + { + "oneOf": [ + { + "$ref": "#/components/schemas/StepNode" + }, + { + "$ref": "#/components/schemas/RefRoot" + }, + { + "$ref": "#/components/schemas/DerivedRoot" + }, + { + "$ref": "#/components/schemas/DatasetRoot" + }, + { + "$ref": "#/components/schemas/SpecRoot" + } + ] + }, + { + "type": "null" + } + ], + "title": "Other" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "data" + ], + "title": "StepInputs" + }, + "StepNode": { + "properties": { + "verb": { + "$ref": "#/components/schemas/Verb" + }, + "arguments": { + "additionalProperties": { + "$ref": "#/components/schemas/JsonValue" + }, + "type": "object", + "title": "Arguments" + }, + "inputs": { + "$ref": "#/components/schemas/StepInputs" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "verb", + "inputs" + ], + "title": "StepNode", + "description": "One verb over its inputs. `arguments` are the verb's op-spec parameters in the caller's\nvocabulary (see the module docstring)." + }, "StepRef": { "properties": { "ref": { @@ -18317,6 +22453,44 @@ "title": "Summed", "description": "A sum at mint: how many variables were summed, and up to 64 of them." }, + "TextOrigin": { + "properties": { + "kind": { + "type": "string", + "const": "text", + "title": "Kind", + "default": "text" + }, + "text": { + "type": "string", + "maxLength": 256, + "minLength": 1, + "title": "Text", + "description": "the words, as written" + }, + "start": { + "type": "integer", + "minimum": 0.0, + "title": "Start", + "description": "the offset of the first character in the text read" + }, + "end": { + "type": "integer", + "minimum": 0.0, + "title": "End", + "description": "the offset past the last character in the text read" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "text", + "start", + "end" + ], + "title": "TextOrigin", + "description": "The words an explicit entry was read from, and where they lie in the text the part's\nscope was read from: the user's message on a request of one part, or the part's own\nvariable text on a request of several, with its whitespace collapsed. Words that text\ndoes not hold have an empty span at its start." + }, "TimeWindow": { "properties": { "start_year": { @@ -18429,6 +22603,22 @@ "title": "TraceDefaultReading", "description": "The default price-basis reading applied before bind. Price bases rank Nominal,\nRealValue, InflationAdjusted, then PurchasingPowerParity, with any basis the query names\nmoved first. A StatVar leaves the menu when a StatVar of a better-ranked basis with the\nsame constraints holds data wherever it does over the requested years. The trace records\nwhether the step ran and the StatVars it removed." }, + "TraceModel": { + "properties": { + "party_totals_left_out": { + "items": { + "$ref": "#/components/schemas/PartyTotalsLeftOutModel" + }, + "type": "array", + "title": "Party Totals Left Out", + "description": "the parties whose total rows a without_party_totals rendering left out of this version's frame: one entry per open party role and provenance that lost rows, in role order and then provenance order (null first). Absent when the rendering left nothing out or was not asked to" + } + }, + "additionalProperties": true, + "type": "object", + "title": "TraceModel", + "description": "A manifest's `trace` (`materialise.trace.ManifestTrace.to_dict()`, plus the keys each\ndoor attaches). It types `party_totals_left_out` and keeps every other key open." + }, "TransformationLogEntry": { "properties": { "transformation": { @@ -19048,7 +23238,7 @@ }, "type": "array", "title": "Departures", - "description": "every way this part's answer differs from what its request asked, ordered by how much each changes the number: closest_match, measure_not_applied, operation_not_applied, breakdown_not_applied, entity_unavailable, year_unavailable, modelled_values, group_read_as_members, whole_total_read, whole_total_unpublished, direction_discarded, direction_inferred, scope_limited. [] when the answer is what was asked. A client that renders its own sentence reads them here; each one's text also closes the sentence that carries this part (see Departure.text). A warning on the same part reports run health and stays separate" + "description": "every way this part's answer differs from what its request asked, ordered by how much each changes the number: closest_match, measure_not_applied, operation_not_applied, breakdown_not_applied, entity_unavailable, member_unavailable, year_unavailable, modelled_values, group_read_as_members, whole_total_read, whole_total_unpublished, direction_discarded, direction_inferred, scope_limited. [] when the answer is what was asked. A client that renders its own sentence reads them here; each one's text also closes the sentence that carries this part (see Departure.text). A warning on the same part reports run health and stays separate" }, "assumptions": { "items": { @@ -19289,6 +23479,22 @@ ], "title": "VaryingColumnModel" }, + "Verb": { + "type": "string", + "enum": [ + "aggregate", + "compare", + "growth", + "rank", + "share_of", + "join", + "filter", + "sum_of", + "quotient_of" + ], + "title": "Verb", + "description": "The closed verb set of nine. No synonym, no free-text escape hatch." + }, "VersionHistoryEntry": { "properties": { "date": { @@ -19412,7 +23618,7 @@ } ], "title": "Params", - "description": "the counts and labels the message states, for a client to compose its own text. observations_series_truncated: {shown, total, order}, the series shown, the confirmed series behind them, and how the shown series were chosen: 'ranked' (the most recent and largest) or 'fixed' (a selection made before values were read, not ranked by value). elected_shape_no_data: {no_data, elected}, the labels of the readings with no data and of the readings answered instead. un_system_unavailable: {places, variables, variable_labels}, the place dcids the UN front door refused, the variables of the UN reads that failed, each empty when none, and each variable's graph name, in variables order, '' where the graph holds none; a warning without params says the UN search itself was unavailable. whole_total_available: {total, total_label, whole_of}, the dcid and label of the total the source publishes for the side the answer lists member by member, and the classes of party it covers, comma-joined (official, private, residual). currency_unmapped_omitted: {count, entities, entity_labels}, how many entities the conversion left out, the dcids of the first ten, sorted, and each one's name, in entities order, '' where the conversion tables hold none, which is usual here, since an entity no currency names, such as a regional aggregate, is rarely in those tables; its dcid stays in entities. deflator_missing_omitted: the same with entity_years, the years each entity's rows were left out, as runs of consecutive years ('1990-2001, 2004'), in entities order; a warning without params says the loaded tables cannot tell which entities. Omitted for every other code" + "description": "the counts and labels the message states, for a client to compose its own text. observations_series_truncated: {shown, total, order}, the series shown, the confirmed series behind them, and how the shown series were chosen: 'ranked' (the most recent and largest) or 'fixed' (a selection made before values were read, not ranked by value). elected_shape_no_data: {no_data, elected}, the labels of the readings with no data and of the readings answered instead. un_system_unavailable: {places, variables, variable_labels}, the place dcids the UN front door refused, the variables of the UN reads that failed, each empty when none, and each variable's graph name, in variables order, '' where the graph holds none; a warning without params says the UN search itself was unavailable. whole_total_available: {total, total_label, whole_of}, the dcid and label of the total the source publishes for the side the answer lists member by member, and the classes of party it covers, comma-joined (official, private, residual). currency_unmapped_omitted: {count, entities, entity_labels}, how many entities the conversion left out, the dcids of the first ten, sorted, and each one's name, in entities order, '' where the conversion tables hold none, which is usual here, since an entity no currency names, such as a regional aggregate, is rarely in those tables; its dcid stays in entities. deflator_missing_omitted: the same with entity_years, the years each entity's rows were left out, as runs of consecutive years ('1990-2001, 2004'), in entities order; a warning without params says the loaded tables cannot tell which entities. deflator_projected: {count, examples}, how many rows took a projected rate or deflator, and at most ten distinct entity@year keys among them, sorted; count counts rows, not keys, and examples may leave keys out. Omitted for every other code" } }, "additionalProperties": false, @@ -19423,7 +23629,7 @@ "message" ], "title": "Warning", - "description": "A run-health signal. Note: this name shadows the Python builtin Warning.\n\nOnly `observations_series_truncated`, `elected_shape_no_data`, `un_system_unavailable`,\n`whole_total_available`, `currency_unmapped_omitted` and `deflator_missing_omitted` set\n`params`. A `None` `params` is left out of every dump, so other codes' warnings stay\nexactly `{code, severity, message}` plus `spec_id` where one applies." + "description": "A run-health signal. Note: this name shadows the Python builtin Warning.\n\nOnly `observations_series_truncated`, `elected_shape_no_data`, `un_system_unavailable`,\n`whole_total_available`, `currency_unmapped_omitted`, `deflator_missing_omitted` and\n`deflator_projected` set `params`. A `None` `params` is left out of every dump, so other codes' warnings stay\nexactly `{code, severity, message}` plus `spec_id` where one applies." }, "WarningModel": { "properties": { @@ -19509,6 +23715,17 @@ ], "description": "coverage_below_scope only: the group members holding no observation in the requested years; absent when there are none, and when the served provenance reads an absent member as zero" }, + "unserved_members": { + "anyOf": [ + { + "$ref": "#/components/schemas/CountedRefsModel" + }, + { + "type": "null" + } + ], + "description": "coverage_below_scope only: the group members holding no observation under the source, unit and method the group serves, which the figures leave out; absent when there are none" + }, "unserved_entities": { "anyOf": [ { @@ -19518,7 +23735,7 @@ "type": "null" } ], - "description": "coverage_below_scope only: the entities the request binds that served no observation, sorted; absent when there are none" + "description": "coverage_below_scope: the entities the request binds that served no observation, sorted; withheld_by_registry: the places among them at which the registry withholds data, in the order the request names them; un_system_unavailable: the places the UN System Data Commons could not serve, in the order its reads recorded them; absent when there are none" }, "requested_years": { "anyOf": [ @@ -19542,6 +23759,28 @@ ], "description": "coverage_below_scope only: the years the data covers, both bounds set, beside requested_years; absent otherwise" }, + "withheld_members": { + "anyOf": [ + { + "$ref": "#/components/schemas/CountedRefsModel" + }, + { + "type": "null" + } + ], + "description": "withheld_by_registry only: the series the finding read, that of the first request that left a subject entity without rows, so one; absent when there are none or the stored warning does not carry them" + }, + "withheld_provenances": { + "anyOf": [ + { + "$ref": "#/components/schemas/CountedRefsModel" + }, + { + "type": "null" + } + ], + "description": "withheld_by_registry only: the provenances the registry withholds that hold data for that series at those places, in the order they first occur across the places; absent when there are none or the stored warning does not carry them" + }, "omitted_entities": { "anyOf": [ { @@ -19573,7 +23812,7 @@ "message" ], "title": "WarningModel", - "description": "One manifest warning. Only `stat_vars_summed` sets its three structured fields, a\ngroup's `coverage_below_scope` its three member fields, `coverage_below_scope`\n`unserved_entities`, `requested_years` and `served_years`, `currency_unmapped_omitted`\n`omitted_entities`, and\n`deflator_missing_omitted` `omitted_entity_years`. A `None` field is left out of every dump, so other codes' warnings, on\nthe wire and in stored version bodies, stay exactly `{code, severity, message}`." + "description": "One manifest warning. Only `stat_vars_summed` sets its three structured fields, a\ngroup's `coverage_below_scope` its four member fields, `coverage_below_scope`\n`unserved_entities`, `requested_years` and `served_years`, `currency_unmapped_omitted`\n`omitted_entities`, `deflator_missing_omitted` `omitted_entity_years`, and\n`withheld_by_registry` `unserved_entities`, `withheld_members` and `withheld_provenances`, and\n`un_system_unavailable` `unserved_entities`. A stored warning can lack a field its code carries: a `withheld_by_registry` warning can\nwithhold with none of its three. A `None` field is left out of every dump, so other codes'\nwarnings, on the wire and in stored version bodies, stay exactly `{code, severity,\nmessage}`." }, "WindowAll": { "properties": { @@ -19812,6 +24051,161 @@ "title": "YearRangeModel", "description": "A run of years, both bounds included (`materialise.codes.YearRange`)." }, + "_ContentVersion": { + "type": "string", + "minLength": 1 + }, + "_ExportFrame": { + "properties": { + "spec_id": { + "type": "string", + "pattern": "^(spec|ops)_[A-Za-z0-9]+$", + "title": "Spec Id" + }, + "content_version": { + "$ref": "#/components/schemas/_ContentVersion" + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "spec_id", + "content_version" + ], + "title": "_ExportFrame" + }, + "_ExportSlot": { + "properties": { + "component_id": { + "type": "string", + "pattern": "^cmp_[A-Za-z0-9_-]{1,64}$", + "title": "Component Id" + }, + "revision": { + "type": "integer", + "minimum": 1.0, + "title": "Revision" + }, + "frame": { + "anyOf": [ + { + "$ref": "#/components/schemas/_ExportFrame" + }, + { + "type": "null" + } + ] + } + }, + "additionalProperties": false, + "type": "object", + "required": [ + "component_id", + "revision", + "frame" + ], + "title": "_ExportSlot" + }, + "_Ref": { + "properties": { + "format_version": { + "type": "integer", + "enum": [ + 1, + 2 + ], + "title": "Format Version" + }, + "members": { + "items": { + "$ref": "#/components/schemas/_RefMember" + }, + "type": "array", + "maxItems": 256, + "minItems": 1, + "title": "Members" + } + }, + "type": "object", + "required": [ + "format_version", + "members" + ], + "title": "_Ref" + }, + "_RefArtifact": { + "properties": { + "rendering": { + "$ref": "#/components/schemas/_RefRendering" + } + }, + "type": "object", + "title": "_RefArtifact" + }, + "_RefMember": { + "properties": { + "spec": { + "$ref": "#/components/schemas/_RefSpec" + }, + "content_version": { + "type": "string", + "pattern": "^(?:cv|ocv)_[0-9a-f]{32}$", + "title": "Content Version" + }, + "artifact": { + "anyOf": [ + { + "$ref": "#/components/schemas/_RefArtifact" + }, + { + "type": "null" + } + ] + } + }, + "type": "object", + "required": [ + "spec", + "content_version" + ], + "title": "_RefMember", + "description": "A ref member, held to the pair a root of its kind takes (`DatasetRoot`, `DerivedRoot`),\nso a malformed member refuses as the request does." + }, + "_RefRendering": { + "properties": { + "without_party_totals": { + "type": "boolean", + "title": "Without Party Totals", + "default": false + }, + "groupby": { + "anyOf": [ + { + "$ref": "#/components/schemas/GroupbyOptions" + }, + { + "type": "null" + } + ] + } + }, + "type": "object", + "title": "_RefRendering" + }, + "_RefSpec": { + "properties": { + "spec_id": { + "type": "string", + "pattern": "^(?:spec|ops)_[0-9a-f]{32}$", + "title": "Spec Id" + } + }, + "type": "object", + "required": [ + "spec_id" + ], + "title": "_RefSpec" + }, "datasets_api__capabilities__Capabilities": { "properties": { "capability_version": { @@ -19994,6 +24388,11 @@ "title": "Pivot Max Output Cells", "description": "cap on a pivot's total output cell count (rows x columns) before pivot_over_cell_cap" }, + "groupby_fold_max_rows": { + "type": "integer", + "title": "Groupby Fold Max Rows", + "description": "cap on the frame rows a groupby that sums the frame folds; a larger frame refuses over_ceiling (ceiling_kind rows). A version stored as a frame1 document folds row by row under a lower cap" + }, "operation_retention_days": { "type": "integer", "title": "Operation Retention Days", @@ -20009,6 +24408,7 @@ "async_max_rows", "async_max_requests", "pivot_max_output_cells", + "groupby_fold_max_rows", "operation_retention_days" ], "title": "CapabilityCaps", @@ -20748,7 +25148,7 @@ } ], "default": null, - "description": "why the refusal fired, for the two codes that carry one -- omitted otherwise" + "description": "why the refusal fired, for the codes that carry one -- omitted otherwise" }, "constraint_id": { "anyOf": [ @@ -20970,7 +25370,7 @@ }, { "name": "Presentation", - "description": "Create, revise and render presentation components, and read frames and the release." + "description": "Create, revise and render presentation components, publish them as shares, and read frames and the release." }, { "name": "Codes", diff --git a/tools/README.md b/tools/README.md index b2d73e8..fc4f766 100644 --- a/tools/README.md +++ b/tools/README.md @@ -44,10 +44,10 @@ uv run tools/validate_descriptions_vectors.py uv run tools/validate_client_contract.py ``` -`capture_client_contract.py` refreshes the client contract from dfo-apis. `openapi --dfo-apis PATH` builds the composed app in that checkout's environment, in process, and writes `served/openapi.json` and `served/SOURCE.json`, refusing a checkout with uncommitted changes or untracked files and an environment out of step with its `uv.lock`; `record` runs the contract's scenarios against a base URL, dev by default, writes the records with every absolute URL's query redacted and a local app's signed URLs written as storage URLs, refusing a record that still names any other host, derives the synthetic ones and validates the result, and `record --offline` derives the outcomes again from the records with no request. A recorded scenario holds only exchanges the server made. `record` refuses a recorded scenario that a canned exchange answered, and a synthetic derivation makes no request. Nothing in a record marks an exchange as canned, so `validate_client_contract.py` cannot check this rule and the capture enforces it. It reads and writes a binary body only through a bare file name beside its record, and refuses a name that is absolute or leaves that directory, or a symlink, before it reads or writes anything. It imports its outcome rules from `validate_client_contract.py`. `python/client-contract/README.md` has the recipe. A PEP 723 script whose tests run without network: +`capture_client_contract.py` refreshes the client contract from dfo-apis. `openapi --dfo-apis PATH` builds the composed app in that checkout's environment, in process, and writes `served/openapi.json` and `served/SOURCE.json`, refusing a checkout with uncommitted changes or untracked files and an environment out of step with its `uv.lock`; `record` runs the contract's scenarios against a base URL, dev by default, with `--cloud-run-token` sending the gcloud account's ID token to that origin as dev requires, writes the records with every absolute URL's query redacted and a local app's signed URLs written as storage URLs, refusing a record that still names any other host, derives the synthetic ones and validates the result, and `record --offline` derives the outcomes again from the records with no request. A recorded scenario holds only exchanges the server made. `record` refuses a recorded scenario that a canned exchange answered, and a synthetic derivation makes no request. Nothing in a record marks an exchange as canned, so `validate_client_contract.py` cannot check this rule and the capture enforces it. It reads and writes a binary body only through a bare file name beside its record, and refuses a name that is absolute or leaves that directory, or a symlink, before it reads or writes anything. It imports its outcome rules from `validate_client_contract.py`. `python/client-contract/README.md` has the recipe. A PEP 723 script whose tests run without network: ```bash -uv run tools/capture_client_contract.py record +uv run tools/capture_client_contract.py record --cloud-run-token ``` `validate_unit_vectors.py` validates every file under `vectors/units/` against `schemas/vectors/unit-vector.schema.json`, and checks what the schema cannot express: file names match names, names are unique, the suite meets its floor, and every classification, compare outcome and typed-unit kind has a vector. It does not import `dfo_spec_kit`. Also a PEP 723 script: diff --git a/tools/capture_client_contract.py b/tools/capture_client_contract.py index c069777..a45b12d 100644 --- a/tools/capture_client_contract.py +++ b/tools/capture_client_contract.py @@ -10,7 +10,7 @@ Usage: uv run tools/capture_client_contract.py openapi --dfo-apis PATH uv run tools/capture_client_contract.py record [--base-url URL] - [--only NAME ...] [--offline] [--scenarios-dir DIR] + [--only NAME ...] [--offline] [--cloud-run-token] [--scenarios-dir DIR] `openapi` builds the composed dfo-apis app from the checkout at PATH, with the deployed surfaces (Search, Datasets, Graph and Presentation), by @@ -40,7 +40,10 @@ outside a `location` under the base URL, is refused. The long builds need two specs the server has not built, and the run picks each from the first start year whose spec the server has not built, so each record moves both -start years up. `--scenarios-dir` writes outside the package, unvalidated. +start years up. `--cloud-run-token` sends the gcloud account's Google ID +token in `X-Serverless-Authorization` to the base URL's origin, which dev +needs since it refuses anonymous callers, and mints a new one every 45 +minutes. `--scenarios-dir` writes outside the package, unvalidated. The run ends by validating the whole contract with `tools/validate_client_contract.py`, and fails when it reports a problem, when the binary bodies pass 5 MB, or when the records and bodies together pass @@ -356,6 +359,61 @@ def _lower(items: Any) -> dict[str, str]: return {name.lower(): value for name, value in items} +# Google ID tokens last an hour. The recorder mints a new one well before +# that, since one record outlasts a token. +ID_TOKEN_LIFETIME_S = 45 * 60 + + +def gcloud_id_token() -> str: + """A Google ID token for the gcloud account, which Cloud Run accepts from + a caller with the invoker role.""" + result = subprocess.run( + ["gcloud", "auth", "print-identity-token"], + capture_output=True, + text=True, + check=False, + ) + if result.returncode != 0 or not result.stdout.strip(): + raise SystemExit( + f"gcloud auth print-identity-token failed: {result.stderr.strip()}" + ) + return result.stdout.strip() + + +def cloud_run_transport( + base_url: str, + transport: Transport, + mint: Callable[[], str] = gcloud_id_token, + clock: Callable[[], float] = time.monotonic, +) -> Transport: + """`transport` with a Google ID token in `X-Serverless-Authorization` on + every request to the base URL's origin, as Cloud Run needs from a caller + when the service refuses anonymous ones. A request to another origin, + such as a signed storage URL, carries no token. The header goes on the + wire only, so no record holds it.""" + origin = _origin(base_url) + held: dict[str, Any] = {} + + def token() -> str: + if "token" not in held or clock() - held["at"] >= ID_TOKEN_LIFETIME_S: + held.update(token=mint(), at=clock()) + return held["token"] + + def send( + method: str, + url: str, + *, + body: bytes | None, + headers: Mapping[str, str], + timeout: float, + ) -> Response: + if _origin(url) == origin: + headers = {**headers, "x-serverless-authorization": f"Bearer {token()}"} + return transport(method, url, body=body, headers=headers, timeout=timeout) + + return send + + # A local composed app signs no URL. Its launcher serves each file at # `/__e2e__/blob/{bucket}/{object}` on the API's own origin. A record states # such a URL as the storage URL a deployment signs for the same object. @@ -4856,9 +4914,12 @@ def run_record(args: argparse.Namespace) -> int: if unknown: raise SystemExit(f"no scenario is named {sorted(unknown)}") chosen = set(args.only or names) + transport: Transport = _offline if args.offline else urllib_transport + if args.cloud_run_token and not args.offline: + transport = cloud_run_transport(args.base_url, transport) ctx = Context( args.base_url, - _offline if args.offline else urllib_transport, + transport, load_actions(package_dir), load_client_codes(package_dir), load_client_rules(package_dir), @@ -4937,6 +4998,11 @@ def main(argv: Sequence[str] | None = None) -> int: action="store_true", help="derive each outcome again from the records, with no request", ) + record.add_argument( + "--cloud-run-token", + action="store_true", + help="send the gcloud account's ID token to the base URL's origin", + ) record.add_argument( "--scenarios-dir", type=Path, diff --git a/tools/tests/test_capture_client_contract.py b/tools/tests/test_capture_client_contract.py index ba71bdf..0e2785a 100644 --- a/tools/tests/test_capture_client_contract.py +++ b/tools/tests/test_capture_client_contract.py @@ -591,6 +591,36 @@ def transport(method: str, url: str, **kwargs: Any) -> Any: ) +def test_the_cloud_run_transport_sends_a_fresh_token_to_the_api_origin_alone() -> None: + """The token reaches the API's origin and no signed storage URL, and the + transport mints a new one once the held one has aged past its lifetime.""" + sent: list[tuple[str, str | None]] = [] + + def transport(method: str, url: str, **kwargs: Any) -> Any: + sent.append((url, kwargs["headers"].get("x-serverless-authorization"))) + return capture.Response(200, {}, b"") + + minted = iter(["t1", "t2"]) + now = [0.0] + send = capture.cloud_run_transport( + "https://api.example/api", transport, lambda: next(minted), lambda: now[0] + ) + for url in ( + "https://api.example/api/search", + "https://storage.googleapis.com/bucket/file?X-Goog-Signature=s", + "https://api.example/api/datasets/files/x", + ): + send("GET", url, body=None, headers={}, timeout=1.0) + now[0] = capture.ID_TOKEN_LIFETIME_S + send("GET", "https://api.example/api/search", body=None, headers={}, timeout=1.0) + assert [token for _, token in sent] == [ + "Bearer t1", + None, + "Bearer t1", + "Bearer t2", + ] + + def _long_build_ctx( monkeypatch: pytest.MonkeyPatch, answers: Mapping[tuple[str, int], tuple[str, int | None]], @@ -704,8 +734,8 @@ def test_a_long_build_scan_starts_after_the_recorded_year( def test_the_long_build_scans_start_after_the_recorded_picks() -> None: - """The records hold the DAC pick at 1967 and the OECD pick at 1968.""" - assert capture.long_build_starts(SCENARIOS) == {"DAC": 1968, "OECD": 1969} + """The records hold the DAC pick at 1968 and the OECD pick at 1969.""" + assert capture.long_build_starts(SCENARIOS) == {"DAC": 1969, "OECD": 1970} def test_a_long_build_scan_skips_a_year_without_an_estimate(