diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index cbfe334..59d4925 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -128,7 +128,7 @@ jobs: run: uv run tools/validate_unit_registry.py - name: Test the registry validator - run: uv run --with jsonschema --with pytest pytest tools/tests -q + run: uv run --with jsonschema --with pyarrow --with pytest pytest tools/tests -q - name: Validate identity vectors run: uv run tools/validate_vectors.py diff --git a/python/client-contract/CHANGELOG.md b/python/client-contract/CHANGELOG.md index ae0b8e0..2bafe50 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 `99e62038ceb4b459c2ac699549076ff123c166aa`. 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. `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 `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. - `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 102 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 122 scenarios: 32 recorded against the deployed dfo-apis dev app at `99e62038c`, and 90 synthetic, each derived from a recorded one by a one-line edit, with 19 binary bodies totalling 1,124,808 bytes and records and bodies together 13,324,483 bytes. `search-place-ambiguous-twice` pins two entity_ambiguous groups of one text, each option and slot token naming its group by `entity_choice`. 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 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 124 scenarios: 34 recorded against the deployed dfo-apis dev app at `d80df9f5f`, and 90 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,680,926 bytes. `search-place-ambiguous-twice` pins two entity_ambiguous groups of one text, each option and slot token naming its group by `entity_choice`. 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 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 6 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. @@ -19,10 +19,12 @@ All notable changes to the `dfo-spec-kit-client-contract` Python package will be - A no_data part's gap kind comes from its own reason, whatever the answer's `diagnostics.timed_out` says. `answer-timed-out` gives its part the reason `timed_out`, and `answer-timed-out-keeps-reasons` pins a part that keeps `variable_not_resolved` as a `not_understood` gap in a timed-out answer. - Error outcomes give the error's `trace_id`, the body's, else the `x-dfo-trace-id` header's, else null. Scenario outcomes give `retry_waits`, the waits before each retry, and `warnings`, the warning codes a step's responses issued. Scenario steps take no `timeout`. - `dataset-ref.schema.json`, the frozen `DatasetRef` format, with accepted and rejected examples. -- `without_party_totals` in the ref's artifact rendering, `true` for the version rendered with party totals left out and absent for a plain rendering, with `ref-without-party-totals` and `ref-without-party-totals-false-rejected` as its examples. +- `without_party_totals` in the ref's artifact rendering, `true` for a member fetched with party totals left out and absent for a plain rendering, with `ref-without-party-totals`, a default fetch's cut rendering, `ref-one-member`, a fetch with party totals and its plain rendering, and `ref-without-party-totals-false-rejected` as its examples. Each ref example's rendering is the one its scenario's build posted, and the validator checks it. - `tools/capture_client_contract.py`, which captures `served/openapi.json` from a dfo-apis checkout in process and records the scenarios against a base URL, dev by default, or with `record --offline` derives their outcomes again from the records with no request. A local app's signed URLs are written as the storage URLs a deployment signs. - `tools/validate_client_contract.py`, which checks the contract against its schemas, the served document and `registries/codes.json`, checks `client-codes.json` against them and against the reasons the key-lookup rule raises, and checks each scenario's `expect` against the outcomes its exchanges, `actions.json` and `client-codes.json` give, each Search request against the input its steps derive, a sentence lookup's `entity_groups` included, each build's `input.scope` against the narrowing its step names over the spec's bound roles, each build's options against its layout, each Search request's whole body, each download against its artifact's digest, each recorded scenario's commit against `served/SOURCE.json`, each problem document's code against `registries/codes.json` or, for the website proxy's, `proxy-codes.json`, each proxy problem document's content type, members and `retryable: true`, each 202 against an operation that reads `done`, and each absolute URL against the storage host, each ref example's members against the dataset members and downloaded files of the scenario it names, and the scenarios directory against a 16,000,000-byte budget for records and bodies together. A record that ends a run of retries while a retry remains does not fit. The outcomes include each long build's operation id, poll waits and resubmissions, and a `VersionUnavailableError`'s newest version. - The contract README states that a POST for a build identical to one pending or running returns that operation, so a client that stops waiting posts the same build to join it, and that `fetch` waits for a build with no whole-call deadline by default, with a download that delivers no byte for 30 s a retryable `network_error`. +- A fetch of an answer or a spec leaves out party totals by default: its build posts `without_party_totals: true` in `options`, so the server drops the group totals of the identity's open party roles, and a role the caller binds keeps what it binds. Fetch steps take `party_totals: true` for the client option, `party_totals` in Python and `partyTotals` in TypeScript, false by default, which posts no `without_party_totals`. The wire flag and the ref format are unchanged, and a ref records `without_party_totals: true` for a member fetched with the default. `fetch-spec-party-totals-left-out` and `fetch-spec-party-totals-kept` pin both on DAC2a ODA to Kenya in 2022 with the origin open. A mint and a resumed operation post the plain rendering. +- The `column-order` rule and its vectors: a client presents a dataset's columns with the reading columns first, the time period, provider, recipient, subject, purpose, value, unit, flow type and provenance, each slot filled by the long layout's label or the frame layout's code, the flow type by CRS `crsTypeOfFlow` or else DAC2a `dac2aAidType`, then the rest in the server's order with `stat_var` last. Scenario outcomes give `columns` in that order, and the validator checks it. - The client rules and their vectors: the credentials path and file format, the key lookup order, with an empty `api_key` refused as `key_empty` and an empty profile key as `profile_without_key`, the key format check, the base URL order, `base_url_invalid` for an invalid value, and the cache directory and layout. [unreleased]: https://github.com/DevelopmentFinanceObservatory/spec-kit/commits/main/python diff --git a/python/client-contract/README.md b/python/client-contract/README.md index af3d9e1..1a1734a 100644 --- a/python/client-contract/README.md +++ b/python/client-contract/README.md @@ -134,13 +134,13 @@ A scenario is one client-level call, the HTTP exchanges it makes, and the outcom | `exchanges` | The requests the call makes, in order, each with the response to give | | `expect` | One outcome per step: an `answer`, a `dataset`, an `operation`, a `newest_version` or an `error` | -A step that acts on an earlier result follows one: `choose` follows `search` or `choose`, a `fetch` with no target follows `search`, `choose` or another `fetch` with no target and acts on the last answer, and `result` follows `mint` or `operation`. A `fetch` of an answer or a spec, `mint` and `operation` take a `layout`, `long` by default or `frame`, and a `fetch` of an answer or a spec takes `strict`. A `spec` in a step holds `spec_id`, the server's unmodified `definition`, the `sentence` when the client knows it, and the server's `resolved.entity_groups` as `entity_groups` when it names any. +A step that acts on an earlier result follows one: `choose` follows `search` or `choose`, a `fetch` with no target follows `search`, `choose` or another `fetch` with no target and acts on the last answer, and `result` follows `mint` or `operation`. A `fetch` of an answer or a spec, `mint` and `operation` take a `layout`, `long` by default or `frame`, and a `fetch` of an answer or a spec takes `strict` and `party_totals`. A `spec` in a step holds `spec_id`, the server's unmodified `definition`, the `sentence` when the client knows it, and the server's `resolved.entity_groups` as `entity_groups` when it names any. An exchange's request names its target in one of three ways. `path` is a path the client composes under the base URL, such as `/search/resolve`. `origin_path` is a root-relative URL the server returned, such as an artifact's `url`, or the path and query of an absolute one on the API's origin, which resolves against the base URL's origin, whatever path that URL has. `url` is an absolute URL outside the API, such as the signed storage URL a files route redirects to, which the client fetches with a bare request carrying no client header and no key. `json` holds the request body members that must match; a recorded scenario lists every member the client sent. The response gives `status`, the `headers` a client reads, and a `json` body or a `body_file`, a binary body in `scenarios/`. A scenario's own body files are named `.` and `-.`; a synthetic scenario may instead name a body file its parent names. -A `newest_version` outcome gives the `content_version` the step found, or null. An answer outcome gives `kind`, `status`, `sentence`, `complete`, the distinct `specs` of its definite parts, and its `gaps`, each with the `part` index, the gap `kind` and the number of `options`. A dataset outcome gives `rows`, `columns`, `complete`, its `members`, each with `parts`, `spec_id`, `content_version` and `sentence`, and the `missing` gaps. For one member the columns are the artifact's columns; a dataset of several members adds a `part` column and gives `part_rows`, one entry per member in member order with the `part` value of that member's rows and their number. A fetch of an answer also gives `search_warning`, whether the fetch issued a `SearchWarning`. An error outcome gives the error `class` and its `code`: a refusal's code, a warning's code, which for a `SearchWarning` may be null, or for any other error the client raises itself its code in `client-codes.json`. Every error outcome gives its `trace_id`: a refusal's, as the refusal rules below give it; a failed operation's, its error document's `trace_id`, else the `x-dfo-trace-id` header of the response that carried the failed resource; a `VersionUnavailableError`'s, its first refusal's, or null when nothing refused. An error the client raises itself follows one rule. An error that describes a response carries that response's trace id, and an error that describes the caller's input carries null. The trace id is the one a user quotes to find the fault in the server's logs. The errors that describe a response are `unexpected_response`, `contract_violation` on a body, `answer_declined`, `answer_incomplete`, and a strict fetch's `SearchWarning` or `DataWarning`. A response's trace id is the top-level `trace_id` member of its body when the body is a JSON object holding one as a non-empty string, a problem document or any other body, else its `x-dfo-trace-id` header, else null. A body `trace_id` that is empty or not a string reads as absent, so the header applies. No scenario holds one, and the validator's tests pin it. A Search answer's `diagnostics.trace_id` is not read, and `answer-timed-out` pins the header's winning over a `diagnostics.trace_id` that differs from it. `answer_declined`, `answer_incomplete`, a `SearchWarning`, and a `contract_violation` a choice raises on an option describe the held answer, so they carry the trace id of the Search response that answered it. The errors that describe the caller's input, `choice_invalid`, `invalid_argument` and the key-lookup reasons, carry null, and so do `digest_mismatch` and `download_failed`, which describe a storage-host fetch, and `deadline_exceeded`, `network_error` and `offline`, which describe no response. `search-no-json-body`, `fetch-spec-strict-warning`, `answer-timed-out`, `answer-empty-parts`, `fetch-spec-files-route-no-content` and `choose-option-two-part-query` pin a trace id on an error that describes a response, `operation-failed-without-error` the header of the response that carried a failed resource with no error, and `choose-refused-shared-label` a null one on a choice whose answer's response carries a trace id. A `VersionUnavailableError` also gives `newest_version`, the version the lookup found, or null. A dataset or error outcome of a step that made a long build gives `long_builds`, one entry per build the server ran on, in order: the `operation_id` the client polled last, the `poll_waits` in seconds before each poll, and the number of `resubmissions`. Any outcome of a step that retried a refused request gives `retry_waits`, the seconds before each retry in order, and any outcome of a step whose API responses issued warnings gives `warnings`, their codes from `warning-codes.json` in order. +A `newest_version` outcome gives the `content_version` the step found, or null. An answer outcome gives `kind`, `status`, `sentence`, `complete`, the distinct `specs` of its definite parts, and its `gaps`, each with the `part` index, the gap `kind` and the number of `options`. A dataset outcome gives `rows`, `columns`, `complete`, its `members`, each with `parts`, `spec_id`, `content_version` and `sentence`, and the `missing` gaps. For one member the columns are the artifact's columns in the order the column-order rule gives; a dataset of several members adds a `part` column and gives `part_rows`, one entry per member in member order with the `part` value of that member's rows and their number. A fetch of an answer also gives `search_warning`, whether the fetch issued a `SearchWarning`. An error outcome gives the error `class` and its `code`: a refusal's code, a warning's code, which for a `SearchWarning` may be null, or for any other error the client raises itself its code in `client-codes.json`. Every error outcome gives its `trace_id`: a refusal's, as the refusal rules below give it; a failed operation's, its error document's `trace_id`, else the `x-dfo-trace-id` header of the response that carried the failed resource; a `VersionUnavailableError`'s, its first refusal's, or null when nothing refused. An error the client raises itself follows one rule. An error that describes a response carries that response's trace id, and an error that describes the caller's input carries null. The trace id is the one a user quotes to find the fault in the server's logs. The errors that describe a response are `unexpected_response`, `contract_violation` on a body, `answer_declined`, `answer_incomplete`, and a strict fetch's `SearchWarning` or `DataWarning`. A response's trace id is the top-level `trace_id` member of its body when the body is a JSON object holding one as a non-empty string, a problem document or any other body, else its `x-dfo-trace-id` header, else null. A body `trace_id` that is empty or not a string reads as absent, so the header applies. No scenario holds one, and the validator's tests pin it. A Search answer's `diagnostics.trace_id` is not read, and `answer-timed-out` pins the header's winning over a `diagnostics.trace_id` that differs from it. `answer_declined`, `answer_incomplete`, a `SearchWarning`, and a `contract_violation` a choice raises on an option describe the held answer, so they carry the trace id of the Search response that answered it. The errors that describe the caller's input, `choice_invalid`, `invalid_argument` and the key-lookup reasons, carry null, and so do `digest_mismatch` and `download_failed`, which describe a storage-host fetch, and `deadline_exceeded`, `network_error` and `offline`, which describe no response. `search-no-json-body`, `fetch-spec-strict-warning`, `answer-timed-out`, `answer-empty-parts`, `fetch-spec-files-route-no-content` and `choose-option-two-part-query` pin a trace id on an error that describes a response, `operation-failed-without-error` the header of the response that carried a failed resource with no error, and `choose-refused-shared-label` a null one on a choice whose answer's response carries a trace id. A `VersionUnavailableError` also gives `newest_version`, the version the lookup found, or null. A dataset or error outcome of a step that made a long build gives `long_builds`, one entry per build the server ran on, in order: the `operation_id` the client polled last, the `poll_waits` in seconds before each poll, and the number of `resubmissions`. Any outcome of a step that retried a refused request gives `retry_waits`, the seconds before each retry in order, and any outcome of a step whose API responses issued warnings gives `warnings`, their codes from `warning-codes.json` in order. -Each outcome follows from the exchanges and `actions.json`, and `tools/validate_client_contract.py` fails a record whose `expect` says otherwise. A record whose outcomes it cannot derive, because its exchanges do not fit its steps or a malformed member raises while it reads them, is reported as that record's problem, and the other records are checked. It runs the steps over the exchanges by the rules below: a refusal followed by the same request is a retry where the retry rules allow one, except on a poll, where the long-build rules count retries, and a record that ends a run of retries while the rules allow another does not fit, since the client makes it, a refusal's class is its code's action or else its status, the class of an error the client raises itself is its code's row in `client-codes.json`, a gap's kind is its reason's `gap_kind`, option and candidate counts are those the bodies hold, a dataset's members, `complete`, `missing` and `search_warning` follow from the answer and the manifests, each POST carries its body, each build posts the body the rules give for the spec it builds, so the builds' order and spec_ids are checked, each Search request posts the whole body `{"schema_version": 1, "input": ...}` with the input the rules give: the question, a choice's input, or a member's identity, each poll names the operation the client holds, each files route is the one the artifact's `url` names, each signed download is the URL the files route's `location` names, each retry waits the wait the retry rules give, and each response's warning headers issue the warnings the warning rules give. A dataset's `rows`, `columns` and `part_rows` row counts are the Parquet bodies' and are not derived, except that `part` comes first and `part_rows` is given exactly when the dataset has several members, each entry's `part` is its member's value and their rows sum to `rows`. +Each outcome follows from the exchanges and `actions.json`, and `tools/validate_client_contract.py` fails a record whose `expect` says otherwise. A record whose outcomes it cannot derive, because its exchanges do not fit its steps or a malformed member raises while it reads them, is reported as that record's problem, and the other records are checked. It runs the steps over the exchanges by the rules below: a refusal followed by the same request is a retry where the retry rules allow one, except on a poll, where the long-build rules count retries, and a record that ends a run of retries while the rules allow another does not fit, since the client makes it, a refusal's class is its code's action or else its status, the class of an error the client raises itself is its code's row in `client-codes.json`, a gap's kind is its reason's `gap_kind`, option and candidate counts are those the bodies hold, a dataset's members, `complete`, `missing` and `search_warning` follow from the answer and the manifests, each POST carries its body, each build posts the body the rules give for the spec it builds, so the builds' order and spec_ids are checked, each Search request posts the whole body `{"schema_version": 1, "input": ...}` with the input the rules give: the question, a choice's input, or a member's identity, each poll names the operation the client holds, each files route is the one the artifact's `url` names, each signed download is the URL the files route's `location` names, each retry waits the wait the retry rules give, and each response's warning headers issue the warnings the warning rules give. A dataset's `columns` are derived: the validator reads each downloaded Parquet file's columns from its footer, in the order the server wrote them, and orders them as the column-order rule gives. A dataset's `rows` and `part_rows` row counts are the Parquet bodies' and are not derived, except that `part_rows` is given exactly when the dataset has several members, each entry's `part` is its member's value and their rows sum to `rows`. A recorded scenario's request and response bodies validate against their route's schemas in `served/openapi.json`. A required member stays required when its schema admits null: the body carries it, as null or a value. A member the schema leaves optional may be absent or null, and a client reads both as null. @@ -159,7 +159,7 @@ The records also fix these client rules: - A fetch builds each distinct `spec_id` once, in part order, and finishes one member (build, the sentence when the client lacks it, files, download) before the next. - A fetch of a spec posts its narrowing as the build's `input.scope`, and posts no `scope` when it narrows nothing. A mint takes a layout and no narrowing, so it posts no `scope`. `window` posts `{"kind": "range", "start_year", "end_year"}` for a pair of years, or `{"kind": "all"}` or `{"kind": "latest"}`, and `facets` posts each axis as `{"ref": ...}`, and `facets: {}` names no axis and posts no `facets`. The server's `scope.entities` replaces the spec's whole entity binding, so `entities` posts a whole map: the roles the spec's `definition.identity.entities` binds, with each role the caller names replaced by its refs and each role the caller binds to null dropped. Naming `origin` alone on a spec bound to `origin` and `destination` keeps `destination`. A fetch that names no role, `entities: {}` included, posts no `entities`, so a fetch whose narrowing is all empty posts no `scope`; `fetch-spec-empty-narrowing` pins it. - A built `spec_id` that differs from the posted one, or a spec with no sentence, takes its sentence from Search: the client posts the built definition's `identity` as one `dataset_resubmit` identity entry, with the member's first part as `variable_text`, or `"dataset"` when no answer part names it, and checks the answer's `spec_id` equals the built one. The entry's `entity_groups` holds the spec's `resolved.entity_groups` for each role the built identity binds to the same entities as the spec's definition, so a window or facets narrowing keeps every group and a role the narrowing rebound or dropped loses its group. The entry leaves `entity_groups` out when it keeps no group, as for a resumed operation, whose spec the client does not hold. The server reads a role posted without its group as its members, so a narrowed spec of flows to the least developed countries would read "44 recipients" in place of "the 44 Least Developed Countries". -- A dataset of several members puts the `part` column first, then each member's columns in member order, each column once. A column that members hold in different types widens as pyarrow's permissive promotion widens it, and a pair that cannot widen raises `ContractError` `contract_violation`. A member file that already holds a `part` column raises `contract_violation` when members stack. Rows and columns are not derived, so no scenario pins these. The `part` value on a member's rows is the member's `parts` joined by `"; "`, so a member that answers two folded parts reads `"health ODA disbursements; education ODA disbursements"`, or the member's sentence when `parts` is empty. A definite part whose `variable_text` is absent or empty adds nothing to its member's `parts`, which `answer-folded-parts-unnamed` pins. +- A dataset of several members puts the `part` column first, then the members' columns, gathered in member order with each column once and ordered by the column-order rule. A column that members hold in different types widens as pyarrow's permissive promotion widens it, and a pair that cannot widen raises `ContractError` `contract_violation`. A member file that already holds a `part` column raises `contract_violation` when members stack. Rows and columns are not derived, so no scenario pins these. The `part` value on a member's rows is the member's `parts` joined by `"; "`, so a member that answers two folded parts reads `"health ODA disbursements; education ODA disbursements"`, or the member's sentence when `parts` is empty. A definite part whose `variable_text` is absent or empty adds nothing to its member's `parts`, which `answer-folded-parts-unnamed` pins. - A choice names its part by index, by variable text, or by a word that one gap's options mention, and its option, a candidate among them, by index or label. A boolean part or option is neither an index nor a label. A candidate's label is the `text` of its spec's `resolved.sentence_plan` tokens in the `heading` segment, a token whose `segment` is not a string counted in it, joined and stripped of surrounding white space, or else its `resolved.rendered_sentence`. A candidate with neither a heading nor a sentence has a null label; no scenario pins it, and the validator's tests do. A no_data option's label is matched among the options that mention the word the part was named by. With no part named, exactly one gap must await a choice: a `choice` gap, or any gap with options. - A choice raises `InvalidRequestError` `choice_invalid` and makes no request when no gap, or more than one, awaits it, when the part is named by a boolean, is unknown, names more than one part or already has a reading, when the gap offers no options, or when the option is a boolean, is out of range or matches no label or several. No scenario can hold a boolean part or option, and the validator's tests pin both. It raises the same when an entry it would post cannot be built: a part with no `variable_text`, or a part of a status the client does not know that has no `restatement`. A chosen option whose `data_query` holds other than one part raises `ContractError`, and so does a chosen option with no `data_query`, in a one-part answer as in a several-part one, before any request. `choose-refused-shared-label`, `choose-refused-unknown-candidate-label`, `choose-refused-shared-candidate-label`, `choose-refused-part-without-variable-text`, `choose-refused-unknown-status`, `choose-option-two-part-query` and `choose-option-without-data-query` pin these, and `choose-candidate-by-label` pins a candidate chosen by its label. - Every pick of a candidate asks Search for the picked answer, and no client builds it locally. In a one-part answer the pick posts `dataset_resubmit`, without `raw_query`, with one identity entry: the candidate's identity and `entity_groups`, and the part's `variable_text`, `separate` and `operations` as below. The picked answer, its sentence with any "Assumed: …" clause, and its assumptions are Search's response. A choice of a no_data option in a one-part answer posts the option's `data_query` as the input. @@ -167,7 +167,8 @@ The records also fix these client rules: - Each identity a choice posts echoes its reading's assumptions as `assumptions`: the chosen candidate's entry carries its part's `reading_assumptions` under the candidate's `spec_id`, a definite part's entry carries the part's `assumptions`, and each candidate of a `candidates` entry carries its own `reading_assumptions` entry. Search then states the echoed items that still hold, so the picked answer states what that reading assumed. `[]` states none. An identity with no `assumptions` reads as a fresh request, so a client that holds no list for a reading, from a part that carries no `assumptions` or `reading_assumptions`, posts none. The identity entry that asks for a built sentence posts no `assumptions`, since it reads only the spec's own `rendered_sentence`. An echoed `operations` or `assumptions` list posts exactly the items a client reads under Strict fields, in order, each built from the members it read: an optional member that read as absent is left out, and a `refs` list posts its string items. An `assumptions` list with no item read posts `[]`, and an `operations` list with none is left out. The item rule checks JSON types alone, so the echo posts what a client read, and the server still checks it against its own value constraints: the `verb` enum, the lengths of `phrase` and `text`, and at most one item in `refs`. `choose-echo-drops-malformed-items` pins both lists. - A strict fetch raises the manifest's first warning above `info` severity as a `DataWarning` with that warning's code, before the sentence lookup and the download. - An identity resubmit whose answer is not one definite part of the built `spec_id`, with a sentence, raises `ContractError`. -- The `frame` layout posts `{"format": "parquet", "bundle": false, "layout": "frame"}` as the build's `options` and downloads the artifact whose rendering's `layout` is `frame`; the `long` layout posts `{"format": "parquet", "bundle": false}` and downloads the bare Parquet artifact with any other layout. A fetch of an answer with several members in the `frame` layout raises `InvalidRequestError` before any build. +- The `frame` layout posts `{"format": "parquet", "bundle": false, "layout": "frame"}` as the build's `options` and downloads the artifact whose rendering's `layout` is `frame`; the `long` layout posts `{"format": "parquet", "bundle": false}` and downloads the bare Parquet artifact with any other layout. A fetch of an answer or a spec adds `"without_party_totals": true` to either, as the next rule gives. A client matches an artifact on its rendering's format, bundle and frame layout only, and `without_party_totals` plays no part in the match. A fetch of an answer with several members in the `frame` layout raises `InvalidRequestError` before any build. +- A fetch of an answer or a spec leaves out party totals by default. Its build posts `"without_party_totals": true` in `options`, and the server drops the rows whose party, on a flow party role the identity binds no entity on, the code index declares a group total, before any reshape. A role the caller binds keeps what it binds, so a total named by its dcid still comes back. The client option is `party_totals`, false by default, in Python, and `partyTotals` in TypeScript, and a fetch step's `party_totals: true` stands for it: the build posts no `without_party_totals` and keeps every total. The wire is the served rendering flag as it was; only the client's default changes. A cut that leaves rows out answers a version of its own, listed by the versions route with the plain build as its `base_content_version`, and a cut that leaves nothing out answers the plain version and its file. The manifest's artifact rendering carries `without_party_totals: true` in both cases. A mint and a resumed operation post the plain rendering. `fetch-spec-party-totals-left-out` pins the default on a DAC2a spec whose origin the fetch leaves open, where the cut drops the donor group totals, and `fetch-spec-party-totals-kept` the option. - A download asks the route that redirects to the signed URL, an artifact's `url` or the file selector, and fetches the URL its `location` names once. A files route answers 302 with the `location` the client fetches, or 200 with the file as its body, which the client hashes with no further request, which `fetch-spec-files-route-serves-file` pins. A refusal reads by the refusal rules, and any other status, another 2xx or another 3xx included, raises `ContractError` `unexpected_response` with that response's trace id, which `fetch-spec-files-route-no-content` pins with a 204 and `fetch-spec-files-route-temporary-redirect` with a 307. The route ask is an API request and follows the retry rules below, so a retryable refusal is retried within the budget and any other refusal, `artifact_expired` among them, raises at once. A failed fetch gets exactly one more round. A fetch that answers anything but 200, which `fetch-spec-signed-fetch-partial` pins with a 206, or bytes that do not hash to the artifact's digest ask the route again, under the same retry rules, and fetch again, with no wait between rounds. A second failure raises `ServerError` with `download_failed`, or `digest_mismatch` when the bytes are wrong. A network error or timeout on the fetch is retryable, so it starts the second round too, and when the second round fails the same way the client raises that failure as itself, `network_error` or `deadline_exceeded`. The replay holds no network failure, so no scenario pins that case. - A manifest artifact's `url` names its files route on the API's origin. A root-relative `url` resolves against the base URL's origin, and an absolute one on that origin is asked as its path and query, so both make the same `origin_path` request, which `fetch-spec-same-origin-artifact-url` pins. An artifact `url` on any other origin, the storage host's included, raises `ContractError` `contract_violation` before the sentence lookup and any request for the file, which `fetch-spec-foreign-artifact-url` and `fetch-spec-storage-artifact-url` pin. - A relative `location` resolves against the files route's URL, and the client fetches it on the API's origin as an `origin_path` request. A `location` on an origin other than the API's or `https://storage.googleapis.com` raises `ContractError` `contract_violation` before any fetch. A fetch on the storage host is bare and carries no API key. `fetch-spec-relative-location` pins the relative case. @@ -175,7 +176,7 @@ The records also fix these client rules: - A declined or catalogue answer is not complete, and fetching it raises `DeclinedError`. - Fetching an answer with a gap raises `IncompleteAnswerError` before any request, unless the fetch is partial and some part has a reading. - A fetch of an answer issues one `SearchWarning` when a definite part has an operation Search did not run, a departure, or a warning at severity `warn` or `degraded` with a `message`, or the answer's `diagnostics.warnings` holds such a warning. An `info` warning, a warning with no `message`, and an operation that does not read under Strict fields issue nothing. Each way is one line a client shows: `Not done: ()` coded by the verb, the phrase quoted as a JSON string that keeps non-ASCII characters as they are, the departure's `text` coded by its code, or `Note: ` coded by the warning's code, in part order with the diagnostics warnings last, and ways that show the same line count once, under the first one's code. A strict fetch raises the `SearchWarning` before any build, with the code of its one line, or a null code when there are several lines. A strict fetch raises it before the `frame` layout's several-member check. -- A ref's version is found in this order: the snapshot route and the files route at the stored digest; the file selector, `GET /datasets/{id}/{content_version}/file` with the ref's rendering as the query; and a build of the ref's spec in the ref's rendering, which must answer the ref's `spec_id` and the same `content_version`. Both recovery steps keep the ref's identity, so a recovered member carries the ref's `spec_id` and `content_version`: a snapshot manifest whose `definition.spec_id` or `content_version` is not the ref's, or a rebuild manifest whose `definition.spec_id` is not the ref's, raises `ContractError` `contract_violation` before any download, which `fetch-ref-expired-rebuild-other-spec` pins for the rebuild. A snapshot refusal other than `artifact_expired` ends the lookup, so `snapshot_not_found` raises `NotFoundError` with no further request. A files route or selector refusal of `artifact_expired`, `artifact_not_found` or `not_found` takes the next step, and a selector file of another digest is not the stored file. A snapshot manifest whose artifacts list no artifact of the ref member's digest sends the client to the selector in the ref member's own rendering, and a file that hashes to that digest gives the dataset, which `fetch-ref-artifact-unlisted` pins. A rebuild that answers another version, or that raises `InvalidRequestError`, `NotFoundError` or `VersionUnavailableError`, ends in `VersionUnavailableError` with the first refusal's code, or `version_unavailable` when nothing refused. Its `newest_version` is the version the rebuild answered, or else the newest stored version, as a `newest_version` step finds it: the first version `GET /datasets/{id}/versions?limit=100` lists with a null `base_content_version`, the newest plain build, read page by page through `&cursor=` with each page's `next_cursor` until one is listed. The route lists versions newest first and needs no key. A version with a `base_content_version` is derived from a plain build, a groupby collapse or a party-totals cut, and is skipped, which `fetch-ref-newest-version` pins. The newest version is null when the list ends without a plain version or the route refuses with `NotFoundError`. Any other refusal of the versions route raises, and a page whose `versions` is not a list of versions each with a `content_version` and a `base_content_version` that is a string or null, or whose `next_cursor` is neither a string nor null, raises `ContractError` `contract_violation`, which `newest-version-unreadable-page` pins. +- A ref's version is found in this order: the snapshot route and the files route at the stored digest; the file selector, `GET /datasets/{id}/{content_version}/file` with the ref's rendering as the query; and a build of the ref's spec in the ref's rendering, which must answer the ref's `spec_id` and the same `content_version`. Both recovery steps keep the ref's identity, so a recovered member carries the ref's `spec_id` and `content_version`: a snapshot manifest whose `definition.spec_id` or `content_version` is not the ref's, or a rebuild manifest whose `definition.spec_id` is not the ref's, raises `ContractError` `contract_violation` before any download, which `fetch-ref-expired-rebuild-other-spec` pins for the rebuild. A snapshot refusal other than `artifact_expired` ends the lookup, so `snapshot_not_found` raises `NotFoundError` with no further request. A files route or selector refusal of `artifact_expired`, `artifact_not_found` or `not_found` takes the next step, and a selector file of another digest is not the stored file. A snapshot manifest whose artifacts list no artifact of the ref member's digest sends the client to the selector in the ref member's own rendering, and a file that hashes to that digest gives the dataset, which `fetch-ref-artifact-unlisted` pins. A rebuild that answers another version, or that raises `InvalidRequestError`, `NotFoundError` or `VersionUnavailableError`, ends in `VersionUnavailableError` with the first refusal's code, or `version_unavailable` when nothing refused. Its `newest_version` is the version the rebuild answered, or else the newest stored version, as a `newest_version` step finds it: the first version `GET /datasets/{id}/versions?limit=100` lists with a null `base_content_version`, the newest plain build, read page by page through `&cursor=` with each page's `next_cursor` until one is listed. The route lists versions newest first and needs no key. A version with a `base_content_version` is derived from a plain build, a groupby collapse or a party-totals cut, and is skipped, which `fetch-ref-newest-version` pins. The newest version is null when the list ends without a plain version or the route refuses with `NotFoundError`. It names the newest plain build, which a fetch with the default party totals rule answers only when the cut leaves nothing out; when the cut leaves rows out, the fetch answers a version whose `base_content_version` is that build. So a client does not present `newest_version` as comparable to the `content_version` of a cut ref or a cut fetch: two different versions there need not mean newer data. Any other refusal of the versions route raises, and a page whose `versions` is not a list of versions each with a `content_version` and a `base_content_version` that is a string or null, or whose `next_cursor` is neither a string nor null, raises `ContractError` `contract_violation`, which `newest-version-unreadable-page` pins. - A build answers 200 with the manifest, or 202 with an operation the client polls at `/datasets/operations/{operation_id}`, the id of the operation it holds. The 202 reads `pending` or `running`, because a submission starts a build or joins one under way, and a `done` operation left by an earlier submission of a rejected head is built again. A deterministic failure answers a 202 that reads `failed`. `fetch-spec-async-build` pins `pending` and `fetch-spec-accepted-running` pins `running`. A POST for a build identical to one that is pending or running returns that same operation, because the server derives the operation id from the request: dfo-apis `src/datasets_api/operation_store.py` `compute_operation_id` hashes the request identity, the origin catalogue build id and the rendering. A client that stops waiting for a build can post the same build again to join it. A mint's build answers 202. A record whose mint answers 200 fits no mint step. Before each poll it waits the `Retry-After` of the refusal that answered the last poll, whatever its status, as every retry of a refused request waits; else the last operation resource's `retry_after_ms`, else the `Retry-After` of the last answered poll, the response that carried that resource, else a backoff of 1, 2, 4 and then 8 seconds that advances one step each time it is used, a poll after a refusal included. `fetch-spec-poll-pacing-changes` pins a `retry_after_ms` that changes from one poll to the next, so a client waits each poll's own value. - A retryable 429 poll spends no retry, and a 429 whose body says it is not retryable raises at once, as a refusal's `retryable` outranks its status, which `fetch-spec-poll-rate-limited-not-retryable` pins. Any other retryable refused poll spends one of the two retries, which a poll that answers restores, and a refusal that is not retryable raises. `fetch-spec-poll-refused` pins two 503s polled again after an answered poll, `fetch-spec-poll-refused-backoff` a 503 with no `Retry-After` among polls no response paces, after which the backoff advances, `fetch-spec-poll-refused-retry-after` a 503 whose `Retry-After` paces the next poll, and `fetch-spec-poll-not-found` a 404 that raises at once. A poll that answers a failed operation whose error is retryable posts the same build once more and polls the operation it starts; a second failure, an error that is not retryable, and a resumed operation, whose build request the client does not hold, raise the operation's error. A refused poll whose code is `operation_failed` is a failed operation with that error. A failed operation whose resource carries no `error` raises `ServerError` with `operation_failed`, retryable by status 500 as a refusal without a document is, which `operation-failed-without-error` pins. A 202 or resumed operation that already reads `failed` raises its error before any poll. - Any other refusal is retried when it is retryable: as its problem document's `retryable` says, else when its status is 408, 429, 500, 502, 503 or 504. A client makes two retries by default, and the scenarios assume that default. A build's POST shares those two retries with every other refusal of it, and once a 504 cuts the build off the client posts it once more only, whatever that post answers: a build refused 504 then 503 raises the 503, a build refused 503 then 504 is posted once more after the 504, and a second 504 raises. `fetch-spec-504-then-503`, `fetch-spec-503-then-504` and `fetch-spec-504-twice` pin the three. A refusal that is not retryable, or one past the retries, raises its error. @@ -207,15 +208,15 @@ Each record names the commit in the responses' `x-dfo-commit` header, and the ru uv run tools/capture_client_contract.py record --base-url http://127.0.0.1:8083/api ``` -A record's `origin.base_url` is the base URL the run was given, a local app's included. A local app's signed URL, which its launcher serves at `/__e2e__/blob/{bucket}/{object}` on the API's origin, is written as `https://storage.googleapis.com/{bucket}/{object}` with its query redacted, as a deployment signs it, because a production download is cross-origin and the client sends no key there; the run, like the validator, refuses a record holding any absolute URL other than such a storage URL, or a `location` under the base URL, so a local app's host under another name or port is refused too. A server answers a version it has built inline, so `mint-async-build` and `operation-resume` each need a spec just above the 100,000-row sync budget that the server has not built: ODA disbursements from the 32 DAC countries to the 133 G77 countries from 1964 to 2024 for the mint, and from the 38 OECD countries to the G77 countries from 1965 to 2024 for the resumed operation, each one variable over some 3,700 donor and recipient pairs, so the done manifest stays small. A local recording therefore starts on a fresh datasets database with `DATASETS_SYNC_BUDGET_ROWS=100000`. `--scenarios-dir` writes records outside the package, unvalidated. +A record's `origin.base_url` is the base URL the run was given, a local app's included. A local app's signed URL, which its launcher serves at `/__e2e__/blob/{bucket}/{object}` on the API's origin, is written as `https://storage.googleapis.com/{bucket}/{object}` with its query redacted, as a deployment signs it, because a production download is cross-origin and the client sends no key there; the run, like the validator, refuses a record holding any absolute URL other than such a storage URL, or a `location` under the base URL, so a local app's host under another name or port is refused too. A server answers a version it has built inline, so `mint-async-build` and `operation-resume` each need a spec just above the 100,000-row sync budget that the server has not built: ODA disbursements from the 32 DAC countries to the 133 G77 countries from 1967 to 2024 for the mint, and from the 38 OECD countries to the G77 countries from 1968 to 2024 for the resumed operation, each one variable over some 3,700 donor and recipient pairs, so the done manifest stays small. A local recording therefore starts on a fresh datasets database with `DATASETS_SYNC_BUDGET_ROWS=100000`. `--scenarios-dir` writes records outside the package, unvalidated. ## DatasetRef -`dataset-ref.schema.json` is the frozen format a client writes for `data.ref` and reads back in any language: `format_version: 1` and one or more `members`, each `{parts, sentence, spec: {spec_id, definition}, content_version, artifact: {digest, rendering}}`. `parts` holds the variable text of each answer part the member answers, in query order, and is empty for a spec fetched outside an answer. `definition` is the server's definition unmodified, so it holds the `schema_version`, `spec_id` and `identity` the served `CanonicalDefinition` requires and no other member, and a rebuild posts it as it is. The format takes any integer `schema_version` and leaves the version to the server, which checks it when a rebuild posts the definition. `rendering` is the selector a client matches an artifact on, `{format, bundle}` with `layout: "frame"` for the frame layout and `without_party_totals: true` for the version rendered with party totals left out, never the server's rendering object. The `without_party_totals` key is written only when true, so a plain rendering omits it and `false` is not a valid value. Beyond the schema, each member's `definition.spec_id` equals its `spec.spec_id`, and members hold distinct `spec_id`s. `ref-bare-definition-rejected`, `ref-definition-without-identity-rejected` and `ref-definition-without-schema-version-rejected` pin the definition's required members, and `ref-definition-extra-member-rejected` a member it does not admit. `ref-without-party-totals` is the accepted cut rendering and `ref-without-party-totals-false-rejected` pins `false`. `refs/` holds accepted examples and rejected ones, each `{format_version, name, description, scenario, ref}` with `expect: "accept"` or `error`, `{by: "schema"}` or `{by: "rule", reason}`, the reason `definition_spec_id_mismatch` or `repeated_spec_id`. `scenario` names the recorded scenario that serves the ref's members, and is left out of a ref with no members. Each member's `spec_id`, `content_version` and `sentence` are those of a dataset member of that scenario, and its artifact digest is the digest of a file the scenario downloads, so a re-recording that changes a member also fails the refs that still name the old one. +`dataset-ref.schema.json` is the frozen format a client writes for `data.ref` and reads back in any language: `format_version: 1` and one or more `members`, each `{parts, sentence, spec: {spec_id, definition}, content_version, artifact: {digest, rendering}}`. `parts` holds the variable text of each answer part the member answers, in query order, and is empty for a spec fetched outside an answer. `definition` is the server's definition unmodified, so it holds the `schema_version`, `spec_id` and `identity` the served `CanonicalDefinition` requires and no other member, and a rebuild posts it as it is. The format takes any integer `schema_version` and leaves the version to the server, which checks it when a rebuild posts the definition. `rendering` is the selector a client matches an artifact on, `{format, bundle}` with `layout: "frame"` for the frame layout and `without_party_totals: true` for a fetch that left party totals out, never the server's rendering object. A ref records the rendering its fetch posted, so a member fetched with the default records `without_party_totals: true` whether or not the cut left out a row, and a member fetched with party totals records no such key. The `without_party_totals` key is written only when true, so a plain rendering omits it and `false` is not a valid value. Beyond the schema, each member's `definition.spec_id` equals its `spec.spec_id`, and members hold distinct `spec_id`s. `ref-bare-definition-rejected`, `ref-definition-without-identity-rejected` and `ref-definition-without-schema-version-rejected` pin the definition's required members, and `ref-definition-extra-member-rejected` a member it does not admit. `ref-without-party-totals` is the cut rendering a default fetch records, `ref-one-member` the plain rendering a fetch with party totals records, and `ref-without-party-totals-false-rejected` pins `false`. `refs/` holds accepted examples and rejected ones, each `{format_version, name, description, scenario, ref}` with `expect: "accept"` or `error`, `{by: "schema"}` or `{by: "rule", reason}`, the reason `definition_spec_id_mismatch` or `repeated_spec_id`. `scenario` names the recorded scenario that serves the ref's members, and is left out of a ref with no members. Each member's `spec_id`, `parts`, `content_version` and `sentence` are those of a dataset member of that scenario, and its artifact digest is the digest of a file the scenario downloads, so a re-recording that changes a member also fails the refs that still name the old one. Each member of an example the schema accepts records the rendering the scenario's build of its spec posted as `options`. ## Rules -`rules/README.md` states the shared rules for credentials, key lookup and format, the base URL, and disk caching. A rule applies where the client and runtime implement its capability. Python implements disk caching; TypeScript currently keeps no disk cache, so `cache-dir` and `cache-layout` apply to Python. Credentials-file rules apply to runtimes with local credentials support. Each rule's vectors are in `rules/.json`. +`rules/README.md` states the shared rules for credentials, key lookup and format, the base URL, disk caching, and the order a client presents a dataset's columns in. A rule applies where the client and runtime implement its capability. Python implements disk caching; TypeScript currently keeps no disk cache, so `cache-dir` and `cache-layout` apply to Python. Credentials-file rules apply to runtimes with local credentials support. Each rule's vectors are in `rules/.json`. ## Validation diff --git a/python/client-contract/src/dfo_client_contract/contract.py b/python/client-contract/src/dfo_client_contract/contract.py index d0cbc9a..57b5484 100644 --- a/python/client-contract/src/dfo_client_contract/contract.py +++ b/python/client-contract/src/dfo_client_contract/contract.py @@ -16,6 +16,7 @@ "base-url", "cache-dir", "cache-layout", + "column-order", ) diff --git a/python/client-contract/src/dfo_client_contract/refs/ref-answer-member.json b/python/client-contract/src/dfo_client_contract/refs/ref-answer-member.json index 50815d9..c8d9a62 100644 --- a/python/client-contract/src/dfo_client_contract/refs/ref-answer-member.json +++ b/python/client-contract/src/dfo_client_contract/refs/ref-answer-member.json @@ -1,8 +1,8 @@ { "format_version": 1, "name": "ref-answer-member", - "description": "A member built from an answer names the part it answers.", - "scenario": "fetch-spec-known-sentence", + "description": "A member built from an answer names the part it answers, the member of answer-definite-fetch.", + "scenario": "answer-definite-fetch", "ref": { "format_version": 1, "members": [ @@ -10,85 +10,84 @@ "parts": [ "ODA disbursements for basic health care" ], - "sentence": "Germany's gross ODA disbursements to Nigeria for basic health care, 2020 to 2023. Current US dollars · OECD Creditor Reporting System (CRS).", + "sentence": "Germany's gross ODA disbursements to Nigeria for basic health care, 1995 to 2024. Current US dollars · OECD Creditor Reporting System (CRS).", "spec": { - "spec_id": "spec_cb5baa4161de718f18583060674dbca6", + "spec_id": "spec_774d6c001a6250aa67ca676ab067895e", "definition": { "schema_version": 1, - "spec_id": "spec_cb5baa4161de718f18583060674dbca6", + "spec_id": "spec_774d6c001a6250aa67ca676ab067895e", "identity": { - "identity_version": "spec1", "shape": { "kind": "statvar_schema", + "stat_type": "measuredValue", "population_type": "FinancialFlow", "measured_property": "amount", - "stat_type": "measuredValue", "measurement_qualifier": "Nominal" }, "slots": [ { - "property": "crsCooperationModality", "binding": { "state": "unbound" - } + }, + "property": "crsCooperationModality" }, { - "property": "crsPurpose", "binding": { - "state": "value", - "ref": "CRSPurposeCode12220" - } + "ref": "CRSPurposeCode12220", + "state": "value" + }, + "property": "crsPurpose" }, { - "property": "crsTypeOfFinance", "binding": { "state": "unbound" - } + }, + "property": "crsTypeOfFinance" }, { - "property": "crsTypeOfFlow", "binding": { - "state": "value", - "ref": "CRSTypeOfFlow10" - } + "ref": "CRSTypeOfFlow10", + "state": "value" + }, + "property": "crsTypeOfFlow" }, { - "property": "financialFlowType", "binding": { - "state": "value", - "ref": "Disbursement" - } + "ref": "Disbursement", + "state": "value" + }, + "property": "financialFlowType" }, { - "property": "nettingBasis", "binding": { - "state": "value", - "ref": "Gross" - } + "ref": "Gross", + "state": "value" + }, + "property": "nettingBasis" } ], "entities": { - "destination": [ - "country/NGA" - ], "origin": [ "country/DEU" + ], + "destination": [ + "country/NGA" ] }, + "identity_version": "spec1", "requested_window": { - "kind": "range", - "start_year": 2020, - "end_year": 2023 + "kind": "all" } } } }, - "content_version": "cv_bf242138f8d0a892c97da9373d1626f4", + "content_version": "cv_b92d94774702c7f05f2075d0b03dd756", "artifact": { - "digest": "sha256:c44200969f19d73104d1bc24ebca905e59f749c2939234cdde10ba6f5a131170", + "digest": "sha256:421efacc2dc010af38112a087b0b49ff5539f61d2afd12a88272b27e99b5f5db", "rendering": { "format": "parquet", - "bundle": false + "bundle": false, + "without_party_totals": true } } } diff --git a/python/client-contract/src/dfo_client_contract/refs/ref-bare-definition-rejected.json b/python/client-contract/src/dfo_client_contract/refs/ref-bare-definition-rejected.json index 1cdc751..29ed83e 100644 --- a/python/client-contract/src/dfo_client_contract/refs/ref-bare-definition-rejected.json +++ b/python/client-contract/src/dfo_client_contract/refs/ref-bare-definition-rejected.json @@ -20,7 +20,8 @@ "digest": "sha256:c44200969f19d73104d1bc24ebca905e59f749c2939234cdde10ba6f5a131170", "rendering": { "format": "parquet", - "bundle": false + "bundle": false, + "without_party_totals": true } } } diff --git a/python/client-contract/src/dfo_client_contract/refs/ref-definition-extra-member-rejected.json b/python/client-contract/src/dfo_client_contract/refs/ref-definition-extra-member-rejected.json index 2ef647e..fc306c8 100644 --- a/python/client-contract/src/dfo_client_contract/refs/ref-definition-extra-member-rejected.json +++ b/python/client-contract/src/dfo_client_contract/refs/ref-definition-extra-member-rejected.json @@ -87,7 +87,8 @@ "digest": "sha256:c44200969f19d73104d1bc24ebca905e59f749c2939234cdde10ba6f5a131170", "rendering": { "format": "parquet", - "bundle": false + "bundle": false, + "without_party_totals": true } } } diff --git a/python/client-contract/src/dfo_client_contract/refs/ref-definition-spec-id-mismatch-rejected.json b/python/client-contract/src/dfo_client_contract/refs/ref-definition-spec-id-mismatch-rejected.json index ef3d06c..ffd5bb5 100644 --- a/python/client-contract/src/dfo_client_contract/refs/ref-definition-spec-id-mismatch-rejected.json +++ b/python/client-contract/src/dfo_client_contract/refs/ref-definition-spec-id-mismatch-rejected.json @@ -84,7 +84,8 @@ "digest": "sha256:c44200969f19d73104d1bc24ebca905e59f749c2939234cdde10ba6f5a131170", "rendering": { "format": "parquet", - "bundle": false + "bundle": false, + "without_party_totals": true } } } diff --git a/python/client-contract/src/dfo_client_contract/refs/ref-definition-without-identity-rejected.json b/python/client-contract/src/dfo_client_contract/refs/ref-definition-without-identity-rejected.json index 65ad764..c9c4202 100644 --- a/python/client-contract/src/dfo_client_contract/refs/ref-definition-without-identity-rejected.json +++ b/python/client-contract/src/dfo_client_contract/refs/ref-definition-without-identity-rejected.json @@ -21,7 +21,8 @@ "digest": "sha256:c44200969f19d73104d1bc24ebca905e59f749c2939234cdde10ba6f5a131170", "rendering": { "format": "parquet", - "bundle": false + "bundle": false, + "without_party_totals": true } } } diff --git a/python/client-contract/src/dfo_client_contract/refs/ref-definition-without-schema-version-rejected.json b/python/client-contract/src/dfo_client_contract/refs/ref-definition-without-schema-version-rejected.json index 9628b91..78199eb 100644 --- a/python/client-contract/src/dfo_client_contract/refs/ref-definition-without-schema-version-rejected.json +++ b/python/client-contract/src/dfo_client_contract/refs/ref-definition-without-schema-version-rejected.json @@ -85,7 +85,8 @@ "digest": "sha256:c44200969f19d73104d1bc24ebca905e59f749c2939234cdde10ba6f5a131170", "rendering": { "format": "parquet", - "bundle": false + "bundle": false, + "without_party_totals": true } } } diff --git a/python/client-contract/src/dfo_client_contract/refs/ref-frame-layout.json b/python/client-contract/src/dfo_client_contract/refs/ref-frame-layout.json index a8495b7..3cad5c6 100644 --- a/python/client-contract/src/dfo_client_contract/refs/ref-frame-layout.json +++ b/python/client-contract/src/dfo_client_contract/refs/ref-frame-layout.json @@ -85,7 +85,8 @@ "rendering": { "format": "parquet", "bundle": false, - "layout": "frame" + "layout": "frame", + "without_party_totals": true } } } 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 50e1dd6..e6a2563 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 @@ -1,89 +1,73 @@ { "format_version": 1, "name": "ref-one-member", - "description": "A ref to one bare long Parquet version, the member of fetch-spec-known-sentence.", - "scenario": "fetch-spec-known-sentence", + "description": "A ref to one bare long Parquet version fetched with party_totals=True, whose rendering records no without_party_totals, the member of fetch-spec-party-totals-kept.", + "scenario": "fetch-spec-party-totals-kept", "ref": { "format_version": 1, "members": [ { "parts": [], - "sentence": "Germany's gross ODA disbursements to Nigeria for basic health care, 2020 to 2023. Current US dollars · OECD Creditor Reporting System (CRS).", + "sentence": "Gross disbursements to Kenya from 96 providers for official development assistance in 2022. Current US dollars · OECD DAC2a.", "spec": { - "spec_id": "spec_cb5baa4161de718f18583060674dbca6", + "spec_id": "spec_73897fdfb0206fcf27c5898b353348fb", "definition": { "schema_version": 1, - "spec_id": "spec_cb5baa4161de718f18583060674dbca6", + "spec_id": "spec_73897fdfb0206fcf27c5898b353348fb", "identity": { - "identity_version": "spec1", "shape": { "kind": "statvar_schema", + "stat_type": "measuredValue", "population_type": "FinancialFlow", "measured_property": "amount", - "stat_type": "measuredValue", "measurement_qualifier": "Nominal" }, "slots": [ { - "property": "crsCooperationModality", "binding": { - "state": "unbound" - } + "ref": "DAC2aAidType206", + "state": "value" + }, + "property": "dac2aAidType" }, { - "property": "crsPurpose", - "binding": { - "state": "value", - "ref": "CRSPurposeCode12220" - } - }, - { - "property": "crsTypeOfFinance", "binding": { "state": "unbound" - } + }, + "property": "dacTypeOfFinance" }, { - "property": "crsTypeOfFlow", "binding": { - "state": "value", - "ref": "CRSTypeOfFlow10" - } + "ref": "Disbursement", + "state": "value" + }, + "property": "financialFlowType" }, { - "property": "financialFlowType", "binding": { - "state": "value", - "ref": "Disbursement" - } - }, - { - "property": "nettingBasis", - "binding": { - "state": "value", - "ref": "Gross" - } + "ref": "Gross", + "state": "value" + }, + "property": "nettingBasis" } ], "entities": { "destination": [ - "country/NGA" - ], - "origin": [ - "country/DEU" + "country/KEN" ] }, + "identity_version": "spec1", "requested_window": { "kind": "range", - "start_year": 2020, - "end_year": 2023 + "end_year": 2022, + "start_year": 2022 } } } }, - "content_version": "cv_bf242138f8d0a892c97da9373d1626f4", + "content_version": "cv_2aa4cc2fd852cd9b84347c61d07d609a", "artifact": { - "digest": "sha256:c44200969f19d73104d1bc24ebca905e59f749c2939234cdde10ba6f5a131170", + "digest": "sha256:05d0cbf59e8dddd7162104bf8e2edc406fc402a0b8d0d971452d01b07b0ee426", "rendering": { "format": "parquet", "bundle": false diff --git a/python/client-contract/src/dfo_client_contract/refs/ref-repeated-spec-id-rejected.json b/python/client-contract/src/dfo_client_contract/refs/ref-repeated-spec-id-rejected.json index 830c942..629887d 100644 --- a/python/client-contract/src/dfo_client_contract/refs/ref-repeated-spec-id-rejected.json +++ b/python/client-contract/src/dfo_client_contract/refs/ref-repeated-spec-id-rejected.json @@ -86,14 +86,13 @@ "digest": "sha256:c44200969f19d73104d1bc24ebca905e59f749c2939234cdde10ba6f5a131170", "rendering": { "format": "parquet", - "bundle": false + "bundle": false, + "without_party_totals": true } } }, { - "parts": [ - "ODA disbursements for basic health care" - ], + "parts": [], "sentence": "Germany's gross ODA disbursements to Nigeria for basic health care, 2020 to 2023. Current US dollars · OECD Creditor Reporting System (CRS).", "spec": { "spec_id": "spec_cb5baa4161de718f18583060674dbca6", @@ -172,7 +171,8 @@ "digest": "sha256:c44200969f19d73104d1bc24ebca905e59f749c2939234cdde10ba6f5a131170", "rendering": { "format": "parquet", - "bundle": false + "bundle": false, + "without_party_totals": true } } } diff --git a/python/client-contract/src/dfo_client_contract/refs/ref-without-party-totals.json b/python/client-contract/src/dfo_client_contract/refs/ref-without-party-totals.json index e458ea3..776d5e9 100644 --- a/python/client-contract/src/dfo_client_contract/refs/ref-without-party-totals.json +++ b/python/client-contract/src/dfo_client_contract/refs/ref-without-party-totals.json @@ -1,7 +1,7 @@ { "format_version": 1, "name": "ref-without-party-totals", - "description": "A ref to the version rendered with party totals left out, the member of fetch-spec-known-sentence.", + "description": "A ref a fetch with the default party totals rule writes, its rendering naming without_party_totals, the member of fetch-spec-known-sentence.", "scenario": "fetch-spec-known-sentence", "ref": { "format_version": 1, diff --git a/python/client-contract/src/dfo_client_contract/rules/README.md b/python/client-contract/src/dfo_client_contract/rules/README.md index 41cae91..1ecfdf9 100644 --- a/python/client-contract/src/dfo_client_contract/rules/README.md +++ b/python/client-contract/src/dfo_client_contract/rules/README.md @@ -1,6 +1,6 @@ # Client rules -Clients implement these rules for the capabilities available in their runtime. Python implements every rule. TypeScript implements the key, credentials and base-URL rules in Node; browser runtimes use the key sources available there. TypeScript currently keeps no disk cache, so `cache-dir` and `cache-layout` apply to Python. Clients implementing the same capability use the same rules and formats. Each rule's vectors are in `.json`, validated by `rules.schema.json`. In a vector, `env` lists the environment variables set, and an empty value counts as unset everywhere below. +Clients implement these rules for the capabilities available in their runtime. Python implements every rule. TypeScript implements the key, credentials and base-URL rules in Node, and the column-order rule in every runtime; browser runtimes use the key sources available there. TypeScript currently keeps no disk cache, so `cache-dir` and `cache-layout` apply to Python. Clients implementing the same capability use the same rules and formats. Each rule's vectors are in `.json`, validated by `rules.schema.json`. In a vector, `env` lists the environment variables set, and an empty value counts as unset everywhere below. ## Credentials path (`credentials-path`) @@ -68,4 +68,22 @@ Inside the cache directory: - a downloaded artifact is `files/sha256/`, keyed by its digest; - a manifest is `manifests///.json`, where `` is the format, then `-bundle` for a bundle, then `-frame` for the frame layout: `parquet`, `parquet-frame`, `csv-bundle`. -A client writes an entry to a temporary name in the same directory and renames it into place, so a reader sees a complete entry. Concurrent writers of one content-addressed artifact write identical bytes. Manifest updates can replace another complete manifest and lose a cache candidate, so cache availability is best-effort. A read re-hashes an artifact, and a mismatch counts as a miss. +The key leaves out a rendering's `without_party_totals`: a cut that leaves rows out answers a version of its own, and one that leaves none out answers the plain version's file. A client writes an entry to a temporary name in the same directory and renames it into place, so a reader sees a complete entry. Concurrent writers of one content-addressed artifact write identical bytes. Manifest updates can replace another complete manifest and lose a cache candidate, so cache availability is best-effort. A read re-hashes an artifact, and a mismatch counts as a miss. + +## Column order (`column-order`) + +A client presents a dataset's columns in reading order, in every table it returns. `reading_columns` in `column-order.json` lists nine slots in order: the time period, the provider, the recipient, the subject, the purpose, the value, the unit, the flow type and the provenance. Each slot names the long layout's label column, then the frame layout's code column, and the flow type slot names the CRS pair, then the DAC2a aid type pair. The first name of a slot that the dataset holds fills the slot, and a slot whose names it holds none of stays empty. The filled slots come first, in slot order, then every other column in the order the server wrote it, with `stat_var` last. + +| Slot | Long layout | Frame layout | +| ----------- | ------------------------------------------------ | ------------------------------------------------------ | +| Time period | `time_period` | `time_period` | +| Provider | `financingProvider_label` | `financingProvider` | +| Recipient | `financingRecipient_label` | `financingRecipient` | +| Subject | `observationAbout_label` | `observationAbout` | +| Purpose | `crsPurpose_label` | `stat_var_crsPurpose` | +| Value | `value` | `value` | +| Unit | `unit_label` | `unit` | +| Flow type | `crsTypeOfFlow_label`, else `dac2aAidType_label` | `stat_var_crsTypeOfFlow`, else `stat_var_dac2aAidType` | +| Provenance | `provenance_label` | `provenance` | + +A CRS series in the long layout, 26 columns, reads `time_period`, `financingProvider_label`, `financingRecipient_label`, `crsPurpose_label`, `value`, `unit_label`, `crsTypeOfFlow_label` and `provenance_label`, then its 18 other columns, `stat_var` last. A DAC2a series leads with `dac2aAidType_label` in the flow type slot. A dataset of several members puts `part` first, then orders the members' columns, gathered in member order with each column once, by the same rule. A vector gives one dataset's `columns`, or a stacked dataset's `members`, each member's columns in the server's order; in a stack of a CRS member and a DAC2a member, `crsTypeOfFlow_label` fills the flow type slot and `dac2aAidType_label` falls among the other columns. The order moves columns and changes no value, and a client hashes a downloaded file before it orders the columns, so the digest and the ref keep the server's file. diff --git a/python/client-contract/src/dfo_client_contract/rules/column-order.json b/python/client-contract/src/dfo_client_contract/rules/column-order.json new file mode 100644 index 0000000..47f3542 --- /dev/null +++ b/python/client-contract/src/dfo_client_contract/rules/column-order.json @@ -0,0 +1,529 @@ +{ + "format_version": 1, + "rule": "column-order", + "reading_columns": [ + [ + "time_period" + ], + [ + "financingProvider_label", + "financingProvider" + ], + [ + "financingRecipient_label", + "financingRecipient" + ], + [ + "observationAbout_label", + "observationAbout" + ], + [ + "crsPurpose_label", + "stat_var_crsPurpose" + ], + [ + "value" + ], + [ + "unit_label", + "unit" + ], + [ + "crsTypeOfFlow_label", + "stat_var_crsTypeOfFlow", + "dac2aAidType_label", + "stat_var_dac2aAidType" + ], + [ + "provenance_label", + "provenance" + ] + ], + "vectors": [ + { + "name": "long-oda-series", + "columns": [ + "stat_var", + "financingProvider", + "financingProvider_label", + "financingProvider_kind", + "financingRecipient", + "financingRecipient_label", + "financingRecipient_kind", + "crsCooperationModality", + "crsCooperationModality_label", + "crsPurpose", + "crsPurpose_label", + "crsTypeOfFinance", + "crsTypeOfFinance_label", + "crsTypeOfFlow", + "crsTypeOfFlow_label", + "time_period", + "value", + "unit", + "unit_label", + "currency", + "price_basis", + "base_year", + "measurementMethod", + "measurementMethod_label", + "provenance", + "provenance_label" + ], + "ordered": [ + "time_period", + "financingProvider_label", + "financingRecipient_label", + "crsPurpose_label", + "value", + "unit_label", + "crsTypeOfFlow_label", + "provenance_label", + "financingProvider", + "financingProvider_kind", + "financingRecipient", + "financingRecipient_kind", + "crsCooperationModality", + "crsCooperationModality_label", + "crsPurpose", + "crsTypeOfFinance", + "crsTypeOfFinance_label", + "crsTypeOfFlow", + "unit", + "currency", + "price_basis", + "base_year", + "measurementMethod", + "measurementMethod_label", + "provenance", + "stat_var" + ] + }, + { + "name": "long-one-recipient-role", + "columns": [ + "stat_var", + "stat_var_label", + "financingRecipient", + "financingRecipient_label", + "financingRecipient_kind", + "time_period", + "value", + "unit", + "unit_label", + "currency", + "price_basis", + "base_year", + "measurementMethod", + "measurementMethod_label", + "provenance", + "provenance_label" + ], + "ordered": [ + "time_period", + "financingRecipient_label", + "value", + "unit_label", + "provenance_label", + "stat_var_label", + "financingRecipient", + "financingRecipient_kind", + "unit", + "currency", + "price_basis", + "base_year", + "measurementMethod", + "measurementMethod_label", + "provenance", + "stat_var" + ] + }, + { + "name": "long-observation-about", + "columns": [ + "stat_var", + "stat_var_label", + "observationAbout", + "observationAbout_label", + "time_period", + "value", + "unit", + "unit_label", + "currency", + "price_basis", + "base_year", + "measurementMethod", + "measurementMethod_label", + "provenance", + "provenance_label" + ], + "ordered": [ + "time_period", + "observationAbout_label", + "value", + "unit_label", + "provenance_label", + "stat_var_label", + "observationAbout", + "unit", + "currency", + "price_basis", + "base_year", + "measurementMethod", + "measurementMethod_label", + "provenance", + "stat_var" + ] + }, + { + "name": "long-dac2a-series", + "columns": [ + "stat_var", + "financingProvider", + "financingProvider_label", + "financingProvider_kind", + "financingRecipient", + "financingRecipient_label", + "financingRecipient_kind", + "dac2aAidType", + "dac2aAidType_label", + "time_period", + "value", + "unit", + "unit_label", + "currency", + "price_basis", + "base_year", + "measurementMethod", + "measurementMethod_label", + "provenance", + "provenance_label" + ], + "ordered": [ + "time_period", + "financingProvider_label", + "financingRecipient_label", + "value", + "unit_label", + "dac2aAidType_label", + "provenance_label", + "financingProvider", + "financingProvider_kind", + "financingRecipient", + "financingRecipient_kind", + "dac2aAidType", + "unit", + "currency", + "price_basis", + "base_year", + "measurementMethod", + "measurementMethod_label", + "provenance", + "stat_var" + ] + }, + { + "name": "frame-layout-codes", + "columns": [ + "stat_var", + "financingProvider", + "financingRecipient", + "time_period", + "value", + "unit", + "measurementMethod", + "provenance", + "status", + "stat_var_crsCooperationModality", + "stat_var_crsPurpose", + "stat_var_crsTypeOfFinance", + "stat_var_crsTypeOfFlow" + ], + "ordered": [ + "time_period", + "financingProvider", + "financingRecipient", + "stat_var_crsPurpose", + "value", + "unit", + "stat_var_crsTypeOfFlow", + "provenance", + "measurementMethod", + "status", + "stat_var_crsCooperationModality", + "stat_var_crsTypeOfFinance", + "stat_var" + ] + }, + { + "name": "label-beats-code", + "columns": [ + "stat_var", + "unit", + "unit_label", + "value", + "provenance" + ], + "ordered": [ + "value", + "unit_label", + "provenance", + "unit", + "stat_var" + ] + }, + { + "name": "ordered-columns-keep-their-order", + "columns": [ + "time_period", + "financingProvider_label", + "financingRecipient_label", + "crsPurpose_label", + "value", + "unit_label", + "crsTypeOfFlow_label", + "provenance_label", + "financingProvider", + "financingProvider_kind", + "financingRecipient", + "financingRecipient_kind", + "crsCooperationModality", + "crsCooperationModality_label", + "crsPurpose", + "crsTypeOfFinance", + "crsTypeOfFinance_label", + "crsTypeOfFlow", + "unit", + "currency", + "price_basis", + "base_year", + "measurementMethod", + "measurementMethod_label", + "provenance", + "stat_var" + ], + "ordered": [ + "time_period", + "financingProvider_label", + "financingRecipient_label", + "crsPurpose_label", + "value", + "unit_label", + "crsTypeOfFlow_label", + "provenance_label", + "financingProvider", + "financingProvider_kind", + "financingRecipient", + "financingRecipient_kind", + "crsCooperationModality", + "crsCooperationModality_label", + "crsPurpose", + "crsTypeOfFinance", + "crsTypeOfFinance_label", + "crsTypeOfFlow", + "unit", + "currency", + "price_basis", + "base_year", + "measurementMethod", + "measurementMethod_label", + "provenance", + "stat_var" + ] + }, + { + "name": "no-reading-columns", + "columns": [ + "stat_var", + "x", + "y" + ], + "ordered": [ + "x", + "y", + "stat_var" + ] + }, + { + "name": "no-stat-var", + "columns": [ + "value", + "time_period", + "status" + ], + "ordered": [ + "time_period", + "value", + "status" + ] + }, + { + "name": "stack-crs-and-observation-about", + "members": [ + [ + "stat_var", + "financingProvider", + "financingProvider_label", + "financingProvider_kind", + "financingRecipient", + "financingRecipient_label", + "financingRecipient_kind", + "crsCooperationModality", + "crsCooperationModality_label", + "crsPurpose", + "crsPurpose_label", + "crsTypeOfFinance", + "crsTypeOfFinance_label", + "crsTypeOfFlow", + "crsTypeOfFlow_label", + "time_period", + "value", + "unit", + "unit_label", + "currency", + "price_basis", + "base_year", + "measurementMethod", + "measurementMethod_label", + "provenance", + "provenance_label" + ], + [ + "stat_var", + "stat_var_label", + "observationAbout", + "observationAbout_label", + "time_period", + "value", + "unit", + "unit_label", + "currency", + "price_basis", + "base_year", + "measurementMethod", + "measurementMethod_label", + "provenance", + "provenance_label" + ] + ], + "ordered": [ + "part", + "time_period", + "financingProvider_label", + "financingRecipient_label", + "observationAbout_label", + "crsPurpose_label", + "value", + "unit_label", + "crsTypeOfFlow_label", + "provenance_label", + "financingProvider", + "financingProvider_kind", + "financingRecipient", + "financingRecipient_kind", + "crsCooperationModality", + "crsCooperationModality_label", + "crsPurpose", + "crsTypeOfFinance", + "crsTypeOfFinance_label", + "crsTypeOfFlow", + "unit", + "currency", + "price_basis", + "base_year", + "measurementMethod", + "measurementMethod_label", + "provenance", + "stat_var_label", + "observationAbout", + "stat_var" + ] + }, + { + "name": "stack-crs-and-dac2a", + "members": [ + [ + "stat_var", + "financingProvider", + "financingProvider_label", + "financingProvider_kind", + "financingRecipient", + "financingRecipient_label", + "financingRecipient_kind", + "crsCooperationModality", + "crsCooperationModality_label", + "crsPurpose", + "crsPurpose_label", + "crsTypeOfFinance", + "crsTypeOfFinance_label", + "crsTypeOfFlow", + "crsTypeOfFlow_label", + "time_period", + "value", + "unit", + "unit_label", + "currency", + "price_basis", + "base_year", + "measurementMethod", + "measurementMethod_label", + "provenance", + "provenance_label" + ], + [ + "stat_var", + "financingProvider", + "financingProvider_label", + "financingProvider_kind", + "financingRecipient", + "financingRecipient_label", + "financingRecipient_kind", + "dac2aAidType", + "dac2aAidType_label", + "time_period", + "value", + "unit", + "unit_label", + "currency", + "price_basis", + "base_year", + "measurementMethod", + "measurementMethod_label", + "provenance", + "provenance_label" + ] + ], + "ordered": [ + "part", + "time_period", + "financingProvider_label", + "financingRecipient_label", + "crsPurpose_label", + "value", + "unit_label", + "crsTypeOfFlow_label", + "provenance_label", + "financingProvider", + "financingProvider_kind", + "financingRecipient", + "financingRecipient_kind", + "crsCooperationModality", + "crsCooperationModality_label", + "crsPurpose", + "crsTypeOfFinance", + "crsTypeOfFinance_label", + "crsTypeOfFlow", + "unit", + "currency", + "price_basis", + "base_year", + "measurementMethod", + "measurementMethod_label", + "provenance", + "dac2aAidType", + "dac2aAidType_label", + "stat_var" + ] + } + ] +} diff --git a/python/client-contract/src/dfo_client_contract/rules/rules.schema.json b/python/client-contract/src/dfo_client_contract/rules/rules.schema.json index 82b5da2..78eb56e 100644 --- a/python/client-contract/src/dfo_client_contract/rules/rules.schema.json +++ b/python/client-contract/src/dfo_client_contract/rules/rules.schema.json @@ -25,6 +25,9 @@ }, { "$ref": "#/$defs/cache_layout" + }, + { + "$ref": "#/$defs/column_order" } ], "$defs": { @@ -585,6 +588,95 @@ } } } + }, + "column_order": { + "$ref": "#/$defs/suite", + "additionalProperties": false, + "required": [ + "reading_columns" + ], + "properties": { + "format_version": true, + "rule": { + "const": "column-order" + }, + "reading_columns": { + "description": "The reading slots in order. Each slot lists the column names that fill it, each long layout's label before its frame layout's code; the first name a dataset holds fills the slot.", + "type": "array", + "minItems": 1, + "items": { + "type": "array", + "minItems": 1, + "items": { + "type": "string", + "minLength": 1, + "$ref": "#/$defs/one_line" + }, + "uniqueItems": true + } + }, + "vectors": { + "items": { + "type": "object", + "additionalProperties": false, + "required": [ + "name", + "ordered" + ], + "properties": { + "name": { + "$ref": "#/$defs/name" + }, + "columns": { + "type": "array", + "items": { + "type": "string", + "minLength": 1, + "$ref": "#/$defs/one_line" + }, + "uniqueItems": true, + "description": "One dataset's columns in the order the server wrote them." + }, + "members": { + "description": "The columns of each member of a stacked dataset, in member order, each in the order the server wrote them.", + "type": "array", + "minItems": 2, + "items": { + "type": "array", + "items": { + "type": "string", + "minLength": 1, + "$ref": "#/$defs/one_line" + }, + "uniqueItems": true + } + }, + "ordered": { + "type": "array", + "items": { + "type": "string", + "minLength": 1, + "$ref": "#/$defs/one_line" + }, + "uniqueItems": true, + "description": "The same columns in the order a client presents them, after `part` for a stacked dataset." + } + }, + "oneOf": [ + { + "required": [ + "columns" + ] + }, + { + "required": [ + "members" + ] + } + ] + } + } + } } } } diff --git a/python/client-contract/src/dfo_client_contract/scenario.schema.json b/python/client-contract/src/dfo_client_contract/scenario.schema.json index 5499a73..b44a8c5 100644 --- a/python/client-contract/src/dfo_client_contract/scenario.schema.json +++ b/python/client-contract/src/dfo_client_contract/scenario.schema.json @@ -326,6 +326,10 @@ }, "strict": { "type": "boolean" + }, + "party_totals": { + "description": "True keeps the group totals of the identity's open party roles, so the build posts no `without_party_totals`. Absent or false leaves them out.", + "type": "boolean" } } }, @@ -350,6 +354,10 @@ "strict": { "type": "boolean" }, + "party_totals": { + "description": "True keeps the group totals of the identity's open party roles, so the build posts no `without_party_totals`. Absent or false leaves them out.", + "type": "boolean" + }, "window": true, "entities": true, "facets": true 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 189ef3f..00abc2b 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": "962188ce8826466e8510fb819d5dc26d" + "x-dfo-trace-id": "2de415a9f27d4ce69e4f1eb97b5951af" }, "json": { "schema_version": 1, @@ -41,14 +41,14 @@ "extract_skipped": false }, "diagnostics": { - "engine_build": "99e62038ceb4b459c2ac699549076ff123c166aa", - "trace_id": "962188ce8826466e8510fb819d5dc26d", + "engine_build": "d80df9f5fd598b7345255470932d202ee5d49942", + "trace_id": "2de415a9f27d4ce69e4f1eb97b5951af", "warnings": [], "timing_ms": { - "total": 1710, + "total": 4676, "by_step": { - "coverage": 0, - "extract": 0, + "coverage": 1, + "extract": 1, "cache_lookup": 0 } }, @@ -56,7 +56,7 @@ "input_tokens": 0, "output_tokens": 0, "cached_tokens": 0, - "jev_input_tokens": 13358, + "jev_input_tokens": 13359, "jev_output_tokens": 2855 }, "timed_out": false @@ -67,28 +67,28 @@ "variable_text": "mortality", "warnings": [], "timing_ms": { - "total": 1705, + "total": 4672, "by_step": { "recall": 1, "phase_resolve_places": 0, "phase_check_entities": 0, - "shape_arcs": 4, - "shape_probe": 2, + "shape_arcs": 6, + "shape_probe": 120, "shape_groups": 6, - "shape_labels": 1, + "shape_labels": 2, "shape_admission": 1, "phase_derive_shapes": 0, - "shape": 119, + "shape": 258, "phase_prune_and_rank": 0, - "bind": 146, - "phase_bind": 19, - "phase_settle": 2, - "phase_place_bindings": 30, + "bind": 154, + "phase_bind": 18, + "phase_settle": 1, + "phase_place_bindings": 39, "phase_facet_requests": 0, - "materialise": 21, - "phase_materialise": 25, + "materialise": 202, + "phase_materialise": 33, "answer": 30, - "phase_outcome": 1312 + "phase_outcome": 3936 } }, "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.", @@ -810,7 +810,7 @@ "start_year": 2013, "end_year": 2022 }, - "capability_version": "cap_88defe77cc79e0c0", + "capability_version": "cap_765c9d2a0c7529b9", "default_reading": { "applied": true, "removed_stat_vars": [] @@ -1593,6 +1593,15 @@ "value_kind": "enum_value" } }, + { + "value": { + "ref": { + "ref": "Years0", + "label": "Years 0" + }, + "value_kind": "enum_value" + } + }, { "value": { "ref": { @@ -1809,6 +1818,15 @@ "value_kind": "enum_value" } }, + { + "value": { + "ref": { + "ref": "Years85", + "label": "Years 85" + }, + "value_kind": "enum_value" + } + }, { "value": { "ref": { @@ -2344,7 +2362,7 @@ "start_year": 2013, "end_year": 2022 }, - "capability_version": "cap_88defe77cc79e0c0", + "capability_version": "cap_765c9d2a0c7529b9", "default_reading": { "applied": true, "removed_stat_vars": [] @@ -2579,7 +2597,7 @@ "error": { "class": "ContractError", "code": "contract_violation", - "trace_id": "962188ce8826466e8510fb819d5dc26d" + "trace_id": "2de415a9f27d4ce69e4f1eb97b5951af" } } ] 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 fe09ef6..6da0d9d 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": "99e62038ceb4b459c2ac699549076ff123c166aa", - "recorded_at": "2026-10-25T17:34:55Z" + "dfo_commit": "d80df9f5fd598b7345255470932d202ee5d49942", + "recorded_at": "2026-10-26T09:22:01Z" }, "call": [ { @@ -38,7 +38,7 @@ "status": 200, "headers": { "content-type": "application/json", - "x-dfo-trace-id": "962188ce8826466e8510fb819d5dc26d" + "x-dfo-trace-id": "2de415a9f27d4ce69e4f1eb97b5951af" }, "json": { "schema_version": 1, @@ -49,14 +49,14 @@ "extract_skipped": false }, "diagnostics": { - "engine_build": "99e62038ceb4b459c2ac699549076ff123c166aa", - "trace_id": "962188ce8826466e8510fb819d5dc26d", + "engine_build": "d80df9f5fd598b7345255470932d202ee5d49942", + "trace_id": "2de415a9f27d4ce69e4f1eb97b5951af", "warnings": [], "timing_ms": { - "total": 1710, + "total": 4676, "by_step": { - "coverage": 0, - "extract": 0, + "coverage": 1, + "extract": 1, "cache_lookup": 0 } }, @@ -64,7 +64,7 @@ "input_tokens": 0, "output_tokens": 0, "cached_tokens": 0, - "jev_input_tokens": 13358, + "jev_input_tokens": 13359, "jev_output_tokens": 2855 }, "timed_out": false @@ -75,28 +75,28 @@ "variable_text": "mortality", "warnings": [], "timing_ms": { - "total": 1705, + "total": 4672, "by_step": { "recall": 1, "phase_resolve_places": 0, "phase_check_entities": 0, - "shape_arcs": 4, - "shape_probe": 2, + "shape_arcs": 6, + "shape_probe": 120, "shape_groups": 6, - "shape_labels": 1, + "shape_labels": 2, "shape_admission": 1, "phase_derive_shapes": 0, - "shape": 119, + "shape": 258, "phase_prune_and_rank": 0, - "bind": 146, - "phase_bind": 19, - "phase_settle": 2, - "phase_place_bindings": 30, + "bind": 154, + "phase_bind": 18, + "phase_settle": 1, + "phase_place_bindings": 39, "phase_facet_requests": 0, - "materialise": 21, - "phase_materialise": 25, + "materialise": 202, + "phase_materialise": 33, "answer": 30, - "phase_outcome": 1312 + "phase_outcome": 3936 } }, "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.", @@ -818,7 +818,7 @@ "start_year": 2013, "end_year": 2022 }, - "capability_version": "cap_88defe77cc79e0c0", + "capability_version": "cap_765c9d2a0c7529b9", "default_reading": { "applied": true, "removed_stat_vars": [] @@ -1601,6 +1601,15 @@ "value_kind": "enum_value" } }, + { + "value": { + "ref": { + "ref": "Years0", + "label": "Years 0" + }, + "value_kind": "enum_value" + } + }, { "value": { "ref": { @@ -1817,6 +1826,15 @@ "value_kind": "enum_value" } }, + { + "value": { + "ref": { + "ref": "Years85", + "label": "Years 85" + }, + "value_kind": "enum_value" + } + }, { "value": { "ref": { @@ -2352,7 +2370,7 @@ "start_year": 2013, "end_year": 2022 }, - "capability_version": "cap_88defe77cc79e0c0", + "capability_version": "cap_765c9d2a0c7529b9", "default_reading": { "applied": true, "removed_stat_vars": [] @@ -2633,7 +2651,7 @@ "status": 200, "headers": { "content-type": "application/json", - "x-dfo-trace-id": "3e98392a1d6a49edbf871ef6d6a14e8d" + "x-dfo-trace-id": "97f100748b194ca09afc06c9dc1ac81d" }, "json": { "schema_version": 1, @@ -2642,11 +2660,11 @@ "extract_skipped": true }, "diagnostics": { - "engine_build": "99e62038ceb4b459c2ac699549076ff123c166aa", - "trace_id": "3e98392a1d6a49edbf871ef6d6a14e8d", + "engine_build": "d80df9f5fd598b7345255470932d202ee5d49942", + "trace_id": "97f100748b194ca09afc06c9dc1ac81d", "warnings": [], "timing_ms": { - "total": 332, + "total": 345, "by_step": { "coverage": 0 } @@ -2659,19 +2677,19 @@ "variable_text": "mortality", "warnings": [], "timing_ms": { - "total": 265, + "total": 284, "by_step": { "validate": 0, "walk": 0, "reread_arcs": 0, "detect_edits": 0, "resolve_survivors": 0, - "shape": 164, + "shape": 174, "bind": 0, "where_places": 0, - "materialise": 99, + "materialise": 107, "answer": 2, - "options": 0 + "options": 1 } }, "entity_refs": [], @@ -3190,7 +3208,7 @@ "start_year": 2013, "end_year": 2022 }, - "capability_version": "cap_88defe77cc79e0c0" + "capability_version": "cap_765c9d2a0c7529b9" }, "confidence": "high", "available_at_place": true, @@ -3403,7 +3421,8 @@ }, "options": { "format": "parquet", - "bundle": false + "bundle": false, + "without_party_totals": true } } }, @@ -3411,7 +3430,7 @@ "status": 200, "headers": { "content-type": "application/json", - "x-dfo-trace-id": "fbdb664928db4e2abb9e8d67358cd3d3" + "x-dfo-trace-id": "1607014b90c1472db06c480ad25623d1" }, "json": { "schema_version": 1, @@ -3619,7 +3638,7 @@ "frame_grammar_version": "1.1.0", "origin_catalogue_build_id": "20261023T061534Z-06fa7b89", "served_from": "head", - "confirmed_at": "2026-10-25T17:32:46.054393+00:00" + "confirmed_at": "2026-10-26T09:17:50.952592+00:00" }, "warnings": [], "diagnostics": [ @@ -3635,7 +3654,8 @@ "rendering": { "bundle": false, "format": "parquet", - "layout": 4 + "layout": 4, + "without_party_totals": true }, "bytes": 5000, "media_type": "application/vnd.apache.parquet", @@ -3814,7 +3834,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": "4a404bdffcc04f2cad2ebac790436ba6" + "x-dfo-trace-id": "08870d34b30642f8b5dc651859af6425" } } }, @@ -3865,21 +3885,21 @@ "dataset": { "rows": 10, "columns": [ - "stat_var", - "stat_var_label", - "observationAbout", - "observationAbout_label", "time_period", + "observationAbout_label", "value", - "unit", "unit_label", + "provenance_label", + "stat_var_label", + "observationAbout", + "unit", "currency", "price_basis", "base_year", "measurementMethod", "measurementMethod_label", "provenance", - "provenance_label" + "stat_var" ], "complete": true, "members": [ 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 5101202..d55b3e7 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": "99e62038ceb4b459c2ac699549076ff123c166aa", - "recorded_at": "2026-10-25T17:36:45Z" + "dfo_commit": "d80df9f5fd598b7345255470932d202ee5d49942", + "recorded_at": "2026-10-26T09:23:10Z" }, "call": [ { @@ -34,7 +34,7 @@ "status": 200, "headers": { "content-type": "application/json", - "x-dfo-trace-id": "2b68cf1261cf4d72ad5093c3774e4221" + "x-dfo-trace-id": "f384c8a7105445ed8da7d4f21c168a64" }, "json": { "schema_version": 1, @@ -45,14 +45,14 @@ "extract_skipped": false }, "diagnostics": { - "engine_build": "99e62038ceb4b459c2ac699549076ff123c166aa", - "trace_id": "2b68cf1261cf4d72ad5093c3774e4221", + "engine_build": "d80df9f5fd598b7345255470932d202ee5d49942", + "trace_id": "f384c8a7105445ed8da7d4f21c168a64", "warnings": [], "timing_ms": { - "total": 859, + "total": 969, "by_step": { "coverage": 0, - "extract": 857, + "extract": 967, "entity_check": 0, "cache_lookup": 0 } @@ -84,7 +84,7 @@ "error": { "class": "DeclinedError", "code": "answer_declined", - "trace_id": "2b68cf1261cf4d72ad5093c3774e4221" + "trace_id": "f384c8a7105445ed8da7d4f21c168a64" } } ] 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 a107d3a..1e7c21c 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": "99e62038ceb4b459c2ac699549076ff123c166aa", - "recorded_at": "2026-10-25T17:36:44Z" + "dfo_commit": "d80df9f5fd598b7345255470932d202ee5d49942", + "recorded_at": "2026-10-26T09:23:09Z" }, "call": [ { @@ -34,7 +34,7 @@ "status": 200, "headers": { "content-type": "application/json", - "x-dfo-trace-id": "ba24916847894383bc4c13b436724cbe" + "x-dfo-trace-id": "518bf1ffcf3d4739b1a9d866a0cab91a" }, "json": { "schema_version": 1, @@ -45,14 +45,14 @@ "extract_skipped": false }, "diagnostics": { - "engine_build": "99e62038ceb4b459c2ac699549076ff123c166aa", - "trace_id": "ba24916847894383bc4c13b436724cbe", + "engine_build": "d80df9f5fd598b7345255470932d202ee5d49942", + "trace_id": "518bf1ffcf3d4739b1a9d866a0cab91a", "warnings": [], "timing_ms": { - "total": 901, + "total": 902, "by_step": { "coverage": 0, - "extract": 899, + "extract": 901, "entity_check": 0, "cache_lookup": 0 } @@ -60,7 +60,7 @@ "llm_usage": { "input_tokens": 2229, "output_tokens": 64, - "cached_tokens": 0 + "cached_tokens": 840 }, "timed_out": false }, @@ -90,7 +90,7 @@ "error": { "class": "DeclinedError", "code": "answer_declined", - "trace_id": "ba24916847894383bc4c13b436724cbe" + "trace_id": "518bf1ffcf3d4739b1a9d866a0cab91a" } } ] 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 578c3ad..e471bed 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": "99e62038ceb4b459c2ac699549076ff123c166aa", - "recorded_at": "2026-10-25T17:34:54Z" + "dfo_commit": "d80df9f5fd598b7345255470932d202ee5d49942", + "recorded_at": "2026-10-26T09:21:59Z" }, "call": [ { @@ -34,7 +34,7 @@ "status": 200, "headers": { "content-type": "application/json", - "x-dfo-trace-id": "7abc6f06215b4187a4280d87d6f8a51a" + "x-dfo-trace-id": "c7cb40f3790f4a15a0ddcad0cc93c9bb" }, "json": { "schema_version": 1, @@ -45,8 +45,8 @@ "extract_skipped": true }, "diagnostics": { - "engine_build": "99e62038ceb4b459c2ac699549076ff123c166aa", - "trace_id": "7abc6f06215b4187a4280d87d6f8a51a", + "engine_build": "d80df9f5fd598b7345255470932d202ee5d49942", + "trace_id": "c7cb40f3790f4a15a0ddcad0cc93c9bb", "warnings": [], "timing_ms": { "total": 3, @@ -68,30 +68,30 @@ "variable_text": "ODA disbursements for basic health care", "warnings": [], "timing_ms": { - "total": 1669, + "total": 3011, "by_step": { - "recall": 397, + "recall": 457, "phase_resolve_places": 0, "phase_check_entities": 0, - "shape_arcs": 1, - "shape_probe_coverage": 4, - "shape_probe": 115, - "shape_groups": 53, + "shape_arcs": 2, + "shape_probe_coverage": 8, + "shape_probe": 114, + "shape_groups": 579, "shape_labels": 1, - "shape_admission": 1, + "shape_admission": 2, "phase_derive_shapes": 0, - "shape": 276, + "shape": 1247, "phase_prune_and_rank": 0, - "bind": 214, - "phase_bind": 203, - "phase_settle": 45, - "phase_place_bindings": 20, + "bind": 266, + "phase_bind": 327, + "phase_settle": 46, + "phase_place_bindings": 57, "phase_facet_requests": 0, - "materialise": 28, - "phase_materialise": 196, - "answer": 145, - "options": 50, - "phase_outcome": 95 + "materialise": 44, + "phase_materialise": 200, + "answer": 220, + "options": 55, + "phase_outcome": 92 } }, "restatement": { @@ -1191,7 +1191,7 @@ "selected": [] } ], - "capability_version": "cap_88defe77cc79e0c0", + "capability_version": "cap_765c9d2a0c7529b9", "default_reading": { "applied": true, "removed_stat_vars": [] @@ -3781,7 +3781,8 @@ }, "options": { "format": "parquet", - "bundle": false + "bundle": false, + "without_party_totals": true } } }, @@ -3789,7 +3790,7 @@ "status": 200, "headers": { "content-type": "application/json", - "x-dfo-trace-id": "70ac3c153571497dab413643b6537466" + "x-dfo-trace-id": "4c3f35c8c0d44b99941a73a9519b41d2" }, "json": { "schema_version": 1, @@ -4190,7 +4191,7 @@ "frame_grammar_version": "1.1.0", "origin_catalogue_build_id": "20261011T194155Z-80081f08", "served_from": "head", - "confirmed_at": "2026-10-25T17:22:10.027136+00:00" + "confirmed_at": "2026-10-26T09:17:22.037029+00:00" }, "warnings": [ { @@ -4212,7 +4213,8 @@ "rendering": { "bundle": false, "format": "parquet", - "layout": 4 + "layout": 4, + "without_party_totals": true }, "bytes": 9842, "media_type": "application/vnd.apache.parquet", @@ -4535,7 +4537,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": "d2d4306f79d2411ebcd110cc1e26f49d" + "x-dfo-trace-id": "333ab72de55449ed8288a5f458406a4c" } } }, @@ -4570,32 +4572,32 @@ "dataset": { "rows": 30, "columns": [ - "stat_var", - "financingProvider", + "time_period", "financingProvider_label", + "financingRecipient_label", + "crsPurpose_label", + "value", + "unit_label", + "crsTypeOfFlow_label", + "provenance_label", + "financingProvider", "financingProvider_kind", "financingRecipient", - "financingRecipient_label", "financingRecipient_kind", "crsCooperationModality", "crsCooperationModality_label", "crsPurpose", - "crsPurpose_label", "crsTypeOfFinance", "crsTypeOfFinance_label", "crsTypeOfFlow", - "crsTypeOfFlow_label", - "time_period", - "value", "unit", - "unit_label", "currency", "price_basis", "base_year", "measurementMethod", "measurementMethod_label", "provenance", - "provenance_label" + "stat_var" ], "complete": true, "members": [ 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 a6a67b7..5b84639 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": "7abc6f06215b4187a4280d87d6f8a51a" + "x-dfo-trace-id": "c7cb40f3790f4a15a0ddcad0cc93c9bb" }, "json": { "schema_version": 1, @@ -41,8 +41,8 @@ "extract_skipped": true }, "diagnostics": { - "engine_build": "99e62038ceb4b459c2ac699549076ff123c166aa", - "trace_id": "7abc6f06215b4187a4280d87d6f8a51a", + "engine_build": "d80df9f5fd598b7345255470932d202ee5d49942", + "trace_id": "c7cb40f3790f4a15a0ddcad0cc93c9bb", "warnings": [], "timing_ms": { "total": 3, @@ -64,30 +64,30 @@ "variable_text": "ODA disbursements for basic health care", "warnings": [], "timing_ms": { - "total": 1669, + "total": 3011, "by_step": { - "recall": 397, + "recall": 457, "phase_resolve_places": 0, "phase_check_entities": 0, - "shape_arcs": 1, - "shape_probe_coverage": 4, - "shape_probe": 115, - "shape_groups": 53, + "shape_arcs": 2, + "shape_probe_coverage": 8, + "shape_probe": 114, + "shape_groups": 579, "shape_labels": 1, - "shape_admission": 1, + "shape_admission": 2, "phase_derive_shapes": 0, - "shape": 276, + "shape": 1247, "phase_prune_and_rank": 0, - "bind": 214, - "phase_bind": 203, - "phase_settle": 45, - "phase_place_bindings": 20, + "bind": 266, + "phase_bind": 327, + "phase_settle": 46, + "phase_place_bindings": 57, "phase_facet_requests": 0, - "materialise": 28, - "phase_materialise": 196, - "answer": 145, - "options": 50, - "phase_outcome": 95 + "materialise": 44, + "phase_materialise": 200, + "answer": 220, + "options": 55, + "phase_outcome": 92 } }, "restatement": { @@ -1187,7 +1187,7 @@ "selected": [] } ], - "capability_version": "cap_88defe77cc79e0c0", + "capability_version": "cap_765c9d2a0c7529b9", "default_reading": { "applied": true, "removed_stat_vars": [] @@ -3704,7 +3704,7 @@ "error": { "class": "ContractError", "code": "contract_violation", - "trace_id": "7abc6f06215b4187a4280d87d6f8a51a" + "trace_id": "c7cb40f3790f4a15a0ddcad0cc93c9bb" } } ] 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 697131d..7b3098b 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": "7fd4a5b5b50648999f5ead8966bcc02c" + "x-dfo-trace-id": "01cf4a9623c449759f24d249f8783de1" }, "json": { "schema_version": 1, @@ -41,14 +41,14 @@ "extract_skipped": false }, "diagnostics": { - "engine_build": "99e62038ceb4b459c2ac699549076ff123c166aa", - "trace_id": "7fd4a5b5b50648999f5ead8966bcc02c", + "engine_build": "d80df9f5fd598b7345255470932d202ee5d49942", + "trace_id": "01cf4a9623c449759f24d249f8783de1", "warnings": [], "timing_ms": { - "total": 1054, + "total": 1162, "by_step": { "coverage": 0, - "extract": 1050, + "extract": 1040, "cache_lookup": 0 } }, @@ -101,7 +101,7 @@ "error": { "class": "ContractError", "code": "contract_violation", - "trace_id": "7fd4a5b5b50648999f5ead8966bcc02c" + "trace_id": "01cf4a9623c449759f24d249f8783de1" } } ] 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 b5a120e..371544b 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": "7c7e42dd77f94ee08a15cef4438ee7ad" + "x-dfo-trace-id": "5e0f0d6a5a6442a38932b02d7f72ed6c" }, "json": { "schema_version": 1, @@ -44,11 +44,11 @@ "extract_skipped": true }, "diagnostics": { - "engine_build": "99e62038ceb4b459c2ac699549076ff123c166aa", - "trace_id": "7c7e42dd77f94ee08a15cef4438ee7ad", + "engine_build": "d80df9f5fd598b7345255470932d202ee5d49942", + "trace_id": "5e0f0d6a5a6442a38932b02d7f72ed6c", "warnings": [], "timing_ms": { - "total": 7, + "total": 8, "by_step": { "coverage": 0, "response_cache_layer1": 1 @@ -66,30 +66,30 @@ { "warnings": [], "timing_ms": { - "total": 2889, + "total": 4401, "by_step": { - "recall": 411, + "recall": 1271, "phase_resolve_places": 0, "phase_check_entities": 0, - "shape_arcs": 3, - "shape_probe_coverage": 32, - "shape_probe": 148, - "shape_groups": 58, - "shape_labels": 11, - "shape_admission": 1, + "shape_arcs": 108, + "shape_probe_coverage": 4, + "shape_probe": 113, + "shape_groups": 72, + "shape_labels": 12, + "shape_admission": 0, "phase_derive_shapes": 0, - "shape": 364, + "shape": 524, "phase_prune_and_rank": 0, - "bind": 440, - "phase_bind": 315, - "phase_settle": 55, - "phase_place_bindings": 25, + "bind": 482, + "phase_bind": 205, + "phase_settle": 57, + "phase_place_bindings": 34, "phase_facet_requests": 0, - "materialise": 471, - "phase_materialise": 208, - "answer": 45, - "options": 348, - "phase_outcome": 207 + "materialise": 686, + "phase_materialise": 225, + "answer": 28, + "options": 685, + "phase_outcome": 204 } }, "restatement": { @@ -1433,7 +1433,7 @@ "selected": [] } ], - "capability_version": "cap_88defe77cc79e0c0", + "capability_version": "cap_765c9d2a0c7529b9", "default_reading": { "applied": true, "removed_stat_vars": [] @@ -3761,30 +3761,30 @@ } ], "timing_ms": { - "total": 3494, + "total": 4561, "by_step": { - "recall": 445, + "recall": 1310, "phase_resolve_places": 0, "phase_check_entities": 0, - "shape_arcs": 1, - "shape_probe_coverage": 6, - "shape_probe": 380, - "shape_groups": 80, + "shape_arcs": 117, + "shape_probe_coverage": 28, + "shape_probe": 126, + "shape_groups": 83, "shape_labels": 12, "shape_admission": 1, "phase_derive_shapes": 0, - "shape": 785, + "shape": 753, "phase_prune_and_rank": 0, - "bind": 385, - "phase_bind": 179, - "phase_settle": 56, - "phase_place_bindings": 45, + "bind": 309, + "phase_bind": 209, + "phase_settle": 82, + "phase_place_bindings": 25, "phase_facet_requests": 0, - "materialise": 1028, - "phase_materialise": 194, - "answer": 42, - "options": 209, - "phase_outcome": 126 + "materialise": 1061, + "phase_materialise": 233, + "answer": 29, + "options": 385, + "phase_outcome": 165 } }, "restatement": { @@ -5128,7 +5128,7 @@ "selected": [] } ], - "capability_version": "cap_88defe77cc79e0c0", + "capability_version": "cap_765c9d2a0c7529b9", "default_reading": { "applied": true, "removed_stat_vars": [] @@ -7461,30 +7461,30 @@ } ], "timing_ms": { - "total": 1747, + "total": 2851, "by_step": { - "recall": 2, + "recall": 360, "phase_resolve_places": 0, "phase_check_entities": 0, - "shape_arcs": 5, - "shape_probe_coverage": 5, - "shape_probe": 124, - "shape_groups": 68, - "shape_labels": 13, - "shape_admission": 1, + "shape_arcs": 4, + "shape_probe_coverage": 2, + "shape_probe": 121, + "shape_groups": 841, + "shape_labels": 17, + "shape_admission": 4, "phase_derive_shapes": 0, - "shape": 405, + "shape": 1100, "phase_prune_and_rank": 0, - "bind": 687, - "phase_bind": 24, - "phase_settle": 6, - "phase_place_bindings": 10, + "bind": 261, + "phase_bind": 16, + "phase_settle": 7, + "phase_place_bindings": 554, "phase_facet_requests": 0, - "materialise": 296, + "materialise": 96, "phase_materialise": 17, - "answer": 7, - "options": 256, - "phase_outcome": 37 + "answer": 239, + "options": 188, + "phase_outcome": 13 } }, "restatement": { @@ -8921,7 +8921,7 @@ } ], "query_qualifiers": [], - "capability_version": "cap_88defe77cc79e0c0", + "capability_version": "cap_765c9d2a0c7529b9", "default_reading": { "applied": true, "removed_stat_vars": [ @@ -9454,7 +9454,7 @@ } ], "query_qualifiers": [], - "capability_version": "cap_88defe77cc79e0c0", + "capability_version": "cap_765c9d2a0c7529b9", "default_reading": { "applied": true, "removed_stat_vars": [ @@ -10027,7 +10027,8 @@ }, "options": { "format": "parquet", - "bundle": false + "bundle": false, + "without_party_totals": true } } }, @@ -10035,7 +10036,7 @@ "status": 200, "headers": { "content-type": "application/json", - "x-dfo-trace-id": "0c2e351b089a4167a729427dd00094bc" + "x-dfo-trace-id": "9b2918c16ee54353a38b2401d62c118a" }, "json": { "schema_version": 1, @@ -14635,7 +14636,7 @@ "frame_grammar_version": "1.1.0", "origin_catalogue_build_id": "20261019T174519Z-2e5e8cfd", "served_from": "head", - "confirmed_at": "2026-10-25T17:30:43.831621+00:00" + "confirmed_at": "2026-10-26T09:18:03.336477+00:00" }, "warnings": [], "diagnostics": [ @@ -14651,7 +14652,8 @@ "rendering": { "bundle": false, "format": "parquet", - "layout": 4 + "layout": 4, + "without_party_totals": true }, "bytes": 16208, "media_type": "application/vnd.apache.parquet", @@ -14975,7 +14977,7 @@ "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": "f3fc6fc6e041416f89eb852fb8b0a484" + "x-dfo-trace-id": "b06362d84bb845e786735d92808b1b48" } } }, @@ -15060,7 +15062,8 @@ }, "options": { "format": "parquet", - "bundle": false + "bundle": false, + "without_party_totals": true } } }, @@ -15068,7 +15071,7 @@ "status": 200, "headers": { "content-type": "application/json", - "x-dfo-trace-id": "8f823376876f48a9a6cd8187edb64b15" + "x-dfo-trace-id": "4e3b97d6e0814dc7ae89509dcb63b46b" }, "json": { "schema_version": 1, @@ -15245,7 +15248,7 @@ "frame_grammar_version": "1.1.0", "origin_catalogue_build_id": "20261019T174519Z-2e5e8cfd", "served_from": "head", - "confirmed_at": "2026-10-25T17:30:44.944825+00:00" + "confirmed_at": "2026-10-26T09:18:05.070107+00:00" }, "warnings": [], "diagnostics": [ @@ -15261,7 +15264,8 @@ "rendering": { "bundle": false, "format": "parquet", - "layout": 4 + "layout": 4, + "without_party_totals": true }, "bytes": 6545, "media_type": "application/vnd.apache.parquet", @@ -15455,7 +15459,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": "a316c99f2ac4411bbb3ea29594a06b35" + "x-dfo-trace-id": "dd6c261d3d2e4566bdc4071ef3834710" } } }, @@ -15492,35 +15496,35 @@ "rows": 644, "columns": [ "part", - "stat_var", - "financingProvider", + "time_period", "financingProvider_label", + "financingRecipient_label", + "observationAbout_label", + "crsPurpose_label", + "value", + "unit_label", + "crsTypeOfFlow_label", + "provenance_label", + "financingProvider", "financingProvider_kind", "financingRecipient", - "financingRecipient_label", "financingRecipient_kind", "crsCooperationModality", "crsCooperationModality_label", "crsPurpose", - "crsPurpose_label", "crsTypeOfFinance", "crsTypeOfFinance_label", "crsTypeOfFlow", - "crsTypeOfFlow_label", - "time_period", - "value", "unit", - "unit_label", "currency", "price_basis", "base_year", "measurementMethod", "measurementMethod_label", "provenance", - "provenance_label", "stat_var_label", "observationAbout", - "observationAbout_label" + "stat_var" ], "part_rows": [ { 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 e9cfcb8..e20fbd8 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": "99e62038ceb4b459c2ac699549076ff123c166aa", - "recorded_at": "2026-10-25T17:35:00Z" + "dfo_commit": "d80df9f5fd598b7345255470932d202ee5d49942", + "recorded_at": "2026-10-26T09:22:08Z" }, "call": [ { @@ -35,7 +35,7 @@ "status": 200, "headers": { "content-type": "application/json", - "x-dfo-trace-id": "ac85a057c1634b21acdf56582a7a2b14" + "x-dfo-trace-id": "bffd660858754e239446c0e2c32a7593" }, "json": { "schema_version": 1, @@ -46,11 +46,11 @@ "extract_skipped": false }, "diagnostics": { - "engine_build": "99e62038ceb4b459c2ac699549076ff123c166aa", - "trace_id": "ac85a057c1634b21acdf56582a7a2b14", + "engine_build": "d80df9f5fd598b7345255470932d202ee5d49942", + "trace_id": "bffd660858754e239446c0e2c32a7593", "warnings": [], "timing_ms": { - "total": 343, + "total": 389, "by_step": { "coverage": 0, "extract": 0, @@ -72,30 +72,30 @@ "variable_text": "debt service", "warnings": [], "timing_ms": { - "total": 338, + "total": 385, "by_step": { "recall": 1, "phase_resolve_places": 0, "phase_check_entities": 0, - "shape_arcs": 2, - "shape_probe_coverage": 18, - "shape_probe": 19, - "shape_groups": 7, - "shape_labels": 12, - "shape_admission": 0, + "shape_arcs": 3, + "shape_probe_coverage": 20, + "shape_probe": 22, + "shape_groups": 6, + "shape_labels": 11, + "shape_admission": 1, "phase_derive_shapes": 0, - "shape": 116, + "shape": 127, "phase_prune_and_rank": 0, - "bind": 80, - "phase_bind": 14, - "phase_settle": 5, + "bind": 102, + "phase_bind": 15, + "phase_settle": 6, "phase_place_bindings": 13, "phase_facet_requests": 0, "materialise": 11, - "phase_materialise": 23, + "phase_materialise": 37, "answer": 3, - "options": 8, - "phase_outcome": 64 + "options": 9, + "phase_outcome": 61 } }, "restatement": { @@ -1288,7 +1288,7 @@ } ], "query_qualifiers": [], - "capability_version": "cap_88defe77cc79e0c0", + "capability_version": "cap_765c9d2a0c7529b9", "default_reading": { "applied": true, "removed_stat_vars": [] @@ -3273,18 +3273,18 @@ "variable_text": "price of tea", "warnings": [], "timing_ms": { - "total": 15, + "total": 18, "by_step": { - "recall": 1, + "recall": 0, "phase_resolve_places": 0, "phase_check_entities": 0, "shape_arcs": 1, - "shape_probe": 4, + "shape_probe": 2, "shape_groups": 1, "shape_labels": 0, "shape_admission": 0, "phase_derive_shapes": 0, - "shape": 14, + "shape": 18, "phase_prune_and_rank": 0 } }, @@ -3715,7 +3715,8 @@ }, "options": { "format": "parquet", - "bundle": false + "bundle": false, + "without_party_totals": true } } }, @@ -3723,7 +3724,7 @@ "status": 200, "headers": { "content-type": "application/json", - "x-dfo-trace-id": "c2a42c72af28496191a0216c462106b3" + "x-dfo-trace-id": "a6a95e93a4134cbca3ef315e6bb5c6fb" }, "json": { "schema_version": 1, @@ -3963,7 +3964,7 @@ "frame_grammar_version": "1.1.0", "origin_catalogue_build_id": "20261012T000033Z-84777283", "served_from": "head", - "confirmed_at": "2026-10-25T17:30:37.872174+00:00" + "confirmed_at": "2026-10-26T09:17:55.468442+00:00" }, "warnings": [ { @@ -3985,7 +3986,8 @@ "rendering": { "bundle": false, "format": "parquet", - "layout": 4 + "layout": 4, + "without_party_totals": true }, "bytes": 6095, "media_type": "application/vnd.apache.parquet", @@ -4201,7 +4203,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": "f0e08c1d19c545bca64898e7b8d80bfb" + "x-dfo-trace-id": "a835d2fa775c43b181cc16faf6a63b45" } } }, @@ -4242,22 +4244,22 @@ "dataset": { "rows": 55, "columns": [ - "stat_var", + "time_period", + "financingRecipient_label", + "value", + "unit_label", + "provenance_label", "stat_var_label", "financingRecipient", - "financingRecipient_label", "financingRecipient_kind", - "time_period", - "value", "unit", - "unit_label", "currency", "price_basis", "base_year", "measurementMethod", "measurementMethod_label", "provenance", - "provenance_label" + "stat_var" ], "complete": false, "members": [ 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 0815b98..b5cb905 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": "99e62038ceb4b459c2ac699549076ff123c166aa", - "recorded_at": "2026-10-25T17:34:59Z" + "dfo_commit": "d80df9f5fd598b7345255470932d202ee5d49942", + "recorded_at": "2026-10-26T09:22:08Z" }, "call": [ { @@ -34,7 +34,7 @@ "status": 200, "headers": { "content-type": "application/json", - "x-dfo-trace-id": "38ca03326c514418af8164d5740ec677" + "x-dfo-trace-id": "86b361f85db44a29b3d711350962ca73" }, "json": { "schema_version": 1, @@ -45,14 +45,14 @@ "extract_skipped": false }, "diagnostics": { - "engine_build": "99e62038ceb4b459c2ac699549076ff123c166aa", - "trace_id": "38ca03326c514418af8164d5740ec677", + "engine_build": "d80df9f5fd598b7345255470932d202ee5d49942", + "trace_id": "86b361f85db44a29b3d711350962ca73", "warnings": [], "timing_ms": { - "total": 492, + "total": 456, "by_step": { "coverage": 0, - "extract": 1, + "extract": 0, "cache_lookup": 0 } }, @@ -71,30 +71,30 @@ "variable_text": "debt service", "warnings": [], "timing_ms": { - "total": 486, + "total": 452, "by_step": { - "recall": 0, + "recall": 1, "phase_resolve_places": 0, "phase_check_entities": 0, "shape_arcs": 2, - "shape_probe_coverage": 15, - "shape_probe": 105, - "shape_groups": 7, - "shape_labels": 11, + "shape_probe_coverage": 17, + "shape_probe": 101, + "shape_groups": 8, + "shape_labels": 14, "shape_admission": 0, "phase_derive_shapes": 0, - "shape": 219, + "shape": 225, "phase_prune_and_rank": 0, - "bind": 112, - "phase_bind": 14, + "bind": 77, + "phase_bind": 17, "phase_settle": 5, - "phase_place_bindings": 12, + "phase_place_bindings": 14, "phase_facet_requests": 0, "materialise": 11, "phase_materialise": 23, "answer": 2, - "options": 8, - "phase_outcome": 80 + "options": 9, + "phase_outcome": 68 } }, "restatement": { @@ -1287,7 +1287,7 @@ } ], "query_qualifiers": [], - "capability_version": "cap_88defe77cc79e0c0", + "capability_version": "cap_765c9d2a0c7529b9", "default_reading": { "applied": true, "removed_stat_vars": [] @@ -3272,18 +3272,18 @@ "variable_text": "price of tea", "warnings": [], "timing_ms": { - "total": 100, + "total": 121, "by_step": { "recall": 0, "phase_resolve_places": 0, "phase_check_entities": 0, - "shape_arcs": 2, - "shape_probe": 91, + "shape_arcs": 1, + "shape_probe": 96, "shape_groups": 1, "shape_labels": 0, - "shape_admission": 1, + "shape_admission": 0, "phase_derive_shapes": 0, - "shape": 100, + "shape": 121, "phase_prune_and_rank": 0 } }, @@ -3653,7 +3653,7 @@ "error": { "class": "IncompleteAnswerError", "code": "answer_incomplete", - "trace_id": "38ca03326c514418af8164d5740ec677" + "trace_id": "86b361f85db44a29b3d711350962ca73" } } ] 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 7cd19fc..29aeeb4 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": "355b1d08f8b442af87e20ecc65522a53" + "x-dfo-trace-id": "989481cf76744b4cbddf1aff890cda9c" }, "json": { "schema_version": 1, @@ -45,8 +45,8 @@ "extract_skipped": true }, "diagnostics": { - "engine_build": "99e62038ceb4b459c2ac699549076ff123c166aa", - "trace_id": "355b1d08f8b442af87e20ecc65522a53", + "engine_build": "d80df9f5fd598b7345255470932d202ee5d49942", + "trace_id": "989481cf76744b4cbddf1aff890cda9c", "warnings": [], "timing_ms": { "total": 1, @@ -68,9 +68,9 @@ "variable_text": "ODA disbursements", "warnings": [], "timing_ms": { - "total": 0, + "total": 117, "by_step": { - "recall": 0, + "recall": 117, "phase_resolve_places": 0, "phase_check_entities": 0 } @@ -307,7 +307,7 @@ "status": 200, "headers": { "content-type": "application/json", - "x-dfo-trace-id": "13f7792a23294f7b929699cddc6d7713" + "x-dfo-trace-id": "7cbd24b2c1a0457da3df6702b8caf3aa" }, "json": { "schema_version": 1, @@ -316,11 +316,11 @@ "extract_skipped": true }, "diagnostics": { - "engine_build": "99e62038ceb4b459c2ac699549076ff123c166aa", - "trace_id": "13f7792a23294f7b929699cddc6d7713", + "engine_build": "d80df9f5fd598b7345255470932d202ee5d49942", + "trace_id": "7cbd24b2c1a0457da3df6702b8caf3aa", "warnings": [], "timing_ms": { - "total": 3414, + "total": 1050, "by_step": { "coverage": 0 } @@ -346,30 +346,30 @@ } ], "timing_ms": { - "total": 3410, + "total": 1045, "by_step": { "recall": 0, "phase_resolve_places": 0, "phase_check_entities": 0, "shape_arcs": 1, - "shape_probe_coverage": 7, - "shape_probe": 2417, - "shape_groups": 58, + "shape_probe_coverage": 10, + "shape_probe": 104, + "shape_groups": 56, "shape_labels": 1, - "shape_admission": 0, + "shape_admission": 1, "phase_derive_shapes": 0, - "shape": 2795, + "shape": 473, "phase_prune_and_rank": 0, - "bind": 138, - "phase_bind": 188, - "phase_settle": 9, - "phase_place_bindings": 80, + "bind": 105, + "phase_bind": 185, + "phase_settle": 8, + "phase_place_bindings": 77, "phase_facet_requests": 0, "materialise": 17, - "phase_materialise": 6, - "answer": 10, - "options": 6, - "phase_outcome": 161 + "phase_materialise": 5, + "answer": 9, + "options": 26, + "phase_outcome": 140 } }, "restatement": { @@ -1227,7 +1227,7 @@ "start_year": 2018, "end_year": 2018 }, - "capability_version": "cap_88defe77cc79e0c0", + "capability_version": "cap_765c9d2a0c7529b9", "default_reading": { "applied": true, "removed_stat_vars": [] 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 259d31c..788a784 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": "7abc6f06215b4187a4280d87d6f8a51a" + "x-dfo-trace-id": "c7cb40f3790f4a15a0ddcad0cc93c9bb" }, "json": { "schema_version": 1, @@ -44,8 +44,8 @@ "extract_skipped": true }, "diagnostics": { - "engine_build": "99e62038ceb4b459c2ac699549076ff123c166aa", - "trace_id": "7abc6f06215b4187a4280d87d6f8a51a", + "engine_build": "d80df9f5fd598b7345255470932d202ee5d49942", + "trace_id": "c7cb40f3790f4a15a0ddcad0cc93c9bb", "warnings": [], "timing_ms": { "total": 3, @@ -67,30 +67,30 @@ "variable_text": "ODA disbursements for basic health care", "warnings": [], "timing_ms": { - "total": 1669, + "total": 3011, "by_step": { - "recall": 397, + "recall": 457, "phase_resolve_places": 0, "phase_check_entities": 0, - "shape_arcs": 1, - "shape_probe_coverage": 4, - "shape_probe": 115, - "shape_groups": 53, + "shape_arcs": 2, + "shape_probe_coverage": 8, + "shape_probe": 114, + "shape_groups": 579, "shape_labels": 1, - "shape_admission": 1, + "shape_admission": 2, "phase_derive_shapes": 0, - "shape": 276, + "shape": 1247, "phase_prune_and_rank": 0, - "bind": 214, - "phase_bind": 203, - "phase_settle": 45, - "phase_place_bindings": 20, + "bind": 266, + "phase_bind": 327, + "phase_settle": 46, + "phase_place_bindings": 57, "phase_facet_requests": 0, - "materialise": 28, - "phase_materialise": 196, - "answer": 145, - "options": 50, - "phase_outcome": 95 + "materialise": 44, + "phase_materialise": 200, + "answer": 220, + "options": 55, + "phase_outcome": 92 } }, "restatement": { @@ -1194,7 +1194,7 @@ "selected": [] } ], - "capability_version": "cap_88defe77cc79e0c0", + "capability_version": "cap_765c9d2a0c7529b9", "default_reading": { "applied": true, "removed_stat_vars": [] @@ -3784,7 +3784,8 @@ }, "options": { "format": "parquet", - "bundle": false + "bundle": false, + "without_party_totals": true } } }, @@ -3792,7 +3793,7 @@ "status": 200, "headers": { "content-type": "application/json", - "x-dfo-trace-id": "70ac3c153571497dab413643b6537466" + "x-dfo-trace-id": "4c3f35c8c0d44b99941a73a9519b41d2" }, "json": { "schema_version": 1, @@ -4193,7 +4194,7 @@ "frame_grammar_version": "1.1.0", "origin_catalogue_build_id": "20261011T194155Z-80081f08", "served_from": "head", - "confirmed_at": "2026-10-25T17:22:10.027136+00:00" + "confirmed_at": "2026-10-26T09:17:22.037029+00:00" }, "warnings": [ { @@ -4215,7 +4216,8 @@ "rendering": { "bundle": false, "format": "parquet", - "layout": 4 + "layout": 4, + "without_party_totals": true }, "bytes": 9842, "media_type": "application/vnd.apache.parquet", @@ -4538,7 +4540,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": "d2d4306f79d2411ebcd110cc1e26f49d" + "x-dfo-trace-id": "333ab72de55449ed8288a5f458406a4c" } } }, @@ -4573,32 +4575,32 @@ "dataset": { "rows": 30, "columns": [ - "stat_var", - "financingProvider", + "time_period", "financingProvider_label", + "financingRecipient_label", + "crsPurpose_label", + "value", + "unit_label", + "crsTypeOfFlow_label", + "provenance_label", + "financingProvider", "financingProvider_kind", "financingRecipient", - "financingRecipient_label", "financingRecipient_kind", "crsCooperationModality", "crsCooperationModality_label", "crsPurpose", - "crsPurpose_label", "crsTypeOfFinance", "crsTypeOfFinance_label", "crsTypeOfFlow", - "crsTypeOfFlow_label", - "time_period", - "value", "unit", - "unit_label", "currency", "price_basis", "base_year", "measurementMethod", "measurementMethod_label", "provenance", - "provenance_label" + "stat_var" ], "complete": true, "members": [ 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 f7e28bc..7f3c983 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": "38ca03326c514418af8164d5740ec677" + "x-dfo-trace-id": "86b361f85db44a29b3d711350962ca73" }, "json": { "schema_version": 1, @@ -41,14 +41,14 @@ "extract_skipped": false }, "diagnostics": { - "engine_build": "99e62038ceb4b459c2ac699549076ff123c166aa", - "trace_id": "38ca03326c514418af8164d5740ec677", + "engine_build": "d80df9f5fd598b7345255470932d202ee5d49942", + "trace_id": "86b361f85db44a29b3d711350962ca73", "warnings": [], "timing_ms": { - "total": 492, + "total": 456, "by_step": { "coverage": 0, - "extract": 1, + "extract": 0, "cache_lookup": 0 } }, @@ -67,30 +67,30 @@ "variable_text": "debt service", "warnings": [], "timing_ms": { - "total": 486, + "total": 452, "by_step": { - "recall": 0, + "recall": 1, "phase_resolve_places": 0, "phase_check_entities": 0, "shape_arcs": 2, - "shape_probe_coverage": 15, - "shape_probe": 105, - "shape_groups": 7, - "shape_labels": 11, + "shape_probe_coverage": 17, + "shape_probe": 101, + "shape_groups": 8, + "shape_labels": 14, "shape_admission": 0, "phase_derive_shapes": 0, - "shape": 219, + "shape": 225, "phase_prune_and_rank": 0, - "bind": 112, - "phase_bind": 14, + "bind": 77, + "phase_bind": 17, "phase_settle": 5, - "phase_place_bindings": 12, + "phase_place_bindings": 14, "phase_facet_requests": 0, "materialise": 11, "phase_materialise": 23, "answer": 2, - "options": 8, - "phase_outcome": 80 + "options": 9, + "phase_outcome": 68 } }, "restatement": { @@ -1283,7 +1283,7 @@ } ], "query_qualifiers": [], - "capability_version": "cap_88defe77cc79e0c0", + "capability_version": "cap_765c9d2a0c7529b9", "default_reading": { "applied": true, "removed_stat_vars": [] @@ -3268,18 +3268,18 @@ "variable_text": "price of tea", "warnings": [], "timing_ms": { - "total": 100, + "total": 121, "by_step": { "recall": 0, "phase_resolve_places": 0, "phase_check_entities": 0, - "shape_arcs": 2, - "shape_probe": 91, + "shape_arcs": 1, + "shape_probe": 96, "shape_groups": 1, "shape_labels": 0, - "shape_admission": 1, + "shape_admission": 0, "phase_derive_shapes": 0, - "shape": 100, + "shape": 121, "phase_prune_and_rank": 0 } }, @@ -3631,7 +3631,7 @@ "error": { "class": "ContractError", "code": "contract_violation", - "trace_id": "38ca03326c514418af8164d5740ec677" + "trace_id": "86b361f85db44a29b3d711350962ca73" } } ] 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 7d6aec9..e2c9390 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": "99e62038ceb4b459c2ac699549076ff123c166aa", - "recorded_at": "2026-10-25T17:35:02Z" + "dfo_commit": "d80df9f5fd598b7345255470932d202ee5d49942", + "recorded_at": "2026-10-26T09:22:10Z" }, "call": [ { @@ -34,7 +34,7 @@ "status": 200, "headers": { "content-type": "application/json", - "x-dfo-trace-id": "7c7e42dd77f94ee08a15cef4438ee7ad" + "x-dfo-trace-id": "5e0f0d6a5a6442a38932b02d7f72ed6c" }, "json": { "schema_version": 1, @@ -45,11 +45,11 @@ "extract_skipped": true }, "diagnostics": { - "engine_build": "99e62038ceb4b459c2ac699549076ff123c166aa", - "trace_id": "7c7e42dd77f94ee08a15cef4438ee7ad", + "engine_build": "d80df9f5fd598b7345255470932d202ee5d49942", + "trace_id": "5e0f0d6a5a6442a38932b02d7f72ed6c", "warnings": [], "timing_ms": { - "total": 7, + "total": 8, "by_step": { "coverage": 0, "response_cache_layer1": 1 @@ -68,30 +68,30 @@ "variable_text": "health ODA disbursements", "warnings": [], "timing_ms": { - "total": 2889, + "total": 4401, "by_step": { - "recall": 411, + "recall": 1271, "phase_resolve_places": 0, "phase_check_entities": 0, - "shape_arcs": 3, - "shape_probe_coverage": 32, - "shape_probe": 148, - "shape_groups": 58, - "shape_labels": 11, - "shape_admission": 1, + "shape_arcs": 108, + "shape_probe_coverage": 4, + "shape_probe": 113, + "shape_groups": 72, + "shape_labels": 12, + "shape_admission": 0, "phase_derive_shapes": 0, - "shape": 364, + "shape": 524, "phase_prune_and_rank": 0, - "bind": 440, - "phase_bind": 315, - "phase_settle": 55, - "phase_place_bindings": 25, + "bind": 482, + "phase_bind": 205, + "phase_settle": 57, + "phase_place_bindings": 34, "phase_facet_requests": 0, - "materialise": 471, - "phase_materialise": 208, - "answer": 45, - "options": 348, - "phase_outcome": 207 + "materialise": 686, + "phase_materialise": 225, + "answer": 28, + "options": 685, + "phase_outcome": 204 } }, "restatement": { @@ -1435,7 +1435,7 @@ "selected": [] } ], - "capability_version": "cap_88defe77cc79e0c0", + "capability_version": "cap_765c9d2a0c7529b9", "default_reading": { "applied": true, "removed_stat_vars": [] @@ -3763,30 +3763,30 @@ } ], "timing_ms": { - "total": 3494, + "total": 4561, "by_step": { - "recall": 445, + "recall": 1310, "phase_resolve_places": 0, "phase_check_entities": 0, - "shape_arcs": 1, - "shape_probe_coverage": 6, - "shape_probe": 380, - "shape_groups": 80, + "shape_arcs": 117, + "shape_probe_coverage": 28, + "shape_probe": 126, + "shape_groups": 83, "shape_labels": 12, "shape_admission": 1, "phase_derive_shapes": 0, - "shape": 785, + "shape": 753, "phase_prune_and_rank": 0, - "bind": 385, - "phase_bind": 179, - "phase_settle": 56, - "phase_place_bindings": 45, + "bind": 309, + "phase_bind": 209, + "phase_settle": 82, + "phase_place_bindings": 25, "phase_facet_requests": 0, - "materialise": 1028, - "phase_materialise": 194, - "answer": 42, - "options": 209, - "phase_outcome": 126 + "materialise": 1061, + "phase_materialise": 233, + "answer": 29, + "options": 385, + "phase_outcome": 165 } }, "restatement": { @@ -5130,7 +5130,7 @@ "selected": [] } ], - "capability_version": "cap_88defe77cc79e0c0", + "capability_version": "cap_765c9d2a0c7529b9", "default_reading": { "applied": true, "removed_stat_vars": [] @@ -7463,30 +7463,30 @@ } ], "timing_ms": { - "total": 1747, + "total": 2851, "by_step": { - "recall": 2, + "recall": 360, "phase_resolve_places": 0, "phase_check_entities": 0, - "shape_arcs": 5, - "shape_probe_coverage": 5, - "shape_probe": 124, - "shape_groups": 68, - "shape_labels": 13, - "shape_admission": 1, + "shape_arcs": 4, + "shape_probe_coverage": 2, + "shape_probe": 121, + "shape_groups": 841, + "shape_labels": 17, + "shape_admission": 4, "phase_derive_shapes": 0, - "shape": 405, + "shape": 1100, "phase_prune_and_rank": 0, - "bind": 687, - "phase_bind": 24, - "phase_settle": 6, - "phase_place_bindings": 10, + "bind": 261, + "phase_bind": 16, + "phase_settle": 7, + "phase_place_bindings": 554, "phase_facet_requests": 0, - "materialise": 296, + "materialise": 96, "phase_materialise": 17, - "answer": 7, - "options": 256, - "phase_outcome": 37 + "answer": 239, + "options": 188, + "phase_outcome": 13 } }, "restatement": { @@ -8923,7 +8923,7 @@ } ], "query_qualifiers": [], - "capability_version": "cap_88defe77cc79e0c0", + "capability_version": "cap_765c9d2a0c7529b9", "default_reading": { "applied": true, "removed_stat_vars": [ @@ -9456,7 +9456,7 @@ } ], "query_qualifiers": [], - "capability_version": "cap_88defe77cc79e0c0", + "capability_version": "cap_765c9d2a0c7529b9", "default_reading": { "applied": true, "removed_stat_vars": [ @@ -10029,7 +10029,8 @@ }, "options": { "format": "parquet", - "bundle": false + "bundle": false, + "without_party_totals": true } } }, @@ -10037,7 +10038,7 @@ "status": 200, "headers": { "content-type": "application/json", - "x-dfo-trace-id": "0c2e351b089a4167a729427dd00094bc" + "x-dfo-trace-id": "9b2918c16ee54353a38b2401d62c118a" }, "json": { "schema_version": 1, @@ -14637,7 +14638,7 @@ "frame_grammar_version": "1.1.0", "origin_catalogue_build_id": "20261019T174519Z-2e5e8cfd", "served_from": "head", - "confirmed_at": "2026-10-25T17:30:43.831621+00:00" + "confirmed_at": "2026-10-26T09:18:03.336477+00:00" }, "warnings": [], "diagnostics": [ @@ -14653,7 +14654,8 @@ "rendering": { "bundle": false, "format": "parquet", - "layout": 4 + "layout": 4, + "without_party_totals": true }, "bytes": 16208, "media_type": "application/vnd.apache.parquet", @@ -14977,7 +14979,7 @@ "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": "f3fc6fc6e041416f89eb852fb8b0a484" + "x-dfo-trace-id": "b06362d84bb845e786735d92808b1b48" } } }, @@ -15062,7 +15064,8 @@ }, "options": { "format": "parquet", - "bundle": false + "bundle": false, + "without_party_totals": true } } }, @@ -15070,7 +15073,7 @@ "status": 200, "headers": { "content-type": "application/json", - "x-dfo-trace-id": "8f823376876f48a9a6cd8187edb64b15" + "x-dfo-trace-id": "4e3b97d6e0814dc7ae89509dcb63b46b" }, "json": { "schema_version": 1, @@ -15247,7 +15250,7 @@ "frame_grammar_version": "1.1.0", "origin_catalogue_build_id": "20261019T174519Z-2e5e8cfd", "served_from": "head", - "confirmed_at": "2026-10-25T17:30:44.944825+00:00" + "confirmed_at": "2026-10-26T09:18:05.070107+00:00" }, "warnings": [], "diagnostics": [ @@ -15263,7 +15266,8 @@ "rendering": { "bundle": false, "format": "parquet", - "layout": 4 + "layout": 4, + "without_party_totals": true }, "bytes": 6545, "media_type": "application/vnd.apache.parquet", @@ -15457,7 +15461,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": "a316c99f2ac4411bbb3ea29594a06b35" + "x-dfo-trace-id": "dd6c261d3d2e4566bdc4071ef3834710" } } }, @@ -15494,35 +15498,35 @@ "rows": 644, "columns": [ "part", - "stat_var", - "financingProvider", + "time_period", "financingProvider_label", + "financingRecipient_label", + "observationAbout_label", + "crsPurpose_label", + "value", + "unit_label", + "crsTypeOfFlow_label", + "provenance_label", + "financingProvider", "financingProvider_kind", "financingRecipient", - "financingRecipient_label", "financingRecipient_kind", "crsCooperationModality", "crsCooperationModality_label", "crsPurpose", - "crsPurpose_label", "crsTypeOfFinance", "crsTypeOfFinance_label", "crsTypeOfFlow", - "crsTypeOfFlow_label", - "time_period", - "value", "unit", - "unit_label", "currency", "price_basis", "base_year", "measurementMethod", "measurementMethod_label", "provenance", - "provenance_label", "stat_var_label", "observationAbout", - "observationAbout_label" + "stat_var" ], "part_rows": [ { 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 1b42cc0..14974bf 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": "7abc6f06215b4187a4280d87d6f8a51a" + "x-dfo-trace-id": "c7cb40f3790f4a15a0ddcad0cc93c9bb" }, "json": { "schema_version": 1, @@ -41,8 +41,8 @@ "extract_skipped": true }, "diagnostics": { - "engine_build": "99e62038ceb4b459c2ac699549076ff123c166aa", - "trace_id": "7abc6f06215b4187a4280d87d6f8a51a", + "engine_build": "d80df9f5fd598b7345255470932d202ee5d49942", + "trace_id": "c7cb40f3790f4a15a0ddcad0cc93c9bb", "warnings": [], "timing_ms": { "total": 3, @@ -64,30 +64,30 @@ "variable_text": "ODA disbursements for basic health care", "warnings": [], "timing_ms": { - "total": 1669, + "total": 3011, "by_step": { - "recall": 397, + "recall": 457, "phase_resolve_places": 0, "phase_check_entities": 0, - "shape_arcs": 1, - "shape_probe_coverage": 4, - "shape_probe": 115, - "shape_groups": 53, + "shape_arcs": 2, + "shape_probe_coverage": 8, + "shape_probe": 114, + "shape_groups": 579, "shape_labels": 1, - "shape_admission": 1, + "shape_admission": 2, "phase_derive_shapes": 0, - "shape": 276, + "shape": 1247, "phase_prune_and_rank": 0, - "bind": 214, - "phase_bind": 203, - "phase_settle": 45, - "phase_place_bindings": 20, + "bind": 266, + "phase_bind": 327, + "phase_settle": 46, + "phase_place_bindings": 57, "phase_facet_requests": 0, - "materialise": 28, - "phase_materialise": 196, - "answer": 145, - "options": 50, - "phase_outcome": 95 + "materialise": 44, + "phase_materialise": 200, + "answer": 220, + "options": 55, + "phase_outcome": 92 } }, "restatement": { @@ -1124,7 +1124,7 @@ "selected": [] } ], - "capability_version": "cap_88defe77cc79e0c0", + "capability_version": "cap_765c9d2a0c7529b9", "default_reading": { "applied": true, "removed_stat_vars": [] @@ -3641,7 +3641,7 @@ "error": { "class": "ContractError", "code": "contract_violation", - "trace_id": "7abc6f06215b4187a4280d87d6f8a51a" + "trace_id": "c7cb40f3790f4a15a0ddcad0cc93c9bb" } } ] 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 7b92863..6056087 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": "7abc6f06215b4187a4280d87d6f8a51a" + "x-dfo-trace-id": "c7cb40f3790f4a15a0ddcad0cc93c9bb" }, "json": { "schema_version": 1, @@ -41,8 +41,8 @@ "extract_skipped": true }, "diagnostics": { - "engine_build": "99e62038ceb4b459c2ac699549076ff123c166aa", - "trace_id": "7abc6f06215b4187a4280d87d6f8a51a", + "engine_build": "d80df9f5fd598b7345255470932d202ee5d49942", + "trace_id": "c7cb40f3790f4a15a0ddcad0cc93c9bb", "warnings": [], "timing_ms": { "total": 3, @@ -64,30 +64,30 @@ "variable_text": "ODA disbursements for basic health care", "warnings": [], "timing_ms": { - "total": 1669, + "total": 3011, "by_step": { - "recall": 397, + "recall": 457, "phase_resolve_places": 0, "phase_check_entities": 0, - "shape_arcs": 1, - "shape_probe_coverage": 4, - "shape_probe": 115, - "shape_groups": 53, + "shape_arcs": 2, + "shape_probe_coverage": 8, + "shape_probe": 114, + "shape_groups": 579, "shape_labels": 1, - "shape_admission": 1, + "shape_admission": 2, "phase_derive_shapes": 0, - "shape": 276, + "shape": 1247, "phase_prune_and_rank": 0, - "bind": 214, - "phase_bind": 203, - "phase_settle": 45, - "phase_place_bindings": 20, + "bind": 266, + "phase_bind": 327, + "phase_settle": 46, + "phase_place_bindings": 57, "phase_facet_requests": 0, - "materialise": 28, - "phase_materialise": 196, - "answer": 145, - "options": 50, - "phase_outcome": 95 + "materialise": 44, + "phase_materialise": 200, + "answer": 220, + "options": 55, + "phase_outcome": 92 } }, "restatement": { @@ -421,7 +421,7 @@ "error": { "class": "ContractError", "code": "contract_violation", - "trace_id": "7abc6f06215b4187a4280d87d6f8a51a" + "trace_id": "c7cb40f3790f4a15a0ddcad0cc93c9bb" } } ] 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 c6897d5..6a320eb 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,14 +44,14 @@ "extract_skipped": false }, "diagnostics": { - "engine_build": "99e62038ceb4b459c2ac699549076ff123c166aa", - "trace_id": "38ca03326c514418af8164d5740ec677", + "engine_build": "d80df9f5fd598b7345255470932d202ee5d49942", + "trace_id": "86b361f85db44a29b3d711350962ca73", "warnings": [], "timing_ms": { - "total": 492, + "total": 456, "by_step": { "coverage": 0, - "extract": 1, + "extract": 0, "cache_lookup": 0 } }, @@ -70,30 +70,30 @@ "variable_text": "debt service", "warnings": [], "timing_ms": { - "total": 486, + "total": 452, "by_step": { - "recall": 0, + "recall": 1, "phase_resolve_places": 0, "phase_check_entities": 0, "shape_arcs": 2, - "shape_probe_coverage": 15, - "shape_probe": 105, - "shape_groups": 7, - "shape_labels": 11, + "shape_probe_coverage": 17, + "shape_probe": 101, + "shape_groups": 8, + "shape_labels": 14, "shape_admission": 0, "phase_derive_shapes": 0, - "shape": 219, + "shape": 225, "phase_prune_and_rank": 0, - "bind": 112, - "phase_bind": 14, + "bind": 77, + "phase_bind": 17, "phase_settle": 5, - "phase_place_bindings": 12, + "phase_place_bindings": 14, "phase_facet_requests": 0, "materialise": 11, "phase_materialise": 23, "answer": 2, - "options": 8, - "phase_outcome": 80 + "options": 9, + "phase_outcome": 68 } }, "restatement": { @@ -1286,7 +1286,7 @@ } ], "query_qualifiers": [], - "capability_version": "cap_88defe77cc79e0c0", + "capability_version": "cap_765c9d2a0c7529b9", "default_reading": { "applied": true, "removed_stat_vars": [] @@ -3271,18 +3271,18 @@ "variable_text": "price of tea", "warnings": [], "timing_ms": { - "total": 100, + "total": 121, "by_step": { "recall": 0, "phase_resolve_places": 0, "phase_check_entities": 0, - "shape_arcs": 2, - "shape_probe": 91, + "shape_arcs": 1, + "shape_probe": 96, "shape_groups": 1, "shape_labels": 0, - "shape_admission": 1, + "shape_admission": 0, "phase_derive_shapes": 0, - "shape": 100, + "shape": 121, "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 8c0eb3c..f1593e9 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,14 +44,14 @@ "extract_skipped": false }, "diagnostics": { - "engine_build": "99e62038ceb4b459c2ac699549076ff123c166aa", - "trace_id": "38ca03326c514418af8164d5740ec677", + "engine_build": "d80df9f5fd598b7345255470932d202ee5d49942", + "trace_id": "86b361f85db44a29b3d711350962ca73", "warnings": [], "timing_ms": { - "total": 492, + "total": 456, "by_step": { "coverage": 0, - "extract": 1, + "extract": 0, "cache_lookup": 0 } }, @@ -70,30 +70,30 @@ "variable_text": "debt service", "warnings": [], "timing_ms": { - "total": 486, + "total": 452, "by_step": { - "recall": 0, + "recall": 1, "phase_resolve_places": 0, "phase_check_entities": 0, "shape_arcs": 2, - "shape_probe_coverage": 15, - "shape_probe": 105, - "shape_groups": 7, - "shape_labels": 11, + "shape_probe_coverage": 17, + "shape_probe": 101, + "shape_groups": 8, + "shape_labels": 14, "shape_admission": 0, "phase_derive_shapes": 0, - "shape": 219, + "shape": 225, "phase_prune_and_rank": 0, - "bind": 112, - "phase_bind": 14, + "bind": 77, + "phase_bind": 17, "phase_settle": 5, - "phase_place_bindings": 12, + "phase_place_bindings": 14, "phase_facet_requests": 0, "materialise": 11, "phase_materialise": 23, "answer": 2, - "options": 8, - "phase_outcome": 80 + "options": 9, + "phase_outcome": 68 } }, "restatement": { @@ -1286,7 +1286,7 @@ } ], "query_qualifiers": [], - "capability_version": "cap_88defe77cc79e0c0", + "capability_version": "cap_765c9d2a0c7529b9", "default_reading": { "applied": true, "removed_stat_vars": [] @@ -3271,18 +3271,18 @@ "variable_text": "price of tea", "warnings": [], "timing_ms": { - "total": 100, + "total": 121, "by_step": { "recall": 0, "phase_resolve_places": 0, "phase_check_entities": 0, - "shape_arcs": 2, - "shape_probe": 91, + "shape_arcs": 1, + "shape_probe": 96, "shape_groups": 1, "shape_labels": 0, - "shape_admission": 1, + "shape_admission": 0, "phase_derive_shapes": 0, - "shape": 100, + "shape": 121, "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 ee7690f..ba5c570 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": "7fd4a5b5b50648999f5ead8966bcc02c" + "x-dfo-trace-id": "01cf4a9623c449759f24d249f8783de1" }, "json": { "schema_version": 1, @@ -41,14 +41,14 @@ "extract_skipped": false }, "diagnostics": { - "engine_build": "99e62038ceb4b459c2ac699549076ff123c166aa", - "trace_id": "7fd4a5b5b50648999f5ead8966bcc02c", + "engine_build": "d80df9f5fd598b7345255470932d202ee5d49942", + "trace_id": "01cf4a9623c449759f24d249f8783de1", "warnings": [], "timing_ms": { - "total": 1054, + "total": 1162, "by_step": { "coverage": 0, - "extract": 1050, + "extract": 1040, "cache_lookup": 0 } }, @@ -65,9 +65,9 @@ "variable_text": "ODA disbursements", "warnings": [], "timing_ms": { - "total": 0, + "total": 117, "by_step": { - "recall": 0, + "recall": 117, "phase_resolve_places": 0, "phase_check_entities": 0 } 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 ad1b2d6..3f2cee4 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": "7fd4a5b5b50648999f5ead8966bcc02c" + "x-dfo-trace-id": "01cf4a9623c449759f24d249f8783de1" }, "json": { "schema_version": 1, @@ -41,14 +41,14 @@ "extract_skipped": false }, "diagnostics": { - "engine_build": "99e62038ceb4b459c2ac699549076ff123c166aa", - "trace_id": "7fd4a5b5b50648999f5ead8966bcc02c", + "engine_build": "d80df9f5fd598b7345255470932d202ee5d49942", + "trace_id": "01cf4a9623c449759f24d249f8783de1", "warnings": [], "timing_ms": { - "total": 1054, + "total": 1162, "by_step": { "coverage": 0, - "extract": 1050, + "extract": 1040, "cache_lookup": 0 } }, @@ -65,9 +65,9 @@ "variable_text": "ODA disbursements", "warnings": [], "timing_ms": { - "total": 0, + "total": 117, "by_step": { - "recall": 0, + "recall": 117, "phase_resolve_places": 0, "phase_check_entities": 0 } @@ -261,7 +261,7 @@ "error": { "class": "ContractError", "code": "contract_violation", - "trace_id": "7fd4a5b5b50648999f5ead8966bcc02c" + "trace_id": "01cf4a9623c449759f24d249f8783de1" } } ] 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 b26f19d..ff7c4f0 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": "38ca03326c514418af8164d5740ec677" + "x-dfo-trace-id": "86b361f85db44a29b3d711350962ca73" }, "json": { "schema_version": 1, @@ -44,14 +44,14 @@ "extract_skipped": false }, "diagnostics": { - "engine_build": "99e62038ceb4b459c2ac699549076ff123c166aa", - "trace_id": "38ca03326c514418af8164d5740ec677", + "engine_build": "d80df9f5fd598b7345255470932d202ee5d49942", + "trace_id": "86b361f85db44a29b3d711350962ca73", "warnings": [], "timing_ms": { - "total": 492, + "total": 456, "by_step": { "coverage": 0, - "extract": 1, + "extract": 0, "cache_lookup": 0 } }, @@ -70,30 +70,30 @@ "variable_text": "debt service", "warnings": [], "timing_ms": { - "total": 486, + "total": 452, "by_step": { - "recall": 0, + "recall": 1, "phase_resolve_places": 0, "phase_check_entities": 0, "shape_arcs": 2, - "shape_probe_coverage": 15, - "shape_probe": 105, - "shape_groups": 7, - "shape_labels": 11, + "shape_probe_coverage": 17, + "shape_probe": 101, + "shape_groups": 8, + "shape_labels": 14, "shape_admission": 0, "phase_derive_shapes": 0, - "shape": 219, + "shape": 225, "phase_prune_and_rank": 0, - "bind": 112, - "phase_bind": 14, + "bind": 77, + "phase_bind": 17, "phase_settle": 5, - "phase_place_bindings": 12, + "phase_place_bindings": 14, "phase_facet_requests": 0, "materialise": 11, "phase_materialise": 23, "answer": 2, - "options": 8, - "phase_outcome": 80 + "options": 9, + "phase_outcome": 68 } }, "restatement": { @@ -1286,7 +1286,7 @@ } ], "query_qualifiers": [], - "capability_version": "cap_88defe77cc79e0c0", + "capability_version": "cap_765c9d2a0c7529b9", "default_reading": { "applied": true, "removed_stat_vars": [] @@ -3271,18 +3271,18 @@ "variable_text": "price of tea", "warnings": [], "timing_ms": { - "total": 100, + "total": 121, "by_step": { "recall": 0, "phase_resolve_places": 0, "phase_check_entities": 0, - "shape_arcs": 2, - "shape_probe": 91, + "shape_arcs": 1, + "shape_probe": 96, "shape_groups": 1, "shape_labels": 0, - "shape_admission": 1, + "shape_admission": 0, "phase_derive_shapes": 0, - "shape": 100, + "shape": 121, "phase_prune_and_rank": 0 } }, @@ -3652,7 +3652,7 @@ "error": { "class": "IncompleteAnswerError", "code": "answer_incomplete", - "trace_id": "38ca03326c514418af8164d5740ec677" + "trace_id": "86b361f85db44a29b3d711350962ca73" } } ] 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 f2eb0a9..26eaf48 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": "38ca03326c514418af8164d5740ec677" + "x-dfo-trace-id": "86b361f85db44a29b3d711350962ca73" }, "json": { "schema_version": 1, @@ -44,14 +44,14 @@ "extract_skipped": false }, "diagnostics": { - "engine_build": "99e62038ceb4b459c2ac699549076ff123c166aa", - "trace_id": "38ca03326c514418af8164d5740ec677", + "engine_build": "d80df9f5fd598b7345255470932d202ee5d49942", + "trace_id": "86b361f85db44a29b3d711350962ca73", "warnings": [], "timing_ms": { - "total": 492, + "total": 456, "by_step": { "coverage": 0, - "extract": 1, + "extract": 0, "cache_lookup": 0 } }, @@ -70,30 +70,30 @@ "variable_text": "debt service", "warnings": [], "timing_ms": { - "total": 486, + "total": 452, "by_step": { - "recall": 0, + "recall": 1, "phase_resolve_places": 0, "phase_check_entities": 0, "shape_arcs": 2, - "shape_probe_coverage": 15, - "shape_probe": 105, - "shape_groups": 7, - "shape_labels": 11, + "shape_probe_coverage": 17, + "shape_probe": 101, + "shape_groups": 8, + "shape_labels": 14, "shape_admission": 0, "phase_derive_shapes": 0, - "shape": 219, + "shape": 225, "phase_prune_and_rank": 0, - "bind": 112, - "phase_bind": 14, + "bind": 77, + "phase_bind": 17, "phase_settle": 5, - "phase_place_bindings": 12, + "phase_place_bindings": 14, "phase_facet_requests": 0, "materialise": 11, "phase_materialise": 23, "answer": 2, - "options": 8, - "phase_outcome": 80 + "options": 9, + "phase_outcome": 68 } }, "restatement": { @@ -1286,7 +1286,7 @@ } ], "query_qualifiers": [], - "capability_version": "cap_88defe77cc79e0c0", + "capability_version": "cap_765c9d2a0c7529b9", "default_reading": { "applied": true, "removed_stat_vars": [] @@ -3271,18 +3271,18 @@ "variable_text": "price of tea", "warnings": [], "timing_ms": { - "total": 100, + "total": 121, "by_step": { "recall": 0, "phase_resolve_places": 0, "phase_check_entities": 0, - "shape_arcs": 2, - "shape_probe": 91, + "shape_arcs": 1, + "shape_probe": 96, "shape_groups": 1, "shape_labels": 0, - "shape_admission": 1, + "shape_admission": 0, "phase_derive_shapes": 0, - "shape": 100, + "shape": 121, "phase_prune_and_rank": 0 } }, @@ -3646,7 +3646,7 @@ "error": { "class": "IncompleteAnswerError", "code": "answer_incomplete", - "trace_id": "38ca03326c514418af8164d5740ec677" + "trace_id": "86b361f85db44a29b3d711350962ca73" } } ] 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 8170879..0888ccb 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": "962188ce8826466e8510fb819d5dc26d" + "x-dfo-trace-id": "2de415a9f27d4ce69e4f1eb97b5951af" }, "json": { "schema_version": 1, @@ -45,14 +45,14 @@ "extract_skipped": false }, "diagnostics": { - "engine_build": "99e62038ceb4b459c2ac699549076ff123c166aa", - "trace_id": "962188ce8826466e8510fb819d5dc26d", + "engine_build": "d80df9f5fd598b7345255470932d202ee5d49942", + "trace_id": "2de415a9f27d4ce69e4f1eb97b5951af", "warnings": [], "timing_ms": { - "total": 1710, + "total": 4676, "by_step": { - "coverage": 0, - "extract": 0, + "coverage": 1, + "extract": 1, "cache_lookup": 0 } }, @@ -60,7 +60,7 @@ "input_tokens": 0, "output_tokens": 0, "cached_tokens": 0, - "jev_input_tokens": 13358, + "jev_input_tokens": 13359, "jev_output_tokens": 2855 }, "timed_out": false @@ -71,28 +71,28 @@ "variable_text": "mortality", "warnings": [], "timing_ms": { - "total": 1705, + "total": 4672, "by_step": { "recall": 1, "phase_resolve_places": 0, "phase_check_entities": 0, - "shape_arcs": 4, - "shape_probe": 2, + "shape_arcs": 6, + "shape_probe": 120, "shape_groups": 6, - "shape_labels": 1, + "shape_labels": 2, "shape_admission": 1, "phase_derive_shapes": 0, - "shape": 119, + "shape": 258, "phase_prune_and_rank": 0, - "bind": 146, - "phase_bind": 19, - "phase_settle": 2, - "phase_place_bindings": 30, + "bind": 154, + "phase_bind": 18, + "phase_settle": 1, + "phase_place_bindings": 39, "phase_facet_requests": 0, - "materialise": 21, - "phase_materialise": 25, + "materialise": 202, + "phase_materialise": 33, "answer": 30, - "phase_outcome": 1312 + "phase_outcome": 3936 } }, "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.", @@ -814,7 +814,7 @@ "start_year": 2013, "end_year": 2022 }, - "capability_version": "cap_88defe77cc79e0c0", + "capability_version": "cap_765c9d2a0c7529b9", "default_reading": { "applied": true, "removed_stat_vars": [] @@ -1597,6 +1597,15 @@ "value_kind": "enum_value" } }, + { + "value": { + "ref": { + "ref": "Years0", + "label": "Years 0" + }, + "value_kind": "enum_value" + } + }, { "value": { "ref": { @@ -1813,6 +1822,15 @@ "value_kind": "enum_value" } }, + { + "value": { + "ref": { + "ref": "Years85", + "label": "Years 85" + }, + "value_kind": "enum_value" + } + }, { "value": { "ref": { @@ -2348,7 +2366,7 @@ "start_year": 2013, "end_year": 2022 }, - "capability_version": "cap_88defe77cc79e0c0", + "capability_version": "cap_765c9d2a0c7529b9", "default_reading": { "applied": true, "removed_stat_vars": [] @@ -2647,7 +2665,7 @@ "status": 200, "headers": { "content-type": "application/json", - "x-dfo-trace-id": "3e98392a1d6a49edbf871ef6d6a14e8d" + "x-dfo-trace-id": "97f100748b194ca09afc06c9dc1ac81d" }, "json": { "schema_version": 1, @@ -2656,11 +2674,11 @@ "extract_skipped": true }, "diagnostics": { - "engine_build": "99e62038ceb4b459c2ac699549076ff123c166aa", - "trace_id": "3e98392a1d6a49edbf871ef6d6a14e8d", + "engine_build": "d80df9f5fd598b7345255470932d202ee5d49942", + "trace_id": "97f100748b194ca09afc06c9dc1ac81d", "warnings": [], "timing_ms": { - "total": 332, + "total": 345, "by_step": { "coverage": 0 } @@ -2673,19 +2691,19 @@ "variable_text": "mortality", "warnings": [], "timing_ms": { - "total": 265, + "total": 284, "by_step": { "validate": 0, "walk": 0, "reread_arcs": 0, "detect_edits": 0, "resolve_survivors": 0, - "shape": 164, + "shape": 174, "bind": 0, "where_places": 0, - "materialise": 99, + "materialise": 107, "answer": 2, - "options": 0 + "options": 1 } }, "entity_refs": [], @@ -3213,7 +3231,7 @@ "start_year": 2013, "end_year": 2022 }, - "capability_version": "cap_88defe77cc79e0c0" + "capability_version": "cap_765c9d2a0c7529b9" }, "confidence": "high", "available_at_place": true, 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 23bd82b..39aad61 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 @@ -34,7 +34,7 @@ "status": 200, "headers": { "content-type": "application/json", - "x-dfo-trace-id": "962188ce8826466e8510fb819d5dc26d" + "x-dfo-trace-id": "2de415a9f27d4ce69e4f1eb97b5951af" }, "json": { "schema_version": 1, @@ -45,14 +45,14 @@ "extract_skipped": false }, "diagnostics": { - "engine_build": "99e62038ceb4b459c2ac699549076ff123c166aa", - "trace_id": "962188ce8826466e8510fb819d5dc26d", + "engine_build": "d80df9f5fd598b7345255470932d202ee5d49942", + "trace_id": "2de415a9f27d4ce69e4f1eb97b5951af", "warnings": [], "timing_ms": { - "total": 1710, + "total": 4676, "by_step": { - "coverage": 0, - "extract": 0, + "coverage": 1, + "extract": 1, "cache_lookup": 0 } }, @@ -60,7 +60,7 @@ "input_tokens": 0, "output_tokens": 0, "cached_tokens": 0, - "jev_input_tokens": 13358, + "jev_input_tokens": 13359, "jev_output_tokens": 2855 }, "timed_out": false @@ -71,28 +71,28 @@ "variable_text": "mortality", "warnings": [], "timing_ms": { - "total": 1705, + "total": 4672, "by_step": { "recall": 1, "phase_resolve_places": 0, "phase_check_entities": 0, - "shape_arcs": 4, - "shape_probe": 2, + "shape_arcs": 6, + "shape_probe": 120, "shape_groups": 6, - "shape_labels": 1, + "shape_labels": 2, "shape_admission": 1, "phase_derive_shapes": 0, - "shape": 119, + "shape": 258, "phase_prune_and_rank": 0, - "bind": 146, - "phase_bind": 19, - "phase_settle": 2, - "phase_place_bindings": 30, + "bind": 154, + "phase_bind": 18, + "phase_settle": 1, + "phase_place_bindings": 39, "phase_facet_requests": 0, - "materialise": 21, - "phase_materialise": 25, + "materialise": 202, + "phase_materialise": 33, "answer": 30, - "phase_outcome": 1312 + "phase_outcome": 3936 } }, "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.", @@ -814,7 +814,7 @@ "start_year": 2013, "end_year": 2022 }, - "capability_version": "cap_88defe77cc79e0c0", + "capability_version": "cap_765c9d2a0c7529b9", "default_reading": { "applied": true, "removed_stat_vars": [] @@ -1597,6 +1597,15 @@ "value_kind": "enum_value" } }, + { + "value": { + "ref": { + "ref": "Years0", + "label": "Years 0" + }, + "value_kind": "enum_value" + } + }, { "value": { "ref": { @@ -1813,6 +1822,15 @@ "value_kind": "enum_value" } }, + { + "value": { + "ref": { + "ref": "Years85", + "label": "Years 85" + }, + "value_kind": "enum_value" + } + }, { "value": { "ref": { @@ -2348,7 +2366,7 @@ "start_year": 2013, "end_year": 2022 }, - "capability_version": "cap_88defe77cc79e0c0", + "capability_version": "cap_765c9d2a0c7529b9", "default_reading": { "applied": true, "removed_stat_vars": [] @@ -2629,7 +2647,7 @@ "status": 200, "headers": { "content-type": "application/json", - "x-dfo-trace-id": "3e98392a1d6a49edbf871ef6d6a14e8d" + "x-dfo-trace-id": "97f100748b194ca09afc06c9dc1ac81d" }, "json": { "schema_version": 1, @@ -2638,11 +2656,11 @@ "extract_skipped": true }, "diagnostics": { - "engine_build": "99e62038ceb4b459c2ac699549076ff123c166aa", - "trace_id": "3e98392a1d6a49edbf871ef6d6a14e8d", + "engine_build": "d80df9f5fd598b7345255470932d202ee5d49942", + "trace_id": "97f100748b194ca09afc06c9dc1ac81d", "warnings": [], "timing_ms": { - "total": 332, + "total": 345, "by_step": { "coverage": 0 } @@ -2655,19 +2673,19 @@ "variable_text": "mortality", "warnings": [], "timing_ms": { - "total": 265, + "total": 284, "by_step": { "validate": 0, "walk": 0, "reread_arcs": 0, "detect_edits": 0, "resolve_survivors": 0, - "shape": 164, + "shape": 174, "bind": 0, "where_places": 0, - "materialise": 99, + "materialise": 107, "answer": 2, - "options": 0 + "options": 1 } }, "entity_refs": [], @@ -3186,7 +3204,7 @@ "start_year": 2013, "end_year": 2022 }, - "capability_version": "cap_88defe77cc79e0c0" + "capability_version": "cap_765c9d2a0c7529b9" }, "confidence": "high", "available_at_place": true, 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 57e5358..9c99077 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": "99e62038ceb4b459c2ac699549076ff123c166aa", - "recorded_at": "2026-10-25T17:37:25Z" + "dfo_commit": "d80df9f5fd598b7345255470932d202ee5d49942", + "recorded_at": "2026-10-26T09:23:52Z" }, "call": [ { @@ -36,7 +36,7 @@ "status": 200, "headers": { "content-type": "application/json", - "x-dfo-trace-id": "4ef48e41be8145e79e3349df65b71540" + "x-dfo-trace-id": "77333f3756d7434fa7476addd497eff0" }, "json": { "schema_version": 1, @@ -47,14 +47,14 @@ "extract_skipped": false }, "diagnostics": { - "engine_build": "99e62038ceb4b459c2ac699549076ff123c166aa", - "trace_id": "4ef48e41be8145e79e3349df65b71540", + "engine_build": "d80df9f5fd598b7345255470932d202ee5d49942", + "trace_id": "77333f3756d7434fa7476addd497eff0", "warnings": [], "timing_ms": { - "total": 4896, + "total": 4076, "by_step": { "coverage": 0, - "extract": 1129, + "extract": 1095, "cache_lookup": 0 } }, @@ -62,7 +62,7 @@ "input_tokens": 2242, "output_tokens": 197, "cached_tokens": 843, - "jev_input_tokens": 21367, + "jev_input_tokens": 21368, "jev_output_tokens": 4607 }, "timed_out": false @@ -79,28 +79,28 @@ } ], "timing_ms": { - "total": 3462, + "total": 2673, "by_step": { - "recall": 2, + "recall": 1, "phase_resolve_places": 0, "phase_check_entities": 0, - "shape_arcs": 8, - "shape_probe": 161, - "shape_groups": 7, + "shape_arcs": 5, + "shape_probe": 91, + "shape_groups": 6, "shape_labels": 1, - "shape_admission": 2, + "shape_admission": 1, "phase_derive_shapes": 0, - "shape": 282, + "shape": 214, "phase_prune_and_rank": 0, - "bind": 137, - "phase_bind": 15, + "bind": 134, + "phase_bind": 13, "phase_settle": 1, "phase_place_bindings": 34, "phase_facet_requests": 0, - "materialise": 107, - "phase_materialise": 27, - "answer": 69, - "phase_outcome": 2788 + "materialise": 106, + "phase_materialise": 29, + "answer": 54, + "phase_outcome": 2087 } }, "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.", @@ -844,7 +844,7 @@ "start_year": 2013, "end_year": 2022 }, - "capability_version": "cap_88defe77cc79e0c0", + "capability_version": "cap_765c9d2a0c7529b9", "default_reading": { "applied": true, "removed_stat_vars": [] @@ -1627,6 +1627,15 @@ "value_kind": "enum_value" } }, + { + "value": { + "ref": { + "ref": "Years0", + "label": "Years 0" + }, + "value_kind": "enum_value" + } + }, { "value": { "ref": { @@ -1843,6 +1852,15 @@ "value_kind": "enum_value" } }, + { + "value": { + "ref": { + "ref": "Years85", + "label": "Years 85" + }, + "value_kind": "enum_value" + } + }, { "value": { "ref": { @@ -2378,7 +2396,7 @@ "start_year": 2013, "end_year": 2022 }, - "capability_version": "cap_88defe77cc79e0c0", + "capability_version": "cap_765c9d2a0c7529b9", "default_reading": { "applied": true, "removed_stat_vars": [] @@ -2414,30 +2432,30 @@ } ], "timing_ms": { - "total": 3762, + "total": 2976, "by_step": { - "recall": 1361, - "phase_resolve_places": 0, + "recall": 771, + "phase_resolve_places": 1, "phase_check_entities": 0, - "shape_arcs": 22, - "shape_probe_coverage": 5, - "shape_probe": 130, - "shape_groups": 121, + "shape_arcs": 2, + "shape_probe_coverage": 21, + "shape_probe": 111, + "shape_groups": 66, "shape_labels": 0, "shape_admission": 0, "phase_derive_shapes": 0, - "shape": 846, + "shape": 621, "phase_prune_and_rank": 0, - "bind": 653, - "phase_bind": 331, - "phase_settle": 17, - "phase_place_bindings": 102, + "bind": 681, + "phase_bind": 341, + "phase_settle": 11, + "phase_place_bindings": 111, "phase_facet_requests": 0, "materialise": 20, - "phase_materialise": 5, - "answer": 263, - "options": 8, - "phase_outcome": 156 + "phase_materialise": 4, + "answer": 257, + "options": 11, + "phase_outcome": 147 } }, "restatement": { @@ -3312,7 +3330,7 @@ "start_year": 2013, "end_year": 2022 }, - "capability_version": "cap_88defe77cc79e0c0", + "capability_version": "cap_765c9d2a0c7529b9", "default_reading": { "applied": true, "removed_stat_vars": [] @@ -6073,7 +6091,7 @@ "status": 200, "headers": { "content-type": "application/json", - "x-dfo-trace-id": "559262a87e7a4f79b1a4761af98f0be8" + "x-dfo-trace-id": "73fbf797c20a40a4851f5d88882cf25a" }, "json": { "schema_version": 1, @@ -6082,11 +6100,11 @@ "extract_skipped": true }, "diagnostics": { - "engine_build": "99e62038ceb4b459c2ac699549076ff123c166aa", - "trace_id": "559262a87e7a4f79b1a4761af98f0be8", + "engine_build": "d80df9f5fd598b7345255470932d202ee5d49942", + "trace_id": "73fbf797c20a40a4851f5d88882cf25a", "warnings": [], "timing_ms": { - "total": 1249, + "total": 1963, "by_step": { "coverage": 0 } @@ -6099,19 +6117,19 @@ "variable_text": "mortality", "warnings": [], "timing_ms": { - "total": 298, + "total": 277, "by_step": { "validate": 0, "walk": 0, "reread_arcs": 0, "detect_edits": 0, "resolve_survivors": 0, - "shape": 194, - "bind": 0, - "where_places": 1, - "materialise": 102, + "shape": 178, + "bind": 1, + "where_places": 0, + "materialise": 96, "answer": 1, - "options": 0 + "options": 1 } }, "entity_refs": [], @@ -6630,7 +6648,7 @@ "start_year": 2013, "end_year": 2022 }, - "capability_version": "cap_88defe77cc79e0c0" + "capability_version": "cap_765c9d2a0c7529b9" }, "confidence": "high", "available_at_place": true, @@ -6679,19 +6697,19 @@ "variable_text": "aid flows", "warnings": [], "timing_ms": { - "total": 1184, + "total": 1896, "by_step": { "validate": 0, - "walk": 15, - "reread_arcs": 0, + "walk": 13, + "reread_arcs": 1, "detect_edits": 0, "resolve_survivors": 0, - "shape": 1120, + "shape": 1838, "bind": 1, "where_places": 0, - "materialise": 21, - "answer": 9, - "options": 18 + "materialise": 18, + "answer": 8, + "options": 17 } }, "entity_refs": [], @@ -7540,7 +7558,7 @@ "start_year": 2013, "end_year": 2022 }, - "capability_version": "cap_88defe77cc79e0c0" + "capability_version": "cap_765c9d2a0c7529b9" }, "confidence": "high", "available_at_place": true, diff --git a/python/client-contract/src/dfo_client_contract/scenarios/choose-candidate-two-parts-2.parquet b/python/client-contract/src/dfo_client_contract/scenarios/choose-candidate-two-parts-2.parquet index 81ccb11..957b873 100644 Binary files a/python/client-contract/src/dfo_client_contract/scenarios/choose-candidate-two-parts-2.parquet and b/python/client-contract/src/dfo_client_contract/scenarios/choose-candidate-two-parts-2.parquet differ 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 0239b96..4f9ca97 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": "99e62038ceb4b459c2ac699549076ff123c166aa", - "recorded_at": "2026-10-25T17:36:59Z" + "dfo_commit": "d80df9f5fd598b7345255470932d202ee5d49942", + "recorded_at": "2026-10-26T09:23:24Z" }, "call": [ { @@ -39,7 +39,7 @@ "status": 200, "headers": { "content-type": "application/json", - "x-dfo-trace-id": "b77a765cb10a47e2a332c4884f011b76" + "x-dfo-trace-id": "94058d9236554b299cad827b56912349" }, "json": { "schema_version": 1, @@ -50,14 +50,14 @@ "extract_skipped": false }, "diagnostics": { - "engine_build": "99e62038ceb4b459c2ac699549076ff123c166aa", - "trace_id": "b77a765cb10a47e2a332c4884f011b76", + "engine_build": "d80df9f5fd598b7345255470932d202ee5d49942", + "trace_id": "94058d9236554b299cad827b56912349", "warnings": [], "timing_ms": { - "total": 10550, + "total": 10762, "by_step": { "coverage": 0, - "extract": 1134, + "extract": 1197, "cache_lookup": 0 } }, @@ -65,7 +65,7 @@ "input_tokens": 2245, "output_tokens": 202, "cached_tokens": 844, - "jev_input_tokens": 26836, + "jev_input_tokens": 26837, "jev_output_tokens": 5603 }, "timed_out": false @@ -76,28 +76,28 @@ "variable_text": "mortality", "warnings": [], "timing_ms": { - "total": 9309, + "total": 9466, "by_step": { "recall": 1, - "phase_resolve_places": 84, + "phase_resolve_places": 72, "phase_check_entities": 0, - "shape_arcs": 5, - "shape_probe": 104, - "shape_groups": 7, + "shape_arcs": 4, + "shape_probe": 94, + "shape_groups": 6, "shape_labels": 1, - "shape_admission": 83, + "shape_admission": 91, "phase_derive_shapes": 0, - "shape": 486, + "shape": 456, "phase_prune_and_rank": 0, - "bind": 127, - "phase_bind": 15, + "bind": 131, + "phase_bind": 19, "phase_settle": 1, - "phase_place_bindings": 38, + "phase_place_bindings": 34, "phase_facet_requests": 0, - "materialise": 1079, - "phase_materialise": 30, - "answer": 57, - "phase_outcome": 7391 + "materialise": 434, + "phase_materialise": 50, + "answer": 78, + "phase_outcome": 8190 } }, "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.", @@ -1977,7 +1977,7 @@ "start_year": 2013, "end_year": 2022 }, - "capability_version": "cap_88defe77cc79e0c0", + "capability_version": "cap_765c9d2a0c7529b9", "default_reading": { "applied": true, "removed_stat_vars": [] @@ -3427,6 +3427,15 @@ "value_kind": "enum_value" } }, + { + "value": { + "ref": { + "ref": "Years0", + "label": "Years 0" + }, + "value_kind": "enum_value" + } + }, { "value": { "ref": { @@ -3643,6 +3652,15 @@ "value_kind": "enum_value" } }, + { + "value": { + "ref": { + "ref": "Years85", + "label": "Years 85" + }, + "value_kind": "enum_value" + } + }, { "value": { "ref": { @@ -4547,7 +4565,7 @@ "start_year": 2013, "end_year": 2022 }, - "capability_version": "cap_88defe77cc79e0c0", + "capability_version": "cap_765c9d2a0c7529b9", "default_reading": { "applied": true, "removed_stat_vars": [] @@ -5489,6 +5507,15 @@ "label": "age" }, "options": [ + { + "value": { + "ref": { + "ref": "Years0", + "label": "Years 0" + }, + "value_kind": "enum_value" + } + }, { "value": { "ref": { @@ -6136,7 +6163,7 @@ "start_year": 2013, "end_year": 2022 }, - "capability_version": "cap_88defe77cc79e0c0", + "capability_version": "cap_765c9d2a0c7529b9", "default_reading": { "applied": true, "removed_stat_vars": [] @@ -6162,30 +6189,30 @@ "variable_text": "GDP", "warnings": [], "timing_ms": { - "total": 2675, + "total": 1533, "by_step": { "recall": 1, - "phase_resolve_places": 91, + "phase_resolve_places": 92, "phase_check_entities": 0, "shape_arcs": 4, - "shape_probe_coverage": 4, - "shape_probe": 109, - "shape_groups": 63, - "shape_labels": 12, - "shape_admission": 9, + "shape_probe_coverage": 1, + "shape_probe": 107, + "shape_groups": 78, + "shape_labels": 14, + "shape_admission": 2, "phase_derive_shapes": 0, - "shape": 584, + "shape": 503, "phase_prune_and_rank": 0, - "bind": 134, + "bind": 145, "phase_bind": 14, - "phase_settle": 6, - "phase_place_bindings": 10, + "phase_settle": 8, + "phase_place_bindings": 20, "phase_facet_requests": 0, - "materialise": 1186, - "phase_materialise": 18, - "answer": 41, - "options": 430, - "phase_outcome": 160 + "materialise": 199, + "phase_materialise": 19, + "answer": 61, + "options": 144, + "phase_outcome": 327 } }, "restatement": { @@ -8687,7 +8714,7 @@ "start_year": 2013, "end_year": 2022 }, - "capability_version": "cap_88defe77cc79e0c0", + "capability_version": "cap_765c9d2a0c7529b9", "default_reading": { "applied": true, "removed_stat_vars": [ @@ -10256,7 +10283,7 @@ "start_year": 2013, "end_year": 2022 }, - "capability_version": "cap_88defe77cc79e0c0", + "capability_version": "cap_765c9d2a0c7529b9", "default_reading": { "applied": true, "removed_stat_vars": [ @@ -11011,7 +11038,7 @@ "status": 200, "headers": { "content-type": "application/json", - "x-dfo-trace-id": "99a1c4af07a2414a9eabf36feadbeaae" + "x-dfo-trace-id": "600d857b0d8d4a1396104f5a8b22da07" }, "json": { "schema_version": 1, @@ -11020,11 +11047,11 @@ "extract_skipped": true }, "diagnostics": { - "engine_build": "99e62038ceb4b459c2ac699549076ff123c166aa", - "trace_id": "99a1c4af07a2414a9eabf36feadbeaae", + "engine_build": "d80df9f5fd598b7345255470932d202ee5d49942", + "trace_id": "600d857b0d8d4a1396104f5a8b22da07", "warnings": [], "timing_ms": { - "total": 1046, + "total": 1385, "by_step": { "coverage": 0 } @@ -11037,19 +11064,19 @@ "variable_text": "mortality", "warnings": [], "timing_ms": { - "total": 543, + "total": 565, "by_step": { "validate": 0, "walk": 1, "reread_arcs": 0, "detect_edits": 0, "resolve_survivors": 0, - "shape": 173, + "shape": 187, "bind": 0, "where_places": 0, - "materialise": 260, - "answer": 12, - "options": 97 + "materialise": 240, + "answer": 9, + "options": 128 } }, "entity_refs": [], @@ -12619,7 +12646,7 @@ "start_year": 2013, "end_year": 2022 }, - "capability_version": "cap_88defe77cc79e0c0" + "capability_version": "cap_765c9d2a0c7529b9" }, "confidence": "high", "available_at_place": true, @@ -12633,19 +12660,19 @@ "variable_text": "GDP", "warnings": [], "timing_ms": { - "total": 929, + "total": 1244, "by_step": { "validate": 0, "walk": 0, - "reread_arcs": 1, + "reread_arcs": 0, "detect_edits": 0, "resolve_survivors": 0, - "shape": 624, + "shape": 915, "bind": 0, - "where_places": 1, - "materialise": 180, + "where_places": 0, + "materialise": 204, "answer": 8, - "options": 115 + "options": 117 } }, "entity_refs": [], @@ -14777,7 +14804,7 @@ "start_year": 2013, "end_year": 2022 }, - "capability_version": "cap_88defe77cc79e0c0" + "capability_version": "cap_765c9d2a0c7529b9" }, "confidence": "high", "available_at_place": true, @@ -15209,7 +15236,8 @@ }, "options": { "format": "parquet", - "bundle": false + "bundle": false, + "without_party_totals": true } } }, @@ -15217,7 +15245,7 @@ "status": 200, "headers": { "content-type": "application/json", - "x-dfo-trace-id": "4ce5b18b92824a7695bdec6c98893997" + "x-dfo-trace-id": "eda4b58fea364fa8b3fbbdd89e20714d" }, "json": { "schema_version": 1, @@ -15478,7 +15506,7 @@ "frame_grammar_version": "1.1.0", "origin_catalogue_build_id": "20261023T061534Z-06fa7b89", "served_from": "head", - "confirmed_at": "2026-10-25T17:37:11.544065+00:00" + "confirmed_at": "2026-10-26T09:23:37.491397+00:00" }, "warnings": [], "diagnostics": [ @@ -15490,17 +15518,18 @@ ], "artifacts": [ { - "artifact_digest": "sha256:0652c59a04403a740ed0a4a75360cc04900bbcce57dfc4d7f7b7d2b21a9404dd", + "artifact_digest": "sha256:b8b53c89363b53919fb9d1501ad052892123e12fb4e788f67af0513b6e938937", "rendering": { "bundle": false, "format": "parquet", - "layout": 4 + "layout": 4, + "without_party_totals": true }, - "bytes": 9259, + "bytes": 9281, "media_type": "application/vnd.apache.parquet", - "created_at": "2026-10-23T17:40:52.293546+00:00", + "created_at": "2026-10-25T14:21:12.672660+00:00", "tier": "working", - "url": "/api/datasets/spec_176fd5e63bb2a122c4ad00831497b863/cv_6c43e754af661c87eb22e7a21595a732/files/sha256:0652c59a04403a740ed0a4a75360cc04900bbcce57dfc4d7f7b7d2b21a9404dd" + "url": "/api/datasets/spec_176fd5e63bb2a122c4ad00831497b863/cv_6c43e754af661c87eb22e7a21595a732/files/sha256:b8b53c89363b53919fb9d1501ad052892123e12fb4e788f67af0513b6e938937" }, { "artifact_digest": "sha256:bd259d52a10e62d1a97e04ca5ad722c043dd38997750e8dc7a785dcd5b697056", @@ -15687,21 +15716,21 @@ { "request": { "method": "GET", - "origin_path": "/api/datasets/spec_176fd5e63bb2a122c4ad00831497b863/cv_6c43e754af661c87eb22e7a21595a732/files/sha256:0652c59a04403a740ed0a4a75360cc04900bbcce57dfc4d7f7b7d2b21a9404dd" + "origin_path": "/api/datasets/spec_176fd5e63bb2a122c4ad00831497b863/cv_6c43e754af661c87eb22e7a21595a732/files/sha256:b8b53c89363b53919fb9d1501ad052892123e12fb4e788f67af0513b6e938937" }, "response": { "status": 302, "headers": { "content-type": "text/html", - "location": "https://storage.googleapis.com/dev-fin-observatory-datasets-working/sha256%3A0652c59a04403a740ed0a4a75360cc04900bbcce57dfc4d7f7b7d2b21a9404dd?X-Goog-Signature=redacted", - "x-dfo-trace-id": "657f36800a1941c086819a1b69efaaf9" + "location": "https://storage.googleapis.com/dev-fin-observatory-datasets-working/sha256%3Ab8b53c89363b53919fb9d1501ad052892123e12fb4e788f67af0513b6e938937?X-Goog-Signature=redacted", + "x-dfo-trace-id": "26ade94d58da490982f1d8f48d45f655" } } }, { "request": { "method": "GET", - "url": "https://storage.googleapis.com/dev-fin-observatory-datasets-working/sha256%3A0652c59a04403a740ed0a4a75360cc04900bbcce57dfc4d7f7b7d2b21a9404dd?X-Goog-Signature=redacted" + "url": "https://storage.googleapis.com/dev-fin-observatory-datasets-working/sha256%3Ab8b53c89363b53919fb9d1501ad052892123e12fb4e788f67af0513b6e938937?X-Goog-Signature=redacted" }, "response": { "status": 200, @@ -15827,7 +15856,8 @@ }, "options": { "format": "parquet", - "bundle": false + "bundle": false, + "without_party_totals": true } } }, @@ -15835,7 +15865,7 @@ "status": 200, "headers": { "content-type": "application/json", - "x-dfo-trace-id": "9a8678b0f63f472bbb91470de525d453" + "x-dfo-trace-id": "bccfe916299a4c878ffd63c2ab263027" }, "json": { "schema_version": 1, @@ -16060,7 +16090,7 @@ "frame_grammar_version": "1.1.0", "origin_catalogue_build_id": "20261023T061534Z-06fa7b89", "served_from": "head", - "confirmed_at": "2026-10-25T17:37:12.800804+00:00" + "confirmed_at": "2026-10-26T09:23:38.856824+00:00" }, "warnings": [ { @@ -16078,17 +16108,18 @@ ], "artifacts": [ { - "artifact_digest": "sha256:18a2e84a4829808841c3967941a92c555ac6c8c30856fe2113ba38d89e121cf7", + "artifact_digest": "sha256:af952b05a7ac047731b039b51f8876806d9c89beba61b9e94c5f552a75f175ef", "rendering": { "bundle": false, "format": "parquet", - "layout": 4 + "layout": 4, + "without_party_totals": true }, - "bytes": 10233, + "bytes": 10255, "media_type": "application/vnd.apache.parquet", - "created_at": "2026-10-23T17:40:54.208385+00:00", + "created_at": "2026-10-25T14:21:14.682748+00:00", "tier": "working", - "url": "/api/datasets/spec_310c03c5f99c73c41d12226098714f81/cv_7a402f88c10de233e81d664ab22037a5/files/sha256:18a2e84a4829808841c3967941a92c555ac6c8c30856fe2113ba38d89e121cf7" + "url": "/api/datasets/spec_310c03c5f99c73c41d12226098714f81/cv_7a402f88c10de233e81d664ab22037a5/files/sha256:af952b05a7ac047731b039b51f8876806d9c89beba61b9e94c5f552a75f175ef" }, { "artifact_digest": "sha256:45c12e425c4cda8e0f4d577367ccb74e0613cb3b78fdc06b17a263fc4f803ae8", @@ -16275,21 +16306,21 @@ { "request": { "method": "GET", - "origin_path": "/api/datasets/spec_310c03c5f99c73c41d12226098714f81/cv_7a402f88c10de233e81d664ab22037a5/files/sha256:18a2e84a4829808841c3967941a92c555ac6c8c30856fe2113ba38d89e121cf7" + "origin_path": "/api/datasets/spec_310c03c5f99c73c41d12226098714f81/cv_7a402f88c10de233e81d664ab22037a5/files/sha256:af952b05a7ac047731b039b51f8876806d9c89beba61b9e94c5f552a75f175ef" }, "response": { "status": 302, "headers": { "content-type": "text/html", - "location": "https://storage.googleapis.com/dev-fin-observatory-datasets-working/sha256%3A18a2e84a4829808841c3967941a92c555ac6c8c30856fe2113ba38d89e121cf7?X-Goog-Signature=redacted", - "x-dfo-trace-id": "d25b000882d34d9d9bdee9bb87ccbee7" + "location": "https://storage.googleapis.com/dev-fin-observatory-datasets-working/sha256%3Aaf952b05a7ac047731b039b51f8876806d9c89beba61b9e94c5f552a75f175ef?X-Goog-Signature=redacted", + "x-dfo-trace-id": "c85bcbaef6224ecb95aedae047d77704" } } }, { "request": { "method": "GET", - "url": "https://storage.googleapis.com/dev-fin-observatory-datasets-working/sha256%3A18a2e84a4829808841c3967941a92c555ac6c8c30856fe2113ba38d89e121cf7?X-Goog-Signature=redacted" + "url": "https://storage.googleapis.com/dev-fin-observatory-datasets-working/sha256%3Aaf952b05a7ac047731b039b51f8876806d9c89beba61b9e94c5f552a75f175ef?X-Goog-Signature=redacted" }, "response": { "status": 200, @@ -16337,21 +16368,21 @@ "rows": 943, "columns": [ "part", - "stat_var", - "stat_var_label", - "observationAbout", - "observationAbout_label", "time_period", + "observationAbout_label", "value", - "unit", "unit_label", + "provenance_label", + "stat_var_label", + "observationAbout", + "unit", "currency", "price_basis", "base_year", "measurementMethod", "measurementMethod_label", "provenance", - "provenance_label" + "stat_var" ], "part_rows": [ { diff --git a/python/client-contract/src/dfo_client_contract/scenarios/choose-candidate-two-parts.parquet b/python/client-contract/src/dfo_client_contract/scenarios/choose-candidate-two-parts.parquet index 088e609..bcfd067 100644 Binary files a/python/client-contract/src/dfo_client_contract/scenarios/choose-candidate-two-parts.parquet and b/python/client-contract/src/dfo_client_contract/scenarios/choose-candidate-two-parts.parquet differ 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 fb84d9d..52fe91d 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": "4ef48e41be8145e79e3349df65b71540" + "x-dfo-trace-id": "77333f3756d7434fa7476addd497eff0" }, "json": { "schema_version": 1, @@ -46,14 +46,14 @@ "extract_skipped": false }, "diagnostics": { - "engine_build": "99e62038ceb4b459c2ac699549076ff123c166aa", - "trace_id": "4ef48e41be8145e79e3349df65b71540", + "engine_build": "d80df9f5fd598b7345255470932d202ee5d49942", + "trace_id": "77333f3756d7434fa7476addd497eff0", "warnings": [], "timing_ms": { - "total": 4896, + "total": 4076, "by_step": { "coverage": 0, - "extract": 1129, + "extract": 1095, "cache_lookup": 0 } }, @@ -61,7 +61,7 @@ "input_tokens": 2242, "output_tokens": 197, "cached_tokens": 843, - "jev_input_tokens": 21367, + "jev_input_tokens": 21368, "jev_output_tokens": 4607 }, "timed_out": false @@ -78,28 +78,28 @@ } ], "timing_ms": { - "total": 3462, + "total": 2673, "by_step": { - "recall": 2, + "recall": 1, "phase_resolve_places": 0, "phase_check_entities": 0, - "shape_arcs": 8, - "shape_probe": 161, - "shape_groups": 7, + "shape_arcs": 5, + "shape_probe": 91, + "shape_groups": 6, "shape_labels": 1, - "shape_admission": 2, + "shape_admission": 1, "phase_derive_shapes": 0, - "shape": 282, + "shape": 214, "phase_prune_and_rank": 0, - "bind": 137, - "phase_bind": 15, + "bind": 134, + "phase_bind": 13, "phase_settle": 1, "phase_place_bindings": 34, "phase_facet_requests": 0, - "materialise": 107, - "phase_materialise": 27, - "answer": 69, - "phase_outcome": 2788 + "materialise": 106, + "phase_materialise": 29, + "answer": 54, + "phase_outcome": 2087 } }, "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.", @@ -843,7 +843,7 @@ "start_year": 2013, "end_year": 2022 }, - "capability_version": "cap_88defe77cc79e0c0", + "capability_version": "cap_765c9d2a0c7529b9", "default_reading": { "applied": true, "removed_stat_vars": [] @@ -1626,6 +1626,15 @@ "value_kind": "enum_value" } }, + { + "value": { + "ref": { + "ref": "Years0", + "label": "Years 0" + }, + "value_kind": "enum_value" + } + }, { "value": { "ref": { @@ -1842,6 +1851,15 @@ "value_kind": "enum_value" } }, + { + "value": { + "ref": { + "ref": "Years85", + "label": "Years 85" + }, + "value_kind": "enum_value" + } + }, { "value": { "ref": { @@ -2377,7 +2395,7 @@ "start_year": 2013, "end_year": 2022 }, - "capability_version": "cap_88defe77cc79e0c0", + "capability_version": "cap_765c9d2a0c7529b9", "default_reading": { "applied": true, "removed_stat_vars": [] @@ -2420,30 +2438,30 @@ } ], "timing_ms": { - "total": 3762, + "total": 2976, "by_step": { - "recall": 1361, - "phase_resolve_places": 0, + "recall": 771, + "phase_resolve_places": 1, "phase_check_entities": 0, - "shape_arcs": 22, - "shape_probe_coverage": 5, - "shape_probe": 130, - "shape_groups": 121, + "shape_arcs": 2, + "shape_probe_coverage": 21, + "shape_probe": 111, + "shape_groups": 66, "shape_labels": 0, "shape_admission": 0, "phase_derive_shapes": 0, - "shape": 846, + "shape": 621, "phase_prune_and_rank": 0, - "bind": 653, - "phase_bind": 331, - "phase_settle": 17, - "phase_place_bindings": 102, + "bind": 681, + "phase_bind": 341, + "phase_settle": 11, + "phase_place_bindings": 111, "phase_facet_requests": 0, "materialise": 20, - "phase_materialise": 5, - "answer": 263, - "options": 8, - "phase_outcome": 156 + "phase_materialise": 4, + "answer": 257, + "options": 11, + "phase_outcome": 147 } }, "restatement": { @@ -3351,7 +3369,7 @@ "start_year": 2013, "end_year": 2022 }, - "capability_version": "cap_88defe77cc79e0c0", + "capability_version": "cap_765c9d2a0c7529b9", "default_reading": { "applied": true, "removed_stat_vars": [] @@ -6131,7 +6149,7 @@ "status": 200, "headers": { "content-type": "application/json", - "x-dfo-trace-id": "559262a87e7a4f79b1a4761af98f0be8" + "x-dfo-trace-id": "73fbf797c20a40a4851f5d88882cf25a" }, "json": { "schema_version": 1, @@ -6140,11 +6158,11 @@ "extract_skipped": true }, "diagnostics": { - "engine_build": "99e62038ceb4b459c2ac699549076ff123c166aa", - "trace_id": "559262a87e7a4f79b1a4761af98f0be8", + "engine_build": "d80df9f5fd598b7345255470932d202ee5d49942", + "trace_id": "73fbf797c20a40a4851f5d88882cf25a", "warnings": [], "timing_ms": { - "total": 1249, + "total": 1963, "by_step": { "coverage": 0 } @@ -6157,19 +6175,19 @@ "variable_text": "mortality", "warnings": [], "timing_ms": { - "total": 298, + "total": 277, "by_step": { "validate": 0, "walk": 0, "reread_arcs": 0, "detect_edits": 0, "resolve_survivors": 0, - "shape": 194, - "bind": 0, - "where_places": 1, - "materialise": 102, + "shape": 178, + "bind": 1, + "where_places": 0, + "materialise": 96, "answer": 1, - "options": 0 + "options": 1 } }, "entity_refs": [], @@ -6688,7 +6706,7 @@ "start_year": 2013, "end_year": 2022 }, - "capability_version": "cap_88defe77cc79e0c0" + "capability_version": "cap_765c9d2a0c7529b9" }, "confidence": "high", "available_at_place": true, @@ -6737,19 +6755,19 @@ "variable_text": "aid flows", "warnings": [], "timing_ms": { - "total": 1184, + "total": 1896, "by_step": { "validate": 0, - "walk": 15, - "reread_arcs": 0, + "walk": 13, + "reread_arcs": 1, "detect_edits": 0, "resolve_survivors": 0, - "shape": 1120, + "shape": 1838, "bind": 1, "where_places": 0, - "materialise": 21, - "answer": 9, - "options": 18 + "materialise": 18, + "answer": 8, + "options": 17 } }, "entity_refs": [], @@ -7598,7 +7616,7 @@ "start_year": 2013, "end_year": 2022 }, - "capability_version": "cap_88defe77cc79e0c0" + "capability_version": "cap_765c9d2a0c7529b9" }, "confidence": "high", "available_at_place": true, 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 3c33733..355b698 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": "1af94637ff7043abb23f65b60e28d604" + "x-dfo-trace-id": "44089cedfffd4c0ca025f3d8faba0ca7" }, "json": { "schema_version": 1, @@ -46,14 +46,14 @@ "extract_skipped": false }, "diagnostics": { - "engine_build": "99e62038ceb4b459c2ac699549076ff123c166aa", - "trace_id": "1af94637ff7043abb23f65b60e28d604", + "engine_build": "d80df9f5fd598b7345255470932d202ee5d49942", + "trace_id": "44089cedfffd4c0ca025f3d8faba0ca7", "warnings": [], "timing_ms": { - "total": 2578, + "total": 2666, "by_step": { "coverage": 0, - "extract": 1025, + "extract": 1154, "cache_lookup": 0 } }, @@ -72,29 +72,29 @@ "variable_text": "GDP", "warnings": [], "timing_ms": { - "total": 1276, + "total": 1283, "by_step": { - "recall": 1, - "phase_resolve_places": 1, + "recall": 2, + "phase_resolve_places": 0, "phase_check_entities": 0, "shape_arcs": 4, - "shape_probe_coverage": 17, - "shape_probe": 266, - "shape_groups": 61, + "shape_probe_coverage": 5, + "shape_probe": 116, + "shape_groups": 64, "shape_labels": 12, - "shape_admission": 2, + "shape_admission": 1, "phase_derive_shapes": 0, - "shape": 538, + "shape": 463, "phase_prune_and_rank": 0, - "bind": 153, + "bind": 125, "phase_bind": 12, "phase_settle": 6, - "phase_place_bindings": 12, + "phase_place_bindings": 10, "phase_facet_requests": 0, - "materialise": 120, - "phase_materialise": 19, - "answer": 172, - "options": 115, + "materialise": 173, + "phase_materialise": 18, + "answer": 207, + "options": 140, "phase_outcome": 127 } }, @@ -1965,7 +1965,7 @@ "start_year": 2015, "end_year": 2015 }, - "capability_version": "cap_88defe77cc79e0c0", + "capability_version": "cap_765c9d2a0c7529b9", "default_reading": { "applied": true, "removed_stat_vars": [ @@ -2884,7 +2884,7 @@ "start_year": 2015, "end_year": 2015 }, - "capability_version": "cap_88defe77cc79e0c0", + "capability_version": "cap_765c9d2a0c7529b9", "default_reading": { "applied": true, "removed_stat_vars": [ @@ -2988,24 +2988,24 @@ "variable_text": "ODA", "warnings": [], "timing_ms": { - "total": 487, + "total": 598, "by_step": { - "recall": 1, + "recall": 301, "phase_resolve_places": 0, "phase_check_entities": 0, - "shape_arcs": 3, - "shape_probe_coverage": 10, - "shape_probe": 108, + "shape_arcs": 2, + "shape_probe_coverage": 6, + "shape_probe": 99, "shape_groups": 3, "shape_labels": 0, - "shape_admission": 1, + "shape_admission": 0, "phase_derive_shapes": 0, - "shape": 253, + "shape": 189, "phase_prune_and_rank": 0, - "bind": 218, - "phase_bind": 2, - "phase_settle": 8, - "phase_place_bindings": 5 + "bind": 91, + "phase_bind": 3, + "phase_settle": 7, + "phase_place_bindings": 7 } }, "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 +3575,7 @@ "status": 200, "headers": { "content-type": "application/json", - "x-dfo-trace-id": "9296d6d509bb4007ab9b828b29f773db" + "x-dfo-trace-id": "4f781d285d73459fa3f2f981f5828776" }, "json": { "schema_version": 1, @@ -3584,11 +3584,11 @@ "extract_skipped": true }, "diagnostics": { - "engine_build": "99e62038ceb4b459c2ac699549076ff123c166aa", - "trace_id": "9296d6d509bb4007ab9b828b29f773db", + "engine_build": "d80df9f5fd598b7345255470932d202ee5d49942", + "trace_id": "4f781d285d73459fa3f2f981f5828776", "warnings": [], "timing_ms": { - "total": 1192, + "total": 1276, "by_step": { "coverage": 0 } @@ -3608,19 +3608,19 @@ "variable_text": "GDP", "warnings": [], "timing_ms": { - "total": 1069, + "total": 1161, "by_step": { "validate": 0, - "walk": 0, - "reread_arcs": 1, + "walk": 1, + "reread_arcs": 0, "detect_edits": 0, "resolve_survivors": 0, - "shape": 829, - "bind": 0, - "where_places": 1, - "materialise": 123, + "shape": 921, + "bind": 1, + "where_places": 0, + "materialise": 120, "answer": 4, - "options": 111 + "options": 114 } }, "entity_refs": [], @@ -5135,7 +5135,7 @@ "start_year": 2015, "end_year": 2015 }, - "capability_version": "cap_88defe77cc79e0c0" + "capability_version": "cap_765c9d2a0c7529b9" }, "confidence": "high", "available_at_place": true, @@ -5210,29 +5210,29 @@ "variable_text": "ODA", "warnings": [], "timing_ms": { - "total": 382, + "total": 399, "by_step": { - "recall": 2, + "recall": 0, "phase_resolve_places": 0, "phase_check_entities": 0, "shape_arcs": 2, - "shape_probe_coverage": 7, - "shape_probe": 84, + "shape_probe_coverage": 6, + "shape_probe": 97, "shape_groups": 3, "shape_labels": 0, - "shape_admission": 0, + "shape_admission": 1, "phase_derive_shapes": 0, - "shape": 162, + "shape": 181, "phase_prune_and_rank": 0, - "bind": 99, - "phase_bind": 11, + "bind": 100, + "phase_bind": 12, "phase_settle": 8, "phase_place_bindings": 1, "phase_facet_requests": 0, - "materialise": 21, + "materialise": 20, "phase_materialise": 5, - "answer": 11, - "options": 12, + "answer": 15, + "options": 7, "phase_outcome": 50 } }, @@ -6347,7 +6347,7 @@ "start_year": 2015, "end_year": 2015 }, - "capability_version": "cap_88defe77cc79e0c0", + "capability_version": "cap_765c9d2a0c7529b9", "default_reading": { "applied": true, "removed_stat_vars": [] 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 3310007..6e9c25a 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": "99e62038ceb4b459c2ac699549076ff123c166aa", - "recorded_at": "2026-10-25T17:37:20Z" + "dfo_commit": "d80df9f5fd598b7345255470932d202ee5d49942", + "recorded_at": "2026-10-26T09:23:47Z" }, "call": [ { @@ -36,7 +36,7 @@ "status": 200, "headers": { "content-type": "application/json", - "x-dfo-trace-id": "1af94637ff7043abb23f65b60e28d604" + "x-dfo-trace-id": "44089cedfffd4c0ca025f3d8faba0ca7" }, "json": { "schema_version": 1, @@ -47,14 +47,14 @@ "extract_skipped": false }, "diagnostics": { - "engine_build": "99e62038ceb4b459c2ac699549076ff123c166aa", - "trace_id": "1af94637ff7043abb23f65b60e28d604", + "engine_build": "d80df9f5fd598b7345255470932d202ee5d49942", + "trace_id": "44089cedfffd4c0ca025f3d8faba0ca7", "warnings": [], "timing_ms": { - "total": 2578, + "total": 2666, "by_step": { "coverage": 0, - "extract": 1025, + "extract": 1154, "cache_lookup": 0 } }, @@ -73,29 +73,29 @@ "variable_text": "GDP", "warnings": [], "timing_ms": { - "total": 1276, + "total": 1283, "by_step": { - "recall": 1, - "phase_resolve_places": 1, + "recall": 2, + "phase_resolve_places": 0, "phase_check_entities": 0, "shape_arcs": 4, - "shape_probe_coverage": 17, - "shape_probe": 266, - "shape_groups": 61, + "shape_probe_coverage": 5, + "shape_probe": 116, + "shape_groups": 64, "shape_labels": 12, - "shape_admission": 2, + "shape_admission": 1, "phase_derive_shapes": 0, - "shape": 538, + "shape": 463, "phase_prune_and_rank": 0, - "bind": 153, + "bind": 125, "phase_bind": 12, "phase_settle": 6, - "phase_place_bindings": 12, + "phase_place_bindings": 10, "phase_facet_requests": 0, - "materialise": 120, - "phase_materialise": 19, - "answer": 172, - "options": 115, + "materialise": 173, + "phase_materialise": 18, + "answer": 207, + "options": 140, "phase_outcome": 127 } }, @@ -1960,7 +1960,7 @@ "start_year": 2015, "end_year": 2015 }, - "capability_version": "cap_88defe77cc79e0c0", + "capability_version": "cap_765c9d2a0c7529b9", "default_reading": { "applied": true, "removed_stat_vars": [ @@ -2879,7 +2879,7 @@ "start_year": 2015, "end_year": 2015 }, - "capability_version": "cap_88defe77cc79e0c0", + "capability_version": "cap_765c9d2a0c7529b9", "default_reading": { "applied": true, "removed_stat_vars": [ @@ -2982,24 +2982,24 @@ "variable_text": "ODA", "warnings": [], "timing_ms": { - "total": 487, + "total": 598, "by_step": { - "recall": 1, + "recall": 301, "phase_resolve_places": 0, "phase_check_entities": 0, - "shape_arcs": 3, - "shape_probe_coverage": 10, - "shape_probe": 108, + "shape_arcs": 2, + "shape_probe_coverage": 6, + "shape_probe": 99, "shape_groups": 3, "shape_labels": 0, - "shape_admission": 1, + "shape_admission": 0, "phase_derive_shapes": 0, - "shape": 253, + "shape": 189, "phase_prune_and_rank": 0, - "bind": 218, - "phase_bind": 2, - "phase_settle": 8, - "phase_place_bindings": 5 + "bind": 91, + "phase_bind": 3, + "phase_settle": 7, + "phase_place_bindings": 7 } }, "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 +3561,7 @@ "status": 200, "headers": { "content-type": "application/json", - "x-dfo-trace-id": "9296d6d509bb4007ab9b828b29f773db" + "x-dfo-trace-id": "4f781d285d73459fa3f2f981f5828776" }, "json": { "schema_version": 1, @@ -3570,11 +3570,11 @@ "extract_skipped": true }, "diagnostics": { - "engine_build": "99e62038ceb4b459c2ac699549076ff123c166aa", - "trace_id": "9296d6d509bb4007ab9b828b29f773db", + "engine_build": "d80df9f5fd598b7345255470932d202ee5d49942", + "trace_id": "4f781d285d73459fa3f2f981f5828776", "warnings": [], "timing_ms": { - "total": 1192, + "total": 1276, "by_step": { "coverage": 0 } @@ -3594,19 +3594,19 @@ "variable_text": "GDP", "warnings": [], "timing_ms": { - "total": 1069, + "total": 1161, "by_step": { "validate": 0, - "walk": 0, - "reread_arcs": 1, + "walk": 1, + "reread_arcs": 0, "detect_edits": 0, "resolve_survivors": 0, - "shape": 829, - "bind": 0, - "where_places": 1, - "materialise": 123, + "shape": 921, + "bind": 1, + "where_places": 0, + "materialise": 120, "answer": 4, - "options": 111 + "options": 114 } }, "entity_refs": [], @@ -5121,7 +5121,7 @@ "start_year": 2015, "end_year": 2015 }, - "capability_version": "cap_88defe77cc79e0c0" + "capability_version": "cap_765c9d2a0c7529b9" }, "confidence": "high", "available_at_place": true, @@ -5196,29 +5196,29 @@ "variable_text": "ODA", "warnings": [], "timing_ms": { - "total": 382, + "total": 399, "by_step": { - "recall": 2, + "recall": 0, "phase_resolve_places": 0, "phase_check_entities": 0, "shape_arcs": 2, - "shape_probe_coverage": 7, - "shape_probe": 84, + "shape_probe_coverage": 6, + "shape_probe": 97, "shape_groups": 3, "shape_labels": 0, - "shape_admission": 0, + "shape_admission": 1, "phase_derive_shapes": 0, - "shape": 162, + "shape": 181, "phase_prune_and_rank": 0, - "bind": 99, - "phase_bind": 11, + "bind": 100, + "phase_bind": 12, "phase_settle": 8, "phase_place_bindings": 1, "phase_facet_requests": 0, - "materialise": 21, + "materialise": 20, "phase_materialise": 5, - "answer": 11, - "options": 12, + "answer": 15, + "options": 7, "phase_outcome": 50 } }, @@ -6333,7 +6333,7 @@ "start_year": 2015, "end_year": 2015 }, - "capability_version": "cap_88defe77cc79e0c0", + "capability_version": "cap_765c9d2a0c7529b9", "default_reading": { "applied": true, "removed_stat_vars": [] 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 e713398..73b992c 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": "355b1d08f8b442af87e20ecc65522a53" + "x-dfo-trace-id": "989481cf76744b4cbddf1aff890cda9c" }, "json": { "schema_version": 1, @@ -45,8 +45,8 @@ "extract_skipped": true }, "diagnostics": { - "engine_build": "99e62038ceb4b459c2ac699549076ff123c166aa", - "trace_id": "355b1d08f8b442af87e20ecc65522a53", + "engine_build": "d80df9f5fd598b7345255470932d202ee5d49942", + "trace_id": "989481cf76744b4cbddf1aff890cda9c", "warnings": [], "timing_ms": { "total": 1, @@ -68,9 +68,9 @@ "variable_text": "ODA disbursements", "warnings": [], "timing_ms": { - "total": 0, + "total": 117, "by_step": { - "recall": 0, + "recall": 117, "phase_resolve_places": 0, "phase_check_entities": 0 } @@ -298,7 +298,7 @@ "error": { "class": "ContractError", "code": "contract_violation", - "trace_id": "355b1d08f8b442af87e20ecc65522a53" + "trace_id": "989481cf76744b4cbddf1aff890cda9c" } } ] 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 b74ea9b..85140b0 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": "355b1d08f8b442af87e20ecc65522a53" + "x-dfo-trace-id": "989481cf76744b4cbddf1aff890cda9c" }, "json": { "schema_version": 1, @@ -45,8 +45,8 @@ "extract_skipped": true }, "diagnostics": { - "engine_build": "99e62038ceb4b459c2ac699549076ff123c166aa", - "trace_id": "355b1d08f8b442af87e20ecc65522a53", + "engine_build": "d80df9f5fd598b7345255470932d202ee5d49942", + "trace_id": "989481cf76744b4cbddf1aff890cda9c", "warnings": [], "timing_ms": { "total": 1, @@ -68,9 +68,9 @@ "variable_text": "ODA disbursements", "warnings": [], "timing_ms": { - "total": 0, + "total": 117, "by_step": { - "recall": 0, + "recall": 117, "phase_resolve_places": 0, "phase_check_entities": 0 } @@ -257,7 +257,7 @@ "error": { "class": "ContractError", "code": "contract_violation", - "trace_id": "355b1d08f8b442af87e20ecc65522a53" + "trace_id": "989481cf76744b4cbddf1aff890cda9c" } } ] 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 4cbeded..2224c1f 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": "99e62038ceb4b459c2ac699549076ff123c166aa", - "recorded_at": "2026-10-25T17:36:53Z" + "dfo_commit": "d80df9f5fd598b7345255470932d202ee5d49942", + "recorded_at": "2026-10-26T09:23:17Z" }, "call": [ { @@ -36,7 +36,7 @@ "status": 200, "headers": { "content-type": "application/json", - "x-dfo-trace-id": "0707e7de12594b1ba74a37d203724685" + "x-dfo-trace-id": "b303ed69d4a54228aadf721bfa9f73c1" }, "json": { "schema_version": 1, @@ -47,8 +47,8 @@ "extract_skipped": true }, "diagnostics": { - "engine_build": "99e62038ceb4b459c2ac699549076ff123c166aa", - "trace_id": "0707e7de12594b1ba74a37d203724685", + "engine_build": "d80df9f5fd598b7345255470932d202ee5d49942", + "trace_id": "b303ed69d4a54228aadf721bfa9f73c1", "warnings": [], "timing_ms": { "total": 1, @@ -70,9 +70,9 @@ "variable_text": "ODA disbursements", "warnings": [], "timing_ms": { - "total": 0, + "total": 117, "by_step": { - "recall": 0, + "recall": 117, "phase_resolve_places": 0, "phase_check_entities": 0 } @@ -295,7 +295,7 @@ "status": 200, "headers": { "content-type": "application/json", - "x-dfo-trace-id": "14b26656d2d24a659512948ba4a02e77" + "x-dfo-trace-id": "a94d701882c9454da1459e8f957b8309" }, "json": { "schema_version": 1, @@ -304,8 +304,8 @@ "extract_skipped": true }, "diagnostics": { - "engine_build": "99e62038ceb4b459c2ac699549076ff123c166aa", - "trace_id": "14b26656d2d24a659512948ba4a02e77", + "engine_build": "d80df9f5fd598b7345255470932d202ee5d49942", + "trace_id": "a94d701882c9454da1459e8f957b8309", "warnings": [], "timing_ms": { "total": 3, @@ -333,30 +333,30 @@ } ], "timing_ms": { - "total": 3410, + "total": 1045, "by_step": { "recall": 0, "phase_resolve_places": 0, "phase_check_entities": 0, "shape_arcs": 1, - "shape_probe_coverage": 7, - "shape_probe": 2417, - "shape_groups": 58, + "shape_probe_coverage": 10, + "shape_probe": 104, + "shape_groups": 56, "shape_labels": 1, - "shape_admission": 0, + "shape_admission": 1, "phase_derive_shapes": 0, - "shape": 2795, + "shape": 473, "phase_prune_and_rank": 0, - "bind": 138, - "phase_bind": 188, - "phase_settle": 9, - "phase_place_bindings": 80, + "bind": 105, + "phase_bind": 185, + "phase_settle": 8, + "phase_place_bindings": 77, "phase_facet_requests": 0, "materialise": 17, - "phase_materialise": 6, - "answer": 10, - "options": 6, - "phase_outcome": 161 + "phase_materialise": 5, + "answer": 9, + "options": 26, + "phase_outcome": 140 } }, "restatement": { @@ -1214,7 +1214,7 @@ "start_year": 2018, "end_year": 2018 }, - "capability_version": "cap_88defe77cc79e0c0", + "capability_version": "cap_765c9d2a0c7529b9", "default_reading": { "applied": true, "removed_stat_vars": [] 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 bcceba0..64b25c4 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": "99e62038ceb4b459c2ac699549076ff123c166aa", - "recorded_at": "2026-10-25T17:36:49Z" + "dfo_commit": "d80df9f5fd598b7345255470932d202ee5d49942", + "recorded_at": "2026-10-26T09:23:16Z" }, "call": [ { @@ -35,7 +35,7 @@ "status": 200, "headers": { "content-type": "application/json", - "x-dfo-trace-id": "355b1d08f8b442af87e20ecc65522a53" + "x-dfo-trace-id": "989481cf76744b4cbddf1aff890cda9c" }, "json": { "schema_version": 1, @@ -46,8 +46,8 @@ "extract_skipped": true }, "diagnostics": { - "engine_build": "99e62038ceb4b459c2ac699549076ff123c166aa", - "trace_id": "355b1d08f8b442af87e20ecc65522a53", + "engine_build": "d80df9f5fd598b7345255470932d202ee5d49942", + "trace_id": "989481cf76744b4cbddf1aff890cda9c", "warnings": [], "timing_ms": { "total": 1, @@ -69,9 +69,9 @@ "variable_text": "ODA disbursements", "warnings": [], "timing_ms": { - "total": 0, + "total": 117, "by_step": { - "recall": 0, + "recall": 117, "phase_resolve_places": 0, "phase_check_entities": 0 } @@ -294,7 +294,7 @@ "status": 200, "headers": { "content-type": "application/json", - "x-dfo-trace-id": "13f7792a23294f7b929699cddc6d7713" + "x-dfo-trace-id": "7cbd24b2c1a0457da3df6702b8caf3aa" }, "json": { "schema_version": 1, @@ -303,11 +303,11 @@ "extract_skipped": true }, "diagnostics": { - "engine_build": "99e62038ceb4b459c2ac699549076ff123c166aa", - "trace_id": "13f7792a23294f7b929699cddc6d7713", + "engine_build": "d80df9f5fd598b7345255470932d202ee5d49942", + "trace_id": "7cbd24b2c1a0457da3df6702b8caf3aa", "warnings": [], "timing_ms": { - "total": 3414, + "total": 1050, "by_step": { "coverage": 0 } @@ -333,30 +333,30 @@ } ], "timing_ms": { - "total": 3410, + "total": 1045, "by_step": { "recall": 0, "phase_resolve_places": 0, "phase_check_entities": 0, "shape_arcs": 1, - "shape_probe_coverage": 7, - "shape_probe": 2417, - "shape_groups": 58, + "shape_probe_coverage": 10, + "shape_probe": 104, + "shape_groups": 56, "shape_labels": 1, - "shape_admission": 0, + "shape_admission": 1, "phase_derive_shapes": 0, - "shape": 2795, + "shape": 473, "phase_prune_and_rank": 0, - "bind": 138, - "phase_bind": 188, - "phase_settle": 9, - "phase_place_bindings": 80, + "bind": 105, + "phase_bind": 185, + "phase_settle": 8, + "phase_place_bindings": 77, "phase_facet_requests": 0, "materialise": 17, - "phase_materialise": 6, - "answer": 10, - "options": 6, - "phase_outcome": 161 + "phase_materialise": 5, + "answer": 9, + "options": 26, + "phase_outcome": 140 } }, "restatement": { @@ -1214,7 +1214,7 @@ "start_year": 2018, "end_year": 2018 }, - "capability_version": "cap_88defe77cc79e0c0", + "capability_version": "cap_765c9d2a0c7529b9", "default_reading": { "applied": true, "removed_stat_vars": [] 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 90c4d22..3b9e216 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": "99e62038ceb4b459c2ac699549076ff123c166aa", - "recorded_at": "2026-10-25T17:36:53Z" + "dfo_commit": "d80df9f5fd598b7345255470932d202ee5d49942", + "recorded_at": "2026-10-26T09:23:18Z" }, "call": [ { @@ -36,7 +36,7 @@ "status": 200, "headers": { "content-type": "application/json", - "x-dfo-trace-id": "76714f7f2e6c422cb6ed291c6100849e" + "x-dfo-trace-id": "2e930444ceab49e29354b073af99327e" }, "json": { "schema_version": 1, @@ -47,14 +47,14 @@ "extract_skipped": true }, "diagnostics": { - "engine_build": "99e62038ceb4b459c2ac699549076ff123c166aa", - "trace_id": "76714f7f2e6c422cb6ed291c6100849e", + "engine_build": "d80df9f5fd598b7345255470932d202ee5d49942", + "trace_id": "2e930444ceab49e29354b073af99327e", "warnings": [], "timing_ms": { "total": 1, "by_step": { "coverage": 0, - "response_cache_layer1": 1 + "response_cache_layer1": 0 } }, "llm_usage": { @@ -72,8 +72,8 @@ "timing_ms": { "total": 1, "by_step": { - "recall": 0, - "phase_resolve_places": 1, + "recall": 1, + "phase_resolve_places": 0, "phase_check_entities": 0 } }, @@ -244,9 +244,9 @@ "variable_text": "ODA disbursements", "warnings": [], "timing_ms": { - "total": 1, + "total": 2, "by_step": { - "recall": 1, + "recall": 2, "phase_resolve_places": 0, "phase_check_entities": 0 } @@ -510,7 +510,7 @@ "status": 200, "headers": { "content-type": "application/json", - "x-dfo-trace-id": "538d2ec3169d4007a41b9969bb6d11ae" + "x-dfo-trace-id": "729685f37628473f8bb70255010dc59a" }, "json": { "schema_version": 1, @@ -519,11 +519,11 @@ "extract_skipped": true }, "diagnostics": { - "engine_build": "99e62038ceb4b459c2ac699549076ff123c166aa", - "trace_id": "538d2ec3169d4007a41b9969bb6d11ae", + "engine_build": "d80df9f5fd598b7345255470932d202ee5d49942", + "trace_id": "729685f37628473f8bb70255010dc59a", "warnings": [], "timing_ms": { - "total": 1883, + "total": 1092, "by_step": { "coverage": 0 } @@ -545,14 +545,14 @@ { "code": "time_window_defaulted", "severity": "warn", - "message": "no time_text was given; the answer was resolved across every period with data." + "message": "No years were given, so the answer covers every year with data." } ], "timing_ms": { - "total": 2, + "total": 1, "by_step": { - "recall": 2, - "phase_resolve_places": 0, + "recall": 0, + "phase_resolve_places": 1, "phase_check_entities": 0 } }, @@ -730,34 +730,34 @@ { "code": "time_window_defaulted", "severity": "warn", - "message": "no time_text was given; the answer was resolved across every period with data." + "message": "No years were given, so the answer covers every year with data." } ], "timing_ms": { - "total": 1878, + "total": 1087, "by_step": { - "recall": 2, + "recall": 1, "phase_resolve_places": 0, "phase_check_entities": 0, "shape_arcs": 1, - "shape_probe_coverage": 8, - "shape_probe": 828, - "shape_groups": 58, + "shape_probe_coverage": 7, + "shape_probe": 104, + "shape_groups": 59, "shape_labels": 1, - "shape_admission": 0, + "shape_admission": 1, "phase_derive_shapes": 0, - "shape": 1252, + "shape": 451, "phase_prune_and_rank": 0, - "bind": 92, - "phase_bind": 235, - "phase_settle": 9, - "phase_place_bindings": 88, + "bind": 105, + "phase_bind": 247, + "phase_settle": 8, + "phase_place_bindings": 77, "phase_facet_requests": 0, "materialise": 16, - "phase_materialise": 6, - "answer": 10, - "options": 7, - "phase_outcome": 161 + "phase_materialise": 5, + "answer": 9, + "options": 6, + "phase_outcome": 162 } }, "restatement": { @@ -1643,7 +1643,7 @@ "selected": [] } ], - "capability_version": "cap_88defe77cc79e0c0", + "capability_version": "cap_765c9d2a0c7529b9", "default_reading": { "applied": true, "removed_stat_vars": [] 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 7c2274c..22fb908 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": "1af94637ff7043abb23f65b60e28d604" + "x-dfo-trace-id": "44089cedfffd4c0ca025f3d8faba0ca7" }, "json": { "schema_version": 1, @@ -46,14 +46,14 @@ "extract_skipped": false }, "diagnostics": { - "engine_build": "99e62038ceb4b459c2ac699549076ff123c166aa", - "trace_id": "1af94637ff7043abb23f65b60e28d604", + "engine_build": "d80df9f5fd598b7345255470932d202ee5d49942", + "trace_id": "44089cedfffd4c0ca025f3d8faba0ca7", "warnings": [], "timing_ms": { - "total": 2578, + "total": 2666, "by_step": { "coverage": 0, - "extract": 1025, + "extract": 1154, "cache_lookup": 0 } }, @@ -72,29 +72,29 @@ "variable_text": "GDP", "warnings": [], "timing_ms": { - "total": 1276, + "total": 1283, "by_step": { - "recall": 1, - "phase_resolve_places": 1, + "recall": 2, + "phase_resolve_places": 0, "phase_check_entities": 0, "shape_arcs": 4, - "shape_probe_coverage": 17, - "shape_probe": 266, - "shape_groups": 61, + "shape_probe_coverage": 5, + "shape_probe": 116, + "shape_groups": 64, "shape_labels": 12, - "shape_admission": 2, + "shape_admission": 1, "phase_derive_shapes": 0, - "shape": 538, + "shape": 463, "phase_prune_and_rank": 0, - "bind": 153, + "bind": 125, "phase_bind": 12, "phase_settle": 6, - "phase_place_bindings": 12, + "phase_place_bindings": 10, "phase_facet_requests": 0, - "materialise": 120, - "phase_materialise": 19, - "answer": 172, - "options": 115, + "materialise": 173, + "phase_materialise": 18, + "answer": 207, + "options": 140, "phase_outcome": 127 } }, @@ -157,24 +157,24 @@ "variable_text": "ODA", "warnings": [], "timing_ms": { - "total": 487, + "total": 598, "by_step": { - "recall": 1, + "recall": 301, "phase_resolve_places": 0, "phase_check_entities": 0, - "shape_arcs": 3, - "shape_probe_coverage": 10, - "shape_probe": 108, + "shape_arcs": 2, + "shape_probe_coverage": 6, + "shape_probe": 99, "shape_groups": 3, "shape_labels": 0, - "shape_admission": 1, + "shape_admission": 0, "phase_derive_shapes": 0, - "shape": 253, + "shape": 189, "phase_prune_and_rank": 0, - "bind": 218, - "phase_bind": 2, - "phase_settle": 8, - "phase_place_bindings": 5 + "bind": 91, + "phase_bind": 3, + "phase_settle": 7, + "phase_place_bindings": 7 } }, "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 +660,7 @@ "status": 200, "headers": { "content-type": "application/json", - "x-dfo-trace-id": "9296d6d509bb4007ab9b828b29f773db" + "x-dfo-trace-id": "4f781d285d73459fa3f2f981f5828776" }, "json": { "schema_version": 1, @@ -669,11 +669,11 @@ "extract_skipped": true }, "diagnostics": { - "engine_build": "99e62038ceb4b459c2ac699549076ff123c166aa", - "trace_id": "9296d6d509bb4007ab9b828b29f773db", + "engine_build": "d80df9f5fd598b7345255470932d202ee5d49942", + "trace_id": "4f781d285d73459fa3f2f981f5828776", "warnings": [], "timing_ms": { - "total": 1192, + "total": 1276, "by_step": { "coverage": 0 } @@ -693,19 +693,19 @@ "variable_text": "GDP", "warnings": [], "timing_ms": { - "total": 1069, + "total": 1161, "by_step": { "validate": 0, - "walk": 0, - "reread_arcs": 1, + "walk": 1, + "reread_arcs": 0, "detect_edits": 0, "resolve_survivors": 0, - "shape": 829, - "bind": 0, - "where_places": 1, - "materialise": 123, + "shape": 921, + "bind": 1, + "where_places": 0, + "materialise": 120, "answer": 4, - "options": 111 + "options": 114 } }, "entity_refs": [], @@ -2220,7 +2220,7 @@ "start_year": 2015, "end_year": 2015 }, - "capability_version": "cap_88defe77cc79e0c0" + "capability_version": "cap_765c9d2a0c7529b9" }, "confidence": "high", "available_at_place": true, @@ -2295,29 +2295,29 @@ "variable_text": "ODA", "warnings": [], "timing_ms": { - "total": 382, + "total": 399, "by_step": { - "recall": 2, + "recall": 0, "phase_resolve_places": 0, "phase_check_entities": 0, "shape_arcs": 2, - "shape_probe_coverage": 7, - "shape_probe": 84, + "shape_probe_coverage": 6, + "shape_probe": 97, "shape_groups": 3, "shape_labels": 0, - "shape_admission": 0, + "shape_admission": 1, "phase_derive_shapes": 0, - "shape": 162, + "shape": 181, "phase_prune_and_rank": 0, - "bind": 99, - "phase_bind": 11, + "bind": 100, + "phase_bind": 12, "phase_settle": 8, "phase_place_bindings": 1, "phase_facet_requests": 0, - "materialise": 21, + "materialise": 20, "phase_materialise": 5, - "answer": 11, - "options": 12, + "answer": 15, + "options": 7, "phase_outcome": 50 } }, @@ -3432,7 +3432,7 @@ "start_year": 2015, "end_year": 2015 }, - "capability_version": "cap_88defe77cc79e0c0", + "capability_version": "cap_765c9d2a0c7529b9", "default_reading": { "applied": true, "removed_stat_vars": [] 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 4c62233..e5437b3 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": "38ca03326c514418af8164d5740ec677" + "x-dfo-trace-id": "86b361f85db44a29b3d711350962ca73" }, "json": { "schema_version": 1, @@ -46,14 +46,14 @@ "extract_skipped": false }, "diagnostics": { - "engine_build": "99e62038ceb4b459c2ac699549076ff123c166aa", - "trace_id": "38ca03326c514418af8164d5740ec677", + "engine_build": "d80df9f5fd598b7345255470932d202ee5d49942", + "trace_id": "86b361f85db44a29b3d711350962ca73", "warnings": [], "timing_ms": { - "total": 492, + "total": 456, "by_step": { "coverage": 0, - "extract": 1, + "extract": 0, "cache_lookup": 0 } }, @@ -72,30 +72,30 @@ "variable_text": "debt service", "warnings": [], "timing_ms": { - "total": 486, + "total": 452, "by_step": { - "recall": 0, + "recall": 1, "phase_resolve_places": 0, "phase_check_entities": 0, "shape_arcs": 2, - "shape_probe_coverage": 15, - "shape_probe": 105, - "shape_groups": 7, - "shape_labels": 11, + "shape_probe_coverage": 17, + "shape_probe": 101, + "shape_groups": 8, + "shape_labels": 14, "shape_admission": 0, "phase_derive_shapes": 0, - "shape": 219, + "shape": 225, "phase_prune_and_rank": 0, - "bind": 112, - "phase_bind": 14, + "bind": 77, + "phase_bind": 17, "phase_settle": 5, - "phase_place_bindings": 12, + "phase_place_bindings": 14, "phase_facet_requests": 0, "materialise": 11, "phase_materialise": 23, "answer": 2, - "options": 8, - "phase_outcome": 80 + "options": 9, + "phase_outcome": 68 } }, "restatement": { @@ -1288,7 +1288,7 @@ } ], "query_qualifiers": [], - "capability_version": "cap_88defe77cc79e0c0", + "capability_version": "cap_765c9d2a0c7529b9", "default_reading": { "applied": true, "removed_stat_vars": [] @@ -3273,18 +3273,18 @@ "variable_text": "price of tea", "warnings": [], "timing_ms": { - "total": 100, + "total": 121, "by_step": { "recall": 0, "phase_resolve_places": 0, "phase_check_entities": 0, - "shape_arcs": 2, - "shape_probe": 91, + "shape_arcs": 1, + "shape_probe": 96, "shape_groups": 1, "shape_labels": 0, - "shape_admission": 1, + "shape_admission": 0, "phase_derive_shapes": 0, - "shape": 100, + "shape": 121, "phase_prune_and_rank": 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 3925160..a6964dc 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": "4fae4e9b2aac46e181137e1a5933cad9" + "x-dfo-trace-id": "5df79c87dd3c43589df5c2921f3c93e3" }, "json": { "schema_version": 1, @@ -46,14 +46,14 @@ "extract_skipped": false }, "diagnostics": { - "engine_build": "99e62038ceb4b459c2ac699549076ff123c166aa", - "trace_id": "4fae4e9b2aac46e181137e1a5933cad9", + "engine_build": "d80df9f5fd598b7345255470932d202ee5d49942", + "trace_id": "5df79c87dd3c43589df5c2921f3c93e3", "warnings": [], "timing_ms": { - "total": 1079, + "total": 1209, "by_step": { "coverage": 0, - "extract": 1073, + "extract": 1202, "cache_lookup": 0 } }, @@ -72,8 +72,8 @@ "timing_ms": { "total": 1, "by_step": { - "recall": 0, - "phase_resolve_places": 1, + "recall": 1, + "phase_resolve_places": 0, "phase_check_entities": 0 } }, @@ -244,9 +244,9 @@ "variable_text": "ODA disbursements", "warnings": [], "timing_ms": { - "total": 1, + "total": 2, "by_step": { - "recall": 1, + "recall": 2, "phase_resolve_places": 0, "phase_check_entities": 0 } 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 faca1e0..6025dd5 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": "7abc6f06215b4187a4280d87d6f8a51a" + "x-dfo-trace-id": "c7cb40f3790f4a15a0ddcad0cc93c9bb" }, "json": { "schema_version": 1, @@ -45,8 +45,8 @@ "extract_skipped": true }, "diagnostics": { - "engine_build": "99e62038ceb4b459c2ac699549076ff123c166aa", - "trace_id": "7abc6f06215b4187a4280d87d6f8a51a", + "engine_build": "d80df9f5fd598b7345255470932d202ee5d49942", + "trace_id": "c7cb40f3790f4a15a0ddcad0cc93c9bb", "warnings": [], "timing_ms": { "total": 3, @@ -68,30 +68,30 @@ "variable_text": "ODA disbursements for basic health care", "warnings": [], "timing_ms": { - "total": 1669, + "total": 3011, "by_step": { - "recall": 397, + "recall": 457, "phase_resolve_places": 0, "phase_check_entities": 0, - "shape_arcs": 1, - "shape_probe_coverage": 4, - "shape_probe": 115, - "shape_groups": 53, + "shape_arcs": 2, + "shape_probe_coverage": 8, + "shape_probe": 114, + "shape_groups": 579, "shape_labels": 1, - "shape_admission": 1, + "shape_admission": 2, "phase_derive_shapes": 0, - "shape": 276, + "shape": 1247, "phase_prune_and_rank": 0, - "bind": 214, - "phase_bind": 203, - "phase_settle": 45, - "phase_place_bindings": 20, + "bind": 266, + "phase_bind": 327, + "phase_settle": 46, + "phase_place_bindings": 57, "phase_facet_requests": 0, - "materialise": 28, - "phase_materialise": 196, - "answer": 145, - "options": 50, - "phase_outcome": 95 + "materialise": 44, + "phase_materialise": 200, + "answer": 220, + "options": 55, + "phase_outcome": 92 } }, "restatement": { @@ -1191,7 +1191,7 @@ "selected": [] } ], - "capability_version": "cap_88defe77cc79e0c0", + "capability_version": "cap_765c9d2a0c7529b9", "default_reading": { "applied": true, "removed_stat_vars": [] 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 65fbbea..0ea3c80 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": "7fd4a5b5b50648999f5ead8966bcc02c" + "x-dfo-trace-id": "01cf4a9623c449759f24d249f8783de1" }, "json": { "schema_version": 1, @@ -45,14 +45,14 @@ "extract_skipped": false }, "diagnostics": { - "engine_build": "99e62038ceb4b459c2ac699549076ff123c166aa", - "trace_id": "7fd4a5b5b50648999f5ead8966bcc02c", + "engine_build": "d80df9f5fd598b7345255470932d202ee5d49942", + "trace_id": "01cf4a9623c449759f24d249f8783de1", "warnings": [], "timing_ms": { - "total": 1054, + "total": 1162, "by_step": { "coverage": 0, - "extract": 1050, + "extract": 1040, "cache_lookup": 0 } }, @@ -69,9 +69,9 @@ "variable_text": "ODA disbursements", "warnings": [], "timing_ms": { - "total": 0, + "total": 117, "by_step": { - "recall": 0, + "recall": 117, "phase_resolve_places": 0, "phase_check_entities": 0 } 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 0e8b742..5900087 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": "962188ce8826466e8510fb819d5dc26d" + "x-dfo-trace-id": "2de415a9f27d4ce69e4f1eb97b5951af" }, "json": { "schema_version": 1, @@ -45,14 +45,14 @@ "extract_skipped": false }, "diagnostics": { - "engine_build": "99e62038ceb4b459c2ac699549076ff123c166aa", - "trace_id": "962188ce8826466e8510fb819d5dc26d", + "engine_build": "d80df9f5fd598b7345255470932d202ee5d49942", + "trace_id": "2de415a9f27d4ce69e4f1eb97b5951af", "warnings": [], "timing_ms": { - "total": 1710, + "total": 4676, "by_step": { - "coverage": 0, - "extract": 0, + "coverage": 1, + "extract": 1, "cache_lookup": 0 } }, @@ -60,7 +60,7 @@ "input_tokens": 0, "output_tokens": 0, "cached_tokens": 0, - "jev_input_tokens": 13358, + "jev_input_tokens": 13359, "jev_output_tokens": 2855 }, "timed_out": false @@ -71,28 +71,28 @@ "variable_text": "mortality", "warnings": [], "timing_ms": { - "total": 1705, + "total": 4672, "by_step": { "recall": 1, "phase_resolve_places": 0, "phase_check_entities": 0, - "shape_arcs": 4, - "shape_probe": 2, + "shape_arcs": 6, + "shape_probe": 120, "shape_groups": 6, - "shape_labels": 1, + "shape_labels": 2, "shape_admission": 1, "phase_derive_shapes": 0, - "shape": 119, + "shape": 258, "phase_prune_and_rank": 0, - "bind": 146, - "phase_bind": 19, - "phase_settle": 2, - "phase_place_bindings": 30, + "bind": 154, + "phase_bind": 18, + "phase_settle": 1, + "phase_place_bindings": 39, "phase_facet_requests": 0, - "materialise": 21, - "phase_materialise": 25, + "materialise": 202, + "phase_materialise": 33, "answer": 30, - "phase_outcome": 1312 + "phase_outcome": 3936 } }, "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.", @@ -814,7 +814,7 @@ "start_year": 2013, "end_year": 2022 }, - "capability_version": "cap_88defe77cc79e0c0", + "capability_version": "cap_765c9d2a0c7529b9", "default_reading": { "applied": true, "removed_stat_vars": [] @@ -1597,6 +1597,15 @@ "value_kind": "enum_value" } }, + { + "value": { + "ref": { + "ref": "Years0", + "label": "Years 0" + }, + "value_kind": "enum_value" + } + }, { "value": { "ref": { @@ -1813,6 +1822,15 @@ "value_kind": "enum_value" } }, + { + "value": { + "ref": { + "ref": "Years85", + "label": "Years 85" + }, + "value_kind": "enum_value" + } + }, { "value": { "ref": { @@ -2348,7 +2366,7 @@ "start_year": 2013, "end_year": 2022 }, - "capability_version": "cap_88defe77cc79e0c0", + "capability_version": "cap_765c9d2a0c7529b9", "default_reading": { "applied": true, "removed_stat_vars": [] 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 e2e8436..31f75cf 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": "1af94637ff7043abb23f65b60e28d604" + "x-dfo-trace-id": "44089cedfffd4c0ca025f3d8faba0ca7" }, "json": { "schema_version": 1, @@ -46,14 +46,14 @@ "extract_skipped": false }, "diagnostics": { - "engine_build": "99e62038ceb4b459c2ac699549076ff123c166aa", - "trace_id": "1af94637ff7043abb23f65b60e28d604", + "engine_build": "d80df9f5fd598b7345255470932d202ee5d49942", + "trace_id": "44089cedfffd4c0ca025f3d8faba0ca7", "warnings": [], "timing_ms": { - "total": 2578, + "total": 2666, "by_step": { "coverage": 0, - "extract": 1025, + "extract": 1154, "cache_lookup": 0 } }, @@ -71,29 +71,29 @@ { "warnings": [], "timing_ms": { - "total": 1276, + "total": 1283, "by_step": { - "recall": 1, - "phase_resolve_places": 1, + "recall": 2, + "phase_resolve_places": 0, "phase_check_entities": 0, "shape_arcs": 4, - "shape_probe_coverage": 17, - "shape_probe": 266, - "shape_groups": 61, + "shape_probe_coverage": 5, + "shape_probe": 116, + "shape_groups": 64, "shape_labels": 12, - "shape_admission": 2, + "shape_admission": 1, "phase_derive_shapes": 0, - "shape": 538, + "shape": 463, "phase_prune_and_rank": 0, - "bind": 153, + "bind": 125, "phase_bind": 12, "phase_settle": 6, - "phase_place_bindings": 12, + "phase_place_bindings": 10, "phase_facet_requests": 0, - "materialise": 120, - "phase_materialise": 19, - "answer": 172, - "options": 115, + "materialise": 173, + "phase_materialise": 18, + "answer": 207, + "options": 140, "phase_outcome": 127 } }, @@ -1958,7 +1958,7 @@ "start_year": 2015, "end_year": 2015 }, - "capability_version": "cap_88defe77cc79e0c0", + "capability_version": "cap_765c9d2a0c7529b9", "default_reading": { "applied": true, "removed_stat_vars": [ @@ -2877,7 +2877,7 @@ "start_year": 2015, "end_year": 2015 }, - "capability_version": "cap_88defe77cc79e0c0", + "capability_version": "cap_765c9d2a0c7529b9", "default_reading": { "applied": true, "removed_stat_vars": [ @@ -2980,24 +2980,24 @@ "variable_text": "ODA", "warnings": [], "timing_ms": { - "total": 487, + "total": 598, "by_step": { - "recall": 1, + "recall": 301, "phase_resolve_places": 0, "phase_check_entities": 0, - "shape_arcs": 3, - "shape_probe_coverage": 10, - "shape_probe": 108, + "shape_arcs": 2, + "shape_probe_coverage": 6, + "shape_probe": 99, "shape_groups": 3, "shape_labels": 0, - "shape_admission": 1, + "shape_admission": 0, "phase_derive_shapes": 0, - "shape": 253, + "shape": 189, "phase_prune_and_rank": 0, - "bind": 218, - "phase_bind": 2, - "phase_settle": 8, - "phase_place_bindings": 5 + "bind": 91, + "phase_bind": 3, + "phase_settle": 7, + "phase_place_bindings": 7 } }, "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 4766cec..85414ff 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 @@ -34,7 +34,7 @@ "status": 200, "headers": { "content-type": "application/json", - "x-dfo-trace-id": "962188ce8826466e8510fb819d5dc26d" + "x-dfo-trace-id": "2de415a9f27d4ce69e4f1eb97b5951af" }, "json": { "schema_version": 1, @@ -45,14 +45,14 @@ "extract_skipped": false }, "diagnostics": { - "engine_build": "99e62038ceb4b459c2ac699549076ff123c166aa", - "trace_id": "962188ce8826466e8510fb819d5dc26d", + "engine_build": "d80df9f5fd598b7345255470932d202ee5d49942", + "trace_id": "2de415a9f27d4ce69e4f1eb97b5951af", "warnings": [], "timing_ms": { - "total": 1710, + "total": 4676, "by_step": { - "coverage": 0, - "extract": 0, + "coverage": 1, + "extract": 1, "cache_lookup": 0 } }, @@ -60,7 +60,7 @@ "input_tokens": 0, "output_tokens": 0, "cached_tokens": 0, - "jev_input_tokens": 13358, + "jev_input_tokens": 13359, "jev_output_tokens": 2855 }, "timed_out": false @@ -71,28 +71,28 @@ "variable_text": "mortality", "warnings": [], "timing_ms": { - "total": 1705, + "total": 4672, "by_step": { "recall": 1, "phase_resolve_places": 0, "phase_check_entities": 0, - "shape_arcs": 4, - "shape_probe": 2, + "shape_arcs": 6, + "shape_probe": 120, "shape_groups": 6, - "shape_labels": 1, + "shape_labels": 2, "shape_admission": 1, "phase_derive_shapes": 0, - "shape": 119, + "shape": 258, "phase_prune_and_rank": 0, - "bind": 146, - "phase_bind": 19, - "phase_settle": 2, - "phase_place_bindings": 30, + "bind": 154, + "phase_bind": 18, + "phase_settle": 1, + "phase_place_bindings": 39, "phase_facet_requests": 0, - "materialise": 21, - "phase_materialise": 25, + "materialise": 202, + "phase_materialise": 33, "answer": 30, - "phase_outcome": 1312 + "phase_outcome": 3936 } }, "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.", @@ -814,7 +814,7 @@ "start_year": 2013, "end_year": 2022 }, - "capability_version": "cap_88defe77cc79e0c0", + "capability_version": "cap_765c9d2a0c7529b9", "default_reading": { "applied": true, "removed_stat_vars": [] @@ -1597,6 +1597,15 @@ "value_kind": "enum_value" } }, + { + "value": { + "ref": { + "ref": "Years0", + "label": "Years 0" + }, + "value_kind": "enum_value" + } + }, { "value": { "ref": { @@ -1813,6 +1822,15 @@ "value_kind": "enum_value" } }, + { + "value": { + "ref": { + "ref": "Years85", + "label": "Years 85" + }, + "value_kind": "enum_value" + } + }, { "value": { "ref": { @@ -2293,7 +2311,7 @@ "start_year": 2013, "end_year": 2022 }, - "capability_version": "cap_88defe77cc79e0c0", + "capability_version": "cap_765c9d2a0c7529b9", "default_reading": { "applied": true, "removed_stat_vars": [] 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 6476e13..6886548 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,8 +45,8 @@ "extract_skipped": true }, "diagnostics": { - "engine_build": "99e62038ceb4b459c2ac699549076ff123c166aa", - "trace_id": "355b1d08f8b442af87e20ecc65522a53", + "engine_build": "d80df9f5fd598b7345255470932d202ee5d49942", + "trace_id": "989481cf76744b4cbddf1aff890cda9c", "warnings": [], "timing_ms": { "total": 1, @@ -68,9 +68,9 @@ "variable_text": "ODA disbursements", "warnings": [], "timing_ms": { - "total": 0, + "total": 117, "by_step": { - "recall": 0, + "recall": 117, "phase_resolve_places": 0, "phase_check_entities": 0 } 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 cf1c0b2..b078e79 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": "4fae4e9b2aac46e181137e1a5933cad9" + "x-dfo-trace-id": "5df79c87dd3c43589df5c2921f3c93e3" }, "json": { "schema_version": 1, @@ -45,14 +45,14 @@ "extract_skipped": false }, "diagnostics": { - "engine_build": "99e62038ceb4b459c2ac699549076ff123c166aa", - "trace_id": "4fae4e9b2aac46e181137e1a5933cad9", + "engine_build": "d80df9f5fd598b7345255470932d202ee5d49942", + "trace_id": "5df79c87dd3c43589df5c2921f3c93e3", "warnings": [], "timing_ms": { - "total": 1079, + "total": 1209, "by_step": { "coverage": 0, - "extract": 1073, + "extract": 1202, "cache_lookup": 0 } }, @@ -71,8 +71,8 @@ "timing_ms": { "total": 1, "by_step": { - "recall": 0, - "phase_resolve_places": 1, + "recall": 1, + "phase_resolve_places": 0, "phase_check_entities": 0 } }, @@ -243,9 +243,9 @@ "variable_text": "ODA disbursements", "warnings": [], "timing_ms": { - "total": 1, + "total": 2, "by_step": { - "recall": 1, + "recall": 2, "phase_resolve_places": 0, "phase_check_entities": 0 } 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 3fa6c94..893fd5f 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": "962188ce8826466e8510fb819d5dc26d" + "x-dfo-trace-id": "2de415a9f27d4ce69e4f1eb97b5951af" }, "json": { "schema_version": 1, @@ -45,14 +45,14 @@ "extract_skipped": false }, "diagnostics": { - "engine_build": "99e62038ceb4b459c2ac699549076ff123c166aa", - "trace_id": "962188ce8826466e8510fb819d5dc26d", + "engine_build": "d80df9f5fd598b7345255470932d202ee5d49942", + "trace_id": "2de415a9f27d4ce69e4f1eb97b5951af", "warnings": [], "timing_ms": { - "total": 1710, + "total": 4676, "by_step": { - "coverage": 0, - "extract": 0, + "coverage": 1, + "extract": 1, "cache_lookup": 0 } }, @@ -60,7 +60,7 @@ "input_tokens": 0, "output_tokens": 0, "cached_tokens": 0, - "jev_input_tokens": 13358, + "jev_input_tokens": 13359, "jev_output_tokens": 2855 }, "timed_out": false @@ -71,28 +71,28 @@ "variable_text": "mortality", "warnings": [], "timing_ms": { - "total": 1705, + "total": 4672, "by_step": { "recall": 1, "phase_resolve_places": 0, "phase_check_entities": 0, - "shape_arcs": 4, - "shape_probe": 2, + "shape_arcs": 6, + "shape_probe": 120, "shape_groups": 6, - "shape_labels": 1, + "shape_labels": 2, "shape_admission": 1, "phase_derive_shapes": 0, - "shape": 119, + "shape": 258, "phase_prune_and_rank": 0, - "bind": 146, - "phase_bind": 19, - "phase_settle": 2, - "phase_place_bindings": 30, + "bind": 154, + "phase_bind": 18, + "phase_settle": 1, + "phase_place_bindings": 39, "phase_facet_requests": 0, - "materialise": 21, - "phase_materialise": 25, + "materialise": 202, + "phase_materialise": 33, "answer": 30, - "phase_outcome": 1312 + "phase_outcome": 3936 } }, "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.", @@ -814,7 +814,7 @@ "start_year": 2013, "end_year": 2022 }, - "capability_version": "cap_88defe77cc79e0c0", + "capability_version": "cap_765c9d2a0c7529b9", "default_reading": { "applied": true, "removed_stat_vars": [] @@ -1597,6 +1597,15 @@ "value_kind": "enum_value" } }, + { + "value": { + "ref": { + "ref": "Years0", + "label": "Years 0" + }, + "value_kind": "enum_value" + } + }, { "value": { "ref": { @@ -1813,6 +1822,15 @@ "value_kind": "enum_value" } }, + { + "value": { + "ref": { + "ref": "Years85", + "label": "Years 85" + }, + "value_kind": "enum_value" + } + }, { "value": { "ref": { @@ -2348,7 +2366,7 @@ "start_year": 2013, "end_year": 2022 }, - "capability_version": "cap_88defe77cc79e0c0", + "capability_version": "cap_765c9d2a0c7529b9", "default_reading": { "applied": true, "removed_stat_vars": [] 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 168b063..49de559 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": "7fd4a5b5b50648999f5ead8966bcc02c" + "x-dfo-trace-id": "01cf4a9623c449759f24d249f8783de1" }, "json": { "schema_version": 1, @@ -45,14 +45,14 @@ "extract_skipped": false }, "diagnostics": { - "engine_build": "99e62038ceb4b459c2ac699549076ff123c166aa", - "trace_id": "7fd4a5b5b50648999f5ead8966bcc02c", + "engine_build": "d80df9f5fd598b7345255470932d202ee5d49942", + "trace_id": "01cf4a9623c449759f24d249f8783de1", "warnings": [], "timing_ms": { - "total": 1054, + "total": 1162, "by_step": { "coverage": 0, - "extract": 1050, + "extract": 1040, "cache_lookup": 0 } }, @@ -69,9 +69,9 @@ "variable_text": "ODA disbursements", "warnings": [], "timing_ms": { - "total": 0, + "total": 117, "by_step": { - "recall": 0, + "recall": 117, "phase_resolve_places": 0, "phase_check_entities": 0 } 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 3698118..57beb8e 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": "38ca03326c514418af8164d5740ec677" + "x-dfo-trace-id": "86b361f85db44a29b3d711350962ca73" }, "json": { "schema_version": 1, @@ -46,14 +46,14 @@ "extract_skipped": false }, "diagnostics": { - "engine_build": "99e62038ceb4b459c2ac699549076ff123c166aa", - "trace_id": "38ca03326c514418af8164d5740ec677", + "engine_build": "d80df9f5fd598b7345255470932d202ee5d49942", + "trace_id": "86b361f85db44a29b3d711350962ca73", "warnings": [], "timing_ms": { - "total": 492, + "total": 456, "by_step": { "coverage": 0, - "extract": 1, + "extract": 0, "cache_lookup": 0 } }, @@ -72,30 +72,30 @@ "variable_text": "debt service", "warnings": [], "timing_ms": { - "total": 486, + "total": 452, "by_step": { - "recall": 0, + "recall": 1, "phase_resolve_places": 0, "phase_check_entities": 0, "shape_arcs": 2, - "shape_probe_coverage": 15, - "shape_probe": 105, - "shape_groups": 7, - "shape_labels": 11, + "shape_probe_coverage": 17, + "shape_probe": 101, + "shape_groups": 8, + "shape_labels": 14, "shape_admission": 0, "phase_derive_shapes": 0, - "shape": 219, + "shape": 225, "phase_prune_and_rank": 0, - "bind": 112, - "phase_bind": 14, + "bind": 77, + "phase_bind": 17, "phase_settle": 5, - "phase_place_bindings": 12, + "phase_place_bindings": 14, "phase_facet_requests": 0, "materialise": 11, "phase_materialise": 23, "answer": 2, - "options": 8, - "phase_outcome": 80 + "options": 9, + "phase_outcome": 68 } }, "restatement": { @@ -1288,7 +1288,7 @@ } ], "query_qualifiers": [], - "capability_version": "cap_88defe77cc79e0c0", + "capability_version": "cap_765c9d2a0c7529b9", "default_reading": { "applied": true, "removed_stat_vars": [] @@ -3273,18 +3273,18 @@ "variable_text": "price of tea", "warnings": [], "timing_ms": { - "total": 100, + "total": 121, "by_step": { "recall": 0, "phase_resolve_places": 0, "phase_check_entities": 0, - "shape_arcs": 2, - "shape_probe": 91, + "shape_arcs": 1, + "shape_probe": 96, "shape_groups": 1, "shape_labels": 0, - "shape_admission": 1, + "shape_admission": 0, "phase_derive_shapes": 0, - "shape": 100, + "shape": 121, "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 984fd09..151f531 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": "1af94637ff7043abb23f65b60e28d604" + "x-dfo-trace-id": "44089cedfffd4c0ca025f3d8faba0ca7" }, "json": { "schema_version": 1, @@ -46,14 +46,14 @@ "extract_skipped": false }, "diagnostics": { - "engine_build": "99e62038ceb4b459c2ac699549076ff123c166aa", - "trace_id": "1af94637ff7043abb23f65b60e28d604", + "engine_build": "d80df9f5fd598b7345255470932d202ee5d49942", + "trace_id": "44089cedfffd4c0ca025f3d8faba0ca7", "warnings": [], "timing_ms": { - "total": 2578, + "total": 2666, "by_step": { "coverage": 0, - "extract": 1025, + "extract": 1154, "cache_lookup": 0 } }, @@ -72,29 +72,29 @@ "variable_text": "GDP", "warnings": [], "timing_ms": { - "total": 1276, + "total": 1283, "by_step": { - "recall": 1, - "phase_resolve_places": 1, + "recall": 2, + "phase_resolve_places": 0, "phase_check_entities": 0, "shape_arcs": 4, - "shape_probe_coverage": 17, - "shape_probe": 266, - "shape_groups": 61, + "shape_probe_coverage": 5, + "shape_probe": 116, + "shape_groups": 64, "shape_labels": 12, - "shape_admission": 2, + "shape_admission": 1, "phase_derive_shapes": 0, - "shape": 538, + "shape": 463, "phase_prune_and_rank": 0, - "bind": 153, + "bind": 125, "phase_bind": 12, "phase_settle": 6, - "phase_place_bindings": 12, + "phase_place_bindings": 10, "phase_facet_requests": 0, - "materialise": 120, - "phase_materialise": 19, - "answer": 172, - "options": 115, + "materialise": 173, + "phase_materialise": 18, + "answer": 207, + "options": 140, "phase_outcome": 127 } }, @@ -1942,7 +1942,7 @@ "start_year": 2015, "end_year": 2015 }, - "capability_version": "cap_88defe77cc79e0c0", + "capability_version": "cap_765c9d2a0c7529b9", "default_reading": { "applied": true, "removed_stat_vars": [ @@ -2861,7 +2861,7 @@ "start_year": 2015, "end_year": 2015 }, - "capability_version": "cap_88defe77cc79e0c0", + "capability_version": "cap_765c9d2a0c7529b9", "default_reading": { "applied": true, "removed_stat_vars": [ @@ -2964,24 +2964,24 @@ "variable_text": "ODA", "warnings": [], "timing_ms": { - "total": 487, + "total": 598, "by_step": { - "recall": 1, + "recall": 301, "phase_resolve_places": 0, "phase_check_entities": 0, - "shape_arcs": 3, - "shape_probe_coverage": 10, - "shape_probe": 108, + "shape_arcs": 2, + "shape_probe_coverage": 6, + "shape_probe": 99, "shape_groups": 3, "shape_labels": 0, - "shape_admission": 1, + "shape_admission": 0, "phase_derive_shapes": 0, - "shape": 253, + "shape": 189, "phase_prune_and_rank": 0, - "bind": 218, - "phase_bind": 2, - "phase_settle": 8, - "phase_place_bindings": 5 + "bind": 91, + "phase_bind": 3, + "phase_settle": 7, + "phase_place_bindings": 7 } }, "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 31d2f68..775f678 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": "7c7e42dd77f94ee08a15cef4438ee7ad" + "x-dfo-trace-id": "5e0f0d6a5a6442a38932b02d7f72ed6c" }, "json": { "schema_version": 1, @@ -45,11 +45,11 @@ "extract_skipped": true }, "diagnostics": { - "engine_build": "99e62038ceb4b459c2ac699549076ff123c166aa", - "trace_id": "7c7e42dd77f94ee08a15cef4438ee7ad", + "engine_build": "d80df9f5fd598b7345255470932d202ee5d49942", + "trace_id": "5e0f0d6a5a6442a38932b02d7f72ed6c", "warnings": [], "timing_ms": { - "total": 7, + "total": 8, "by_step": { "coverage": 0, "response_cache_layer1": 1 @@ -68,30 +68,30 @@ "variable_text": "health ODA disbursements", "warnings": [], "timing_ms": { - "total": 2889, + "total": 4401, "by_step": { - "recall": 411, + "recall": 1271, "phase_resolve_places": 0, "phase_check_entities": 0, - "shape_arcs": 3, - "shape_probe_coverage": 32, - "shape_probe": 148, - "shape_groups": 58, - "shape_labels": 11, - "shape_admission": 1, + "shape_arcs": 108, + "shape_probe_coverage": 4, + "shape_probe": 113, + "shape_groups": 72, + "shape_labels": 12, + "shape_admission": 0, "phase_derive_shapes": 0, - "shape": 364, + "shape": 524, "phase_prune_and_rank": 0, - "bind": 440, - "phase_bind": 315, - "phase_settle": 55, - "phase_place_bindings": 25, + "bind": 482, + "phase_bind": 205, + "phase_settle": 57, + "phase_place_bindings": 34, "phase_facet_requests": 0, - "materialise": 471, - "phase_materialise": 208, - "answer": 45, - "options": 348, - "phase_outcome": 207 + "materialise": 686, + "phase_materialise": 225, + "answer": 28, + "options": 685, + "phase_outcome": 204 } }, "restatement": { @@ -1435,7 +1435,7 @@ "selected": [] } ], - "capability_version": "cap_88defe77cc79e0c0", + "capability_version": "cap_765c9d2a0c7529b9", "default_reading": { "applied": true, "removed_stat_vars": [] @@ -3763,30 +3763,30 @@ } ], "timing_ms": { - "total": 3494, + "total": 4561, "by_step": { - "recall": 445, + "recall": 1310, "phase_resolve_places": 0, "phase_check_entities": 0, - "shape_arcs": 1, - "shape_probe_coverage": 6, - "shape_probe": 380, - "shape_groups": 80, + "shape_arcs": 117, + "shape_probe_coverage": 28, + "shape_probe": 126, + "shape_groups": 83, "shape_labels": 12, "shape_admission": 1, "phase_derive_shapes": 0, - "shape": 785, + "shape": 753, "phase_prune_and_rank": 0, - "bind": 385, - "phase_bind": 179, - "phase_settle": 56, - "phase_place_bindings": 45, + "bind": 309, + "phase_bind": 209, + "phase_settle": 82, + "phase_place_bindings": 25, "phase_facet_requests": 0, - "materialise": 1028, - "phase_materialise": 194, - "answer": 42, - "options": 209, - "phase_outcome": 126 + "materialise": 1061, + "phase_materialise": 233, + "answer": 29, + "options": 385, + "phase_outcome": 165 } }, "restatement": { @@ -5130,7 +5130,7 @@ "selected": [] } ], - "capability_version": "cap_88defe77cc79e0c0", + "capability_version": "cap_765c9d2a0c7529b9", "default_reading": { "applied": true, "removed_stat_vars": [] @@ -7463,30 +7463,30 @@ } ], "timing_ms": { - "total": 1747, + "total": 2851, "by_step": { - "recall": 2, + "recall": 360, "phase_resolve_places": 0, "phase_check_entities": 0, - "shape_arcs": 5, - "shape_probe_coverage": 5, - "shape_probe": 124, - "shape_groups": 68, - "shape_labels": 13, - "shape_admission": 1, + "shape_arcs": 4, + "shape_probe_coverage": 2, + "shape_probe": 121, + "shape_groups": 841, + "shape_labels": 17, + "shape_admission": 4, "phase_derive_shapes": 0, - "shape": 405, + "shape": 1100, "phase_prune_and_rank": 0, - "bind": 687, - "phase_bind": 24, - "phase_settle": 6, - "phase_place_bindings": 10, + "bind": 261, + "phase_bind": 16, + "phase_settle": 7, + "phase_place_bindings": 554, "phase_facet_requests": 0, - "materialise": 296, + "materialise": 96, "phase_materialise": 17, - "answer": 7, - "options": 256, - "phase_outcome": 37 + "answer": 239, + "options": 188, + "phase_outcome": 13 } }, "restatement": { @@ -8923,7 +8923,7 @@ } ], "query_qualifiers": [], - "capability_version": "cap_88defe77cc79e0c0", + "capability_version": "cap_765c9d2a0c7529b9", "default_reading": { "applied": true, "removed_stat_vars": [ @@ -9456,7 +9456,7 @@ } ], "query_qualifiers": [], - "capability_version": "cap_88defe77cc79e0c0", + "capability_version": "cap_765c9d2a0c7529b9", "default_reading": { "applied": true, "removed_stat_vars": [ 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 f11d0d5..ef3ebcf 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": "7abc6f06215b4187a4280d87d6f8a51a" + "x-dfo-trace-id": "c7cb40f3790f4a15a0ddcad0cc93c9bb" }, "json": { "schema_version": 1, @@ -44,8 +44,8 @@ "extract_skipped": true }, "diagnostics": { - "engine_build": "99e62038ceb4b459c2ac699549076ff123c166aa", - "trace_id": "7abc6f06215b4187a4280d87d6f8a51a", + "engine_build": "d80df9f5fd598b7345255470932d202ee5d49942", + "trace_id": "c7cb40f3790f4a15a0ddcad0cc93c9bb", "warnings": [], "timing_ms": { "total": 3, @@ -67,30 +67,30 @@ "variable_text": "ODA disbursements for basic health care", "warnings": [], "timing_ms": { - "total": 1669, + "total": 3011, "by_step": { - "recall": 397, + "recall": 457, "phase_resolve_places": 0, "phase_check_entities": 0, - "shape_arcs": 1, - "shape_probe_coverage": 4, - "shape_probe": 115, - "shape_groups": 53, + "shape_arcs": 2, + "shape_probe_coverage": 8, + "shape_probe": 114, + "shape_groups": 579, "shape_labels": 1, - "shape_admission": 1, + "shape_admission": 2, "phase_derive_shapes": 0, - "shape": 276, + "shape": 1247, "phase_prune_and_rank": 0, - "bind": 214, - "phase_bind": 203, - "phase_settle": 45, - "phase_place_bindings": 20, + "bind": 266, + "phase_bind": 327, + "phase_settle": 46, + "phase_place_bindings": 57, "phase_facet_requests": 0, - "materialise": 28, - "phase_materialise": 196, - "answer": 145, - "options": 50, - "phase_outcome": 95 + "materialise": 44, + "phase_materialise": 200, + "answer": 220, + "options": 55, + "phase_outcome": 92 } }, "restatement": { @@ -1190,7 +1190,7 @@ "selected": [] } ], - "capability_version": "cap_88defe77cc79e0c0", + "capability_version": "cap_765c9d2a0c7529b9", "default_reading": { "applied": true, "removed_stat_vars": [] @@ -3780,7 +3780,8 @@ }, "options": { "format": "parquet", - "bundle": false + "bundle": false, + "without_party_totals": true } } }, @@ -3788,7 +3789,7 @@ "status": 200, "headers": { "content-type": "application/json", - "x-dfo-trace-id": "70ac3c153571497dab413643b6537466" + "x-dfo-trace-id": "4c3f35c8c0d44b99941a73a9519b41d2" }, "json": { "schema_version": 1, @@ -4189,7 +4190,7 @@ "frame_grammar_version": "1.1.0", "origin_catalogue_build_id": "20261011T194155Z-80081f08", "served_from": "head", - "confirmed_at": "2026-10-25T17:22:10.027136+00:00" + "confirmed_at": "2026-10-26T09:17:22.037029+00:00" }, "warnings": [ { @@ -4211,7 +4212,8 @@ "rendering": { "bundle": false, "format": "parquet", - "layout": 4 + "layout": 4, + "without_party_totals": true }, "bytes": 9842, "media_type": "application/vnd.apache.parquet", @@ -4535,7 +4537,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": "d2d4306f79d2411ebcd110cc1e26f49d" + "x-dfo-trace-id": "333ab72de55449ed8288a5f458406a4c" } } }, @@ -4570,32 +4572,32 @@ "dataset": { "rows": 30, "columns": [ - "stat_var", - "financingProvider", + "time_period", "financingProvider_label", + "financingRecipient_label", + "crsPurpose_label", + "value", + "unit_label", + "crsTypeOfFlow_label", + "provenance_label", + "financingProvider", "financingProvider_kind", "financingRecipient", - "financingRecipient_label", "financingRecipient_kind", "crsCooperationModality", "crsCooperationModality_label", "crsPurpose", - "crsPurpose_label", "crsTypeOfFinance", "crsTypeOfFinance_label", "crsTypeOfFlow", - "crsTypeOfFlow_label", - "time_period", - "value", "unit", - "unit_label", "currency", "price_basis", "base_year", "measurementMethod", "measurementMethod_label", "provenance", - "provenance_label" + "stat_var" ], "complete": true, "members": [ 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 ea94e6f..2adeebd 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": "7fd4a5b5b50648999f5ead8966bcc02c" + "x-dfo-trace-id": "01cf4a9623c449759f24d249f8783de1" }, "json": { "schema_version": 1, @@ -45,14 +45,14 @@ "extract_skipped": false }, "diagnostics": { - "engine_build": "99e62038ceb4b459c2ac699549076ff123c166aa", - "trace_id": "7fd4a5b5b50648999f5ead8966bcc02c", + "engine_build": "d80df9f5fd598b7345255470932d202ee5d49942", + "trace_id": "01cf4a9623c449759f24d249f8783de1", "warnings": [], "timing_ms": { - "total": 1054, + "total": 1162, "by_step": { "coverage": 0, - "extract": 1050, + "extract": 1040, "cache_lookup": 0 } }, @@ -69,9 +69,9 @@ "variable_text": "ODA disbursements", "warnings": [], "timing_ms": { - "total": 0, + "total": 117, "by_step": { - "recall": 0, + "recall": 117, "phase_resolve_places": 0, "phase_check_entities": 0 } @@ -281,7 +281,7 @@ "error": { "class": "IncompleteAnswerError", "code": "answer_incomplete", - "trace_id": "7fd4a5b5b50648999f5ead8966bcc02c" + "trace_id": "01cf4a9623c449759f24d249f8783de1" } } ] 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 8498cc6..8b08a06 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 @@ -93,7 +93,8 @@ "digest": "sha256:421efacc2dc010af38112a087b0b49ff5539f61d2afd12a88272b27e99b5f5db", "rendering": { "format": "parquet", - "bundle": false + "bundle": false, + "without_party_totals": true } } } @@ -111,7 +112,7 @@ "status": 200, "headers": { "content-type": "application/json", - "x-dfo-trace-id": "4a5d0c28ab9544b2a8eabefdcaba5eb9" + "x-dfo-trace-id": "6bc9cad45e3c48769587db03ca0826a9" }, "json": { "schema_version": 1, @@ -950,14 +951,14 @@ { "request": { "method": "GET", - "path": "/datasets/spec_774d6c001a6250aa67ca676ab067895e/cv_b92d94774702c7f05f2075d0b03dd756/file?format=parquet&bundle=false" + "path": "/datasets/spec_774d6c001a6250aa67ca676ab067895e/cv_b92d94774702c7f05f2075d0b03dd756/file?format=parquet&bundle=false&without_party_totals=true" }, "response": { "status": 302, "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": "27db1ff9243247c2b620f137120283ba" + "x-dfo-trace-id": "9db04233957a46068e3999162a93c70c" } } }, @@ -980,32 +981,32 @@ "dataset": { "rows": 30, "columns": [ - "stat_var", - "financingProvider", + "time_period", "financingProvider_label", + "financingRecipient_label", + "crsPurpose_label", + "value", + "unit_label", + "crsTypeOfFlow_label", + "provenance_label", + "financingProvider", "financingProvider_kind", "financingRecipient", - "financingRecipient_label", "financingRecipient_kind", "crsCooperationModality", "crsCooperationModality_label", "crsPurpose", - "crsPurpose_label", "crsTypeOfFinance", "crsTypeOfFinance_label", "crsTypeOfFlow", - "crsTypeOfFlow_label", - "time_period", - "value", "unit", - "unit_label", "currency", "price_basis", "base_year", "measurementMethod", "measurementMethod_label", "provenance", - "provenance_label" + "stat_var" ], "complete": true, "members": [ 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 fc5383d..27976b3 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 @@ -93,7 +93,8 @@ "digest": "sha256:421efacc2dc010af38112a087b0b49ff5539f61d2afd12a88272b27e99b5f5db", "rendering": { "format": "parquet", - "bundle": false + "bundle": false, + "without_party_totals": true } } } @@ -111,7 +112,7 @@ "status": 200, "headers": { "content-type": "application/json", - "x-dfo-trace-id": "4a5d0c28ab9544b2a8eabefdcaba5eb9" + "x-dfo-trace-id": "6bc9cad45e3c48769587db03ca0826a9" }, "json": { "schema_version": 1, @@ -1001,14 +1002,14 @@ { "request": { "method": "GET", - "path": "/datasets/spec_774d6c001a6250aa67ca676ab067895e/cv_b92d94774702c7f05f2075d0b03dd756/file?format=parquet&bundle=false" + "path": "/datasets/spec_774d6c001a6250aa67ca676ab067895e/cv_b92d94774702c7f05f2075d0b03dd756/file?format=parquet&bundle=false&without_party_totals=true" }, "response": { "status": 302, "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": "27db1ff9243247c2b620f137120283ba" + "x-dfo-trace-id": "9db04233957a46068e3999162a93c70c" } } }, @@ -1031,32 +1032,32 @@ "dataset": { "rows": 30, "columns": [ - "stat_var", - "financingProvider", + "time_period", "financingProvider_label", + "financingRecipient_label", + "crsPurpose_label", + "value", + "unit_label", + "crsTypeOfFlow_label", + "provenance_label", + "financingProvider", "financingProvider_kind", "financingRecipient", - "financingRecipient_label", "financingRecipient_kind", "crsCooperationModality", "crsCooperationModality_label", "crsPurpose", - "crsPurpose_label", "crsTypeOfFinance", "crsTypeOfFinance_label", "crsTypeOfFlow", - "crsTypeOfFlow_label", - "time_period", - "value", "unit", - "unit_label", "currency", "price_basis", "base_year", "measurementMethod", "measurementMethod_label", "provenance", - "provenance_label" + "stat_var" ], "complete": true, "members": [ 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 a00aec1..beb1daf 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 @@ -93,7 +93,8 @@ "digest": "sha256:421efacc2dc010af38112a087b0b49ff5539f61d2afd12a88272b27e99b5f5db", "rendering": { "format": "parquet", - "bundle": false + "bundle": false, + "without_party_totals": true } } } @@ -203,7 +204,8 @@ }, "options": { "format": "parquet", - "bundle": false + "bundle": false, + "without_party_totals": true } } }, @@ -211,7 +213,7 @@ "status": 200, "headers": { "content-type": "application/json", - "x-dfo-trace-id": "70ac3c153571497dab413643b6537466" + "x-dfo-trace-id": "4c3f35c8c0d44b99941a73a9519b41d2" }, "json": { "schema_version": 1, @@ -612,7 +614,7 @@ "frame_grammar_version": "1.1.0", "origin_catalogue_build_id": "20261011T194155Z-80081f08", "served_from": "head", - "confirmed_at": "2026-10-25T17:22:10.027136+00:00" + "confirmed_at": "2026-10-26T09:17:22.037029+00:00" }, "warnings": [ { @@ -634,7 +636,8 @@ "rendering": { "bundle": false, "format": "parquet", - "layout": 4 + "layout": 4, + "without_party_totals": true }, "bytes": 9842, "media_type": "application/vnd.apache.parquet", 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 b81f1a0..84a42e1 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 @@ -91,7 +91,8 @@ "digest": "sha256:0000000000000000000000000000000000000000000000000000000000000000", "rendering": { "format": "parquet", - "bundle": false + "bundle": false, + "without_party_totals": true } } } @@ -201,7 +202,8 @@ }, "options": { "format": "parquet", - "bundle": false + "bundle": false, + "without_party_totals": true } } }, @@ -231,7 +233,7 @@ "status": 200, "headers": { "content-type": "application/json", - "x-dfo-trace-id": "ee36259b6d664e7cb028a433fd51bf38" + "x-dfo-trace-id": "7675f31f4bd548c782dad4c6001a7666" }, "json": { "schema_version": 1, 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 6f73b47..aac6fda 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 @@ -93,7 +93,8 @@ "digest": "sha256:421efacc2dc010af38112a087b0b49ff5539f61d2afd12a88272b27e99b5f5db", "rendering": { "format": "parquet", - "bundle": false + "bundle": false, + "without_party_totals": true } } } @@ -203,7 +204,8 @@ }, "options": { "format": "parquet", - "bundle": false + "bundle": false, + "without_party_totals": true } } }, @@ -211,7 +213,7 @@ "status": 200, "headers": { "content-type": "application/json", - "x-dfo-trace-id": "70ac3c153571497dab413643b6537466" + "x-dfo-trace-id": "4c3f35c8c0d44b99941a73a9519b41d2" }, "json": { "schema_version": 1, @@ -612,7 +614,7 @@ "frame_grammar_version": "1.1.0", "origin_catalogue_build_id": "20261011T194155Z-80081f08", "served_from": "head", - "confirmed_at": "2026-10-25T17:22:10.027136+00:00" + "confirmed_at": "2026-10-26T09:17:22.037029+00:00" }, "warnings": [ { @@ -634,7 +636,8 @@ "rendering": { "bundle": false, "format": "parquet", - "layout": 4 + "layout": 4, + "without_party_totals": true }, "bytes": 9842, "media_type": "application/vnd.apache.parquet", @@ -953,7 +956,7 @@ "error": { "class": "ContractError", "code": "contract_violation", - "trace_id": "70ac3c153571497dab413643b6537466" + "trace_id": "4c3f35c8c0d44b99941a73a9519b41d2" } } ] 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 0fd8c35..40f7b18 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 @@ -93,7 +93,8 @@ "digest": "sha256:421efacc2dc010af38112a087b0b49ff5539f61d2afd12a88272b27e99b5f5db", "rendering": { "format": "parquet", - "bundle": false + "bundle": false, + "without_party_totals": true } } } @@ -203,7 +204,8 @@ }, "options": { "format": "parquet", - "bundle": false + "bundle": false, + "without_party_totals": true } } }, @@ -211,7 +213,7 @@ "status": 200, "headers": { "content-type": "application/json", - "x-dfo-trace-id": "70ac3c153571497dab413643b6537466" + "x-dfo-trace-id": "4c3f35c8c0d44b99941a73a9519b41d2" }, "json": { "schema_version": 1, @@ -612,7 +614,7 @@ "frame_grammar_version": "1.1.0", "origin_catalogue_build_id": "20261011T194155Z-80081f08", "served_from": "head", - "confirmed_at": "2026-10-25T17:22:10.027136+00:00" + "confirmed_at": "2026-10-26T09:17:22.037029+00:00" }, "warnings": [ { @@ -634,7 +636,8 @@ "rendering": { "bundle": false, "format": "parquet", - "layout": 4 + "layout": 4, + "without_party_totals": true }, "bytes": 9842, "media_type": "application/vnd.apache.parquet", @@ -957,7 +960,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": "d2d4306f79d2411ebcd110cc1e26f49d" + "x-dfo-trace-id": "333ab72de55449ed8288a5f458406a4c" } } }, @@ -980,32 +983,32 @@ "dataset": { "rows": 30, "columns": [ - "stat_var", - "financingProvider", + "time_period", "financingProvider_label", + "financingRecipient_label", + "crsPurpose_label", + "value", + "unit_label", + "crsTypeOfFlow_label", + "provenance_label", + "financingProvider", "financingProvider_kind", "financingRecipient", - "financingRecipient_label", "financingRecipient_kind", "crsCooperationModality", "crsCooperationModality_label", "crsPurpose", - "crsPurpose_label", "crsTypeOfFinance", "crsTypeOfFinance_label", "crsTypeOfFlow", - "crsTypeOfFlow_label", - "time_period", - "value", "unit", - "unit_label", "currency", "price_basis", "base_year", "measurementMethod", "measurementMethod_label", "provenance", - "provenance_label" + "stat_var" ], "complete": true, "members": [ 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 acb3daa..609e0ee 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": "99e62038ceb4b459c2ac699549076ff123c166aa", - "recorded_at": "2026-10-25T17:37:25Z" + "dfo_commit": "d80df9f5fd598b7345255470932d202ee5d49942", + "recorded_at": "2026-10-26T09:23:52Z" }, "call": [ { @@ -94,7 +94,7 @@ "status": 200, "headers": { "content-type": "application/json", - "x-dfo-trace-id": "ee36259b6d664e7cb028a433fd51bf38" + "x-dfo-trace-id": "7675f31f4bd548c782dad4c6001a7666" }, "json": { "schema_version": 1, 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 46e5a2b..5d12fa5 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 @@ -93,7 +93,8 @@ "digest": "sha256:421efacc2dc010af38112a087b0b49ff5539f61d2afd12a88272b27e99b5f5db", "rendering": { "format": "parquet", - "bundle": false + "bundle": false, + "without_party_totals": true } } } @@ -111,7 +112,7 @@ "status": 200, "headers": { "content-type": "application/json", - "x-dfo-trace-id": "4a5d0c28ab9544b2a8eabefdcaba5eb9" + "x-dfo-trace-id": "6bc9cad45e3c48769587db03ca0826a9" }, "json": { "schema_version": 1, @@ -986,7 +987,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": "27db1ff9243247c2b620f137120283ba" + "x-dfo-trace-id": "9db04233957a46068e3999162a93c70c" } } }, @@ -1012,7 +1013,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": "27db1ff9243247c2b620f137120283ba" + "x-dfo-trace-id": "9db04233957a46068e3999162a93c70c" } } }, 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 7937d99..e0de697 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 @@ -93,7 +93,8 @@ "digest": "sha256:421efacc2dc010af38112a087b0b49ff5539f61d2afd12a88272b27e99b5f5db", "rendering": { "format": "parquet", - "bundle": false + "bundle": false, + "without_party_totals": true } } } @@ -111,7 +112,7 @@ "status": 200, "headers": { "content-type": "application/json", - "x-dfo-trace-id": "4a5d0c28ab9544b2a8eabefdcaba5eb9" + "x-dfo-trace-id": "6bc9cad45e3c48769587db03ca0826a9" }, "json": { "schema_version": 1, @@ -986,7 +987,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": "27db1ff9243247c2b620f137120283ba" + "x-dfo-trace-id": "9db04233957a46068e3999162a93c70c" } } }, @@ -1012,7 +1013,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": "27db1ff9243247c2b620f137120283ba" + "x-dfo-trace-id": "9db04233957a46068e3999162a93c70c" } } }, @@ -1035,32 +1036,32 @@ "dataset": { "rows": 30, "columns": [ - "stat_var", - "financingProvider", + "time_period", "financingProvider_label", + "financingRecipient_label", + "crsPurpose_label", + "value", + "unit_label", + "crsTypeOfFlow_label", + "provenance_label", + "financingProvider", "financingProvider_kind", "financingRecipient", - "financingRecipient_label", "financingRecipient_kind", "crsCooperationModality", "crsCooperationModality_label", "crsPurpose", - "crsPurpose_label", "crsTypeOfFinance", "crsTypeOfFinance_label", "crsTypeOfFlow", - "crsTypeOfFlow_label", - "time_period", - "value", "unit", - "unit_label", "currency", "price_basis", "base_year", "measurementMethod", "measurementMethod_label", "provenance", - "provenance_label" + "stat_var" ], "complete": true, "members": [ 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 f4cad5f..e594531 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": "99e62038ceb4b459c2ac699549076ff123c166aa", - "recorded_at": "2026-10-25T17:35:18Z" + "dfo_commit": "d80df9f5fd598b7345255470932d202ee5d49942", + "recorded_at": "2026-10-26T09:22:34Z" }, "call": [ { @@ -94,7 +94,8 @@ "digest": "sha256:421efacc2dc010af38112a087b0b49ff5539f61d2afd12a88272b27e99b5f5db", "rendering": { "format": "parquet", - "bundle": false + "bundle": false, + "without_party_totals": true } } } @@ -112,7 +113,7 @@ "status": 404, "headers": { "content-type": "application/problem+json", - "x-dfo-trace-id": "4b703f6e6e1f4d13b433c758319f2705" + "x-dfo-trace-id": "72953e5cc1f1470dac2c80cf5889052d" }, "json": { "type": "/codes/snapshot_not_found", @@ -120,7 +121,7 @@ "status": 404, "detail": "'spec_774d6c001a6250aa67ca676ab067895e' has no version at content_version 'cv_00000000000000000000000000000000'", "code": "snapshot_not_found", - "trace_id": "4b703f6e6e1f4d13b433c758319f2705", + "trace_id": "72953e5cc1f1470dac2c80cf5889052d", "capability_version": "dset_76f5fa7244511c58", "retryable": false } @@ -132,7 +133,7 @@ "error": { "class": "NotFoundError", "code": "snapshot_not_found", - "trace_id": "4b703f6e6e1f4d13b433c758319f2705" + "trace_id": "72953e5cc1f1470dac2c80cf5889052d" } } ] 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 96db317..e716ee8 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": "99e62038ceb4b459c2ac699549076ff123c166aa", - "recorded_at": "2026-10-25T17:35:16Z" + "dfo_commit": "d80df9f5fd598b7345255470932d202ee5d49942", + "recorded_at": "2026-10-26T09:22:32Z" }, "call": [ { @@ -94,7 +94,8 @@ "digest": "sha256:421efacc2dc010af38112a087b0b49ff5539f61d2afd12a88272b27e99b5f5db", "rendering": { "format": "parquet", - "bundle": false + "bundle": false, + "without_party_totals": true } } } @@ -112,7 +113,7 @@ "status": 200, "headers": { "content-type": "application/json", - "x-dfo-trace-id": "4a5d0c28ab9544b2a8eabefdcaba5eb9" + "x-dfo-trace-id": "6bc9cad45e3c48769587db03ca0826a9" }, "json": { "schema_version": 1, @@ -987,7 +988,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": "27db1ff9243247c2b620f137120283ba" + "x-dfo-trace-id": "9db04233957a46068e3999162a93c70c" } } }, @@ -1010,32 +1011,32 @@ "dataset": { "rows": 30, "columns": [ - "stat_var", - "financingProvider", + "time_period", "financingProvider_label", + "financingRecipient_label", + "crsPurpose_label", + "value", + "unit_label", + "crsTypeOfFlow_label", + "provenance_label", + "financingProvider", "financingProvider_kind", "financingRecipient", - "financingRecipient_label", "financingRecipient_kind", "crsCooperationModality", "crsCooperationModality_label", "crsPurpose", - "crsPurpose_label", "crsTypeOfFinance", "crsTypeOfFinance_label", "crsTypeOfFlow", - "crsTypeOfFlow_label", - "time_period", - "value", "unit", - "unit_label", "currency", "price_basis", "base_year", "measurementMethod", "measurementMethod_label", "provenance", - "provenance_label" + "stat_var" ], "complete": true, "members": [ 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 ca3527d..cdf37fa 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": "7abc6f06215b4187a4280d87d6f8a51a" + "x-dfo-trace-id": "c7cb40f3790f4a15a0ddcad0cc93c9bb" }, "json": { "schema_version": 1, @@ -44,8 +44,8 @@ "extract_skipped": true }, "diagnostics": { - "engine_build": "99e62038ceb4b459c2ac699549076ff123c166aa", - "trace_id": "7abc6f06215b4187a4280d87d6f8a51a", + "engine_build": "d80df9f5fd598b7345255470932d202ee5d49942", + "trace_id": "c7cb40f3790f4a15a0ddcad0cc93c9bb", "warnings": [], "timing_ms": { "total": 3, @@ -67,30 +67,30 @@ "variable_text": "ODA disbursements for basic health care", "warnings": [], "timing_ms": { - "total": 1669, + "total": 3011, "by_step": { - "recall": 397, + "recall": 457, "phase_resolve_places": 0, "phase_check_entities": 0, - "shape_arcs": 1, - "shape_probe_coverage": 4, - "shape_probe": 115, - "shape_groups": 53, + "shape_arcs": 2, + "shape_probe_coverage": 8, + "shape_probe": 114, + "shape_groups": 579, "shape_labels": 1, - "shape_admission": 1, + "shape_admission": 2, "phase_derive_shapes": 0, - "shape": 276, + "shape": 1247, "phase_prune_and_rank": 0, - "bind": 214, - "phase_bind": 203, - "phase_settle": 45, - "phase_place_bindings": 20, + "bind": 266, + "phase_bind": 327, + "phase_settle": 46, + "phase_place_bindings": 57, "phase_facet_requests": 0, - "materialise": 28, - "phase_materialise": 196, - "answer": 145, - "options": 50, - "phase_outcome": 95 + "materialise": 44, + "phase_materialise": 200, + "answer": 220, + "options": 55, + "phase_outcome": 92 } }, "restatement": { @@ -1190,7 +1190,7 @@ "selected": [] } ], - "capability_version": "cap_88defe77cc79e0c0", + "capability_version": "cap_765c9d2a0c7529b9", "default_reading": { "applied": true, "removed_stat_vars": [] @@ -3780,7 +3780,8 @@ }, "options": { "format": "parquet", - "bundle": false + "bundle": false, + "without_party_totals": true } } }, @@ -3788,7 +3789,7 @@ "status": 200, "headers": { "content-type": "application/json", - "x-dfo-trace-id": "70ac3c153571497dab413643b6537466" + "x-dfo-trace-id": "4c3f35c8c0d44b99941a73a9519b41d2" }, "json": { "schema_version": 1, @@ -4188,7 +4189,7 @@ "frame_grammar_version": "1.1.0", "origin_catalogue_build_id": "20261011T194155Z-80081f08", "served_from": "head", - "confirmed_at": "2026-10-25T17:22:10.027136+00:00" + "confirmed_at": "2026-10-26T09:17:22.037029+00:00" }, "warnings": [ { @@ -4210,7 +4211,8 @@ "rendering": { "bundle": false, "format": "parquet", - "layout": 4 + "layout": 4, + "without_party_totals": true }, "bytes": 9842, "media_type": "application/vnd.apache.parquet", @@ -4542,7 +4544,7 @@ "error": { "class": "ContractError", "code": "contract_violation", - "trace_id": "70ac3c153571497dab413643b6537466" + "trace_id": "4c3f35c8c0d44b99941a73a9519b41d2" } } ] 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 bc3d8a2..bfe6e68 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": "7abc6f06215b4187a4280d87d6f8a51a" + "x-dfo-trace-id": "c7cb40f3790f4a15a0ddcad0cc93c9bb" }, "json": { "schema_version": 1, @@ -44,8 +44,8 @@ "extract_skipped": true }, "diagnostics": { - "engine_build": "99e62038ceb4b459c2ac699549076ff123c166aa", - "trace_id": "7abc6f06215b4187a4280d87d6f8a51a", + "engine_build": "d80df9f5fd598b7345255470932d202ee5d49942", + "trace_id": "c7cb40f3790f4a15a0ddcad0cc93c9bb", "warnings": [], "timing_ms": { "total": 3, @@ -67,30 +67,30 @@ "variable_text": "ODA disbursements for basic health care", "warnings": [], "timing_ms": { - "total": 1669, + "total": 3011, "by_step": { - "recall": 397, + "recall": 457, "phase_resolve_places": 0, "phase_check_entities": 0, - "shape_arcs": 1, - "shape_probe_coverage": 4, - "shape_probe": 115, - "shape_groups": 53, + "shape_arcs": 2, + "shape_probe_coverage": 8, + "shape_probe": 114, + "shape_groups": 579, "shape_labels": 1, - "shape_admission": 1, + "shape_admission": 2, "phase_derive_shapes": 0, - "shape": 276, + "shape": 1247, "phase_prune_and_rank": 0, - "bind": 214, - "phase_bind": 203, - "phase_settle": 45, - "phase_place_bindings": 20, + "bind": 266, + "phase_bind": 327, + "phase_settle": 46, + "phase_place_bindings": 57, "phase_facet_requests": 0, - "materialise": 28, - "phase_materialise": 196, - "answer": 145, - "options": 50, - "phase_outcome": 95 + "materialise": 44, + "phase_materialise": 200, + "answer": 220, + "options": 55, + "phase_outcome": 92 } }, "restatement": { @@ -1190,7 +1190,7 @@ "selected": [] } ], - "capability_version": "cap_88defe77cc79e0c0", + "capability_version": "cap_765c9d2a0c7529b9", "default_reading": { "applied": true, "removed_stat_vars": [] @@ -3780,7 +3780,8 @@ }, "options": { "format": "parquet", - "bundle": false + "bundle": false, + "without_party_totals": true } } }, @@ -3880,7 +3881,8 @@ }, "options": { "format": "parquet", - "bundle": false + "bundle": false, + "without_party_totals": true } } }, @@ -3888,7 +3890,7 @@ "status": 200, "headers": { "content-type": "application/json", - "x-dfo-trace-id": "70ac3c153571497dab413643b6537466" + "x-dfo-trace-id": "4c3f35c8c0d44b99941a73a9519b41d2" }, "json": { "schema_version": 1, @@ -4289,7 +4291,7 @@ "frame_grammar_version": "1.1.0", "origin_catalogue_build_id": "20261011T194155Z-80081f08", "served_from": "head", - "confirmed_at": "2026-10-25T17:22:10.027136+00:00" + "confirmed_at": "2026-10-26T09:17:22.037029+00:00" }, "warnings": [ { @@ -4311,7 +4313,8 @@ "rendering": { "bundle": false, "format": "parquet", - "layout": 4 + "layout": 4, + "without_party_totals": true }, "bytes": 9842, "media_type": "application/vnd.apache.parquet", @@ -4634,7 +4637,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": "d2d4306f79d2411ebcd110cc1e26f49d" + "x-dfo-trace-id": "333ab72de55449ed8288a5f458406a4c" } } }, @@ -4669,32 +4672,32 @@ "dataset": { "rows": 30, "columns": [ - "stat_var", - "financingProvider", + "time_period", "financingProvider_label", + "financingRecipient_label", + "crsPurpose_label", + "value", + "unit_label", + "crsTypeOfFlow_label", + "provenance_label", + "financingProvider", "financingProvider_kind", "financingRecipient", - "financingRecipient_label", "financingRecipient_kind", "crsCooperationModality", "crsCooperationModality_label", "crsPurpose", - "crsPurpose_label", "crsTypeOfFinance", "crsTypeOfFinance_label", "crsTypeOfFlow", - "crsTypeOfFlow_label", - "time_period", - "value", "unit", - "unit_label", "currency", "price_basis", "base_year", "measurementMethod", "measurementMethod_label", "provenance", - "provenance_label" + "stat_var" ], "complete": true, "members": [ 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 74a7778..701f36e 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 @@ -167,7 +167,8 @@ }, "options": { "format": "parquet", - "bundle": false + "bundle": false, + "without_party_totals": true } } }, @@ -269,7 +270,8 @@ }, "options": { "format": "parquet", - "bundle": false + "bundle": false, + "without_party_totals": true } } }, @@ -371,7 +373,8 @@ }, "options": { "format": "parquet", - "bundle": false + "bundle": false, + "without_party_totals": true } } }, @@ -379,7 +382,7 @@ "status": 200, "headers": { "content-type": "application/json", - "x-dfo-trace-id": "cdb2d56286eb4d468f447309c3bd06d9" + "x-dfo-trace-id": "b89cda3bb794448abf06b56c955d754e" }, "json": { "schema_version": 1, @@ -786,7 +789,7 @@ "frame_grammar_version": "1.1.0", "origin_catalogue_build_id": "20261019T174519Z-2e5e8cfd", "served_from": "head", - "confirmed_at": "2026-10-25T17:30:48.703616+00:00" + "confirmed_at": "2026-10-26T09:18:06.976633+00:00" }, "warnings": [ { @@ -808,7 +811,8 @@ "rendering": { "bundle": false, "format": "parquet", - "layout": 4 + "layout": 4, + "without_party_totals": true }, "bytes": 9599, "media_type": "application/vnd.apache.parquet", @@ -1117,7 +1121,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": "114f3d3a1c78408c92fd29cc76887fdc" + "x-dfo-trace-id": "cf3f86713afb44c98d21fbf9731d66e3" } } }, @@ -1140,32 +1144,32 @@ "dataset": { "rows": 4, "columns": [ - "stat_var", - "financingProvider", + "time_period", "financingProvider_label", + "financingRecipient_label", + "crsPurpose_label", + "value", + "unit_label", + "crsTypeOfFlow_label", + "provenance_label", + "financingProvider", "financingProvider_kind", "financingRecipient", - "financingRecipient_label", "financingRecipient_kind", "crsCooperationModality", "crsCooperationModality_label", "crsPurpose", - "crsPurpose_label", "crsTypeOfFinance", "crsTypeOfFinance_label", "crsTypeOfFlow", - "crsTypeOfFlow_label", - "time_period", - "value", "unit", - "unit_label", "currency", "price_basis", "base_year", "measurementMethod", "measurementMethod_label", "provenance", - "provenance_label" + "stat_var" ], "complete": true, "members": [ 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 796db99..11761b6 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 @@ -167,7 +167,8 @@ }, "options": { "format": "parquet", - "bundle": false + "bundle": false, + "without_party_totals": true } } }, @@ -270,7 +271,8 @@ }, "options": { "format": "parquet", - "bundle": false + "bundle": false, + "without_party_totals": true } } }, @@ -278,7 +280,7 @@ "status": 200, "headers": { "content-type": "application/json", - "x-dfo-trace-id": "cdb2d56286eb4d468f447309c3bd06d9" + "x-dfo-trace-id": "b89cda3bb794448abf06b56c955d754e" }, "json": { "schema_version": 1, @@ -685,7 +687,7 @@ "frame_grammar_version": "1.1.0", "origin_catalogue_build_id": "20261019T174519Z-2e5e8cfd", "served_from": "head", - "confirmed_at": "2026-10-25T17:30:48.703616+00:00" + "confirmed_at": "2026-10-26T09:18:06.976633+00:00" }, "warnings": [ { @@ -707,7 +709,8 @@ "rendering": { "bundle": false, "format": "parquet", - "layout": 4 + "layout": 4, + "without_party_totals": true }, "bytes": 9599, "media_type": "application/vnd.apache.parquet", @@ -1016,7 +1019,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": "114f3d3a1c78408c92fd29cc76887fdc" + "x-dfo-trace-id": "cf3f86713afb44c98d21fbf9731d66e3" } } }, @@ -1039,32 +1042,32 @@ "dataset": { "rows": 4, "columns": [ - "stat_var", - "financingProvider", + "time_period", "financingProvider_label", + "financingRecipient_label", + "crsPurpose_label", + "value", + "unit_label", + "crsTypeOfFlow_label", + "provenance_label", + "financingProvider", "financingProvider_kind", "financingRecipient", - "financingRecipient_label", "financingRecipient_kind", "crsCooperationModality", "crsCooperationModality_label", "crsPurpose", - "crsPurpose_label", "crsTypeOfFinance", "crsTypeOfFinance_label", "crsTypeOfFlow", - "crsTypeOfFlow_label", - "time_period", - "value", "unit", - "unit_label", "currency", "price_basis", "base_year", "measurementMethod", "measurementMethod_label", "provenance", - "provenance_label" + "stat_var" ], "complete": true, "members": [ diff --git a/python/client-contract/src/dfo_client_contract/scenarios/fetch-spec-504-then-503.json b/python/client-contract/src/dfo_client_contract/scenarios/fetch-spec-504-then-503.json index 7f82896..dbd3d1f 100644 --- a/python/client-contract/src/dfo_client_contract/scenarios/fetch-spec-504-then-503.json +++ b/python/client-contract/src/dfo_client_contract/scenarios/fetch-spec-504-then-503.json @@ -167,7 +167,8 @@ }, "options": { "format": "parquet", - "bundle": false + "bundle": false, + "without_party_totals": true } } }, @@ -269,7 +270,8 @@ }, "options": { "format": "parquet", - "bundle": false + "bundle": false, + "without_party_totals": true } } }, diff --git a/python/client-contract/src/dfo_client_contract/scenarios/fetch-spec-504-twice.json b/python/client-contract/src/dfo_client_contract/scenarios/fetch-spec-504-twice.json index 22f9d24..9326930 100644 --- a/python/client-contract/src/dfo_client_contract/scenarios/fetch-spec-504-twice.json +++ b/python/client-contract/src/dfo_client_contract/scenarios/fetch-spec-504-twice.json @@ -167,7 +167,8 @@ }, "options": { "format": "parquet", - "bundle": false + "bundle": false, + "without_party_totals": true } } }, @@ -269,7 +270,8 @@ }, "options": { "format": "parquet", - "bundle": false + "bundle": false, + "without_party_totals": true } } }, 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 abd557e..3956bb1 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_7f538f4f65ac124f47918468b4d2eea7", + "spec_id": "spec_70ddf0ce6a9b3f147063f2adf37fab9e", "definition": { "schema_version": 1, - "spec_id": "spec_7f538f4f65ac124f47918468b4d2eea7", + "spec_id": "spec_70ddf0ce6a9b3f147063f2adf37fab9e", "identity": { "identity_version": "spec1", "shape": { @@ -226,12 +226,12 @@ }, "requested_window": { "kind": "range", - "start_year": 1964, + "start_year": 1967, "end_year": 2024 } } }, - "sentence": "Gross disbursements to the 133 G77 countries from the 32 DAC countries for official development assistance, 1964 to 2024. Current US dollars · OECD DAC2a.", + "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.", "entity_groups": { "destination": { "label": "G77 countries", @@ -242,7 +242,8 @@ "group_id": "groups/OECD.DAC" } } - } + }, + "party_totals": true } ], "exchanges": [ @@ -254,10 +255,10 @@ "schema_version": 1, "input": { "kind": "spec_id", - "spec_id": "spec_7f538f4f65ac124f47918468b4d2eea7", + "spec_id": "spec_70ddf0ce6a9b3f147063f2adf37fab9e", "definition": { "schema_version": 1, - "spec_id": "spec_7f538f4f65ac124f47918468b4d2eea7", + "spec_id": "spec_70ddf0ce6a9b3f147063f2adf37fab9e", "identity": { "identity_version": "spec1", "shape": { @@ -469,7 +470,7 @@ }, "requested_window": { "kind": "range", - "start_year": 1964, + "start_year": 1967, "end_year": 2024 } } @@ -485,15 +486,15 @@ "status": 202, "headers": { "content-type": "application/json", - "location": "/api/datasets/operations/op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef", + "location": "/api/datasets/operations/op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f", "retry-after": "2", - "x-dfo-trace-id": "5541c591450f479485c421e20fe4d81d" + "x-dfo-trace-id": "9e96509866ff4da09a698df1f19a5cbd" }, "json": { "operation": { - "operation_id": "op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef", + "operation_id": "op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f", "status": "running", - "poll": "/api/datasets/operations/op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef", + "poll": "/api/datasets/operations/op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f", "retry_after_ms": 1500 } } @@ -502,24 +503,24 @@ { "request": { "method": "GET", - "path": "/datasets/operations/op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef" + "path": "/datasets/operations/op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f" }, "response": { "status": 200, "headers": { "content-type": "application/json", "retry-after": "2", - "x-dfo-trace-id": "3416612a1b3f4a2ebbcf8ddeff74b96a" + "x-dfo-trace-id": "6185b86217ef499bb5b6932299df1207" }, "json": { "operation": { - "operation_id": "op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef", + "operation_id": "op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f", "status": "running", - "poll": "/api/datasets/operations/op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef", + "poll": "/api/datasets/operations/op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f", "retry_after_ms": 1500, "progress": { "rows_written": 0, - "estimate_rows": 108935 + "estimate_rows": 107252 } } } @@ -528,24 +529,24 @@ { "request": { "method": "GET", - "path": "/datasets/operations/op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef" + "path": "/datasets/operations/op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f" }, "response": { "status": 200, "headers": { "content-type": "application/json", "retry-after": "2", - "x-dfo-trace-id": "65394508d86f443db7528ac38066b9e3" + "x-dfo-trace-id": "1ebea3ca2d15409c953cd716bdc1fccf" }, "json": { "operation": { - "operation_id": "op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef", + "operation_id": "op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f", "status": "running", - "poll": "/api/datasets/operations/op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef", + "poll": "/api/datasets/operations/op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f", "retry_after_ms": 1500, "progress": { - "rows_written": 64600, - "estimate_rows": 108935 + "rows_written": 61927, + "estimate_rows": 107252 } } } @@ -554,24 +555,24 @@ { "request": { "method": "GET", - "path": "/datasets/operations/op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef" + "path": "/datasets/operations/op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f" }, "response": { "status": 200, "headers": { "content-type": "application/json", "retry-after": "2", - "x-dfo-trace-id": "7a2d07cfe29b4993a374ee71104d461a" + "x-dfo-trace-id": "94bb5a8a7c2041969d9a9118b75dc4aa" }, "json": { "operation": { - "operation_id": "op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef", + "operation_id": "op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f", "status": "running", - "poll": "/api/datasets/operations/op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef", + "poll": "/api/datasets/operations/op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f", "retry_after_ms": 1500, "progress": { - "rows_written": 108935, - "estimate_rows": 108935 + "rows_written": 107252, + "estimate_rows": 107252 } } } @@ -580,24 +581,24 @@ { "request": { "method": "GET", - "path": "/datasets/operations/op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef" + "path": "/datasets/operations/op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f" }, "response": { "status": 200, "headers": { "content-type": "application/json", "retry-after": "2", - "x-dfo-trace-id": "7c7c516f463a471583976147759c6250" + "x-dfo-trace-id": "c78757a54b9f4b6786a784f8a47ad5b4" }, "json": { "operation": { - "operation_id": "op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef", + "operation_id": "op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f", "status": "running", - "poll": "/api/datasets/operations/op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef", - "retry_after_ms": 1786, + "poll": "/api/datasets/operations/op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f", + "retry_after_ms": 1784, "progress": { - "rows_written": 108935, - "estimate_rows": 108935 + "rows_written": 107252, + "estimate_rows": 107252 } } } @@ -606,24 +607,24 @@ { "request": { "method": "GET", - "path": "/datasets/operations/op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef" + "path": "/datasets/operations/op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f" }, "response": { "status": 200, "headers": { "content-type": "application/json", "retry-after": "3", - "x-dfo-trace-id": "9ddce1ae50fd4187abeb32c45a0f03ba" + "x-dfo-trace-id": "914bfd57942740b893ba9ca1b4f4591b" }, "json": { "operation": { - "operation_id": "op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef", + "operation_id": "op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f", "status": "running", - "poll": "/api/datasets/operations/op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef", - "retry_after_ms": 2268, + "poll": "/api/datasets/operations/op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f", + "retry_after_ms": 2289, "progress": { - "rows_written": 108935, - "estimate_rows": 108935 + "rows_written": 107252, + "estimate_rows": 107252 } } } @@ -632,24 +633,24 @@ { "request": { "method": "GET", - "path": "/datasets/operations/op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef" + "path": "/datasets/operations/op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f" }, "response": { "status": 200, "headers": { "content-type": "application/json", "retry-after": "3", - "x-dfo-trace-id": "1ce68951ada64961b3710bb73127c9d8" + "x-dfo-trace-id": "217766e0425f4916a393331295c4a7e7" }, "json": { "operation": { - "operation_id": "op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef", + "operation_id": "op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f", "status": "running", - "poll": "/api/datasets/operations/op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef", - "retry_after_ms": 2869, + "poll": "/api/datasets/operations/op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f", + "retry_after_ms": 2934, "progress": { - "rows_written": 108935, - "estimate_rows": 108935 + "rows_written": 107252, + "estimate_rows": 107252 } } } @@ -658,24 +659,24 @@ { "request": { "method": "GET", - "path": "/datasets/operations/op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef" + "path": "/datasets/operations/op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f" }, "response": { "status": 200, "headers": { "content-type": "application/json", - "x-dfo-trace-id": "37207f1ea4574e4e8485e8cebd4f4edc" + "x-dfo-trace-id": "c501ba8d087b4561b2ff0e423c719ab0" }, "json": { "operation": { - "operation_id": "op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef", + "operation_id": "op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f", "status": "done" }, "manifest": { "schema_version": 1, "definition": { "schema_version": 1, - "spec_id": "spec_7f538f4f65ac124f47918468b4d2eea7", + "spec_id": "spec_70ddf0ce6a9b3f147063f2adf37fab9e", "identity": { "shape": { "kind": "statvar_schema", @@ -888,14 +889,14 @@ "requested_window": { "kind": "range", "end_year": 2024, - "start_year": 1964 + "start_year": 1967 } } }, - "content_version": "cv_ed2cc83eb28d4e6883cde079f05844ed", - "prepared_at": "2026-10-25T17:38:14Z", + "content_version": "cv_fafc60a507e03b0d42689fb1936127b9", + "prepared_at": "2026-10-26T09:22:44Z", "coverage": { - "rows": 108935, + "rows": 107252, "dimensions": [ { "label": "financingProvider", @@ -917,14 +918,14 @@ }, { "label": "years", - "count": 61 + "count": 58 } ], "window": { "kind": "range", "origin": "query", "end_year": 2024, - "start_year": 1964 + "start_year": 1967 } }, "citation": { @@ -1043,9 +1044,9 @@ "kind": "range", "origin": "query", "end_year": 2024, - "start_year": 1964 + "start_year": 1967 }, - "graph_revision": "dfo-dev-dc-datacommons-service-00273-mmh", + "graph_revision": null, "normalisations": [], "code_index_stamp": { "exported_at": "2026-10-24T19:20:27Z", @@ -1059,7 +1060,7 @@ } ], "capability_version": "dset_76f5fa7244511c58", - "materialiser_build": "99e62038ceb4b459c2ac699549076ff123c166aa", + "materialiser_build": "d80df9f5fd598b7345255470932d202ee5d49942", "resolved_stat_vars": [ { "ref": "dcid:Amount_FinancialFlow_Gross_Disbursement_DAC2aAidType206_Nominal", @@ -1067,15 +1068,15 @@ "financingProvider", "financingRecipient" ], - "observation_count": 108935 + "observation_count": 107252 } ], "family_member_count": 1, "family_member_digest": "1a36e1a7292b1bfff95a5415de0be74cac7bb033217ed50e79faa8ce51a224c0", "frame_grammar_version": "1.1.0", - "origin_catalogue_build_id": "20261024T193016Z-775d36a9", + "origin_catalogue_build_id": "20261026T000018Z-0af2cac5", "served_from": "materialise", - "confirmed_at": "2026-10-25T17:38:17.505656+00:00" + "confirmed_at": "2026-10-26T09:22:46.854499+00:00" }, "warnings": [], "diagnostics": [ @@ -1087,29 +1088,29 @@ ], "artifacts": [ { - "artifact_digest": "sha256:4d80e30e27b5a64706113d54946e3a387e422b1115d1437594ac4b1d4307ffd2", + "artifact_digest": "sha256:a8c742f8f416b2f3414c7a569f7c18b337c5ee9ae3012483583bad0b238f5c61", "rendering": { "bundle": false, "format": "parquet", "layout": 4 }, - "bytes": 472796, + "bytes": 466531, "media_type": "application/vnd.apache.parquet", - "created_at": "2026-10-25T17:38:17.426404+00:00", + "created_at": "2026-10-26T09:22:46.786678+00:00", "tier": "working", - "url": "/api/datasets/spec_7f538f4f65ac124f47918468b4d2eea7/cv_ed2cc83eb28d4e6883cde079f05844ed/files/sha256:4d80e30e27b5a64706113d54946e3a387e422b1115d1437594ac4b1d4307ffd2", + "url": "/api/datasets/spec_70ddf0ce6a9b3f147063f2adf37fab9e/cv_fafc60a507e03b0d42689fb1936127b9/files/sha256:a8c742f8f416b2f3414c7a569f7c18b337c5ee9ae3012483583bad0b238f5c61", "enrichment_stamp": "08ed6c734fc69ea2204a21f4e1dd8b963f14dd1e03a2484c618049ac2e2d93d8" }, { - "artifact_digest": "sha256:4e3ed758ad1a33cf9d150ee5fa71adf7f5bd40e4d342d839633d8386239babe1", + "artifact_digest": "sha256:5247bafa55f84fe2f8bc348601acb955162c39a1a082e939945336470e5c5231", "rendering": { "statistics": "series" }, - "bytes": 144449, + "bytes": 144985, "media_type": "application/vnd.apache.parquet", - "created_at": "2026-10-25T17:38:17.426404+00:00", + "created_at": "2026-10-26T09:22:46.786678+00:00", "tier": "working", - "url": "/api/datasets/spec_7f538f4f65ac124f47918468b4d2eea7/cv_ed2cc83eb28d4e6883cde079f05844ed/files/sha256:4e3ed758ad1a33cf9d150ee5fa71adf7f5bd40e4d342d839633d8386239babe1" + "url": "/api/datasets/spec_70ddf0ce6a9b3f147063f2adf37fab9e/cv_fafc60a507e03b0d42689fb1936127b9/files/sha256:5247bafa55f84fe2f8bc348601acb955162c39a1a082e939945336470e5c5231" } ], "series_count": 3656, @@ -1138,7 +1139,7 @@ "name": "time_period", "kind": "grain", "droppable": false, - "distinct": 61 + "distinct": 58 }, { "name": "value", @@ -1378,7 +1379,7 @@ "varying": [ { "column": "time_period", - "distinct": 61 + "distinct": 58 } ] }, @@ -1402,7 +1403,7 @@ "varying": [ { "column": "time_period", - "distinct": 61 + "distinct": 58 } ] }, @@ -1464,7 +1465,7 @@ "series_coverage_stamp": "e6e717ab8c77e84d010915893ede5809e9ecec67929a07cfafbcc2210edfa1eb", "retention": { "pinned": false, - "held_until": "2026-11-24T17:38:17.425152Z" + "held_until": "2026-11-25T09:22:46.785219Z" } } } @@ -1473,21 +1474,21 @@ { "request": { "method": "GET", - "origin_path": "/api/datasets/spec_7f538f4f65ac124f47918468b4d2eea7/cv_ed2cc83eb28d4e6883cde079f05844ed/files/sha256:4d80e30e27b5a64706113d54946e3a387e422b1115d1437594ac4b1d4307ffd2" + "origin_path": "/api/datasets/spec_70ddf0ce6a9b3f147063f2adf37fab9e/cv_fafc60a507e03b0d42689fb1936127b9/files/sha256:a8c742f8f416b2f3414c7a569f7c18b337c5ee9ae3012483583bad0b238f5c61" }, "response": { "status": 302, "headers": { "content-type": "text/html", - "location": "https://storage.googleapis.com/dev-fin-observatory-datasets-working/sha256%3A4d80e30e27b5a64706113d54946e3a387e422b1115d1437594ac4b1d4307ffd2?X-Goog-Signature=redacted", - "x-dfo-trace-id": "919c1e572d914a608b166556417714c9" + "location": "https://storage.googleapis.com/dev-fin-observatory-datasets-working/sha256%3Aa8c742f8f416b2f3414c7a569f7c18b337c5ee9ae3012483583bad0b238f5c61?X-Goog-Signature=redacted", + "x-dfo-trace-id": "22f0d88923c14d74825b5f14d41c05b8" } } }, { "request": { "method": "GET", - "url": "https://storage.googleapis.com/dev-fin-observatory-datasets-working/sha256%3A4d80e30e27b5a64706113d54946e3a387e422b1115d1437594ac4b1d4307ffd2?X-Goog-Signature=redacted" + "url": "https://storage.googleapis.com/dev-fin-observatory-datasets-working/sha256%3Aa8c742f8f416b2f3414c7a569f7c18b337c5ee9ae3012483583bad0b238f5c61?X-Goog-Signature=redacted" }, "response": { "status": 200, @@ -1501,50 +1502,50 @@ "expect": [ { "dataset": { - "rows": 108935, + "rows": 107252, "columns": [ - "stat_var", - "financingProvider", + "time_period", "financingProvider_label", + "financingRecipient_label", + "value", + "unit_label", + "dac2aAidType_label", + "provenance_label", + "financingProvider", "financingProvider_kind", "financingRecipient", - "financingRecipient_label", "financingRecipient_kind", "dac2aAidType", - "dac2aAidType_label", - "time_period", - "value", "unit", - "unit_label", "currency", "price_basis", "base_year", "measurementMethod", "measurementMethod_label", "provenance", - "provenance_label" + "stat_var" ], "complete": true, "members": [ { "parts": [], - "spec_id": "spec_7f538f4f65ac124f47918468b4d2eea7", - "content_version": "cv_ed2cc83eb28d4e6883cde079f05844ed", - "sentence": "Gross disbursements to the 133 G77 countries from the 32 DAC countries for official development assistance, 1964 to 2024. Current US dollars · OECD DAC2a." + "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." } ], "missing": [], "long_builds": [ { - "operation_id": "op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef", + "operation_id": "op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f", "poll_waits": [ 1.5, 1.5, 1.5, 1.5, - 1.786, - 2.268, - 2.869 + 1.784, + 2.289, + 2.934 ], "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 3faa47f..e8a44cc 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 @@ -5,16 +5,16 @@ "origin": { "kind": "synthetic", "derived_from": "mint-async-build", - "edit": "The mint and result steps become one fetch of the spec, which makes the same exchanges." + "edit": "The mint and result steps become one fetch of the spec with party_totals, which makes the same exchanges." }, "call": [ { "op": "fetch", "spec": { - "spec_id": "spec_7f538f4f65ac124f47918468b4d2eea7", + "spec_id": "spec_70ddf0ce6a9b3f147063f2adf37fab9e", "definition": { "schema_version": 1, - "spec_id": "spec_7f538f4f65ac124f47918468b4d2eea7", + "spec_id": "spec_70ddf0ce6a9b3f147063f2adf37fab9e", "identity": { "identity_version": "spec1", "shape": { @@ -226,12 +226,12 @@ }, "requested_window": { "kind": "range", - "start_year": 1964, + "start_year": 1967, "end_year": 2024 } } }, - "sentence": "Gross disbursements to the 133 G77 countries from the 32 DAC countries for official development assistance, 1964 to 2024. Current US dollars · OECD DAC2a.", + "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.", "entity_groups": { "destination": { "label": "G77 countries", @@ -242,7 +242,8 @@ "group_id": "groups/OECD.DAC" } } - } + }, + "party_totals": true } ], "exchanges": [ @@ -254,10 +255,10 @@ "schema_version": 1, "input": { "kind": "spec_id", - "spec_id": "spec_7f538f4f65ac124f47918468b4d2eea7", + "spec_id": "spec_70ddf0ce6a9b3f147063f2adf37fab9e", "definition": { "schema_version": 1, - "spec_id": "spec_7f538f4f65ac124f47918468b4d2eea7", + "spec_id": "spec_70ddf0ce6a9b3f147063f2adf37fab9e", "identity": { "identity_version": "spec1", "shape": { @@ -469,7 +470,7 @@ }, "requested_window": { "kind": "range", - "start_year": 1964, + "start_year": 1967, "end_year": 2024 } } @@ -485,15 +486,15 @@ "status": 202, "headers": { "content-type": "application/json", - "location": "/api/datasets/operations/op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef", + "location": "/api/datasets/operations/op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f", "retry-after": "2", - "x-dfo-trace-id": "5541c591450f479485c421e20fe4d81d" + "x-dfo-trace-id": "9e96509866ff4da09a698df1f19a5cbd" }, "json": { "operation": { - "operation_id": "op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef", + "operation_id": "op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f", "status": "pending", - "poll": "/api/datasets/operations/op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef", + "poll": "/api/datasets/operations/op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f", "retry_after_ms": 1500 } } @@ -502,24 +503,24 @@ { "request": { "method": "GET", - "path": "/datasets/operations/op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef" + "path": "/datasets/operations/op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f" }, "response": { "status": 200, "headers": { "content-type": "application/json", "retry-after": "2", - "x-dfo-trace-id": "3416612a1b3f4a2ebbcf8ddeff74b96a" + "x-dfo-trace-id": "6185b86217ef499bb5b6932299df1207" }, "json": { "operation": { - "operation_id": "op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef", + "operation_id": "op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f", "status": "running", - "poll": "/api/datasets/operations/op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef", + "poll": "/api/datasets/operations/op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f", "retry_after_ms": 1500, "progress": { "rows_written": 0, - "estimate_rows": 108935 + "estimate_rows": 107252 } } } @@ -528,24 +529,24 @@ { "request": { "method": "GET", - "path": "/datasets/operations/op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef" + "path": "/datasets/operations/op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f" }, "response": { "status": 200, "headers": { "content-type": "application/json", "retry-after": "2", - "x-dfo-trace-id": "65394508d86f443db7528ac38066b9e3" + "x-dfo-trace-id": "1ebea3ca2d15409c953cd716bdc1fccf" }, "json": { "operation": { - "operation_id": "op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef", + "operation_id": "op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f", "status": "running", - "poll": "/api/datasets/operations/op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef", + "poll": "/api/datasets/operations/op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f", "retry_after_ms": 1500, "progress": { - "rows_written": 64600, - "estimate_rows": 108935 + "rows_written": 61927, + "estimate_rows": 107252 } } } @@ -554,24 +555,24 @@ { "request": { "method": "GET", - "path": "/datasets/operations/op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef" + "path": "/datasets/operations/op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f" }, "response": { "status": 200, "headers": { "content-type": "application/json", "retry-after": "2", - "x-dfo-trace-id": "7a2d07cfe29b4993a374ee71104d461a" + "x-dfo-trace-id": "94bb5a8a7c2041969d9a9118b75dc4aa" }, "json": { "operation": { - "operation_id": "op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef", + "operation_id": "op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f", "status": "running", - "poll": "/api/datasets/operations/op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef", + "poll": "/api/datasets/operations/op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f", "retry_after_ms": 1500, "progress": { - "rows_written": 108935, - "estimate_rows": 108935 + "rows_written": 107252, + "estimate_rows": 107252 } } } @@ -580,24 +581,24 @@ { "request": { "method": "GET", - "path": "/datasets/operations/op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef" + "path": "/datasets/operations/op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f" }, "response": { "status": 200, "headers": { "content-type": "application/json", "retry-after": "2", - "x-dfo-trace-id": "7c7c516f463a471583976147759c6250" + "x-dfo-trace-id": "c78757a54b9f4b6786a784f8a47ad5b4" }, "json": { "operation": { - "operation_id": "op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef", + "operation_id": "op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f", "status": "running", - "poll": "/api/datasets/operations/op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef", - "retry_after_ms": 1786, + "poll": "/api/datasets/operations/op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f", + "retry_after_ms": 1784, "progress": { - "rows_written": 108935, - "estimate_rows": 108935 + "rows_written": 107252, + "estimate_rows": 107252 } } } @@ -606,24 +607,24 @@ { "request": { "method": "GET", - "path": "/datasets/operations/op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef" + "path": "/datasets/operations/op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f" }, "response": { "status": 200, "headers": { "content-type": "application/json", "retry-after": "3", - "x-dfo-trace-id": "9ddce1ae50fd4187abeb32c45a0f03ba" + "x-dfo-trace-id": "914bfd57942740b893ba9ca1b4f4591b" }, "json": { "operation": { - "operation_id": "op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef", + "operation_id": "op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f", "status": "running", - "poll": "/api/datasets/operations/op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef", - "retry_after_ms": 2268, + "poll": "/api/datasets/operations/op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f", + "retry_after_ms": 2289, "progress": { - "rows_written": 108935, - "estimate_rows": 108935 + "rows_written": 107252, + "estimate_rows": 107252 } } } @@ -632,24 +633,24 @@ { "request": { "method": "GET", - "path": "/datasets/operations/op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef" + "path": "/datasets/operations/op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f" }, "response": { "status": 200, "headers": { "content-type": "application/json", "retry-after": "3", - "x-dfo-trace-id": "1ce68951ada64961b3710bb73127c9d8" + "x-dfo-trace-id": "217766e0425f4916a393331295c4a7e7" }, "json": { "operation": { - "operation_id": "op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef", + "operation_id": "op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f", "status": "running", - "poll": "/api/datasets/operations/op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef", - "retry_after_ms": 2869, + "poll": "/api/datasets/operations/op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f", + "retry_after_ms": 2934, "progress": { - "rows_written": 108935, - "estimate_rows": 108935 + "rows_written": 107252, + "estimate_rows": 107252 } } } @@ -658,24 +659,24 @@ { "request": { "method": "GET", - "path": "/datasets/operations/op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef" + "path": "/datasets/operations/op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f" }, "response": { "status": 200, "headers": { "content-type": "application/json", - "x-dfo-trace-id": "37207f1ea4574e4e8485e8cebd4f4edc" + "x-dfo-trace-id": "c501ba8d087b4561b2ff0e423c719ab0" }, "json": { "operation": { - "operation_id": "op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef", + "operation_id": "op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f", "status": "done" }, "manifest": { "schema_version": 1, "definition": { "schema_version": 1, - "spec_id": "spec_7f538f4f65ac124f47918468b4d2eea7", + "spec_id": "spec_70ddf0ce6a9b3f147063f2adf37fab9e", "identity": { "shape": { "kind": "statvar_schema", @@ -888,14 +889,14 @@ "requested_window": { "kind": "range", "end_year": 2024, - "start_year": 1964 + "start_year": 1967 } } }, - "content_version": "cv_ed2cc83eb28d4e6883cde079f05844ed", - "prepared_at": "2026-10-25T17:38:14Z", + "content_version": "cv_fafc60a507e03b0d42689fb1936127b9", + "prepared_at": "2026-10-26T09:22:44Z", "coverage": { - "rows": 108935, + "rows": 107252, "dimensions": [ { "label": "financingProvider", @@ -917,14 +918,14 @@ }, { "label": "years", - "count": 61 + "count": 58 } ], "window": { "kind": "range", "origin": "query", "end_year": 2024, - "start_year": 1964 + "start_year": 1967 } }, "citation": { @@ -1043,9 +1044,9 @@ "kind": "range", "origin": "query", "end_year": 2024, - "start_year": 1964 + "start_year": 1967 }, - "graph_revision": "dfo-dev-dc-datacommons-service-00273-mmh", + "graph_revision": null, "normalisations": [], "code_index_stamp": { "exported_at": "2026-10-24T19:20:27Z", @@ -1059,7 +1060,7 @@ } ], "capability_version": "dset_76f5fa7244511c58", - "materialiser_build": "99e62038ceb4b459c2ac699549076ff123c166aa", + "materialiser_build": "d80df9f5fd598b7345255470932d202ee5d49942", "resolved_stat_vars": [ { "ref": "dcid:Amount_FinancialFlow_Gross_Disbursement_DAC2aAidType206_Nominal", @@ -1067,15 +1068,15 @@ "financingProvider", "financingRecipient" ], - "observation_count": 108935 + "observation_count": 107252 } ], "family_member_count": 1, "family_member_digest": "1a36e1a7292b1bfff95a5415de0be74cac7bb033217ed50e79faa8ce51a224c0", "frame_grammar_version": "1.1.0", - "origin_catalogue_build_id": "20261024T193016Z-775d36a9", + "origin_catalogue_build_id": "20261026T000018Z-0af2cac5", "served_from": "materialise", - "confirmed_at": "2026-10-25T17:38:17.505656+00:00" + "confirmed_at": "2026-10-26T09:22:46.854499+00:00" }, "warnings": [], "diagnostics": [ @@ -1087,29 +1088,29 @@ ], "artifacts": [ { - "artifact_digest": "sha256:4d80e30e27b5a64706113d54946e3a387e422b1115d1437594ac4b1d4307ffd2", + "artifact_digest": "sha256:a8c742f8f416b2f3414c7a569f7c18b337c5ee9ae3012483583bad0b238f5c61", "rendering": { "bundle": false, "format": "parquet", "layout": 4 }, - "bytes": 472796, + "bytes": 466531, "media_type": "application/vnd.apache.parquet", - "created_at": "2026-10-25T17:38:17.426404+00:00", + "created_at": "2026-10-26T09:22:46.786678+00:00", "tier": "working", - "url": "/api/datasets/spec_7f538f4f65ac124f47918468b4d2eea7/cv_ed2cc83eb28d4e6883cde079f05844ed/files/sha256:4d80e30e27b5a64706113d54946e3a387e422b1115d1437594ac4b1d4307ffd2", + "url": "/api/datasets/spec_70ddf0ce6a9b3f147063f2adf37fab9e/cv_fafc60a507e03b0d42689fb1936127b9/files/sha256:a8c742f8f416b2f3414c7a569f7c18b337c5ee9ae3012483583bad0b238f5c61", "enrichment_stamp": "08ed6c734fc69ea2204a21f4e1dd8b963f14dd1e03a2484c618049ac2e2d93d8" }, { - "artifact_digest": "sha256:4e3ed758ad1a33cf9d150ee5fa71adf7f5bd40e4d342d839633d8386239babe1", + "artifact_digest": "sha256:5247bafa55f84fe2f8bc348601acb955162c39a1a082e939945336470e5c5231", "rendering": { "statistics": "series" }, - "bytes": 144449, + "bytes": 144985, "media_type": "application/vnd.apache.parquet", - "created_at": "2026-10-25T17:38:17.426404+00:00", + "created_at": "2026-10-26T09:22:46.786678+00:00", "tier": "working", - "url": "/api/datasets/spec_7f538f4f65ac124f47918468b4d2eea7/cv_ed2cc83eb28d4e6883cde079f05844ed/files/sha256:4e3ed758ad1a33cf9d150ee5fa71adf7f5bd40e4d342d839633d8386239babe1" + "url": "/api/datasets/spec_70ddf0ce6a9b3f147063f2adf37fab9e/cv_fafc60a507e03b0d42689fb1936127b9/files/sha256:5247bafa55f84fe2f8bc348601acb955162c39a1a082e939945336470e5c5231" } ], "series_count": 3656, @@ -1138,7 +1139,7 @@ "name": "time_period", "kind": "grain", "droppable": false, - "distinct": 61 + "distinct": 58 }, { "name": "value", @@ -1378,7 +1379,7 @@ "varying": [ { "column": "time_period", - "distinct": 61 + "distinct": 58 } ] }, @@ -1402,7 +1403,7 @@ "varying": [ { "column": "time_period", - "distinct": 61 + "distinct": 58 } ] }, @@ -1464,7 +1465,7 @@ "series_coverage_stamp": "e6e717ab8c77e84d010915893ede5809e9ecec67929a07cfafbcc2210edfa1eb", "retention": { "pinned": false, - "held_until": "2026-11-24T17:38:17.425152Z" + "held_until": "2026-11-25T09:22:46.785219Z" } } } @@ -1473,21 +1474,21 @@ { "request": { "method": "GET", - "origin_path": "/api/datasets/spec_7f538f4f65ac124f47918468b4d2eea7/cv_ed2cc83eb28d4e6883cde079f05844ed/files/sha256:4d80e30e27b5a64706113d54946e3a387e422b1115d1437594ac4b1d4307ffd2" + "origin_path": "/api/datasets/spec_70ddf0ce6a9b3f147063f2adf37fab9e/cv_fafc60a507e03b0d42689fb1936127b9/files/sha256:a8c742f8f416b2f3414c7a569f7c18b337c5ee9ae3012483583bad0b238f5c61" }, "response": { "status": 302, "headers": { "content-type": "text/html", - "location": "https://storage.googleapis.com/dev-fin-observatory-datasets-working/sha256%3A4d80e30e27b5a64706113d54946e3a387e422b1115d1437594ac4b1d4307ffd2?X-Goog-Signature=redacted", - "x-dfo-trace-id": "919c1e572d914a608b166556417714c9" + "location": "https://storage.googleapis.com/dev-fin-observatory-datasets-working/sha256%3Aa8c742f8f416b2f3414c7a569f7c18b337c5ee9ae3012483583bad0b238f5c61?X-Goog-Signature=redacted", + "x-dfo-trace-id": "22f0d88923c14d74825b5f14d41c05b8" } } }, { "request": { "method": "GET", - "url": "https://storage.googleapis.com/dev-fin-observatory-datasets-working/sha256%3A4d80e30e27b5a64706113d54946e3a387e422b1115d1437594ac4b1d4307ffd2?X-Goog-Signature=redacted" + "url": "https://storage.googleapis.com/dev-fin-observatory-datasets-working/sha256%3Aa8c742f8f416b2f3414c7a569f7c18b337c5ee9ae3012483583bad0b238f5c61?X-Goog-Signature=redacted" }, "response": { "status": 200, @@ -1501,50 +1502,50 @@ "expect": [ { "dataset": { - "rows": 108935, + "rows": 107252, "columns": [ - "stat_var", - "financingProvider", + "time_period", "financingProvider_label", + "financingRecipient_label", + "value", + "unit_label", + "dac2aAidType_label", + "provenance_label", + "financingProvider", "financingProvider_kind", "financingRecipient", - "financingRecipient_label", "financingRecipient_kind", "dac2aAidType", - "dac2aAidType_label", - "time_period", - "value", "unit", - "unit_label", "currency", "price_basis", "base_year", "measurementMethod", "measurementMethod_label", "provenance", - "provenance_label" + "stat_var" ], "complete": true, "members": [ { "parts": [], - "spec_id": "spec_7f538f4f65ac124f47918468b4d2eea7", - "content_version": "cv_ed2cc83eb28d4e6883cde079f05844ed", - "sentence": "Gross disbursements to the 133 G77 countries from the 32 DAC countries for official development assistance, 1964 to 2024. Current US dollars · OECD DAC2a." + "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." } ], "missing": [], "long_builds": [ { - "operation_id": "op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef", + "operation_id": "op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f", "poll_waits": [ 1.5, 1.5, 1.5, 1.5, - 1.786, - 2.268, - 2.869 + 1.784, + 2.289, + 2.934 ], "resubmissions": 0 } diff --git a/python/client-contract/src/dfo_client_contract/scenarios/fetch-spec-capability-unavailable.json b/python/client-contract/src/dfo_client_contract/scenarios/fetch-spec-capability-unavailable.json index f5495bf..694c332 100644 --- a/python/client-contract/src/dfo_client_contract/scenarios/fetch-spec-capability-unavailable.json +++ b/python/client-contract/src/dfo_client_contract/scenarios/fetch-spec-capability-unavailable.json @@ -165,7 +165,8 @@ "options": { "format": "parquet", "bundle": false, - "layout": "frame" + "layout": "frame", + "without_party_totals": true } } }, 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 780bf09..2a98b3b 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 @@ -167,7 +167,8 @@ }, "options": { "format": "parquet", - "bundle": false + "bundle": false, + "without_party_totals": true } } }, @@ -175,7 +176,7 @@ "status": 200, "headers": { "content-type": "application/json", - "x-dfo-trace-id": "cdb2d56286eb4d468f447309c3bd06d9" + "x-dfo-trace-id": "b89cda3bb794448abf06b56c955d754e" }, "json": { "schema_version": 1, @@ -582,7 +583,7 @@ "frame_grammar_version": "1.1.0", "origin_catalogue_build_id": "20261019T174519Z-2e5e8cfd", "served_from": "head", - "confirmed_at": "2026-10-25T17:30:48.703616+00:00" + "confirmed_at": "2026-10-26T09:18:06.976633+00:00" }, "warnings": [ { @@ -604,7 +605,8 @@ "rendering": { "bundle": false, "format": "parquet", - "layout": 4 + "layout": 4, + "without_party_totals": true }, "bytes": 9599, "media_type": "application/vnd.apache.parquet", @@ -913,7 +915,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": "114f3d3a1c78408c92fd29cc76887fdc" + "x-dfo-trace-id": "cf3f86713afb44c98d21fbf9731d66e3" } } }, @@ -940,7 +942,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": "114f3d3a1c78408c92fd29cc76887fdc" + "x-dfo-trace-id": "cf3f86713afb44c98d21fbf9731d66e3" } } }, 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 909da4f..7095cf3 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 @@ -169,7 +169,8 @@ }, "options": { "format": "parquet", - "bundle": false + "bundle": false, + "without_party_totals": true } } }, @@ -177,7 +178,7 @@ "status": 200, "headers": { "content-type": "application/json", - "x-dfo-trace-id": "cdb2d56286eb4d468f447309c3bd06d9" + "x-dfo-trace-id": "b89cda3bb794448abf06b56c955d754e" }, "json": { "schema_version": 1, @@ -584,7 +585,7 @@ "frame_grammar_version": "1.1.0", "origin_catalogue_build_id": "20261019T174519Z-2e5e8cfd", "served_from": "head", - "confirmed_at": "2026-10-25T17:30:48.703616+00:00" + "confirmed_at": "2026-10-26T09:18:06.976633+00:00" }, "warnings": [ { @@ -606,7 +607,8 @@ "rendering": { "bundle": false, "format": "parquet", - "layout": 4 + "layout": 4, + "without_party_totals": true }, "bytes": 9599, "media_type": "application/vnd.apache.parquet", @@ -915,7 +917,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": "114f3d3a1c78408c92fd29cc76887fdc" + "x-dfo-trace-id": "cf3f86713afb44c98d21fbf9731d66e3" } } }, @@ -938,32 +940,32 @@ "dataset": { "rows": 4, "columns": [ - "stat_var", - "financingProvider", + "time_period", "financingProvider_label", + "financingRecipient_label", + "crsPurpose_label", + "value", + "unit_label", + "crsTypeOfFlow_label", + "provenance_label", + "financingProvider", "financingProvider_kind", "financingRecipient", - "financingRecipient_label", "financingRecipient_kind", "crsCooperationModality", "crsCooperationModality_label", "crsPurpose", - "crsPurpose_label", "crsTypeOfFinance", "crsTypeOfFinance_label", "crsTypeOfFlow", - "crsTypeOfFlow_label", - "time_period", - "value", "unit", - "unit_label", "currency", "price_basis", "base_year", "measurementMethod", "measurementMethod_label", "provenance", - "provenance_label" + "stat_var" ], "complete": true, "members": [ 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 3996aa5..b247574 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": "99e62038ceb4b459c2ac699549076ff123c166aa", - "recorded_at": "2026-10-25T17:35:08Z" + "dfo_commit": "d80df9f5fd598b7345255470932d202ee5d49942", + "recorded_at": "2026-10-26T09:22:17Z" }, "call": [ { @@ -174,7 +174,8 @@ }, "options": { "format": "parquet", - "bundle": false + "bundle": false, + "without_party_totals": true } } }, @@ -182,7 +183,7 @@ "status": 200, "headers": { "content-type": "application/json", - "x-dfo-trace-id": "6f43e68b9aeb46b4bc564fc277f0dd5e" + "x-dfo-trace-id": "dfa8f009e43a48bd9113306c1946b4b7" }, "json": { "schema_version": 1, @@ -584,7 +585,7 @@ "frame_grammar_version": "1.1.0", "origin_catalogue_build_id": "20261020T170016Z-691bf0da", "served_from": "head", - "confirmed_at": "2026-10-25T17:32:57.004736+00:00" + "confirmed_at": "2026-10-26T09:18:11.197140+00:00" }, "warnings": [], "diagnostics": [ @@ -596,17 +597,18 @@ ], "artifacts": [ { - "artifact_digest": "sha256:582f586bcb05d6807c91e6b5d88779c13c5c0962cd42e793184e8c6c8c90d2d9", + "artifact_digest": "sha256:e8092d8c75768ba31abe07fa60d85c1d13f7ed8b2159acb7785e0041f44e771a", "rendering": { "bundle": false, "format": "parquet", - "layout": 4 + "layout": 4, + "without_party_totals": true }, - "bytes": 13398, + "bytes": 13418, "media_type": "application/vnd.apache.parquet", - "created_at": "2026-10-23T16:58:55.692876+00:00", + "created_at": "2026-10-25T14:19:44.744913+00:00", "tier": "working", - "url": "/api/datasets/spec_4c228c73be6c18efd0939eabb3b3c456/cv_1868d697e8e7d56da6a83740a940c2e5/files/sha256:582f586bcb05d6807c91e6b5d88779c13c5c0962cd42e793184e8c6c8c90d2d9", + "url": "/api/datasets/spec_4c228c73be6c18efd0939eabb3b3c456/cv_1868d697e8e7d56da6a83740a940c2e5/files/sha256:e8092d8c75768ba31abe07fa60d85c1d13f7ed8b2159acb7785e0041f44e771a", "enrichment_stamp": "08ed6c734fc69ea2204a21f4e1dd8b963f14dd1e03a2484c618049ac2e2d93d8" }, { @@ -1113,7 +1115,7 @@ "status": 200, "headers": { "content-type": "application/json", - "x-dfo-trace-id": "0692c2d1a7bd4f6eaea00d7d3ebbf320" + "x-dfo-trace-id": "de250b63d7d54077a2e7ced00745249b" }, "json": { "schema_version": 1, @@ -1122,8 +1124,8 @@ "extract_skipped": true }, "diagnostics": { - "engine_build": "99e62038ceb4b459c2ac699549076ff123c166aa", - "trace_id": "0692c2d1a7bd4f6eaea00d7d3ebbf320", + "engine_build": "d80df9f5fd598b7345255470932d202ee5d49942", + "trace_id": "de250b63d7d54077a2e7ced00745249b", "warnings": [], "timing_ms": { "total": 2, @@ -1141,7 +1143,7 @@ { "code": "role_scope_defaulted", "severity": "warn", - "message": "no provider was named; the answer was resolved across every provider with data." + "message": "No provider was named, so the answer covers every provider with data." } ], "timing_ms": { @@ -2291,7 +2293,7 @@ } ], "query_qualifiers": [], - "capability_version": "cap_88defe77cc79e0c0" + "capability_version": "cap_765c9d2a0c7529b9" }, "confidence": "high", "available_at_place": true, @@ -4853,21 +4855,21 @@ { "request": { "method": "GET", - "origin_path": "/api/datasets/spec_4c228c73be6c18efd0939eabb3b3c456/cv_1868d697e8e7d56da6a83740a940c2e5/files/sha256:582f586bcb05d6807c91e6b5d88779c13c5c0962cd42e793184e8c6c8c90d2d9" + "origin_path": "/api/datasets/spec_4c228c73be6c18efd0939eabb3b3c456/cv_1868d697e8e7d56da6a83740a940c2e5/files/sha256:e8092d8c75768ba31abe07fa60d85c1d13f7ed8b2159acb7785e0041f44e771a" }, "response": { "status": 302, "headers": { "content-type": "text/html", - "location": "https://storage.googleapis.com/dev-fin-observatory-datasets-working/sha256%3A582f586bcb05d6807c91e6b5d88779c13c5c0962cd42e793184e8c6c8c90d2d9?X-Goog-Signature=redacted", - "x-dfo-trace-id": "87314d01b1d242878c925123dd2c645e" + "location": "https://storage.googleapis.com/dev-fin-observatory-datasets-working/sha256%3Ae8092d8c75768ba31abe07fa60d85c1d13f7ed8b2159acb7785e0041f44e771a?X-Goog-Signature=redacted", + "x-dfo-trace-id": "3971fe2094964eb69642432194306145" } } }, { "request": { "method": "GET", - "url": "https://storage.googleapis.com/dev-fin-observatory-datasets-working/sha256%3A582f586bcb05d6807c91e6b5d88779c13c5c0962cd42e793184e8c6c8c90d2d9?X-Goog-Signature=redacted" + "url": "https://storage.googleapis.com/dev-fin-observatory-datasets-working/sha256%3Ae8092d8c75768ba31abe07fa60d85c1d13f7ed8b2159acb7785e0041f44e771a?X-Goog-Signature=redacted" }, "response": { "status": 200, @@ -4883,32 +4885,32 @@ "dataset": { "rows": 309, "columns": [ - "stat_var", - "financingProvider", + "time_period", "financingProvider_label", + "financingRecipient_label", + "crsPurpose_label", + "value", + "unit_label", + "crsTypeOfFlow_label", + "provenance_label", + "financingProvider", "financingProvider_kind", "financingRecipient", - "financingRecipient_label", "financingRecipient_kind", "crsCooperationModality", "crsCooperationModality_label", "crsPurpose", - "crsPurpose_label", "crsTypeOfFinance", "crsTypeOfFinance_label", "crsTypeOfFlow", - "crsTypeOfFlow_label", - "time_period", - "value", "unit", - "unit_label", "currency", "price_basis", "base_year", "measurementMethod", "measurementMethod_label", "provenance", - "provenance_label" + "stat_var" ], "complete": true, "members": [ diff --git a/python/client-contract/src/dfo_client_contract/scenarios/fetch-spec-entity-dropped.parquet b/python/client-contract/src/dfo_client_contract/scenarios/fetch-spec-entity-dropped.parquet index 878d002..ecb1ada 100644 Binary files a/python/client-contract/src/dfo_client_contract/scenarios/fetch-spec-entity-dropped.parquet and b/python/client-contract/src/dfo_client_contract/scenarios/fetch-spec-entity-dropped.parquet differ 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 16617f3..d1761e5 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": "99e62038ceb4b459c2ac699549076ff123c166aa", - "recorded_at": "2026-10-25T17:35:07Z" + "dfo_commit": "d80df9f5fd598b7345255470932d202ee5d49942", + "recorded_at": "2026-10-26T09:22:15Z" }, "call": [ { @@ -179,7 +179,8 @@ }, "options": { "format": "parquet", - "bundle": false + "bundle": false, + "without_party_totals": true } } }, @@ -187,7 +188,7 @@ "status": 200, "headers": { "content-type": "application/json", - "x-dfo-trace-id": "c300bd110ab946ca8d84150069c17dca" + "x-dfo-trace-id": "042e6c2ebb034091b3fbbfcef0565c48" }, "json": { "schema_version": 1, @@ -592,7 +593,7 @@ "frame_grammar_version": "1.1.0", "origin_catalogue_build_id": "20261020T170016Z-691bf0da", "served_from": "head", - "confirmed_at": "2026-10-25T17:32:54.857057+00:00" + "confirmed_at": "2026-10-26T09:18:08.892616+00:00" }, "warnings": [], "diagnostics": [ @@ -608,7 +609,8 @@ "rendering": { "bundle": false, "format": "parquet", - "layout": 4 + "layout": 4, + "without_party_totals": true }, "bytes": 9116, "media_type": "application/vnd.apache.parquet", @@ -1006,7 +1008,7 @@ "status": 200, "headers": { "content-type": "application/json", - "x-dfo-trace-id": "cda5e03a69994294aafeced4e9f7c863" + "x-dfo-trace-id": "155a086b6b2b46fe899457496517c746" }, "json": { "schema_version": 1, @@ -1015,11 +1017,11 @@ "extract_skipped": true }, "diagnostics": { - "engine_build": "99e62038ceb4b459c2ac699549076ff123c166aa", - "trace_id": "cda5e03a69994294aafeced4e9f7c863", + "engine_build": "d80df9f5fd598b7345255470932d202ee5d49942", + "trace_id": "155a086b6b2b46fe899457496517c746", "warnings": [], "timing_ms": { - "total": 1, + "total": 3, "by_step": { "coverage": 0 } @@ -1032,9 +1034,9 @@ "variable_text": "dataset", "warnings": [], "timing_ms": { - "total": 0, + "total": 1, "by_step": { - "response_cache_part_memo": 0 + "response_cache_part_memo": 1 } }, "entity_refs": [], @@ -2048,7 +2050,7 @@ } ], "query_qualifiers": [], - "capability_version": "cap_88defe77cc79e0c0" + "capability_version": "cap_765c9d2a0c7529b9" }, "confidence": "high", "available_at_place": true, @@ -4548,7 +4550,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": "6e619a68dbf24322b376474542adb146" + "x-dfo-trace-id": "1300eead85a84452b36be91c751c6206" } } }, @@ -4571,32 +4573,32 @@ "dataset": { "rows": 2, "columns": [ - "stat_var", - "financingProvider", + "time_period", "financingProvider_label", + "financingRecipient_label", + "crsPurpose_label", + "value", + "unit_label", + "crsTypeOfFlow_label", + "provenance_label", + "financingProvider", "financingProvider_kind", "financingRecipient", - "financingRecipient_label", "financingRecipient_kind", "crsCooperationModality", "crsCooperationModality_label", "crsPurpose", - "crsPurpose_label", "crsTypeOfFinance", "crsTypeOfFinance_label", "crsTypeOfFlow", - "crsTypeOfFlow_label", - "time_period", - "value", "unit", - "unit_label", "currency", "price_basis", "base_year", "measurementMethod", "measurementMethod_label", "provenance", - "provenance_label" + "stat_var" ], "complete": true, "members": [ 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 6d9cca9..e364bed 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 @@ -167,7 +167,8 @@ }, "options": { "format": "parquet", - "bundle": false + "bundle": false, + "without_party_totals": true } } }, @@ -175,7 +176,7 @@ "status": 200, "headers": { "content-type": "application/json", - "x-dfo-trace-id": "cdb2d56286eb4d468f447309c3bd06d9" + "x-dfo-trace-id": "b89cda3bb794448abf06b56c955d754e" }, "json": { "schema_version": 1, @@ -582,7 +583,7 @@ "frame_grammar_version": "1.1.0", "origin_catalogue_build_id": "20261019T174519Z-2e5e8cfd", "served_from": "head", - "confirmed_at": "2026-10-25T17:30:48.703616+00:00" + "confirmed_at": "2026-10-26T09:18:06.976633+00:00" }, "warnings": [ { @@ -604,7 +605,8 @@ "rendering": { "bundle": false, "format": "parquet", - "layout": 4 + "layout": 4, + "without_party_totals": true }, "bytes": 9599, "media_type": "application/vnd.apache.parquet", @@ -911,7 +913,7 @@ "response": { "status": 204, "headers": { - "x-dfo-trace-id": "114f3d3a1c78408c92fd29cc76887fdc" + "x-dfo-trace-id": "cf3f86713afb44c98d21fbf9731d66e3" } } } @@ -921,7 +923,7 @@ "error": { "class": "ContractError", "code": "unexpected_response", - "trace_id": "114f3d3a1c78408c92fd29cc76887fdc" + "trace_id": "cf3f86713afb44c98d21fbf9731d66e3" } } ] 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 6b6f585..dc2c862 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 @@ -167,7 +167,8 @@ }, "options": { "format": "parquet", - "bundle": false + "bundle": false, + "without_party_totals": true } } }, @@ -175,7 +176,7 @@ "status": 200, "headers": { "content-type": "application/json", - "x-dfo-trace-id": "cdb2d56286eb4d468f447309c3bd06d9" + "x-dfo-trace-id": "b89cda3bb794448abf06b56c955d754e" }, "json": { "schema_version": 1, @@ -582,7 +583,7 @@ "frame_grammar_version": "1.1.0", "origin_catalogue_build_id": "20261019T174519Z-2e5e8cfd", "served_from": "head", - "confirmed_at": "2026-10-25T17:30:48.703616+00:00" + "confirmed_at": "2026-10-26T09:18:06.976633+00:00" }, "warnings": [ { @@ -604,7 +605,8 @@ "rendering": { "bundle": false, "format": "parquet", - "layout": 4 + "layout": 4, + "without_party_totals": true }, "bytes": 9599, "media_type": "application/vnd.apache.parquet", @@ -912,7 +914,7 @@ "status": 200, "headers": { "content-type": "application/vnd.apache.parquet", - "x-dfo-trace-id": "114f3d3a1c78408c92fd29cc76887fdc" + "x-dfo-trace-id": "cf3f86713afb44c98d21fbf9731d66e3" }, "body_file": "fetch-spec-known-sentence.parquet" } @@ -923,32 +925,32 @@ "dataset": { "rows": 4, "columns": [ - "stat_var", - "financingProvider", + "time_period", "financingProvider_label", + "financingRecipient_label", + "crsPurpose_label", + "value", + "unit_label", + "crsTypeOfFlow_label", + "provenance_label", + "financingProvider", "financingProvider_kind", "financingRecipient", - "financingRecipient_label", "financingRecipient_kind", "crsCooperationModality", "crsCooperationModality_label", "crsPurpose", - "crsPurpose_label", "crsTypeOfFinance", "crsTypeOfFinance_label", "crsTypeOfFlow", - "crsTypeOfFlow_label", - "time_period", - "value", "unit", - "unit_label", "currency", "price_basis", "base_year", "measurementMethod", "measurementMethod_label", "provenance", - "provenance_label" + "stat_var" ], "complete": true, "members": [ 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 9415cf0..32dc6ef 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 @@ -167,7 +167,8 @@ }, "options": { "format": "parquet", - "bundle": false + "bundle": false, + "without_party_totals": true } } }, @@ -175,7 +176,7 @@ "status": 200, "headers": { "content-type": "application/json", - "x-dfo-trace-id": "cdb2d56286eb4d468f447309c3bd06d9" + "x-dfo-trace-id": "b89cda3bb794448abf06b56c955d754e" }, "json": { "schema_version": 1, @@ -582,7 +583,7 @@ "frame_grammar_version": "1.1.0", "origin_catalogue_build_id": "20261019T174519Z-2e5e8cfd", "served_from": "head", - "confirmed_at": "2026-10-25T17:30:48.703616+00:00" + "confirmed_at": "2026-10-26T09:18:06.976633+00:00" }, "warnings": [ { @@ -604,7 +605,8 @@ "rendering": { "bundle": false, "format": "parquet", - "layout": 4 + "layout": 4, + "without_party_totals": true }, "bytes": 9599, "media_type": "application/vnd.apache.parquet", @@ -912,7 +914,7 @@ "status": 307, "headers": { "location": "https://storage.googleapis.com/dev-fin-observatory-datasets-working/sha256%3Ac44200969f19d73104d1bc24ebca905e59f749c2939234cdde10ba6f5a131170?X-Goog-Signature=redacted", - "x-dfo-trace-id": "114f3d3a1c78408c92fd29cc76887fdc" + "x-dfo-trace-id": "cf3f86713afb44c98d21fbf9731d66e3" } } } @@ -922,7 +924,7 @@ "error": { "class": "ContractError", "code": "unexpected_response", - "trace_id": "114f3d3a1c78408c92fd29cc76887fdc" + "trace_id": "cf3f86713afb44c98d21fbf9731d66e3" } } ] 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 b28d40b..1424844 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 @@ -167,7 +167,8 @@ }, "options": { "format": "parquet", - "bundle": false + "bundle": false, + "without_party_totals": true } } }, @@ -175,7 +176,7 @@ "status": 200, "headers": { "content-type": "application/json", - "x-dfo-trace-id": "cdb2d56286eb4d468f447309c3bd06d9" + "x-dfo-trace-id": "b89cda3bb794448abf06b56c955d754e" }, "json": { "schema_version": 1, @@ -582,7 +583,7 @@ "frame_grammar_version": "1.1.0", "origin_catalogue_build_id": "20261019T174519Z-2e5e8cfd", "served_from": "head", - "confirmed_at": "2026-10-25T17:30:48.703616+00:00" + "confirmed_at": "2026-10-26T09:18:06.976633+00:00" }, "warnings": [ { @@ -604,7 +605,8 @@ "rendering": { "bundle": false, "format": "parquet", - "layout": 4 + "layout": 4, + "without_party_totals": true }, "bytes": 9599, "media_type": "application/vnd.apache.parquet", @@ -909,7 +911,7 @@ "error": { "class": "ContractError", "code": "contract_violation", - "trace_id": "cdb2d56286eb4d468f447309c3bd06d9" + "trace_id": "b89cda3bb794448abf06b56c955d754e" } } ] 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 c92644e..4ca9780 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": "99e62038ceb4b459c2ac699549076ff123c166aa", - "recorded_at": "2026-10-25T17:36:43Z" + "dfo_commit": "d80df9f5fd598b7345255470932d202ee5d49942", + "recorded_at": "2026-10-26T09:23:08Z" }, "call": [ { @@ -166,7 +166,8 @@ "options": { "format": "parquet", "bundle": false, - "layout": "frame" + "layout": "frame", + "without_party_totals": true } } }, @@ -174,7 +175,7 @@ "status": 200, "headers": { "content-type": "application/json", - "x-dfo-trace-id": "02d03065ffb242dbb868f3f7b8d63608" + "x-dfo-trace-id": "b236e3739a984c4da5c2a1ba3fe66cc9" }, "json": { "schema_version": 1, @@ -575,7 +576,7 @@ "frame_grammar_version": "1.1.0", "origin_catalogue_build_id": "20261011T194155Z-80081f08", "served_from": "head", - "confirmed_at": "2026-10-25T17:22:10.027136+00:00" + "confirmed_at": "2026-10-26T09:17:22.037029+00:00" }, "warnings": [ { @@ -597,7 +598,8 @@ "rendering": { "bundle": false, "format": "parquet", - "layout": "frame" + "layout": "frame", + "without_party_totals": true }, "bytes": 5627, "media_type": "application/vnd.apache.parquet", @@ -919,7 +921,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": "3b2bd09c3ba0491596f2ff115a040356" + "x-dfo-trace-id": "5abca8a9651b4bca8e2d422e6b8c02a1" } } }, @@ -942,19 +944,19 @@ "dataset": { "rows": 30, "columns": [ - "stat_var", + "time_period", "financingProvider", "financingRecipient", - "time_period", + "stat_var_crsPurpose", "value", "unit", - "measurementMethod", + "stat_var_crsTypeOfFlow", "provenance", + "measurementMethod", "status", "stat_var_crsCooperationModality", - "stat_var_crsPurpose", "stat_var_crsTypeOfFinance", - "stat_var_crsTypeOfFlow" + "stat_var" ], "complete": true, "members": [ 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 5211725..79b670b 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,8 +5,8 @@ "origin": { "kind": "recorded", "base_url": "https://dfo-dev-apis-zms5lj4zhq-nn.a.run.app/api", - "dfo_commit": "99e62038ceb4b459c2ac699549076ff123c166aa", - "recorded_at": "2026-10-25T17:35:10Z" + "dfo_commit": "d80df9f5fd598b7345255470932d202ee5d49942", + "recorded_at": "2026-10-26T09:22:26Z" }, "call": [ { @@ -241,7 +241,8 @@ }, "options": { "format": "parquet", - "bundle": false + "bundle": false, + "without_party_totals": true } } }, @@ -249,7 +250,7 @@ "status": 200, "headers": { "content-type": "application/json", - "x-dfo-trace-id": "2c5831471ed840c29a3775450547ab35" + "x-dfo-trace-id": "c658ba6641be4c4183f82bbab7cabc5a" }, "json": { "schema_version": 1, @@ -535,7 +536,7 @@ "frame_grammar_version": "1.1.0", "origin_catalogue_build_id": "20261021T070020Z-7262111e", "served_from": "head", - "confirmed_at": "2026-10-25T17:33:02.255719+00:00" + "confirmed_at": "2026-10-26T09:18:33.682273+00:00" }, "warnings": [ { @@ -553,17 +554,18 @@ ], "artifacts": [ { - "artifact_digest": "sha256:a5198249a7b16b895b1b7e8127605c644edaf2cda240201e391fc377aaf4dafd", + "artifact_digest": "sha256:87ee2f60de69561349a468cc45a902dc585b7726affc5fa2d080750df7ce9a72", "rendering": { "bundle": false, "format": "parquet", - "layout": 4 + "layout": 4, + "without_party_totals": true }, - "bytes": 8777, + "bytes": 8810, "media_type": "application/vnd.apache.parquet", - "created_at": "2026-10-23T16:59:04.339940+00:00", + "created_at": "2026-10-25T14:20:02.459303+00:00", "tier": "working", - "url": "/api/datasets/spec_f04936b8378cde70bc6289ac1e45ee9b/cv_daec84e443d4e1b37291242d90fc8fa8/files/sha256:a5198249a7b16b895b1b7e8127605c644edaf2cda240201e391fc377aaf4dafd", + "url": "/api/datasets/spec_f04936b8378cde70bc6289ac1e45ee9b/cv_daec84e443d4e1b37291242d90fc8fa8/files/sha256:87ee2f60de69561349a468cc45a902dc585b7726affc5fa2d080750df7ce9a72", "enrichment_stamp": "08ed6c734fc69ea2204a21f4e1dd8b963f14dd1e03a2484c618049ac2e2d93d8" }, { @@ -999,7 +1001,7 @@ "status": 200, "headers": { "content-type": "application/json", - "x-dfo-trace-id": "134afaa6b00f4af9aca4184c7e3b3da3" + "x-dfo-trace-id": "b0a96c8e862d4a3ea8b0dea282c6ada4" }, "json": { "schema_version": 1, @@ -1008,13 +1010,13 @@ "extract_skipped": true }, "diagnostics": { - "engine_build": "99e62038ceb4b459c2ac699549076ff123c166aa", - "trace_id": "134afaa6b00f4af9aca4184c7e3b3da3", + "engine_build": "d80df9f5fd598b7345255470932d202ee5d49942", + "trace_id": "b0a96c8e862d4a3ea8b0dea282c6ada4", "warnings": [], "timing_ms": { "total": 2, "by_step": { - "coverage": 0 + "coverage": 1 } }, "timed_out": false @@ -2862,7 +2864,7 @@ "start_year": 2020, "end_year": 2023 }, - "capability_version": "cap_88defe77cc79e0c0" + "capability_version": "cap_765c9d2a0c7529b9" }, "confidence": "high", "available_at_place": true, @@ -5295,21 +5297,21 @@ { "request": { "method": "GET", - "origin_path": "/api/datasets/spec_f04936b8378cde70bc6289ac1e45ee9b/cv_daec84e443d4e1b37291242d90fc8fa8/files/sha256:a5198249a7b16b895b1b7e8127605c644edaf2cda240201e391fc377aaf4dafd" + "origin_path": "/api/datasets/spec_f04936b8378cde70bc6289ac1e45ee9b/cv_daec84e443d4e1b37291242d90fc8fa8/files/sha256:87ee2f60de69561349a468cc45a902dc585b7726affc5fa2d080750df7ce9a72" }, "response": { "status": 302, "headers": { "content-type": "text/html", - "location": "https://storage.googleapis.com/dev-fin-observatory-datasets-working/sha256%3Aa5198249a7b16b895b1b7e8127605c644edaf2cda240201e391fc377aaf4dafd?X-Goog-Signature=redacted", - "x-dfo-trace-id": "b41ac53e34ed4270be2c55a3276a92dd" + "location": "https://storage.googleapis.com/dev-fin-observatory-datasets-working/sha256%3A87ee2f60de69561349a468cc45a902dc585b7726affc5fa2d080750df7ce9a72?X-Goog-Signature=redacted", + "x-dfo-trace-id": "83e8a270332a4fdd9ae6127e98ee0d0d" } } }, { "request": { "method": "GET", - "url": "https://storage.googleapis.com/dev-fin-observatory-datasets-working/sha256%3Aa5198249a7b16b895b1b7e8127605c644edaf2cda240201e391fc377aaf4dafd?X-Goog-Signature=redacted" + "url": "https://storage.googleapis.com/dev-fin-observatory-datasets-working/sha256%3A87ee2f60de69561349a468cc45a902dc585b7726affc5fa2d080750df7ce9a72?X-Goog-Signature=redacted" }, "response": { "status": 200, @@ -5325,26 +5327,26 @@ "dataset": { "rows": 170, "columns": [ - "stat_var", - "financingProvider", + "time_period", "financingProvider_label", + "financingRecipient_label", + "value", + "unit_label", + "dac2aAidType_label", + "provenance_label", + "financingProvider", "financingProvider_kind", "financingRecipient", - "financingRecipient_label", "financingRecipient_kind", "dac2aAidType", - "dac2aAidType_label", - "time_period", - "value", "unit", - "unit_label", "currency", "price_basis", "base_year", "measurementMethod", "measurementMethod_label", "provenance", - "provenance_label" + "stat_var" ], "complete": true, "members": [ 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 b7ceb83..001b8f4 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 f6a6faf..603a911 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,8 +5,8 @@ "origin": { "kind": "recorded", "base_url": "https://dfo-dev-apis-zms5lj4zhq-nn.a.run.app/api", - "dfo_commit": "99e62038ceb4b459c2ac699549076ff123c166aa", - "recorded_at": "2026-10-25T17:35:12Z" + "dfo_commit": "d80df9f5fd598b7345255470932d202ee5d49942", + "recorded_at": "2026-10-26T09:22:27Z" }, "call": [ { @@ -288,7 +288,8 @@ }, "options": { "format": "parquet", - "bundle": false + "bundle": false, + "without_party_totals": true } } }, @@ -296,7 +297,7 @@ "status": 200, "headers": { "content-type": "application/json", - "x-dfo-trace-id": "1db6e6a9c94644ec858a7a31d195930a" + "x-dfo-trace-id": "e32f376d58684753b9bc195b1429569b" }, "json": { "schema_version": 1, @@ -580,7 +581,7 @@ "frame_grammar_version": "1.1.0", "origin_catalogue_build_id": "20261021T070020Z-7262111e", "served_from": "head", - "confirmed_at": "2026-10-25T17:33:05.340244+00:00" + "confirmed_at": "2026-10-26T09:18:36.478834+00:00" }, "warnings": [], "diagnostics": [ @@ -592,17 +593,18 @@ ], "artifacts": [ { - "artifact_digest": "sha256:a382b8f9e3ba634c150c6588e21f79413722d53f7bcdcb9dfd4e929aa4f80993", + "artifact_digest": "sha256:e9513ce3953896d5b833a71546a5987a82e3f18219cd43eb987fc69dfab80321", "rendering": { "bundle": false, "format": "parquet", - "layout": 4 + "layout": 4, + "without_party_totals": true }, - "bytes": 21088, + "bytes": 21121, "media_type": "application/vnd.apache.parquet", - "created_at": "2026-10-23T16:59:11.517434+00:00", + "created_at": "2026-10-25T14:20:06.098634+00:00", "tier": "working", - "url": "/api/datasets/spec_c2f21170dfa9f31705e47ed60c8fa305/cv_66a0a4a0331d59b519aa1629dade3d99/files/sha256:a382b8f9e3ba634c150c6588e21f79413722d53f7bcdcb9dfd4e929aa4f80993", + "url": "/api/datasets/spec_c2f21170dfa9f31705e47ed60c8fa305/cv_66a0a4a0331d59b519aa1629dade3d99/files/sha256:e9513ce3953896d5b833a71546a5987a82e3f18219cd43eb987fc69dfab80321", "enrichment_stamp": "08ed6c734fc69ea2204a21f4e1dd8b963f14dd1e03a2484c618049ac2e2d93d8" }, { @@ -1036,7 +1038,7 @@ "status": 200, "headers": { "content-type": "application/json", - "x-dfo-trace-id": "c64c8515eff046ba82eaa03c3c51f486" + "x-dfo-trace-id": "76155faedf434e46b697c5bd58c318f8" }, "json": { "schema_version": 1, @@ -1045,8 +1047,8 @@ "extract_skipped": true }, "diagnostics": { - "engine_build": "99e62038ceb4b459c2ac699549076ff123c166aa", - "trace_id": "c64c8515eff046ba82eaa03c3c51f486", + "engine_build": "d80df9f5fd598b7345255470932d202ee5d49942", + "trace_id": "76155faedf434e46b697c5bd58c318f8", "warnings": [], "timing_ms": { "total": 2, @@ -2873,7 +2875,7 @@ } ], "query_qualifiers": [], - "capability_version": "cap_88defe77cc79e0c0" + "capability_version": "cap_765c9d2a0c7529b9" }, "confidence": "high", "available_at_place": true, @@ -5294,21 +5296,21 @@ { "request": { "method": "GET", - "origin_path": "/api/datasets/spec_c2f21170dfa9f31705e47ed60c8fa305/cv_66a0a4a0331d59b519aa1629dade3d99/files/sha256:a382b8f9e3ba634c150c6588e21f79413722d53f7bcdcb9dfd4e929aa4f80993" + "origin_path": "/api/datasets/spec_c2f21170dfa9f31705e47ed60c8fa305/cv_66a0a4a0331d59b519aa1629dade3d99/files/sha256:e9513ce3953896d5b833a71546a5987a82e3f18219cd43eb987fc69dfab80321" }, "response": { "status": 302, "headers": { "content-type": "text/html", - "location": "https://storage.googleapis.com/dev-fin-observatory-datasets-working/sha256%3Aa382b8f9e3ba634c150c6588e21f79413722d53f7bcdcb9dfd4e929aa4f80993?X-Goog-Signature=redacted", - "x-dfo-trace-id": "c4da26b179f04d4c8b5df81740f01830" + "location": "https://storage.googleapis.com/dev-fin-observatory-datasets-working/sha256%3Ae9513ce3953896d5b833a71546a5987a82e3f18219cd43eb987fc69dfab80321?X-Goog-Signature=redacted", + "x-dfo-trace-id": "75d565fbb9c948c8b131be201b1cf923" } } }, { "request": { "method": "GET", - "url": "https://storage.googleapis.com/dev-fin-observatory-datasets-working/sha256%3Aa382b8f9e3ba634c150c6588e21f79413722d53f7bcdcb9dfd4e929aa4f80993?X-Goog-Signature=redacted" + "url": "https://storage.googleapis.com/dev-fin-observatory-datasets-working/sha256%3Ae9513ce3953896d5b833a71546a5987a82e3f18219cd43eb987fc69dfab80321?X-Goog-Signature=redacted" }, "response": { "status": 200, @@ -5324,26 +5326,26 @@ "dataset": { "rows": 2114, "columns": [ - "stat_var", - "financingProvider", + "time_period", "financingProvider_label", + "financingRecipient_label", + "value", + "unit_label", + "dac2aAidType_label", + "provenance_label", + "financingProvider", "financingProvider_kind", "financingRecipient", - "financingRecipient_label", "financingRecipient_kind", "dac2aAidType", - "dac2aAidType_label", - "time_period", - "value", "unit", - "unit_label", "currency", "price_basis", "base_year", "measurementMethod", "measurementMethod_label", "provenance", - "provenance_label" + "stat_var" ], "complete": true, "members": [ 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 accd075..6c76c4a 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 499fb18..ecc048b 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": "99e62038ceb4b459c2ac699549076ff123c166aa", - "recorded_at": "2026-10-25T17:35:13Z" + "dfo_commit": "d80df9f5fd598b7345255470932d202ee5d49942", + "recorded_at": "2026-10-26T09:22:29Z" }, "call": [ { @@ -168,7 +168,8 @@ }, "options": { "format": "parquet", - "bundle": false + "bundle": false, + "without_party_totals": true } } }, @@ -176,7 +177,7 @@ "status": 200, "headers": { "content-type": "application/json", - "x-dfo-trace-id": "cdb2d56286eb4d468f447309c3bd06d9" + "x-dfo-trace-id": "b89cda3bb794448abf06b56c955d754e" }, "json": { "schema_version": 1, @@ -583,7 +584,7 @@ "frame_grammar_version": "1.1.0", "origin_catalogue_build_id": "20261019T174519Z-2e5e8cfd", "served_from": "head", - "confirmed_at": "2026-10-25T17:30:48.703616+00:00" + "confirmed_at": "2026-10-26T09:18:06.976633+00:00" }, "warnings": [ { @@ -605,7 +606,8 @@ "rendering": { "bundle": false, "format": "parquet", - "layout": 4 + "layout": 4, + "without_party_totals": true }, "bytes": 9599, "media_type": "application/vnd.apache.parquet", @@ -914,7 +916,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": "114f3d3a1c78408c92fd29cc76887fdc" + "x-dfo-trace-id": "cf3f86713afb44c98d21fbf9731d66e3" } } }, @@ -937,32 +939,32 @@ "dataset": { "rows": 4, "columns": [ - "stat_var", - "financingProvider", + "time_period", "financingProvider_label", + "financingRecipient_label", + "crsPurpose_label", + "value", + "unit_label", + "crsTypeOfFlow_label", + "provenance_label", + "financingProvider", "financingProvider_kind", "financingRecipient", - "financingRecipient_label", "financingRecipient_kind", "crsCooperationModality", "crsCooperationModality_label", "crsPurpose", - "crsPurpose_label", "crsTypeOfFinance", "crsTypeOfFinance_label", "crsTypeOfFlow", - "crsTypeOfFlow_label", - "time_period", - "value", "unit", - "unit_label", "currency", "price_basis", "base_year", "measurementMethod", "measurementMethod_label", "provenance", - "provenance_label" + "stat_var" ], "complete": true, "members": [ 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 a1656d2..2e809f4 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 @@ -167,7 +167,8 @@ }, "options": { "format": "parquet", - "bundle": false + "bundle": false, + "without_party_totals": true } } }, @@ -175,7 +176,7 @@ "status": 200, "headers": { "content-type": "application/json", - "x-dfo-trace-id": "cdb2d56286eb4d468f447309c3bd06d9" + "x-dfo-trace-id": "b89cda3bb794448abf06b56c955d754e" }, "json": { "schema_version": 1, @@ -517,7 +518,7 @@ "frame_grammar_version": "1.1.0", "origin_catalogue_build_id": "20261019T174519Z-2e5e8cfd", "served_from": "head", - "confirmed_at": "2026-10-25T17:30:48.703616+00:00" + "confirmed_at": "2026-10-26T09:18:06.976633+00:00" }, "warnings": [ { @@ -539,7 +540,8 @@ "rendering": { "bundle": false, "format": "parquet", - "layout": 4 + "layout": 4, + "without_party_totals": true }, "bytes": 9599, "media_type": "application/vnd.apache.parquet", @@ -844,7 +846,7 @@ "error": { "class": "ContractError", "code": "contract_violation", - "trace_id": "cdb2d56286eb4d468f447309c3bd06d9" + "trace_id": "b89cda3bb794448abf06b56c955d754e" } } ] 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 7312f8f..ef7f6ec 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 @@ -167,7 +167,8 @@ }, "options": { "format": "parquet", - "bundle": false + "bundle": false, + "without_party_totals": true } } }, @@ -175,7 +176,7 @@ "status": 200, "headers": { "content-type": "application/json", - "x-dfo-trace-id": "cdb2d56286eb4d468f447309c3bd06d9" + "x-dfo-trace-id": "b89cda3bb794448abf06b56c955d754e" }, "json": { "schema_version": 1, @@ -581,7 +582,7 @@ "frame_grammar_version": "1.1.0", "origin_catalogue_build_id": "20261019T174519Z-2e5e8cfd", "served_from": "head", - "confirmed_at": "2026-10-25T17:30:48.703616+00:00" + "confirmed_at": "2026-10-26T09:18:06.976633+00:00" }, "warnings": [ { @@ -603,7 +604,8 @@ "rendering": { "bundle": false, "format": "parquet", - "layout": 4 + "layout": 4, + "without_party_totals": true }, "bytes": 9599, "media_type": "application/vnd.apache.parquet", @@ -908,7 +910,7 @@ "error": { "class": "ContractError", "code": "contract_violation", - "trace_id": "cdb2d56286eb4d468f447309c3bd06d9" + "trace_id": "b89cda3bb794448abf06b56c955d754e" } } ] diff --git a/python/client-contract/src/dfo_client_contract/scenarios/fetch-spec-member-not-resolvable.json b/python/client-contract/src/dfo_client_contract/scenarios/fetch-spec-member-not-resolvable.json index ff7635a..73dcf74 100644 --- a/python/client-contract/src/dfo_client_contract/scenarios/fetch-spec-member-not-resolvable.json +++ b/python/client-contract/src/dfo_client_contract/scenarios/fetch-spec-member-not-resolvable.json @@ -167,7 +167,8 @@ }, "options": { "format": "parquet", - "bundle": false + "bundle": false, + "without_party_totals": true } } }, 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 14be33c..69f12eb 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": "99e62038ceb4b459c2ac699549076ff123c166aa", - "recorded_at": "2026-10-25T17:35:05Z" + "dfo_commit": "d80df9f5fd598b7345255470932d202ee5d49942", + "recorded_at": "2026-10-26T09:22:13Z" }, "call": [ { @@ -175,7 +175,8 @@ }, "options": { "format": "parquet", - "bundle": false + "bundle": false, + "without_party_totals": true } } }, @@ -183,7 +184,7 @@ "status": 200, "headers": { "content-type": "application/json", - "x-dfo-trace-id": "dbd045d5a84b4818a273bafc3e808e9c" + "x-dfo-trace-id": "250fbb95951e4a8c8d847cbcde0ae4f9" }, "json": { "schema_version": 1, @@ -590,7 +591,7 @@ "frame_grammar_version": "1.1.0", "origin_catalogue_build_id": "20261019T174519Z-2e5e8cfd", "served_from": "head", - "confirmed_at": "2026-10-25T17:30:48.703616+00:00" + "confirmed_at": "2026-10-26T09:18:06.976633+00:00" }, "warnings": [ { @@ -612,7 +613,8 @@ "rendering": { "bundle": false, "format": "parquet", - "layout": 4 + "layout": 4, + "without_party_totals": true }, "bytes": 9599, "media_type": "application/vnd.apache.parquet", @@ -997,7 +999,7 @@ "status": 200, "headers": { "content-type": "application/json", - "x-dfo-trace-id": "10b2cc32955e4dd1bdbb44ea217a46a1" + "x-dfo-trace-id": "ff646392059e46e68f83a2753e921d6a" }, "json": { "schema_version": 1, @@ -1006,11 +1008,11 @@ "extract_skipped": true }, "diagnostics": { - "engine_build": "99e62038ceb4b459c2ac699549076ff123c166aa", - "trace_id": "10b2cc32955e4dd1bdbb44ea217a46a1", + "engine_build": "d80df9f5fd598b7345255470932d202ee5d49942", + "trace_id": "ff646392059e46e68f83a2753e921d6a", "warnings": [], "timing_ms": { - "total": 2, + "total": 1, "by_step": { "coverage": 0 } @@ -2024,7 +2026,7 @@ "start_year": 2020, "end_year": 2023 }, - "capability_version": "cap_88defe77cc79e0c0" + "capability_version": "cap_765c9d2a0c7529b9" }, "confidence": "high", "available_at_place": true, @@ -4523,7 +4525,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": "3eb8e8c056854f268dff17ba392f1890" + "x-dfo-trace-id": "6a74097c16e04e21857031860d5c9de1" } } }, @@ -4546,32 +4548,32 @@ "dataset": { "rows": 4, "columns": [ - "stat_var", - "financingProvider", + "time_period", "financingProvider_label", + "financingRecipient_label", + "crsPurpose_label", + "value", + "unit_label", + "crsTypeOfFlow_label", + "provenance_label", + "financingProvider", "financingProvider_kind", "financingRecipient", - "financingRecipient_label", "financingRecipient_kind", "crsCooperationModality", "crsCooperationModality_label", "crsPurpose", - "crsPurpose_label", "crsTypeOfFinance", "crsTypeOfFinance_label", "crsTypeOfFlow", - "crsTypeOfFlow_label", - "time_period", - "value", "unit", - "unit_label", "currency", "price_basis", "base_year", "measurementMethod", "measurementMethod_label", "provenance", - "provenance_label" + "stat_var" ], "complete": true, "members": [ 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 dc288e2..7468358 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_7f538f4f65ac124f47918468b4d2eea7", + "spec_id": "spec_70ddf0ce6a9b3f147063f2adf37fab9e", "definition": { "schema_version": 1, - "spec_id": "spec_7f538f4f65ac124f47918468b4d2eea7", + "spec_id": "spec_70ddf0ce6a9b3f147063f2adf37fab9e", "identity": { "identity_version": "spec1", "shape": { @@ -226,12 +226,12 @@ }, "requested_window": { "kind": "range", - "start_year": 1964, + "start_year": 1967, "end_year": 2024 } } }, - "sentence": "Gross disbursements to the 133 G77 countries from the 32 DAC countries for official development assistance, 1964 to 2024. Current US dollars · OECD DAC2a.", + "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.", "entity_groups": { "destination": { "label": "G77 countries", @@ -242,7 +242,8 @@ "group_id": "groups/OECD.DAC" } } - } + }, + "party_totals": true } ], "exchanges": [ @@ -254,10 +255,10 @@ "schema_version": 1, "input": { "kind": "spec_id", - "spec_id": "spec_7f538f4f65ac124f47918468b4d2eea7", + "spec_id": "spec_70ddf0ce6a9b3f147063f2adf37fab9e", "definition": { "schema_version": 1, - "spec_id": "spec_7f538f4f65ac124f47918468b4d2eea7", + "spec_id": "spec_70ddf0ce6a9b3f147063f2adf37fab9e", "identity": { "identity_version": "spec1", "shape": { @@ -469,7 +470,7 @@ }, "requested_window": { "kind": "range", - "start_year": 1964, + "start_year": 1967, "end_year": 2024 } } @@ -485,15 +486,15 @@ "status": 202, "headers": { "content-type": "application/json", - "location": "/api/datasets/operations/op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef", + "location": "/api/datasets/operations/op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f", "retry-after": "2", - "x-dfo-trace-id": "5541c591450f479485c421e20fe4d81d" + "x-dfo-trace-id": "9e96509866ff4da09a698df1f19a5cbd" }, "json": { "operation": { - "operation_id": "op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef", + "operation_id": "op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f", "status": "pending", - "poll": "/api/datasets/operations/op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef", + "poll": "/api/datasets/operations/op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f", "retry_after_ms": 1500 } } @@ -502,20 +503,20 @@ { "request": { "method": "GET", - "path": "/datasets/operations/op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef" + "path": "/datasets/operations/op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f" }, "response": { "status": 200, "headers": { "content-type": "application/json", "retry-after": "2", - "x-dfo-trace-id": "3416612a1b3f4a2ebbcf8ddeff74b96a" + "x-dfo-trace-id": "6185b86217ef499bb5b6932299df1207" }, "json": { "operation": { - "operation_id": "op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef", + "operation_id": "op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f", "status": "failed", - "poll": "/api/datasets/operations/op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef", + "poll": "/api/datasets/operations/op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f", "retry_after_ms": 1500 }, "error": { @@ -539,10 +540,10 @@ "schema_version": 1, "input": { "kind": "spec_id", - "spec_id": "spec_7f538f4f65ac124f47918468b4d2eea7", + "spec_id": "spec_70ddf0ce6a9b3f147063f2adf37fab9e", "definition": { "schema_version": 1, - "spec_id": "spec_7f538f4f65ac124f47918468b4d2eea7", + "spec_id": "spec_70ddf0ce6a9b3f147063f2adf37fab9e", "identity": { "identity_version": "spec1", "shape": { @@ -754,7 +755,7 @@ }, "requested_window": { "kind": "range", - "start_year": 1964, + "start_year": 1967, "end_year": 2024 } } @@ -770,15 +771,15 @@ "status": 202, "headers": { "content-type": "application/json", - "location": "/api/datasets/operations/op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef", + "location": "/api/datasets/operations/op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f", "retry-after": "2", - "x-dfo-trace-id": "5541c591450f479485c421e20fe4d81d" + "x-dfo-trace-id": "9e96509866ff4da09a698df1f19a5cbd" }, "json": { "operation": { - "operation_id": "op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef", + "operation_id": "op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f", "status": "pending", - "poll": "/api/datasets/operations/op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef", + "poll": "/api/datasets/operations/op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f", "retry_after_ms": 1500 } } @@ -787,24 +788,24 @@ { "request": { "method": "GET", - "path": "/datasets/operations/op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef" + "path": "/datasets/operations/op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f" }, "response": { "status": 200, "headers": { "content-type": "application/json", "retry-after": "2", - "x-dfo-trace-id": "3416612a1b3f4a2ebbcf8ddeff74b96a" + "x-dfo-trace-id": "6185b86217ef499bb5b6932299df1207" }, "json": { "operation": { - "operation_id": "op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef", + "operation_id": "op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f", "status": "running", - "poll": "/api/datasets/operations/op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef", + "poll": "/api/datasets/operations/op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f", "retry_after_ms": 1500, "progress": { "rows_written": 0, - "estimate_rows": 108935 + "estimate_rows": 107252 } } } @@ -813,24 +814,24 @@ { "request": { "method": "GET", - "path": "/datasets/operations/op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef" + "path": "/datasets/operations/op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f" }, "response": { "status": 200, "headers": { "content-type": "application/json", "retry-after": "2", - "x-dfo-trace-id": "65394508d86f443db7528ac38066b9e3" + "x-dfo-trace-id": "1ebea3ca2d15409c953cd716bdc1fccf" }, "json": { "operation": { - "operation_id": "op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef", + "operation_id": "op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f", "status": "running", - "poll": "/api/datasets/operations/op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef", + "poll": "/api/datasets/operations/op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f", "retry_after_ms": 1500, "progress": { - "rows_written": 64600, - "estimate_rows": 108935 + "rows_written": 61927, + "estimate_rows": 107252 } } } @@ -839,24 +840,24 @@ { "request": { "method": "GET", - "path": "/datasets/operations/op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef" + "path": "/datasets/operations/op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f" }, "response": { "status": 200, "headers": { "content-type": "application/json", "retry-after": "2", - "x-dfo-trace-id": "7a2d07cfe29b4993a374ee71104d461a" + "x-dfo-trace-id": "94bb5a8a7c2041969d9a9118b75dc4aa" }, "json": { "operation": { - "operation_id": "op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef", + "operation_id": "op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f", "status": "running", - "poll": "/api/datasets/operations/op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef", + "poll": "/api/datasets/operations/op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f", "retry_after_ms": 1500, "progress": { - "rows_written": 108935, - "estimate_rows": 108935 + "rows_written": 107252, + "estimate_rows": 107252 } } } @@ -865,24 +866,24 @@ { "request": { "method": "GET", - "path": "/datasets/operations/op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef" + "path": "/datasets/operations/op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f" }, "response": { "status": 200, "headers": { "content-type": "application/json", "retry-after": "2", - "x-dfo-trace-id": "7c7c516f463a471583976147759c6250" + "x-dfo-trace-id": "c78757a54b9f4b6786a784f8a47ad5b4" }, "json": { "operation": { - "operation_id": "op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef", + "operation_id": "op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f", "status": "running", - "poll": "/api/datasets/operations/op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef", - "retry_after_ms": 1786, + "poll": "/api/datasets/operations/op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f", + "retry_after_ms": 1784, "progress": { - "rows_written": 108935, - "estimate_rows": 108935 + "rows_written": 107252, + "estimate_rows": 107252 } } } @@ -891,24 +892,24 @@ { "request": { "method": "GET", - "path": "/datasets/operations/op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef" + "path": "/datasets/operations/op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f" }, "response": { "status": 200, "headers": { "content-type": "application/json", "retry-after": "3", - "x-dfo-trace-id": "9ddce1ae50fd4187abeb32c45a0f03ba" + "x-dfo-trace-id": "914bfd57942740b893ba9ca1b4f4591b" }, "json": { "operation": { - "operation_id": "op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef", + "operation_id": "op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f", "status": "running", - "poll": "/api/datasets/operations/op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef", - "retry_after_ms": 2268, + "poll": "/api/datasets/operations/op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f", + "retry_after_ms": 2289, "progress": { - "rows_written": 108935, - "estimate_rows": 108935 + "rows_written": 107252, + "estimate_rows": 107252 } } } @@ -917,24 +918,24 @@ { "request": { "method": "GET", - "path": "/datasets/operations/op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef" + "path": "/datasets/operations/op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f" }, "response": { "status": 200, "headers": { "content-type": "application/json", "retry-after": "3", - "x-dfo-trace-id": "1ce68951ada64961b3710bb73127c9d8" + "x-dfo-trace-id": "217766e0425f4916a393331295c4a7e7" }, "json": { "operation": { - "operation_id": "op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef", + "operation_id": "op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f", "status": "running", - "poll": "/api/datasets/operations/op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef", - "retry_after_ms": 2869, + "poll": "/api/datasets/operations/op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f", + "retry_after_ms": 2934, "progress": { - "rows_written": 108935, - "estimate_rows": 108935 + "rows_written": 107252, + "estimate_rows": 107252 } } } @@ -943,24 +944,24 @@ { "request": { "method": "GET", - "path": "/datasets/operations/op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef" + "path": "/datasets/operations/op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f" }, "response": { "status": 200, "headers": { "content-type": "application/json", - "x-dfo-trace-id": "37207f1ea4574e4e8485e8cebd4f4edc" + "x-dfo-trace-id": "c501ba8d087b4561b2ff0e423c719ab0" }, "json": { "operation": { - "operation_id": "op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef", + "operation_id": "op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f", "status": "done" }, "manifest": { "schema_version": 1, "definition": { "schema_version": 1, - "spec_id": "spec_7f538f4f65ac124f47918468b4d2eea7", + "spec_id": "spec_70ddf0ce6a9b3f147063f2adf37fab9e", "identity": { "shape": { "kind": "statvar_schema", @@ -1173,14 +1174,14 @@ "requested_window": { "kind": "range", "end_year": 2024, - "start_year": 1964 + "start_year": 1967 } } }, - "content_version": "cv_ed2cc83eb28d4e6883cde079f05844ed", - "prepared_at": "2026-10-25T17:38:14Z", + "content_version": "cv_fafc60a507e03b0d42689fb1936127b9", + "prepared_at": "2026-10-26T09:22:44Z", "coverage": { - "rows": 108935, + "rows": 107252, "dimensions": [ { "label": "financingProvider", @@ -1202,14 +1203,14 @@ }, { "label": "years", - "count": 61 + "count": 58 } ], "window": { "kind": "range", "origin": "query", "end_year": 2024, - "start_year": 1964 + "start_year": 1967 } }, "citation": { @@ -1328,9 +1329,9 @@ "kind": "range", "origin": "query", "end_year": 2024, - "start_year": 1964 + "start_year": 1967 }, - "graph_revision": "dfo-dev-dc-datacommons-service-00273-mmh", + "graph_revision": null, "normalisations": [], "code_index_stamp": { "exported_at": "2026-10-24T19:20:27Z", @@ -1344,7 +1345,7 @@ } ], "capability_version": "dset_76f5fa7244511c58", - "materialiser_build": "99e62038ceb4b459c2ac699549076ff123c166aa", + "materialiser_build": "d80df9f5fd598b7345255470932d202ee5d49942", "resolved_stat_vars": [ { "ref": "dcid:Amount_FinancialFlow_Gross_Disbursement_DAC2aAidType206_Nominal", @@ -1352,15 +1353,15 @@ "financingProvider", "financingRecipient" ], - "observation_count": 108935 + "observation_count": 107252 } ], "family_member_count": 1, "family_member_digest": "1a36e1a7292b1bfff95a5415de0be74cac7bb033217ed50e79faa8ce51a224c0", "frame_grammar_version": "1.1.0", - "origin_catalogue_build_id": "20261024T193016Z-775d36a9", + "origin_catalogue_build_id": "20261026T000018Z-0af2cac5", "served_from": "materialise", - "confirmed_at": "2026-10-25T17:38:17.505656+00:00" + "confirmed_at": "2026-10-26T09:22:46.854499+00:00" }, "warnings": [], "diagnostics": [ @@ -1372,29 +1373,29 @@ ], "artifacts": [ { - "artifact_digest": "sha256:4d80e30e27b5a64706113d54946e3a387e422b1115d1437594ac4b1d4307ffd2", + "artifact_digest": "sha256:a8c742f8f416b2f3414c7a569f7c18b337c5ee9ae3012483583bad0b238f5c61", "rendering": { "bundle": false, "format": "parquet", "layout": 4 }, - "bytes": 472796, + "bytes": 466531, "media_type": "application/vnd.apache.parquet", - "created_at": "2026-10-25T17:38:17.426404+00:00", + "created_at": "2026-10-26T09:22:46.786678+00:00", "tier": "working", - "url": "/api/datasets/spec_7f538f4f65ac124f47918468b4d2eea7/cv_ed2cc83eb28d4e6883cde079f05844ed/files/sha256:4d80e30e27b5a64706113d54946e3a387e422b1115d1437594ac4b1d4307ffd2", + "url": "/api/datasets/spec_70ddf0ce6a9b3f147063f2adf37fab9e/cv_fafc60a507e03b0d42689fb1936127b9/files/sha256:a8c742f8f416b2f3414c7a569f7c18b337c5ee9ae3012483583bad0b238f5c61", "enrichment_stamp": "08ed6c734fc69ea2204a21f4e1dd8b963f14dd1e03a2484c618049ac2e2d93d8" }, { - "artifact_digest": "sha256:4e3ed758ad1a33cf9d150ee5fa71adf7f5bd40e4d342d839633d8386239babe1", + "artifact_digest": "sha256:5247bafa55f84fe2f8bc348601acb955162c39a1a082e939945336470e5c5231", "rendering": { "statistics": "series" }, - "bytes": 144449, + "bytes": 144985, "media_type": "application/vnd.apache.parquet", - "created_at": "2026-10-25T17:38:17.426404+00:00", + "created_at": "2026-10-26T09:22:46.786678+00:00", "tier": "working", - "url": "/api/datasets/spec_7f538f4f65ac124f47918468b4d2eea7/cv_ed2cc83eb28d4e6883cde079f05844ed/files/sha256:4e3ed758ad1a33cf9d150ee5fa71adf7f5bd40e4d342d839633d8386239babe1" + "url": "/api/datasets/spec_70ddf0ce6a9b3f147063f2adf37fab9e/cv_fafc60a507e03b0d42689fb1936127b9/files/sha256:5247bafa55f84fe2f8bc348601acb955162c39a1a082e939945336470e5c5231" } ], "series_count": 3656, @@ -1423,7 +1424,7 @@ "name": "time_period", "kind": "grain", "droppable": false, - "distinct": 61 + "distinct": 58 }, { "name": "value", @@ -1663,7 +1664,7 @@ "varying": [ { "column": "time_period", - "distinct": 61 + "distinct": 58 } ] }, @@ -1687,7 +1688,7 @@ "varying": [ { "column": "time_period", - "distinct": 61 + "distinct": 58 } ] }, @@ -1749,7 +1750,7 @@ "series_coverage_stamp": "e6e717ab8c77e84d010915893ede5809e9ecec67929a07cfafbcc2210edfa1eb", "retention": { "pinned": false, - "held_until": "2026-11-24T17:38:17.425152Z" + "held_until": "2026-11-25T09:22:46.785219Z" } } } @@ -1758,21 +1759,21 @@ { "request": { "method": "GET", - "origin_path": "/api/datasets/spec_7f538f4f65ac124f47918468b4d2eea7/cv_ed2cc83eb28d4e6883cde079f05844ed/files/sha256:4d80e30e27b5a64706113d54946e3a387e422b1115d1437594ac4b1d4307ffd2" + "origin_path": "/api/datasets/spec_70ddf0ce6a9b3f147063f2adf37fab9e/cv_fafc60a507e03b0d42689fb1936127b9/files/sha256:a8c742f8f416b2f3414c7a569f7c18b337c5ee9ae3012483583bad0b238f5c61" }, "response": { "status": 302, "headers": { "content-type": "text/html", - "location": "https://storage.googleapis.com/dev-fin-observatory-datasets-working/sha256%3A4d80e30e27b5a64706113d54946e3a387e422b1115d1437594ac4b1d4307ffd2?X-Goog-Signature=redacted", - "x-dfo-trace-id": "919c1e572d914a608b166556417714c9" + "location": "https://storage.googleapis.com/dev-fin-observatory-datasets-working/sha256%3Aa8c742f8f416b2f3414c7a569f7c18b337c5ee9ae3012483583bad0b238f5c61?X-Goog-Signature=redacted", + "x-dfo-trace-id": "22f0d88923c14d74825b5f14d41c05b8" } } }, { "request": { "method": "GET", - "url": "https://storage.googleapis.com/dev-fin-observatory-datasets-working/sha256%3A4d80e30e27b5a64706113d54946e3a387e422b1115d1437594ac4b1d4307ffd2?X-Goog-Signature=redacted" + "url": "https://storage.googleapis.com/dev-fin-observatory-datasets-working/sha256%3Aa8c742f8f416b2f3414c7a569f7c18b337c5ee9ae3012483583bad0b238f5c61?X-Goog-Signature=redacted" }, "response": { "status": 200, @@ -1786,51 +1787,51 @@ "expect": [ { "dataset": { - "rows": 108935, + "rows": 107252, "columns": [ - "stat_var", - "financingProvider", + "time_period", "financingProvider_label", + "financingRecipient_label", + "value", + "unit_label", + "dac2aAidType_label", + "provenance_label", + "financingProvider", "financingProvider_kind", "financingRecipient", - "financingRecipient_label", "financingRecipient_kind", "dac2aAidType", - "dac2aAidType_label", - "time_period", - "value", "unit", - "unit_label", "currency", "price_basis", "base_year", "measurementMethod", "measurementMethod_label", "provenance", - "provenance_label" + "stat_var" ], "complete": true, "members": [ { "parts": [], - "spec_id": "spec_7f538f4f65ac124f47918468b4d2eea7", - "content_version": "cv_ed2cc83eb28d4e6883cde079f05844ed", - "sentence": "Gross disbursements to the 133 G77 countries from the 32 DAC countries for official development assistance, 1964 to 2024. Current US dollars · OECD DAC2a." + "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." } ], "missing": [], "long_builds": [ { - "operation_id": "op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef", + "operation_id": "op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f", "poll_waits": [ 1.5, 1.5, 1.5, 1.5, 1.5, - 1.786, - 2.268, - 2.869 + 1.784, + 2.289, + 2.934 ], "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 new file mode 100644 index 0000000..90b582d --- /dev/null +++ b/python/client-contract/src/dfo_client_contract/scenarios/fetch-spec-party-totals-kept.json @@ -0,0 +1,4460 @@ +{ + "format_version": 1, + "name": "fetch-spec-party-totals-kept", + "description": "Fetching the spec of fetch-spec-party-totals-left-out with party_totals=True posts no without_party_totals, so the build keeps the donor group totals and answers the plain version, with more rows.", + "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" + }, + "call": [ + { + "op": "fetch", + "spec": { + "spec_id": "spec_70ddf0ce6a9b3f147063f2adf37fab9e", + "definition": { + "schema_version": 1, + "spec_id": "spec_70ddf0ce6a9b3f147063f2adf37fab9e", + "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": "Gross" + } + } + ], + "entities": { + "destination": [ + "country/AFG", + "country/AGO", + "country/ARE", + "country/ARG", + "country/ATG", + "country/AZE", + "country/BDI", + "country/BEN", + "country/BFA", + "country/BGD", + "country/BHR", + "country/BHS", + "country/BLZ", + "country/BOL", + "country/BRA", + "country/BRB", + "country/BRN", + "country/BTN", + "country/BWA", + "country/CAF", + "country/CHL", + "country/CHN", + "country/CIV", + "country/CMR", + "country/COD", + "country/COG", + "country/COL", + "country/COM", + "country/CPV", + "country/CRI", + "country/CUB", + "country/DJI", + "country/DMA", + "country/DOM", + "country/DZA", + "country/ECU", + "country/EGY", + "country/ERI", + "country/ETH", + "country/FJI", + "country/FSM", + "country/GAB", + "country/GHA", + "country/GIN", + "country/GMB", + "country/GNB", + "country/GNQ", + "country/GRD", + "country/GTM", + "country/GUY", + "country/HND", + "country/HTI", + "country/IDN", + "country/IND", + "country/IRN", + "country/IRQ", + "country/JAM", + "country/JOR", + "country/KEN", + "country/KHM", + "country/KIR", + "country/KNA", + "country/KWT", + "country/LAO", + "country/LBN", + "country/LBR", + "country/LBY", + "country/LCA", + "country/LKA", + "country/LSO", + "country/MAR", + "country/MDG", + "country/MDV", + "country/MHL", + "country/MLI", + "country/MMR", + "country/MNG", + "country/MOZ", + "country/MRT", + "country/MUS", + "country/MWI", + "country/MYS", + "country/NAM", + "country/NER", + "country/NGA", + "country/NIC", + "country/NPL", + "country/NRU", + "country/OMN", + "country/PAK", + "country/PAN", + "country/PER", + "country/PHL", + "country/PNG", + "country/PRK", + "country/PRY", + "country/QAT", + "country/RWA", + "country/SAU", + "country/SDN", + "country/SEN", + "country/SGP", + "country/SLB", + "country/SLE", + "country/SLV", + "country/SOM", + "country/SSD", + "country/STP", + "country/SUR", + "country/SWZ", + "country/SYC", + "country/SYR", + "country/TCD", + "country/TGO", + "country/THA", + "country/TJK", + "country/TKM", + "country/TLS", + "country/TON", + "country/TTO", + "country/TUN", + "country/TZA", + "country/UGA", + "country/URY", + "country/VCT", + "country/VEN", + "country/VNM", + "country/VUT", + "country/WSM", + "country/YEM", + "country/ZAF", + "country/ZMB", + "country/ZWE" + ], + "origin": [ + "country/AUS", + "country/AUT", + "country/BEL", + "country/CAN", + "country/CHE", + "country/CZE", + "country/DEU", + "country/DNK", + "country/ESP", + "country/EST", + "country/FIN", + "country/FRA", + "country/GBR", + "country/GRC", + "country/HUN", + "country/IRL", + "country/ISL", + "country/ITA", + "country/JPN", + "country/KOR", + "country/LTU", + "country/LUX", + "country/LVA", + "country/NLD", + "country/NOR", + "country/NZL", + "country/POL", + "country/PRT", + "country/SVK", + "country/SVN", + "country/SWE", + "country/USA" + ] + }, + "requested_window": { + "kind": "range", + "start_year": 1967, + "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.", + "entity_groups": { + "destination": { + "label": "G77 countries", + "group_id": "groups/G77" + }, + "origin": { + "label": "DAC countries", + "group_id": "groups/OECD.DAC" + } + } + }, + "window": [ + 2022, + 2022 + ], + "entities": { + "origin": null, + "destination": [ + "country/KEN" + ] + }, + "party_totals": true + } + ], + "exchanges": [ + { + "request": { + "method": "POST", + "path": "/datasets", + "json": { + "schema_version": 1, + "input": { + "kind": "spec_id", + "spec_id": "spec_70ddf0ce6a9b3f147063f2adf37fab9e", + "definition": { + "schema_version": 1, + "spec_id": "spec_70ddf0ce6a9b3f147063f2adf37fab9e", + "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": "Gross" + } + } + ], + "entities": { + "destination": [ + "country/AFG", + "country/AGO", + "country/ARE", + "country/ARG", + "country/ATG", + "country/AZE", + "country/BDI", + "country/BEN", + "country/BFA", + "country/BGD", + "country/BHR", + "country/BHS", + "country/BLZ", + "country/BOL", + "country/BRA", + "country/BRB", + "country/BRN", + "country/BTN", + "country/BWA", + "country/CAF", + "country/CHL", + "country/CHN", + "country/CIV", + "country/CMR", + "country/COD", + "country/COG", + "country/COL", + "country/COM", + "country/CPV", + "country/CRI", + "country/CUB", + "country/DJI", + "country/DMA", + "country/DOM", + "country/DZA", + "country/ECU", + "country/EGY", + "country/ERI", + "country/ETH", + "country/FJI", + "country/FSM", + "country/GAB", + "country/GHA", + "country/GIN", + "country/GMB", + "country/GNB", + "country/GNQ", + "country/GRD", + "country/GTM", + "country/GUY", + "country/HND", + "country/HTI", + "country/IDN", + "country/IND", + "country/IRN", + "country/IRQ", + "country/JAM", + "country/JOR", + "country/KEN", + "country/KHM", + "country/KIR", + "country/KNA", + "country/KWT", + "country/LAO", + "country/LBN", + "country/LBR", + "country/LBY", + "country/LCA", + "country/LKA", + "country/LSO", + "country/MAR", + "country/MDG", + "country/MDV", + "country/MHL", + "country/MLI", + "country/MMR", + "country/MNG", + "country/MOZ", + "country/MRT", + "country/MUS", + "country/MWI", + "country/MYS", + "country/NAM", + "country/NER", + "country/NGA", + "country/NIC", + "country/NPL", + "country/NRU", + "country/OMN", + "country/PAK", + "country/PAN", + "country/PER", + "country/PHL", + "country/PNG", + "country/PRK", + "country/PRY", + "country/QAT", + "country/RWA", + "country/SAU", + "country/SDN", + "country/SEN", + "country/SGP", + "country/SLB", + "country/SLE", + "country/SLV", + "country/SOM", + "country/SSD", + "country/STP", + "country/SUR", + "country/SWZ", + "country/SYC", + "country/SYR", + "country/TCD", + "country/TGO", + "country/THA", + "country/TJK", + "country/TKM", + "country/TLS", + "country/TON", + "country/TTO", + "country/TUN", + "country/TZA", + "country/UGA", + "country/URY", + "country/VCT", + "country/VEN", + "country/VNM", + "country/VUT", + "country/WSM", + "country/YEM", + "country/ZAF", + "country/ZMB", + "country/ZWE" + ], + "origin": [ + "country/AUS", + "country/AUT", + "country/BEL", + "country/CAN", + "country/CHE", + "country/CZE", + "country/DEU", + "country/DNK", + "country/ESP", + "country/EST", + "country/FIN", + "country/FRA", + "country/GBR", + "country/GRC", + "country/HUN", + "country/IRL", + "country/ISL", + "country/ITA", + "country/JPN", + "country/KOR", + "country/LTU", + "country/LUX", + "country/LVA", + "country/NLD", + "country/NOR", + "country/NZL", + "country/POL", + "country/PRT", + "country/SVK", + "country/SVN", + "country/SWE", + "country/USA" + ] + }, + "requested_window": { + "kind": "range", + "start_year": 1967, + "end_year": 2024 + } + } + }, + "scope": { + "window": { + "kind": "range", + "start_year": 2022, + "end_year": 2022 + }, + "entities": { + "destination": [ + "country/KEN" + ] + } + } + }, + "options": { + "format": "parquet", + "bundle": false + } + } + }, + "response": { + "status": 200, + "headers": { + "content-type": "application/json", + "x-dfo-trace-id": "7459cea38c154e609d1f2142b94f4cbe" + }, + "json": { + "schema_version": 1, + "definition": { + "schema_version": 1, + "spec_id": "spec_73897fdfb0206fcf27c5898b353348fb", + "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": { + "destination": [ + "country/KEN" + ] + }, + "identity_version": "spec1", + "requested_window": { + "kind": "range", + "end_year": 2022, + "start_year": 2022 + } + } + }, + "content_version": "cv_2aa4cc2fd852cd9b84347c61d07d609a", + "prepared_at": "2026-10-12T18:33:25Z", + "coverage": { + "rows": 111, + "dimensions": [ + { + "label": "financingProvider", + "count": 111, + "axis": "origin", + "noun": { + "singular": "provider", + "plural": "providers" + } + }, + { + "label": "financingRecipient", + "count": 1, + "axis": "destination", + "noun": { + "singular": "recipient", + "plural": "recipients" + } + }, + { + "label": "years", + "count": 1 + } + ], + "window": { + "kind": "range", + "origin": "query", + "end_year": 2022, + "start_year": 2022 + } + }, + "citation": { + "text": "OECD DAC2A via ONE DFO, retrieved 2026-10-12", + "sources": [ + { + "ref": "provenance/OECDDAC2A", + "label": "OECD DAC2A", + "license": "OECD Terms and Conditions", + "license_type": "OECDTermsAndConditions", + "license_url": "https://www.oecd.org/en/about/terms-conditions.html", + "url": "https://data-explorer.oecd.org/vis?tm=dac2a&pg=0&snb=1&df[ds]=dsDisseminateFinalDMZ&df[id]=DSD_DAC2%40DF_DAC2A&df[ag]=OECD.DCD.FSD&df[vs]=1.6&dq=.DPGC.206.USD.Q&lom=LASTNPERIODS&lo=5&to[TIME_PERIOD]=false&isAvailabilityDisabled=false&page=0", + "source": { + "ref": "dc/s/OrganisationForEconomicCo-operationAndDevelopmentOecd", + "label": "Organisation for Economic Co-operation and Development (OECD)" + }, + "data_commons": { + "id": "dfo", + "label": "Development Finance Observatory" + }, + "documentation": { + "publisher": "Organisation for Economic Co-operation and Development (OECD)", + "description": "DAC2A is the OECD Development Assistance Committee's table of ODA disbursements by donor and recipient country or region. It covers bilateral donors and multilateral agencies reporting their own outflows, and includes the OECD's estimate of each donor's core multilateral contributions attributed to recipients.", + "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-12", + "years_covered": "1960-2025", + "granularity": "Annual, by provider and recipient", + "currencies": [ + "USD" + ], + "transformation_log": [ + { + "transformation": "Download the source data", + "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": "Standardise providers and recipients", + "description": "Provider and recipient codes are standardised to Data Commons IDs used across the platform, so data can be compared across datasets. The totals DAC2A reports for groups of providers, such as all DAC countries, and for groups of recipients, such as regions and income groups, are included as providers and recipients of their own. Where two provider codes name the same organisation and report the same figures, the figures are counted once. Where two recipient codes name the same organisation, such as IDA and IDA's Multilateral Debt Relief Initiative, their flows are added." + }, + { + "transformation": "Select figures", + "description": "Only figures in current US dollars are included, not constant US dollars. Only flows to recipients on Part I of the DAC List are included: the developing countries, and the multilateral organisations DAC2A reports as recipients, such as development banks and UN agencies. Flows to Part II recipients, the countries in transition, are excluded." + }, + { + "transformation": "Convert to whole units", + "description": "DAC2A reports amounts in millions, which are converted to whole units. ODA per person and ODA as a share of GNI are kept as reported." + }, + { + "transformation": "Select dimensions", + "description": "Each figure is reported by year, provider, recipient and type of aid, such as grants, repayments, interest received, or debt forgiven or rescheduled. DAC2A is a table of disbursements, so every figure, repayments and interest included, is recorded as a disbursement. Figures are marked as gross or net, except where DAC2A does not say which, and as grants or non-grants where the type of aid is wholly one or the other. Imputed multilateral ODA, the OECD's estimate of each provider's share of multilateral organisations' ODA, is marked as modelled. ODA as a share of GNI records the recipient's GNI as its denominator, and ODA per person records the recipient's population." + } + ], + "version_history": [ + { + "date": "2026-10-14", + "title": "First release", + "changes": [ + { + "kind": "added", + "note": "ODA disbursements by donor and recipient country or region, including the OECD's imputed multilateral contributions, and ODA per person and as a share of recipient GNI." + } + ] + } + ] + } + } + ] + }, + "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", + "end_year": 2022, + "start_year": 2022 + }, + "graph_revision": "dfo-dev-dc-datacommons-service-00242-zfr", + "normalisations": [], + "code_index_stamp": { + "exported_at": "2026-10-11T15:49:13Z", + "content_hash": "952a221e6d43254927fcb75abbf12ce7ba03285fbfeef7d9913e2ddcf49f904c", + "graph_endpoint": "https://dfo-dev-dc-datacommons-service-zms5lj4zhq-nn.a.run.app" + }, + "source_revisions": [ + { + "source": "provenance/OECDDAC2A", + "revision": "2026-10-12" + } + ], + "capability_version": "dset_5c3f5b0bf4cd9569", + "materialiser_build": "cd25922ac45834a7c7d0193d3b3ee3d7e9cc7b55", + "resolved_stat_vars": [ + { + "ref": "dcid:Amount_FinancialFlow_Gross_Disbursement_DAC2aAidType206_Nominal", + "roles": [ + "financingProvider", + "financingRecipient" + ], + "observation_count": 111 + } + ], + "family_member_count": 1, + "family_member_digest": "1a36e1a7292b1bfff95a5415de0be74cac7bb033217ed50e79faa8ce51a224c0", + "frame_grammar_version": "1.1.0", + "origin_catalogue_build_id": "20261012T163104Z-67f98b87", + "served_from": "head", + "confirmed_at": "2026-10-26T09:18:21.103020+00:00" + }, + "warnings": [], + "diagnostics": [ + { + "code": "processing_level_undeclared", + "severity": "info", + "message": "A source StatVar lacks a processing-level declaration; the citation credits the source and omits the processing qualifier." + } + ], + "artifacts": [ + { + "artifact_digest": "sha256:05d0cbf59e8dddd7162104bf8e2edc406fc402a0b8d0d971452d01b07b0ee426", + "rendering": { + "bundle": false, + "format": "parquet", + "layout": 4 + }, + "bytes": 10932, + "media_type": "application/vnd.apache.parquet", + "created_at": "2026-10-25T13:51:32.998697+00:00", + "tier": "working", + "url": "/api/datasets/spec_73897fdfb0206fcf27c5898b353348fb/cv_2aa4cc2fd852cd9b84347c61d07d609a/files/sha256:05d0cbf59e8dddd7162104bf8e2edc406fc402a0b8d0d971452d01b07b0ee426", + "enrichment_stamp": "08ed6c734fc69ea2204a21f4e1dd8b963f14dd1e03a2484c618049ac2e2d93d8" + }, + { + "artifact_digest": "sha256:8682dea270c469411916b6758279fdda0f4c989dac40b35509802141c8f7de22", + "rendering": { + "statistics": "series" + }, + "bytes": 10113, + "media_type": "application/vnd.apache.parquet", + "created_at": "2026-10-12T18:21:54.977252+00:00", + "tier": "working", + "url": "/api/datasets/spec_73897fdfb0206fcf27c5898b353348fb/cv_2aa4cc2fd852cd9b84347c61d07d609a/files/sha256:8682dea270c469411916b6758279fdda0f4c989dac40b35509802141c8f7de22" + } + ], + "series_count": 111, + "output_options": { + "capability_version": "dset_76f5fa7244511c58", + "columns": [ + { + "name": "stat_var", + "kind": "grain", + "droppable": false, + "distinct": 1 + }, + { + "name": "financingProvider", + "kind": "role", + "droppable": false, + "distinct": 111 + }, + { + "name": "financingRecipient", + "kind": "role", + "droppable": false, + "distinct": 1 + }, + { + "name": "time_period", + "kind": "grain", + "droppable": false, + "distinct": 1 + }, + { + "name": "value", + "kind": "value", + "droppable": true + }, + { + "name": "unit", + "kind": "unit", + "droppable": false, + "distinct": 1 + }, + { + "name": "measurementMethod", + "kind": "facet", + "droppable": true, + "distinct": 1 + }, + { + "name": "provenance", + "kind": "facet", + "droppable": false, + "distinct": 1 + }, + { + "name": "status", + "kind": "status", + "droppable": true + } + ], + "formats": [ + { + "name": "csv", + "state": "available" + }, + { + "name": "xlsx", + "state": "available" + }, + { + "name": "parquet", + "state": "available" + } + ], + "bundle": { + "state": "available" + }, + "enrichments": [ + { + "column": "financingProvider", + "field": "iso3", + "token": "financingProvider_iso3", + "state": "partial", + "reason": "enrichment_unavailable", + "coverage": { + "entities": 111, + "covered": 39 + }, + "missing": [ + { + "ref": "AdaptationFund", + "label": "Adaptation Fund" + }, + { + "ref": "AfricanDevelopmentBank", + "label": "African Development Bank" + }, + { + "ref": "AfricanDevelopmentBankGroup", + "label": "African Development Bank Group" + }, + { + "ref": "AfricanDevelopmentFund", + "label": "African Development Fund" + }, + { + "ref": "BezosEarthFund", + "label": "Bezos Earth Fund" + }, + { + "ref": "BloombergPhilanthropies", + "label": "Bloomberg Philanthropies" + }, + { + "ref": "CentralEmergencyResponseFund", + "label": "Central Emergency Response Fund" + }, + { + "ref": "ChildrensInvestmentFundFoundation", + "label": "Children's Investment Fund Foundation" + }, + { + "ref": "ClimateInvestmentFunds", + "label": "Climate Investment Funds" + }, + { + "ref": "ConradNHiltonFoundation", + "label": "Conrad N. Hilton Foundation" + } + ], + "truncated": true + }, + { + "column": "financingProvider", + "field": "iso2", + "token": "financingProvider_iso2", + "state": "partial", + "reason": "enrichment_unavailable", + "coverage": { + "entities": 111, + "covered": 39 + }, + "missing": [ + { + "ref": "AdaptationFund", + "label": "Adaptation Fund" + }, + { + "ref": "AfricanDevelopmentBank", + "label": "African Development Bank" + }, + { + "ref": "AfricanDevelopmentBankGroup", + "label": "African Development Bank Group" + }, + { + "ref": "AfricanDevelopmentFund", + "label": "African Development Fund" + }, + { + "ref": "BezosEarthFund", + "label": "Bezos Earth Fund" + }, + { + "ref": "BloombergPhilanthropies", + "label": "Bloomberg Philanthropies" + }, + { + "ref": "CentralEmergencyResponseFund", + "label": "Central Emergency Response Fund" + }, + { + "ref": "ChildrensInvestmentFundFoundation", + "label": "Children's Investment Fund Foundation" + }, + { + "ref": "ClimateInvestmentFunds", + "label": "Climate Investment Funds" + }, + { + "ref": "ConradNHiltonFoundation", + "label": "Conrad N. Hilton Foundation" + } + ], + "truncated": true + }, + { + "column": "financingProvider", + "field": "label", + "token": "financingProvider_label", + "state": "available", + "coverage": { + "entities": 111, + "covered": 111 + }, + "missing": [], + "truncated": false + }, + { + "column": "financingProvider", + "field": "type", + "token": "financingProvider_type", + "state": "available", + "coverage": { + "entities": 111, + "covered": 111 + }, + "missing": [], + "truncated": false + }, + { + "column": "financingProvider", + "field": "party_kind", + "token": "financingProvider_party_kind", + "state": "available", + "coverage": { + "entities": 111, + "covered": 111 + }, + "missing": [], + "truncated": false + }, + { + "column": "financingProvider", + "field": "party_class", + "token": "financingProvider_party_class", + "state": "available", + "coverage": { + "entities": 111, + "covered": 111 + }, + "missing": [], + "truncated": false + }, + { + "column": "financingProvider", + "field": "party_whole", + "token": "financingProvider_party_whole", + "state": "available", + "coverage": { + "entities": 111, + "covered": 111 + }, + "missing": [], + "truncated": false + }, + { + "column": "financingRecipient", + "field": "iso3", + "token": "financingRecipient_iso3", + "state": "available", + "coverage": { + "entities": 1, + "covered": 1 + }, + "missing": [], + "truncated": false + }, + { + "column": "financingRecipient", + "field": "iso2", + "token": "financingRecipient_iso2", + "state": "available", + "coverage": { + "entities": 1, + "covered": 1 + }, + "missing": [], + "truncated": false + }, + { + "column": "financingRecipient", + "field": "label", + "token": "financingRecipient_label", + "state": "available", + "coverage": { + "entities": 1, + "covered": 1 + }, + "missing": [], + "truncated": false + }, + { + "column": "financingRecipient", + "field": "type", + "token": "financingRecipient_type", + "state": "available", + "coverage": { + "entities": 1, + "covered": 1 + }, + "missing": [], + "truncated": false + }, + { + "column": "financingRecipient", + "field": "party_kind", + "token": "financingRecipient_party_kind", + "state": "available", + "coverage": { + "entities": 1, + "covered": 1 + }, + "missing": [], + "truncated": false + }, + { + "column": "financingRecipient", + "field": "party_class", + "token": "financingRecipient_party_class", + "state": "available", + "coverage": { + "entities": 1, + "covered": 1 + }, + "missing": [], + "truncated": false + }, + { + "column": "financingRecipient", + "field": "party_whole", + "token": "financingRecipient_party_whole", + "state": "available", + "coverage": { + "entities": 1, + "covered": 1 + }, + "missing": [], + "truncated": false + } + ], + "long_layout_defaults": [ + "financingProvider_label", + "financingProvider_kind", + "financingRecipient_label", + "financingRecipient_kind" + ], + "long_layout_totals": [], + "pivots": [], + "groupby": { + "state": "available", + "axes": [ + { + "name": "crsCooperationModality" + }, + { + "name": "crsPurpose" + }, + { + "name": "crsTypeOfFinance" + }, + { + "name": "crsTypeOfFlow" + } + ] + } + }, + "series_coverage_stamp": "e6e717ab8c77e84d010915893ede5809e9ecec67929a07cfafbcc2210edfa1eb", + "retention": { + "pinned": true + } + } + } + }, + { + "request": { + "method": "POST", + "path": "/search/resolve", + "json": { + "schema_version": 1, + "input": { + "kind": "dataset_resubmit", + "entries": [ + { + "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": { + "destination": [ + "country/KEN" + ] + }, + "identity_version": "spec1", + "requested_window": { + "kind": "range", + "end_year": 2022, + "start_year": 2022 + } + } + } + ] + } + } + }, + "response": { + "status": 200, + "headers": { + "content-type": "application/json", + "x-dfo-trace-id": "ccdbf2ec39f8429ab9c3b8b0f3bb1a92" + }, + "json": { + "schema_version": 1, + "query_echo": { + "entry_path": "dataset_resubmit", + "extract_skipped": true + }, + "diagnostics": { + "engine_build": "d80df9f5fd598b7345255470932d202ee5d49942", + "trace_id": "ccdbf2ec39f8429ab9c3b8b0f3bb1a92", + "warnings": [], + "timing_ms": { + "total": 2, + "by_step": { + "coverage": 0 + } + }, + "timed_out": false + }, + "kind": "resolution", + "parts": [ + { + "variable_text": "dataset", + "warnings": [ + { + "code": "role_scope_defaulted", + "severity": "warn", + "message": "No provider was named, so the answer covers every provider with data." + }, + { + "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", + "params": { + "total": "DACOfficialDonors", + "total_label": "official donors (DAC)", + "whole_of": "official" + } + } + ], + "timing_ms": { + "total": 0, + "by_step": { + "response_cache_part_memo": 0 + } + }, + "entity_refs": [], + "operations": [], + "departures": [], + "assumptions": [ + { + "kind": "open_role", + "binding_ref": "origin:", + "text": "every provider", + "refs": [] + } + ], + "status": "definite", + "spec": { + "spec_id": "spec_73897fdfb0206fcf27c5898b353348fb", + "definition": { + "schema_version": 1, + "spec_id": "spec_73897fdfb0206fcf27c5898b353348fb", + "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": "Gross" + } + } + ], + "entities": { + "destination": [ + "country/KEN" + ] + }, + "requested_window": { + "kind": "range", + "start_year": 2022, + "end_year": 2022 + } + } + }, + "resolved": { + "shape": { + "shape_id": "financialflow_amount_measuredvalue_nominal_family_f096b1ba", + "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" + }, + "measurement_denominator_unresolved": false, + "slot_keys": [ + { + "axis": "how", + "property": { + "ref": "dac2aAidType", + "label": "DAC 2a aid type" + }, + "label": "aid type" + }, + { + "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": "dacTypeOfFinance", + "label": "DAC type of finance" + }, + "label": "DAC type of finance" + }, + { + "axis": "where", + "label": "place" + }, + { + "axis": "when", + "label": "time window" + }, + { + "axis": "source", + "label": "data source" + } + ], + "member_count": 1, + "member_digest": "1a36e1a7292b1bfff95a5415de0be74cac7bb033217ed50e79faa8ce51a224c0", + "refine_supported": true, + "data_commons": [ + { + "id": "dfo", + "label": "Development Finance Observatory" + } + ] + }, + "slots": [ + { + "key": { + "axis": "how", + "property": { + "ref": "dac2aAidType", + "label": "DAC 2a aid type" + }, + "label": "aid type" + }, + "binding": { + "kind": "value", + "value": { + "ref": { + "ref": "DAC2aAidType206", + "label": "official development assistance" + }, + "value_kind": "enum_value" + } + }, + "summable": false + }, + { + "key": { + "axis": "how", + "property": { + "ref": "financialFlowType", + "label": "financial flow type" + }, + "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", + "label": "netting basis" + }, + "label": "netting basis" + }, + "binding": { + "kind": "value", + "value": { + "ref": { + "ref": "Gross", + "label": "gross" + }, + "value_kind": "enum_value" + } + }, + "summable": false + }, + { + "key": { + "axis": "how", + "property": { + "ref": "dacTypeOfFinance", + "label": "DAC type of finance" + }, + "label": "DAC type of finance" + }, + "binding": { + "kind": "unbound" + }, + "summable": false + }, + { + "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": "value", + "value": { + "value_kind": "time_window", + "time_window": { + "start_year": 2022, + "end_year": 2022 + } + } + }, + "summable": false + }, + { + "key": { + "axis": "source", + "label": "data source" + }, + "binding": { + "kind": "unbound" + }, + "summable": false + } + ], + "inapplicable_slots": [ + "dacTypeOfFinance" + ], + "unresolved_slots": [], + "stat_vars": { + "member_count": 1, + "member_count_exact": true, + "served_count": 1, + "data_date_range": { + "start": "2022", + "end": "2022" + } + }, + "entities": [ + { + "ref": "country/KEN", + "label": "Kenya", + "entity_type": "Country", + "role": "destination" + } + ], + "coverage": { + "kind": "exact", + "has_data": true, + "observation_count": 111, + "evidence": "facet_metadata", + "dimensions": [ + { + "label": "sources", + "count": 1 + }, + { + "label": "observations", + "count": 1 + }, + { + "label": "variables", + "count": 1 + } + ], + "window": { + "start_year": 2022, + "end_year": 2022 + } + }, + "headline": { + "year": 2022, + "year_named": true, + "named_window": { + "start_year": 2022, + "end_year": 2022 + }, + "observations": 111, + "series": 111, + "role_counts": { + "financingProvider": 111, + "financingRecipient": 1 + }, + "recent_years": [ + { + "year": 2022, + "observations": 111, + "series": 111, + "role_counts": { + "financingProvider": 111, + "financingRecipient": 1 + } + }, + { + "year": 2021, + "observations": 103, + "series": 103, + "role_counts": { + "financingProvider": 103, + "financingRecipient": 1 + } + }, + { + "year": 2020, + "observations": 97, + "series": 97, + "role_counts": { + "financingProvider": 97, + "financingRecipient": 1 + } + } + ] + }, + "download": { + "rows": 111, + "rows_exact": true, + "series": 111, + "window": { + "start_year": 2022, + "end_year": 2022 + }, + "licence": { + "label": "OECD Terms and Conditions" + } + }, + "coverage_stamp": "e6e717ab8c77e84d010915893ede5809e9ecec67929a07cfafbcc2210edfa1eb", + "facets": { + "provenance": { + "basis": "fallback", + "ref": "provenance/OECDDAC2A", + "label": "OECD DAC2A", + "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/OECDDAC2A", + "account": "provider" + }, + "unit": { + "basis": "fallback", + "ref": "CurrencyUSD", + "label": "US Dollar", + "currency": "USD" + } + }, + "slot_options": [ + { + "key": { + "axis": "how", + "property": { + "ref": "dac2aAidType", + "label": "DAC 2a aid type" + }, + "label": "aid type" + }, + "options": [ + { + "value": { + "ref": { + "ref": "DAC2aAidType218", + "label": "ODA loans and other long-term capital" + }, + "value_kind": "enum_value" + }, + "relation": "child", + "parent": "DAC2aAidType206", + "member_count": 2, + "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": 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_exact": true + }, + { + "value": { + "ref": { + "ref": "DAC2aAidType213", + "label": "developmental food aid" + }, + "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_exact": true + } + ], + "truncated": false, + "source": "observed" + } + ], + "entity_options": [ + { + "role": "origin", + "options": [], + "truncated": true, + "source": "observed" + } + ], + "facet_options": [ + { + "axis": "provenance", + "options": [ + { + "value": { + "ref": { + "ref": "provenance/OECDDAC2A", + "label": "OECD DAC2A" + }, + "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": "Gross disbursements to Kenya from 96 providers for official development assistance in 2022. Current US dollars · OECD DAC2a.", + "sentence_plan": [ + { + "kind": "slot", + "text": "Gross disbursements", + "axis": "what", + "segment": "heading", + "entity_refs": [], + "states": [ + "how:financialFlowType", + "how:nettingBasis", + "axis:populationType", + "axis:measuredProperty" + ] + }, + { + "kind": "text", + "text": " to ", + "segment": "heading", + "entity_refs": [], + "states": [] + }, + { + "kind": "slot", + "text": "Kenya", + "axis": "where", + "segment": "heading", + "role": "destination", + "binding_ref": "where:", + "entity_refs": [ + "country/KEN" + ], + "states": [ + "where:" + ] + }, + { + "kind": "text", + "text": " from ", + "segment": "heading", + "entity_refs": [], + "states": [] + }, + { + "kind": "slot", + "text": "96 providers", + "segment": "heading", + "role": "origin", + "binding_ref": "origin:", + "entity_refs": [], + "states": [ + "origin:" + ] + }, + { + "kind": "text", + "text": " for ", + "segment": "heading", + "entity_refs": [], + "states": [] + }, + { + "kind": "slot", + "text": "official development assistance", + "axis": "how", + "segment": "heading", + "property_dcid": "dac2aAidType", + "binding_ref": "how:dac2aAidType", + "entity_refs": [], + "states": [ + "how:dac2aAidType" + ] + }, + { + "kind": "slot", + "text": "", + "axis": "how", + "segment": "heading", + "property_dcid": "dacTypeOfFinance", + "binding_ref": "how:dacTypeOfFinance", + "entity_refs": [], + "states": [] + }, + { + "kind": "slot", + "text": "", + "axis": "how", + "segment": "heading", + "property_dcid": "financialFlowType", + "binding_ref": "how:financialFlowType", + "entity_refs": [], + "states": [] + }, + { + "kind": "slot", + "text": "", + "axis": "how", + "segment": "heading", + "property_dcid": "nettingBasis", + "binding_ref": "how:nettingBasis", + "entity_refs": [], + "states": [] + }, + { + "kind": "text", + "text": " ", + "segment": "heading", + "entity_refs": [], + "states": [] + }, + { + "kind": "slot", + "text": "in 2022", + "axis": "when", + "segment": "heading", + "binding_ref": "when:", + "entity_refs": [], + "states": [ + "when:" + ] + }, + { + "kind": "text", + "text": ".", + "segment": "heading", + "entity_refs": [], + "states": [] + }, + { + "kind": "text", + "text": " ", + "segment": "byline", + "entity_refs": [], + "states": [] + }, + { + "kind": "slot", + "text": "Current US dollars", + "axis": "unit", + "segment": "byline", + "binding_ref": "unit:", + "entity_refs": [], + "states": [ + "unit:", + "axis:measurementQualifier" + ] + }, + { + "kind": "text", + "text": " · ", + "segment": "byline", + "entity_refs": [], + "states": [] + }, + { + "kind": "slot", + "text": "OECD DAC2a", + "axis": "source", + "segment": "byline", + "entity_refs": [], + "states": [ + "source:" + ] + }, + { + "kind": "text", + "text": ".", + "segment": "byline", + "entity_refs": [], + "states": [] + } + ], + "trace": { + "resolved_entities": [ + { + "ref": "country/KEN", + "label": "Kenya" + } + ], + "resolved_sources": [ + { + "ref": "provenance/OECDDAC2A", + "label": "OECD DAC2a", + "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/OECDDAC2A" + } + ], + "slot_filters": [ + { + "key": { + "axis": "how", + "property": { + "ref": "dac2aAidType", + "label": "DAC 2a aid type" + }, + "label": "aid type" + }, + "binding_kind": "value", + "refs": [ + { + "ref": "DAC2aAidType206", + "label": "official development assistance" + } + ], + "provenance": "binder" + }, + { + "key": { + "axis": "how", + "property": { + "ref": "financialFlowType", + "label": "financial flow type" + }, + "label": "financial flow type" + }, + "binding_kind": "value", + "refs": [ + { + "ref": "Disbursement", + "label": "disbursement" + } + ], + "provenance": "binder" + }, + { + "key": { + "axis": "how", + "property": { + "ref": "nettingBasis", + "label": "netting basis" + }, + "label": "netting basis" + }, + "binding_kind": "value", + "refs": [ + { + "ref": "Gross", + "label": "gross" + } + ], + "provenance": "binder" + }, + { + "key": { + "axis": "how", + "property": { + "ref": "dacTypeOfFinance", + "label": "DAC type of finance" + }, + "label": "DAC type of finance" + }, + "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": "value", + "refs": [], + "provenance": "binder" + }, + { + "key": { + "axis": "source", + "label": "data source" + }, + "binding_kind": "unbound", + "refs": [], + "provenance": "binder" + } + ], + "query_qualifiers": [], + "requested_window": { + "start_year": 2022, + "end_year": 2022 + }, + "capability_version": "cap_765c9d2a0c7529b9" + }, + "confidence": "high", + "available_at_place": true, + "alternative_measures": [ + { + "definition": { + "schema_version": 1, + "spec_id": "spec_e14699f9dcd167f0211081a726ae1031", + "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" + ] + }, + "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", + "measure_label_axes": [ + "populationType", + "measuredProperty", + "measurementQualifier", + "financialFlowType", + "nettingBasis" + ], + "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": "Gross", + "label": "gross" + } + } + ], + "role_axis_facts": [ + { + "role": "origin", + "member_count": 96, + "members_available": true + } + ], + "unit_conversion": { + "currencies": [ + { + "code": "AED", + "noun": "UAE dirhams", + "constant_years": { + "start_year": 2022, + "end_year": 2022 + }, + "base_year_min": 2023, + "base_year_max": 2023, + "current_years": null + }, + { + "code": "AFN", + "noun": "Afghan afghanis", + "current_years": { + "start_year": 2022, + "end_year": 2022 + }, + "constant_years": { + "start_year": 2022, + "end_year": 2022 + }, + "base_year_min": 2002, + "base_year_max": 2025 + }, + { + "code": "ALL", + "noun": "Albanian leks", + "current_years": { + "start_year": 2022, + "end_year": 2022 + }, + "constant_years": { + "start_year": 2022, + "end_year": 2022 + }, + "base_year_min": 1980, + "base_year_max": 2025 + }, + { + "code": "AMD", + "noun": "Armenian drams", + "current_years": { + "start_year": 2022, + "end_year": 2022 + }, + "constant_years": { + "start_year": 2022, + "end_year": 2022 + }, + "base_year_min": 1992, + "base_year_max": 2025 + }, + { + "code": "AOA", + "noun": "Angolan kwanzas", + "current_years": { + "start_year": 2022, + "end_year": 2022 + }, + "constant_years": { + "start_year": 2022, + "end_year": 2022 + }, + "base_year_min": 1991, + "base_year_max": 2025 + }, + { + "code": "ARS", + "noun": "Argentine pesos", + "current_years": { + "start_year": 2022, + "end_year": 2022 + }, + "constant_years": { + "start_year": 2022, + "end_year": 2022 + }, + "base_year_min": 1980, + "base_year_max": 2025 + }, + { + "code": "AUD", + "noun": "Australian dollars", + "current_years": { + "start_year": 2022, + "end_year": 2022 + }, + "constant_years": { + "start_year": 2022, + "end_year": 2022 + }, + "base_year_min": 1960, + "base_year_max": 2025 + }, + { + "code": "AWG", + "noun": "Aruban florins", + "current_years": { + "start_year": 2022, + "end_year": 2022 + }, + "constant_years": { + "start_year": 2022, + "end_year": 2022 + }, + "base_year_min": 1995, + "base_year_max": 2025 + }, + { + "code": "AZN", + "noun": "Azerbaijani manats", + "constant_years": { + "start_year": 2022, + "end_year": 2022 + }, + "base_year_min": 2023, + "base_year_max": 2023, + "current_years": null + }, + { + "code": "BAM", + "noun": "Bosnia-Herzegovina convertible marks", + "current_years": { + "start_year": 2022, + "end_year": 2022 + }, + "constant_years": { + "start_year": 2022, + "end_year": 2022 + }, + "base_year_min": 1996, + "base_year_max": 2025 + }, + { + "code": "BBD", + "noun": "Barbadian dollars", + "current_years": { + "start_year": 2022, + "end_year": 2022 + }, + "constant_years": { + "start_year": 2022, + "end_year": 2022 + }, + "base_year_min": 1980, + "base_year_max": 2025 + }, + { + "code": "BDT", + "noun": "Bangladeshi taka", + "current_years": { + "start_year": 2022, + "end_year": 2022 + }, + "constant_years": { + "start_year": 2022, + "end_year": 2022 + }, + "base_year_min": 1980, + "base_year_max": 2025 + }, + { + "code": "BHD", + "noun": "Bahraini dinars", + "current_years": { + "start_year": 2022, + "end_year": 2022 + }, + "constant_years": { + "start_year": 2022, + "end_year": 2022 + }, + "base_year_min": 1980, + "base_year_max": 2025 + }, + { + "code": "BIF", + "noun": "Burundian francs", + "current_years": { + "start_year": 2022, + "end_year": 2022 + }, + "constant_years": { + "start_year": 2022, + "end_year": 2022 + }, + "base_year_min": 1980, + "base_year_max": 2025 + }, + { + "code": "BND", + "noun": "Brunei dollars", + "current_years": { + "start_year": 2022, + "end_year": 2022 + }, + "constant_years": { + "start_year": 2022, + "end_year": 2022 + }, + "base_year_min": 1985, + "base_year_max": 2025 + }, + { + "code": "BOB", + "noun": "Bolivian bolivianos", + "current_years": { + "start_year": 2022, + "end_year": 2022 + }, + "constant_years": { + "start_year": 2022, + "end_year": 2022 + }, + "base_year_min": 1980, + "base_year_max": 2025 + }, + { + "code": "BRL", + "noun": "Brazilian reais", + "current_years": { + "start_year": 2022, + "end_year": 2022 + }, + "constant_years": { + "start_year": 2022, + "end_year": 2022 + }, + "base_year_min": 1986, + "base_year_max": 2025 + }, + { + "code": "BSD", + "noun": "Bahamian dollars", + "current_years": { + "start_year": 2022, + "end_year": 2022 + }, + "constant_years": { + "start_year": 2022, + "end_year": 2022 + }, + "base_year_min": 1980, + "base_year_max": 2025 + }, + { + "code": "BTN", + "noun": "Bhutanese ngultrums", + "current_years": { + "start_year": 2022, + "end_year": 2022 + }, + "constant_years": { + "start_year": 2022, + "end_year": 2022 + }, + "base_year_min": 1980, + "base_year_max": 2025 + }, + { + "code": "BWP", + "noun": "Botswana pula", + "current_years": { + "start_year": 2022, + "end_year": 2022 + }, + "constant_years": { + "start_year": 2022, + "end_year": 2022 + }, + "base_year_min": 1980, + "base_year_max": 2025 + }, + { + "code": "BYN", + "noun": "Belarusian rubles", + "current_years": { + "start_year": 2022, + "end_year": 2022 + }, + "constant_years": { + "start_year": 2022, + "end_year": 2022 + }, + "base_year_min": 1992, + "base_year_max": 2025 + }, + { + "code": "BZD", + "noun": "Belize dollars", + "current_years": { + "start_year": 2022, + "end_year": 2022 + }, + "constant_years": { + "start_year": 2022, + "end_year": 2022 + }, + "base_year_min": 1980, + "base_year_max": 2025 + }, + { + "code": "CAD", + "noun": "Canadian dollars", + "current_years": { + "start_year": 2022, + "end_year": 2022 + }, + "constant_years": { + "start_year": 2022, + "end_year": 2022 + }, + "base_year_min": 1960, + "base_year_max": 2025 + }, + { + "code": "CDF", + "noun": "Congolese francs", + "current_years": { + "start_year": 2022, + "end_year": 2022 + }, + "constant_years": { + "start_year": 2022, + "end_year": 2022 + }, + "base_year_min": 1991, + "base_year_max": 2025 + }, + { + "code": "CHF", + "noun": "Swiss francs", + "current_years": { + "start_year": 2022, + "end_year": 2022 + }, + "constant_years": { + "start_year": 2022, + "end_year": 2022 + }, + "base_year_min": 1960, + "base_year_max": 2025 + }, + { + "code": "CLP", + "noun": "Chilean pesos", + "current_years": { + "start_year": 2022, + "end_year": 2022 + }, + "constant_years": { + "start_year": 2022, + "end_year": 2022 + }, + "base_year_min": 1980, + "base_year_max": 2025 + }, + { + "code": "CNY", + "noun": "Chinese yuan", + "current_years": { + "start_year": 2022, + "end_year": 2022 + }, + "constant_years": { + "start_year": 2022, + "end_year": 2022 + }, + "base_year_min": 1980, + "base_year_max": 2025 + }, + { + "code": "COP", + "noun": "Colombian pesos", + "current_years": { + "start_year": 2022, + "end_year": 2022 + }, + "constant_years": { + "start_year": 2022, + "end_year": 2022 + }, + "base_year_min": 1980, + "base_year_max": 2025 + }, + { + "code": "CRC", + "noun": "Costa Rican colones", + "current_years": { + "start_year": 2022, + "end_year": 2022 + }, + "constant_years": { + "start_year": 2022, + "end_year": 2022 + }, + "base_year_min": 1980, + "base_year_max": 2025 + }, + { + "code": "CVE", + "noun": "Cape Verdean escudos", + "current_years": { + "start_year": 2022, + "end_year": 2022 + }, + "constant_years": { + "start_year": 2022, + "end_year": 2022 + }, + "base_year_min": 1980, + "base_year_max": 2025 + }, + { + "code": "CZK", + "noun": "Czech korunas", + "current_years": { + "start_year": 2022, + "end_year": 2022 + }, + "constant_years": { + "start_year": 2022, + "end_year": 2022 + }, + "base_year_min": 1998, + "base_year_max": 2025 + }, + { + "code": "DJF", + "noun": "Djiboutian francs", + "current_years": { + "start_year": 2022, + "end_year": 2022 + }, + "constant_years": { + "start_year": 2022, + "end_year": 2022 + }, + "base_year_min": 1990, + "base_year_max": 2025 + }, + { + "code": "DKK", + "noun": "Danish kroner", + "current_years": { + "start_year": 2022, + "end_year": 2022 + }, + "constant_years": { + "start_year": 2022, + "end_year": 2022 + }, + "base_year_min": 1960, + "base_year_max": 2025 + }, + { + "code": "DOP", + "noun": "Dominican pesos", + "current_years": { + "start_year": 2022, + "end_year": 2022 + }, + "constant_years": { + "start_year": 2022, + "end_year": 2022 + }, + "base_year_min": 1980, + "base_year_max": 2025 + }, + { + "code": "DZD", + "noun": "Algerian dinars", + "current_years": { + "start_year": 2022, + "end_year": 2022 + }, + "constant_years": { + "start_year": 2022, + "end_year": 2022 + }, + "base_year_min": 1980, + "base_year_max": 2025 + }, + { + "code": "EGP", + "noun": "Egyptian pounds", + "current_years": { + "start_year": 2022, + "end_year": 2022 + }, + "constant_years": { + "start_year": 2022, + "end_year": 2022 + }, + "base_year_min": 1980, + "base_year_max": 2025 + }, + { + "code": "ERN", + "noun": "Eritrean nakfas", + "constant_years": { + "start_year": 2022, + "end_year": 2022 + }, + "base_year_min": 1992, + "base_year_max": 2019, + "current_years": null + }, + { + "code": "ETB", + "noun": "Ethiopian birr", + "current_years": { + "start_year": 2022, + "end_year": 2022 + }, + "constant_years": { + "start_year": 2022, + "end_year": 2022 + }, + "base_year_min": 1980, + "base_year_max": 2025 + }, + { + "code": "EUR", + "noun": "euros", + "current_years": { + "start_year": 2022, + "end_year": 2022 + }, + "constant_years": { + "start_year": 2022, + "end_year": 2022 + }, + "base_year_min": 1973, + "base_year_max": 2025 + }, + { + "code": "FJD", + "noun": "Fijian dollars", + "current_years": { + "start_year": 2022, + "end_year": 2022 + }, + "constant_years": { + "start_year": 2022, + "end_year": 2022 + }, + "base_year_min": 1980, + "base_year_max": 2025 + }, + { + "code": "GBP", + "noun": "British pounds", + "current_years": { + "start_year": 2022, + "end_year": 2022 + }, + "constant_years": { + "start_year": 2022, + "end_year": 2022 + }, + "base_year_min": 1960, + "base_year_max": 2025 + }, + { + "code": "GEL", + "noun": "Georgian lari", + "current_years": { + "start_year": 2022, + "end_year": 2022 + }, + "constant_years": { + "start_year": 2022, + "end_year": 2022 + }, + "base_year_min": 1994, + "base_year_max": 2025 + }, + { + "code": "GHS", + "noun": "Ghanaian cedis", + "current_years": { + "start_year": 2022, + "end_year": 2022 + }, + "constant_years": { + "start_year": 2022, + "end_year": 2022 + }, + "base_year_min": 1980, + "base_year_max": 2025 + }, + { + "code": "GMD", + "noun": "Gambian dalasis", + "current_years": { + "start_year": 2022, + "end_year": 2022 + }, + "constant_years": { + "start_year": 2022, + "end_year": 2022 + }, + "base_year_min": 1980, + "base_year_max": 2025 + }, + { + "code": "GNF", + "noun": "Guinean francs", + "current_years": { + "start_year": 2022, + "end_year": 2022 + }, + "constant_years": { + "start_year": 2022, + "end_year": 2022 + }, + "base_year_min": 1980, + "base_year_max": 2025 + }, + { + "code": "GTQ", + "noun": "Guatemalan quetzales", + "current_years": { + "start_year": 2022, + "end_year": 2022 + }, + "constant_years": { + "start_year": 2022, + "end_year": 2022 + }, + "base_year_min": 1980, + "base_year_max": 2025 + }, + { + "code": "GYD", + "noun": "Guyanese dollars", + "current_years": { + "start_year": 2022, + "end_year": 2022 + }, + "constant_years": { + "start_year": 2022, + "end_year": 2022 + }, + "base_year_min": 1980, + "base_year_max": 2025 + }, + { + "code": "HKD", + "noun": "Hong Kong dollars", + "current_years": { + "start_year": 2022, + "end_year": 2022 + }, + "constant_years": { + "start_year": 2022, + "end_year": 2022 + }, + "base_year_min": 1980, + "base_year_max": 2025 + }, + { + "code": "HNL", + "noun": "Honduran lempiras", + "current_years": { + "start_year": 2022, + "end_year": 2022 + }, + "constant_years": { + "start_year": 2022, + "end_year": 2022 + }, + "base_year_min": 1980, + "base_year_max": 2025 + }, + { + "code": "HTG", + "noun": "Haitian gourdes", + "current_years": { + "start_year": 2022, + "end_year": 2022 + }, + "constant_years": { + "start_year": 2022, + "end_year": 2022 + }, + "base_year_min": 1980, + "base_year_max": 2025 + }, + { + "code": "HUF", + "noun": "Hungarian forints", + "current_years": { + "start_year": 2022, + "end_year": 2022 + }, + "constant_years": { + "start_year": 2022, + "end_year": 2022 + }, + "base_year_min": 2003, + "base_year_max": 2025 + }, + { + "code": "IDR", + "noun": "Indonesian rupiahs", + "current_years": { + "start_year": 2022, + "end_year": 2022 + }, + "constant_years": { + "start_year": 2022, + "end_year": 2022 + }, + "base_year_min": 1980, + "base_year_max": 2025 + }, + { + "code": "ILS", + "noun": "Israeli new shekels", + "current_years": { + "start_year": 2022, + "end_year": 2022 + }, + "constant_years": { + "start_year": 2022, + "end_year": 2022 + }, + "base_year_min": 1997, + "base_year_max": 2025 + }, + { + "code": "INR", + "noun": "Indian rupees", + "current_years": { + "start_year": 2022, + "end_year": 2022 + }, + "constant_years": { + "start_year": 2022, + "end_year": 2022 + }, + "base_year_min": 1980, + "base_year_max": 2025 + }, + { + "code": "IQD", + "noun": "Iraqi dinars", + "current_years": { + "start_year": 2022, + "end_year": 2022 + }, + "constant_years": { + "start_year": 2022, + "end_year": 2022 + }, + "base_year_min": 2000, + "base_year_max": 2025 + }, + { + "code": "IRR", + "noun": "Iranian rials", + "current_years": { + "start_year": 2022, + "end_year": 2022 + }, + "constant_years": { + "start_year": 2022, + "end_year": 2022 + }, + "base_year_min": 1980, + "base_year_max": 2025 + }, + { + "code": "ISK", + "noun": "Icelandic krónur", + "current_years": { + "start_year": 2022, + "end_year": 2022 + }, + "constant_years": { + "start_year": 2022, + "end_year": 2022 + }, + "base_year_min": 1997, + "base_year_max": 2025 + }, + { + "code": "JMD", + "noun": "Jamaican dollars", + "current_years": { + "start_year": 2022, + "end_year": 2022 + }, + "constant_years": { + "start_year": 2022, + "end_year": 2022 + }, + "base_year_min": 1980, + "base_year_max": 2025 + }, + { + "code": "JOD", + "noun": "Jordanian dinars", + "current_years": { + "start_year": 2022, + "end_year": 2022 + }, + "constant_years": { + "start_year": 2022, + "end_year": 2022 + }, + "base_year_min": 1980, + "base_year_max": 2025 + }, + { + "code": "JPY", + "noun": "Japanese yen", + "current_years": { + "start_year": 2022, + "end_year": 2022 + }, + "constant_years": { + "start_year": 2022, + "end_year": 2022 + }, + "base_year_min": 1960, + "base_year_max": 2025 + }, + { + "code": "KES", + "noun": "Kenyan shillings", + "current_years": { + "start_year": 2022, + "end_year": 2022 + }, + "constant_years": { + "start_year": 2022, + "end_year": 2022 + }, + "base_year_min": 1980, + "base_year_max": 2025 + }, + { + "code": "KGS", + "noun": "Kyrgyz soms", + "current_years": { + "start_year": 2022, + "end_year": 2022 + }, + "constant_years": { + "start_year": 2022, + "end_year": 2022 + }, + "base_year_min": 1992, + "base_year_max": 2025 + }, + { + "code": "KHR", + "noun": "Cambodian riels", + "current_years": { + "start_year": 2022, + "end_year": 2022 + }, + "constant_years": { + "start_year": 2022, + "end_year": 2022 + }, + "base_year_min": 1986, + "base_year_max": 2025 + }, + { + "code": "KMF", + "noun": "Comorian francs", + "current_years": { + "start_year": 2022, + "end_year": 2022 + }, + "constant_years": { + "start_year": 2022, + "end_year": 2022 + }, + "base_year_min": 1980, + "base_year_max": 2025 + }, + { + "code": "KRW", + "noun": "South Korean won", + "current_years": { + "start_year": 2022, + "end_year": 2022 + }, + "constant_years": { + "start_year": 2022, + "end_year": 2022 + }, + "base_year_min": 1987, + "base_year_max": 2025 + }, + { + "code": "KWD", + "noun": "Kuwaiti dinars", + "current_years": { + "start_year": 2022, + "end_year": 2022 + }, + "constant_years": { + "start_year": 2022, + "end_year": 2022 + }, + "base_year_min": 1995, + "base_year_max": 2024 + }, + { + "code": "KZT", + "noun": "Kazakh tenge", + "current_years": { + "start_year": 2022, + "end_year": 2022 + }, + "constant_years": { + "start_year": 2022, + "end_year": 2022 + }, + "base_year_min": 2013, + "base_year_max": 2024 + }, + { + "code": "LAK", + "noun": "Lao kip", + "current_years": { + "start_year": 2022, + "end_year": 2022 + }, + "constant_years": { + "start_year": 2022, + "end_year": 2022 + }, + "base_year_min": 1980, + "base_year_max": 2025 + }, + { + "code": "LBP", + "noun": "Lebanese pounds", + "current_years": { + "start_year": 2022, + "end_year": 2022 + }, + "constant_years": { + "start_year": 2022, + "end_year": 2022 + }, + "base_year_min": 1980, + "base_year_max": 2025 + }, + { + "code": "LKR", + "noun": "Sri Lankan rupees", + "current_years": { + "start_year": 2022, + "end_year": 2022 + }, + "constant_years": { + "start_year": 2022, + "end_year": 2022 + }, + "base_year_min": 1980, + "base_year_max": 2024 + }, + { + "code": "LSL", + "noun": "Lesotho maloti", + "current_years": { + "start_year": 2022, + "end_year": 2022 + }, + "constant_years": { + "start_year": 2022, + "end_year": 2022 + }, + "base_year_min": 1980, + "base_year_max": 2025 + }, + { + "code": "LYD", + "noun": "Libyan dinars", + "current_years": { + "start_year": 2022, + "end_year": 2022 + }, + "constant_years": { + "start_year": 2022, + "end_year": 2022 + }, + "base_year_min": 1980, + "base_year_max": 2025 + }, + { + "code": "MAD", + "noun": "Moroccan dirhams", + "current_years": { + "start_year": 2022, + "end_year": 2022 + }, + "constant_years": { + "start_year": 2022, + "end_year": 2022 + }, + "base_year_min": 1980, + "base_year_max": 2025 + }, + { + "code": "MDL", + "noun": "Moldovan lei", + "current_years": { + "start_year": 2022, + "end_year": 2022 + }, + "constant_years": { + "start_year": 2022, + "end_year": 2022 + }, + "base_year_min": 1992, + "base_year_max": 2025 + }, + { + "code": "MGA", + "noun": "Malagasy ariary", + "current_years": { + "start_year": 2022, + "end_year": 2022 + }, + "constant_years": { + "start_year": 2022, + "end_year": 2022 + }, + "base_year_min": 1980, + "base_year_max": 2025 + }, + { + "code": "MKD", + "noun": "Macedonian denars", + "current_years": { + "start_year": 2022, + "end_year": 2022 + }, + "constant_years": { + "start_year": 2022, + "end_year": 2022 + }, + "base_year_min": 1992, + "base_year_max": 2025 + }, + { + "code": "MMK", + "noun": "Myanmar kyats", + "current_years": { + "start_year": 2022, + "end_year": 2022 + }, + "constant_years": { + "start_year": 2022, + "end_year": 2022 + }, + "base_year_min": 1998, + "base_year_max": 2025 + }, + { + "code": "MNT", + "noun": "Mongolian tugriks", + "current_years": { + "start_year": 2022, + "end_year": 2022 + }, + "constant_years": { + "start_year": 2022, + "end_year": 2022 + }, + "base_year_min": 1980, + "base_year_max": 2025 + }, + { + "code": "MOP", + "noun": "Macanese patacas", + "current_years": { + "start_year": 2022, + "end_year": 2022 + }, + "constant_years": { + "start_year": 2022, + "end_year": 2022 + }, + "base_year_min": 2001, + "base_year_max": 2025 + }, + { + "code": "MRU", + "noun": "Mauritanian ouguiyas", + "current_years": { + "start_year": 2022, + "end_year": 2022 + }, + "constant_years": { + "start_year": 2022, + "end_year": 2022 + }, + "base_year_min": 1990, + "base_year_max": 2025 + }, + { + "code": "MUR", + "noun": "Mauritian rupees", + "current_years": { + "start_year": 2022, + "end_year": 2022 + }, + "constant_years": { + "start_year": 2022, + "end_year": 2022 + }, + "base_year_min": 1980, + "base_year_max": 2025 + }, + { + "code": "MVR", + "noun": "Maldivian rufiyaa", + "current_years": { + "start_year": 2022, + "end_year": 2022 + }, + "constant_years": { + "start_year": 2022, + "end_year": 2022 + }, + "base_year_min": 1980, + "base_year_max": 2025 + }, + { + "code": "MWK", + "noun": "Malawian kwachas", + "current_years": { + "start_year": 2022, + "end_year": 2022 + }, + "constant_years": { + "start_year": 2022, + "end_year": 2022 + }, + "base_year_min": 1980, + "base_year_max": 2025 + }, + { + "code": "MXN", + "noun": "Mexican pesos", + "current_years": { + "start_year": 2022, + "end_year": 2022 + }, + "constant_years": { + "start_year": 2022, + "end_year": 2022 + }, + "base_year_min": 1980, + "base_year_max": 2025 + }, + { + "code": "MYR", + "noun": "Malaysian ringgits", + "current_years": { + "start_year": 2022, + "end_year": 2022 + }, + "constant_years": { + "start_year": 2022, + "end_year": 2022 + }, + "base_year_min": 1980, + "base_year_max": 2025 + }, + { + "code": "MZN", + "noun": "Mozambican meticais", + "current_years": { + "start_year": 2022, + "end_year": 2022 + }, + "constant_years": { + "start_year": 2022, + "end_year": 2022 + }, + "base_year_min": 1980, + "base_year_max": 2025 + }, + { + "code": "NAD", + "noun": "Namibian dollars", + "current_years": { + "start_year": 2022, + "end_year": 2022 + }, + "constant_years": { + "start_year": 2022, + "end_year": 2022 + }, + "base_year_min": 1989, + "base_year_max": 2025 + }, + { + "code": "NGN", + "noun": "Nigerian naira", + "current_years": { + "start_year": 2022, + "end_year": 2022 + }, + "constant_years": { + "start_year": 2022, + "end_year": 2022 + }, + "base_year_min": 1990, + "base_year_max": 2025 + }, + { + "code": "NIO", + "noun": "Nicaraguan córdobas", + "current_years": { + "start_year": 2022, + "end_year": 2022 + }, + "constant_years": { + "start_year": 2022, + "end_year": 2022 + }, + "base_year_min": 1987, + "base_year_max": 2025 + }, + { + "code": "NOK", + "noun": "Norwegian kroner", + "current_years": { + "start_year": 2022, + "end_year": 2022 + }, + "constant_years": { + "start_year": 2022, + "end_year": 2022 + }, + "base_year_min": 1960, + "base_year_max": 2025 + }, + { + "code": "NPR", + "noun": "Nepalese rupees", + "current_years": { + "start_year": 2022, + "end_year": 2022 + }, + "constant_years": { + "start_year": 2022, + "end_year": 2022 + }, + "base_year_min": 1980, + "base_year_max": 2025 + }, + { + "code": "NZD", + "noun": "New Zealand dollars", + "current_years": { + "start_year": 2022, + "end_year": 2022 + }, + "constant_years": { + "start_year": 2022, + "end_year": 2022 + }, + "base_year_min": 1961, + "base_year_max": 2025 + }, + { + "code": "OMR", + "noun": "Omani rials", + "current_years": { + "start_year": 2022, + "end_year": 2022 + }, + "constant_years": { + "start_year": 2022, + "end_year": 2022 + }, + "base_year_min": 1980, + "base_year_max": 2025 + }, + { + "code": "PEN", + "noun": "Peruvian soles", + "current_years": { + "start_year": 2022, + "end_year": 2022 + }, + "constant_years": { + "start_year": 2022, + "end_year": 2022 + }, + "base_year_min": 1980, + "base_year_max": 2025 + }, + { + "code": "PGK", + "noun": "Papua New Guinean kina", + "current_years": { + "start_year": 2022, + "end_year": 2022 + }, + "constant_years": { + "start_year": 2022, + "end_year": 2022 + }, + "base_year_min": 1980, + "base_year_max": 2025 + }, + { + "code": "PHP", + "noun": "Philippine pesos", + "current_years": { + "start_year": 2022, + "end_year": 2022 + }, + "constant_years": { + "start_year": 2022, + "end_year": 2022 + }, + "base_year_min": 1980, + "base_year_max": 2025 + }, + { + "code": "PKR", + "noun": "Pakistani rupees", + "current_years": { + "start_year": 2022, + "end_year": 2022 + }, + "constant_years": { + "start_year": 2022, + "end_year": 2022 + }, + "base_year_min": 1980, + "base_year_max": 2025 + }, + { + "code": "PLN", + "noun": "Polish zlotys", + "current_years": { + "start_year": 2022, + "end_year": 2022 + }, + "constant_years": { + "start_year": 2022, + "end_year": 2022 + }, + "base_year_min": 1998, + "base_year_max": 2025 + }, + { + "code": "PYG", + "noun": "Paraguayan guaranís", + "current_years": { + "start_year": 2022, + "end_year": 2022 + }, + "constant_years": { + "start_year": 2022, + "end_year": 2022 + }, + "base_year_min": 1980, + "base_year_max": 2025 + }, + { + "code": "QAR", + "noun": "Qatari riyals", + "constant_years": { + "start_year": 2022, + "end_year": 2022 + }, + "base_year_min": 2023, + "base_year_max": 2023, + "current_years": null + }, + { + "code": "RON", + "noun": "Romanian lei", + "current_years": { + "start_year": 2022, + "end_year": 2022 + }, + "constant_years": { + "start_year": 2022, + "end_year": 2022 + }, + "base_year_min": 2013, + "base_year_max": 2025 + }, + { + "code": "RSD", + "noun": "Serbian dinars", + "current_years": { + "start_year": 2022, + "end_year": 2022 + }, + "constant_years": { + "start_year": 2022, + "end_year": 2022 + }, + "base_year_min": 1997, + "base_year_max": 2025 + }, + { + "code": "RUB", + "noun": "Russian rubles", + "constant_years": { + "start_year": 2022, + "end_year": 2022 + }, + "base_year_min": 2010, + "base_year_max": 2020, + "current_years": null + }, + { + "code": "RWF", + "noun": "Rwandan francs", + "current_years": { + "start_year": 2022, + "end_year": 2022 + }, + "constant_years": { + "start_year": 2022, + "end_year": 2022 + }, + "base_year_min": 1980, + "base_year_max": 2025 + }, + { + "code": "SAR", + "noun": "Saudi riyals", + "current_years": { + "start_year": 2022, + "end_year": 2022 + }, + "constant_years": { + "start_year": 2022, + "end_year": 2022 + }, + "base_year_min": 2000, + "base_year_max": 2023 + }, + { + "code": "SBD", + "noun": "Solomon Islands dollars", + "current_years": { + "start_year": 2022, + "end_year": 2022 + }, + "constant_years": { + "start_year": 2022, + "end_year": 2022 + }, + "base_year_min": 1980, + "base_year_max": 2025 + }, + { + "code": "SCR", + "noun": "Seychellois rupees", + "current_years": { + "start_year": 2022, + "end_year": 2022 + }, + "constant_years": { + "start_year": 2022, + "end_year": 2022 + }, + "base_year_min": 1980, + "base_year_max": 2025 + }, + { + "code": "SDG", + "noun": "Sudanese pounds", + "current_years": { + "start_year": 2022, + "end_year": 2022 + }, + "constant_years": { + "start_year": 2022, + "end_year": 2022 + }, + "base_year_min": 1980, + "base_year_max": 2025 + }, + { + "code": "SEK", + "noun": "Swedish kronor", + "current_years": { + "start_year": 2022, + "end_year": 2022 + }, + "constant_years": { + "start_year": 2022, + "end_year": 2022 + }, + "base_year_min": 1960, + "base_year_max": 2025 + }, + { + "code": "SGD", + "noun": "Singapore dollars", + "current_years": { + "start_year": 2022, + "end_year": 2022 + }, + "constant_years": { + "start_year": 2022, + "end_year": 2022 + }, + "base_year_min": 1980, + "base_year_max": 2025 + }, + { + "code": "SLE", + "noun": "Sierra Leonean leones", + "current_years": { + "start_year": 2022, + "end_year": 2022 + }, + "constant_years": { + "start_year": 2022, + "end_year": 2022 + }, + "base_year_min": 1980, + "base_year_max": 2025 + }, + { + "code": "SRD", + "noun": "Surinamese dollars", + "current_years": { + "start_year": 2022, + "end_year": 2022 + }, + "constant_years": { + "start_year": 2022, + "end_year": 2022 + }, + "base_year_min": 1980, + "base_year_max": 2025 + }, + { + "code": "SSP", + "noun": "South Sudanese pounds", + "current_years": { + "start_year": 2022, + "end_year": 2022 + }, + "constant_years": { + "start_year": 2022, + "end_year": 2022 + }, + "base_year_min": 2011, + "base_year_max": 2025 + }, + { + "code": "STN", + "noun": "São Tomé and Príncipe dobras", + "current_years": { + "start_year": 2022, + "end_year": 2022 + }, + "constant_years": { + "start_year": 2022, + "end_year": 2022 + }, + "base_year_min": 1980, + "base_year_max": 2025 + }, + { + "code": "SYP", + "noun": "Syrian pounds", + "constant_years": { + "start_year": 2022, + "end_year": 2022 + }, + "base_year_min": 1980, + "base_year_max": 2010, + "current_years": null + }, + { + "code": "SZL", + "noun": "Swazi emalangeni", + "current_years": { + "start_year": 2022, + "end_year": 2022 + }, + "constant_years": { + "start_year": 2022, + "end_year": 2022 + }, + "base_year_min": 1980, + "base_year_max": 2025 + }, + { + "code": "THB", + "noun": "Thai baht", + "current_years": { + "start_year": 2022, + "end_year": 2022 + }, + "constant_years": { + "start_year": 2022, + "end_year": 2022 + }, + "base_year_min": 2018, + "base_year_max": 2024 + }, + { + "code": "TJS", + "noun": "Tajikistani somonis", + "current_years": { + "start_year": 2022, + "end_year": 2022 + }, + "constant_years": { + "start_year": 2022, + "end_year": 2022 + }, + "base_year_min": 1992, + "base_year_max": 2025 + }, + { + "code": "TMT", + "noun": "Turkmenistani manat", + "current_years": { + "start_year": 2022, + "end_year": 2022 + }, + "constant_years": { + "start_year": 2022, + "end_year": 2022 + }, + "base_year_min": 1992, + "base_year_max": 2025 + }, + { + "code": "TND", + "noun": "Tunisian dinars", + "current_years": { + "start_year": 2022, + "end_year": 2022 + }, + "constant_years": { + "start_year": 2022, + "end_year": 2022 + }, + "base_year_min": 1980, + "base_year_max": 2025 + }, + { + "code": "TOP", + "noun": "Tongan paʻanga", + "current_years": { + "start_year": 2022, + "end_year": 2022 + }, + "constant_years": { + "start_year": 2022, + "end_year": 2022 + }, + "base_year_min": 1980, + "base_year_max": 2025 + }, + { + "code": "TRY", + "noun": "Turkish lira", + "current_years": { + "start_year": 2022, + "end_year": 2022 + }, + "constant_years": { + "start_year": 2022, + "end_year": 2022 + }, + "base_year_min": 1990, + "base_year_max": 2025 + }, + { + "code": "TTD", + "noun": "Trinidad and Tobago dollars", + "current_years": { + "start_year": 2022, + "end_year": 2022 + }, + "constant_years": { + "start_year": 2022, + "end_year": 2022 + }, + "base_year_min": 1980, + "base_year_max": 2025 + }, + { + "code": "TWD", + "noun": "New Taiwan dollars", + "constant_years": { + "start_year": 2022, + "end_year": 2022 + }, + "base_year_min": 2023, + "base_year_max": 2025, + "current_years": null + }, + { + "code": "TZS", + "noun": "Tanzanian shillings", + "current_years": { + "start_year": 2022, + "end_year": 2022 + }, + "constant_years": { + "start_year": 2022, + "end_year": 2022 + }, + "base_year_min": 1980, + "base_year_max": 2025 + }, + { + "code": "UAH", + "noun": "Ukrainian hryvnias", + "current_years": { + "start_year": 2022, + "end_year": 2022 + }, + "constant_years": { + "start_year": 2022, + "end_year": 2022 + }, + "base_year_min": 1991, + "base_year_max": 2025 + }, + { + "code": "UGX", + "noun": "Ugandan shillings", + "current_years": { + "start_year": 2022, + "end_year": 2022 + }, + "constant_years": { + "start_year": 2022, + "end_year": 2022 + }, + "base_year_min": 1980, + "base_year_max": 2025 + }, + { + "code": "USD", + "noun": "US dollars", + "current_years": { + "start_year": 2022, + "end_year": 2022 + }, + "constant_years": { + "start_year": 2022, + "end_year": 2022 + }, + "base_year_min": 1960, + "base_year_max": 2025 + }, + { + "code": "UYU", + "noun": "Uruguayan pesos", + "current_years": { + "start_year": 2022, + "end_year": 2022 + }, + "constant_years": { + "start_year": 2022, + "end_year": 2022 + }, + "base_year_min": 1980, + "base_year_max": 2025 + }, + { + "code": "UZS", + "noun": "Uzbekistani soms", + "current_years": { + "start_year": 2022, + "end_year": 2022 + }, + "constant_years": { + "start_year": 2022, + "end_year": 2022 + }, + "base_year_min": 1992, + "base_year_max": 2025 + }, + { + "code": "VES", + "noun": "Venezuelan bolívares", + "current_years": { + "start_year": 2022, + "end_year": 2022 + }, + "constant_years": { + "start_year": 2022, + "end_year": 2022 + }, + "base_year_min": 2017, + "base_year_max": 2025 + }, + { + "code": "VND", + "noun": "Vietnamese dong", + "current_years": { + "start_year": 2022, + "end_year": 2022 + }, + "constant_years": { + "start_year": 2022, + "end_year": 2022 + }, + "base_year_min": 1980, + "base_year_max": 2025 + }, + { + "code": "VUV", + "noun": "Vanuatu vatu", + "current_years": { + "start_year": 2022, + "end_year": 2022 + }, + "constant_years": { + "start_year": 2022, + "end_year": 2022 + }, + "base_year_min": 1980, + "base_year_max": 2025 + }, + { + "code": "WST", + "noun": "Samoan tala", + "current_years": { + "start_year": 2022, + "end_year": 2022 + }, + "constant_years": { + "start_year": 2022, + "end_year": 2022 + }, + "base_year_min": 1980, + "base_year_max": 2025 + }, + { + "code": "XAF", + "noun": "Central African CFA francs", + "current_years": { + "start_year": 2022, + "end_year": 2022 + }, + "constant_years": { + "start_year": 2022, + "end_year": 2022 + }, + "base_year_min": 1980, + "base_year_max": 2025 + }, + { + "code": "XCD", + "noun": "East Caribbean dollars", + "current_years": { + "start_year": 2022, + "end_year": 2022 + }, + "constant_years": { + "start_year": 2022, + "end_year": 2022 + }, + "base_year_min": 1980, + "base_year_max": 2025 + }, + { + "code": "XOF", + "noun": "West African CFA francs", + "current_years": { + "start_year": 2022, + "end_year": 2022 + }, + "constant_years": { + "start_year": 2022, + "end_year": 2022 + }, + "base_year_min": 1980, + "base_year_max": 2025 + }, + { + "code": "YER", + "noun": "Yemeni rials", + "current_years": { + "start_year": 2022, + "end_year": 2022 + }, + "constant_years": { + "start_year": 2022, + "end_year": 2022 + }, + "base_year_min": 2014, + "base_year_max": 2025 + }, + { + "code": "ZAR", + "noun": "South African rand", + "current_years": { + "start_year": 2022, + "end_year": 2022 + }, + "constant_years": { + "start_year": 2022, + "end_year": 2022 + }, + "base_year_min": 1980, + "base_year_max": 2025 + }, + { + "code": "ZMW", + "noun": "Zambian kwachas", + "current_years": { + "start_year": 2022, + "end_year": 2022 + }, + "constant_years": { + "start_year": 2022, + "end_year": 2022 + }, + "base_year_min": 1980, + "base_year_max": 2025 + } + ], + "default_base_year": 2024, + "role_currencies": { + "destination": "KES" + } + } + } + } + } + ], + "rendered_sentence": "Gross 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", + "axis": "what", + "segment": "heading", + "entity_refs": [], + "states": [ + "how:financialFlowType", + "how:nettingBasis", + "axis:populationType", + "axis:measuredProperty" + ], + "part_index": 0 + }, + { + "kind": "text", + "text": " to ", + "segment": "heading", + "entity_refs": [], + "states": [], + "part_index": 0 + }, + { + "kind": "slot", + "text": "Kenya", + "axis": "where", + "segment": "heading", + "role": "destination", + "binding_ref": "where:", + "entity_refs": [ + "country/KEN" + ], + "states": [ + "where:" + ], + "part_index": 0 + }, + { + "kind": "text", + "text": " from ", + "segment": "heading", + "entity_refs": [], + "states": [], + "part_index": 0 + }, + { + "kind": "slot", + "text": "96 providers", + "segment": "heading", + "role": "origin", + "binding_ref": "origin:", + "entity_refs": [], + "states": [ + "origin:" + ], + "part_index": 0 + }, + { + "kind": "text", + "text": " for ", + "segment": "heading", + "entity_refs": [], + "states": [], + "part_index": 0 + }, + { + "kind": "slot", + "text": "official development assistance", + "axis": "how", + "segment": "heading", + "property_dcid": "dac2aAidType", + "binding_ref": "how:dac2aAidType", + "entity_refs": [], + "states": [ + "how:dac2aAidType" + ], + "part_index": 0 + }, + { + "kind": "slot", + "text": "", + "axis": "how", + "segment": "heading", + "property_dcid": "dacTypeOfFinance", + "binding_ref": "how:dacTypeOfFinance", + "entity_refs": [], + "states": [], + "part_index": 0 + }, + { + "kind": "slot", + "text": "", + "axis": "how", + "segment": "heading", + "property_dcid": "financialFlowType", + "binding_ref": "how:financialFlowType", + "entity_refs": [], + "states": [], + "part_index": 0 + }, + { + "kind": "slot", + "text": "", + "axis": "how", + "segment": "heading", + "property_dcid": "nettingBasis", + "binding_ref": "how:nettingBasis", + "entity_refs": [], + "states": [], + "part_index": 0 + }, + { + "kind": "text", + "text": " ", + "segment": "heading", + "entity_refs": [], + "states": [] + }, + { + "kind": "slot", + "text": "in 2022", + "axis": "when", + "segment": "heading", + "binding_ref": "when:", + "entity_refs": [], + "states": [ + "when:" + ] + }, + { + "kind": "text", + "text": ".", + "segment": "heading", + "entity_refs": [], + "states": [] + }, + { + "kind": "text", + "text": " ", + "segment": "byline", + "entity_refs": [], + "states": [] + }, + { + "kind": "slot", + "text": "Current US dollars", + "axis": "unit", + "segment": "byline", + "binding_ref": "unit:", + "entity_refs": [], + "states": [ + "unit:", + "axis:measurementQualifier" + ] + }, + { + "kind": "text", + "text": " · ", + "segment": "byline", + "entity_refs": [], + "states": [] + }, + { + "kind": "slot", + "text": "OECD DAC2a", + "axis": "source", + "segment": "byline", + "entity_refs": [], + "states": [ + "source:" + ] + }, + { + "kind": "text", + "text": ".", + "segment": "byline", + "entity_refs": [], + "states": [] + }, + { + "kind": "text", + "text": " ", + "segment": "assumption", + "entity_refs": [], + "states": [], + "part_index": 0 + }, + { + "kind": "text", + "text": "Assumed: ", + "segment": "assumption", + "entity_refs": [], + "states": [], + "part_index": 0 + }, + { + "kind": "text", + "text": "every provider", + "segment": "assumption", + "entity_refs": [], + "states": [], + "part_index": 0 + }, + { + "kind": "text", + "text": ".", + "segment": "assumption", + "entity_refs": [], + "states": [], + "part_index": 0 + } + ], + "status": "definite" + } + } + }, + { + "request": { + "method": "GET", + "origin_path": "/api/datasets/spec_73897fdfb0206fcf27c5898b353348fb/cv_2aa4cc2fd852cd9b84347c61d07d609a/files/sha256:05d0cbf59e8dddd7162104bf8e2edc406fc402a0b8d0d971452d01b07b0ee426" + }, + "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" + } + } + }, + { + "request": { + "method": "GET", + "url": "https://storage.googleapis.com/dev-fin-observatory-datasets-working/sha256%3A05d0cbf59e8dddd7162104bf8e2edc406fc402a0b8d0d971452d01b07b0ee426?X-Goog-Signature=redacted" + }, + "response": { + "status": 200, + "headers": { + "content-type": "application/vnd.apache.parquet" + }, + "body_file": "fetch-spec-party-totals-kept.parquet" + } + } + ], + "expect": [ + { + "dataset": { + "rows": 111, + "columns": [ + "time_period", + "financingProvider_label", + "financingRecipient_label", + "value", + "unit_label", + "dac2aAidType_label", + "provenance_label", + "financingProvider", + "financingProvider_kind", + "financingRecipient", + "financingRecipient_kind", + "dac2aAidType", + "unit", + "currency", + "price_basis", + "base_year", + "measurementMethod", + "measurementMethod_label", + "provenance", + "stat_var" + ], + "complete": true, + "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." + } + ], + "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 new file mode 100644 index 0000000..e39f858 Binary files /dev/null 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 new file mode 100644 index 0000000..957c35b --- /dev/null +++ b/python/client-contract/src/dfo_client_contract/scenarios/fetch-spec-party-totals-left-out.json @@ -0,0 +1,4484 @@ +{ + "format_version": 1, + "name": "fetch-spec-party-totals-left-out", + "description": "Fetching a spec of DAC2a ODA to Kenya in 2022 with its origin open posts without_party_totals: true in the build's options, as every fetch does by default, so the build leaves out the donor group totals beside their members and answers a version of its own, with fewer rows than fetch-spec-party-totals-kept.", + "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" + }, + "call": [ + { + "op": "fetch", + "spec": { + "spec_id": "spec_70ddf0ce6a9b3f147063f2adf37fab9e", + "definition": { + "schema_version": 1, + "spec_id": "spec_70ddf0ce6a9b3f147063f2adf37fab9e", + "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": "Gross" + } + } + ], + "entities": { + "destination": [ + "country/AFG", + "country/AGO", + "country/ARE", + "country/ARG", + "country/ATG", + "country/AZE", + "country/BDI", + "country/BEN", + "country/BFA", + "country/BGD", + "country/BHR", + "country/BHS", + "country/BLZ", + "country/BOL", + "country/BRA", + "country/BRB", + "country/BRN", + "country/BTN", + "country/BWA", + "country/CAF", + "country/CHL", + "country/CHN", + "country/CIV", + "country/CMR", + "country/COD", + "country/COG", + "country/COL", + "country/COM", + "country/CPV", + "country/CRI", + "country/CUB", + "country/DJI", + "country/DMA", + "country/DOM", + "country/DZA", + "country/ECU", + "country/EGY", + "country/ERI", + "country/ETH", + "country/FJI", + "country/FSM", + "country/GAB", + "country/GHA", + "country/GIN", + "country/GMB", + "country/GNB", + "country/GNQ", + "country/GRD", + "country/GTM", + "country/GUY", + "country/HND", + "country/HTI", + "country/IDN", + "country/IND", + "country/IRN", + "country/IRQ", + "country/JAM", + "country/JOR", + "country/KEN", + "country/KHM", + "country/KIR", + "country/KNA", + "country/KWT", + "country/LAO", + "country/LBN", + "country/LBR", + "country/LBY", + "country/LCA", + "country/LKA", + "country/LSO", + "country/MAR", + "country/MDG", + "country/MDV", + "country/MHL", + "country/MLI", + "country/MMR", + "country/MNG", + "country/MOZ", + "country/MRT", + "country/MUS", + "country/MWI", + "country/MYS", + "country/NAM", + "country/NER", + "country/NGA", + "country/NIC", + "country/NPL", + "country/NRU", + "country/OMN", + "country/PAK", + "country/PAN", + "country/PER", + "country/PHL", + "country/PNG", + "country/PRK", + "country/PRY", + "country/QAT", + "country/RWA", + "country/SAU", + "country/SDN", + "country/SEN", + "country/SGP", + "country/SLB", + "country/SLE", + "country/SLV", + "country/SOM", + "country/SSD", + "country/STP", + "country/SUR", + "country/SWZ", + "country/SYC", + "country/SYR", + "country/TCD", + "country/TGO", + "country/THA", + "country/TJK", + "country/TKM", + "country/TLS", + "country/TON", + "country/TTO", + "country/TUN", + "country/TZA", + "country/UGA", + "country/URY", + "country/VCT", + "country/VEN", + "country/VNM", + "country/VUT", + "country/WSM", + "country/YEM", + "country/ZAF", + "country/ZMB", + "country/ZWE" + ], + "origin": [ + "country/AUS", + "country/AUT", + "country/BEL", + "country/CAN", + "country/CHE", + "country/CZE", + "country/DEU", + "country/DNK", + "country/ESP", + "country/EST", + "country/FIN", + "country/FRA", + "country/GBR", + "country/GRC", + "country/HUN", + "country/IRL", + "country/ISL", + "country/ITA", + "country/JPN", + "country/KOR", + "country/LTU", + "country/LUX", + "country/LVA", + "country/NLD", + "country/NOR", + "country/NZL", + "country/POL", + "country/PRT", + "country/SVK", + "country/SVN", + "country/SWE", + "country/USA" + ] + }, + "requested_window": { + "kind": "range", + "start_year": 1967, + "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.", + "entity_groups": { + "destination": { + "label": "G77 countries", + "group_id": "groups/G77" + }, + "origin": { + "label": "DAC countries", + "group_id": "groups/OECD.DAC" + } + } + }, + "window": [ + 2022, + 2022 + ], + "entities": { + "origin": null, + "destination": [ + "country/KEN" + ] + } + } + ], + "exchanges": [ + { + "request": { + "method": "POST", + "path": "/datasets", + "json": { + "schema_version": 1, + "input": { + "kind": "spec_id", + "spec_id": "spec_70ddf0ce6a9b3f147063f2adf37fab9e", + "definition": { + "schema_version": 1, + "spec_id": "spec_70ddf0ce6a9b3f147063f2adf37fab9e", + "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": "Gross" + } + } + ], + "entities": { + "destination": [ + "country/AFG", + "country/AGO", + "country/ARE", + "country/ARG", + "country/ATG", + "country/AZE", + "country/BDI", + "country/BEN", + "country/BFA", + "country/BGD", + "country/BHR", + "country/BHS", + "country/BLZ", + "country/BOL", + "country/BRA", + "country/BRB", + "country/BRN", + "country/BTN", + "country/BWA", + "country/CAF", + "country/CHL", + "country/CHN", + "country/CIV", + "country/CMR", + "country/COD", + "country/COG", + "country/COL", + "country/COM", + "country/CPV", + "country/CRI", + "country/CUB", + "country/DJI", + "country/DMA", + "country/DOM", + "country/DZA", + "country/ECU", + "country/EGY", + "country/ERI", + "country/ETH", + "country/FJI", + "country/FSM", + "country/GAB", + "country/GHA", + "country/GIN", + "country/GMB", + "country/GNB", + "country/GNQ", + "country/GRD", + "country/GTM", + "country/GUY", + "country/HND", + "country/HTI", + "country/IDN", + "country/IND", + "country/IRN", + "country/IRQ", + "country/JAM", + "country/JOR", + "country/KEN", + "country/KHM", + "country/KIR", + "country/KNA", + "country/KWT", + "country/LAO", + "country/LBN", + "country/LBR", + "country/LBY", + "country/LCA", + "country/LKA", + "country/LSO", + "country/MAR", + "country/MDG", + "country/MDV", + "country/MHL", + "country/MLI", + "country/MMR", + "country/MNG", + "country/MOZ", + "country/MRT", + "country/MUS", + "country/MWI", + "country/MYS", + "country/NAM", + "country/NER", + "country/NGA", + "country/NIC", + "country/NPL", + "country/NRU", + "country/OMN", + "country/PAK", + "country/PAN", + "country/PER", + "country/PHL", + "country/PNG", + "country/PRK", + "country/PRY", + "country/QAT", + "country/RWA", + "country/SAU", + "country/SDN", + "country/SEN", + "country/SGP", + "country/SLB", + "country/SLE", + "country/SLV", + "country/SOM", + "country/SSD", + "country/STP", + "country/SUR", + "country/SWZ", + "country/SYC", + "country/SYR", + "country/TCD", + "country/TGO", + "country/THA", + "country/TJK", + "country/TKM", + "country/TLS", + "country/TON", + "country/TTO", + "country/TUN", + "country/TZA", + "country/UGA", + "country/URY", + "country/VCT", + "country/VEN", + "country/VNM", + "country/VUT", + "country/WSM", + "country/YEM", + "country/ZAF", + "country/ZMB", + "country/ZWE" + ], + "origin": [ + "country/AUS", + "country/AUT", + "country/BEL", + "country/CAN", + "country/CHE", + "country/CZE", + "country/DEU", + "country/DNK", + "country/ESP", + "country/EST", + "country/FIN", + "country/FRA", + "country/GBR", + "country/GRC", + "country/HUN", + "country/IRL", + "country/ISL", + "country/ITA", + "country/JPN", + "country/KOR", + "country/LTU", + "country/LUX", + "country/LVA", + "country/NLD", + "country/NOR", + "country/NZL", + "country/POL", + "country/PRT", + "country/SVK", + "country/SVN", + "country/SWE", + "country/USA" + ] + }, + "requested_window": { + "kind": "range", + "start_year": 1967, + "end_year": 2024 + } + } + }, + "scope": { + "window": { + "kind": "range", + "start_year": 2022, + "end_year": 2022 + }, + "entities": { + "destination": [ + "country/KEN" + ] + } + } + }, + "options": { + "format": "parquet", + "bundle": false, + "without_party_totals": true + } + } + }, + "response": { + "status": 200, + "headers": { + "content-type": "application/json", + "x-dfo-trace-id": "32e9805e9f0641c38c9b29ba614120b5" + }, + "json": { + "schema_version": 1, + "definition": { + "schema_version": 1, + "spec_id": "spec_73897fdfb0206fcf27c5898b353348fb", + "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": { + "destination": [ + "country/KEN" + ] + }, + "identity_version": "spec1", + "requested_window": { + "kind": "range", + "end_year": 2022, + "start_year": 2022 + } + } + }, + "content_version": "cv_fd93b9bd8095076557d0e500bb15514f", + "prepared_at": "2026-10-12T18:33:25Z", + "coverage": { + "rows": 96, + "dimensions": [ + { + "label": "financingProvider", + "count": 96, + "axis": "origin", + "noun": { + "singular": "provider", + "plural": "providers" + } + }, + { + "label": "financingRecipient", + "count": 1, + "axis": "destination", + "noun": { + "singular": "recipient", + "plural": "recipients" + } + }, + { + "label": "years", + "count": 1 + } + ], + "window": { + "kind": "range", + "origin": "query", + "end_year": 2022, + "start_year": 2022 + } + }, + "citation": { + "text": "OECD DAC2A via ONE DFO, retrieved 2026-10-12", + "sources": [ + { + "ref": "provenance/OECDDAC2A", + "label": "OECD DAC2A", + "license": "OECD Terms and Conditions", + "license_type": "OECDTermsAndConditions", + "license_url": "https://www.oecd.org/en/about/terms-conditions.html", + "url": "https://data-explorer.oecd.org/vis?tm=dac2a&pg=0&snb=1&df[ds]=dsDisseminateFinalDMZ&df[id]=DSD_DAC2%40DF_DAC2A&df[ag]=OECD.DCD.FSD&df[vs]=1.6&dq=.DPGC.206.USD.Q&lom=LASTNPERIODS&lo=5&to[TIME_PERIOD]=false&isAvailabilityDisabled=false&page=0", + "source": { + "ref": "dc/s/OrganisationForEconomicCo-operationAndDevelopmentOecd", + "label": "Organisation for Economic Co-operation and Development (OECD)" + }, + "data_commons": { + "id": "dfo", + "label": "Development Finance Observatory" + }, + "documentation": { + "publisher": "Organisation for Economic Co-operation and Development (OECD)", + "description": "DAC2A is the OECD Development Assistance Committee's table of ODA disbursements by donor and recipient country or region. It covers bilateral donors and multilateral agencies reporting their own outflows, and includes the OECD's estimate of each donor's core multilateral contributions attributed to recipients.", + "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-12", + "years_covered": "1960-2025", + "granularity": "Annual, by provider and recipient", + "currencies": [ + "USD" + ], + "transformation_log": [ + { + "transformation": "Download the source data", + "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": "Standardise providers and recipients", + "description": "Provider and recipient codes are standardised to Data Commons IDs used across the platform, so data can be compared across datasets. The totals DAC2A reports for groups of providers, such as all DAC countries, and for groups of recipients, such as regions and income groups, are included as providers and recipients of their own. Where two provider codes name the same organisation and report the same figures, the figures are counted once. Where two recipient codes name the same organisation, such as IDA and IDA's Multilateral Debt Relief Initiative, their flows are added." + }, + { + "transformation": "Select figures", + "description": "Only figures in current US dollars are included, not constant US dollars. Only flows to recipients on Part I of the DAC List are included: the developing countries, and the multilateral organisations DAC2A reports as recipients, such as development banks and UN agencies. Flows to Part II recipients, the countries in transition, are excluded." + }, + { + "transformation": "Convert to whole units", + "description": "DAC2A reports amounts in millions, which are converted to whole units. ODA per person and ODA as a share of GNI are kept as reported." + }, + { + "transformation": "Select dimensions", + "description": "Each figure is reported by year, provider, recipient and type of aid, such as grants, repayments, interest received, or debt forgiven or rescheduled. DAC2A is a table of disbursements, so every figure, repayments and interest included, is recorded as a disbursement. Figures are marked as gross or net, except where DAC2A does not say which, and as grants or non-grants where the type of aid is wholly one or the other. Imputed multilateral ODA, the OECD's estimate of each provider's share of multilateral organisations' ODA, is marked as modelled. ODA as a share of GNI records the recipient's GNI as its denominator, and ODA per person records the recipient's population." + } + ], + "version_history": [ + { + "date": "2026-10-14", + "title": "First release", + "changes": [ + { + "kind": "added", + "note": "ODA disbursements by donor and recipient country or region, including the OECD's imputed multilateral contributions, and ODA per person and as a share of recipient GNI." + } + ] + } + ] + } + } + ] + }, + "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", + "end_year": 2022, + "start_year": 2022 + }, + "graph_revision": "dfo-dev-dc-datacommons-service-00242-zfr", + "normalisations": [], + "code_index_stamp": { + "exported_at": "2026-10-11T15:49:13Z", + "content_hash": "952a221e6d43254927fcb75abbf12ce7ba03285fbfeef7d9913e2ddcf49f904c", + "graph_endpoint": "https://dfo-dev-dc-datacommons-service-zms5lj4zhq-nn.a.run.app" + }, + "source_revisions": [ + { + "source": "provenance/OECDDAC2A", + "revision": "2026-10-12" + } + ], + "capability_version": "dset_5c3f5b0bf4cd9569", + "materialiser_build": "cd25922ac45834a7c7d0193d3b3ee3d7e9cc7b55", + "resolved_stat_vars": [ + { + "ref": "dcid:Amount_FinancialFlow_Gross_Disbursement_DAC2aAidType206_Nominal", + "roles": [ + "financingProvider", + "financingRecipient" + ], + "observation_count": 111 + } + ], + "family_member_count": 1, + "family_member_digest": "1a36e1a7292b1bfff95a5415de0be74cac7bb033217ed50e79faa8ce51a224c0", + "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" + }, + "warnings": [], + "diagnostics": [ + { + "code": "processing_level_undeclared", + "severity": "info", + "message": "A source StatVar lacks a processing-level declaration; the citation credits the source and omits the processing qualifier." + } + ], + "artifacts": [ + { + "artifact_digest": "sha256:586f5aaffd96c46feb4d7bf09625d4c1a259faf51daf2d88967566fd4de07b4e", + "rendering": { + "bundle": false, + "format": "parquet", + "layout": 4, + "without_party_totals": true + }, + "bytes": 10346, + "media_type": "application/vnd.apache.parquet", + "created_at": "2026-10-25T13:52:32.232191+00:00", + "tier": "working", + "url": "/api/datasets/spec_73897fdfb0206fcf27c5898b353348fb/cv_fd93b9bd8095076557d0e500bb15514f/files/sha256:586f5aaffd96c46feb4d7bf09625d4c1a259faf51daf2d88967566fd4de07b4e", + "enrichment_stamp": "08ed6c734fc69ea2204a21f4e1dd8b963f14dd1e03a2484c618049ac2e2d93d8" + }, + { + "artifact_digest": "sha256:f59e46a097f5837a3cc787e5dfe8b8bb562ad4dbc106f811575e322a15cc2db4", + "rendering": { + "statistics": "series" + }, + "bytes": 9488, + "media_type": "application/vnd.apache.parquet", + "created_at": "2026-10-15T09:58:17.967502+00:00", + "tier": "working", + "url": "/api/datasets/spec_73897fdfb0206fcf27c5898b353348fb/cv_fd93b9bd8095076557d0e500bb15514f/files/sha256:f59e46a097f5837a3cc787e5dfe8b8bb562ad4dbc106f811575e322a15cc2db4" + } + ], + "series_count": 96, + "output_options": { + "capability_version": "dset_76f5fa7244511c58", + "columns": [ + { + "name": "stat_var", + "kind": "grain", + "droppable": false, + "distinct": 1 + }, + { + "name": "financingProvider", + "kind": "role", + "droppable": false, + "distinct": 96 + }, + { + "name": "financingRecipient", + "kind": "role", + "droppable": false, + "distinct": 1 + }, + { + "name": "time_period", + "kind": "grain", + "droppable": false, + "distinct": 1 + }, + { + "name": "value", + "kind": "value", + "droppable": true + }, + { + "name": "unit", + "kind": "unit", + "droppable": false, + "distinct": 1 + }, + { + "name": "measurementMethod", + "kind": "facet", + "droppable": true, + "distinct": 1 + }, + { + "name": "provenance", + "kind": "facet", + "droppable": false, + "distinct": 1 + }, + { + "name": "status", + "kind": "status", + "droppable": true + } + ], + "formats": [ + { + "name": "csv", + "state": "available" + }, + { + "name": "xlsx", + "state": "available" + }, + { + "name": "parquet", + "state": "available" + } + ], + "bundle": { + "state": "available" + }, + "enrichments": [ + { + "column": "financingProvider", + "field": "iso3", + "token": "financingProvider_iso3", + "state": "partial", + "reason": "enrichment_unavailable", + "coverage": { + "entities": 96, + "covered": 39 + }, + "missing": [ + { + "ref": "AdaptationFund", + "label": "Adaptation Fund" + }, + { + "ref": "AfricanDevelopmentBank", + "label": "African Development Bank" + }, + { + "ref": "AfricanDevelopmentFund", + "label": "African Development Fund" + }, + { + "ref": "BezosEarthFund", + "label": "Bezos Earth Fund" + }, + { + "ref": "BloombergPhilanthropies", + "label": "Bloomberg Philanthropies" + }, + { + "ref": "CentralEmergencyResponseFund", + "label": "Central Emergency Response Fund" + }, + { + "ref": "ChildrensInvestmentFundFoundation", + "label": "Children's Investment Fund Foundation" + }, + { + "ref": "ClimateInvestmentFunds", + "label": "Climate Investment Funds" + }, + { + "ref": "ConradNHiltonFoundation", + "label": "Conrad N. Hilton Foundation" + }, + { + "ref": "DavidAndLucilePackardFoundation", + "label": "David and Lucile Packard Foundation" + } + ], + "truncated": true + }, + { + "column": "financingProvider", + "field": "iso2", + "token": "financingProvider_iso2", + "state": "partial", + "reason": "enrichment_unavailable", + "coverage": { + "entities": 96, + "covered": 39 + }, + "missing": [ + { + "ref": "AdaptationFund", + "label": "Adaptation Fund" + }, + { + "ref": "AfricanDevelopmentBank", + "label": "African Development Bank" + }, + { + "ref": "AfricanDevelopmentFund", + "label": "African Development Fund" + }, + { + "ref": "BezosEarthFund", + "label": "Bezos Earth Fund" + }, + { + "ref": "BloombergPhilanthropies", + "label": "Bloomberg Philanthropies" + }, + { + "ref": "CentralEmergencyResponseFund", + "label": "Central Emergency Response Fund" + }, + { + "ref": "ChildrensInvestmentFundFoundation", + "label": "Children's Investment Fund Foundation" + }, + { + "ref": "ClimateInvestmentFunds", + "label": "Climate Investment Funds" + }, + { + "ref": "ConradNHiltonFoundation", + "label": "Conrad N. Hilton Foundation" + }, + { + "ref": "DavidAndLucilePackardFoundation", + "label": "David and Lucile Packard Foundation" + } + ], + "truncated": true + }, + { + "column": "financingProvider", + "field": "label", + "token": "financingProvider_label", + "state": "available", + "coverage": { + "entities": 96, + "covered": 96 + }, + "missing": [], + "truncated": false + }, + { + "column": "financingProvider", + "field": "type", + "token": "financingProvider_type", + "state": "available", + "coverage": { + "entities": 96, + "covered": 96 + }, + "missing": [], + "truncated": false + }, + { + "column": "financingProvider", + "field": "party_kind", + "token": "financingProvider_party_kind", + "state": "available", + "coverage": { + "entities": 96, + "covered": 96 + }, + "missing": [], + "truncated": false + }, + { + "column": "financingProvider", + "field": "party_class", + "token": "financingProvider_party_class", + "state": "available", + "coverage": { + "entities": 96, + "covered": 96 + }, + "missing": [], + "truncated": false + }, + { + "column": "financingProvider", + "field": "party_whole", + "token": "financingProvider_party_whole", + "state": "available", + "coverage": { + "entities": 96, + "covered": 96 + }, + "missing": [], + "truncated": false + }, + { + "column": "financingRecipient", + "field": "iso3", + "token": "financingRecipient_iso3", + "state": "available", + "coverage": { + "entities": 1, + "covered": 1 + }, + "missing": [], + "truncated": false + }, + { + "column": "financingRecipient", + "field": "iso2", + "token": "financingRecipient_iso2", + "state": "available", + "coverage": { + "entities": 1, + "covered": 1 + }, + "missing": [], + "truncated": false + }, + { + "column": "financingRecipient", + "field": "label", + "token": "financingRecipient_label", + "state": "available", + "coverage": { + "entities": 1, + "covered": 1 + }, + "missing": [], + "truncated": false + }, + { + "column": "financingRecipient", + "field": "type", + "token": "financingRecipient_type", + "state": "available", + "coverage": { + "entities": 1, + "covered": 1 + }, + "missing": [], + "truncated": false + }, + { + "column": "financingRecipient", + "field": "party_kind", + "token": "financingRecipient_party_kind", + "state": "available", + "coverage": { + "entities": 1, + "covered": 1 + }, + "missing": [], + "truncated": false + }, + { + "column": "financingRecipient", + "field": "party_class", + "token": "financingRecipient_party_class", + "state": "available", + "coverage": { + "entities": 1, + "covered": 1 + }, + "missing": [], + "truncated": false + }, + { + "column": "financingRecipient", + "field": "party_whole", + "token": "financingRecipient_party_whole", + "state": "available", + "coverage": { + "entities": 1, + "covered": 1 + }, + "missing": [], + "truncated": false + } + ], + "long_layout_defaults": [ + "financingProvider_label", + "financingProvider_kind", + "financingRecipient_label", + "financingRecipient_kind" + ], + "long_layout_totals": [], + "pivots": [], + "groupby": { + "state": "available", + "axes": [ + { + "name": "crsCooperationModality" + }, + { + "name": "crsPurpose" + }, + { + "name": "crsTypeOfFinance" + }, + { + "name": "crsTypeOfFlow" + } + ] + } + }, + "series_coverage_stamp": "e6e717ab8c77e84d010915893ede5809e9ecec67929a07cfafbcc2210edfa1eb", + "retention": { + "pinned": true + } + } + } + }, + { + "request": { + "method": "POST", + "path": "/search/resolve", + "json": { + "schema_version": 1, + "input": { + "kind": "dataset_resubmit", + "entries": [ + { + "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": { + "destination": [ + "country/KEN" + ] + }, + "identity_version": "spec1", + "requested_window": { + "kind": "range", + "end_year": 2022, + "start_year": 2022 + } + } + } + ] + } + } + }, + "response": { + "status": 200, + "headers": { + "content-type": "application/json", + "x-dfo-trace-id": "66a2d2508ed04bddb8e7bb1aabaa88db" + }, + "json": { + "schema_version": 1, + "query_echo": { + "entry_path": "dataset_resubmit", + "extract_skipped": true + }, + "diagnostics": { + "engine_build": "d80df9f5fd598b7345255470932d202ee5d49942", + "trace_id": "66a2d2508ed04bddb8e7bb1aabaa88db", + "warnings": [], + "timing_ms": { + "total": 2, + "by_step": { + "coverage": 0 + } + }, + "timed_out": false + }, + "kind": "resolution", + "parts": [ + { + "variable_text": "dataset", + "warnings": [ + { + "code": "role_scope_defaulted", + "severity": "warn", + "message": "No provider was named, so the answer covers every provider with data." + }, + { + "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", + "params": { + "total": "DACOfficialDonors", + "total_label": "official donors (DAC)", + "whole_of": "official" + } + } + ], + "timing_ms": { + "total": 0, + "by_step": { + "response_cache_part_memo": 0 + } + }, + "entity_refs": [], + "operations": [], + "departures": [], + "assumptions": [ + { + "kind": "open_role", + "binding_ref": "origin:", + "text": "every provider", + "refs": [] + } + ], + "status": "definite", + "spec": { + "spec_id": "spec_73897fdfb0206fcf27c5898b353348fb", + "definition": { + "schema_version": 1, + "spec_id": "spec_73897fdfb0206fcf27c5898b353348fb", + "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": "Gross" + } + } + ], + "entities": { + "destination": [ + "country/KEN" + ] + }, + "requested_window": { + "kind": "range", + "start_year": 2022, + "end_year": 2022 + } + } + }, + "resolved": { + "shape": { + "shape_id": "financialflow_amount_measuredvalue_nominal_family_f096b1ba", + "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" + }, + "measurement_denominator_unresolved": false, + "slot_keys": [ + { + "axis": "how", + "property": { + "ref": "dac2aAidType", + "label": "DAC 2a aid type" + }, + "label": "aid type" + }, + { + "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": "dacTypeOfFinance", + "label": "DAC type of finance" + }, + "label": "DAC type of finance" + }, + { + "axis": "where", + "label": "place" + }, + { + "axis": "when", + "label": "time window" + }, + { + "axis": "source", + "label": "data source" + } + ], + "member_count": 1, + "member_digest": "1a36e1a7292b1bfff95a5415de0be74cac7bb033217ed50e79faa8ce51a224c0", + "refine_supported": true, + "data_commons": [ + { + "id": "dfo", + "label": "Development Finance Observatory" + } + ] + }, + "slots": [ + { + "key": { + "axis": "how", + "property": { + "ref": "dac2aAidType", + "label": "DAC 2a aid type" + }, + "label": "aid type" + }, + "binding": { + "kind": "value", + "value": { + "ref": { + "ref": "DAC2aAidType206", + "label": "official development assistance" + }, + "value_kind": "enum_value" + } + }, + "summable": false + }, + { + "key": { + "axis": "how", + "property": { + "ref": "financialFlowType", + "label": "financial flow type" + }, + "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", + "label": "netting basis" + }, + "label": "netting basis" + }, + "binding": { + "kind": "value", + "value": { + "ref": { + "ref": "Gross", + "label": "gross" + }, + "value_kind": "enum_value" + } + }, + "summable": false + }, + { + "key": { + "axis": "how", + "property": { + "ref": "dacTypeOfFinance", + "label": "DAC type of finance" + }, + "label": "DAC type of finance" + }, + "binding": { + "kind": "unbound" + }, + "summable": false + }, + { + "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": "value", + "value": { + "value_kind": "time_window", + "time_window": { + "start_year": 2022, + "end_year": 2022 + } + } + }, + "summable": false + }, + { + "key": { + "axis": "source", + "label": "data source" + }, + "binding": { + "kind": "unbound" + }, + "summable": false + } + ], + "inapplicable_slots": [ + "dacTypeOfFinance" + ], + "unresolved_slots": [], + "stat_vars": { + "member_count": 1, + "member_count_exact": true, + "served_count": 1, + "data_date_range": { + "start": "2022", + "end": "2022" + } + }, + "entities": [ + { + "ref": "country/KEN", + "label": "Kenya", + "entity_type": "Country", + "role": "destination" + } + ], + "coverage": { + "kind": "exact", + "has_data": true, + "observation_count": 111, + "evidence": "facet_metadata", + "dimensions": [ + { + "label": "sources", + "count": 1 + }, + { + "label": "observations", + "count": 1 + }, + { + "label": "variables", + "count": 1 + } + ], + "window": { + "start_year": 2022, + "end_year": 2022 + } + }, + "headline": { + "year": 2022, + "year_named": true, + "named_window": { + "start_year": 2022, + "end_year": 2022 + }, + "observations": 111, + "series": 111, + "role_counts": { + "financingProvider": 111, + "financingRecipient": 1 + }, + "recent_years": [ + { + "year": 2022, + "observations": 111, + "series": 111, + "role_counts": { + "financingProvider": 111, + "financingRecipient": 1 + } + }, + { + "year": 2021, + "observations": 103, + "series": 103, + "role_counts": { + "financingProvider": 103, + "financingRecipient": 1 + } + }, + { + "year": 2020, + "observations": 97, + "series": 97, + "role_counts": { + "financingProvider": 97, + "financingRecipient": 1 + } + } + ] + }, + "download": { + "rows": 111, + "rows_exact": true, + "series": 111, + "window": { + "start_year": 2022, + "end_year": 2022 + }, + "licence": { + "label": "OECD Terms and Conditions" + } + }, + "coverage_stamp": "e6e717ab8c77e84d010915893ede5809e9ecec67929a07cfafbcc2210edfa1eb", + "facets": { + "provenance": { + "basis": "fallback", + "ref": "provenance/OECDDAC2A", + "label": "OECD DAC2A", + "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/OECDDAC2A", + "account": "provider" + }, + "unit": { + "basis": "fallback", + "ref": "CurrencyUSD", + "label": "US Dollar", + "currency": "USD" + } + }, + "slot_options": [ + { + "key": { + "axis": "how", + "property": { + "ref": "dac2aAidType", + "label": "DAC 2a aid type" + }, + "label": "aid type" + }, + "options": [ + { + "value": { + "ref": { + "ref": "DAC2aAidType218", + "label": "ODA loans and other long-term capital" + }, + "value_kind": "enum_value" + }, + "relation": "child", + "parent": "DAC2aAidType206", + "member_count": 2, + "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": 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_exact": true + }, + { + "value": { + "ref": { + "ref": "DAC2aAidType213", + "label": "developmental food aid" + }, + "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_exact": true + } + ], + "truncated": false, + "source": "observed" + } + ], + "entity_options": [ + { + "role": "origin", + "options": [], + "truncated": true, + "source": "observed" + } + ], + "facet_options": [ + { + "axis": "provenance", + "options": [ + { + "value": { + "ref": { + "ref": "provenance/OECDDAC2A", + "label": "OECD DAC2A" + }, + "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": "Gross disbursements to Kenya from 96 providers for official development assistance in 2022. Current US dollars · OECD DAC2a.", + "sentence_plan": [ + { + "kind": "slot", + "text": "Gross disbursements", + "axis": "what", + "segment": "heading", + "entity_refs": [], + "states": [ + "how:financialFlowType", + "how:nettingBasis", + "axis:populationType", + "axis:measuredProperty" + ] + }, + { + "kind": "text", + "text": " to ", + "segment": "heading", + "entity_refs": [], + "states": [] + }, + { + "kind": "slot", + "text": "Kenya", + "axis": "where", + "segment": "heading", + "role": "destination", + "binding_ref": "where:", + "entity_refs": [ + "country/KEN" + ], + "states": [ + "where:" + ] + }, + { + "kind": "text", + "text": " from ", + "segment": "heading", + "entity_refs": [], + "states": [] + }, + { + "kind": "slot", + "text": "96 providers", + "segment": "heading", + "role": "origin", + "binding_ref": "origin:", + "entity_refs": [], + "states": [ + "origin:" + ] + }, + { + "kind": "text", + "text": " for ", + "segment": "heading", + "entity_refs": [], + "states": [] + }, + { + "kind": "slot", + "text": "official development assistance", + "axis": "how", + "segment": "heading", + "property_dcid": "dac2aAidType", + "binding_ref": "how:dac2aAidType", + "entity_refs": [], + "states": [ + "how:dac2aAidType" + ] + }, + { + "kind": "slot", + "text": "", + "axis": "how", + "segment": "heading", + "property_dcid": "dacTypeOfFinance", + "binding_ref": "how:dacTypeOfFinance", + "entity_refs": [], + "states": [] + }, + { + "kind": "slot", + "text": "", + "axis": "how", + "segment": "heading", + "property_dcid": "financialFlowType", + "binding_ref": "how:financialFlowType", + "entity_refs": [], + "states": [] + }, + { + "kind": "slot", + "text": "", + "axis": "how", + "segment": "heading", + "property_dcid": "nettingBasis", + "binding_ref": "how:nettingBasis", + "entity_refs": [], + "states": [] + }, + { + "kind": "text", + "text": " ", + "segment": "heading", + "entity_refs": [], + "states": [] + }, + { + "kind": "slot", + "text": "in 2022", + "axis": "when", + "segment": "heading", + "binding_ref": "when:", + "entity_refs": [], + "states": [ + "when:" + ] + }, + { + "kind": "text", + "text": ".", + "segment": "heading", + "entity_refs": [], + "states": [] + }, + { + "kind": "text", + "text": " ", + "segment": "byline", + "entity_refs": [], + "states": [] + }, + { + "kind": "slot", + "text": "Current US dollars", + "axis": "unit", + "segment": "byline", + "binding_ref": "unit:", + "entity_refs": [], + "states": [ + "unit:", + "axis:measurementQualifier" + ] + }, + { + "kind": "text", + "text": " · ", + "segment": "byline", + "entity_refs": [], + "states": [] + }, + { + "kind": "slot", + "text": "OECD DAC2a", + "axis": "source", + "segment": "byline", + "entity_refs": [], + "states": [ + "source:" + ] + }, + { + "kind": "text", + "text": ".", + "segment": "byline", + "entity_refs": [], + "states": [] + } + ], + "trace": { + "resolved_entities": [ + { + "ref": "country/KEN", + "label": "Kenya" + } + ], + "resolved_sources": [ + { + "ref": "provenance/OECDDAC2A", + "label": "OECD DAC2a", + "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/OECDDAC2A" + } + ], + "slot_filters": [ + { + "key": { + "axis": "how", + "property": { + "ref": "dac2aAidType", + "label": "DAC 2a aid type" + }, + "label": "aid type" + }, + "binding_kind": "value", + "refs": [ + { + "ref": "DAC2aAidType206", + "label": "official development assistance" + } + ], + "provenance": "binder" + }, + { + "key": { + "axis": "how", + "property": { + "ref": "financialFlowType", + "label": "financial flow type" + }, + "label": "financial flow type" + }, + "binding_kind": "value", + "refs": [ + { + "ref": "Disbursement", + "label": "disbursement" + } + ], + "provenance": "binder" + }, + { + "key": { + "axis": "how", + "property": { + "ref": "nettingBasis", + "label": "netting basis" + }, + "label": "netting basis" + }, + "binding_kind": "value", + "refs": [ + { + "ref": "Gross", + "label": "gross" + } + ], + "provenance": "binder" + }, + { + "key": { + "axis": "how", + "property": { + "ref": "dacTypeOfFinance", + "label": "DAC type of finance" + }, + "label": "DAC type of finance" + }, + "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": "value", + "refs": [], + "provenance": "binder" + }, + { + "key": { + "axis": "source", + "label": "data source" + }, + "binding_kind": "unbound", + "refs": [], + "provenance": "binder" + } + ], + "query_qualifiers": [], + "requested_window": { + "start_year": 2022, + "end_year": 2022 + }, + "capability_version": "cap_765c9d2a0c7529b9" + }, + "confidence": "high", + "available_at_place": true, + "alternative_measures": [ + { + "definition": { + "schema_version": 1, + "spec_id": "spec_e14699f9dcd167f0211081a726ae1031", + "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" + ] + }, + "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", + "measure_label_axes": [ + "populationType", + "measuredProperty", + "measurementQualifier", + "financialFlowType", + "nettingBasis" + ], + "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": "Gross", + "label": "gross" + } + } + ], + "role_axis_facts": [ + { + "role": "origin", + "member_count": 96, + "members_available": true + } + ], + "unit_conversion": { + "currencies": [ + { + "code": "AED", + "noun": "UAE dirhams", + "constant_years": { + "start_year": 2022, + "end_year": 2022 + }, + "base_year_min": 2023, + "base_year_max": 2023, + "current_years": null + }, + { + "code": "AFN", + "noun": "Afghan afghanis", + "current_years": { + "start_year": 2022, + "end_year": 2022 + }, + "constant_years": { + "start_year": 2022, + "end_year": 2022 + }, + "base_year_min": 2002, + "base_year_max": 2025 + }, + { + "code": "ALL", + "noun": "Albanian leks", + "current_years": { + "start_year": 2022, + "end_year": 2022 + }, + "constant_years": { + "start_year": 2022, + "end_year": 2022 + }, + "base_year_min": 1980, + "base_year_max": 2025 + }, + { + "code": "AMD", + "noun": "Armenian drams", + "current_years": { + "start_year": 2022, + "end_year": 2022 + }, + "constant_years": { + "start_year": 2022, + "end_year": 2022 + }, + "base_year_min": 1992, + "base_year_max": 2025 + }, + { + "code": "AOA", + "noun": "Angolan kwanzas", + "current_years": { + "start_year": 2022, + "end_year": 2022 + }, + "constant_years": { + "start_year": 2022, + "end_year": 2022 + }, + "base_year_min": 1991, + "base_year_max": 2025 + }, + { + "code": "ARS", + "noun": "Argentine pesos", + "current_years": { + "start_year": 2022, + "end_year": 2022 + }, + "constant_years": { + "start_year": 2022, + "end_year": 2022 + }, + "base_year_min": 1980, + "base_year_max": 2025 + }, + { + "code": "AUD", + "noun": "Australian dollars", + "current_years": { + "start_year": 2022, + "end_year": 2022 + }, + "constant_years": { + "start_year": 2022, + "end_year": 2022 + }, + "base_year_min": 1960, + "base_year_max": 2025 + }, + { + "code": "AWG", + "noun": "Aruban florins", + "current_years": { + "start_year": 2022, + "end_year": 2022 + }, + "constant_years": { + "start_year": 2022, + "end_year": 2022 + }, + "base_year_min": 1995, + "base_year_max": 2025 + }, + { + "code": "AZN", + "noun": "Azerbaijani manats", + "constant_years": { + "start_year": 2022, + "end_year": 2022 + }, + "base_year_min": 2023, + "base_year_max": 2023, + "current_years": null + }, + { + "code": "BAM", + "noun": "Bosnia-Herzegovina convertible marks", + "current_years": { + "start_year": 2022, + "end_year": 2022 + }, + "constant_years": { + "start_year": 2022, + "end_year": 2022 + }, + "base_year_min": 1996, + "base_year_max": 2025 + }, + { + "code": "BBD", + "noun": "Barbadian dollars", + "current_years": { + "start_year": 2022, + "end_year": 2022 + }, + "constant_years": { + "start_year": 2022, + "end_year": 2022 + }, + "base_year_min": 1980, + "base_year_max": 2025 + }, + { + "code": "BDT", + "noun": "Bangladeshi taka", + "current_years": { + "start_year": 2022, + "end_year": 2022 + }, + "constant_years": { + "start_year": 2022, + "end_year": 2022 + }, + "base_year_min": 1980, + "base_year_max": 2025 + }, + { + "code": "BHD", + "noun": "Bahraini dinars", + "current_years": { + "start_year": 2022, + "end_year": 2022 + }, + "constant_years": { + "start_year": 2022, + "end_year": 2022 + }, + "base_year_min": 1980, + "base_year_max": 2025 + }, + { + "code": "BIF", + "noun": "Burundian francs", + "current_years": { + "start_year": 2022, + "end_year": 2022 + }, + "constant_years": { + "start_year": 2022, + "end_year": 2022 + }, + "base_year_min": 1980, + "base_year_max": 2025 + }, + { + "code": "BND", + "noun": "Brunei dollars", + "current_years": { + "start_year": 2022, + "end_year": 2022 + }, + "constant_years": { + "start_year": 2022, + "end_year": 2022 + }, + "base_year_min": 1985, + "base_year_max": 2025 + }, + { + "code": "BOB", + "noun": "Bolivian bolivianos", + "current_years": { + "start_year": 2022, + "end_year": 2022 + }, + "constant_years": { + "start_year": 2022, + "end_year": 2022 + }, + "base_year_min": 1980, + "base_year_max": 2025 + }, + { + "code": "BRL", + "noun": "Brazilian reais", + "current_years": { + "start_year": 2022, + "end_year": 2022 + }, + "constant_years": { + "start_year": 2022, + "end_year": 2022 + }, + "base_year_min": 1986, + "base_year_max": 2025 + }, + { + "code": "BSD", + "noun": "Bahamian dollars", + "current_years": { + "start_year": 2022, + "end_year": 2022 + }, + "constant_years": { + "start_year": 2022, + "end_year": 2022 + }, + "base_year_min": 1980, + "base_year_max": 2025 + }, + { + "code": "BTN", + "noun": "Bhutanese ngultrums", + "current_years": { + "start_year": 2022, + "end_year": 2022 + }, + "constant_years": { + "start_year": 2022, + "end_year": 2022 + }, + "base_year_min": 1980, + "base_year_max": 2025 + }, + { + "code": "BWP", + "noun": "Botswana pula", + "current_years": { + "start_year": 2022, + "end_year": 2022 + }, + "constant_years": { + "start_year": 2022, + "end_year": 2022 + }, + "base_year_min": 1980, + "base_year_max": 2025 + }, + { + "code": "BYN", + "noun": "Belarusian rubles", + "current_years": { + "start_year": 2022, + "end_year": 2022 + }, + "constant_years": { + "start_year": 2022, + "end_year": 2022 + }, + "base_year_min": 1992, + "base_year_max": 2025 + }, + { + "code": "BZD", + "noun": "Belize dollars", + "current_years": { + "start_year": 2022, + "end_year": 2022 + }, + "constant_years": { + "start_year": 2022, + "end_year": 2022 + }, + "base_year_min": 1980, + "base_year_max": 2025 + }, + { + "code": "CAD", + "noun": "Canadian dollars", + "current_years": { + "start_year": 2022, + "end_year": 2022 + }, + "constant_years": { + "start_year": 2022, + "end_year": 2022 + }, + "base_year_min": 1960, + "base_year_max": 2025 + }, + { + "code": "CDF", + "noun": "Congolese francs", + "current_years": { + "start_year": 2022, + "end_year": 2022 + }, + "constant_years": { + "start_year": 2022, + "end_year": 2022 + }, + "base_year_min": 1991, + "base_year_max": 2025 + }, + { + "code": "CHF", + "noun": "Swiss francs", + "current_years": { + "start_year": 2022, + "end_year": 2022 + }, + "constant_years": { + "start_year": 2022, + "end_year": 2022 + }, + "base_year_min": 1960, + "base_year_max": 2025 + }, + { + "code": "CLP", + "noun": "Chilean pesos", + "current_years": { + "start_year": 2022, + "end_year": 2022 + }, + "constant_years": { + "start_year": 2022, + "end_year": 2022 + }, + "base_year_min": 1980, + "base_year_max": 2025 + }, + { + "code": "CNY", + "noun": "Chinese yuan", + "current_years": { + "start_year": 2022, + "end_year": 2022 + }, + "constant_years": { + "start_year": 2022, + "end_year": 2022 + }, + "base_year_min": 1980, + "base_year_max": 2025 + }, + { + "code": "COP", + "noun": "Colombian pesos", + "current_years": { + "start_year": 2022, + "end_year": 2022 + }, + "constant_years": { + "start_year": 2022, + "end_year": 2022 + }, + "base_year_min": 1980, + "base_year_max": 2025 + }, + { + "code": "CRC", + "noun": "Costa Rican colones", + "current_years": { + "start_year": 2022, + "end_year": 2022 + }, + "constant_years": { + "start_year": 2022, + "end_year": 2022 + }, + "base_year_min": 1980, + "base_year_max": 2025 + }, + { + "code": "CVE", + "noun": "Cape Verdean escudos", + "current_years": { + "start_year": 2022, + "end_year": 2022 + }, + "constant_years": { + "start_year": 2022, + "end_year": 2022 + }, + "base_year_min": 1980, + "base_year_max": 2025 + }, + { + "code": "CZK", + "noun": "Czech korunas", + "current_years": { + "start_year": 2022, + "end_year": 2022 + }, + "constant_years": { + "start_year": 2022, + "end_year": 2022 + }, + "base_year_min": 1998, + "base_year_max": 2025 + }, + { + "code": "DJF", + "noun": "Djiboutian francs", + "current_years": { + "start_year": 2022, + "end_year": 2022 + }, + "constant_years": { + "start_year": 2022, + "end_year": 2022 + }, + "base_year_min": 1990, + "base_year_max": 2025 + }, + { + "code": "DKK", + "noun": "Danish kroner", + "current_years": { + "start_year": 2022, + "end_year": 2022 + }, + "constant_years": { + "start_year": 2022, + "end_year": 2022 + }, + "base_year_min": 1960, + "base_year_max": 2025 + }, + { + "code": "DOP", + "noun": "Dominican pesos", + "current_years": { + "start_year": 2022, + "end_year": 2022 + }, + "constant_years": { + "start_year": 2022, + "end_year": 2022 + }, + "base_year_min": 1980, + "base_year_max": 2025 + }, + { + "code": "DZD", + "noun": "Algerian dinars", + "current_years": { + "start_year": 2022, + "end_year": 2022 + }, + "constant_years": { + "start_year": 2022, + "end_year": 2022 + }, + "base_year_min": 1980, + "base_year_max": 2025 + }, + { + "code": "EGP", + "noun": "Egyptian pounds", + "current_years": { + "start_year": 2022, + "end_year": 2022 + }, + "constant_years": { + "start_year": 2022, + "end_year": 2022 + }, + "base_year_min": 1980, + "base_year_max": 2025 + }, + { + "code": "ERN", + "noun": "Eritrean nakfas", + "constant_years": { + "start_year": 2022, + "end_year": 2022 + }, + "base_year_min": 1992, + "base_year_max": 2019, + "current_years": null + }, + { + "code": "ETB", + "noun": "Ethiopian birr", + "current_years": { + "start_year": 2022, + "end_year": 2022 + }, + "constant_years": { + "start_year": 2022, + "end_year": 2022 + }, + "base_year_min": 1980, + "base_year_max": 2025 + }, + { + "code": "EUR", + "noun": "euros", + "current_years": { + "start_year": 2022, + "end_year": 2022 + }, + "constant_years": { + "start_year": 2022, + "end_year": 2022 + }, + "base_year_min": 1973, + "base_year_max": 2025 + }, + { + "code": "FJD", + "noun": "Fijian dollars", + "current_years": { + "start_year": 2022, + "end_year": 2022 + }, + "constant_years": { + "start_year": 2022, + "end_year": 2022 + }, + "base_year_min": 1980, + "base_year_max": 2025 + }, + { + "code": "GBP", + "noun": "British pounds", + "current_years": { + "start_year": 2022, + "end_year": 2022 + }, + "constant_years": { + "start_year": 2022, + "end_year": 2022 + }, + "base_year_min": 1960, + "base_year_max": 2025 + }, + { + "code": "GEL", + "noun": "Georgian lari", + "current_years": { + "start_year": 2022, + "end_year": 2022 + }, + "constant_years": { + "start_year": 2022, + "end_year": 2022 + }, + "base_year_min": 1994, + "base_year_max": 2025 + }, + { + "code": "GHS", + "noun": "Ghanaian cedis", + "current_years": { + "start_year": 2022, + "end_year": 2022 + }, + "constant_years": { + "start_year": 2022, + "end_year": 2022 + }, + "base_year_min": 1980, + "base_year_max": 2025 + }, + { + "code": "GMD", + "noun": "Gambian dalasis", + "current_years": { + "start_year": 2022, + "end_year": 2022 + }, + "constant_years": { + "start_year": 2022, + "end_year": 2022 + }, + "base_year_min": 1980, + "base_year_max": 2025 + }, + { + "code": "GNF", + "noun": "Guinean francs", + "current_years": { + "start_year": 2022, + "end_year": 2022 + }, + "constant_years": { + "start_year": 2022, + "end_year": 2022 + }, + "base_year_min": 1980, + "base_year_max": 2025 + }, + { + "code": "GTQ", + "noun": "Guatemalan quetzales", + "current_years": { + "start_year": 2022, + "end_year": 2022 + }, + "constant_years": { + "start_year": 2022, + "end_year": 2022 + }, + "base_year_min": 1980, + "base_year_max": 2025 + }, + { + "code": "GYD", + "noun": "Guyanese dollars", + "current_years": { + "start_year": 2022, + "end_year": 2022 + }, + "constant_years": { + "start_year": 2022, + "end_year": 2022 + }, + "base_year_min": 1980, + "base_year_max": 2025 + }, + { + "code": "HKD", + "noun": "Hong Kong dollars", + "current_years": { + "start_year": 2022, + "end_year": 2022 + }, + "constant_years": { + "start_year": 2022, + "end_year": 2022 + }, + "base_year_min": 1980, + "base_year_max": 2025 + }, + { + "code": "HNL", + "noun": "Honduran lempiras", + "current_years": { + "start_year": 2022, + "end_year": 2022 + }, + "constant_years": { + "start_year": 2022, + "end_year": 2022 + }, + "base_year_min": 1980, + "base_year_max": 2025 + }, + { + "code": "HTG", + "noun": "Haitian gourdes", + "current_years": { + "start_year": 2022, + "end_year": 2022 + }, + "constant_years": { + "start_year": 2022, + "end_year": 2022 + }, + "base_year_min": 1980, + "base_year_max": 2025 + }, + { + "code": "HUF", + "noun": "Hungarian forints", + "current_years": { + "start_year": 2022, + "end_year": 2022 + }, + "constant_years": { + "start_year": 2022, + "end_year": 2022 + }, + "base_year_min": 2003, + "base_year_max": 2025 + }, + { + "code": "IDR", + "noun": "Indonesian rupiahs", + "current_years": { + "start_year": 2022, + "end_year": 2022 + }, + "constant_years": { + "start_year": 2022, + "end_year": 2022 + }, + "base_year_min": 1980, + "base_year_max": 2025 + }, + { + "code": "ILS", + "noun": "Israeli new shekels", + "current_years": { + "start_year": 2022, + "end_year": 2022 + }, + "constant_years": { + "start_year": 2022, + "end_year": 2022 + }, + "base_year_min": 1997, + "base_year_max": 2025 + }, + { + "code": "INR", + "noun": "Indian rupees", + "current_years": { + "start_year": 2022, + "end_year": 2022 + }, + "constant_years": { + "start_year": 2022, + "end_year": 2022 + }, + "base_year_min": 1980, + "base_year_max": 2025 + }, + { + "code": "IQD", + "noun": "Iraqi dinars", + "current_years": { + "start_year": 2022, + "end_year": 2022 + }, + "constant_years": { + "start_year": 2022, + "end_year": 2022 + }, + "base_year_min": 2000, + "base_year_max": 2025 + }, + { + "code": "IRR", + "noun": "Iranian rials", + "current_years": { + "start_year": 2022, + "end_year": 2022 + }, + "constant_years": { + "start_year": 2022, + "end_year": 2022 + }, + "base_year_min": 1980, + "base_year_max": 2025 + }, + { + "code": "ISK", + "noun": "Icelandic krónur", + "current_years": { + "start_year": 2022, + "end_year": 2022 + }, + "constant_years": { + "start_year": 2022, + "end_year": 2022 + }, + "base_year_min": 1997, + "base_year_max": 2025 + }, + { + "code": "JMD", + "noun": "Jamaican dollars", + "current_years": { + "start_year": 2022, + "end_year": 2022 + }, + "constant_years": { + "start_year": 2022, + "end_year": 2022 + }, + "base_year_min": 1980, + "base_year_max": 2025 + }, + { + "code": "JOD", + "noun": "Jordanian dinars", + "current_years": { + "start_year": 2022, + "end_year": 2022 + }, + "constant_years": { + "start_year": 2022, + "end_year": 2022 + }, + "base_year_min": 1980, + "base_year_max": 2025 + }, + { + "code": "JPY", + "noun": "Japanese yen", + "current_years": { + "start_year": 2022, + "end_year": 2022 + }, + "constant_years": { + "start_year": 2022, + "end_year": 2022 + }, + "base_year_min": 1960, + "base_year_max": 2025 + }, + { + "code": "KES", + "noun": "Kenyan shillings", + "current_years": { + "start_year": 2022, + "end_year": 2022 + }, + "constant_years": { + "start_year": 2022, + "end_year": 2022 + }, + "base_year_min": 1980, + "base_year_max": 2025 + }, + { + "code": "KGS", + "noun": "Kyrgyz soms", + "current_years": { + "start_year": 2022, + "end_year": 2022 + }, + "constant_years": { + "start_year": 2022, + "end_year": 2022 + }, + "base_year_min": 1992, + "base_year_max": 2025 + }, + { + "code": "KHR", + "noun": "Cambodian riels", + "current_years": { + "start_year": 2022, + "end_year": 2022 + }, + "constant_years": { + "start_year": 2022, + "end_year": 2022 + }, + "base_year_min": 1986, + "base_year_max": 2025 + }, + { + "code": "KMF", + "noun": "Comorian francs", + "current_years": { + "start_year": 2022, + "end_year": 2022 + }, + "constant_years": { + "start_year": 2022, + "end_year": 2022 + }, + "base_year_min": 1980, + "base_year_max": 2025 + }, + { + "code": "KRW", + "noun": "South Korean won", + "current_years": { + "start_year": 2022, + "end_year": 2022 + }, + "constant_years": { + "start_year": 2022, + "end_year": 2022 + }, + "base_year_min": 1987, + "base_year_max": 2025 + }, + { + "code": "KWD", + "noun": "Kuwaiti dinars", + "current_years": { + "start_year": 2022, + "end_year": 2022 + }, + "constant_years": { + "start_year": 2022, + "end_year": 2022 + }, + "base_year_min": 1995, + "base_year_max": 2024 + }, + { + "code": "KZT", + "noun": "Kazakh tenge", + "current_years": { + "start_year": 2022, + "end_year": 2022 + }, + "constant_years": { + "start_year": 2022, + "end_year": 2022 + }, + "base_year_min": 2013, + "base_year_max": 2024 + }, + { + "code": "LAK", + "noun": "Lao kip", + "current_years": { + "start_year": 2022, + "end_year": 2022 + }, + "constant_years": { + "start_year": 2022, + "end_year": 2022 + }, + "base_year_min": 1980, + "base_year_max": 2025 + }, + { + "code": "LBP", + "noun": "Lebanese pounds", + "current_years": { + "start_year": 2022, + "end_year": 2022 + }, + "constant_years": { + "start_year": 2022, + "end_year": 2022 + }, + "base_year_min": 1980, + "base_year_max": 2025 + }, + { + "code": "LKR", + "noun": "Sri Lankan rupees", + "current_years": { + "start_year": 2022, + "end_year": 2022 + }, + "constant_years": { + "start_year": 2022, + "end_year": 2022 + }, + "base_year_min": 1980, + "base_year_max": 2024 + }, + { + "code": "LSL", + "noun": "Lesotho maloti", + "current_years": { + "start_year": 2022, + "end_year": 2022 + }, + "constant_years": { + "start_year": 2022, + "end_year": 2022 + }, + "base_year_min": 1980, + "base_year_max": 2025 + }, + { + "code": "LYD", + "noun": "Libyan dinars", + "current_years": { + "start_year": 2022, + "end_year": 2022 + }, + "constant_years": { + "start_year": 2022, + "end_year": 2022 + }, + "base_year_min": 1980, + "base_year_max": 2025 + }, + { + "code": "MAD", + "noun": "Moroccan dirhams", + "current_years": { + "start_year": 2022, + "end_year": 2022 + }, + "constant_years": { + "start_year": 2022, + "end_year": 2022 + }, + "base_year_min": 1980, + "base_year_max": 2025 + }, + { + "code": "MDL", + "noun": "Moldovan lei", + "current_years": { + "start_year": 2022, + "end_year": 2022 + }, + "constant_years": { + "start_year": 2022, + "end_year": 2022 + }, + "base_year_min": 1992, + "base_year_max": 2025 + }, + { + "code": "MGA", + "noun": "Malagasy ariary", + "current_years": { + "start_year": 2022, + "end_year": 2022 + }, + "constant_years": { + "start_year": 2022, + "end_year": 2022 + }, + "base_year_min": 1980, + "base_year_max": 2025 + }, + { + "code": "MKD", + "noun": "Macedonian denars", + "current_years": { + "start_year": 2022, + "end_year": 2022 + }, + "constant_years": { + "start_year": 2022, + "end_year": 2022 + }, + "base_year_min": 1992, + "base_year_max": 2025 + }, + { + "code": "MMK", + "noun": "Myanmar kyats", + "current_years": { + "start_year": 2022, + "end_year": 2022 + }, + "constant_years": { + "start_year": 2022, + "end_year": 2022 + }, + "base_year_min": 1998, + "base_year_max": 2025 + }, + { + "code": "MNT", + "noun": "Mongolian tugriks", + "current_years": { + "start_year": 2022, + "end_year": 2022 + }, + "constant_years": { + "start_year": 2022, + "end_year": 2022 + }, + "base_year_min": 1980, + "base_year_max": 2025 + }, + { + "code": "MOP", + "noun": "Macanese patacas", + "current_years": { + "start_year": 2022, + "end_year": 2022 + }, + "constant_years": { + "start_year": 2022, + "end_year": 2022 + }, + "base_year_min": 2001, + "base_year_max": 2025 + }, + { + "code": "MRU", + "noun": "Mauritanian ouguiyas", + "current_years": { + "start_year": 2022, + "end_year": 2022 + }, + "constant_years": { + "start_year": 2022, + "end_year": 2022 + }, + "base_year_min": 1990, + "base_year_max": 2025 + }, + { + "code": "MUR", + "noun": "Mauritian rupees", + "current_years": { + "start_year": 2022, + "end_year": 2022 + }, + "constant_years": { + "start_year": 2022, + "end_year": 2022 + }, + "base_year_min": 1980, + "base_year_max": 2025 + }, + { + "code": "MVR", + "noun": "Maldivian rufiyaa", + "current_years": { + "start_year": 2022, + "end_year": 2022 + }, + "constant_years": { + "start_year": 2022, + "end_year": 2022 + }, + "base_year_min": 1980, + "base_year_max": 2025 + }, + { + "code": "MWK", + "noun": "Malawian kwachas", + "current_years": { + "start_year": 2022, + "end_year": 2022 + }, + "constant_years": { + "start_year": 2022, + "end_year": 2022 + }, + "base_year_min": 1980, + "base_year_max": 2025 + }, + { + "code": "MXN", + "noun": "Mexican pesos", + "current_years": { + "start_year": 2022, + "end_year": 2022 + }, + "constant_years": { + "start_year": 2022, + "end_year": 2022 + }, + "base_year_min": 1980, + "base_year_max": 2025 + }, + { + "code": "MYR", + "noun": "Malaysian ringgits", + "current_years": { + "start_year": 2022, + "end_year": 2022 + }, + "constant_years": { + "start_year": 2022, + "end_year": 2022 + }, + "base_year_min": 1980, + "base_year_max": 2025 + }, + { + "code": "MZN", + "noun": "Mozambican meticais", + "current_years": { + "start_year": 2022, + "end_year": 2022 + }, + "constant_years": { + "start_year": 2022, + "end_year": 2022 + }, + "base_year_min": 1980, + "base_year_max": 2025 + }, + { + "code": "NAD", + "noun": "Namibian dollars", + "current_years": { + "start_year": 2022, + "end_year": 2022 + }, + "constant_years": { + "start_year": 2022, + "end_year": 2022 + }, + "base_year_min": 1989, + "base_year_max": 2025 + }, + { + "code": "NGN", + "noun": "Nigerian naira", + "current_years": { + "start_year": 2022, + "end_year": 2022 + }, + "constant_years": { + "start_year": 2022, + "end_year": 2022 + }, + "base_year_min": 1990, + "base_year_max": 2025 + }, + { + "code": "NIO", + "noun": "Nicaraguan córdobas", + "current_years": { + "start_year": 2022, + "end_year": 2022 + }, + "constant_years": { + "start_year": 2022, + "end_year": 2022 + }, + "base_year_min": 1987, + "base_year_max": 2025 + }, + { + "code": "NOK", + "noun": "Norwegian kroner", + "current_years": { + "start_year": 2022, + "end_year": 2022 + }, + "constant_years": { + "start_year": 2022, + "end_year": 2022 + }, + "base_year_min": 1960, + "base_year_max": 2025 + }, + { + "code": "NPR", + "noun": "Nepalese rupees", + "current_years": { + "start_year": 2022, + "end_year": 2022 + }, + "constant_years": { + "start_year": 2022, + "end_year": 2022 + }, + "base_year_min": 1980, + "base_year_max": 2025 + }, + { + "code": "NZD", + "noun": "New Zealand dollars", + "current_years": { + "start_year": 2022, + "end_year": 2022 + }, + "constant_years": { + "start_year": 2022, + "end_year": 2022 + }, + "base_year_min": 1961, + "base_year_max": 2025 + }, + { + "code": "OMR", + "noun": "Omani rials", + "current_years": { + "start_year": 2022, + "end_year": 2022 + }, + "constant_years": { + "start_year": 2022, + "end_year": 2022 + }, + "base_year_min": 1980, + "base_year_max": 2025 + }, + { + "code": "PEN", + "noun": "Peruvian soles", + "current_years": { + "start_year": 2022, + "end_year": 2022 + }, + "constant_years": { + "start_year": 2022, + "end_year": 2022 + }, + "base_year_min": 1980, + "base_year_max": 2025 + }, + { + "code": "PGK", + "noun": "Papua New Guinean kina", + "current_years": { + "start_year": 2022, + "end_year": 2022 + }, + "constant_years": { + "start_year": 2022, + "end_year": 2022 + }, + "base_year_min": 1980, + "base_year_max": 2025 + }, + { + "code": "PHP", + "noun": "Philippine pesos", + "current_years": { + "start_year": 2022, + "end_year": 2022 + }, + "constant_years": { + "start_year": 2022, + "end_year": 2022 + }, + "base_year_min": 1980, + "base_year_max": 2025 + }, + { + "code": "PKR", + "noun": "Pakistani rupees", + "current_years": { + "start_year": 2022, + "end_year": 2022 + }, + "constant_years": { + "start_year": 2022, + "end_year": 2022 + }, + "base_year_min": 1980, + "base_year_max": 2025 + }, + { + "code": "PLN", + "noun": "Polish zlotys", + "current_years": { + "start_year": 2022, + "end_year": 2022 + }, + "constant_years": { + "start_year": 2022, + "end_year": 2022 + }, + "base_year_min": 1998, + "base_year_max": 2025 + }, + { + "code": "PYG", + "noun": "Paraguayan guaranís", + "current_years": { + "start_year": 2022, + "end_year": 2022 + }, + "constant_years": { + "start_year": 2022, + "end_year": 2022 + }, + "base_year_min": 1980, + "base_year_max": 2025 + }, + { + "code": "QAR", + "noun": "Qatari riyals", + "constant_years": { + "start_year": 2022, + "end_year": 2022 + }, + "base_year_min": 2023, + "base_year_max": 2023, + "current_years": null + }, + { + "code": "RON", + "noun": "Romanian lei", + "current_years": { + "start_year": 2022, + "end_year": 2022 + }, + "constant_years": { + "start_year": 2022, + "end_year": 2022 + }, + "base_year_min": 2013, + "base_year_max": 2025 + }, + { + "code": "RSD", + "noun": "Serbian dinars", + "current_years": { + "start_year": 2022, + "end_year": 2022 + }, + "constant_years": { + "start_year": 2022, + "end_year": 2022 + }, + "base_year_min": 1997, + "base_year_max": 2025 + }, + { + "code": "RUB", + "noun": "Russian rubles", + "constant_years": { + "start_year": 2022, + "end_year": 2022 + }, + "base_year_min": 2010, + "base_year_max": 2020, + "current_years": null + }, + { + "code": "RWF", + "noun": "Rwandan francs", + "current_years": { + "start_year": 2022, + "end_year": 2022 + }, + "constant_years": { + "start_year": 2022, + "end_year": 2022 + }, + "base_year_min": 1980, + "base_year_max": 2025 + }, + { + "code": "SAR", + "noun": "Saudi riyals", + "current_years": { + "start_year": 2022, + "end_year": 2022 + }, + "constant_years": { + "start_year": 2022, + "end_year": 2022 + }, + "base_year_min": 2000, + "base_year_max": 2023 + }, + { + "code": "SBD", + "noun": "Solomon Islands dollars", + "current_years": { + "start_year": 2022, + "end_year": 2022 + }, + "constant_years": { + "start_year": 2022, + "end_year": 2022 + }, + "base_year_min": 1980, + "base_year_max": 2025 + }, + { + "code": "SCR", + "noun": "Seychellois rupees", + "current_years": { + "start_year": 2022, + "end_year": 2022 + }, + "constant_years": { + "start_year": 2022, + "end_year": 2022 + }, + "base_year_min": 1980, + "base_year_max": 2025 + }, + { + "code": "SDG", + "noun": "Sudanese pounds", + "current_years": { + "start_year": 2022, + "end_year": 2022 + }, + "constant_years": { + "start_year": 2022, + "end_year": 2022 + }, + "base_year_min": 1980, + "base_year_max": 2025 + }, + { + "code": "SEK", + "noun": "Swedish kronor", + "current_years": { + "start_year": 2022, + "end_year": 2022 + }, + "constant_years": { + "start_year": 2022, + "end_year": 2022 + }, + "base_year_min": 1960, + "base_year_max": 2025 + }, + { + "code": "SGD", + "noun": "Singapore dollars", + "current_years": { + "start_year": 2022, + "end_year": 2022 + }, + "constant_years": { + "start_year": 2022, + "end_year": 2022 + }, + "base_year_min": 1980, + "base_year_max": 2025 + }, + { + "code": "SLE", + "noun": "Sierra Leonean leones", + "current_years": { + "start_year": 2022, + "end_year": 2022 + }, + "constant_years": { + "start_year": 2022, + "end_year": 2022 + }, + "base_year_min": 1980, + "base_year_max": 2025 + }, + { + "code": "SRD", + "noun": "Surinamese dollars", + "current_years": { + "start_year": 2022, + "end_year": 2022 + }, + "constant_years": { + "start_year": 2022, + "end_year": 2022 + }, + "base_year_min": 1980, + "base_year_max": 2025 + }, + { + "code": "SSP", + "noun": "South Sudanese pounds", + "current_years": { + "start_year": 2022, + "end_year": 2022 + }, + "constant_years": { + "start_year": 2022, + "end_year": 2022 + }, + "base_year_min": 2011, + "base_year_max": 2025 + }, + { + "code": "STN", + "noun": "São Tomé and Príncipe dobras", + "current_years": { + "start_year": 2022, + "end_year": 2022 + }, + "constant_years": { + "start_year": 2022, + "end_year": 2022 + }, + "base_year_min": 1980, + "base_year_max": 2025 + }, + { + "code": "SYP", + "noun": "Syrian pounds", + "constant_years": { + "start_year": 2022, + "end_year": 2022 + }, + "base_year_min": 1980, + "base_year_max": 2010, + "current_years": null + }, + { + "code": "SZL", + "noun": "Swazi emalangeni", + "current_years": { + "start_year": 2022, + "end_year": 2022 + }, + "constant_years": { + "start_year": 2022, + "end_year": 2022 + }, + "base_year_min": 1980, + "base_year_max": 2025 + }, + { + "code": "THB", + "noun": "Thai baht", + "current_years": { + "start_year": 2022, + "end_year": 2022 + }, + "constant_years": { + "start_year": 2022, + "end_year": 2022 + }, + "base_year_min": 2018, + "base_year_max": 2024 + }, + { + "code": "TJS", + "noun": "Tajikistani somonis", + "current_years": { + "start_year": 2022, + "end_year": 2022 + }, + "constant_years": { + "start_year": 2022, + "end_year": 2022 + }, + "base_year_min": 1992, + "base_year_max": 2025 + }, + { + "code": "TMT", + "noun": "Turkmenistani manat", + "current_years": { + "start_year": 2022, + "end_year": 2022 + }, + "constant_years": { + "start_year": 2022, + "end_year": 2022 + }, + "base_year_min": 1992, + "base_year_max": 2025 + }, + { + "code": "TND", + "noun": "Tunisian dinars", + "current_years": { + "start_year": 2022, + "end_year": 2022 + }, + "constant_years": { + "start_year": 2022, + "end_year": 2022 + }, + "base_year_min": 1980, + "base_year_max": 2025 + }, + { + "code": "TOP", + "noun": "Tongan paʻanga", + "current_years": { + "start_year": 2022, + "end_year": 2022 + }, + "constant_years": { + "start_year": 2022, + "end_year": 2022 + }, + "base_year_min": 1980, + "base_year_max": 2025 + }, + { + "code": "TRY", + "noun": "Turkish lira", + "current_years": { + "start_year": 2022, + "end_year": 2022 + }, + "constant_years": { + "start_year": 2022, + "end_year": 2022 + }, + "base_year_min": 1990, + "base_year_max": 2025 + }, + { + "code": "TTD", + "noun": "Trinidad and Tobago dollars", + "current_years": { + "start_year": 2022, + "end_year": 2022 + }, + "constant_years": { + "start_year": 2022, + "end_year": 2022 + }, + "base_year_min": 1980, + "base_year_max": 2025 + }, + { + "code": "TWD", + "noun": "New Taiwan dollars", + "constant_years": { + "start_year": 2022, + "end_year": 2022 + }, + "base_year_min": 2023, + "base_year_max": 2025, + "current_years": null + }, + { + "code": "TZS", + "noun": "Tanzanian shillings", + "current_years": { + "start_year": 2022, + "end_year": 2022 + }, + "constant_years": { + "start_year": 2022, + "end_year": 2022 + }, + "base_year_min": 1980, + "base_year_max": 2025 + }, + { + "code": "UAH", + "noun": "Ukrainian hryvnias", + "current_years": { + "start_year": 2022, + "end_year": 2022 + }, + "constant_years": { + "start_year": 2022, + "end_year": 2022 + }, + "base_year_min": 1991, + "base_year_max": 2025 + }, + { + "code": "UGX", + "noun": "Ugandan shillings", + "current_years": { + "start_year": 2022, + "end_year": 2022 + }, + "constant_years": { + "start_year": 2022, + "end_year": 2022 + }, + "base_year_min": 1980, + "base_year_max": 2025 + }, + { + "code": "USD", + "noun": "US dollars", + "current_years": { + "start_year": 2022, + "end_year": 2022 + }, + "constant_years": { + "start_year": 2022, + "end_year": 2022 + }, + "base_year_min": 1960, + "base_year_max": 2025 + }, + { + "code": "UYU", + "noun": "Uruguayan pesos", + "current_years": { + "start_year": 2022, + "end_year": 2022 + }, + "constant_years": { + "start_year": 2022, + "end_year": 2022 + }, + "base_year_min": 1980, + "base_year_max": 2025 + }, + { + "code": "UZS", + "noun": "Uzbekistani soms", + "current_years": { + "start_year": 2022, + "end_year": 2022 + }, + "constant_years": { + "start_year": 2022, + "end_year": 2022 + }, + "base_year_min": 1992, + "base_year_max": 2025 + }, + { + "code": "VES", + "noun": "Venezuelan bolívares", + "current_years": { + "start_year": 2022, + "end_year": 2022 + }, + "constant_years": { + "start_year": 2022, + "end_year": 2022 + }, + "base_year_min": 2017, + "base_year_max": 2025 + }, + { + "code": "VND", + "noun": "Vietnamese dong", + "current_years": { + "start_year": 2022, + "end_year": 2022 + }, + "constant_years": { + "start_year": 2022, + "end_year": 2022 + }, + "base_year_min": 1980, + "base_year_max": 2025 + }, + { + "code": "VUV", + "noun": "Vanuatu vatu", + "current_years": { + "start_year": 2022, + "end_year": 2022 + }, + "constant_years": { + "start_year": 2022, + "end_year": 2022 + }, + "base_year_min": 1980, + "base_year_max": 2025 + }, + { + "code": "WST", + "noun": "Samoan tala", + "current_years": { + "start_year": 2022, + "end_year": 2022 + }, + "constant_years": { + "start_year": 2022, + "end_year": 2022 + }, + "base_year_min": 1980, + "base_year_max": 2025 + }, + { + "code": "XAF", + "noun": "Central African CFA francs", + "current_years": { + "start_year": 2022, + "end_year": 2022 + }, + "constant_years": { + "start_year": 2022, + "end_year": 2022 + }, + "base_year_min": 1980, + "base_year_max": 2025 + }, + { + "code": "XCD", + "noun": "East Caribbean dollars", + "current_years": { + "start_year": 2022, + "end_year": 2022 + }, + "constant_years": { + "start_year": 2022, + "end_year": 2022 + }, + "base_year_min": 1980, + "base_year_max": 2025 + }, + { + "code": "XOF", + "noun": "West African CFA francs", + "current_years": { + "start_year": 2022, + "end_year": 2022 + }, + "constant_years": { + "start_year": 2022, + "end_year": 2022 + }, + "base_year_min": 1980, + "base_year_max": 2025 + }, + { + "code": "YER", + "noun": "Yemeni rials", + "current_years": { + "start_year": 2022, + "end_year": 2022 + }, + "constant_years": { + "start_year": 2022, + "end_year": 2022 + }, + "base_year_min": 2014, + "base_year_max": 2025 + }, + { + "code": "ZAR", + "noun": "South African rand", + "current_years": { + "start_year": 2022, + "end_year": 2022 + }, + "constant_years": { + "start_year": 2022, + "end_year": 2022 + }, + "base_year_min": 1980, + "base_year_max": 2025 + }, + { + "code": "ZMW", + "noun": "Zambian kwachas", + "current_years": { + "start_year": 2022, + "end_year": 2022 + }, + "constant_years": { + "start_year": 2022, + "end_year": 2022 + }, + "base_year_min": 1980, + "base_year_max": 2025 + } + ], + "default_base_year": 2024, + "role_currencies": { + "destination": "KES" + } + } + } + } + } + ], + "rendered_sentence": "Gross 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", + "axis": "what", + "segment": "heading", + "entity_refs": [], + "states": [ + "how:financialFlowType", + "how:nettingBasis", + "axis:populationType", + "axis:measuredProperty" + ], + "part_index": 0 + }, + { + "kind": "text", + "text": " to ", + "segment": "heading", + "entity_refs": [], + "states": [], + "part_index": 0 + }, + { + "kind": "slot", + "text": "Kenya", + "axis": "where", + "segment": "heading", + "role": "destination", + "binding_ref": "where:", + "entity_refs": [ + "country/KEN" + ], + "states": [ + "where:" + ], + "part_index": 0 + }, + { + "kind": "text", + "text": " from ", + "segment": "heading", + "entity_refs": [], + "states": [], + "part_index": 0 + }, + { + "kind": "slot", + "text": "96 providers", + "segment": "heading", + "role": "origin", + "binding_ref": "origin:", + "entity_refs": [], + "states": [ + "origin:" + ], + "part_index": 0 + }, + { + "kind": "text", + "text": " for ", + "segment": "heading", + "entity_refs": [], + "states": [], + "part_index": 0 + }, + { + "kind": "slot", + "text": "official development assistance", + "axis": "how", + "segment": "heading", + "property_dcid": "dac2aAidType", + "binding_ref": "how:dac2aAidType", + "entity_refs": [], + "states": [ + "how:dac2aAidType" + ], + "part_index": 0 + }, + { + "kind": "slot", + "text": "", + "axis": "how", + "segment": "heading", + "property_dcid": "dacTypeOfFinance", + "binding_ref": "how:dacTypeOfFinance", + "entity_refs": [], + "states": [], + "part_index": 0 + }, + { + "kind": "slot", + "text": "", + "axis": "how", + "segment": "heading", + "property_dcid": "financialFlowType", + "binding_ref": "how:financialFlowType", + "entity_refs": [], + "states": [], + "part_index": 0 + }, + { + "kind": "slot", + "text": "", + "axis": "how", + "segment": "heading", + "property_dcid": "nettingBasis", + "binding_ref": "how:nettingBasis", + "entity_refs": [], + "states": [], + "part_index": 0 + }, + { + "kind": "text", + "text": " ", + "segment": "heading", + "entity_refs": [], + "states": [] + }, + { + "kind": "slot", + "text": "in 2022", + "axis": "when", + "segment": "heading", + "binding_ref": "when:", + "entity_refs": [], + "states": [ + "when:" + ] + }, + { + "kind": "text", + "text": ".", + "segment": "heading", + "entity_refs": [], + "states": [] + }, + { + "kind": "text", + "text": " ", + "segment": "byline", + "entity_refs": [], + "states": [] + }, + { + "kind": "slot", + "text": "Current US dollars", + "axis": "unit", + "segment": "byline", + "binding_ref": "unit:", + "entity_refs": [], + "states": [ + "unit:", + "axis:measurementQualifier" + ] + }, + { + "kind": "text", + "text": " · ", + "segment": "byline", + "entity_refs": [], + "states": [] + }, + { + "kind": "slot", + "text": "OECD DAC2a", + "axis": "source", + "segment": "byline", + "entity_refs": [], + "states": [ + "source:" + ] + }, + { + "kind": "text", + "text": ".", + "segment": "byline", + "entity_refs": [], + "states": [] + }, + { + "kind": "text", + "text": " ", + "segment": "assumption", + "entity_refs": [], + "states": [], + "part_index": 0 + }, + { + "kind": "text", + "text": "Assumed: ", + "segment": "assumption", + "entity_refs": [], + "states": [], + "part_index": 0 + }, + { + "kind": "text", + "text": "every provider", + "segment": "assumption", + "entity_refs": [], + "states": [], + "part_index": 0 + }, + { + "kind": "text", + "text": ".", + "segment": "assumption", + "entity_refs": [], + "states": [], + "part_index": 0 + } + ], + "status": "definite" + } + } + }, + { + "request": { + "method": "GET", + "origin_path": "/api/datasets/spec_73897fdfb0206fcf27c5898b353348fb/cv_fd93b9bd8095076557d0e500bb15514f/files/sha256:586f5aaffd96c46feb4d7bf09625d4c1a259faf51daf2d88967566fd4de07b4e" + }, + "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" + } + } + }, + { + "request": { + "method": "GET", + "url": "https://storage.googleapis.com/dev-fin-observatory-datasets-working/sha256%3A586f5aaffd96c46feb4d7bf09625d4c1a259faf51daf2d88967566fd4de07b4e?X-Goog-Signature=redacted" + }, + "response": { + "status": 200, + "headers": { + "content-type": "application/vnd.apache.parquet" + }, + "body_file": "fetch-spec-party-totals-left-out.parquet" + } + } + ], + "expect": [ + { + "dataset": { + "rows": 96, + "columns": [ + "time_period", + "financingProvider_label", + "financingRecipient_label", + "value", + "unit_label", + "dac2aAidType_label", + "provenance_label", + "financingProvider", + "financingProvider_kind", + "financingRecipient", + "financingRecipient_kind", + "dac2aAidType", + "unit", + "currency", + "price_basis", + "base_year", + "measurementMethod", + "measurementMethod_label", + "provenance", + "stat_var" + ], + "complete": true, + "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." + } + ], + "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 new file mode 100644 index 0000000..6898a12 Binary files /dev/null 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 e4390ab..4fb6e44 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_7f538f4f65ac124f47918468b4d2eea7", + "spec_id": "spec_70ddf0ce6a9b3f147063f2adf37fab9e", "definition": { "schema_version": 1, - "spec_id": "spec_7f538f4f65ac124f47918468b4d2eea7", + "spec_id": "spec_70ddf0ce6a9b3f147063f2adf37fab9e", "identity": { "identity_version": "spec1", "shape": { @@ -226,12 +226,12 @@ }, "requested_window": { "kind": "range", - "start_year": 1964, + "start_year": 1967, "end_year": 2024 } } }, - "sentence": "Gross disbursements to the 133 G77 countries from the 32 DAC countries for official development assistance, 1964 to 2024. Current US dollars · OECD DAC2a.", + "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.", "entity_groups": { "destination": { "label": "G77 countries", @@ -242,7 +242,8 @@ "group_id": "groups/OECD.DAC" } } - } + }, + "party_totals": true } ], "exchanges": [ @@ -254,10 +255,10 @@ "schema_version": 1, "input": { "kind": "spec_id", - "spec_id": "spec_7f538f4f65ac124f47918468b4d2eea7", + "spec_id": "spec_70ddf0ce6a9b3f147063f2adf37fab9e", "definition": { "schema_version": 1, - "spec_id": "spec_7f538f4f65ac124f47918468b4d2eea7", + "spec_id": "spec_70ddf0ce6a9b3f147063f2adf37fab9e", "identity": { "identity_version": "spec1", "shape": { @@ -469,7 +470,7 @@ }, "requested_window": { "kind": "range", - "start_year": 1964, + "start_year": 1967, "end_year": 2024 } } @@ -485,15 +486,15 @@ "status": 202, "headers": { "content-type": "application/json", - "location": "/api/datasets/operations/op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef", + "location": "/api/datasets/operations/op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f", "retry-after": "2", - "x-dfo-trace-id": "5541c591450f479485c421e20fe4d81d" + "x-dfo-trace-id": "9e96509866ff4da09a698df1f19a5cbd" }, "json": { "operation": { - "operation_id": "op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef", + "operation_id": "op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f", "status": "pending", - "poll": "/api/datasets/operations/op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef", + "poll": "/api/datasets/operations/op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f", "retry_after_ms": 1500 } } @@ -502,7 +503,7 @@ { "request": { "method": "GET", - "path": "/datasets/operations/op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef" + "path": "/datasets/operations/op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f" }, "response": { "status": 404, @@ -530,7 +531,7 @@ "trace_id": "00000000000000000000000000000000", "long_builds": [ { - "operation_id": "op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef", + "operation_id": "op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f", "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 3d315b2..c3f0abc 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_7f538f4f65ac124f47918468b4d2eea7", + "spec_id": "spec_70ddf0ce6a9b3f147063f2adf37fab9e", "definition": { "schema_version": 1, - "spec_id": "spec_7f538f4f65ac124f47918468b4d2eea7", + "spec_id": "spec_70ddf0ce6a9b3f147063f2adf37fab9e", "identity": { "identity_version": "spec1", "shape": { @@ -226,12 +226,12 @@ }, "requested_window": { "kind": "range", - "start_year": 1964, + "start_year": 1967, "end_year": 2024 } } }, - "sentence": "Gross disbursements to the 133 G77 countries from the 32 DAC countries for official development assistance, 1964 to 2024. Current US dollars · OECD DAC2a.", + "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.", "entity_groups": { "destination": { "label": "G77 countries", @@ -242,7 +242,8 @@ "group_id": "groups/OECD.DAC" } } - } + }, + "party_totals": true } ], "exchanges": [ @@ -254,10 +255,10 @@ "schema_version": 1, "input": { "kind": "spec_id", - "spec_id": "spec_7f538f4f65ac124f47918468b4d2eea7", + "spec_id": "spec_70ddf0ce6a9b3f147063f2adf37fab9e", "definition": { "schema_version": 1, - "spec_id": "spec_7f538f4f65ac124f47918468b4d2eea7", + "spec_id": "spec_70ddf0ce6a9b3f147063f2adf37fab9e", "identity": { "identity_version": "spec1", "shape": { @@ -469,7 +470,7 @@ }, "requested_window": { "kind": "range", - "start_year": 1964, + "start_year": 1967, "end_year": 2024 } } @@ -485,15 +486,15 @@ "status": 202, "headers": { "content-type": "application/json", - "location": "/api/datasets/operations/op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef", + "location": "/api/datasets/operations/op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f", "retry-after": "2", - "x-dfo-trace-id": "5541c591450f479485c421e20fe4d81d" + "x-dfo-trace-id": "9e96509866ff4da09a698df1f19a5cbd" }, "json": { "operation": { - "operation_id": "op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef", + "operation_id": "op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f", "status": "pending", - "poll": "/api/datasets/operations/op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef", + "poll": "/api/datasets/operations/op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f", "retry_after_ms": 1500 } } @@ -502,24 +503,24 @@ { "request": { "method": "GET", - "path": "/datasets/operations/op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef" + "path": "/datasets/operations/op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f" }, "response": { "status": 200, "headers": { "content-type": "application/json", "retry-after": "2", - "x-dfo-trace-id": "3416612a1b3f4a2ebbcf8ddeff74b96a" + "x-dfo-trace-id": "6185b86217ef499bb5b6932299df1207" }, "json": { "operation": { - "operation_id": "op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef", + "operation_id": "op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f", "status": "running", - "poll": "/api/datasets/operations/op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef", + "poll": "/api/datasets/operations/op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f", "retry_after_ms": 2500, "progress": { "rows_written": 0, - "estimate_rows": 108935 + "estimate_rows": 107252 } } } @@ -528,24 +529,24 @@ { "request": { "method": "GET", - "path": "/datasets/operations/op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef" + "path": "/datasets/operations/op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f" }, "response": { "status": 200, "headers": { "content-type": "application/json", "retry-after": "2", - "x-dfo-trace-id": "65394508d86f443db7528ac38066b9e3" + "x-dfo-trace-id": "1ebea3ca2d15409c953cd716bdc1fccf" }, "json": { "operation": { - "operation_id": "op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef", + "operation_id": "op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f", "status": "running", - "poll": "/api/datasets/operations/op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef", + "poll": "/api/datasets/operations/op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f", "retry_after_ms": 4000, "progress": { - "rows_written": 64600, - "estimate_rows": 108935 + "rows_written": 61927, + "estimate_rows": 107252 } } } @@ -554,102 +555,24 @@ { "request": { "method": "GET", - "path": "/datasets/operations/op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef" + "path": "/datasets/operations/op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f" }, "response": { "status": 200, "headers": { "content-type": "application/json", "retry-after": "2", - "x-dfo-trace-id": "7a2d07cfe29b4993a374ee71104d461a" - }, - "json": { - "operation": { - "operation_id": "op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef", - "status": "running", - "poll": "/api/datasets/operations/op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef", - "retry_after_ms": 1000, - "progress": { - "rows_written": 108935, - "estimate_rows": 108935 - } - } - } - } - }, - { - "request": { - "method": "GET", - "path": "/datasets/operations/op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef" - }, - "response": { - "status": 200, - "headers": { - "content-type": "application/json", - "retry-after": "2", - "x-dfo-trace-id": "7c7c516f463a471583976147759c6250" - }, - "json": { - "operation": { - "operation_id": "op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef", - "status": "running", - "poll": "/api/datasets/operations/op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef", - "retry_after_ms": 2500, - "progress": { - "rows_written": 108935, - "estimate_rows": 108935 - } - } - } - } - }, - { - "request": { - "method": "GET", - "path": "/datasets/operations/op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef" - }, - "response": { - "status": 200, - "headers": { - "content-type": "application/json", - "retry-after": "3", - "x-dfo-trace-id": "9ddce1ae50fd4187abeb32c45a0f03ba" + "x-dfo-trace-id": "94bb5a8a7c2041969d9a9118b75dc4aa" }, "json": { "operation": { - "operation_id": "op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef", + "operation_id": "op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f", "status": "running", - "poll": "/api/datasets/operations/op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef", - "retry_after_ms": 4000, - "progress": { - "rows_written": 108935, - "estimate_rows": 108935 - } - } - } - } - }, - { - "request": { - "method": "GET", - "path": "/datasets/operations/op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef" - }, - "response": { - "status": 200, - "headers": { - "content-type": "application/json", - "retry-after": "3", - "x-dfo-trace-id": "1ce68951ada64961b3710bb73127c9d8" - }, - "json": { - "operation": { - "operation_id": "op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef", - "status": "running", - "poll": "/api/datasets/operations/op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef", + "poll": "/api/datasets/operations/op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f", "retry_after_ms": 1000, "progress": { - "rows_written": 108935, - "estimate_rows": 108935 + "rows_written": 107252, + "estimate_rows": 107252 } } } @@ -658,24 +581,24 @@ { "request": { "method": "GET", - "path": "/datasets/operations/op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef" + "path": "/datasets/operations/op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f" }, "response": { "status": 200, "headers": { "content-type": "application/json", - "x-dfo-trace-id": "37207f1ea4574e4e8485e8cebd4f4edc" + "x-dfo-trace-id": "c501ba8d087b4561b2ff0e423c719ab0" }, "json": { "operation": { - "operation_id": "op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef", + "operation_id": "op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f", "status": "done" }, "manifest": { "schema_version": 1, "definition": { "schema_version": 1, - "spec_id": "spec_7f538f4f65ac124f47918468b4d2eea7", + "spec_id": "spec_70ddf0ce6a9b3f147063f2adf37fab9e", "identity": { "shape": { "kind": "statvar_schema", @@ -888,14 +811,14 @@ "requested_window": { "kind": "range", "end_year": 2024, - "start_year": 1964 + "start_year": 1967 } } }, - "content_version": "cv_ed2cc83eb28d4e6883cde079f05844ed", - "prepared_at": "2026-10-25T17:38:14Z", + "content_version": "cv_fafc60a507e03b0d42689fb1936127b9", + "prepared_at": "2026-10-26T09:22:44Z", "coverage": { - "rows": 108935, + "rows": 107252, "dimensions": [ { "label": "financingProvider", @@ -917,14 +840,14 @@ }, { "label": "years", - "count": 61 + "count": 58 } ], "window": { "kind": "range", "origin": "query", "end_year": 2024, - "start_year": 1964 + "start_year": 1967 } }, "citation": { @@ -1043,9 +966,9 @@ "kind": "range", "origin": "query", "end_year": 2024, - "start_year": 1964 + "start_year": 1967 }, - "graph_revision": "dfo-dev-dc-datacommons-service-00273-mmh", + "graph_revision": null, "normalisations": [], "code_index_stamp": { "exported_at": "2026-10-24T19:20:27Z", @@ -1059,7 +982,7 @@ } ], "capability_version": "dset_76f5fa7244511c58", - "materialiser_build": "99e62038ceb4b459c2ac699549076ff123c166aa", + "materialiser_build": "d80df9f5fd598b7345255470932d202ee5d49942", "resolved_stat_vars": [ { "ref": "dcid:Amount_FinancialFlow_Gross_Disbursement_DAC2aAidType206_Nominal", @@ -1067,15 +990,15 @@ "financingProvider", "financingRecipient" ], - "observation_count": 108935 + "observation_count": 107252 } ], "family_member_count": 1, "family_member_digest": "1a36e1a7292b1bfff95a5415de0be74cac7bb033217ed50e79faa8ce51a224c0", "frame_grammar_version": "1.1.0", - "origin_catalogue_build_id": "20261024T193016Z-775d36a9", + "origin_catalogue_build_id": "20261026T000018Z-0af2cac5", "served_from": "materialise", - "confirmed_at": "2026-10-25T17:38:17.505656+00:00" + "confirmed_at": "2026-10-26T09:22:46.854499+00:00" }, "warnings": [], "diagnostics": [ @@ -1087,29 +1010,29 @@ ], "artifacts": [ { - "artifact_digest": "sha256:4d80e30e27b5a64706113d54946e3a387e422b1115d1437594ac4b1d4307ffd2", + "artifact_digest": "sha256:a8c742f8f416b2f3414c7a569f7c18b337c5ee9ae3012483583bad0b238f5c61", "rendering": { "bundle": false, "format": "parquet", "layout": 4 }, - "bytes": 472796, + "bytes": 466531, "media_type": "application/vnd.apache.parquet", - "created_at": "2026-10-25T17:38:17.426404+00:00", + "created_at": "2026-10-26T09:22:46.786678+00:00", "tier": "working", - "url": "/api/datasets/spec_7f538f4f65ac124f47918468b4d2eea7/cv_ed2cc83eb28d4e6883cde079f05844ed/files/sha256:4d80e30e27b5a64706113d54946e3a387e422b1115d1437594ac4b1d4307ffd2", + "url": "/api/datasets/spec_70ddf0ce6a9b3f147063f2adf37fab9e/cv_fafc60a507e03b0d42689fb1936127b9/files/sha256:a8c742f8f416b2f3414c7a569f7c18b337c5ee9ae3012483583bad0b238f5c61", "enrichment_stamp": "08ed6c734fc69ea2204a21f4e1dd8b963f14dd1e03a2484c618049ac2e2d93d8" }, { - "artifact_digest": "sha256:4e3ed758ad1a33cf9d150ee5fa71adf7f5bd40e4d342d839633d8386239babe1", + "artifact_digest": "sha256:5247bafa55f84fe2f8bc348601acb955162c39a1a082e939945336470e5c5231", "rendering": { "statistics": "series" }, - "bytes": 144449, + "bytes": 144985, "media_type": "application/vnd.apache.parquet", - "created_at": "2026-10-25T17:38:17.426404+00:00", + "created_at": "2026-10-26T09:22:46.786678+00:00", "tier": "working", - "url": "/api/datasets/spec_7f538f4f65ac124f47918468b4d2eea7/cv_ed2cc83eb28d4e6883cde079f05844ed/files/sha256:4e3ed758ad1a33cf9d150ee5fa71adf7f5bd40e4d342d839633d8386239babe1" + "url": "/api/datasets/spec_70ddf0ce6a9b3f147063f2adf37fab9e/cv_fafc60a507e03b0d42689fb1936127b9/files/sha256:5247bafa55f84fe2f8bc348601acb955162c39a1a082e939945336470e5c5231" } ], "series_count": 3656, @@ -1138,7 +1061,7 @@ "name": "time_period", "kind": "grain", "droppable": false, - "distinct": 61 + "distinct": 58 }, { "name": "value", @@ -1378,7 +1301,7 @@ "varying": [ { "column": "time_period", - "distinct": 61 + "distinct": 58 } ] }, @@ -1402,7 +1325,7 @@ "varying": [ { "column": "time_period", - "distinct": 61 + "distinct": 58 } ] }, @@ -1464,7 +1387,7 @@ "series_coverage_stamp": "e6e717ab8c77e84d010915893ede5809e9ecec67929a07cfafbcc2210edfa1eb", "retention": { "pinned": false, - "held_until": "2026-11-24T17:38:17.425152Z" + "held_until": "2026-11-25T09:22:46.785219Z" } } } @@ -1473,21 +1396,21 @@ { "request": { "method": "GET", - "origin_path": "/api/datasets/spec_7f538f4f65ac124f47918468b4d2eea7/cv_ed2cc83eb28d4e6883cde079f05844ed/files/sha256:4d80e30e27b5a64706113d54946e3a387e422b1115d1437594ac4b1d4307ffd2" + "origin_path": "/api/datasets/spec_70ddf0ce6a9b3f147063f2adf37fab9e/cv_fafc60a507e03b0d42689fb1936127b9/files/sha256:a8c742f8f416b2f3414c7a569f7c18b337c5ee9ae3012483583bad0b238f5c61" }, "response": { "status": 302, "headers": { "content-type": "text/html", - "location": "https://storage.googleapis.com/dev-fin-observatory-datasets-working/sha256%3A4d80e30e27b5a64706113d54946e3a387e422b1115d1437594ac4b1d4307ffd2?X-Goog-Signature=redacted", - "x-dfo-trace-id": "919c1e572d914a608b166556417714c9" + "location": "https://storage.googleapis.com/dev-fin-observatory-datasets-working/sha256%3Aa8c742f8f416b2f3414c7a569f7c18b337c5ee9ae3012483583bad0b238f5c61?X-Goog-Signature=redacted", + "x-dfo-trace-id": "22f0d88923c14d74825b5f14d41c05b8" } } }, { "request": { "method": "GET", - "url": "https://storage.googleapis.com/dev-fin-observatory-datasets-working/sha256%3A4d80e30e27b5a64706113d54946e3a387e422b1115d1437594ac4b1d4307ffd2?X-Goog-Signature=redacted" + "url": "https://storage.googleapis.com/dev-fin-observatory-datasets-working/sha256%3Aa8c742f8f416b2f3414c7a569f7c18b337c5ee9ae3012483583bad0b238f5c61?X-Goog-Signature=redacted" }, "response": { "status": 200, @@ -1501,49 +1424,46 @@ "expect": [ { "dataset": { - "rows": 108935, + "rows": 107252, "columns": [ - "stat_var", - "financingProvider", + "time_period", "financingProvider_label", + "financingRecipient_label", + "value", + "unit_label", + "dac2aAidType_label", + "provenance_label", + "financingProvider", "financingProvider_kind", "financingRecipient", - "financingRecipient_label", "financingRecipient_kind", "dac2aAidType", - "dac2aAidType_label", - "time_period", - "value", "unit", - "unit_label", "currency", "price_basis", "base_year", "measurementMethod", "measurementMethod_label", "provenance", - "provenance_label" + "stat_var" ], "complete": true, "members": [ { "parts": [], - "spec_id": "spec_7f538f4f65ac124f47918468b4d2eea7", - "content_version": "cv_ed2cc83eb28d4e6883cde079f05844ed", - "sentence": "Gross disbursements to the 133 G77 countries from the 32 DAC countries for official development assistance, 1964 to 2024. Current US dollars · OECD DAC2a." + "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." } ], "missing": [], "long_builds": [ { - "operation_id": "op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef", + "operation_id": "op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f", "poll_waits": [ 1.5, 2.5, 4.0, - 1.0, - 2.5, - 4.0, 1.0 ], "resubmissions": 0 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 342444b..0c01f71 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_7f538f4f65ac124f47918468b4d2eea7", + "spec_id": "spec_70ddf0ce6a9b3f147063f2adf37fab9e", "definition": { "schema_version": 1, - "spec_id": "spec_7f538f4f65ac124f47918468b4d2eea7", + "spec_id": "spec_70ddf0ce6a9b3f147063f2adf37fab9e", "identity": { "identity_version": "spec1", "shape": { @@ -226,12 +226,12 @@ }, "requested_window": { "kind": "range", - "start_year": 1964, + "start_year": 1967, "end_year": 2024 } } }, - "sentence": "Gross disbursements to the 133 G77 countries from the 32 DAC countries for official development assistance, 1964 to 2024. Current US dollars · OECD DAC2a.", + "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.", "entity_groups": { "destination": { "label": "G77 countries", @@ -242,7 +242,8 @@ "group_id": "groups/OECD.DAC" } } - } + }, + "party_totals": true } ], "exchanges": [ @@ -254,10 +255,10 @@ "schema_version": 1, "input": { "kind": "spec_id", - "spec_id": "spec_7f538f4f65ac124f47918468b4d2eea7", + "spec_id": "spec_70ddf0ce6a9b3f147063f2adf37fab9e", "definition": { "schema_version": 1, - "spec_id": "spec_7f538f4f65ac124f47918468b4d2eea7", + "spec_id": "spec_70ddf0ce6a9b3f147063f2adf37fab9e", "identity": { "identity_version": "spec1", "shape": { @@ -469,7 +470,7 @@ }, "requested_window": { "kind": "range", - "start_year": 1964, + "start_year": 1967, "end_year": 2024 } } @@ -485,15 +486,15 @@ "status": 202, "headers": { "content-type": "application/json", - "location": "/api/datasets/operations/op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef", + "location": "/api/datasets/operations/op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f", "retry-after": "2", - "x-dfo-trace-id": "5541c591450f479485c421e20fe4d81d" + "x-dfo-trace-id": "9e96509866ff4da09a698df1f19a5cbd" }, "json": { "operation": { - "operation_id": "op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef", + "operation_id": "op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f", "status": "pending", - "poll": "/api/datasets/operations/op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef", + "poll": "/api/datasets/operations/op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f", "retry_after_ms": 1500 } } @@ -502,7 +503,7 @@ { "request": { "method": "GET", - "path": "/datasets/operations/op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef" + "path": "/datasets/operations/op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f" }, "response": { "status": 429, @@ -527,7 +528,7 @@ "trace_id": "00000000000000000000000000000000", "long_builds": [ { - "operation_id": "op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef", + "operation_id": "op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f", "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 a2e9fb7..2bf0145 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_7f538f4f65ac124f47918468b4d2eea7", + "spec_id": "spec_70ddf0ce6a9b3f147063f2adf37fab9e", "definition": { "schema_version": 1, - "spec_id": "spec_7f538f4f65ac124f47918468b4d2eea7", + "spec_id": "spec_70ddf0ce6a9b3f147063f2adf37fab9e", "identity": { "identity_version": "spec1", "shape": { @@ -226,12 +226,12 @@ }, "requested_window": { "kind": "range", - "start_year": 1964, + "start_year": 1967, "end_year": 2024 } } }, - "sentence": "Gross disbursements to the 133 G77 countries from the 32 DAC countries for official development assistance, 1964 to 2024. Current US dollars · OECD DAC2a.", + "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.", "entity_groups": { "destination": { "label": "G77 countries", @@ -242,7 +242,8 @@ "group_id": "groups/OECD.DAC" } } - } + }, + "party_totals": true } ], "exchanges": [ @@ -254,10 +255,10 @@ "schema_version": 1, "input": { "kind": "spec_id", - "spec_id": "spec_7f538f4f65ac124f47918468b4d2eea7", + "spec_id": "spec_70ddf0ce6a9b3f147063f2adf37fab9e", "definition": { "schema_version": 1, - "spec_id": "spec_7f538f4f65ac124f47918468b4d2eea7", + "spec_id": "spec_70ddf0ce6a9b3f147063f2adf37fab9e", "identity": { "identity_version": "spec1", "shape": { @@ -469,7 +470,7 @@ }, "requested_window": { "kind": "range", - "start_year": 1964, + "start_year": 1967, "end_year": 2024 } } @@ -485,15 +486,15 @@ "status": 202, "headers": { "content-type": "application/json", - "location": "/api/datasets/operations/op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef", + "location": "/api/datasets/operations/op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f", "retry-after": "2", - "x-dfo-trace-id": "5541c591450f479485c421e20fe4d81d" + "x-dfo-trace-id": "9e96509866ff4da09a698df1f19a5cbd" }, "json": { "operation": { - "operation_id": "op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef", + "operation_id": "op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f", "status": "pending", - "poll": "/api/datasets/operations/op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef", + "poll": "/api/datasets/operations/op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f", "retry_after_ms": 1500 } } @@ -502,7 +503,7 @@ { "request": { "method": "GET", - "path": "/datasets/operations/op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef" + "path": "/datasets/operations/op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f" }, "response": { "status": 429, @@ -514,24 +515,24 @@ { "request": { "method": "GET", - "path": "/datasets/operations/op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef" + "path": "/datasets/operations/op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f" }, "response": { "status": 200, "headers": { "content-type": "application/json", "retry-after": "2", - "x-dfo-trace-id": "3416612a1b3f4a2ebbcf8ddeff74b96a" + "x-dfo-trace-id": "6185b86217ef499bb5b6932299df1207" }, "json": { "operation": { - "operation_id": "op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef", + "operation_id": "op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f", "status": "running", - "poll": "/api/datasets/operations/op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef", + "poll": "/api/datasets/operations/op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f", "retry_after_ms": 1500, "progress": { "rows_written": 0, - "estimate_rows": 108935 + "estimate_rows": 107252 } } } @@ -540,24 +541,24 @@ { "request": { "method": "GET", - "path": "/datasets/operations/op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef" + "path": "/datasets/operations/op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f" }, "response": { "status": 200, "headers": { "content-type": "application/json", "retry-after": "2", - "x-dfo-trace-id": "65394508d86f443db7528ac38066b9e3" + "x-dfo-trace-id": "1ebea3ca2d15409c953cd716bdc1fccf" }, "json": { "operation": { - "operation_id": "op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef", + "operation_id": "op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f", "status": "running", - "poll": "/api/datasets/operations/op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef", + "poll": "/api/datasets/operations/op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f", "retry_after_ms": 1500, "progress": { - "rows_written": 64600, - "estimate_rows": 108935 + "rows_written": 61927, + "estimate_rows": 107252 } } } @@ -566,24 +567,24 @@ { "request": { "method": "GET", - "path": "/datasets/operations/op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef" + "path": "/datasets/operations/op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f" }, "response": { "status": 200, "headers": { "content-type": "application/json", "retry-after": "2", - "x-dfo-trace-id": "7a2d07cfe29b4993a374ee71104d461a" + "x-dfo-trace-id": "94bb5a8a7c2041969d9a9118b75dc4aa" }, "json": { "operation": { - "operation_id": "op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef", + "operation_id": "op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f", "status": "running", - "poll": "/api/datasets/operations/op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef", + "poll": "/api/datasets/operations/op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f", "retry_after_ms": 1500, "progress": { - "rows_written": 108935, - "estimate_rows": 108935 + "rows_written": 107252, + "estimate_rows": 107252 } } } @@ -592,24 +593,24 @@ { "request": { "method": "GET", - "path": "/datasets/operations/op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef" + "path": "/datasets/operations/op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f" }, "response": { "status": 200, "headers": { "content-type": "application/json", "retry-after": "2", - "x-dfo-trace-id": "7c7c516f463a471583976147759c6250" + "x-dfo-trace-id": "c78757a54b9f4b6786a784f8a47ad5b4" }, "json": { "operation": { - "operation_id": "op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef", + "operation_id": "op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f", "status": "running", - "poll": "/api/datasets/operations/op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef", - "retry_after_ms": 1786, + "poll": "/api/datasets/operations/op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f", + "retry_after_ms": 1784, "progress": { - "rows_written": 108935, - "estimate_rows": 108935 + "rows_written": 107252, + "estimate_rows": 107252 } } } @@ -618,24 +619,24 @@ { "request": { "method": "GET", - "path": "/datasets/operations/op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef" + "path": "/datasets/operations/op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f" }, "response": { "status": 200, "headers": { "content-type": "application/json", "retry-after": "3", - "x-dfo-trace-id": "9ddce1ae50fd4187abeb32c45a0f03ba" + "x-dfo-trace-id": "914bfd57942740b893ba9ca1b4f4591b" }, "json": { "operation": { - "operation_id": "op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef", + "operation_id": "op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f", "status": "running", - "poll": "/api/datasets/operations/op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef", - "retry_after_ms": 2268, + "poll": "/api/datasets/operations/op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f", + "retry_after_ms": 2289, "progress": { - "rows_written": 108935, - "estimate_rows": 108935 + "rows_written": 107252, + "estimate_rows": 107252 } } } @@ -644,24 +645,24 @@ { "request": { "method": "GET", - "path": "/datasets/operations/op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef" + "path": "/datasets/operations/op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f" }, "response": { "status": 200, "headers": { "content-type": "application/json", "retry-after": "3", - "x-dfo-trace-id": "1ce68951ada64961b3710bb73127c9d8" + "x-dfo-trace-id": "217766e0425f4916a393331295c4a7e7" }, "json": { "operation": { - "operation_id": "op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef", + "operation_id": "op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f", "status": "running", - "poll": "/api/datasets/operations/op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef", - "retry_after_ms": 2869, + "poll": "/api/datasets/operations/op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f", + "retry_after_ms": 2934, "progress": { - "rows_written": 108935, - "estimate_rows": 108935 + "rows_written": 107252, + "estimate_rows": 107252 } } } @@ -670,24 +671,24 @@ { "request": { "method": "GET", - "path": "/datasets/operations/op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef" + "path": "/datasets/operations/op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f" }, "response": { "status": 200, "headers": { "content-type": "application/json", - "x-dfo-trace-id": "37207f1ea4574e4e8485e8cebd4f4edc" + "x-dfo-trace-id": "c501ba8d087b4561b2ff0e423c719ab0" }, "json": { "operation": { - "operation_id": "op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef", + "operation_id": "op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f", "status": "done" }, "manifest": { "schema_version": 1, "definition": { "schema_version": 1, - "spec_id": "spec_7f538f4f65ac124f47918468b4d2eea7", + "spec_id": "spec_70ddf0ce6a9b3f147063f2adf37fab9e", "identity": { "shape": { "kind": "statvar_schema", @@ -900,14 +901,14 @@ "requested_window": { "kind": "range", "end_year": 2024, - "start_year": 1964 + "start_year": 1967 } } }, - "content_version": "cv_ed2cc83eb28d4e6883cde079f05844ed", - "prepared_at": "2026-10-25T17:38:14Z", + "content_version": "cv_fafc60a507e03b0d42689fb1936127b9", + "prepared_at": "2026-10-26T09:22:44Z", "coverage": { - "rows": 108935, + "rows": 107252, "dimensions": [ { "label": "financingProvider", @@ -929,14 +930,14 @@ }, { "label": "years", - "count": 61 + "count": 58 } ], "window": { "kind": "range", "origin": "query", "end_year": 2024, - "start_year": 1964 + "start_year": 1967 } }, "citation": { @@ -1055,9 +1056,9 @@ "kind": "range", "origin": "query", "end_year": 2024, - "start_year": 1964 + "start_year": 1967 }, - "graph_revision": "dfo-dev-dc-datacommons-service-00273-mmh", + "graph_revision": null, "normalisations": [], "code_index_stamp": { "exported_at": "2026-10-24T19:20:27Z", @@ -1071,7 +1072,7 @@ } ], "capability_version": "dset_76f5fa7244511c58", - "materialiser_build": "99e62038ceb4b459c2ac699549076ff123c166aa", + "materialiser_build": "d80df9f5fd598b7345255470932d202ee5d49942", "resolved_stat_vars": [ { "ref": "dcid:Amount_FinancialFlow_Gross_Disbursement_DAC2aAidType206_Nominal", @@ -1079,15 +1080,15 @@ "financingProvider", "financingRecipient" ], - "observation_count": 108935 + "observation_count": 107252 } ], "family_member_count": 1, "family_member_digest": "1a36e1a7292b1bfff95a5415de0be74cac7bb033217ed50e79faa8ce51a224c0", "frame_grammar_version": "1.1.0", - "origin_catalogue_build_id": "20261024T193016Z-775d36a9", + "origin_catalogue_build_id": "20261026T000018Z-0af2cac5", "served_from": "materialise", - "confirmed_at": "2026-10-25T17:38:17.505656+00:00" + "confirmed_at": "2026-10-26T09:22:46.854499+00:00" }, "warnings": [], "diagnostics": [ @@ -1099,29 +1100,29 @@ ], "artifacts": [ { - "artifact_digest": "sha256:4d80e30e27b5a64706113d54946e3a387e422b1115d1437594ac4b1d4307ffd2", + "artifact_digest": "sha256:a8c742f8f416b2f3414c7a569f7c18b337c5ee9ae3012483583bad0b238f5c61", "rendering": { "bundle": false, "format": "parquet", "layout": 4 }, - "bytes": 472796, + "bytes": 466531, "media_type": "application/vnd.apache.parquet", - "created_at": "2026-10-25T17:38:17.426404+00:00", + "created_at": "2026-10-26T09:22:46.786678+00:00", "tier": "working", - "url": "/api/datasets/spec_7f538f4f65ac124f47918468b4d2eea7/cv_ed2cc83eb28d4e6883cde079f05844ed/files/sha256:4d80e30e27b5a64706113d54946e3a387e422b1115d1437594ac4b1d4307ffd2", + "url": "/api/datasets/spec_70ddf0ce6a9b3f147063f2adf37fab9e/cv_fafc60a507e03b0d42689fb1936127b9/files/sha256:a8c742f8f416b2f3414c7a569f7c18b337c5ee9ae3012483583bad0b238f5c61", "enrichment_stamp": "08ed6c734fc69ea2204a21f4e1dd8b963f14dd1e03a2484c618049ac2e2d93d8" }, { - "artifact_digest": "sha256:4e3ed758ad1a33cf9d150ee5fa71adf7f5bd40e4d342d839633d8386239babe1", + "artifact_digest": "sha256:5247bafa55f84fe2f8bc348601acb955162c39a1a082e939945336470e5c5231", "rendering": { "statistics": "series" }, - "bytes": 144449, + "bytes": 144985, "media_type": "application/vnd.apache.parquet", - "created_at": "2026-10-25T17:38:17.426404+00:00", + "created_at": "2026-10-26T09:22:46.786678+00:00", "tier": "working", - "url": "/api/datasets/spec_7f538f4f65ac124f47918468b4d2eea7/cv_ed2cc83eb28d4e6883cde079f05844ed/files/sha256:4e3ed758ad1a33cf9d150ee5fa71adf7f5bd40e4d342d839633d8386239babe1" + "url": "/api/datasets/spec_70ddf0ce6a9b3f147063f2adf37fab9e/cv_fafc60a507e03b0d42689fb1936127b9/files/sha256:5247bafa55f84fe2f8bc348601acb955162c39a1a082e939945336470e5c5231" } ], "series_count": 3656, @@ -1150,7 +1151,7 @@ "name": "time_period", "kind": "grain", "droppable": false, - "distinct": 61 + "distinct": 58 }, { "name": "value", @@ -1390,7 +1391,7 @@ "varying": [ { "column": "time_period", - "distinct": 61 + "distinct": 58 } ] }, @@ -1414,7 +1415,7 @@ "varying": [ { "column": "time_period", - "distinct": 61 + "distinct": 58 } ] }, @@ -1476,7 +1477,7 @@ "series_coverage_stamp": "e6e717ab8c77e84d010915893ede5809e9ecec67929a07cfafbcc2210edfa1eb", "retention": { "pinned": false, - "held_until": "2026-11-24T17:38:17.425152Z" + "held_until": "2026-11-25T09:22:46.785219Z" } } } @@ -1485,21 +1486,21 @@ { "request": { "method": "GET", - "origin_path": "/api/datasets/spec_7f538f4f65ac124f47918468b4d2eea7/cv_ed2cc83eb28d4e6883cde079f05844ed/files/sha256:4d80e30e27b5a64706113d54946e3a387e422b1115d1437594ac4b1d4307ffd2" + "origin_path": "/api/datasets/spec_70ddf0ce6a9b3f147063f2adf37fab9e/cv_fafc60a507e03b0d42689fb1936127b9/files/sha256:a8c742f8f416b2f3414c7a569f7c18b337c5ee9ae3012483583bad0b238f5c61" }, "response": { "status": 302, "headers": { "content-type": "text/html", - "location": "https://storage.googleapis.com/dev-fin-observatory-datasets-working/sha256%3A4d80e30e27b5a64706113d54946e3a387e422b1115d1437594ac4b1d4307ffd2?X-Goog-Signature=redacted", - "x-dfo-trace-id": "919c1e572d914a608b166556417714c9" + "location": "https://storage.googleapis.com/dev-fin-observatory-datasets-working/sha256%3Aa8c742f8f416b2f3414c7a569f7c18b337c5ee9ae3012483583bad0b238f5c61?X-Goog-Signature=redacted", + "x-dfo-trace-id": "22f0d88923c14d74825b5f14d41c05b8" } } }, { "request": { "method": "GET", - "url": "https://storage.googleapis.com/dev-fin-observatory-datasets-working/sha256%3A4d80e30e27b5a64706113d54946e3a387e422b1115d1437594ac4b1d4307ffd2?X-Goog-Signature=redacted" + "url": "https://storage.googleapis.com/dev-fin-observatory-datasets-working/sha256%3Aa8c742f8f416b2f3414c7a569f7c18b337c5ee9ae3012483583bad0b238f5c61?X-Goog-Signature=redacted" }, "response": { "status": 200, @@ -1513,51 +1514,51 @@ "expect": [ { "dataset": { - "rows": 108935, + "rows": 107252, "columns": [ - "stat_var", - "financingProvider", + "time_period", "financingProvider_label", + "financingRecipient_label", + "value", + "unit_label", + "dac2aAidType_label", + "provenance_label", + "financingProvider", "financingProvider_kind", "financingRecipient", - "financingRecipient_label", "financingRecipient_kind", "dac2aAidType", - "dac2aAidType_label", - "time_period", - "value", "unit", - "unit_label", "currency", "price_basis", "base_year", "measurementMethod", "measurementMethod_label", "provenance", - "provenance_label" + "stat_var" ], "complete": true, "members": [ { "parts": [], - "spec_id": "spec_7f538f4f65ac124f47918468b4d2eea7", - "content_version": "cv_ed2cc83eb28d4e6883cde079f05844ed", - "sentence": "Gross disbursements to the 133 G77 countries from the 32 DAC countries for official development assistance, 1964 to 2024. Current US dollars · OECD DAC2a." + "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." } ], "missing": [], "long_builds": [ { - "operation_id": "op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef", + "operation_id": "op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f", "poll_waits": [ 1.5, 3.0, 1.5, 1.5, 1.5, - 1.786, - 2.268, - 2.869 + 1.784, + 2.289, + 2.934 ], "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 c2912af..2535033 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_7f538f4f65ac124f47918468b4d2eea7", + "spec_id": "spec_70ddf0ce6a9b3f147063f2adf37fab9e", "definition": { "schema_version": 1, - "spec_id": "spec_7f538f4f65ac124f47918468b4d2eea7", + "spec_id": "spec_70ddf0ce6a9b3f147063f2adf37fab9e", "identity": { "identity_version": "spec1", "shape": { @@ -226,12 +226,12 @@ }, "requested_window": { "kind": "range", - "start_year": 1964, + "start_year": 1967, "end_year": 2024 } } }, - "sentence": "Gross disbursements to the 133 G77 countries from the 32 DAC countries for official development assistance, 1964 to 2024. Current US dollars · OECD DAC2a.", + "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.", "entity_groups": { "destination": { "label": "G77 countries", @@ -242,7 +242,8 @@ "group_id": "groups/OECD.DAC" } } - } + }, + "party_totals": true } ], "exchanges": [ @@ -254,10 +255,10 @@ "schema_version": 1, "input": { "kind": "spec_id", - "spec_id": "spec_7f538f4f65ac124f47918468b4d2eea7", + "spec_id": "spec_70ddf0ce6a9b3f147063f2adf37fab9e", "definition": { "schema_version": 1, - "spec_id": "spec_7f538f4f65ac124f47918468b4d2eea7", + "spec_id": "spec_70ddf0ce6a9b3f147063f2adf37fab9e", "identity": { "identity_version": "spec1", "shape": { @@ -469,7 +470,7 @@ }, "requested_window": { "kind": "range", - "start_year": 1964, + "start_year": 1967, "end_year": 2024 } } @@ -485,14 +486,14 @@ "status": 202, "headers": { "content-type": "application/json", - "location": "/api/datasets/operations/op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef", - "x-dfo-trace-id": "5541c591450f479485c421e20fe4d81d" + "location": "/api/datasets/operations/op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f", + "x-dfo-trace-id": "9e96509866ff4da09a698df1f19a5cbd" }, "json": { "operation": { - "operation_id": "op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef", + "operation_id": "op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f", "status": "pending", - "poll": "/api/datasets/operations/op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef" + "poll": "/api/datasets/operations/op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f" } } } @@ -500,22 +501,22 @@ { "request": { "method": "GET", - "path": "/datasets/operations/op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef" + "path": "/datasets/operations/op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f" }, "response": { "status": 200, "headers": { "content-type": "application/json", - "x-dfo-trace-id": "3416612a1b3f4a2ebbcf8ddeff74b96a" + "x-dfo-trace-id": "6185b86217ef499bb5b6932299df1207" }, "json": { "operation": { - "operation_id": "op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef", + "operation_id": "op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f", "status": "running", - "poll": "/api/datasets/operations/op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef", + "poll": "/api/datasets/operations/op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f", "progress": { "rows_written": 0, - "estimate_rows": 108935 + "estimate_rows": 107252 } } } @@ -524,7 +525,7 @@ { "request": { "method": "GET", - "path": "/datasets/operations/op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef" + "path": "/datasets/operations/op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f" }, "response": { "status": 503, @@ -546,22 +547,22 @@ { "request": { "method": "GET", - "path": "/datasets/operations/op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef" + "path": "/datasets/operations/op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f" }, "response": { "status": 200, "headers": { "content-type": "application/json", - "x-dfo-trace-id": "65394508d86f443db7528ac38066b9e3" + "x-dfo-trace-id": "1ebea3ca2d15409c953cd716bdc1fccf" }, "json": { "operation": { - "operation_id": "op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef", + "operation_id": "op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f", "status": "running", - "poll": "/api/datasets/operations/op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef", + "poll": "/api/datasets/operations/op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f", "progress": { - "rows_written": 64600, - "estimate_rows": 108935 + "rows_written": 61927, + "estimate_rows": 107252 } } } @@ -570,22 +571,22 @@ { "request": { "method": "GET", - "path": "/datasets/operations/op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef" + "path": "/datasets/operations/op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f" }, "response": { "status": 200, "headers": { "content-type": "application/json", - "x-dfo-trace-id": "7a2d07cfe29b4993a374ee71104d461a" + "x-dfo-trace-id": "94bb5a8a7c2041969d9a9118b75dc4aa" }, "json": { "operation": { - "operation_id": "op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef", + "operation_id": "op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f", "status": "running", - "poll": "/api/datasets/operations/op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef", + "poll": "/api/datasets/operations/op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f", "progress": { - "rows_written": 108935, - "estimate_rows": 108935 + "rows_written": 107252, + "estimate_rows": 107252 } } } @@ -594,22 +595,22 @@ { "request": { "method": "GET", - "path": "/datasets/operations/op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef" + "path": "/datasets/operations/op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f" }, "response": { "status": 200, "headers": { "content-type": "application/json", - "x-dfo-trace-id": "7c7c516f463a471583976147759c6250" + "x-dfo-trace-id": "c78757a54b9f4b6786a784f8a47ad5b4" }, "json": { "operation": { - "operation_id": "op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef", + "operation_id": "op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f", "status": "running", - "poll": "/api/datasets/operations/op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef", + "poll": "/api/datasets/operations/op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f", "progress": { - "rows_written": 108935, - "estimate_rows": 108935 + "rows_written": 107252, + "estimate_rows": 107252 } } } @@ -618,22 +619,22 @@ { "request": { "method": "GET", - "path": "/datasets/operations/op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef" + "path": "/datasets/operations/op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f" }, "response": { "status": 200, "headers": { "content-type": "application/json", - "x-dfo-trace-id": "9ddce1ae50fd4187abeb32c45a0f03ba" + "x-dfo-trace-id": "914bfd57942740b893ba9ca1b4f4591b" }, "json": { "operation": { - "operation_id": "op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef", + "operation_id": "op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f", "status": "running", - "poll": "/api/datasets/operations/op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef", + "poll": "/api/datasets/operations/op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f", "progress": { - "rows_written": 108935, - "estimate_rows": 108935 + "rows_written": 107252, + "estimate_rows": 107252 } } } @@ -642,22 +643,22 @@ { "request": { "method": "GET", - "path": "/datasets/operations/op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef" + "path": "/datasets/operations/op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f" }, "response": { "status": 200, "headers": { "content-type": "application/json", - "x-dfo-trace-id": "1ce68951ada64961b3710bb73127c9d8" + "x-dfo-trace-id": "217766e0425f4916a393331295c4a7e7" }, "json": { "operation": { - "operation_id": "op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef", + "operation_id": "op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f", "status": "running", - "poll": "/api/datasets/operations/op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef", + "poll": "/api/datasets/operations/op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f", "progress": { - "rows_written": 108935, - "estimate_rows": 108935 + "rows_written": 107252, + "estimate_rows": 107252 } } } @@ -666,24 +667,24 @@ { "request": { "method": "GET", - "path": "/datasets/operations/op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef" + "path": "/datasets/operations/op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f" }, "response": { "status": 200, "headers": { "content-type": "application/json", - "x-dfo-trace-id": "37207f1ea4574e4e8485e8cebd4f4edc" + "x-dfo-trace-id": "c501ba8d087b4561b2ff0e423c719ab0" }, "json": { "operation": { - "operation_id": "op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef", + "operation_id": "op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f", "status": "done" }, "manifest": { "schema_version": 1, "definition": { "schema_version": 1, - "spec_id": "spec_7f538f4f65ac124f47918468b4d2eea7", + "spec_id": "spec_70ddf0ce6a9b3f147063f2adf37fab9e", "identity": { "shape": { "kind": "statvar_schema", @@ -896,14 +897,14 @@ "requested_window": { "kind": "range", "end_year": 2024, - "start_year": 1964 + "start_year": 1967 } } }, - "content_version": "cv_ed2cc83eb28d4e6883cde079f05844ed", - "prepared_at": "2026-10-25T17:38:14Z", + "content_version": "cv_fafc60a507e03b0d42689fb1936127b9", + "prepared_at": "2026-10-26T09:22:44Z", "coverage": { - "rows": 108935, + "rows": 107252, "dimensions": [ { "label": "financingProvider", @@ -925,14 +926,14 @@ }, { "label": "years", - "count": 61 + "count": 58 } ], "window": { "kind": "range", "origin": "query", "end_year": 2024, - "start_year": 1964 + "start_year": 1967 } }, "citation": { @@ -1051,9 +1052,9 @@ "kind": "range", "origin": "query", "end_year": 2024, - "start_year": 1964 + "start_year": 1967 }, - "graph_revision": "dfo-dev-dc-datacommons-service-00273-mmh", + "graph_revision": null, "normalisations": [], "code_index_stamp": { "exported_at": "2026-10-24T19:20:27Z", @@ -1067,7 +1068,7 @@ } ], "capability_version": "dset_76f5fa7244511c58", - "materialiser_build": "99e62038ceb4b459c2ac699549076ff123c166aa", + "materialiser_build": "d80df9f5fd598b7345255470932d202ee5d49942", "resolved_stat_vars": [ { "ref": "dcid:Amount_FinancialFlow_Gross_Disbursement_DAC2aAidType206_Nominal", @@ -1075,15 +1076,15 @@ "financingProvider", "financingRecipient" ], - "observation_count": 108935 + "observation_count": 107252 } ], "family_member_count": 1, "family_member_digest": "1a36e1a7292b1bfff95a5415de0be74cac7bb033217ed50e79faa8ce51a224c0", "frame_grammar_version": "1.1.0", - "origin_catalogue_build_id": "20261024T193016Z-775d36a9", + "origin_catalogue_build_id": "20261026T000018Z-0af2cac5", "served_from": "materialise", - "confirmed_at": "2026-10-25T17:38:17.505656+00:00" + "confirmed_at": "2026-10-26T09:22:46.854499+00:00" }, "warnings": [], "diagnostics": [ @@ -1095,29 +1096,29 @@ ], "artifacts": [ { - "artifact_digest": "sha256:4d80e30e27b5a64706113d54946e3a387e422b1115d1437594ac4b1d4307ffd2", + "artifact_digest": "sha256:a8c742f8f416b2f3414c7a569f7c18b337c5ee9ae3012483583bad0b238f5c61", "rendering": { "bundle": false, "format": "parquet", "layout": 4 }, - "bytes": 472796, + "bytes": 466531, "media_type": "application/vnd.apache.parquet", - "created_at": "2026-10-25T17:38:17.426404+00:00", + "created_at": "2026-10-26T09:22:46.786678+00:00", "tier": "working", - "url": "/api/datasets/spec_7f538f4f65ac124f47918468b4d2eea7/cv_ed2cc83eb28d4e6883cde079f05844ed/files/sha256:4d80e30e27b5a64706113d54946e3a387e422b1115d1437594ac4b1d4307ffd2", + "url": "/api/datasets/spec_70ddf0ce6a9b3f147063f2adf37fab9e/cv_fafc60a507e03b0d42689fb1936127b9/files/sha256:a8c742f8f416b2f3414c7a569f7c18b337c5ee9ae3012483583bad0b238f5c61", "enrichment_stamp": "08ed6c734fc69ea2204a21f4e1dd8b963f14dd1e03a2484c618049ac2e2d93d8" }, { - "artifact_digest": "sha256:4e3ed758ad1a33cf9d150ee5fa71adf7f5bd40e4d342d839633d8386239babe1", + "artifact_digest": "sha256:5247bafa55f84fe2f8bc348601acb955162c39a1a082e939945336470e5c5231", "rendering": { "statistics": "series" }, - "bytes": 144449, + "bytes": 144985, "media_type": "application/vnd.apache.parquet", - "created_at": "2026-10-25T17:38:17.426404+00:00", + "created_at": "2026-10-26T09:22:46.786678+00:00", "tier": "working", - "url": "/api/datasets/spec_7f538f4f65ac124f47918468b4d2eea7/cv_ed2cc83eb28d4e6883cde079f05844ed/files/sha256:4e3ed758ad1a33cf9d150ee5fa71adf7f5bd40e4d342d839633d8386239babe1" + "url": "/api/datasets/spec_70ddf0ce6a9b3f147063f2adf37fab9e/cv_fafc60a507e03b0d42689fb1936127b9/files/sha256:5247bafa55f84fe2f8bc348601acb955162c39a1a082e939945336470e5c5231" } ], "series_count": 3656, @@ -1146,7 +1147,7 @@ "name": "time_period", "kind": "grain", "droppable": false, - "distinct": 61 + "distinct": 58 }, { "name": "value", @@ -1386,7 +1387,7 @@ "varying": [ { "column": "time_period", - "distinct": 61 + "distinct": 58 } ] }, @@ -1410,7 +1411,7 @@ "varying": [ { "column": "time_period", - "distinct": 61 + "distinct": 58 } ] }, @@ -1472,7 +1473,7 @@ "series_coverage_stamp": "e6e717ab8c77e84d010915893ede5809e9ecec67929a07cfafbcc2210edfa1eb", "retention": { "pinned": false, - "held_until": "2026-11-24T17:38:17.425152Z" + "held_until": "2026-11-25T09:22:46.785219Z" } } } @@ -1481,21 +1482,21 @@ { "request": { "method": "GET", - "origin_path": "/api/datasets/spec_7f538f4f65ac124f47918468b4d2eea7/cv_ed2cc83eb28d4e6883cde079f05844ed/files/sha256:4d80e30e27b5a64706113d54946e3a387e422b1115d1437594ac4b1d4307ffd2" + "origin_path": "/api/datasets/spec_70ddf0ce6a9b3f147063f2adf37fab9e/cv_fafc60a507e03b0d42689fb1936127b9/files/sha256:a8c742f8f416b2f3414c7a569f7c18b337c5ee9ae3012483583bad0b238f5c61" }, "response": { "status": 302, "headers": { "content-type": "text/html", - "location": "https://storage.googleapis.com/dev-fin-observatory-datasets-working/sha256%3A4d80e30e27b5a64706113d54946e3a387e422b1115d1437594ac4b1d4307ffd2?X-Goog-Signature=redacted", - "x-dfo-trace-id": "919c1e572d914a608b166556417714c9" + "location": "https://storage.googleapis.com/dev-fin-observatory-datasets-working/sha256%3Aa8c742f8f416b2f3414c7a569f7c18b337c5ee9ae3012483583bad0b238f5c61?X-Goog-Signature=redacted", + "x-dfo-trace-id": "22f0d88923c14d74825b5f14d41c05b8" } } }, { "request": { "method": "GET", - "url": "https://storage.googleapis.com/dev-fin-observatory-datasets-working/sha256%3A4d80e30e27b5a64706113d54946e3a387e422b1115d1437594ac4b1d4307ffd2?X-Goog-Signature=redacted" + "url": "https://storage.googleapis.com/dev-fin-observatory-datasets-working/sha256%3Aa8c742f8f416b2f3414c7a569f7c18b337c5ee9ae3012483583bad0b238f5c61?X-Goog-Signature=redacted" }, "response": { "status": 200, @@ -1509,42 +1510,42 @@ "expect": [ { "dataset": { - "rows": 108935, + "rows": 107252, "columns": [ - "stat_var", - "financingProvider", + "time_period", "financingProvider_label", + "financingRecipient_label", + "value", + "unit_label", + "dac2aAidType_label", + "provenance_label", + "financingProvider", "financingProvider_kind", "financingRecipient", - "financingRecipient_label", "financingRecipient_kind", "dac2aAidType", - "dac2aAidType_label", - "time_period", - "value", "unit", - "unit_label", "currency", "price_basis", "base_year", "measurementMethod", "measurementMethod_label", "provenance", - "provenance_label" + "stat_var" ], "complete": true, "members": [ { "parts": [], - "spec_id": "spec_7f538f4f65ac124f47918468b4d2eea7", - "content_version": "cv_ed2cc83eb28d4e6883cde079f05844ed", - "sentence": "Gross disbursements to the 133 G77 countries from the 32 DAC countries for official development assistance, 1964 to 2024. Current US dollars · OECD DAC2a." + "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." } ], "missing": [], "long_builds": [ { - "operation_id": "op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef", + "operation_id": "op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f", "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 18daf7d..42b9254 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_7f538f4f65ac124f47918468b4d2eea7", + "spec_id": "spec_70ddf0ce6a9b3f147063f2adf37fab9e", "definition": { "schema_version": 1, - "spec_id": "spec_7f538f4f65ac124f47918468b4d2eea7", + "spec_id": "spec_70ddf0ce6a9b3f147063f2adf37fab9e", "identity": { "identity_version": "spec1", "shape": { @@ -226,12 +226,12 @@ }, "requested_window": { "kind": "range", - "start_year": 1964, + "start_year": 1967, "end_year": 2024 } } }, - "sentence": "Gross disbursements to the 133 G77 countries from the 32 DAC countries for official development assistance, 1964 to 2024. Current US dollars · OECD DAC2a.", + "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.", "entity_groups": { "destination": { "label": "G77 countries", @@ -242,7 +242,8 @@ "group_id": "groups/OECD.DAC" } } - } + }, + "party_totals": true } ], "exchanges": [ @@ -254,10 +255,10 @@ "schema_version": 1, "input": { "kind": "spec_id", - "spec_id": "spec_7f538f4f65ac124f47918468b4d2eea7", + "spec_id": "spec_70ddf0ce6a9b3f147063f2adf37fab9e", "definition": { "schema_version": 1, - "spec_id": "spec_7f538f4f65ac124f47918468b4d2eea7", + "spec_id": "spec_70ddf0ce6a9b3f147063f2adf37fab9e", "identity": { "identity_version": "spec1", "shape": { @@ -469,7 +470,7 @@ }, "requested_window": { "kind": "range", - "start_year": 1964, + "start_year": 1967, "end_year": 2024 } } @@ -485,15 +486,15 @@ "status": 202, "headers": { "content-type": "application/json", - "location": "/api/datasets/operations/op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef", + "location": "/api/datasets/operations/op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f", "retry-after": "2", - "x-dfo-trace-id": "5541c591450f479485c421e20fe4d81d" + "x-dfo-trace-id": "9e96509866ff4da09a698df1f19a5cbd" }, "json": { "operation": { - "operation_id": "op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef", + "operation_id": "op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f", "status": "pending", - "poll": "/api/datasets/operations/op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef", + "poll": "/api/datasets/operations/op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f", "retry_after_ms": 1500 } } @@ -502,7 +503,7 @@ { "request": { "method": "GET", - "path": "/datasets/operations/op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef" + "path": "/datasets/operations/op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f" }, "response": { "status": 503, @@ -525,24 +526,24 @@ { "request": { "method": "GET", - "path": "/datasets/operations/op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef" + "path": "/datasets/operations/op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f" }, "response": { "status": 200, "headers": { "content-type": "application/json", "retry-after": "2", - "x-dfo-trace-id": "3416612a1b3f4a2ebbcf8ddeff74b96a" + "x-dfo-trace-id": "6185b86217ef499bb5b6932299df1207" }, "json": { "operation": { - "operation_id": "op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef", + "operation_id": "op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f", "status": "running", - "poll": "/api/datasets/operations/op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef", + "poll": "/api/datasets/operations/op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f", "retry_after_ms": 1500, "progress": { "rows_written": 0, - "estimate_rows": 108935 + "estimate_rows": 107252 } } } @@ -551,24 +552,24 @@ { "request": { "method": "GET", - "path": "/datasets/operations/op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef" + "path": "/datasets/operations/op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f" }, "response": { "status": 200, "headers": { "content-type": "application/json", "retry-after": "2", - "x-dfo-trace-id": "65394508d86f443db7528ac38066b9e3" + "x-dfo-trace-id": "1ebea3ca2d15409c953cd716bdc1fccf" }, "json": { "operation": { - "operation_id": "op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef", + "operation_id": "op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f", "status": "running", - "poll": "/api/datasets/operations/op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef", + "poll": "/api/datasets/operations/op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f", "retry_after_ms": 1500, "progress": { - "rows_written": 64600, - "estimate_rows": 108935 + "rows_written": 61927, + "estimate_rows": 107252 } } } @@ -577,24 +578,24 @@ { "request": { "method": "GET", - "path": "/datasets/operations/op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef" + "path": "/datasets/operations/op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f" }, "response": { "status": 200, "headers": { "content-type": "application/json", "retry-after": "2", - "x-dfo-trace-id": "7a2d07cfe29b4993a374ee71104d461a" + "x-dfo-trace-id": "94bb5a8a7c2041969d9a9118b75dc4aa" }, "json": { "operation": { - "operation_id": "op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef", + "operation_id": "op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f", "status": "running", - "poll": "/api/datasets/operations/op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef", + "poll": "/api/datasets/operations/op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f", "retry_after_ms": 1500, "progress": { - "rows_written": 108935, - "estimate_rows": 108935 + "rows_written": 107252, + "estimate_rows": 107252 } } } @@ -603,24 +604,24 @@ { "request": { "method": "GET", - "path": "/datasets/operations/op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef" + "path": "/datasets/operations/op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f" }, "response": { "status": 200, "headers": { "content-type": "application/json", "retry-after": "2", - "x-dfo-trace-id": "7c7c516f463a471583976147759c6250" + "x-dfo-trace-id": "c78757a54b9f4b6786a784f8a47ad5b4" }, "json": { "operation": { - "operation_id": "op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef", + "operation_id": "op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f", "status": "running", - "poll": "/api/datasets/operations/op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef", - "retry_after_ms": 1786, + "poll": "/api/datasets/operations/op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f", + "retry_after_ms": 1784, "progress": { - "rows_written": 108935, - "estimate_rows": 108935 + "rows_written": 107252, + "estimate_rows": 107252 } } } @@ -629,24 +630,24 @@ { "request": { "method": "GET", - "path": "/datasets/operations/op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef" + "path": "/datasets/operations/op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f" }, "response": { "status": 200, "headers": { "content-type": "application/json", "retry-after": "3", - "x-dfo-trace-id": "9ddce1ae50fd4187abeb32c45a0f03ba" + "x-dfo-trace-id": "914bfd57942740b893ba9ca1b4f4591b" }, "json": { "operation": { - "operation_id": "op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef", + "operation_id": "op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f", "status": "running", - "poll": "/api/datasets/operations/op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef", - "retry_after_ms": 2268, + "poll": "/api/datasets/operations/op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f", + "retry_after_ms": 2289, "progress": { - "rows_written": 108935, - "estimate_rows": 108935 + "rows_written": 107252, + "estimate_rows": 107252 } } } @@ -655,24 +656,24 @@ { "request": { "method": "GET", - "path": "/datasets/operations/op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef" + "path": "/datasets/operations/op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f" }, "response": { "status": 200, "headers": { "content-type": "application/json", "retry-after": "3", - "x-dfo-trace-id": "1ce68951ada64961b3710bb73127c9d8" + "x-dfo-trace-id": "217766e0425f4916a393331295c4a7e7" }, "json": { "operation": { - "operation_id": "op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef", + "operation_id": "op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f", "status": "running", - "poll": "/api/datasets/operations/op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef", - "retry_after_ms": 2869, + "poll": "/api/datasets/operations/op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f", + "retry_after_ms": 2934, "progress": { - "rows_written": 108935, - "estimate_rows": 108935 + "rows_written": 107252, + "estimate_rows": 107252 } } } @@ -681,24 +682,24 @@ { "request": { "method": "GET", - "path": "/datasets/operations/op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef" + "path": "/datasets/operations/op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f" }, "response": { "status": 200, "headers": { "content-type": "application/json", - "x-dfo-trace-id": "37207f1ea4574e4e8485e8cebd4f4edc" + "x-dfo-trace-id": "c501ba8d087b4561b2ff0e423c719ab0" }, "json": { "operation": { - "operation_id": "op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef", + "operation_id": "op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f", "status": "done" }, "manifest": { "schema_version": 1, "definition": { "schema_version": 1, - "spec_id": "spec_7f538f4f65ac124f47918468b4d2eea7", + "spec_id": "spec_70ddf0ce6a9b3f147063f2adf37fab9e", "identity": { "shape": { "kind": "statvar_schema", @@ -911,14 +912,14 @@ "requested_window": { "kind": "range", "end_year": 2024, - "start_year": 1964 + "start_year": 1967 } } }, - "content_version": "cv_ed2cc83eb28d4e6883cde079f05844ed", - "prepared_at": "2026-10-25T17:38:14Z", + "content_version": "cv_fafc60a507e03b0d42689fb1936127b9", + "prepared_at": "2026-10-26T09:22:44Z", "coverage": { - "rows": 108935, + "rows": 107252, "dimensions": [ { "label": "financingProvider", @@ -940,14 +941,14 @@ }, { "label": "years", - "count": 61 + "count": 58 } ], "window": { "kind": "range", "origin": "query", "end_year": 2024, - "start_year": 1964 + "start_year": 1967 } }, "citation": { @@ -1066,9 +1067,9 @@ "kind": "range", "origin": "query", "end_year": 2024, - "start_year": 1964 + "start_year": 1967 }, - "graph_revision": "dfo-dev-dc-datacommons-service-00273-mmh", + "graph_revision": null, "normalisations": [], "code_index_stamp": { "exported_at": "2026-10-24T19:20:27Z", @@ -1082,7 +1083,7 @@ } ], "capability_version": "dset_76f5fa7244511c58", - "materialiser_build": "99e62038ceb4b459c2ac699549076ff123c166aa", + "materialiser_build": "d80df9f5fd598b7345255470932d202ee5d49942", "resolved_stat_vars": [ { "ref": "dcid:Amount_FinancialFlow_Gross_Disbursement_DAC2aAidType206_Nominal", @@ -1090,15 +1091,15 @@ "financingProvider", "financingRecipient" ], - "observation_count": 108935 + "observation_count": 107252 } ], "family_member_count": 1, "family_member_digest": "1a36e1a7292b1bfff95a5415de0be74cac7bb033217ed50e79faa8ce51a224c0", "frame_grammar_version": "1.1.0", - "origin_catalogue_build_id": "20261024T193016Z-775d36a9", + "origin_catalogue_build_id": "20261026T000018Z-0af2cac5", "served_from": "materialise", - "confirmed_at": "2026-10-25T17:38:17.505656+00:00" + "confirmed_at": "2026-10-26T09:22:46.854499+00:00" }, "warnings": [], "diagnostics": [ @@ -1110,29 +1111,29 @@ ], "artifacts": [ { - "artifact_digest": "sha256:4d80e30e27b5a64706113d54946e3a387e422b1115d1437594ac4b1d4307ffd2", + "artifact_digest": "sha256:a8c742f8f416b2f3414c7a569f7c18b337c5ee9ae3012483583bad0b238f5c61", "rendering": { "bundle": false, "format": "parquet", "layout": 4 }, - "bytes": 472796, + "bytes": 466531, "media_type": "application/vnd.apache.parquet", - "created_at": "2026-10-25T17:38:17.426404+00:00", + "created_at": "2026-10-26T09:22:46.786678+00:00", "tier": "working", - "url": "/api/datasets/spec_7f538f4f65ac124f47918468b4d2eea7/cv_ed2cc83eb28d4e6883cde079f05844ed/files/sha256:4d80e30e27b5a64706113d54946e3a387e422b1115d1437594ac4b1d4307ffd2", + "url": "/api/datasets/spec_70ddf0ce6a9b3f147063f2adf37fab9e/cv_fafc60a507e03b0d42689fb1936127b9/files/sha256:a8c742f8f416b2f3414c7a569f7c18b337c5ee9ae3012483583bad0b238f5c61", "enrichment_stamp": "08ed6c734fc69ea2204a21f4e1dd8b963f14dd1e03a2484c618049ac2e2d93d8" }, { - "artifact_digest": "sha256:4e3ed758ad1a33cf9d150ee5fa71adf7f5bd40e4d342d839633d8386239babe1", + "artifact_digest": "sha256:5247bafa55f84fe2f8bc348601acb955162c39a1a082e939945336470e5c5231", "rendering": { "statistics": "series" }, - "bytes": 144449, + "bytes": 144985, "media_type": "application/vnd.apache.parquet", - "created_at": "2026-10-25T17:38:17.426404+00:00", + "created_at": "2026-10-26T09:22:46.786678+00:00", "tier": "working", - "url": "/api/datasets/spec_7f538f4f65ac124f47918468b4d2eea7/cv_ed2cc83eb28d4e6883cde079f05844ed/files/sha256:4e3ed758ad1a33cf9d150ee5fa71adf7f5bd40e4d342d839633d8386239babe1" + "url": "/api/datasets/spec_70ddf0ce6a9b3f147063f2adf37fab9e/cv_fafc60a507e03b0d42689fb1936127b9/files/sha256:5247bafa55f84fe2f8bc348601acb955162c39a1a082e939945336470e5c5231" } ], "series_count": 3656, @@ -1161,7 +1162,7 @@ "name": "time_period", "kind": "grain", "droppable": false, - "distinct": 61 + "distinct": 58 }, { "name": "value", @@ -1401,7 +1402,7 @@ "varying": [ { "column": "time_period", - "distinct": 61 + "distinct": 58 } ] }, @@ -1425,7 +1426,7 @@ "varying": [ { "column": "time_period", - "distinct": 61 + "distinct": 58 } ] }, @@ -1487,7 +1488,7 @@ "series_coverage_stamp": "e6e717ab8c77e84d010915893ede5809e9ecec67929a07cfafbcc2210edfa1eb", "retention": { "pinned": false, - "held_until": "2026-11-24T17:38:17.425152Z" + "held_until": "2026-11-25T09:22:46.785219Z" } } } @@ -1496,21 +1497,21 @@ { "request": { "method": "GET", - "origin_path": "/api/datasets/spec_7f538f4f65ac124f47918468b4d2eea7/cv_ed2cc83eb28d4e6883cde079f05844ed/files/sha256:4d80e30e27b5a64706113d54946e3a387e422b1115d1437594ac4b1d4307ffd2" + "origin_path": "/api/datasets/spec_70ddf0ce6a9b3f147063f2adf37fab9e/cv_fafc60a507e03b0d42689fb1936127b9/files/sha256:a8c742f8f416b2f3414c7a569f7c18b337c5ee9ae3012483583bad0b238f5c61" }, "response": { "status": 302, "headers": { "content-type": "text/html", - "location": "https://storage.googleapis.com/dev-fin-observatory-datasets-working/sha256%3A4d80e30e27b5a64706113d54946e3a387e422b1115d1437594ac4b1d4307ffd2?X-Goog-Signature=redacted", - "x-dfo-trace-id": "919c1e572d914a608b166556417714c9" + "location": "https://storage.googleapis.com/dev-fin-observatory-datasets-working/sha256%3Aa8c742f8f416b2f3414c7a569f7c18b337c5ee9ae3012483583bad0b238f5c61?X-Goog-Signature=redacted", + "x-dfo-trace-id": "22f0d88923c14d74825b5f14d41c05b8" } } }, { "request": { "method": "GET", - "url": "https://storage.googleapis.com/dev-fin-observatory-datasets-working/sha256%3A4d80e30e27b5a64706113d54946e3a387e422b1115d1437594ac4b1d4307ffd2?X-Goog-Signature=redacted" + "url": "https://storage.googleapis.com/dev-fin-observatory-datasets-working/sha256%3Aa8c742f8f416b2f3414c7a569f7c18b337c5ee9ae3012483583bad0b238f5c61?X-Goog-Signature=redacted" }, "response": { "status": 200, @@ -1524,51 +1525,51 @@ "expect": [ { "dataset": { - "rows": 108935, + "rows": 107252, "columns": [ - "stat_var", - "financingProvider", + "time_period", "financingProvider_label", + "financingRecipient_label", + "value", + "unit_label", + "dac2aAidType_label", + "provenance_label", + "financingProvider", "financingProvider_kind", "financingRecipient", - "financingRecipient_label", "financingRecipient_kind", "dac2aAidType", - "dac2aAidType_label", - "time_period", - "value", "unit", - "unit_label", "currency", "price_basis", "base_year", "measurementMethod", "measurementMethod_label", "provenance", - "provenance_label" + "stat_var" ], "complete": true, "members": [ { "parts": [], - "spec_id": "spec_7f538f4f65ac124f47918468b4d2eea7", - "content_version": "cv_ed2cc83eb28d4e6883cde079f05844ed", - "sentence": "Gross disbursements to the 133 G77 countries from the 32 DAC countries for official development assistance, 1964 to 2024. Current US dollars · OECD DAC2a." + "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." } ], "missing": [], "long_builds": [ { - "operation_id": "op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef", + "operation_id": "op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f", "poll_waits": [ 1.5, 5.0, 1.5, 1.5, 1.5, - 1.786, - 2.268, - 2.869 + 1.784, + 2.289, + 2.934 ], "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 15a5881..5222a2e 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_7f538f4f65ac124f47918468b4d2eea7", + "spec_id": "spec_70ddf0ce6a9b3f147063f2adf37fab9e", "definition": { "schema_version": 1, - "spec_id": "spec_7f538f4f65ac124f47918468b4d2eea7", + "spec_id": "spec_70ddf0ce6a9b3f147063f2adf37fab9e", "identity": { "identity_version": "spec1", "shape": { @@ -226,12 +226,12 @@ }, "requested_window": { "kind": "range", - "start_year": 1964, + "start_year": 1967, "end_year": 2024 } } }, - "sentence": "Gross disbursements to the 133 G77 countries from the 32 DAC countries for official development assistance, 1964 to 2024. Current US dollars · OECD DAC2a.", + "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.", "entity_groups": { "destination": { "label": "G77 countries", @@ -242,7 +242,8 @@ "group_id": "groups/OECD.DAC" } } - } + }, + "party_totals": true } ], "exchanges": [ @@ -254,10 +255,10 @@ "schema_version": 1, "input": { "kind": "spec_id", - "spec_id": "spec_7f538f4f65ac124f47918468b4d2eea7", + "spec_id": "spec_70ddf0ce6a9b3f147063f2adf37fab9e", "definition": { "schema_version": 1, - "spec_id": "spec_7f538f4f65ac124f47918468b4d2eea7", + "spec_id": "spec_70ddf0ce6a9b3f147063f2adf37fab9e", "identity": { "identity_version": "spec1", "shape": { @@ -469,7 +470,7 @@ }, "requested_window": { "kind": "range", - "start_year": 1964, + "start_year": 1967, "end_year": 2024 } } @@ -485,15 +486,15 @@ "status": 202, "headers": { "content-type": "application/json", - "location": "/api/datasets/operations/op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef", + "location": "/api/datasets/operations/op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f", "retry-after": "2", - "x-dfo-trace-id": "5541c591450f479485c421e20fe4d81d" + "x-dfo-trace-id": "9e96509866ff4da09a698df1f19a5cbd" }, "json": { "operation": { - "operation_id": "op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef", + "operation_id": "op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f", "status": "pending", - "poll": "/api/datasets/operations/op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef", + "poll": "/api/datasets/operations/op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f", "retry_after_ms": 1500 } } @@ -502,7 +503,7 @@ { "request": { "method": "GET", - "path": "/datasets/operations/op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef" + "path": "/datasets/operations/op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f" }, "response": { "status": 503, @@ -524,24 +525,24 @@ { "request": { "method": "GET", - "path": "/datasets/operations/op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef" + "path": "/datasets/operations/op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f" }, "response": { "status": 200, "headers": { "content-type": "application/json", "retry-after": "2", - "x-dfo-trace-id": "3416612a1b3f4a2ebbcf8ddeff74b96a" + "x-dfo-trace-id": "6185b86217ef499bb5b6932299df1207" }, "json": { "operation": { - "operation_id": "op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef", + "operation_id": "op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f", "status": "running", - "poll": "/api/datasets/operations/op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef", + "poll": "/api/datasets/operations/op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f", "retry_after_ms": 1500, "progress": { "rows_written": 0, - "estimate_rows": 108935 + "estimate_rows": 107252 } } } @@ -550,24 +551,24 @@ { "request": { "method": "GET", - "path": "/datasets/operations/op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef" + "path": "/datasets/operations/op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f" }, "response": { "status": 200, "headers": { "content-type": "application/json", "retry-after": "2", - "x-dfo-trace-id": "65394508d86f443db7528ac38066b9e3" + "x-dfo-trace-id": "1ebea3ca2d15409c953cd716bdc1fccf" }, "json": { "operation": { - "operation_id": "op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef", + "operation_id": "op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f", "status": "running", - "poll": "/api/datasets/operations/op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef", + "poll": "/api/datasets/operations/op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f", "retry_after_ms": 1500, "progress": { - "rows_written": 64600, - "estimate_rows": 108935 + "rows_written": 61927, + "estimate_rows": 107252 } } } @@ -576,7 +577,7 @@ { "request": { "method": "GET", - "path": "/datasets/operations/op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef" + "path": "/datasets/operations/op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f" }, "response": { "status": 503, @@ -598,7 +599,7 @@ { "request": { "method": "GET", - "path": "/datasets/operations/op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef" + "path": "/datasets/operations/op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f" }, "response": { "status": 503, @@ -620,24 +621,24 @@ { "request": { "method": "GET", - "path": "/datasets/operations/op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef" + "path": "/datasets/operations/op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f" }, "response": { "status": 200, "headers": { "content-type": "application/json", "retry-after": "2", - "x-dfo-trace-id": "7a2d07cfe29b4993a374ee71104d461a" + "x-dfo-trace-id": "94bb5a8a7c2041969d9a9118b75dc4aa" }, "json": { "operation": { - "operation_id": "op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef", + "operation_id": "op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f", "status": "running", - "poll": "/api/datasets/operations/op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef", + "poll": "/api/datasets/operations/op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f", "retry_after_ms": 1500, "progress": { - "rows_written": 108935, - "estimate_rows": 108935 + "rows_written": 107252, + "estimate_rows": 107252 } } } @@ -646,24 +647,24 @@ { "request": { "method": "GET", - "path": "/datasets/operations/op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef" + "path": "/datasets/operations/op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f" }, "response": { "status": 200, "headers": { "content-type": "application/json", "retry-after": "2", - "x-dfo-trace-id": "7c7c516f463a471583976147759c6250" + "x-dfo-trace-id": "c78757a54b9f4b6786a784f8a47ad5b4" }, "json": { "operation": { - "operation_id": "op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef", + "operation_id": "op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f", "status": "running", - "poll": "/api/datasets/operations/op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef", - "retry_after_ms": 1786, + "poll": "/api/datasets/operations/op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f", + "retry_after_ms": 1784, "progress": { - "rows_written": 108935, - "estimate_rows": 108935 + "rows_written": 107252, + "estimate_rows": 107252 } } } @@ -672,24 +673,24 @@ { "request": { "method": "GET", - "path": "/datasets/operations/op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef" + "path": "/datasets/operations/op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f" }, "response": { "status": 200, "headers": { "content-type": "application/json", "retry-after": "3", - "x-dfo-trace-id": "9ddce1ae50fd4187abeb32c45a0f03ba" + "x-dfo-trace-id": "914bfd57942740b893ba9ca1b4f4591b" }, "json": { "operation": { - "operation_id": "op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef", + "operation_id": "op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f", "status": "running", - "poll": "/api/datasets/operations/op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef", - "retry_after_ms": 2268, + "poll": "/api/datasets/operations/op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f", + "retry_after_ms": 2289, "progress": { - "rows_written": 108935, - "estimate_rows": 108935 + "rows_written": 107252, + "estimate_rows": 107252 } } } @@ -698,24 +699,24 @@ { "request": { "method": "GET", - "path": "/datasets/operations/op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef" + "path": "/datasets/operations/op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f" }, "response": { "status": 200, "headers": { "content-type": "application/json", "retry-after": "3", - "x-dfo-trace-id": "1ce68951ada64961b3710bb73127c9d8" + "x-dfo-trace-id": "217766e0425f4916a393331295c4a7e7" }, "json": { "operation": { - "operation_id": "op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef", + "operation_id": "op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f", "status": "running", - "poll": "/api/datasets/operations/op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef", - "retry_after_ms": 2869, + "poll": "/api/datasets/operations/op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f", + "retry_after_ms": 2934, "progress": { - "rows_written": 108935, - "estimate_rows": 108935 + "rows_written": 107252, + "estimate_rows": 107252 } } } @@ -724,24 +725,24 @@ { "request": { "method": "GET", - "path": "/datasets/operations/op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef" + "path": "/datasets/operations/op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f" }, "response": { "status": 200, "headers": { "content-type": "application/json", - "x-dfo-trace-id": "37207f1ea4574e4e8485e8cebd4f4edc" + "x-dfo-trace-id": "c501ba8d087b4561b2ff0e423c719ab0" }, "json": { "operation": { - "operation_id": "op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef", + "operation_id": "op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f", "status": "done" }, "manifest": { "schema_version": 1, "definition": { "schema_version": 1, - "spec_id": "spec_7f538f4f65ac124f47918468b4d2eea7", + "spec_id": "spec_70ddf0ce6a9b3f147063f2adf37fab9e", "identity": { "shape": { "kind": "statvar_schema", @@ -954,14 +955,14 @@ "requested_window": { "kind": "range", "end_year": 2024, - "start_year": 1964 + "start_year": 1967 } } }, - "content_version": "cv_ed2cc83eb28d4e6883cde079f05844ed", - "prepared_at": "2026-10-25T17:38:14Z", + "content_version": "cv_fafc60a507e03b0d42689fb1936127b9", + "prepared_at": "2026-10-26T09:22:44Z", "coverage": { - "rows": 108935, + "rows": 107252, "dimensions": [ { "label": "financingProvider", @@ -983,14 +984,14 @@ }, { "label": "years", - "count": 61 + "count": 58 } ], "window": { "kind": "range", "origin": "query", "end_year": 2024, - "start_year": 1964 + "start_year": 1967 } }, "citation": { @@ -1109,9 +1110,9 @@ "kind": "range", "origin": "query", "end_year": 2024, - "start_year": 1964 + "start_year": 1967 }, - "graph_revision": "dfo-dev-dc-datacommons-service-00273-mmh", + "graph_revision": null, "normalisations": [], "code_index_stamp": { "exported_at": "2026-10-24T19:20:27Z", @@ -1125,7 +1126,7 @@ } ], "capability_version": "dset_76f5fa7244511c58", - "materialiser_build": "99e62038ceb4b459c2ac699549076ff123c166aa", + "materialiser_build": "d80df9f5fd598b7345255470932d202ee5d49942", "resolved_stat_vars": [ { "ref": "dcid:Amount_FinancialFlow_Gross_Disbursement_DAC2aAidType206_Nominal", @@ -1133,15 +1134,15 @@ "financingProvider", "financingRecipient" ], - "observation_count": 108935 + "observation_count": 107252 } ], "family_member_count": 1, "family_member_digest": "1a36e1a7292b1bfff95a5415de0be74cac7bb033217ed50e79faa8ce51a224c0", "frame_grammar_version": "1.1.0", - "origin_catalogue_build_id": "20261024T193016Z-775d36a9", + "origin_catalogue_build_id": "20261026T000018Z-0af2cac5", "served_from": "materialise", - "confirmed_at": "2026-10-25T17:38:17.505656+00:00" + "confirmed_at": "2026-10-26T09:22:46.854499+00:00" }, "warnings": [], "diagnostics": [ @@ -1153,29 +1154,29 @@ ], "artifacts": [ { - "artifact_digest": "sha256:4d80e30e27b5a64706113d54946e3a387e422b1115d1437594ac4b1d4307ffd2", + "artifact_digest": "sha256:a8c742f8f416b2f3414c7a569f7c18b337c5ee9ae3012483583bad0b238f5c61", "rendering": { "bundle": false, "format": "parquet", "layout": 4 }, - "bytes": 472796, + "bytes": 466531, "media_type": "application/vnd.apache.parquet", - "created_at": "2026-10-25T17:38:17.426404+00:00", + "created_at": "2026-10-26T09:22:46.786678+00:00", "tier": "working", - "url": "/api/datasets/spec_7f538f4f65ac124f47918468b4d2eea7/cv_ed2cc83eb28d4e6883cde079f05844ed/files/sha256:4d80e30e27b5a64706113d54946e3a387e422b1115d1437594ac4b1d4307ffd2", + "url": "/api/datasets/spec_70ddf0ce6a9b3f147063f2adf37fab9e/cv_fafc60a507e03b0d42689fb1936127b9/files/sha256:a8c742f8f416b2f3414c7a569f7c18b337c5ee9ae3012483583bad0b238f5c61", "enrichment_stamp": "08ed6c734fc69ea2204a21f4e1dd8b963f14dd1e03a2484c618049ac2e2d93d8" }, { - "artifact_digest": "sha256:4e3ed758ad1a33cf9d150ee5fa71adf7f5bd40e4d342d839633d8386239babe1", + "artifact_digest": "sha256:5247bafa55f84fe2f8bc348601acb955162c39a1a082e939945336470e5c5231", "rendering": { "statistics": "series" }, - "bytes": 144449, + "bytes": 144985, "media_type": "application/vnd.apache.parquet", - "created_at": "2026-10-25T17:38:17.426404+00:00", + "created_at": "2026-10-26T09:22:46.786678+00:00", "tier": "working", - "url": "/api/datasets/spec_7f538f4f65ac124f47918468b4d2eea7/cv_ed2cc83eb28d4e6883cde079f05844ed/files/sha256:4e3ed758ad1a33cf9d150ee5fa71adf7f5bd40e4d342d839633d8386239babe1" + "url": "/api/datasets/spec_70ddf0ce6a9b3f147063f2adf37fab9e/cv_fafc60a507e03b0d42689fb1936127b9/files/sha256:5247bafa55f84fe2f8bc348601acb955162c39a1a082e939945336470e5c5231" } ], "series_count": 3656, @@ -1204,7 +1205,7 @@ "name": "time_period", "kind": "grain", "droppable": false, - "distinct": 61 + "distinct": 58 }, { "name": "value", @@ -1444,7 +1445,7 @@ "varying": [ { "column": "time_period", - "distinct": 61 + "distinct": 58 } ] }, @@ -1468,7 +1469,7 @@ "varying": [ { "column": "time_period", - "distinct": 61 + "distinct": 58 } ] }, @@ -1530,7 +1531,7 @@ "series_coverage_stamp": "e6e717ab8c77e84d010915893ede5809e9ecec67929a07cfafbcc2210edfa1eb", "retention": { "pinned": false, - "held_until": "2026-11-24T17:38:17.425152Z" + "held_until": "2026-11-25T09:22:46.785219Z" } } } @@ -1539,21 +1540,21 @@ { "request": { "method": "GET", - "origin_path": "/api/datasets/spec_7f538f4f65ac124f47918468b4d2eea7/cv_ed2cc83eb28d4e6883cde079f05844ed/files/sha256:4d80e30e27b5a64706113d54946e3a387e422b1115d1437594ac4b1d4307ffd2" + "origin_path": "/api/datasets/spec_70ddf0ce6a9b3f147063f2adf37fab9e/cv_fafc60a507e03b0d42689fb1936127b9/files/sha256:a8c742f8f416b2f3414c7a569f7c18b337c5ee9ae3012483583bad0b238f5c61" }, "response": { "status": 302, "headers": { "content-type": "text/html", - "location": "https://storage.googleapis.com/dev-fin-observatory-datasets-working/sha256%3A4d80e30e27b5a64706113d54946e3a387e422b1115d1437594ac4b1d4307ffd2?X-Goog-Signature=redacted", - "x-dfo-trace-id": "919c1e572d914a608b166556417714c9" + "location": "https://storage.googleapis.com/dev-fin-observatory-datasets-working/sha256%3Aa8c742f8f416b2f3414c7a569f7c18b337c5ee9ae3012483583bad0b238f5c61?X-Goog-Signature=redacted", + "x-dfo-trace-id": "22f0d88923c14d74825b5f14d41c05b8" } } }, { "request": { "method": "GET", - "url": "https://storage.googleapis.com/dev-fin-observatory-datasets-working/sha256%3A4d80e30e27b5a64706113d54946e3a387e422b1115d1437594ac4b1d4307ffd2?X-Goog-Signature=redacted" + "url": "https://storage.googleapis.com/dev-fin-observatory-datasets-working/sha256%3Aa8c742f8f416b2f3414c7a569f7c18b337c5ee9ae3012483583bad0b238f5c61?X-Goog-Signature=redacted" }, "response": { "status": 200, @@ -1567,42 +1568,42 @@ "expect": [ { "dataset": { - "rows": 108935, + "rows": 107252, "columns": [ - "stat_var", - "financingProvider", + "time_period", "financingProvider_label", + "financingRecipient_label", + "value", + "unit_label", + "dac2aAidType_label", + "provenance_label", + "financingProvider", "financingProvider_kind", "financingRecipient", - "financingRecipient_label", "financingRecipient_kind", "dac2aAidType", - "dac2aAidType_label", - "time_period", - "value", "unit", - "unit_label", "currency", "price_basis", "base_year", "measurementMethod", "measurementMethod_label", "provenance", - "provenance_label" + "stat_var" ], "complete": true, "members": [ { "parts": [], - "spec_id": "spec_7f538f4f65ac124f47918468b4d2eea7", - "content_version": "cv_ed2cc83eb28d4e6883cde079f05844ed", - "sentence": "Gross disbursements to the 133 G77 countries from the 32 DAC countries for official development assistance, 1964 to 2024. Current US dollars · OECD DAC2a." + "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." } ], "missing": [], "long_builds": [ { - "operation_id": "op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef", + "operation_id": "op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f", "poll_waits": [ 1.5, 1.5, @@ -1611,9 +1612,9 @@ 1.5, 1.5, 1.5, - 1.786, - 2.268, - 2.869 + 1.784, + 2.289, + 2.934 ], "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 39556c4..9a95b17 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 @@ -167,7 +167,8 @@ }, "options": { "format": "parquet", - "bundle": false + "bundle": false, + "without_party_totals": true } } }, @@ -175,7 +176,7 @@ "status": 200, "headers": { "content-type": "application/json", - "x-dfo-trace-id": "cdb2d56286eb4d468f447309c3bd06d9" + "x-dfo-trace-id": "b89cda3bb794448abf06b56c955d754e" }, "json": { "schema_version": 1, @@ -582,7 +583,7 @@ "frame_grammar_version": "1.1.0", "origin_catalogue_build_id": "20261019T174519Z-2e5e8cfd", "served_from": "head", - "confirmed_at": "2026-10-25T17:30:48.703616+00:00" + "confirmed_at": "2026-10-26T09:18:06.976633+00:00" }, "warnings": [ { @@ -604,7 +605,8 @@ "rendering": { "bundle": false, "format": "parquet", - "layout": 4 + "layout": 4, + "without_party_totals": true }, "bytes": 9599, "media_type": "application/vnd.apache.parquet", @@ -913,7 +915,7 @@ "headers": { "content-type": "text/html", "location": "bytes", - "x-dfo-trace-id": "114f3d3a1c78408c92fd29cc76887fdc" + "x-dfo-trace-id": "cf3f86713afb44c98d21fbf9731d66e3" } } }, @@ -936,32 +938,32 @@ "dataset": { "rows": 4, "columns": [ - "stat_var", - "financingProvider", + "time_period", "financingProvider_label", + "financingRecipient_label", + "crsPurpose_label", + "value", + "unit_label", + "crsTypeOfFlow_label", + "provenance_label", + "financingProvider", "financingProvider_kind", "financingRecipient", - "financingRecipient_label", "financingRecipient_kind", "crsCooperationModality", "crsCooperationModality_label", "crsPurpose", - "crsPurpose_label", "crsTypeOfFinance", "crsTypeOfFinance_label", "crsTypeOfFlow", - "crsTypeOfFlow_label", - "time_period", - "value", "unit", - "unit_label", "currency", "price_basis", "base_year", "measurementMethod", "measurementMethod_label", "provenance", - "provenance_label" + "stat_var" ], "complete": true, "members": [ 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 4b656df..c5dc5c9 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": "99e62038ceb4b459c2ac699549076ff123c166aa", - "recorded_at": "2026-10-25T17:35:16Z" + "dfo_commit": "d80df9f5fd598b7345255470932d202ee5d49942", + "recorded_at": "2026-10-26T09:22:31Z" }, "call": [ { @@ -174,7 +174,8 @@ }, "options": { "format": "parquet", - "bundle": false + "bundle": false, + "without_party_totals": true } } }, @@ -182,16 +183,37 @@ "status": 400, "headers": { "content-type": "application/problem+json", - "x-dfo-trace-id": "2e9e43a5095e4b10b1589c58cb4f8ecd" + "x-dfo-trace-id": "827e62e72957420a91edcc1564671a13" }, "json": { "type": "/codes/request_invalid", "title": "Bad Request", "status": 400, - "detail": "Value error, unknown facet axis/axes: colour", + "detail": "unknown facet axis 'colour'. The facet axes are provenance, measurementMethod, unit.", "code": "request_invalid", - "pointer": "/input/scope", - "trace_id": "2e9e43a5095e4b10b1589c58cb4f8ecd", + "pointer": "/input/scope/facets/colour", + "issues": [ + { + "pointer": "/input/scope/facets/colour", + "axis": "colour", + "alternatives": [ + { + "ref": "provenance", + "label": "provenance" + }, + { + "ref": "measurementMethod", + "label": "measurementMethod" + }, + { + "ref": "unit", + "label": "unit" + } + ], + "truncated": false + } + ], + "trace_id": "827e62e72957420a91edcc1564671a13", "capability_version": "dset_76f5fa7244511c58", "retryable": false } @@ -203,7 +225,7 @@ "error": { "class": "InvalidRequestError", "code": "request_invalid", - "trace_id": "2e9e43a5095e4b10b1589c58cb4f8ecd" + "trace_id": "827e62e72957420a91edcc1564671a13" } } ] 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 ef73afb..8393370 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 @@ -174,7 +174,8 @@ }, "options": { "format": "parquet", - "bundle": false + "bundle": false, + "without_party_totals": true } } }, @@ -182,7 +183,7 @@ "status": 200, "headers": { "content-type": "application/json", - "x-dfo-trace-id": "dbd045d5a84b4818a273bafc3e808e9c" + "x-dfo-trace-id": "250fbb95951e4a8c8d847cbcde0ae4f9" }, "json": { "schema_version": 1, @@ -589,7 +590,7 @@ "frame_grammar_version": "1.1.0", "origin_catalogue_build_id": "20261019T174519Z-2e5e8cfd", "served_from": "head", - "confirmed_at": "2026-10-25T17:30:48.703616+00:00" + "confirmed_at": "2026-10-26T09:18:06.976633+00:00" }, "warnings": [ { @@ -611,7 +612,8 @@ "rendering": { "bundle": false, "format": "parquet", - "layout": 4 + "layout": 4, + "without_party_totals": true }, "bytes": 9599, "media_type": "application/vnd.apache.parquet", @@ -996,7 +998,7 @@ "status": 200, "headers": { "content-type": "application/json", - "x-dfo-trace-id": "10b2cc32955e4dd1bdbb44ea217a46a1" + "x-dfo-trace-id": "ff646392059e46e68f83a2753e921d6a" }, "json": { "schema_version": 1, @@ -1005,11 +1007,11 @@ "extract_skipped": true }, "diagnostics": { - "engine_build": "99e62038ceb4b459c2ac699549076ff123c166aa", - "trace_id": "10b2cc32955e4dd1bdbb44ea217a46a1", + "engine_build": "d80df9f5fd598b7345255470932d202ee5d49942", + "trace_id": "ff646392059e46e68f83a2753e921d6a", "warnings": [], "timing_ms": { - "total": 2, + "total": 1, "by_step": { "coverage": 0 } @@ -2023,7 +2025,7 @@ "start_year": 2020, "end_year": 2023 }, - "capability_version": "cap_88defe77cc79e0c0" + "capability_version": "cap_765c9d2a0c7529b9" }, "confidence": "high", "available_at_place": true, @@ -4518,7 +4520,7 @@ "error": { "class": "ContractError", "code": "contract_violation", - "trace_id": "10b2cc32955e4dd1bdbb44ea217a46a1" + "trace_id": "ff646392059e46e68f83a2753e921d6a" } } ] 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 fce4fa5..a796ffd 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 @@ -167,7 +167,8 @@ }, "options": { "format": "parquet", - "bundle": false + "bundle": false, + "without_party_totals": true } } }, @@ -175,7 +176,7 @@ "status": 200, "headers": { "content-type": "application/json", - "x-dfo-trace-id": "cdb2d56286eb4d468f447309c3bd06d9" + "x-dfo-trace-id": "b89cda3bb794448abf06b56c955d754e" }, "json": { "schema_version": 1, @@ -582,7 +583,7 @@ "frame_grammar_version": "1.1.0", "origin_catalogue_build_id": "20261019T174519Z-2e5e8cfd", "served_from": "head", - "confirmed_at": "2026-10-25T17:30:48.703616+00:00" + "confirmed_at": "2026-10-26T09:18:06.976633+00:00" }, "warnings": [ { @@ -604,7 +605,8 @@ "rendering": { "bundle": false, "format": "parquet", - "layout": 4 + "layout": 4, + "without_party_totals": true }, "bytes": 9599, "media_type": "application/vnd.apache.parquet", @@ -913,7 +915,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": "114f3d3a1c78408c92fd29cc76887fdc" + "x-dfo-trace-id": "cf3f86713afb44c98d21fbf9731d66e3" } } }, @@ -936,32 +938,32 @@ "dataset": { "rows": 4, "columns": [ - "stat_var", - "financingProvider", + "time_period", "financingProvider_label", + "financingRecipient_label", + "crsPurpose_label", + "value", + "unit_label", + "crsTypeOfFlow_label", + "provenance_label", + "financingProvider", "financingProvider_kind", "financingRecipient", - "financingRecipient_label", "financingRecipient_kind", "crsCooperationModality", "crsCooperationModality_label", "crsPurpose", - "crsPurpose_label", "crsTypeOfFinance", "crsTypeOfFinance_label", "crsTypeOfFlow", - "crsTypeOfFlow_label", - "time_period", - "value", "unit", - "unit_label", "currency", "price_basis", "base_year", "measurementMethod", "measurementMethod_label", "provenance", - "provenance_label" + "stat_var" ], "complete": true, "members": [ 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 dc19b1a..dcf6a62 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 @@ -167,7 +167,8 @@ }, "options": { "format": "parquet", - "bundle": false + "bundle": false, + "without_party_totals": true } } }, @@ -175,7 +176,7 @@ "status": 200, "headers": { "content-type": "application/json", - "x-dfo-trace-id": "cdb2d56286eb4d468f447309c3bd06d9" + "x-dfo-trace-id": "b89cda3bb794448abf06b56c955d754e" }, "json": { "schema_version": 1, @@ -582,7 +583,7 @@ "frame_grammar_version": "1.1.0", "origin_catalogue_build_id": "20261019T174519Z-2e5e8cfd", "served_from": "head", - "confirmed_at": "2026-10-25T17:30:48.703616+00:00" + "confirmed_at": "2026-10-26T09:18:06.976633+00:00" }, "warnings": [ { @@ -604,7 +605,8 @@ "rendering": { "bundle": false, "format": "parquet", - "layout": 4 + "layout": 4, + "without_party_totals": true }, "bytes": 9599, "media_type": "application/vnd.apache.parquet", @@ -913,7 +915,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": "114f3d3a1c78408c92fd29cc76887fdc" + "x-dfo-trace-id": "cf3f86713afb44c98d21fbf9731d66e3" } } }, @@ -940,7 +942,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": "114f3d3a1c78408c92fd29cc76887fdc" + "x-dfo-trace-id": "cf3f86713afb44c98d21fbf9731d66e3" } } }, @@ -963,32 +965,32 @@ "dataset": { "rows": 4, "columns": [ - "stat_var", - "financingProvider", + "time_period", "financingProvider_label", + "financingRecipient_label", + "crsPurpose_label", + "value", + "unit_label", + "crsTypeOfFlow_label", + "provenance_label", + "financingProvider", "financingProvider_kind", "financingRecipient", - "financingRecipient_label", "financingRecipient_kind", "crsCooperationModality", "crsCooperationModality_label", "crsPurpose", - "crsPurpose_label", "crsTypeOfFinance", "crsTypeOfFinance_label", "crsTypeOfFlow", - "crsTypeOfFlow_label", - "time_period", - "value", "unit", - "unit_label", "currency", "price_basis", "base_year", "measurementMethod", "measurementMethod_label", "provenance", - "provenance_label" + "stat_var" ], "complete": true, "members": [ 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 51014a0..575a504 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 @@ -167,7 +167,8 @@ }, "options": { "format": "parquet", - "bundle": false + "bundle": false, + "without_party_totals": true } } }, @@ -175,7 +176,7 @@ "status": 200, "headers": { "content-type": "application/json", - "x-dfo-trace-id": "cdb2d56286eb4d468f447309c3bd06d9" + "x-dfo-trace-id": "b89cda3bb794448abf06b56c955d754e" }, "json": { "schema_version": 1, @@ -582,7 +583,7 @@ "frame_grammar_version": "1.1.0", "origin_catalogue_build_id": "20261019T174519Z-2e5e8cfd", "served_from": "head", - "confirmed_at": "2026-10-25T17:30:48.703616+00:00" + "confirmed_at": "2026-10-26T09:18:06.976633+00:00" }, "warnings": [ { @@ -604,7 +605,8 @@ "rendering": { "bundle": false, "format": "parquet", - "layout": 4 + "layout": 4, + "without_party_totals": true }, "bytes": 9599, "media_type": "application/vnd.apache.parquet", @@ -909,7 +911,7 @@ "error": { "class": "ContractError", "code": "contract_violation", - "trace_id": "cdb2d56286eb4d468f447309c3bd06d9" + "trace_id": "b89cda3bb794448abf06b56c955d754e" } } ] 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 63d9e87..03d5a61 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 @@ -168,7 +168,8 @@ }, "options": { "format": "parquet", - "bundle": false + "bundle": false, + "without_party_totals": true } } }, @@ -583,7 +584,7 @@ "frame_grammar_version": "1.1.0", "origin_catalogue_build_id": "20261019T174519Z-2e5e8cfd", "served_from": "head", - "confirmed_at": "2026-10-25T17:30:48.703616+00:00" + "confirmed_at": "2026-10-26T09:18:06.976633+00:00" }, "warnings": [ { @@ -605,7 +606,8 @@ "rendering": { "bundle": false, "format": "parquet", - "layout": 4 + "layout": 4, + "without_party_totals": true }, "bytes": 9599, "media_type": "application/vnd.apache.parquet", 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 9e3366f..fee7446 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": "7abc6f06215b4187a4280d87d6f8a51a" + "x-dfo-trace-id": "c7cb40f3790f4a15a0ddcad0cc93c9bb" }, "json": { "schema_version": 1, @@ -45,8 +45,8 @@ "extract_skipped": true }, "diagnostics": { - "engine_build": "99e62038ceb4b459c2ac699549076ff123c166aa", - "trace_id": "7abc6f06215b4187a4280d87d6f8a51a", + "engine_build": "d80df9f5fd598b7345255470932d202ee5d49942", + "trace_id": "c7cb40f3790f4a15a0ddcad0cc93c9bb", "warnings": [], "timing_ms": { "total": 3, @@ -74,30 +74,30 @@ } ], "timing_ms": { - "total": 1669, + "total": 3011, "by_step": { - "recall": 397, + "recall": 457, "phase_resolve_places": 0, "phase_check_entities": 0, - "shape_arcs": 1, - "shape_probe_coverage": 4, - "shape_probe": 115, - "shape_groups": 53, + "shape_arcs": 2, + "shape_probe_coverage": 8, + "shape_probe": 114, + "shape_groups": 579, "shape_labels": 1, - "shape_admission": 1, + "shape_admission": 2, "phase_derive_shapes": 0, - "shape": 276, + "shape": 1247, "phase_prune_and_rank": 0, - "bind": 214, - "phase_bind": 203, - "phase_settle": 45, - "phase_place_bindings": 20, + "bind": 266, + "phase_bind": 327, + "phase_settle": 46, + "phase_place_bindings": 57, "phase_facet_requests": 0, - "materialise": 28, - "phase_materialise": 196, - "answer": 145, - "options": 50, - "phase_outcome": 95 + "materialise": 44, + "phase_materialise": 200, + "answer": 220, + "options": 55, + "phase_outcome": 92 } }, "restatement": { @@ -1197,7 +1197,7 @@ "selected": [] } ], - "capability_version": "cap_88defe77cc79e0c0", + "capability_version": "cap_765c9d2a0c7529b9", "default_reading": { "applied": true, "removed_stat_vars": [] @@ -3787,7 +3787,8 @@ }, "options": { "format": "parquet", - "bundle": false + "bundle": false, + "without_party_totals": true } } }, @@ -3795,7 +3796,7 @@ "status": 200, "headers": { "content-type": "application/json", - "x-dfo-trace-id": "70ac3c153571497dab413643b6537466" + "x-dfo-trace-id": "4c3f35c8c0d44b99941a73a9519b41d2" }, "json": { "schema_version": 1, @@ -4196,7 +4197,7 @@ "frame_grammar_version": "1.1.0", "origin_catalogue_build_id": "20261011T194155Z-80081f08", "served_from": "head", - "confirmed_at": "2026-10-25T17:22:10.027136+00:00" + "confirmed_at": "2026-10-26T09:17:22.037029+00:00" }, "warnings": [ { @@ -4218,7 +4219,8 @@ "rendering": { "bundle": false, "format": "parquet", - "layout": 4 + "layout": 4, + "without_party_totals": true }, "bytes": 9842, "media_type": "application/vnd.apache.parquet", @@ -4541,7 +4543,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": "d2d4306f79d2411ebcd110cc1e26f49d" + "x-dfo-trace-id": "333ab72de55449ed8288a5f458406a4c" } } }, @@ -4576,32 +4578,32 @@ "dataset": { "rows": 30, "columns": [ - "stat_var", - "financingProvider", + "time_period", "financingProvider_label", + "financingRecipient_label", + "crsPurpose_label", + "value", + "unit_label", + "crsTypeOfFlow_label", + "provenance_label", + "financingProvider", "financingProvider_kind", "financingRecipient", - "financingRecipient_label", "financingRecipient_kind", "crsCooperationModality", "crsCooperationModality_label", "crsPurpose", - "crsPurpose_label", "crsTypeOfFinance", "crsTypeOfFinance_label", "crsTypeOfFlow", - "crsTypeOfFlow_label", - "time_period", - "value", "unit", - "unit_label", "currency", "price_basis", "base_year", "measurementMethod", "measurementMethod_label", "provenance", - "provenance_label" + "stat_var" ], "complete": true, "members": [ 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 2c53e3b..a65adda 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": "99e62038ceb4b459c2ac699549076ff123c166aa", - "recorded_at": "2026-10-25T17:38:05Z" + "dfo_commit": "d80df9f5fd598b7345255470932d202ee5d49942", + "recorded_at": "2026-10-26T09:22:34Z" }, "call": [ { "op": "mint", "spec": { - "spec_id": "spec_7f538f4f65ac124f47918468b4d2eea7", + "spec_id": "spec_70ddf0ce6a9b3f147063f2adf37fab9e", "definition": { "schema_version": 1, - "spec_id": "spec_7f538f4f65ac124f47918468b4d2eea7", + "spec_id": "spec_70ddf0ce6a9b3f147063f2adf37fab9e", "identity": { "identity_version": "spec1", "shape": { @@ -227,12 +227,12 @@ }, "requested_window": { "kind": "range", - "start_year": 1964, + "start_year": 1967, "end_year": 2024 } } }, - "sentence": "Gross disbursements to the 133 G77 countries from the 32 DAC countries for official development assistance, 1964 to 2024. Current US dollars · OECD DAC2a.", + "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.", "entity_groups": { "destination": { "label": "G77 countries", @@ -258,10 +258,10 @@ "schema_version": 1, "input": { "kind": "spec_id", - "spec_id": "spec_7f538f4f65ac124f47918468b4d2eea7", + "spec_id": "spec_70ddf0ce6a9b3f147063f2adf37fab9e", "definition": { "schema_version": 1, - "spec_id": "spec_7f538f4f65ac124f47918468b4d2eea7", + "spec_id": "spec_70ddf0ce6a9b3f147063f2adf37fab9e", "identity": { "identity_version": "spec1", "shape": { @@ -473,7 +473,7 @@ }, "requested_window": { "kind": "range", - "start_year": 1964, + "start_year": 1967, "end_year": 2024 } } @@ -489,15 +489,15 @@ "status": 202, "headers": { "content-type": "application/json", - "location": "/api/datasets/operations/op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef", + "location": "/api/datasets/operations/op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f", "retry-after": "2", - "x-dfo-trace-id": "5541c591450f479485c421e20fe4d81d" + "x-dfo-trace-id": "9e96509866ff4da09a698df1f19a5cbd" }, "json": { "operation": { - "operation_id": "op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef", + "operation_id": "op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f", "status": "pending", - "poll": "/api/datasets/operations/op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef", + "poll": "/api/datasets/operations/op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f", "retry_after_ms": 1500 } } @@ -506,24 +506,24 @@ { "request": { "method": "GET", - "path": "/datasets/operations/op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef" + "path": "/datasets/operations/op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f" }, "response": { "status": 200, "headers": { "content-type": "application/json", "retry-after": "2", - "x-dfo-trace-id": "3416612a1b3f4a2ebbcf8ddeff74b96a" + "x-dfo-trace-id": "6185b86217ef499bb5b6932299df1207" }, "json": { "operation": { - "operation_id": "op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef", + "operation_id": "op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f", "status": "running", - "poll": "/api/datasets/operations/op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef", + "poll": "/api/datasets/operations/op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f", "retry_after_ms": 1500, "progress": { "rows_written": 0, - "estimate_rows": 108935 + "estimate_rows": 107252 } } } @@ -532,24 +532,24 @@ { "request": { "method": "GET", - "path": "/datasets/operations/op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef" + "path": "/datasets/operations/op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f" }, "response": { "status": 200, "headers": { "content-type": "application/json", "retry-after": "2", - "x-dfo-trace-id": "65394508d86f443db7528ac38066b9e3" + "x-dfo-trace-id": "1ebea3ca2d15409c953cd716bdc1fccf" }, "json": { "operation": { - "operation_id": "op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef", + "operation_id": "op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f", "status": "running", - "poll": "/api/datasets/operations/op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef", + "poll": "/api/datasets/operations/op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f", "retry_after_ms": 1500, "progress": { - "rows_written": 64600, - "estimate_rows": 108935 + "rows_written": 61927, + "estimate_rows": 107252 } } } @@ -558,24 +558,24 @@ { "request": { "method": "GET", - "path": "/datasets/operations/op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef" + "path": "/datasets/operations/op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f" }, "response": { "status": 200, "headers": { "content-type": "application/json", "retry-after": "2", - "x-dfo-trace-id": "7a2d07cfe29b4993a374ee71104d461a" + "x-dfo-trace-id": "94bb5a8a7c2041969d9a9118b75dc4aa" }, "json": { "operation": { - "operation_id": "op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef", + "operation_id": "op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f", "status": "running", - "poll": "/api/datasets/operations/op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef", + "poll": "/api/datasets/operations/op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f", "retry_after_ms": 1500, "progress": { - "rows_written": 108935, - "estimate_rows": 108935 + "rows_written": 107252, + "estimate_rows": 107252 } } } @@ -584,24 +584,24 @@ { "request": { "method": "GET", - "path": "/datasets/operations/op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef" + "path": "/datasets/operations/op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f" }, "response": { "status": 200, "headers": { "content-type": "application/json", "retry-after": "2", - "x-dfo-trace-id": "7c7c516f463a471583976147759c6250" + "x-dfo-trace-id": "c78757a54b9f4b6786a784f8a47ad5b4" }, "json": { "operation": { - "operation_id": "op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef", + "operation_id": "op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f", "status": "running", - "poll": "/api/datasets/operations/op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef", - "retry_after_ms": 1786, + "poll": "/api/datasets/operations/op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f", + "retry_after_ms": 1784, "progress": { - "rows_written": 108935, - "estimate_rows": 108935 + "rows_written": 107252, + "estimate_rows": 107252 } } } @@ -610,24 +610,24 @@ { "request": { "method": "GET", - "path": "/datasets/operations/op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef" + "path": "/datasets/operations/op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f" }, "response": { "status": 200, "headers": { "content-type": "application/json", "retry-after": "3", - "x-dfo-trace-id": "9ddce1ae50fd4187abeb32c45a0f03ba" + "x-dfo-trace-id": "914bfd57942740b893ba9ca1b4f4591b" }, "json": { "operation": { - "operation_id": "op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef", + "operation_id": "op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f", "status": "running", - "poll": "/api/datasets/operations/op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef", - "retry_after_ms": 2268, + "poll": "/api/datasets/operations/op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f", + "retry_after_ms": 2289, "progress": { - "rows_written": 108935, - "estimate_rows": 108935 + "rows_written": 107252, + "estimate_rows": 107252 } } } @@ -636,24 +636,24 @@ { "request": { "method": "GET", - "path": "/datasets/operations/op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef" + "path": "/datasets/operations/op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f" }, "response": { "status": 200, "headers": { "content-type": "application/json", "retry-after": "3", - "x-dfo-trace-id": "1ce68951ada64961b3710bb73127c9d8" + "x-dfo-trace-id": "217766e0425f4916a393331295c4a7e7" }, "json": { "operation": { - "operation_id": "op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef", + "operation_id": "op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f", "status": "running", - "poll": "/api/datasets/operations/op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef", - "retry_after_ms": 2869, + "poll": "/api/datasets/operations/op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f", + "retry_after_ms": 2934, "progress": { - "rows_written": 108935, - "estimate_rows": 108935 + "rows_written": 107252, + "estimate_rows": 107252 } } } @@ -662,24 +662,24 @@ { "request": { "method": "GET", - "path": "/datasets/operations/op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef" + "path": "/datasets/operations/op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f" }, "response": { "status": 200, "headers": { "content-type": "application/json", - "x-dfo-trace-id": "37207f1ea4574e4e8485e8cebd4f4edc" + "x-dfo-trace-id": "c501ba8d087b4561b2ff0e423c719ab0" }, "json": { "operation": { - "operation_id": "op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef", + "operation_id": "op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f", "status": "done" }, "manifest": { "schema_version": 1, "definition": { "schema_version": 1, - "spec_id": "spec_7f538f4f65ac124f47918468b4d2eea7", + "spec_id": "spec_70ddf0ce6a9b3f147063f2adf37fab9e", "identity": { "shape": { "kind": "statvar_schema", @@ -892,14 +892,14 @@ "requested_window": { "kind": "range", "end_year": 2024, - "start_year": 1964 + "start_year": 1967 } } }, - "content_version": "cv_ed2cc83eb28d4e6883cde079f05844ed", - "prepared_at": "2026-10-25T17:38:14Z", + "content_version": "cv_fafc60a507e03b0d42689fb1936127b9", + "prepared_at": "2026-10-26T09:22:44Z", "coverage": { - "rows": 108935, + "rows": 107252, "dimensions": [ { "label": "financingProvider", @@ -921,14 +921,14 @@ }, { "label": "years", - "count": 61 + "count": 58 } ], "window": { "kind": "range", "origin": "query", "end_year": 2024, - "start_year": 1964 + "start_year": 1967 } }, "citation": { @@ -1047,9 +1047,9 @@ "kind": "range", "origin": "query", "end_year": 2024, - "start_year": 1964 + "start_year": 1967 }, - "graph_revision": "dfo-dev-dc-datacommons-service-00273-mmh", + "graph_revision": null, "normalisations": [], "code_index_stamp": { "exported_at": "2026-10-24T19:20:27Z", @@ -1063,7 +1063,7 @@ } ], "capability_version": "dset_76f5fa7244511c58", - "materialiser_build": "99e62038ceb4b459c2ac699549076ff123c166aa", + "materialiser_build": "d80df9f5fd598b7345255470932d202ee5d49942", "resolved_stat_vars": [ { "ref": "dcid:Amount_FinancialFlow_Gross_Disbursement_DAC2aAidType206_Nominal", @@ -1071,15 +1071,15 @@ "financingProvider", "financingRecipient" ], - "observation_count": 108935 + "observation_count": 107252 } ], "family_member_count": 1, "family_member_digest": "1a36e1a7292b1bfff95a5415de0be74cac7bb033217ed50e79faa8ce51a224c0", "frame_grammar_version": "1.1.0", - "origin_catalogue_build_id": "20261024T193016Z-775d36a9", + "origin_catalogue_build_id": "20261026T000018Z-0af2cac5", "served_from": "materialise", - "confirmed_at": "2026-10-25T17:38:17.505656+00:00" + "confirmed_at": "2026-10-26T09:22:46.854499+00:00" }, "warnings": [], "diagnostics": [ @@ -1091,29 +1091,29 @@ ], "artifacts": [ { - "artifact_digest": "sha256:4d80e30e27b5a64706113d54946e3a387e422b1115d1437594ac4b1d4307ffd2", + "artifact_digest": "sha256:a8c742f8f416b2f3414c7a569f7c18b337c5ee9ae3012483583bad0b238f5c61", "rendering": { "bundle": false, "format": "parquet", "layout": 4 }, - "bytes": 472796, + "bytes": 466531, "media_type": "application/vnd.apache.parquet", - "created_at": "2026-10-25T17:38:17.426404+00:00", + "created_at": "2026-10-26T09:22:46.786678+00:00", "tier": "working", - "url": "/api/datasets/spec_7f538f4f65ac124f47918468b4d2eea7/cv_ed2cc83eb28d4e6883cde079f05844ed/files/sha256:4d80e30e27b5a64706113d54946e3a387e422b1115d1437594ac4b1d4307ffd2", + "url": "/api/datasets/spec_70ddf0ce6a9b3f147063f2adf37fab9e/cv_fafc60a507e03b0d42689fb1936127b9/files/sha256:a8c742f8f416b2f3414c7a569f7c18b337c5ee9ae3012483583bad0b238f5c61", "enrichment_stamp": "08ed6c734fc69ea2204a21f4e1dd8b963f14dd1e03a2484c618049ac2e2d93d8" }, { - "artifact_digest": "sha256:4e3ed758ad1a33cf9d150ee5fa71adf7f5bd40e4d342d839633d8386239babe1", + "artifact_digest": "sha256:5247bafa55f84fe2f8bc348601acb955162c39a1a082e939945336470e5c5231", "rendering": { "statistics": "series" }, - "bytes": 144449, + "bytes": 144985, "media_type": "application/vnd.apache.parquet", - "created_at": "2026-10-25T17:38:17.426404+00:00", + "created_at": "2026-10-26T09:22:46.786678+00:00", "tier": "working", - "url": "/api/datasets/spec_7f538f4f65ac124f47918468b4d2eea7/cv_ed2cc83eb28d4e6883cde079f05844ed/files/sha256:4e3ed758ad1a33cf9d150ee5fa71adf7f5bd40e4d342d839633d8386239babe1" + "url": "/api/datasets/spec_70ddf0ce6a9b3f147063f2adf37fab9e/cv_fafc60a507e03b0d42689fb1936127b9/files/sha256:5247bafa55f84fe2f8bc348601acb955162c39a1a082e939945336470e5c5231" } ], "series_count": 3656, @@ -1142,7 +1142,7 @@ "name": "time_period", "kind": "grain", "droppable": false, - "distinct": 61 + "distinct": 58 }, { "name": "value", @@ -1382,7 +1382,7 @@ "varying": [ { "column": "time_period", - "distinct": 61 + "distinct": 58 } ] }, @@ -1406,7 +1406,7 @@ "varying": [ { "column": "time_period", - "distinct": 61 + "distinct": 58 } ] }, @@ -1468,7 +1468,7 @@ "series_coverage_stamp": "e6e717ab8c77e84d010915893ede5809e9ecec67929a07cfafbcc2210edfa1eb", "retention": { "pinned": false, - "held_until": "2026-11-24T17:38:17.425152Z" + "held_until": "2026-11-25T09:22:46.785219Z" } } } @@ -1477,21 +1477,21 @@ { "request": { "method": "GET", - "origin_path": "/api/datasets/spec_7f538f4f65ac124f47918468b4d2eea7/cv_ed2cc83eb28d4e6883cde079f05844ed/files/sha256:4d80e30e27b5a64706113d54946e3a387e422b1115d1437594ac4b1d4307ffd2" + "origin_path": "/api/datasets/spec_70ddf0ce6a9b3f147063f2adf37fab9e/cv_fafc60a507e03b0d42689fb1936127b9/files/sha256:a8c742f8f416b2f3414c7a569f7c18b337c5ee9ae3012483583bad0b238f5c61" }, "response": { "status": 302, "headers": { "content-type": "text/html", - "location": "https://storage.googleapis.com/dev-fin-observatory-datasets-working/sha256%3A4d80e30e27b5a64706113d54946e3a387e422b1115d1437594ac4b1d4307ffd2?X-Goog-Signature=redacted", - "x-dfo-trace-id": "919c1e572d914a608b166556417714c9" + "location": "https://storage.googleapis.com/dev-fin-observatory-datasets-working/sha256%3Aa8c742f8f416b2f3414c7a569f7c18b337c5ee9ae3012483583bad0b238f5c61?X-Goog-Signature=redacted", + "x-dfo-trace-id": "22f0d88923c14d74825b5f14d41c05b8" } } }, { "request": { "method": "GET", - "url": "https://storage.googleapis.com/dev-fin-observatory-datasets-working/sha256%3A4d80e30e27b5a64706113d54946e3a387e422b1115d1437594ac4b1d4307ffd2?X-Goog-Signature=redacted" + "url": "https://storage.googleapis.com/dev-fin-observatory-datasets-working/sha256%3Aa8c742f8f416b2f3414c7a569f7c18b337c5ee9ae3012483583bad0b238f5c61?X-Goog-Signature=redacted" }, "response": { "status": 200, @@ -1505,56 +1505,56 @@ "expect": [ { "operation": { - "operation_id": "op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef", + "operation_id": "op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f", "status": "pending" } }, { "dataset": { - "rows": 108935, + "rows": 107252, "columns": [ - "stat_var", - "financingProvider", + "time_period", "financingProvider_label", + "financingRecipient_label", + "value", + "unit_label", + "dac2aAidType_label", + "provenance_label", + "financingProvider", "financingProvider_kind", "financingRecipient", - "financingRecipient_label", "financingRecipient_kind", "dac2aAidType", - "dac2aAidType_label", - "time_period", - "value", "unit", - "unit_label", "currency", "price_basis", "base_year", "measurementMethod", "measurementMethod_label", "provenance", - "provenance_label" + "stat_var" ], "complete": true, "members": [ { "parts": [], - "spec_id": "spec_7f538f4f65ac124f47918468b4d2eea7", - "content_version": "cv_ed2cc83eb28d4e6883cde079f05844ed", - "sentence": "Gross disbursements to the 133 G77 countries from the 32 DAC countries for official development assistance, 1964 to 2024. Current US dollars · OECD DAC2a." + "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." } ], "missing": [], "long_builds": [ { - "operation_id": "op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef", + "operation_id": "op_510787ac0c09a1323e90ae20eafc3eb0246bcd04333aa2ca10792d48dae2cc6f", "poll_waits": [ 1.5, 1.5, 1.5, 1.5, - 1.786, - 2.268, - 2.869 + 1.784, + 2.289, + 2.934 ], "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 a555723..a432036 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 f724213..402884f 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,7 +93,7 @@ "status": 200, "headers": { "content-type": "application/json", - "x-dfo-trace-id": "ee36259b6d664e7cb028a433fd51bf38" + "x-dfo-trace-id": "7675f31f4bd548c782dad4c6001a7666" }, "json": { "schema_version": 1, @@ -145,7 +145,7 @@ "error": { "class": "ContractError", "code": "contract_violation", - "trace_id": "ee36259b6d664e7cb028a433fd51bf38" + "trace_id": "7675f31f4bd548c782dad4c6001a7666" } } ] 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 d3844c3..f6ba391 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_4be3387671a61839e73ac0e35fbe9daae30a038eb2943751ab2bed086542e7a7" + "operation_id": "op_a50d083649ee12fbede446887afa771e76446419365e74ade9d5239d128e6846" }, { "op": "result" @@ -20,24 +20,24 @@ { "request": { "method": "GET", - "path": "/datasets/operations/op_4be3387671a61839e73ac0e35fbe9daae30a038eb2943751ab2bed086542e7a7" + "path": "/datasets/operations/op_a50d083649ee12fbede446887afa771e76446419365e74ade9d5239d128e6846" }, "response": { "status": 200, "headers": { "content-type": "application/json", "retry-after": "2", - "x-dfo-trace-id": "a7e4df1e6481482f915c35791ae30787" + "x-dfo-trace-id": "3503ecbc88d84ff3b8fd26ec06762f34" }, "json": { "operation": { - "operation_id": "op_4be3387671a61839e73ac0e35fbe9daae30a038eb2943751ab2bed086542e7a7", + "operation_id": "op_a50d083649ee12fbede446887afa771e76446419365e74ade9d5239d128e6846", "status": "running", - "poll": "/api/datasets/operations/op_4be3387671a61839e73ac0e35fbe9daae30a038eb2943751ab2bed086542e7a7", + "poll": "/api/datasets/operations/op_a50d083649ee12fbede446887afa771e76446419365e74ade9d5239d128e6846", "retry_after_ms": 1500, "progress": { "rows_written": 0, - "estimate_rows": 112798 + "estimate_rows": 110887 } } } @@ -46,20 +46,20 @@ { "request": { "method": "GET", - "path": "/datasets/operations/op_4be3387671a61839e73ac0e35fbe9daae30a038eb2943751ab2bed086542e7a7" + "path": "/datasets/operations/op_a50d083649ee12fbede446887afa771e76446419365e74ade9d5239d128e6846" }, "response": { "status": 200, "headers": { "content-type": "application/json", "retry-after": "2", - "x-dfo-trace-id": "c8a0887100974e679bf749541fe7880d" + "x-dfo-trace-id": "b53e0a1669e045e18d440f6189c13db3" }, "json": { "operation": { - "operation_id": "op_4be3387671a61839e73ac0e35fbe9daae30a038eb2943751ab2bed086542e7a7", + "operation_id": "op_a50d083649ee12fbede446887afa771e76446419365e74ade9d5239d128e6846", "status": "failed", - "poll": "/api/datasets/operations/op_4be3387671a61839e73ac0e35fbe9daae30a038eb2943751ab2bed086542e7a7", + "poll": "/api/datasets/operations/op_a50d083649ee12fbede446887afa771e76446419365e74ade9d5239d128e6846", "retry_after_ms": 1500 } } @@ -69,7 +69,7 @@ "expect": [ { "operation": { - "operation_id": "op_4be3387671a61839e73ac0e35fbe9daae30a038eb2943751ab2bed086542e7a7", + "operation_id": "op_a50d083649ee12fbede446887afa771e76446419365e74ade9d5239d128e6846", "status": "running" } }, @@ -77,10 +77,10 @@ "error": { "class": "ServerError", "code": "operation_failed", - "trace_id": "c8a0887100974e679bf749541fe7880d", + "trace_id": "b53e0a1669e045e18d440f6189c13db3", "long_builds": [ { - "operation_id": "op_4be3387671a61839e73ac0e35fbe9daae30a038eb2943751ab2bed086542e7a7", + "operation_id": "op_a50d083649ee12fbede446887afa771e76446419365e74ade9d5239d128e6846", "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 5ceede1..6141b6f 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": "99e62038ceb4b459c2ac699549076ff123c166aa", - "recorded_at": "2026-10-25T17:36:22Z" + "dfo_commit": "d80df9f5fd598b7345255470932d202ee5d49942", + "recorded_at": "2026-10-26T09:22:51Z" }, "call": [ { "op": "operation", - "operation_id": "op_4be3387671a61839e73ac0e35fbe9daae30a038eb2943751ab2bed086542e7a7" + "operation_id": "op_a50d083649ee12fbede446887afa771e76446419365e74ade9d5239d128e6846" }, { "op": "result" @@ -21,24 +21,24 @@ { "request": { "method": "GET", - "path": "/datasets/operations/op_4be3387671a61839e73ac0e35fbe9daae30a038eb2943751ab2bed086542e7a7" + "path": "/datasets/operations/op_a50d083649ee12fbede446887afa771e76446419365e74ade9d5239d128e6846" }, "response": { "status": 200, "headers": { "content-type": "application/json", "retry-after": "2", - "x-dfo-trace-id": "a7e4df1e6481482f915c35791ae30787" + "x-dfo-trace-id": "3503ecbc88d84ff3b8fd26ec06762f34" }, "json": { "operation": { - "operation_id": "op_4be3387671a61839e73ac0e35fbe9daae30a038eb2943751ab2bed086542e7a7", + "operation_id": "op_a50d083649ee12fbede446887afa771e76446419365e74ade9d5239d128e6846", "status": "running", - "poll": "/api/datasets/operations/op_4be3387671a61839e73ac0e35fbe9daae30a038eb2943751ab2bed086542e7a7", + "poll": "/api/datasets/operations/op_a50d083649ee12fbede446887afa771e76446419365e74ade9d5239d128e6846", "retry_after_ms": 1500, "progress": { "rows_written": 0, - "estimate_rows": 112798 + "estimate_rows": 110887 } } } @@ -47,24 +47,24 @@ { "request": { "method": "GET", - "path": "/datasets/operations/op_4be3387671a61839e73ac0e35fbe9daae30a038eb2943751ab2bed086542e7a7" + "path": "/datasets/operations/op_a50d083649ee12fbede446887afa771e76446419365e74ade9d5239d128e6846" }, "response": { "status": 200, "headers": { "content-type": "application/json", "retry-after": "2", - "x-dfo-trace-id": "c8a0887100974e679bf749541fe7880d" + "x-dfo-trace-id": "b53e0a1669e045e18d440f6189c13db3" }, "json": { "operation": { - "operation_id": "op_4be3387671a61839e73ac0e35fbe9daae30a038eb2943751ab2bed086542e7a7", + "operation_id": "op_a50d083649ee12fbede446887afa771e76446419365e74ade9d5239d128e6846", "status": "running", - "poll": "/api/datasets/operations/op_4be3387671a61839e73ac0e35fbe9daae30a038eb2943751ab2bed086542e7a7", + "poll": "/api/datasets/operations/op_a50d083649ee12fbede446887afa771e76446419365e74ade9d5239d128e6846", "retry_after_ms": 1500, "progress": { - "rows_written": 0, - "estimate_rows": 112798 + "rows_written": 33440, + "estimate_rows": 110887 } } } @@ -73,24 +73,24 @@ { "request": { "method": "GET", - "path": "/datasets/operations/op_4be3387671a61839e73ac0e35fbe9daae30a038eb2943751ab2bed086542e7a7" + "path": "/datasets/operations/op_a50d083649ee12fbede446887afa771e76446419365e74ade9d5239d128e6846" }, "response": { "status": 200, "headers": { "content-type": "application/json", "retry-after": "2", - "x-dfo-trace-id": "eeee9bc62cc84cc18a32ec31995456fc" + "x-dfo-trace-id": "549a9e0bbec342a99c0176fd523c76e1" }, "json": { "operation": { - "operation_id": "op_4be3387671a61839e73ac0e35fbe9daae30a038eb2943751ab2bed086542e7a7", + "operation_id": "op_a50d083649ee12fbede446887afa771e76446419365e74ade9d5239d128e6846", "status": "running", - "poll": "/api/datasets/operations/op_4be3387671a61839e73ac0e35fbe9daae30a038eb2943751ab2bed086542e7a7", + "poll": "/api/datasets/operations/op_a50d083649ee12fbede446887afa771e76446419365e74ade9d5239d128e6846", "retry_after_ms": 1500, "progress": { - "rows_written": 6791, - "estimate_rows": 112798 + "rows_written": 106679, + "estimate_rows": 110887 } } } @@ -99,24 +99,24 @@ { "request": { "method": "GET", - "path": "/datasets/operations/op_4be3387671a61839e73ac0e35fbe9daae30a038eb2943751ab2bed086542e7a7" + "path": "/datasets/operations/op_a50d083649ee12fbede446887afa771e76446419365e74ade9d5239d128e6846" }, "response": { "status": 200, "headers": { "content-type": "application/json", "retry-after": "2", - "x-dfo-trace-id": "58022655f3874bad921fc5f998ae90db" + "x-dfo-trace-id": "2bb0086a22c149bdb666fe3834159c36" }, "json": { "operation": { - "operation_id": "op_4be3387671a61839e73ac0e35fbe9daae30a038eb2943751ab2bed086542e7a7", + "operation_id": "op_a50d083649ee12fbede446887afa771e76446419365e74ade9d5239d128e6846", "status": "running", - "poll": "/api/datasets/operations/op_4be3387671a61839e73ac0e35fbe9daae30a038eb2943751ab2bed086542e7a7", + "poll": "/api/datasets/operations/op_a50d083649ee12fbede446887afa771e76446419365e74ade9d5239d128e6846", "retry_after_ms": 1500, "progress": { - "rows_written": 78218, - "estimate_rows": 112798 + "rows_written": 110887, + "estimate_rows": 110887 } } } @@ -125,50 +125,24 @@ { "request": { "method": "GET", - "path": "/datasets/operations/op_4be3387671a61839e73ac0e35fbe9daae30a038eb2943751ab2bed086542e7a7" + "path": "/datasets/operations/op_a50d083649ee12fbede446887afa771e76446419365e74ade9d5239d128e6846" }, "response": { "status": 200, "headers": { "content-type": "application/json", "retry-after": "2", - "x-dfo-trace-id": "032d2a0727d24cde8efef07b07bc6250" - }, - "json": { - "operation": { - "operation_id": "op_4be3387671a61839e73ac0e35fbe9daae30a038eb2943751ab2bed086542e7a7", - "status": "running", - "poll": "/api/datasets/operations/op_4be3387671a61839e73ac0e35fbe9daae30a038eb2943751ab2bed086542e7a7", - "retry_after_ms": 1808, - "progress": { - "rows_written": 112798, - "estimate_rows": 112798 - } - } - } - } - }, - { - "request": { - "method": "GET", - "path": "/datasets/operations/op_4be3387671a61839e73ac0e35fbe9daae30a038eb2943751ab2bed086542e7a7" - }, - "response": { - "status": 200, - "headers": { - "content-type": "application/json", - "retry-after": "3", - "x-dfo-trace-id": "6ab2666b3d304158ba3044223be013e7" + "x-dfo-trace-id": "d0b6893e4ca84abcaa449b70756d3a76" }, "json": { "operation": { - "operation_id": "op_4be3387671a61839e73ac0e35fbe9daae30a038eb2943751ab2bed086542e7a7", + "operation_id": "op_a50d083649ee12fbede446887afa771e76446419365e74ade9d5239d128e6846", "status": "running", - "poll": "/api/datasets/operations/op_4be3387671a61839e73ac0e35fbe9daae30a038eb2943751ab2bed086542e7a7", - "retry_after_ms": 2328, + "poll": "/api/datasets/operations/op_a50d083649ee12fbede446887afa771e76446419365e74ade9d5239d128e6846", + "retry_after_ms": 1832, "progress": { - "rows_written": 112798, - "estimate_rows": 112798 + "rows_written": 110887, + "estimate_rows": 110887 } } } @@ -177,24 +151,24 @@ { "request": { "method": "GET", - "path": "/datasets/operations/op_4be3387671a61839e73ac0e35fbe9daae30a038eb2943751ab2bed086542e7a7" + "path": "/datasets/operations/op_a50d083649ee12fbede446887afa771e76446419365e74ade9d5239d128e6846" }, "response": { "status": 200, "headers": { "content-type": "application/json", "retry-after": "3", - "x-dfo-trace-id": "3592604e35c344329ea6716fe023c3b4" + "x-dfo-trace-id": "09d934a8ec1e4169971b1e0c61e5af38" }, "json": { "operation": { - "operation_id": "op_4be3387671a61839e73ac0e35fbe9daae30a038eb2943751ab2bed086542e7a7", + "operation_id": "op_a50d083649ee12fbede446887afa771e76446419365e74ade9d5239d128e6846", "status": "running", - "poll": "/api/datasets/operations/op_4be3387671a61839e73ac0e35fbe9daae30a038eb2943751ab2bed086542e7a7", - "retry_after_ms": 2989, + "poll": "/api/datasets/operations/op_a50d083649ee12fbede446887afa771e76446419365e74ade9d5239d128e6846", + "retry_after_ms": 2348, "progress": { - "rows_written": 112798, - "estimate_rows": 112798 + "rows_written": 110887, + "estimate_rows": 110887 } } } @@ -203,24 +177,24 @@ { "request": { "method": "GET", - "path": "/datasets/operations/op_4be3387671a61839e73ac0e35fbe9daae30a038eb2943751ab2bed086542e7a7" + "path": "/datasets/operations/op_a50d083649ee12fbede446887afa771e76446419365e74ade9d5239d128e6846" }, "response": { "status": 200, "headers": { "content-type": "application/json", - "x-dfo-trace-id": "5f79a0f236c741b6adc7fbece2ad874a" + "x-dfo-trace-id": "ddc5828be1d84a159d4579ad5ca8833d" }, "json": { "operation": { - "operation_id": "op_4be3387671a61839e73ac0e35fbe9daae30a038eb2943751ab2bed086542e7a7", + "operation_id": "op_a50d083649ee12fbede446887afa771e76446419365e74ade9d5239d128e6846", "status": "done" }, "manifest": { "schema_version": 1, "definition": { "schema_version": 1, - "spec_id": "spec_afa305d4c2ea8a14b7502ae6add29150", + "spec_id": "spec_dee41c61dd0335d145f4c65e451817cb", "identity": { "shape": { "kind": "statvar_schema", @@ -439,14 +413,14 @@ "requested_window": { "kind": "range", "end_year": 2024, - "start_year": 1965 + "start_year": 1968 } } }, - "content_version": "cv_e5cf1688f2e3ca168a199237ca2a8a62", - "prepared_at": "2026-10-25T17:36:35Z", + "content_version": "cv_c29903dc477674b87b3e5e0097f7a828", + "prepared_at": "2026-10-26T09:23:00Z", "coverage": { - "rows": 112798, + "rows": 110887, "dimensions": [ { "label": "financingProvider", @@ -468,14 +442,14 @@ }, { "label": "years", - "count": 60 + "count": 57 } ], "window": { "kind": "range", "origin": "query", "end_year": 2024, - "start_year": 1965 + "start_year": 1968 } }, "citation": { @@ -594,7 +568,7 @@ "kind": "range", "origin": "query", "end_year": 2024, - "start_year": 1965 + "start_year": 1968 }, "graph_revision": "dfo-dev-dc-datacommons-service-00273-mmh", "normalisations": [], @@ -610,7 +584,7 @@ } ], "capability_version": "dset_76f5fa7244511c58", - "materialiser_build": "99e62038ceb4b459c2ac699549076ff123c166aa", + "materialiser_build": "d80df9f5fd598b7345255470932d202ee5d49942", "resolved_stat_vars": [ { "ref": "dcid:Amount_FinancialFlow_Gross_Disbursement_DAC2aAidType206_Nominal", @@ -618,15 +592,15 @@ "financingProvider", "financingRecipient" ], - "observation_count": 112798 + "observation_count": 110887 } ], "family_member_count": 1, "family_member_digest": "1a36e1a7292b1bfff95a5415de0be74cac7bb033217ed50e79faa8ce51a224c0", "frame_grammar_version": "1.1.0", - "origin_catalogue_build_id": "20261024T193016Z-775d36a9", + "origin_catalogue_build_id": "20261026T000018Z-0af2cac5", "served_from": "materialise", - "confirmed_at": "2026-10-25T17:36:38.103885+00:00" + "confirmed_at": "2026-10-26T09:23:03.079042+00:00" }, "warnings": [ { @@ -653,29 +627,29 @@ ], "artifacts": [ { - "artifact_digest": "sha256:c8c92ee6fd4b6f393a341cab7b74e3632caa4fdca1f27a3de55c4fbc8fb3521d", + "artifact_digest": "sha256:3aae1d10e41e6cd40e33a2a65757641a4c74244ffcdd47974df72ab6dfa60779", "rendering": { "bundle": false, "format": "parquet", "layout": 4 }, - "bytes": 490836, + "bytes": 486086, "media_type": "application/vnd.apache.parquet", - "created_at": "2026-10-25T17:36:38.047534+00:00", + "created_at": "2026-10-26T09:23:03.005638+00:00", "tier": "working", - "url": "/api/datasets/spec_afa305d4c2ea8a14b7502ae6add29150/cv_e5cf1688f2e3ca168a199237ca2a8a62/files/sha256:c8c92ee6fd4b6f393a341cab7b74e3632caa4fdca1f27a3de55c4fbc8fb3521d", + "url": "/api/datasets/spec_dee41c61dd0335d145f4c65e451817cb/cv_c29903dc477674b87b3e5e0097f7a828/files/sha256:3aae1d10e41e6cd40e33a2a65757641a4c74244ffcdd47974df72ab6dfa60779", "enrichment_stamp": "08ed6c734fc69ea2204a21f4e1dd8b963f14dd1e03a2484c618049ac2e2d93d8" }, { - "artifact_digest": "sha256:b6d3b2335306c70ae0da6717fd03af72362fc94026aea7cd722ea24e9ebb56f6", + "artifact_digest": "sha256:871390d2ad08d6c429938b930ac69f71d7b5d88cda0170a0433158f75dbdc167", "rendering": { "statistics": "series" }, - "bytes": 153509, + "bytes": 153793, "media_type": "application/vnd.apache.parquet", - "created_at": "2026-10-25T17:36:38.047534+00:00", + "created_at": "2026-10-26T09:23:03.005638+00:00", "tier": "working", - "url": "/api/datasets/spec_afa305d4c2ea8a14b7502ae6add29150/cv_e5cf1688f2e3ca168a199237ca2a8a62/files/sha256:b6d3b2335306c70ae0da6717fd03af72362fc94026aea7cd722ea24e9ebb56f6" + "url": "/api/datasets/spec_dee41c61dd0335d145f4c65e451817cb/cv_c29903dc477674b87b3e5e0097f7a828/files/sha256:871390d2ad08d6c429938b930ac69f71d7b5d88cda0170a0433158f75dbdc167" } ], "series_count": 3907, @@ -704,7 +678,7 @@ "name": "time_period", "kind": "grain", "droppable": false, - "distinct": 60 + "distinct": 57 }, { "name": "value", @@ -944,7 +918,7 @@ "varying": [ { "column": "time_period", - "distinct": 60 + "distinct": 57 } ] }, @@ -968,7 +942,7 @@ "varying": [ { "column": "time_period", - "distinct": 60 + "distinct": 57 } ] }, @@ -1030,7 +1004,7 @@ "series_coverage_stamp": "e6e717ab8c77e84d010915893ede5809e9ecec67929a07cfafbcc2210edfa1eb", "retention": { "pinned": false, - "held_until": "2026-11-24T17:36:38.046628Z" + "held_until": "2026-11-25T09:23:03.004652Z" } } } @@ -1266,7 +1240,7 @@ "requested_window": { "kind": "range", "end_year": 2024, - "start_year": 1965 + "start_year": 1968 } } } @@ -1278,7 +1252,7 @@ "status": 200, "headers": { "content-type": "application/json", - "x-dfo-trace-id": "849b0bfe758f4d2fb7d97b3fd393db83" + "x-dfo-trace-id": "2a8974d28a894ee0aebb24df0ca7dc67" }, "json": { "schema_version": 1, @@ -1287,11 +1261,11 @@ "extract_skipped": true }, "diagnostics": { - "engine_build": "99e62038ceb4b459c2ac699549076ff123c166aa", - "trace_id": "849b0bfe758f4d2fb7d97b3fd393db83", + "engine_build": "d80df9f5fd598b7345255470932d202ee5d49942", + "trace_id": "2a8974d28a894ee0aebb24df0ca7dc67", "warnings": [], "timing_ms": { - "total": 2937, + "total": 2071, "by_step": { "coverage": 0 } @@ -1304,19 +1278,19 @@ "variable_text": "dataset", "warnings": [], "timing_ms": { - "total": 2669, + "total": 1091, "by_step": { - "validate": 0, - "walk": 15, - "reread_arcs": 1, + "validate": 1, + "walk": 19, + "reread_arcs": 0, "detect_edits": 0, "resolve_survivors": 0, - "shape": 2596, + "shape": 1000, "bind": 0, - "where_places": 1, - "materialise": 33, + "where_places": 2, + "materialise": 28, "answer": 13, - "options": 10 + "options": 28 } }, "entity_refs": [], @@ -1331,10 +1305,10 @@ "assumptions": [], "status": "definite", "spec": { - "spec_id": "spec_afa305d4c2ea8a14b7502ae6add29150", + "spec_id": "spec_dee41c61dd0335d145f4c65e451817cb", "definition": { "schema_version": 1, - "spec_id": "spec_afa305d4c2ea8a14b7502ae6add29150", + "spec_id": "spec_dee41c61dd0335d145f4c65e451817cb", "identity": { "identity_version": "spec1", "shape": { @@ -1552,7 +1526,7 @@ }, "requested_window": { "kind": "range", - "start_year": 1965, + "start_year": 1968, "end_year": 2024 } } @@ -2665,7 +2639,7 @@ "value": { "value_kind": "time_window", "time_window": { - "start_year": 1965, + "start_year": 1968, "end_year": 2024 } } @@ -2692,7 +2666,7 @@ "member_count_exact": true, "served_count": 1, "data_date_range": { - "start": "1965", + "start": "1968", "end": "2024" } }, @@ -3727,7 +3701,7 @@ "coverage": { "kind": "exact", "has_data": true, - "observation_count": 112798, + "observation_count": 110887, "evidence": "facet_metadata", "dimensions": [ { @@ -3736,7 +3710,7 @@ }, { "label": "observations", - "count": 60 + "count": 57 }, { "label": "variables", @@ -3744,7 +3718,7 @@ } ], "window": { - "start_year": 1965, + "start_year": 1968, "end_year": 2024 } }, @@ -3752,7 +3726,7 @@ "year": 2024, "year_named": true, "named_window": { - "start_year": 1965, + "start_year": 1968, "end_year": 2024 }, "observations": 2629, @@ -3792,11 +3766,11 @@ ] }, "download": { - "rows": 112798, + "rows": 110887, "rows_exact": true, "series": 3907, "window": { - "start_year": 1965, + "start_year": 1968, "end_year": 2024 }, "licence": { @@ -3849,7 +3823,7 @@ "relation": "child", "parent": "DAC2aAidType206", "member_count": 2, - "served_rows": 18234, + "served_rows": 17503, "served_rows_exact": true }, { @@ -3863,7 +3837,7 @@ "relation": "child", "parent": "DAC2aAidType206", "member_count": 1, - "served_rows": 111914, + "served_rows": 110146, "served_rows_exact": true }, { @@ -3876,7 +3850,7 @@ }, "relation": "root", "member_count": 1, - "served_rows": 88283, + "served_rows": 87187, "served_rows_exact": true }, { @@ -3945,7 +3919,7 @@ "source": "observed" } ], - "rendered_sentence": "Gross disbursements to 133 recipients from 38 providers for official development assistance, 1965 to 2024. Current US dollars · OECD DAC2a.", + "rendered_sentence": "Gross disbursements to 133 recipients from 38 providers for official development assistance, 1968 to 2024. Current US dollars · OECD DAC2a.", "sentence_plan": [ { "kind": "slot", @@ -4228,7 +4202,7 @@ }, { "kind": "slot", - "text": "1965 to 2024", + "text": "1968 to 2024", "axis": "when", "segment": "heading", "binding_ref": "when:", @@ -5621,10 +5595,10 @@ ], "query_qualifiers": [], "requested_window": { - "start_year": 1965, + "start_year": 1968, "end_year": 2024 }, - "capability_version": "cap_88defe77cc79e0c0" + "capability_version": "cap_765c9d2a0c7529b9" }, "confidence": "high", "available_at_place": true, @@ -5632,7 +5606,7 @@ { "definition": { "schema_version": 1, - "spec_id": "spec_721eaf4bd95202b5cda14c33d8b443ee", + "spec_id": "spec_6a878829c5a95abb6c08dc9bb0668022", "identity": { "identity_version": "spec1", "shape": { @@ -5850,7 +5824,7 @@ }, "requested_window": { "kind": "range", - "start_year": 1965, + "start_year": 1968, "end_year": 2024 } } @@ -5894,7 +5868,7 @@ } } ], - "served_rows": 113428, + "served_rows": 111506, "served_rows_exact": true } ], @@ -5953,7 +5927,7 @@ "end_year": 2021 }, "constant_years": { - "start_year": 1965, + "start_year": 1968, "end_year": 2024 }, "base_year_min": 2023, @@ -5967,7 +5941,7 @@ "end_year": 2024 }, "constant_years": { - "start_year": 1965, + "start_year": 1968, "end_year": 2024 }, "base_year_min": 2002, @@ -5981,7 +5955,7 @@ "end_year": 2024 }, "constant_years": { - "start_year": 1965, + "start_year": 1968, "end_year": 2024 }, "base_year_min": 1980, @@ -5995,7 +5969,7 @@ "end_year": 2024 }, "constant_years": { - "start_year": 1965, + "start_year": 1968, "end_year": 2024 }, "base_year_min": 1992, @@ -6009,7 +5983,7 @@ "end_year": 2024 }, "constant_years": { - "start_year": 1965, + "start_year": 1968, "end_year": 2024 }, "base_year_min": 1991, @@ -6023,7 +5997,7 @@ "end_year": 2024 }, "constant_years": { - "start_year": 1965, + "start_year": 1968, "end_year": 2024 }, "base_year_min": 1980, @@ -6033,11 +6007,11 @@ "code": "AUD", "noun": "Australian dollars", "current_years": { - "start_year": 1965, + "start_year": 1968, "end_year": 2024 }, "constant_years": { - "start_year": 1965, + "start_year": 1968, "end_year": 2024 }, "base_year_min": 1960, @@ -6051,7 +6025,7 @@ "end_year": 2024 }, "constant_years": { - "start_year": 1965, + "start_year": 1968, "end_year": 2024 }, "base_year_min": 1995, @@ -6065,7 +6039,7 @@ "end_year": 2019 }, "constant_years": { - "start_year": 1965, + "start_year": 1968, "end_year": 2024 }, "base_year_min": 2023, @@ -6079,7 +6053,7 @@ "end_year": 2024 }, "constant_years": { - "start_year": 1965, + "start_year": 1968, "end_year": 2024 }, "base_year_min": 1996, @@ -6093,7 +6067,7 @@ "end_year": 2024 }, "constant_years": { - "start_year": 1965, + "start_year": 1968, "end_year": 2024 }, "base_year_min": 1980, @@ -6107,7 +6081,7 @@ "end_year": 2024 }, "constant_years": { - "start_year": 1965, + "start_year": 1968, "end_year": 2024 }, "base_year_min": 1980, @@ -6121,7 +6095,7 @@ "end_year": 2024 }, "constant_years": { - "start_year": 1965, + "start_year": 1968, "end_year": 2024 }, "base_year_min": 1980, @@ -6135,7 +6109,7 @@ "end_year": 2024 }, "constant_years": { - "start_year": 1965, + "start_year": 1968, "end_year": 2024 }, "base_year_min": 1980, @@ -6149,7 +6123,7 @@ "end_year": 2024 }, "constant_years": { - "start_year": 1965, + "start_year": 1968, "end_year": 2024 }, "base_year_min": 1985, @@ -6163,7 +6137,7 @@ "end_year": 2024 }, "constant_years": { - "start_year": 1965, + "start_year": 1968, "end_year": 2024 }, "base_year_min": 1980, @@ -6177,7 +6151,7 @@ "end_year": 2024 }, "constant_years": { - "start_year": 1965, + "start_year": 1968, "end_year": 2024 }, "base_year_min": 1986, @@ -6191,7 +6165,7 @@ "end_year": 2024 }, "constant_years": { - "start_year": 1965, + "start_year": 1968, "end_year": 2024 }, "base_year_min": 1980, @@ -6205,7 +6179,7 @@ "end_year": 2024 }, "constant_years": { - "start_year": 1965, + "start_year": 1968, "end_year": 2024 }, "base_year_min": 1980, @@ -6219,7 +6193,7 @@ "end_year": 2024 }, "constant_years": { - "start_year": 1965, + "start_year": 1968, "end_year": 2024 }, "base_year_min": 1980, @@ -6233,7 +6207,7 @@ "end_year": 2024 }, "constant_years": { - "start_year": 1965, + "start_year": 1968, "end_year": 2024 }, "base_year_min": 1992, @@ -6247,7 +6221,7 @@ "end_year": 2024 }, "constant_years": { - "start_year": 1965, + "start_year": 1968, "end_year": 2024 }, "base_year_min": 1980, @@ -6257,11 +6231,11 @@ "code": "CAD", "noun": "Canadian dollars", "current_years": { - "start_year": 1965, + "start_year": 1968, "end_year": 2024 }, "constant_years": { - "start_year": 1965, + "start_year": 1968, "end_year": 2024 }, "base_year_min": 1960, @@ -6275,7 +6249,7 @@ "end_year": 2024 }, "constant_years": { - "start_year": 1965, + "start_year": 1968, "end_year": 2024 }, "base_year_min": 1991, @@ -6285,11 +6259,11 @@ "code": "CHF", "noun": "Swiss francs", "current_years": { - "start_year": 1965, + "start_year": 1968, "end_year": 2024 }, "constant_years": { - "start_year": 1965, + "start_year": 1968, "end_year": 2024 }, "base_year_min": 1960, @@ -6303,7 +6277,7 @@ "end_year": 2024 }, "constant_years": { - "start_year": 1965, + "start_year": 1968, "end_year": 2024 }, "base_year_min": 1980, @@ -6317,7 +6291,7 @@ "end_year": 2024 }, "constant_years": { - "start_year": 1965, + "start_year": 1968, "end_year": 2024 }, "base_year_min": 1980, @@ -6331,7 +6305,7 @@ "end_year": 2024 }, "constant_years": { - "start_year": 1965, + "start_year": 1968, "end_year": 2024 }, "base_year_min": 1980, @@ -6345,7 +6319,7 @@ "end_year": 2024 }, "constant_years": { - "start_year": 1965, + "start_year": 1968, "end_year": 2024 }, "base_year_min": 1980, @@ -6359,7 +6333,7 @@ "end_year": 2024 }, "constant_years": { - "start_year": 1965, + "start_year": 1968, "end_year": 2024 }, "base_year_min": 1980, @@ -6373,7 +6347,7 @@ "end_year": 2024 }, "constant_years": { - "start_year": 1965, + "start_year": 1968, "end_year": 2024 }, "base_year_min": 1998, @@ -6387,7 +6361,7 @@ "end_year": 2024 }, "constant_years": { - "start_year": 1965, + "start_year": 1968, "end_year": 2024 }, "base_year_min": 1990, @@ -6397,11 +6371,11 @@ "code": "DKK", "noun": "Danish kroner", "current_years": { - "start_year": 1965, + "start_year": 1968, "end_year": 2024 }, "constant_years": { - "start_year": 1965, + "start_year": 1968, "end_year": 2024 }, "base_year_min": 1960, @@ -6415,7 +6389,7 @@ "end_year": 2024 }, "constant_years": { - "start_year": 1965, + "start_year": 1968, "end_year": 2024 }, "base_year_min": 1980, @@ -6429,7 +6403,7 @@ "end_year": 2024 }, "constant_years": { - "start_year": 1965, + "start_year": 1968, "end_year": 2024 }, "base_year_min": 1980, @@ -6443,7 +6417,7 @@ "end_year": 2024 }, "constant_years": { - "start_year": 1965, + "start_year": 1968, "end_year": 2024 }, "base_year_min": 1980, @@ -6457,7 +6431,7 @@ "end_year": 2019 }, "constant_years": { - "start_year": 1965, + "start_year": 1968, "end_year": 2024 }, "base_year_min": 1992, @@ -6471,7 +6445,7 @@ "end_year": 2024 }, "constant_years": { - "start_year": 1965, + "start_year": 1968, "end_year": 2024 }, "base_year_min": 1980, @@ -6485,7 +6459,7 @@ "end_year": 2024 }, "constant_years": { - "start_year": 1965, + "start_year": 1968, "end_year": 2024 }, "base_year_min": 1973, @@ -6499,7 +6473,7 @@ "end_year": 2024 }, "constant_years": { - "start_year": 1965, + "start_year": 1968, "end_year": 2024 }, "base_year_min": 1980, @@ -6509,11 +6483,11 @@ "code": "GBP", "noun": "British pounds", "current_years": { - "start_year": 1965, + "start_year": 1968, "end_year": 2024 }, "constant_years": { - "start_year": 1965, + "start_year": 1968, "end_year": 2024 }, "base_year_min": 1960, @@ -6527,7 +6501,7 @@ "end_year": 2024 }, "constant_years": { - "start_year": 1965, + "start_year": 1968, "end_year": 2024 }, "base_year_min": 1994, @@ -6541,7 +6515,7 @@ "end_year": 2024 }, "constant_years": { - "start_year": 1965, + "start_year": 1968, "end_year": 2024 }, "base_year_min": 1980, @@ -6555,7 +6529,7 @@ "end_year": 2024 }, "constant_years": { - "start_year": 1965, + "start_year": 1968, "end_year": 2024 }, "base_year_min": 1980, @@ -6569,7 +6543,7 @@ "end_year": 2024 }, "constant_years": { - "start_year": 1965, + "start_year": 1968, "end_year": 2024 }, "base_year_min": 1980, @@ -6583,7 +6557,7 @@ "end_year": 2024 }, "constant_years": { - "start_year": 1965, + "start_year": 1968, "end_year": 2024 }, "base_year_min": 1980, @@ -6597,7 +6571,7 @@ "end_year": 2024 }, "constant_years": { - "start_year": 1965, + "start_year": 1968, "end_year": 2024 }, "base_year_min": 1980, @@ -6611,7 +6585,7 @@ "end_year": 2024 }, "constant_years": { - "start_year": 1965, + "start_year": 1968, "end_year": 2024 }, "base_year_min": 1980, @@ -6625,7 +6599,7 @@ "end_year": 2024 }, "constant_years": { - "start_year": 1965, + "start_year": 1968, "end_year": 2024 }, "base_year_min": 1980, @@ -6639,7 +6613,7 @@ "end_year": 2024 }, "constant_years": { - "start_year": 1965, + "start_year": 1968, "end_year": 2024 }, "base_year_min": 1980, @@ -6653,7 +6627,7 @@ "end_year": 2024 }, "constant_years": { - "start_year": 1965, + "start_year": 1968, "end_year": 2024 }, "base_year_min": 2003, @@ -6667,7 +6641,7 @@ "end_year": 2024 }, "constant_years": { - "start_year": 1965, + "start_year": 1968, "end_year": 2024 }, "base_year_min": 1980, @@ -6681,7 +6655,7 @@ "end_year": 2024 }, "constant_years": { - "start_year": 1965, + "start_year": 1968, "end_year": 2024 }, "base_year_min": 1997, @@ -6695,7 +6669,7 @@ "end_year": 2024 }, "constant_years": { - "start_year": 1965, + "start_year": 1968, "end_year": 2024 }, "base_year_min": 1980, @@ -6709,7 +6683,7 @@ "end_year": 2024 }, "constant_years": { - "start_year": 1965, + "start_year": 1968, "end_year": 2024 }, "base_year_min": 2000, @@ -6723,7 +6697,7 @@ "end_year": 2024 }, "constant_years": { - "start_year": 1965, + "start_year": 1968, "end_year": 2024 }, "base_year_min": 1980, @@ -6737,7 +6711,7 @@ "end_year": 2024 }, "constant_years": { - "start_year": 1965, + "start_year": 1968, "end_year": 2024 }, "base_year_min": 1997, @@ -6751,7 +6725,7 @@ "end_year": 2024 }, "constant_years": { - "start_year": 1965, + "start_year": 1968, "end_year": 2024 }, "base_year_min": 1980, @@ -6765,7 +6739,7 @@ "end_year": 2024 }, "constant_years": { - "start_year": 1965, + "start_year": 1968, "end_year": 2024 }, "base_year_min": 1980, @@ -6775,11 +6749,11 @@ "code": "JPY", "noun": "Japanese yen", "current_years": { - "start_year": 1965, + "start_year": 1968, "end_year": 2024 }, "constant_years": { - "start_year": 1965, + "start_year": 1968, "end_year": 2024 }, "base_year_min": 1960, @@ -6793,7 +6767,7 @@ "end_year": 2024 }, "constant_years": { - "start_year": 1965, + "start_year": 1968, "end_year": 2024 }, "base_year_min": 1980, @@ -6807,7 +6781,7 @@ "end_year": 2024 }, "constant_years": { - "start_year": 1965, + "start_year": 1968, "end_year": 2024 }, "base_year_min": 1992, @@ -6821,7 +6795,7 @@ "end_year": 2024 }, "constant_years": { - "start_year": 1965, + "start_year": 1968, "end_year": 2024 }, "base_year_min": 1986, @@ -6835,7 +6809,7 @@ "end_year": 2024 }, "constant_years": { - "start_year": 1965, + "start_year": 1968, "end_year": 2024 }, "base_year_min": 1980, @@ -6849,7 +6823,7 @@ "end_year": 2024 }, "constant_years": { - "start_year": 1965, + "start_year": 1968, "end_year": 2024 }, "base_year_min": 1987, @@ -6863,7 +6837,7 @@ "end_year": 2024 }, "constant_years": { - "start_year": 1965, + "start_year": 1968, "end_year": 2024 }, "base_year_min": 1995, @@ -6877,7 +6851,7 @@ "end_year": 2024 }, "constant_years": { - "start_year": 1965, + "start_year": 1968, "end_year": 2024 }, "base_year_min": 2013, @@ -6891,7 +6865,7 @@ "end_year": 2024 }, "constant_years": { - "start_year": 1965, + "start_year": 1968, "end_year": 2024 }, "base_year_min": 1980, @@ -6905,7 +6879,7 @@ "end_year": 2024 }, "constant_years": { - "start_year": 1965, + "start_year": 1968, "end_year": 2024 }, "base_year_min": 1980, @@ -6919,7 +6893,7 @@ "end_year": 2024 }, "constant_years": { - "start_year": 1965, + "start_year": 1968, "end_year": 2024 }, "base_year_min": 1980, @@ -6933,7 +6907,7 @@ "end_year": 2024 }, "constant_years": { - "start_year": 1965, + "start_year": 1968, "end_year": 2024 }, "base_year_min": 1980, @@ -6947,7 +6921,7 @@ "end_year": 2024 }, "constant_years": { - "start_year": 1965, + "start_year": 1968, "end_year": 2024 }, "base_year_min": 1980, @@ -6961,7 +6935,7 @@ "end_year": 2024 }, "constant_years": { - "start_year": 1965, + "start_year": 1968, "end_year": 2024 }, "base_year_min": 1980, @@ -6975,7 +6949,7 @@ "end_year": 2024 }, "constant_years": { - "start_year": 1965, + "start_year": 1968, "end_year": 2024 }, "base_year_min": 1992, @@ -6989,7 +6963,7 @@ "end_year": 2024 }, "constant_years": { - "start_year": 1965, + "start_year": 1968, "end_year": 2024 }, "base_year_min": 1980, @@ -7003,7 +6977,7 @@ "end_year": 2024 }, "constant_years": { - "start_year": 1965, + "start_year": 1968, "end_year": 2024 }, "base_year_min": 1992, @@ -7017,7 +6991,7 @@ "end_year": 2024 }, "constant_years": { - "start_year": 1965, + "start_year": 1968, "end_year": 2024 }, "base_year_min": 1998, @@ -7031,7 +7005,7 @@ "end_year": 2024 }, "constant_years": { - "start_year": 1965, + "start_year": 1968, "end_year": 2024 }, "base_year_min": 1980, @@ -7045,7 +7019,7 @@ "end_year": 2024 }, "constant_years": { - "start_year": 1965, + "start_year": 1968, "end_year": 2024 }, "base_year_min": 2001, @@ -7059,7 +7033,7 @@ "end_year": 2024 }, "constant_years": { - "start_year": 1965, + "start_year": 1968, "end_year": 2024 }, "base_year_min": 1990, @@ -7073,7 +7047,7 @@ "end_year": 2024 }, "constant_years": { - "start_year": 1965, + "start_year": 1968, "end_year": 2024 }, "base_year_min": 1980, @@ -7087,7 +7061,7 @@ "end_year": 2024 }, "constant_years": { - "start_year": 1965, + "start_year": 1968, "end_year": 2024 }, "base_year_min": 1980, @@ -7101,7 +7075,7 @@ "end_year": 2024 }, "constant_years": { - "start_year": 1965, + "start_year": 1968, "end_year": 2024 }, "base_year_min": 1980, @@ -7115,7 +7089,7 @@ "end_year": 2024 }, "constant_years": { - "start_year": 1965, + "start_year": 1968, "end_year": 2024 }, "base_year_min": 1980, @@ -7129,7 +7103,7 @@ "end_year": 2024 }, "constant_years": { - "start_year": 1965, + "start_year": 1968, "end_year": 2024 }, "base_year_min": 1980, @@ -7143,7 +7117,7 @@ "end_year": 2024 }, "constant_years": { - "start_year": 1965, + "start_year": 1968, "end_year": 2024 }, "base_year_min": 1980, @@ -7157,7 +7131,7 @@ "end_year": 2024 }, "constant_years": { - "start_year": 1965, + "start_year": 1968, "end_year": 2024 }, "base_year_min": 1989, @@ -7171,7 +7145,7 @@ "end_year": 2024 }, "constant_years": { - "start_year": 1965, + "start_year": 1968, "end_year": 2024 }, "base_year_min": 1990, @@ -7185,7 +7159,7 @@ "end_year": 2024 }, "constant_years": { - "start_year": 1965, + "start_year": 1968, "end_year": 2024 }, "base_year_min": 1987, @@ -7195,11 +7169,11 @@ "code": "NOK", "noun": "Norwegian kroner", "current_years": { - "start_year": 1965, + "start_year": 1968, "end_year": 2024 }, "constant_years": { - "start_year": 1965, + "start_year": 1968, "end_year": 2024 }, "base_year_min": 1960, @@ -7213,7 +7187,7 @@ "end_year": 2024 }, "constant_years": { - "start_year": 1965, + "start_year": 1968, "end_year": 2024 }, "base_year_min": 1980, @@ -7223,11 +7197,11 @@ "code": "NZD", "noun": "New Zealand dollars", "current_years": { - "start_year": 1965, + "start_year": 1968, "end_year": 2024 }, "constant_years": { - "start_year": 1965, + "start_year": 1968, "end_year": 2024 }, "base_year_min": 1961, @@ -7241,7 +7215,7 @@ "end_year": 2024 }, "constant_years": { - "start_year": 1965, + "start_year": 1968, "end_year": 2024 }, "base_year_min": 1980, @@ -7255,7 +7229,7 @@ "end_year": 2024 }, "constant_years": { - "start_year": 1965, + "start_year": 1968, "end_year": 2024 }, "base_year_min": 1980, @@ -7269,7 +7243,7 @@ "end_year": 2024 }, "constant_years": { - "start_year": 1965, + "start_year": 1968, "end_year": 2024 }, "base_year_min": 1980, @@ -7283,7 +7257,7 @@ "end_year": 2024 }, "constant_years": { - "start_year": 1965, + "start_year": 1968, "end_year": 2024 }, "base_year_min": 1980, @@ -7297,7 +7271,7 @@ "end_year": 2024 }, "constant_years": { - "start_year": 1965, + "start_year": 1968, "end_year": 2024 }, "base_year_min": 1980, @@ -7311,7 +7285,7 @@ "end_year": 2024 }, "constant_years": { - "start_year": 1965, + "start_year": 1968, "end_year": 2024 }, "base_year_min": 1998, @@ -7325,7 +7299,7 @@ "end_year": 2024 }, "constant_years": { - "start_year": 1965, + "start_year": 1968, "end_year": 2024 }, "base_year_min": 1980, @@ -7339,7 +7313,7 @@ "end_year": 1990 }, "constant_years": { - "start_year": 1965, + "start_year": 1968, "end_year": 2024 }, "base_year_min": 2023, @@ -7353,7 +7327,7 @@ "end_year": 2024 }, "constant_years": { - "start_year": 1965, + "start_year": 1968, "end_year": 2024 }, "base_year_min": 2013, @@ -7367,7 +7341,7 @@ "end_year": 2024 }, "constant_years": { - "start_year": 1965, + "start_year": 1968, "end_year": 2024 }, "base_year_min": 1997, @@ -7381,7 +7355,7 @@ "end_year": 2020 }, "constant_years": { - "start_year": 1965, + "start_year": 1968, "end_year": 2024 }, "base_year_min": 2010, @@ -7395,7 +7369,7 @@ "end_year": 2024 }, "constant_years": { - "start_year": 1965, + "start_year": 1968, "end_year": 2024 }, "base_year_min": 1980, @@ -7409,7 +7383,7 @@ "end_year": 2023 }, "constant_years": { - "start_year": 1965, + "start_year": 1968, "end_year": 2024 }, "base_year_min": 2000, @@ -7423,7 +7397,7 @@ "end_year": 2024 }, "constant_years": { - "start_year": 1965, + "start_year": 1968, "end_year": 2024 }, "base_year_min": 1980, @@ -7437,7 +7411,7 @@ "end_year": 2024 }, "constant_years": { - "start_year": 1965, + "start_year": 1968, "end_year": 2024 }, "base_year_min": 1980, @@ -7451,7 +7425,7 @@ "end_year": 2024 }, "constant_years": { - "start_year": 1965, + "start_year": 1968, "end_year": 2024 }, "base_year_min": 1980, @@ -7461,11 +7435,11 @@ "code": "SEK", "noun": "Swedish kronor", "current_years": { - "start_year": 1965, + "start_year": 1968, "end_year": 2024 }, "constant_years": { - "start_year": 1965, + "start_year": 1968, "end_year": 2024 }, "base_year_min": 1960, @@ -7479,7 +7453,7 @@ "end_year": 2024 }, "constant_years": { - "start_year": 1965, + "start_year": 1968, "end_year": 2024 }, "base_year_min": 1980, @@ -7493,7 +7467,7 @@ "end_year": 2024 }, "constant_years": { - "start_year": 1965, + "start_year": 1968, "end_year": 2024 }, "base_year_min": 1980, @@ -7507,7 +7481,7 @@ "end_year": 2024 }, "constant_years": { - "start_year": 1965, + "start_year": 1968, "end_year": 2024 }, "base_year_min": 1980, @@ -7521,7 +7495,7 @@ "end_year": 2024 }, "constant_years": { - "start_year": 1965, + "start_year": 1968, "end_year": 2024 }, "base_year_min": 2011, @@ -7535,7 +7509,7 @@ "end_year": 2024 }, "constant_years": { - "start_year": 1965, + "start_year": 1968, "end_year": 2024 }, "base_year_min": 1980, @@ -7549,7 +7523,7 @@ "end_year": 2010 }, "constant_years": { - "start_year": 1965, + "start_year": 1968, "end_year": 2024 }, "base_year_min": 1980, @@ -7563,7 +7537,7 @@ "end_year": 2024 }, "constant_years": { - "start_year": 1965, + "start_year": 1968, "end_year": 2024 }, "base_year_min": 1980, @@ -7577,7 +7551,7 @@ "end_year": 2016 }, "constant_years": { - "start_year": 1965, + "start_year": 1968, "end_year": 2024 }, "base_year_min": 2018, @@ -7591,7 +7565,7 @@ "end_year": 2024 }, "constant_years": { - "start_year": 1965, + "start_year": 1968, "end_year": 2024 }, "base_year_min": 1992, @@ -7605,7 +7579,7 @@ "end_year": 2024 }, "constant_years": { - "start_year": 1965, + "start_year": 1968, "end_year": 2024 }, "base_year_min": 1992, @@ -7619,7 +7593,7 @@ "end_year": 2024 }, "constant_years": { - "start_year": 1965, + "start_year": 1968, "end_year": 2024 }, "base_year_min": 1980, @@ -7633,7 +7607,7 @@ "end_year": 2024 }, "constant_years": { - "start_year": 1965, + "start_year": 1968, "end_year": 2024 }, "base_year_min": 1980, @@ -7647,7 +7621,7 @@ "end_year": 2024 }, "constant_years": { - "start_year": 1965, + "start_year": 1968, "end_year": 2024 }, "base_year_min": 1990, @@ -7661,7 +7635,7 @@ "end_year": 2024 }, "constant_years": { - "start_year": 1965, + "start_year": 1968, "end_year": 2024 }, "base_year_min": 1980, @@ -7675,7 +7649,7 @@ "end_year": 2016 }, "constant_years": { - "start_year": 1965, + "start_year": 1968, "end_year": 2024 }, "base_year_min": 2023, @@ -7689,7 +7663,7 @@ "end_year": 2024 }, "constant_years": { - "start_year": 1965, + "start_year": 1968, "end_year": 2024 }, "base_year_min": 1980, @@ -7703,7 +7677,7 @@ "end_year": 2024 }, "constant_years": { - "start_year": 1965, + "start_year": 1968, "end_year": 2024 }, "base_year_min": 1991, @@ -7717,7 +7691,7 @@ "end_year": 2024 }, "constant_years": { - "start_year": 1965, + "start_year": 1968, "end_year": 2024 }, "base_year_min": 1980, @@ -7727,11 +7701,11 @@ "code": "USD", "noun": "US dollars", "current_years": { - "start_year": 1965, + "start_year": 1968, "end_year": 2024 }, "constant_years": { - "start_year": 1965, + "start_year": 1968, "end_year": 2024 }, "base_year_min": 1960, @@ -7745,7 +7719,7 @@ "end_year": 2024 }, "constant_years": { - "start_year": 1965, + "start_year": 1968, "end_year": 2024 }, "base_year_min": 1980, @@ -7759,7 +7733,7 @@ "end_year": 2024 }, "constant_years": { - "start_year": 1965, + "start_year": 1968, "end_year": 2024 }, "base_year_min": 1992, @@ -7773,7 +7747,7 @@ "end_year": 2024 }, "constant_years": { - "start_year": 1965, + "start_year": 1968, "end_year": 2024 }, "base_year_min": 2017, @@ -7787,7 +7761,7 @@ "end_year": 2024 }, "constant_years": { - "start_year": 1965, + "start_year": 1968, "end_year": 2024 }, "base_year_min": 1980, @@ -7801,7 +7775,7 @@ "end_year": 2024 }, "constant_years": { - "start_year": 1965, + "start_year": 1968, "end_year": 2024 }, "base_year_min": 1980, @@ -7815,7 +7789,7 @@ "end_year": 2024 }, "constant_years": { - "start_year": 1965, + "start_year": 1968, "end_year": 2024 }, "base_year_min": 1980, @@ -7829,7 +7803,7 @@ "end_year": 2024 }, "constant_years": { - "start_year": 1965, + "start_year": 1968, "end_year": 2024 }, "base_year_min": 1980, @@ -7843,7 +7817,7 @@ "end_year": 2024 }, "constant_years": { - "start_year": 1965, + "start_year": 1968, "end_year": 2024 }, "base_year_min": 1980, @@ -7857,7 +7831,7 @@ "end_year": 2024 }, "constant_years": { - "start_year": 1965, + "start_year": 1968, "end_year": 2024 }, "base_year_min": 1980, @@ -7871,7 +7845,7 @@ "end_year": 2024 }, "constant_years": { - "start_year": 1965, + "start_year": 1968, "end_year": 2024 }, "base_year_min": 2014, @@ -7885,7 +7859,7 @@ "end_year": 2024 }, "constant_years": { - "start_year": 1965, + "start_year": 1968, "end_year": 2024 }, "base_year_min": 1980, @@ -7899,7 +7873,7 @@ "end_year": 2024 }, "constant_years": { - "start_year": 1965, + "start_year": 1968, "end_year": 2024 }, "base_year_min": 1980, @@ -7913,7 +7887,7 @@ } } ], - "rendered_sentence": "Gross disbursements to 133 recipients from 38 providers for official development assistance, 1965 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": "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.", "sentence_plan": [ { "kind": "slot", @@ -8206,7 +8180,7 @@ }, { "kind": "slot", - "text": "1965 to 2024", + "text": "1968 to 2024", "axis": "when", "segment": "heading", "binding_ref": "when:", @@ -8289,21 +8263,21 @@ { "request": { "method": "GET", - "origin_path": "/api/datasets/spec_afa305d4c2ea8a14b7502ae6add29150/cv_e5cf1688f2e3ca168a199237ca2a8a62/files/sha256:c8c92ee6fd4b6f393a341cab7b74e3632caa4fdca1f27a3de55c4fbc8fb3521d" + "origin_path": "/api/datasets/spec_dee41c61dd0335d145f4c65e451817cb/cv_c29903dc477674b87b3e5e0097f7a828/files/sha256:3aae1d10e41e6cd40e33a2a65757641a4c74244ffcdd47974df72ab6dfa60779" }, "response": { "status": 302, "headers": { "content-type": "text/html", - "location": "https://storage.googleapis.com/dev-fin-observatory-datasets-working/sha256%3Ac8c92ee6fd4b6f393a341cab7b74e3632caa4fdca1f27a3de55c4fbc8fb3521d?X-Goog-Signature=redacted", - "x-dfo-trace-id": "cb161d2235e34b58bab93dec5adc8c66" + "location": "https://storage.googleapis.com/dev-fin-observatory-datasets-working/sha256%3A3aae1d10e41e6cd40e33a2a65757641a4c74244ffcdd47974df72ab6dfa60779?X-Goog-Signature=redacted", + "x-dfo-trace-id": "e8ac5b39c0c94474b741fefd66f9ef86" } } }, { "request": { "method": "GET", - "url": "https://storage.googleapis.com/dev-fin-observatory-datasets-working/sha256%3Ac8c92ee6fd4b6f393a341cab7b74e3632caa4fdca1f27a3de55c4fbc8fb3521d?X-Goog-Signature=redacted" + "url": "https://storage.googleapis.com/dev-fin-observatory-datasets-working/sha256%3A3aae1d10e41e6cd40e33a2a65757641a4c74244ffcdd47974df72ab6dfa60779?X-Goog-Signature=redacted" }, "response": { "status": 200, @@ -8317,56 +8291,55 @@ "expect": [ { "operation": { - "operation_id": "op_4be3387671a61839e73ac0e35fbe9daae30a038eb2943751ab2bed086542e7a7", + "operation_id": "op_a50d083649ee12fbede446887afa771e76446419365e74ade9d5239d128e6846", "status": "running" } }, { "dataset": { - "rows": 112798, + "rows": 110887, "columns": [ - "stat_var", - "financingProvider", + "time_period", "financingProvider_label", + "financingRecipient_label", + "value", + "unit_label", + "dac2aAidType_label", + "provenance_label", + "financingProvider", "financingProvider_kind", "financingRecipient", - "financingRecipient_label", "financingRecipient_kind", "dac2aAidType", - "dac2aAidType_label", - "time_period", - "value", "unit", - "unit_label", "currency", "price_basis", "base_year", "measurementMethod", "measurementMethod_label", "provenance", - "provenance_label" + "stat_var" ], "complete": true, "members": [ { "parts": [], - "spec_id": "spec_afa305d4c2ea8a14b7502ae6add29150", - "content_version": "cv_e5cf1688f2e3ca168a199237ca2a8a62", - "sentence": "Gross disbursements to 133 recipients from 38 providers for official development assistance, 1965 to 2024. Current US dollars · OECD DAC2a." + "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." } ], "missing": [], "long_builds": [ { - "operation_id": "op_4be3387671a61839e73ac0e35fbe9daae30a038eb2943751ab2bed086542e7a7", + "operation_id": "op_a50d083649ee12fbede446887afa771e76446419365e74ade9d5239d128e6846", "poll_waits": [ 1.5, 1.5, 1.5, 1.5, - 1.808, - 2.328, - 2.989 + 1.832, + 2.348 ], "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 ccb81e1..c952971 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 1959d74..80e7e42 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": "99e62038ceb4b459c2ac699549076ff123c166aa", - "recorded_at": "2026-10-25T17:37:13Z" + "dfo_commit": "d80df9f5fd598b7345255470932d202ee5d49942", + "recorded_at": "2026-10-26T09:23:39Z" }, "call": [ { @@ -36,7 +36,7 @@ "status": 200, "headers": { "content-type": "application/json", - "x-dfo-trace-id": "af1bc4ea7c8d4fc3a2c7700c683b0a50" + "x-dfo-trace-id": "3d449a99fb6941a8a036d4fd4ccd2555" }, "json": { "schema_version": 1, @@ -47,14 +47,14 @@ "extract_skipped": false }, "diagnostics": { - "engine_build": "99e62038ceb4b459c2ac699549076ff123c166aa", - "trace_id": "af1bc4ea7c8d4fc3a2c7700c683b0a50", + "engine_build": "d80df9f5fd598b7345255470932d202ee5d49942", + "trace_id": "3d449a99fb6941a8a036d4fd4ccd2555", "warnings": [], "timing_ms": { - "total": 5338, + "total": 6074, "by_step": { "coverage": 0, - "extract": 1068, + "extract": 1151, "cache_lookup": 0 } }, @@ -62,7 +62,7 @@ "input_tokens": 2241, "output_tokens": 197, "cached_tokens": 843, - "jev_input_tokens": 26477, + "jev_input_tokens": 26478, "jev_output_tokens": 5727 }, "timed_out": false @@ -73,28 +73,28 @@ "variable_text": "mortality", "warnings": [], "timing_ms": { - "total": 2825, + "total": 3027, "by_step": { "recall": 1, - "phase_resolve_places": 1, + "phase_resolve_places": 0, "phase_check_entities": 0, "shape_arcs": 4, - "shape_probe": 100, + "shape_probe": 99, "shape_groups": 6, "shape_labels": 1, "shape_admission": 1, "phase_derive_shapes": 0, - "shape": 209, + "shape": 206, "phase_prune_and_rank": 0, - "bind": 134, - "phase_bind": 16, + "bind": 135, + "phase_bind": 13, "phase_settle": 1, - "phase_place_bindings": 33, + "phase_place_bindings": 32, "phase_facet_requests": 0, - "materialise": 735, - "phase_materialise": 56, - "answer": 54, - "phase_outcome": 1585 + "materialise": 108, + "phase_materialise": 26, + "answer": 749, + "phase_outcome": 1756 } }, "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.", @@ -816,7 +816,7 @@ "start_year": 2013, "end_year": 2022 }, - "capability_version": "cap_88defe77cc79e0c0", + "capability_version": "cap_765c9d2a0c7529b9", "default_reading": { "applied": true, "removed_stat_vars": [] @@ -1599,6 +1599,15 @@ "value_kind": "enum_value" } }, + { + "value": { + "ref": { + "ref": "Years0", + "label": "Years 0" + }, + "value_kind": "enum_value" + } + }, { "value": { "ref": { @@ -1815,6 +1824,15 @@ "value_kind": "enum_value" } }, + { + "value": { + "ref": { + "ref": "Years85", + "label": "Years 85" + }, + "value_kind": "enum_value" + } + }, { "value": { "ref": { @@ -2350,7 +2368,7 @@ "start_year": 2013, "end_year": 2022 }, - "capability_version": "cap_88defe77cc79e0c0", + "capability_version": "cap_765c9d2a0c7529b9", "default_reading": { "applied": true, "removed_stat_vars": [] @@ -2388,29 +2406,29 @@ } ], "timing_ms": { - "total": 4195, + "total": 4844, "by_step": { - "recall": 256, + "recall": 440, "phase_resolve_places": 0, "phase_check_entities": 0, - "shape_arcs": 160, + "shape_arcs": 114, "shape_probe_coverage": 1, - "shape_probe": 678, - "shape_groups": 59, + "shape_probe": 110, + "shape_groups": 48, "shape_labels": 1, "shape_admission": 0, "phase_derive_shapes": 0, - "shape": 1043, + "shape": 430, "phase_prune_and_rank": 0, - "bind": 144, - "phase_bind": 29, - "phase_settle": 20, - "phase_place_bindings": 2077, + "bind": 142, + "phase_bind": 32, + "phase_settle": 18, + "phase_place_bindings": 3159, "phase_facet_requests": 0, - "materialise": 164, - "phase_materialise": 120, - "answer": 95, - "phase_outcome": 247 + "materialise": 156, + "phase_materialise": 145, + "answer": 88, + "phase_outcome": 234 } }, "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.", @@ -3289,7 +3307,7 @@ "start_year": 2013, "end_year": 2022 }, - "capability_version": "cap_88defe77cc79e0c0", + "capability_version": "cap_765c9d2a0c7529b9", "default_reading": { "applied": true, "removed_stat_vars": [] @@ -3788,7 +3806,7 @@ "start_year": 2013, "end_year": 2022 }, - "capability_version": "cap_88defe77cc79e0c0", + "capability_version": "cap_765c9d2a0c7529b9", "default_reading": { "applied": true, "removed_stat_vars": [] @@ -4375,7 +4393,7 @@ "status": 200, "headers": { "content-type": "application/json", - "x-dfo-trace-id": "4836483df98c43069fa37974421a91c9" + "x-dfo-trace-id": "3b1149548ca74cb588cb0a6041e4fb22" }, "json": { "schema_version": 1, @@ -4384,11 +4402,11 @@ "extract_skipped": true }, "diagnostics": { - "engine_build": "99e62038ceb4b459c2ac699549076ff123c166aa", - "trace_id": "4836483df98c43069fa37974421a91c9", + "engine_build": "d80df9f5fd598b7345255470932d202ee5d49942", + "trace_id": "3b1149548ca74cb588cb0a6041e4fb22", "warnings": [], "timing_ms": { - "total": 852, + "total": 698, "by_step": { "coverage": 0 } @@ -4401,19 +4419,19 @@ "variable_text": "mortality", "warnings": [], "timing_ms": { - "total": 320, + "total": 335, "by_step": { - "validate": 1, + "validate": 0, "walk": 0, "reread_arcs": 0, "detect_edits": 0, "resolve_survivors": 0, - "shape": 171, + "shape": 178, "bind": 0, - "where_places": 0, - "materialise": 146, + "where_places": 1, + "materialise": 153, "answer": 2, - "options": 0 + "options": 1 } }, "entity_refs": [], @@ -4932,7 +4950,7 @@ "start_year": 2013, "end_year": 2022 }, - "capability_version": "cap_88defe77cc79e0c0" + "capability_version": "cap_765c9d2a0c7529b9" }, "confidence": "high", "available_at_place": true, @@ -4994,19 +5012,19 @@ } ], "timing_ms": { - "total": 1243, + "total": 1059, "by_step": { "validate": 0, - "walk": 930, - "reread_arcs": 0, + "walk": 769, + "reread_arcs": 1, "detect_edits": 0, "resolve_survivors": 0, - "shape": 11, - "bind": 0, + "shape": 12, + "bind": 1, "where_places": 0, - "materialise": 195, - "answer": 8, - "options": 99 + "materialise": 190, + "answer": 9, + "options": 77 } }, "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.", @@ -5847,7 +5865,7 @@ "start_year": 2013, "end_year": 2022 }, - "capability_version": "cap_88defe77cc79e0c0" + "capability_version": "cap_765c9d2a0c7529b9" }, "confidence": "high", "available_at_place": true, @@ -6342,7 +6360,7 @@ "start_year": 2013, "end_year": 2022 }, - "capability_version": "cap_88defe77cc79e0c0" + "capability_version": "cap_765c9d2a0c7529b9" }, "confidence": "high", "available_at_place": true, 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 2d4947e..0a15890 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": "99e62038ceb4b459c2ac699549076ff123c166aa", - "recorded_at": "2026-10-25T17:37:32Z" + "dfo_commit": "d80df9f5fd598b7345255470932d202ee5d49942", + "recorded_at": "2026-10-26T09:23:59Z" }, "call": [ { @@ -36,7 +36,7 @@ "status": 200, "headers": { "content-type": "application/json", - "x-dfo-trace-id": "7d1c4e7cda8741809e23ad442314943f" + "x-dfo-trace-id": "e46fa17bc1484e228c45bc2637a31869" }, "json": { "schema_version": 1, @@ -47,14 +47,14 @@ "extract_skipped": false }, "diagnostics": { - "engine_build": "99e62038ceb4b459c2ac699549076ff123c166aa", - "trace_id": "7d1c4e7cda8741809e23ad442314943f", + "engine_build": "d80df9f5fd598b7345255470932d202ee5d49942", + "trace_id": "e46fa17bc1484e228c45bc2637a31869", "warnings": [], "timing_ms": { - "total": 3037, + "total": 3952, "by_step": { "coverage": 0, - "extract": 1160, + "extract": 1129, "cache_lookup": 0 } }, @@ -62,7 +62,7 @@ "input_tokens": 2241, "output_tokens": 196, "cached_tokens": 843, - "jev_input_tokens": 20184, + "jev_input_tokens": 20185, "jev_output_tokens": 4309 }, "timed_out": false @@ -73,28 +73,28 @@ "variable_text": "mortality", "warnings": [], "timing_ms": { - "total": 1872, + "total": 2818, "by_step": { "recall": 1, "phase_resolve_places": 1, "phase_check_entities": 0, - "shape_arcs": 5, - "shape_probe": 93, - "shape_groups": 7, + "shape_arcs": 3, + "shape_probe": 98, + "shape_groups": 6, "shape_labels": 1, "shape_admission": 1, "phase_derive_shapes": 0, - "shape": 224, + "shape": 1214, "phase_prune_and_rank": 0, - "bind": 242, - "phase_bind": 15, + "bind": 157, + "phase_bind": 24, "phase_settle": 1, - "phase_place_bindings": 36, + "phase_place_bindings": 33, "phase_facet_requests": 0, - "materialise": 35, - "phase_materialise": 28, - "answer": 53, - "phase_outcome": 1236 + "materialise": 22, + "phase_materialise": 25, + "answer": 33, + "phase_outcome": 1307 } }, "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.", @@ -816,7 +816,7 @@ "start_year": 2013, "end_year": 2022 }, - "capability_version": "cap_88defe77cc79e0c0", + "capability_version": "cap_765c9d2a0c7529b9", "default_reading": { "applied": true, "removed_stat_vars": [] @@ -1599,6 +1599,15 @@ "value_kind": "enum_value" } }, + { + "value": { + "ref": { + "ref": "Years0", + "label": "Years 0" + }, + "value_kind": "enum_value" + } + }, { "value": { "ref": { @@ -1815,6 +1824,15 @@ "value_kind": "enum_value" } }, + { + "value": { + "ref": { + "ref": "Years85", + "label": "Years 85" + }, + "value_kind": "enum_value" + } + }, { "value": { "ref": { @@ -2350,7 +2368,7 @@ "start_year": 2013, "end_year": 2022 }, - "capability_version": "cap_88defe77cc79e0c0", + "capability_version": "cap_765c9d2a0c7529b9", "default_reading": { "applied": true, "removed_stat_vars": [] @@ -2375,22 +2393,22 @@ "variable_text": "savings", "warnings": [], "timing_ms": { - "total": 691, + "total": 1496, "by_step": { - "recall": 251, + "recall": 235, "phase_resolve_places": 0, "phase_check_entities": 0, - "shape_arcs": 2, + "shape_arcs": 1, "shape_probe_coverage": 1, - "shape_probe": 109, - "shape_groups": 59, + "shape_probe": 96, + "shape_groups": 908, "shape_labels": 1, - "shape_admission": 0, - "phase_derive_shapes": 0, - "shape": 291, + "shape_admission": 6, + "phase_derive_shapes": 1, + "shape": 1119, "phase_prune_and_rank": 0, - "bind": 143, - "phase_bind": 6 + "bind": 137, + "phase_bind": 4 } }, "rendered_sentence": "Could not match \"savings\" to a supported indicator. Try a different wording or a related indicator.", @@ -2727,7 +2745,7 @@ "status": 200, "headers": { "content-type": "application/json", - "x-dfo-trace-id": "749ca6333aa64edd9de3c8cb02bd693a" + "x-dfo-trace-id": "cf171b52e7e34625bb6dba046e930821" }, "json": { "schema_version": 1, @@ -2736,11 +2754,11 @@ "extract_skipped": true }, "diagnostics": { - "engine_build": "99e62038ceb4b459c2ac699549076ff123c166aa", - "trace_id": "749ca6333aa64edd9de3c8cb02bd693a", + "engine_build": "d80df9f5fd598b7345255470932d202ee5d49942", + "trace_id": "cf171b52e7e34625bb6dba046e930821", "warnings": [], "timing_ms": { - "total": 312, + "total": 351, "by_step": { "coverage": 0 } @@ -2753,17 +2771,17 @@ "variable_text": "mortality", "warnings": [], "timing_ms": { - "total": 242, + "total": 283, "by_step": { "validate": 0, "walk": 0, "reread_arcs": 0, "detect_edits": 0, "resolve_survivors": 0, - "shape": 159, - "bind": 0, + "shape": 172, + "bind": 1, "where_places": 0, - "materialise": 81, + "materialise": 108, "answer": 2, "options": 0 } @@ -3284,7 +3302,7 @@ "start_year": 2013, "end_year": 2022 }, - "capability_version": "cap_88defe77cc79e0c0" + "capability_version": "cap_765c9d2a0c7529b9" }, "confidence": "high", "available_at_place": true, 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 de173c2..9e2a4fb 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": "7fd4a5b5b50648999f5ead8966bcc02c" + "x-dfo-trace-id": "01cf4a9623c449759f24d249f8783de1" }, "json": [ { @@ -42,14 +42,14 @@ "extract_skipped": false }, "diagnostics": { - "engine_build": "99e62038ceb4b459c2ac699549076ff123c166aa", - "trace_id": "7fd4a5b5b50648999f5ead8966bcc02c", + "engine_build": "d80df9f5fd598b7345255470932d202ee5d49942", + "trace_id": "01cf4a9623c449759f24d249f8783de1", "warnings": [], "timing_ms": { - "total": 1054, + "total": 1162, "by_step": { "coverage": 0, - "extract": 1050, + "extract": 1040, "cache_lookup": 0 } }, @@ -66,9 +66,9 @@ "variable_text": "ODA disbursements", "warnings": [], "timing_ms": { - "total": 0, + "total": 117, "by_step": { - "recall": 0, + "recall": 117, "phase_resolve_places": 0, "phase_check_entities": 0 } @@ -263,7 +263,7 @@ "error": { "class": "ContractError", "code": "contract_violation", - "trace_id": "7fd4a5b5b50648999f5ead8966bcc02c" + "trace_id": "01cf4a9623c449759f24d249f8783de1" } } ] 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 c71b5dc..1365929 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": "99e62038ceb4b459c2ac699549076ff123c166aa", - "recorded_at": "2026-10-25T17:36:49Z" + "dfo_commit": "d80df9f5fd598b7345255470932d202ee5d49942", + "recorded_at": "2026-10-26T09:23:14Z" }, "call": [ { @@ -31,7 +31,7 @@ "status": 200, "headers": { "content-type": "application/json", - "x-dfo-trace-id": "8f5cab91863343b4965c34bb668c4168" + "x-dfo-trace-id": "14c23c7a7a01430eb3f485e658ae7e51" }, "json": { "schema_version": 1, @@ -39,23 +39,24 @@ "entry_path": "raw_text", "raw_query": "aid from Congo to Congo", "normalized_query": "aid from Congo to Congo", - "extract_skipped": true + "extract_skipped": false }, "diagnostics": { - "engine_build": "99e62038ceb4b459c2ac699549076ff123c166aa", - "trace_id": "8f5cab91863343b4965c34bb668c4168", + "engine_build": "d80df9f5fd598b7345255470932d202ee5d49942", + "trace_id": "14c23c7a7a01430eb3f485e658ae7e51", "warnings": [], "timing_ms": { - "total": 1, + "total": 1535, "by_step": { "coverage": 0, - "response_cache_layer1": 1 + "extract": 1020, + "cache_lookup": 0 } }, "llm_usage": { - "input_tokens": 0, - "output_tokens": 0, - "cached_tokens": 0 + "input_tokens": 2226, + "output_tokens": 106, + "cached_tokens": 840 }, "timed_out": false }, @@ -65,9 +66,9 @@ "variable_text": "aid", "warnings": [], "timing_ms": { - "total": 133, + "total": 377, "by_step": { - "recall": 133, + "recall": 377, "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 37dd24d..27b7347 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": "99e62038ceb4b459c2ac699549076ff123c166aa", - "recorded_at": "2026-10-25T17:36:46Z" + "dfo_commit": "d80df9f5fd598b7345255470932d202ee5d49942", + "recorded_at": "2026-10-26T09:23:11Z" }, "call": [ { @@ -31,7 +31,7 @@ "status": 200, "headers": { "content-type": "application/json", - "x-dfo-trace-id": "7fd4a5b5b50648999f5ead8966bcc02c" + "x-dfo-trace-id": "01cf4a9623c449759f24d249f8783de1" }, "json": { "schema_version": 1, @@ -42,14 +42,14 @@ "extract_skipped": false }, "diagnostics": { - "engine_build": "99e62038ceb4b459c2ac699549076ff123c166aa", - "trace_id": "7fd4a5b5b50648999f5ead8966bcc02c", + "engine_build": "d80df9f5fd598b7345255470932d202ee5d49942", + "trace_id": "01cf4a9623c449759f24d249f8783de1", "warnings": [], "timing_ms": { - "total": 1054, + "total": 1162, "by_step": { "coverage": 0, - "extract": 1050, + "extract": 1040, "cache_lookup": 0 } }, @@ -66,9 +66,9 @@ "variable_text": "ODA disbursements", "warnings": [], "timing_ms": { - "total": 0, + "total": 117, "by_step": { - "recall": 0, + "recall": 117, "phase_resolve_places": 0, "phase_check_entities": 0 } 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 46d5e92..6925a06 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": "7fd4a5b5b50648999f5ead8966bcc02c" + "x-dfo-trace-id": "01cf4a9623c449759f24d249f8783de1" }, "json": { "schema_version": 1, @@ -72,14 +72,14 @@ "extract_skipped": false }, "diagnostics": { - "engine_build": "99e62038ceb4b459c2ac699549076ff123c166aa", - "trace_id": "7fd4a5b5b50648999f5ead8966bcc02c", + "engine_build": "d80df9f5fd598b7345255470932d202ee5d49942", + "trace_id": "01cf4a9623c449759f24d249f8783de1", "warnings": [], "timing_ms": { - "total": 1054, + "total": 1162, "by_step": { "coverage": 0, - "extract": 1050, + "extract": 1040, "cache_lookup": 0 } }, @@ -96,9 +96,9 @@ "variable_text": "ODA disbursements", "warnings": [], "timing_ms": { - "total": 0, + "total": 117, "by_step": { - "recall": 0, + "recall": 117, "phase_resolve_places": 0, "phase_check_entities": 0 } 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 2070d99..a01b3dc 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": "7fd4a5b5b50648999f5ead8966bcc02c" + "x-dfo-trace-id": "01cf4a9623c449759f24d249f8783de1" }, "json": { "schema_version": 1, @@ -71,14 +71,14 @@ "extract_skipped": false }, "diagnostics": { - "engine_build": "99e62038ceb4b459c2ac699549076ff123c166aa", - "trace_id": "7fd4a5b5b50648999f5ead8966bcc02c", + "engine_build": "d80df9f5fd598b7345255470932d202ee5d49942", + "trace_id": "01cf4a9623c449759f24d249f8783de1", "warnings": [], "timing_ms": { - "total": 1054, + "total": 1162, "by_step": { "coverage": 0, - "extract": 1050, + "extract": 1040, "cache_lookup": 0 } }, @@ -95,9 +95,9 @@ "variable_text": "ODA disbursements", "warnings": [], "timing_ms": { - "total": 0, + "total": 117, "by_step": { - "recall": 0, + "recall": 117, "phase_resolve_places": 0, "phase_check_entities": 0 } 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 2692829..5f5376f 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": "7fd4a5b5b50648999f5ead8966bcc02c", + "x-dfo-trace-id": "01cf4a9623c449759f24d249f8783de1", "x-dfo-warning": "Search runs on a reduced index while it is rebuilt." }, "json": { @@ -50,14 +50,14 @@ "extract_skipped": false }, "diagnostics": { - "engine_build": "99e62038ceb4b459c2ac699549076ff123c166aa", - "trace_id": "7fd4a5b5b50648999f5ead8966bcc02c", + "engine_build": "d80df9f5fd598b7345255470932d202ee5d49942", + "trace_id": "01cf4a9623c449759f24d249f8783de1", "warnings": [], "timing_ms": { - "total": 1054, + "total": 1162, "by_step": { "coverage": 0, - "extract": 1050, + "extract": 1040, "cache_lookup": 0 } }, @@ -74,9 +74,9 @@ "variable_text": "ODA disbursements", "warnings": [], "timing_ms": { - "total": 0, + "total": 117, "by_step": { - "recall": 0, + "recall": 117, "phase_resolve_places": 0, "phase_check_entities": 0 } @@ -280,7 +280,7 @@ "status": 200, "headers": { "content-type": "application/json", - "x-dfo-trace-id": "7fd4a5b5b50648999f5ead8966bcc02c", + "x-dfo-trace-id": "01cf4a9623c449759f24d249f8783de1", "x-dfo-warning": "Search runs on a reduced index while it is rebuilt.", "sunset": "Sat, 01 May 2027 00:00:00 GMT" }, @@ -293,14 +293,14 @@ "extract_skipped": false }, "diagnostics": { - "engine_build": "99e62038ceb4b459c2ac699549076ff123c166aa", - "trace_id": "7fd4a5b5b50648999f5ead8966bcc02c", + "engine_build": "d80df9f5fd598b7345255470932d202ee5d49942", + "trace_id": "01cf4a9623c449759f24d249f8783de1", "warnings": [], "timing_ms": { - "total": 1054, + "total": 1162, "by_step": { "coverage": 0, - "extract": 1050, + "extract": 1040, "cache_lookup": 0 } }, @@ -317,9 +317,9 @@ "variable_text": "ODA disbursements", "warnings": [], "timing_ms": { - "total": 0, + "total": 117, "by_step": { - "recall": 0, + "recall": 117, "phase_resolve_places": 0, "phase_check_entities": 0 } @@ -523,7 +523,7 @@ "status": 200, "headers": { "content-type": "application/json", - "x-dfo-trace-id": "7fd4a5b5b50648999f5ead8966bcc02c", + "x-dfo-trace-id": "01cf4a9623c449759f24d249f8783de1", "x-dfo-warning": "Search answers from a cached release.", "deprecation": "@1777593600", "sunset": "Sat, 01 May 2027 00:00:00 GMT" @@ -537,14 +537,14 @@ "extract_skipped": false }, "diagnostics": { - "engine_build": "99e62038ceb4b459c2ac699549076ff123c166aa", - "trace_id": "7fd4a5b5b50648999f5ead8966bcc02c", + "engine_build": "d80df9f5fd598b7345255470932d202ee5d49942", + "trace_id": "01cf4a9623c449759f24d249f8783de1", "warnings": [], "timing_ms": { - "total": 1054, + "total": 1162, "by_step": { "coverage": 0, - "extract": 1050, + "extract": 1040, "cache_lookup": 0 } }, @@ -561,9 +561,9 @@ "variable_text": "ODA disbursements", "warnings": [], "timing_ms": { - "total": 0, + "total": 117, "by_step": { - "recall": 0, + "recall": 117, "phase_resolve_places": 0, "phase_check_entities": 0 } 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 5ca56de..9dc10a7 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": "7fd4a5b5b50648999f5ead8966bcc02c", + "x-dfo-trace-id": "01cf4a9623c449759f24d249f8783de1", "sunset": "Sat, 01 May 2027 00:00:00 GMT" }, "json": { @@ -46,14 +46,14 @@ "extract_skipped": false }, "diagnostics": { - "engine_build": "99e62038ceb4b459c2ac699549076ff123c166aa", - "trace_id": "7fd4a5b5b50648999f5ead8966bcc02c", + "engine_build": "d80df9f5fd598b7345255470932d202ee5d49942", + "trace_id": "01cf4a9623c449759f24d249f8783de1", "warnings": [], "timing_ms": { - "total": 1054, + "total": 1162, "by_step": { "coverage": 0, - "extract": 1050, + "extract": 1040, "cache_lookup": 0 } }, @@ -70,9 +70,9 @@ "variable_text": "ODA disbursements", "warnings": [], "timing_ms": { - "total": 0, + "total": 117, "by_step": { - "recall": 0, + "recall": 117, "phase_resolve_places": 0, "phase_check_entities": 0 } @@ -276,7 +276,7 @@ "status": 200, "headers": { "content-type": "application/json", - "x-dfo-trace-id": "7fd4a5b5b50648999f5ead8966bcc02c", + "x-dfo-trace-id": "01cf4a9623c449759f24d249f8783de1", "sunset": "Sat, 01 May 2027 00:00:00 GMT" }, "json": { @@ -288,14 +288,14 @@ "extract_skipped": false }, "diagnostics": { - "engine_build": "99e62038ceb4b459c2ac699549076ff123c166aa", - "trace_id": "7fd4a5b5b50648999f5ead8966bcc02c", + "engine_build": "d80df9f5fd598b7345255470932d202ee5d49942", + "trace_id": "01cf4a9623c449759f24d249f8783de1", "warnings": [], "timing_ms": { - "total": 1054, + "total": 1162, "by_step": { "coverage": 0, - "extract": 1050, + "extract": 1040, "cache_lookup": 0 } }, @@ -312,9 +312,9 @@ "variable_text": "ODA disbursements", "warnings": [], "timing_ms": { - "total": 0, + "total": 117, "by_step": { - "recall": 0, + "recall": 117, "phase_resolve_places": 0, "phase_check_entities": 0 } 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 bf34e7a..9e48a68 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": "99e62038ceb4b459c2ac699549076ff123c166aa", - "recorded_at": "2026-10-25T17:36:48Z" + "dfo_commit": "d80df9f5fd598b7345255470932d202ee5d49942", + "recorded_at": "2026-10-26T09:23:13Z" }, "call": [ { @@ -31,7 +31,7 @@ "status": 200, "headers": { "content-type": "application/json", - "x-dfo-trace-id": "4fae4e9b2aac46e181137e1a5933cad9" + "x-dfo-trace-id": "5df79c87dd3c43589df5c2921f3c93e3" }, "json": { "schema_version": 1, @@ -42,14 +42,14 @@ "extract_skipped": false }, "diagnostics": { - "engine_build": "99e62038ceb4b459c2ac699549076ff123c166aa", - "trace_id": "4fae4e9b2aac46e181137e1a5933cad9", + "engine_build": "d80df9f5fd598b7345255470932d202ee5d49942", + "trace_id": "5df79c87dd3c43589df5c2921f3c93e3", "warnings": [], "timing_ms": { - "total": 1079, + "total": 1209, "by_step": { "coverage": 0, - "extract": 1073, + "extract": 1202, "cache_lookup": 0 } }, @@ -68,8 +68,8 @@ "timing_ms": { "total": 1, "by_step": { - "recall": 0, - "phase_resolve_places": 1, + "recall": 1, + "phase_resolve_places": 0, "phase_check_entities": 0 } }, @@ -240,9 +240,9 @@ "variable_text": "ODA disbursements", "warnings": [], "timing_ms": { - "total": 1, + "total": 2, "by_step": { - "recall": 1, + "recall": 2, "phase_resolve_places": 0, "phase_check_entities": 0 } 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 ca600da..10533af 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": "99e62038ceb4b459c2ac699549076ff123c166aa", - "recorded_at": "2026-10-25T17:36:56Z" + "dfo_commit": "d80df9f5fd598b7345255470932d202ee5d49942", + "recorded_at": "2026-10-26T09:23:20Z" }, "call": [ { @@ -38,7 +38,7 @@ "status": 200, "headers": { "content-type": "application/json", - "x-dfo-trace-id": "8efbbbdde0c5461cb4b3bf1723d9895e" + "x-dfo-trace-id": "6cfb1ed8ec3e430a91c10329304d9af4" }, "json": { "schema_version": 1, @@ -46,23 +46,26 @@ "entry_path": "raw_text", "raw_query": "top 5 donors to Ethiopia in 2022", "normalized_query": "top 5 donors to Ethiopia in 2022", - "extract_skipped": true + "extract_skipped": false }, "diagnostics": { - "engine_build": "99e62038ceb4b459c2ac699549076ff123c166aa", - "trace_id": "8efbbbdde0c5461cb4b3bf1723d9895e", + "engine_build": "d80df9f5fd598b7345255470932d202ee5d49942", + "trace_id": "6cfb1ed8ec3e430a91c10329304d9af4", "warnings": [], "timing_ms": { - "total": 3, + "total": 1831, "by_step": { "coverage": 0, - "response_cache_layer1": 1 + "extract": 1224, + "cache_lookup": 0 } }, "llm_usage": { - "input_tokens": 0, - "output_tokens": 0, - "cached_tokens": 0 + "input_tokens": 2233, + "output_tokens": 188, + "cached_tokens": 841, + "jev_input_tokens": 4485, + "jev_output_tokens": 849 }, "timed_out": false }, @@ -79,7 +82,7 @@ { "code": "role_scope_defaulted", "severity": "warn", - "message": "no provider was named; the answer was resolved across every provider with data." + "message": "No provider was named, so the answer covers every provider with data." }, { "code": "whole_total_available", @@ -94,30 +97,30 @@ } ], "timing_ms": { - "total": 911, + "total": 603, "by_step": { - "recall": 405, + "recall": 81, "phase_resolve_places": 0, "phase_check_entities": 0, - "shape_arcs": 4, - "shape_probe_coverage": 7, - "shape_probe": 119, - "shape_groups": 6, + "shape_arcs": 3, + "shape_probe_coverage": 11, + "shape_probe": 116, + "shape_groups": 9, "shape_labels": 0, "shape_admission": 1, "phase_derive_shapes": 0, - "shape": 220, + "shape": 227, "phase_prune_and_rank": 0, - "bind": 107, - "phase_bind": 17, + "bind": 106, + "phase_bind": 16, "phase_settle": 8, "phase_place_bindings": 1, "phase_facet_requests": 0, - "materialise": 40, + "materialise": 38, "phase_materialise": 5, - "answer": 26, - "options": 12, - "phase_outcome": 70 + "answer": 19, + "options": 11, + "phase_outcome": 91 } }, "restatement": { @@ -679,7 +682,7 @@ "source": "observed" } ], - "rendered_sentence": "Gross disbursements to Ethiopia from 110 providers for official development assistance in 2022. Current US dollars · OECD DAC2a.", + "rendered_sentence": "Gross disbursements to Ethiopia from 95 providers for official development assistance in 2022. Current US dollars · OECD DAC2a.", "sentence_plan": [ { "kind": "slot", @@ -724,7 +727,7 @@ }, { "kind": "slot", - "text": "110 providers", + "text": "95 providers", "segment": "heading", "role": "origin", "binding_ref": "origin:", @@ -979,7 +982,7 @@ "start_year": 2022, "end_year": 2022 }, - "capability_version": "cap_88defe77cc79e0c0", + "capability_version": "cap_765c9d2a0c7529b9", "default_reading": { "applied": true, "removed_stat_vars": [] @@ -1133,7 +1136,7 @@ "role_axis_facts": [ { "role": "origin", - "member_count": 110, + "member_count": 95, "members_available": true } ], @@ -3088,7 +3091,7 @@ } } ], - "rendered_sentence": "Gross disbursements to Ethiopia from 110 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": "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_plan": [ { "kind": "slot", @@ -3137,7 +3140,7 @@ }, { "kind": "slot", - "text": "110 providers", + "text": "95 providers", "segment": "heading", "role": "origin", "binding_ref": "origin:", @@ -3390,7 +3393,8 @@ }, "options": { "format": "parquet", - "bundle": false + "bundle": false, + "without_party_totals": true } } }, @@ -3398,7 +3402,7 @@ "status": 200, "headers": { "content-type": "application/json", - "x-dfo-trace-id": "a75708bb29f54f7990579c3103e25a2d" + "x-dfo-trace-id": "003f90ea7c3b4c0ea7414ee5a282c0f4" }, "json": { "schema_version": 1, @@ -3458,14 +3462,14 @@ } } }, - "content_version": "cv_534dd4c2bf9bdafc837d51a3ba4bcf3e", + "content_version": "cv_c17d6a131cb4556543b91556e46814e9", "prepared_at": "2026-10-20T16:52:43Z", "coverage": { - "rows": 110, + "rows": 95, "dimensions": [ { "label": "financingProvider", - "count": 110, + "count": 95, "axis": "origin", "noun": { "singular": "provider", @@ -3639,9 +3643,31 @@ "family_member_count": 1, "family_member_digest": "1a36e1a7292b1bfff95a5415de0be74cac7bb033217ed50e79faa8ce51a224c0", "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-25T17:36:57.924541+00:00" + "confirmed_at": "2026-10-26T09:23:22.526168+00:00" }, "warnings": [], "diagnostics": [ @@ -3653,32 +3679,33 @@ ], "artifacts": [ { - "artifact_digest": "sha256:f0ac1a058c4addb59b1974b73706b12ddc112b409aac006d6a561279f61f0c6a", + "artifact_digest": "sha256:d2ea67ebd67a84915c8e97a7ef4b66733e2d624a1cc5d1c927d6673c8c2f668e", "rendering": { "bundle": false, "format": "parquet", - "layout": 4 + "layout": 4, + "without_party_totals": true }, - "bytes": 10927, + "bytes": 10329, "media_type": "application/vnd.apache.parquet", - "created_at": "2026-10-23T16:59:51.176407+00:00", + "created_at": "2026-10-24T20:59:40.869991+00:00", "tier": "working", - "url": "/api/datasets/spec_7778beed72f8433bb7fde4293acfd175/cv_534dd4c2bf9bdafc837d51a3ba4bcf3e/files/sha256:f0ac1a058c4addb59b1974b73706b12ddc112b409aac006d6a561279f61f0c6a", + "url": "/api/datasets/spec_7778beed72f8433bb7fde4293acfd175/cv_c17d6a131cb4556543b91556e46814e9/files/sha256:d2ea67ebd67a84915c8e97a7ef4b66733e2d624a1cc5d1c927d6673c8c2f668e", "enrichment_stamp": "08ed6c734fc69ea2204a21f4e1dd8b963f14dd1e03a2484c618049ac2e2d93d8" }, { - "artifact_digest": "sha256:5b508be6b46ce8e01315f9c89a1837e17ed7b49d7d2554011cfdba9f32203084", + "artifact_digest": "sha256:d59c03c57a8ea2d1da95b4fb2b1131919e8a13b2003ef51fc1b3801ca46be960", "rendering": { "statistics": "series" }, - "bytes": 10167, + "bytes": 9527, "media_type": "application/vnd.apache.parquet", - "created_at": "2026-10-20T16:52:44.112078+00:00", + "created_at": "2026-10-23T22:01:14.760267+00:00", "tier": "working", - "url": "/api/datasets/spec_7778beed72f8433bb7fde4293acfd175/cv_534dd4c2bf9bdafc837d51a3ba4bcf3e/files/sha256:5b508be6b46ce8e01315f9c89a1837e17ed7b49d7d2554011cfdba9f32203084" + "url": "/api/datasets/spec_7778beed72f8433bb7fde4293acfd175/cv_c17d6a131cb4556543b91556e46814e9/files/sha256:d59c03c57a8ea2d1da95b4fb2b1131919e8a13b2003ef51fc1b3801ca46be960" } ], - "series_count": 110, + "series_count": 95, "output_options": { "capability_version": "dset_76f5fa7244511c58", "columns": [ @@ -3692,7 +3719,7 @@ "name": "financingProvider", "kind": "role", "droppable": false, - "distinct": 110 + "distinct": 95 }, { "name": "financingRecipient", @@ -3760,7 +3787,7 @@ "state": "partial", "reason": "enrichment_unavailable", "coverage": { - "entities": 110, + "entities": 95, "covered": 40 }, "missing": [ @@ -3768,10 +3795,6 @@ "ref": "AdaptationFund", "label": "Adaptation Fund" }, - { - "ref": "AfricanDevelopmentBankGroup", - "label": "African Development Bank Group" - }, { "ref": "AfricanDevelopmentFund", "label": "African Development Fund" @@ -3801,8 +3824,12 @@ "label": "Conrad N. Hilton Foundation" }, { - "ref": "DACCountriesTotal", - "label": "DAC countries" + "ref": "DavidAndLucilePackardFoundation", + "label": "David and Lucile Packard Foundation" + }, + { + "ref": "DutchPostcodeLottery", + "label": "Dutch Postcode Lottery" } ], "truncated": true @@ -3814,7 +3841,7 @@ "state": "partial", "reason": "enrichment_unavailable", "coverage": { - "entities": 110, + "entities": 95, "covered": 40 }, "missing": [ @@ -3822,10 +3849,6 @@ "ref": "AdaptationFund", "label": "Adaptation Fund" }, - { - "ref": "AfricanDevelopmentBankGroup", - "label": "African Development Bank Group" - }, { "ref": "AfricanDevelopmentFund", "label": "African Development Fund" @@ -3855,8 +3878,12 @@ "label": "Conrad N. Hilton Foundation" }, { - "ref": "DACCountriesTotal", - "label": "DAC countries" + "ref": "DavidAndLucilePackardFoundation", + "label": "David and Lucile Packard Foundation" + }, + { + "ref": "DutchPostcodeLottery", + "label": "Dutch Postcode Lottery" } ], "truncated": true @@ -3867,8 +3894,8 @@ "token": "financingProvider_label", "state": "available", "coverage": { - "entities": 110, - "covered": 110 + "entities": 95, + "covered": 95 }, "missing": [], "truncated": false @@ -3879,8 +3906,8 @@ "token": "financingProvider_type", "state": "available", "coverage": { - "entities": 110, - "covered": 110 + "entities": 95, + "covered": 95 }, "missing": [], "truncated": false @@ -3891,8 +3918,8 @@ "token": "financingProvider_party_kind", "state": "available", "coverage": { - "entities": 110, - "covered": 110 + "entities": 95, + "covered": 95 }, "missing": [], "truncated": false @@ -3903,8 +3930,8 @@ "token": "financingProvider_party_class", "state": "available", "coverage": { - "entities": 110, - "covered": 110 + "entities": 95, + "covered": 95 }, "missing": [], "truncated": false @@ -3915,8 +3942,8 @@ "token": "financingProvider_party_whole", "state": "available", "coverage": { - "entities": 110, - "covered": 110 + "entities": 95, + "covered": 95 }, "missing": [], "truncated": false @@ -4037,7 +4064,7 @@ "series_coverage_stamp": "e6e717ab8c77e84d010915893ede5809e9ecec67929a07cfafbcc2210edfa1eb", "retention": { "pinned": false, - "held_until": "2026-11-19T16:52:44.112184Z" + "held_until": "2026-11-22T22:01:14.671345Z" } } } @@ -4045,21 +4072,21 @@ { "request": { "method": "GET", - "origin_path": "/api/datasets/spec_7778beed72f8433bb7fde4293acfd175/cv_534dd4c2bf9bdafc837d51a3ba4bcf3e/files/sha256:f0ac1a058c4addb59b1974b73706b12ddc112b409aac006d6a561279f61f0c6a" + "origin_path": "/api/datasets/spec_7778beed72f8433bb7fde4293acfd175/cv_c17d6a131cb4556543b91556e46814e9/files/sha256:d2ea67ebd67a84915c8e97a7ef4b66733e2d624a1cc5d1c927d6673c8c2f668e" }, "response": { "status": 302, "headers": { "content-type": "text/html", - "location": "https://storage.googleapis.com/dev-fin-observatory-datasets-working/sha256%3Af0ac1a058c4addb59b1974b73706b12ddc112b409aac006d6a561279f61f0c6a?X-Goog-Signature=redacted", - "x-dfo-trace-id": "bef8e4e89532481ab37c6143ca0b7689" + "location": "https://storage.googleapis.com/dev-fin-observatory-datasets-working/sha256%3Ad2ea67ebd67a84915c8e97a7ef4b66733e2d624a1cc5d1c927d6673c8c2f668e?X-Goog-Signature=redacted", + "x-dfo-trace-id": "014016fd216a48729c10484f342a83a6" } } }, { "request": { "method": "GET", - "url": "https://storage.googleapis.com/dev-fin-observatory-datasets-working/sha256%3Af0ac1a058c4addb59b1974b73706b12ddc112b409aac006d6a561279f61f0c6a?X-Goog-Signature=redacted" + "url": "https://storage.googleapis.com/dev-fin-observatory-datasets-working/sha256%3Ad2ea67ebd67a84915c8e97a7ef4b66733e2d624a1cc5d1c927d6673c8c2f668e?X-Goog-Signature=redacted" }, "response": { "status": 200, @@ -4075,7 +4102,7 @@ "answer": { "kind": "resolution", "status": "definite", - "sentence": "Gross disbursements to Ethiopia from 110 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": "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.", "complete": true, "specs": [ "spec_7778beed72f8433bb7fde4293acfd175" @@ -4087,33 +4114,33 @@ "error": { "class": "SearchWarning", "code": null, - "trace_id": "8efbbbdde0c5461cb4b3bf1723d9895e" + "trace_id": "6cfb1ed8ec3e430a91c10329304d9af4" } }, { "dataset": { - "rows": 110, + "rows": 95, "columns": [ - "stat_var", - "financingProvider", + "time_period", "financingProvider_label", + "financingRecipient_label", + "value", + "unit_label", + "dac2aAidType_label", + "provenance_label", + "financingProvider", "financingProvider_kind", "financingRecipient", - "financingRecipient_label", "financingRecipient_kind", "dac2aAidType", - "dac2aAidType_label", - "time_period", - "value", "unit", - "unit_label", "currency", "price_basis", "base_year", "measurementMethod", "measurementMethod_label", "provenance", - "provenance_label" + "stat_var" ], "complete": true, "members": [ @@ -4122,8 +4149,8 @@ "aid" ], "spec_id": "spec_7778beed72f8433bb7fde4293acfd175", - "content_version": "cv_534dd4c2bf9bdafc837d51a3ba4bcf3e", - "sentence": "Gross disbursements to Ethiopia from 110 providers for official development assistance in 2022. Current US dollars · OECD DAC2a." + "content_version": "cv_c17d6a131cb4556543b91556e46814e9", + "sentence": "Gross disbursements to Ethiopia from 95 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 7f04cba..91ee4cc 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 bb4f7b2..8d5b00b 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": "99e62038ceb4b459c2ac699549076ff123c166aa", + "commit": "d80df9f5fd598b7345255470932d202ee5d49942", "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 31280af..c5ab609 100644 --- a/python/client-contract/src/dfo_client_contract/served/openapi.json +++ b/python/client-contract/src/dfo_client_contract/served/openapi.json @@ -3567,25 +3567,26 @@ "kind": { "type": "string", "enum": [ + "name_corrected", "declared_default", "open_role", "place_scope" ], "title": "Kind", - "description": "what the engine filled. '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" + "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 or the place scope, as on the sentence's own tokens" + "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 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" + "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": { @@ -3595,7 +3596,21 @@ "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). An open role and the place scope carry []. A dataset_resubmit echo matches a declared default to its slot by these values" + "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, @@ -14257,7 +14272,7 @@ "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.\n- `ambiguous`: `candidates`, in the resolver's order.\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`." + "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": { @@ -15485,7 +15500,7 @@ } ], "title": "Member Count", - "description": "how many entities this axis' open scope resolves to. 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" + "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" }, "members_available": { "type": "boolean", @@ -19505,6 +19520,28 @@ ], "description": "coverage_below_scope only: the entities the request binds that served no observation, sorted; absent when there are none" }, + "requested_years": { + "anyOf": [ + { + "$ref": "#/components/schemas/YearRangeModel" + }, + { + "type": "null" + } + ], + "description": "coverage_below_scope only: the year range the request asked for, when the data covers fewer of its years; absent otherwise" + }, + "served_years": { + "anyOf": [ + { + "$ref": "#/components/schemas/YearRangeModel" + }, + { + "type": "null" + } + ], + "description": "coverage_below_scope only: the years the data covers, both bounds set, beside requested_years; absent otherwise" + }, "omitted_entities": { "anyOf": [ { @@ -19536,7 +19573,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`, `currency_unmapped_omitted` `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 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}`." }, "WindowAll": { "properties": { @@ -19743,6 +19780,38 @@ ], "title": "YearRange" }, + "YearRangeModel": { + "properties": { + "start": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ], + "title": "Start", + "description": "the first year; absent when the request left it open" + }, + "end": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ], + "title": "End", + "description": "the last year; absent when the request left it open" + } + }, + "additionalProperties": false, + "type": "object", + "title": "YearRangeModel", + "description": "A run of years, both bounds included (`materialise.codes.YearRange`)." + }, "datasets_api__capabilities__Capabilities": { "properties": { "capability_version": { diff --git a/python/client-contract/tests/test_rules.py b/python/client-contract/tests/test_rules.py index 0564749..d51cbf0 100644 --- a/python/client-contract/tests/test_rules.py +++ b/python/client-contract/tests/test_rules.py @@ -179,6 +179,16 @@ def cache_entry(vector: dict[str, Any]) -> str: return f"manifests/{vector['spec_id']}/{vector['content_version']}/{key}.json" +def column_order(columns: list[str], reading: list[list[str]]) -> list[str]: + first = [ + name + for names in reading + if (name := next((n for n in names if n in columns), None)) is not None + ] + rest = [c for c in columns if c not in first and c != "stat_var"] + return first + rest + ["stat_var"] * ("stat_var" in columns) + + @pytest.mark.parametrize("name", RULES) def test_every_rule_has_vectors(name: str) -> None: assert rule(name)["rule"] == name @@ -246,3 +256,13 @@ def test_cache_dir(vector: dict[str, Any]) -> None: @pytest.mark.parametrize("vector", _vectors("cache-layout"), ids=_ids("cache-layout")) def test_cache_layout(vector: dict[str, Any]) -> None: assert cache_entry(vector) == vector["path"] + + +@pytest.mark.parametrize("vector", _vectors("column-order"), ids=_ids("column-order")) +def test_column_order(vector: dict[str, Any]) -> None: + reading = rule("column-order")["reading_columns"] + if "columns" in vector: + assert column_order(vector["columns"], reading) == vector["ordered"] + return + gathered = list(dict.fromkeys(c for member in vector["members"] for c in member)) + assert ["part", *column_order(gathered, reading)] == vector["ordered"] diff --git a/tools/README.md b/tools/README.md index 6e4fb59..dfc1122 100644 --- a/tools/README.md +++ b/tools/README.md @@ -38,7 +38,7 @@ uv run tools/validate_provenance_docs_vectors.py uv run tools/validate_descriptions_vectors.py ``` -`validate_client_contract.py` validates the client contract under `python/client-contract/src/dfo_client_contract/` against its schemas, then checks what they cannot express: every `strict-fields.json` pointer resolves in `served/openapi.json` and stays required and non-nullable, or keeps its enum values; `actions.json` holds one row, in code order, for each active refusal code in `registries/codes.json` that reaches a problem document or a no_data reason, with a gap kind exactly for the no_data reasons; `client-codes.json` lists each code a client raises itself once, in code order, none of them a code in `actions.json` or the registry, each with a class a scenario names and a retryable flag; `proxy-codes.json` and `warning-codes.json` list their codes once, in code order, apart from every other table, and the warning codes are those the client rules issue; `served/openapi.json` holds the Search, Datasets, Graph and Presentation surfaces and nothing outside them but the platform's `/codes` route; each recorded scenario's requests match a served route and its JSON bodies validate against that route's schemas, where a required member stays required when it admits null; every problem document in a scenario, synthetic ones and failed operations' errors included, carries an active code registered at its status or a code `proxy-codes.json` lists at its status, and one with a proxy code is `application/problem+json` with the common members, its own status and `retryable` true; no 202 in a scenario reads `done`; each recorded scenario names `served/SOURCE.json`'s commit; each scenario's `expect` equals the outcomes its steps reach over its exchanges, with refusals' error classes and gap kinds from `actions.json`, each error the client raises itself carrying its code and class from `client-codes.json`, a repeated refused request counted a retry only where the retry rules allow one, a record that stops retrying while a retry remains refused, and the waits before retries and the warnings response headers issue derived; each POST carries its body, each build posts the body its spec, narrowing and layout give, each Search request posts the whole body its steps derive, each poll names the operation the client holds, and each signed download is the URL its redirect names; each body file a record names is a bare file name in `scenarios/` and no symlink; every absolute URL a record holds is a signed URL on the storage host with the redacted query, or a `location` under the base URL; and each `DatasetRef` example gets the verdict it states. It does not import `dfo_client_contract`, whose `tests/test_rules.py` replays the rule vectors. Also a PEP 723 script: +`validate_client_contract.py` validates the client contract under `python/client-contract/src/dfo_client_contract/` against its schemas, then checks what they cannot express: every `strict-fields.json` pointer resolves in `served/openapi.json` and stays required and non-nullable, or keeps its enum values; `actions.json` holds one row, in code order, for each active refusal code in `registries/codes.json` that reaches a problem document or a no_data reason, with a gap kind exactly for the no_data reasons; `client-codes.json` lists each code a client raises itself once, in code order, none of them a code in `actions.json` or the registry, each with a class a scenario names and a retryable flag; `proxy-codes.json` and `warning-codes.json` list their codes once, in code order, apart from every other table, and the warning codes are those the client rules issue; `served/openapi.json` holds the Search, Datasets, Graph and Presentation surfaces and nothing outside them but the platform's `/codes` route; each recorded scenario's requests match a served route and its JSON bodies validate against that route's schemas, where a required member stays required when it admits null; every problem document in a scenario, synthetic ones and failed operations' errors included, carries an active code registered at its status or a code `proxy-codes.json` lists at its status, and one with a proxy code is `application/problem+json` with the common members, its own status and `retryable` true; no 202 in a scenario reads `done`; each recorded scenario names `served/SOURCE.json`'s commit; each scenario's `expect` equals the outcomes its steps reach over its exchanges, with refusals' error classes and gap kinds from `actions.json`, each error the client raises itself carrying its code and class from `client-codes.json`, a repeated refused request counted a retry only where the retry rules allow one, a record that stops retrying while a retry remains refused, and the waits before retries and the warnings response headers issue derived; each POST carries its body, each build posts the body its spec, narrowing, layout and, for a fetch, party totals give, each dataset's columns are the column-order rule's order of the columns the downloaded Parquet files' footers name, each Search request posts the whole body its steps derive, each poll names the operation the client holds, and each signed download is the URL its redirect names; each body file a record names is a bare file name in `scenarios/` and no symlink; every absolute URL a record holds is a signed URL on the storage host with the redacted query, or a `location` under the base URL; each `DatasetRef` example gets the verdict it states, and each column-order vector orders its columns as the rule does. It does not import `dfo_client_contract`, whose `tests/test_rules.py` replays the rule vectors. Also a PEP 723 script: ```bash uv run tools/validate_client_contract.py diff --git a/tools/capture_client_contract.py b/tools/capture_client_contract.py index 5b160cb..e85a3cb 100644 --- a/tools/capture_client_contract.py +++ b/tools/capture_client_contract.py @@ -47,8 +47,7 @@ The outcome rules, error classes, gap kinds and long-build pacing come from `tools/validate_client_contract.py`, so a record's `expect` is written -by the code that checks it. pyarrow loads only when a Parquet body is read, so -the tests run without it. +by the code that checks it. """ from __future__ import annotations @@ -72,6 +71,7 @@ from typing import Any, Protocol from urllib.parse import quote, unquote, urljoin, urlsplit, urlunsplit +import pyarrow.parquet as pq from validate_client_contract import ( FILE_EXPIRED, FILE_GONE, @@ -105,15 +105,18 @@ digest_of, download_target, failed_operation, + fetch_rendering, gap_kinds, header_warnings, held_spec, + load_reading_columns, may_retry, newest_plain, owns_body_file, part_label, pick_artifact, posted_scope, + presented_columns, problem_body, read_from, refusal_error, @@ -142,8 +145,13 @@ REPOSITORY = "DevelopmentFinanceObservatory/apis" BINARY_BUDGET = 5_000_000 -# The rendering both clients ask for, bare long Parquet. -RENDERING = {"format": "parquet", "bundle": False} +# The rendering a fetch asks for by default, bare long Parquet with the party +# totals of open party roles left out, and so the rendering a ref it writes +# records. +RENDERING = fetch_rendering(None) +# The reading slots of the column-order rule, which orders each dataset's +# columns as a client presents them, or None when the rule file cannot be read. +READING_COLUMNS = load_reading_columns(PACKAGE_DIR) # The response headers a client reads, and so the ones a record keeps, beside # a `cache-control` that marks the response shared-cacheable, which excuses it # from carrying `x-dfo-trace-id`. @@ -583,7 +591,8 @@ def dataset_outcome( ) -> dict[str, Any]: """A dataset outcome. Several members stack into one long table with a `part` column first, holding each member's `part_label`, then every - member's columns in member order.""" + member's columns in member order. The columns after `part` are in the + order the column-order rule gives.""" summaries = [ { "parts": member.parts, @@ -594,11 +603,15 @@ def dataset_outcome( for member in members ] dataset: dict[str, Any] = {"rows": sum(member.rows for member in members)} - if len(members) == 1: - dataset["columns"] = list(members[0].columns) - else: - columns = dict.fromkeys(c for m in members for c in m.columns) - dataset["columns"] = ["part", *columns] + if READING_COLUMNS is None: + raise SystemExit( + "rules/column-order.json is missing or holds no reading_columns, so " + "no dataset's columns can be ordered" + ) + dataset["columns"] = presented_columns( + [member.columns for member in members], READING_COLUMNS + ) + if len(members) > 1: dataset["part_rows"] = [ {"part": part_label(summary), "rows": member.rows} for summary, member in zip(summaries, members, strict=True) @@ -608,8 +621,6 @@ def dataset_outcome( def parquet_shape(data: bytes) -> tuple[int, list[str]]: - import pyarrow.parquet as pq # noqa: PLC0415 - optional, so the tests run without it - parquet = pq.ParquetFile(io.BytesIO(data)) return parquet.metadata.num_rows, list(parquet.schema_arrow.names) @@ -645,12 +656,18 @@ class Minted: def _step_options( - step: dict[str, Any], *, layout: str | None, strict: bool + step: dict[str, Any], + *, + layout: str | None, + strict: bool, + party_totals: bool = False, ) -> dict[str, Any]: if layout is not None: step["layout"] = layout if strict: step["strict"] = True + if party_totals: + step["party_totals"] = True return step @@ -765,11 +782,13 @@ def fetch_answer( partial: bool = False, strict: bool = False, layout: str | None = None, + party_totals: bool = False, ) -> None: - """Builds the answer's readings. A declined or catalogue answer, a gap - outside a partial fetch, a partial fetch with no reading, a strict - fetch whose readings depart from the question, and the frame layout - with several readings each raise before any request.""" + """Builds the answer's readings, leaving out party totals unless + `party_totals`. A declined or catalogue answer, a gap outside a + partial fetch, a partial fetch with no reading, a strict fetch whose + readings depart from the question, and the frame layout with several + readings each raise before any request.""" step: dict[str, Any] = {"op": "fetch"} if partial: step["partial"] = True @@ -787,7 +806,7 @@ def run() -> dict[str, Any]: ClientError(search_warning_code(answer), error="SearchWarning"), answer.trace_id, ) - rendering = rendering_for(layout) + rendering = fetch_rendering(layout, party_totals=party_totals) if "layout" in rendering and len(readings) > 1: raise ClientError("invalid_argument") members = [ @@ -796,7 +815,10 @@ def run() -> dict[str, Any]: ] return dataset_outcome(members, missing=gaps, search_warning=warns) - self._step(_step_options(step, layout=layout, strict=strict), run) + options = _step_options( + step, layout=layout, strict=strict, party_totals=party_totals + ) + self._step(options, run) def fetch_spec( self, @@ -807,10 +829,11 @@ def fetch_spec( facets: Mapping[str, str] | None = None, layout: str | None = None, strict: bool = False, + party_totals: bool = False, ) -> list[Member]: - """Builds `spec` narrowed by `window`, `entities` and `facets`. A - role in `entities` replaces the spec's binding of it, or drops it - when null.""" + """Builds `spec` narrowed by `window`, `entities` and `facets`, + leaving out party totals unless `party_totals`. A role in `entities` + replaces the spec's binding of it, or drops it when null.""" step: dict[str, Any] = {"op": "fetch", "spec": spec.step()} if window is not None: step["window"] = list(window) if isinstance(window, tuple) else window @@ -825,11 +848,14 @@ def fetch_spec( built: list[Member] = [] def run() -> dict[str, Any]: - rendering = rendering_for(layout) + rendering = fetch_rendering(layout, party_totals=party_totals) built.append(self.build([], spec, scope, rendering, strict=strict)) return dataset_outcome(built) - self._step(_step_options(step, layout=layout, strict=strict), run) + options = _step_options( + step, layout=layout, strict=strict, party_totals=party_totals + ) + self._step(options, run) return built def fetch_ref(self, ref: dict[str, Any]) -> None: @@ -1212,13 +1238,18 @@ def _build_body( # recipient pairs of one variable over 60 years. A variable broken down by # sector would list thousands of variables in the done manifest. ASYNC = ( - "ODA disbursements from the DAC countries to the G77 countries from 1964 to 2024" + "ODA disbursements from the DAC countries to the G77 countries from 1967 to 2024" ) ASYNC_RESUMED = ( - "ODA disbursements from the OECD countries to the G77 countries from 1965 to 2024" + "ODA disbursements from the OECD countries to the G77 countries from 1968 to 2024" ) NARROW_WINDOW = (2020, 2023) REBOUND_ORIGIN = "country/FRA" +# The ASYNC spec narrowed to one recipient and year with its origin open: the +# DAC2a table lists the donor group totals beside their members, about 110 +# rows with them and 95 without. +PARTY_TOTALS_WINDOW = (2022, 2022) +PARTY_TOTALS_ENTITIES = {"origin": None, "destination": ["country/KEN"]} SYNC_ROWS = 100_000 @@ -1389,6 +1420,36 @@ def run(s: Session, ctx: Context) -> None: return run +def _fetch_spec_party_totals(*, keep: bool) -> Callable[[Session, Context], None]: + """Fetches the ASYNC spec narrowed to PARTY_TOTALS_ENTITIES in + PARTY_TOTALS_WINDOW, keeping party totals when `keep`, and checks + against a fetch with the other setting that leaving them out drops rows + and answers a version of its own.""" + + def run(s: Session, ctx: Context) -> None: + spec = ctx.definite_spec(ASYNC) + + def fetched(session: Session, party_totals: bool) -> Member: + (member,) = session.fetch_spec( + spec, + window=PARTY_TOTALS_WINDOW, + entities=PARTY_TOTALS_ENTITIES, + party_totals=party_totals, + ) + return member + + member = fetched(s, keep) + other = fetched(ctx.session("prerequisite"), not keep) + kept, cut = (member, other) if keep else (other, member) + require(kept.rows > cut.rows, "leaving out party totals drops rows") + require( + kept.content_version != cut.content_version, + "the version without party totals is a version of its own", + ) + + return run + + def _fetch_spec_grouped( *, window: tuple[int, int] | None = None, @@ -1707,6 +1768,21 @@ def _resubmit_placeholder(s: Session, ctx: Context) -> None: "a new spec_id bound to destination alone.", _fetch_spec_entities({"origin": None}), ), + Recorded( + "fetch-spec-party-totals-left-out", + "Fetching a spec of DAC2a ODA to Kenya in 2022 with its origin open posts " + "without_party_totals: true in the build's options, as every fetch does by default, so " + "the build leaves out the donor group totals beside their members and answers a " + "version of its own, with fewer rows than fetch-spec-party-totals-kept.", + _fetch_spec_party_totals(keep=False), + ), + Recorded( + "fetch-spec-party-totals-kept", + "Fetching the spec of fetch-spec-party-totals-left-out with party_totals=True posts no " + "without_party_totals, so the build keeps the donor group totals and answers the plain " + "version, with more rows.", + _fetch_spec_party_totals(keep=True), + ), Recorded( "fetch-spec-group-narrowed", "Fetching a spec whose destination is the least developed countries group with " @@ -2396,8 +2472,9 @@ def _poll_index(exchanges: Sequence[dict[str, Any]]) -> int: def _async_fetch( change: Callable[[list[dict[str, Any]], dict[str, Any]], None] | None = None, ) -> Callable[[dict[str, Any], Context], Derived]: - """The parent's mint and result as one fetch of its spec, which makes the - same exchanges. `change` edits the exchanges and the fetch's outcome.""" + """The parent's mint and result as one fetch of its spec that keeps + party totals, which makes the same exchanges, since a mint posts the + plain rendering. `change` edits the exchanges and the fetch's outcome.""" def derive(parent: dict[str, Any], ctx: Context) -> Derived: mint, result = parent["call"] @@ -2412,9 +2489,12 @@ def derive(parent: dict[str, Any], ctx: Context) -> Derived: outcome = copy.deepcopy(parent["expect"][1]) if change is not None: change(exchanges, outcome["dataset"]["long_builds"][0]) - return Derived( - [{"op": "fetch", "spec": copy.deepcopy(mint["spec"])}], exchanges, [outcome] - ) + fetch = { + "op": "fetch", + "spec": copy.deepcopy(mint["spec"]), + "party_totals": True, + } + return Derived([fetch], exchanges, [outcome]) return derive @@ -2442,27 +2522,29 @@ def _accepted_running(exchanges: list[dict[str, Any]], build: dict[str, Any]) -> def _pacing_changes(exchanges: list[dict[str, Any]], build: dict[str, Any]) -> None: - """Each poll that finds the build running reads its own retry_after_ms, - the next value of _CHANGING_PACING_MS in turn, and the wait before the - next poll is that poll's value. How many polls find it running depends on - how long the recorded build took.""" - running = [ - e["response"]["json"]["operation"] - for e in exchanges[_poll_index(exchanges) :] + """Each poll that finds the build running reads its own retry_after_ms + from _CHANGING_PACING_MS, and the wait before the next poll is that + poll's value. The recording's running polls past that many are left + out, since how many a build takes depends on the server's load.""" + polls = [ + i + for i, e in enumerate(exchanges) if e["request"].get("path", "").startswith("/datasets/operations/") and e["response"]["json"]["operation"]["status"] == "running" ] require( - len(running) >= len(_CHANGING_PACING_MS), - f"at least {len(_CHANGING_PACING_MS)} polls find the build running", + len(polls) >= len(_CHANGING_PACING_MS), + f"{len(_CHANGING_PACING_MS)} polls find the build running", ) - pacing = [ - _CHANGING_PACING_MS[index % len(_CHANGING_PACING_MS)] - for index in range(len(running)) + for index in reversed(polls[len(_CHANGING_PACING_MS) :]): + del exchanges[index] + running = [ + exchanges[i]["response"]["json"]["operation"] + for i in polls[: len(_CHANGING_PACING_MS)] ] - for operation, ms in zip(running, pacing, strict=True): + for operation, ms in zip(running, _CHANGING_PACING_MS, strict=True): operation["retry_after_ms"] = ms - build["poll_waits"][1:] = [ms / 1000 for ms in pacing] + build["poll_waits"][1:] = [ms / 1000 for ms in _CHANGING_PACING_MS] def _operation_failed(exchanges: list[dict[str, Any]], build: dict[str, Any]) -> None: @@ -3724,7 +3806,8 @@ def _empty_narrowing(parent: dict[str, Any], ctx: Context) -> Derived: Synthetic( "fetch-spec-async-build", "mint-async-build", - "The mint and result steps become one fetch of the spec, which makes the same exchanges.", + "The mint and result steps become one fetch of the spec with party_totals, which " + "makes the same exchanges.", "Fetching a spec whose build answers 202 polls the operation: it waits the 202's " "retry_after_ms, then each poll's, backing off from 1 to 8 seconds when a poll gives " "none, and downloads the done manifest's file.", @@ -4549,6 +4632,7 @@ def drive(session: Session, call: Sequence[dict[str, Any]]) -> None: facets=step.get("facets"), layout=step.get("layout"), strict=step.get("strict", False), + party_totals=step.get("party_totals", False), ) case {"op": "fetch", "ref": ref}: session.fetch_ref(ref) @@ -4562,6 +4646,7 @@ def drive(session: Session, call: Sequence[dict[str, Any]]) -> None: partial=step.get("partial", False), strict=step.get("strict", False), layout=step.get("layout"), + party_totals=step.get("party_totals", False), ) case {"op": "mint", "spec": spec}: session.mint( diff --git a/tools/tests/test_capture_client_contract.py b/tools/tests/test_capture_client_contract.py index 9bad07f..ab90b8e 100644 --- a/tools/tests/test_capture_client_contract.py +++ b/tools/tests/test_capture_client_contract.py @@ -2,12 +2,12 @@ The recorder's client reproduces each packaged record from the record's own steps and responses, every derived record follows from its parent, and the -writers keep the kit's JSON formatting. No test reaches the network or needs -pyarrow: a fake transport serves the recorded responses, and the Parquet shape -reader is replaced, so rows and columns are the one part of a dataset outcome -these tests leave to the recording. +writers keep the kit's JSON formatting. No test reaches the network: a fake +transport serves the recorded responses, and the Parquet shape reader is +replaced, so rows and columns are the one part of a dataset outcome these +tests leave to the recording. -Run with: uv run --with jsonschema --with pytest pytest tools/tests -q +Run with: uv run --with jsonschema --with pyarrow --with pytest pytest tools/tests -q """ from __future__ import annotations @@ -404,24 +404,39 @@ def test_a_part_without_a_reading_is_a_gap_of_its_kind( def test_several_members_stack_with_a_part_column_first() -> None: + """The stacked columns follow `part` in the column-order rule's order, + the reading columns first and `stat_var` last.""" member = capture.Member( - [], {"spec_id": "spec_a"}, "cv_a", "A.", "sha256:a", 2, ["x", "y"] + [], + {"spec_id": "spec_a"}, + "cv_a", + "A.", + "sha256:a", + 2, + ["stat_var", "x", "value"], ) other = capture.Member( [], {"spec_id": "spec_b"}, "cv_b", "B.", "sha256:b", 3, ["y", "z"] ) unnamed = capture.Member( - ["p", "q"], {"spec_id": "spec_b"}, "cv_b", "B.", "sha256:b", 3, ["y", "z"] + ["p", "q"], + {"spec_id": "spec_b"}, + "cv_b", + "B.", + "sha256:b", + 3, + ["value", "time_period"], ) dataset = capture.dataset_outcome([member, unnamed])["dataset"] - assert dataset["columns"] == ["part", "x", "y", "z"] + assert dataset["columns"] == ["part", "time_period", "value", "x", "stat_var"] assert dataset["rows"] == 5 assert dataset["part_rows"] == [ {"part": "A.", "rows": 2}, {"part": "p; q", "rows": 3}, ] assert "part_rows" not in capture.dataset_outcome([other])["dataset"] - assert capture.dataset_outcome([member])["dataset"]["columns"] == ["x", "y"] + columns = capture.dataset_outcome([member])["dataset"]["columns"] + assert columns == ["value", "x", "stat_var"] @pytest.mark.parametrize( diff --git a/tools/tests/test_validate_client_contract.py b/tools/tests/test_validate_client_contract.py index d6418af..5dee37a 100644 --- a/tools/tests/test_validate_client_contract.py +++ b/tools/tests/test_validate_client_contract.py @@ -11,7 +11,7 @@ bodies included, which takes about a third of a second. The copy hard-links the package's files, so it writes no data where the file system allows. -Run with: uv run --with jsonschema --with pytest pytest tools/tests -q +Run with: uv run --with jsonschema --with pyarrow --with pytest pytest tools/tests -q """ from __future__ import annotations @@ -156,6 +156,15 @@ def _part_rows(change: Callable[[Any], None]) -> Callable[[Any], None]: return _set_outcome(1, lambda o: change(o["dataset"])) +def _swap_columns(first: str, second: str) -> Callable[[Any], None]: + def change(outcome: Any) -> None: + columns = outcome["dataset"]["columns"] + i, j = columns.index(first), columns.index(second) + columns[i], columns[j] = columns[j], columns[i] + + return change + + def _set_step(index: int, **fields: Any) -> Callable[[Any], None]: return lambda doc: doc["call"][index].update(fields) @@ -892,7 +901,7 @@ def change(doc: Any) -> None: lambda doc: doc["ref"]["members"][0].update( content_version="cv_" + "0" * 32 ), - "member 0 content_version is not fetch-spec-known-sentence's", + "member 0 content_version is not fetch-spec-party-totals-kept's", ), ( "refs/ref-one-member.json", @@ -904,6 +913,18 @@ def change(doc: Any) -> None: lambda doc: doc.pop("scenario"), "names no scenario that serves its members", ), + ( + "refs/ref-answer-member.json", + lambda doc: doc["ref"]["members"][0].update(parts=[]), + "refs/ref-answer-member.json: member 0 parts is not answer-definite-fetch's", + ), + ( + "refs/ref-without-party-totals.json", + lambda doc: doc["ref"]["members"][0]["artifact"]["rendering"].pop( + "without_party_totals" + ), + "refs/ref-without-party-totals.json: member 0 records rendering", + ), ( "rules/key-format.json", lambda doc: doc["vectors"].append(doc["vectors"][0]), @@ -1663,6 +1684,59 @@ def change(doc: Any) -> None: ), "the step follows no answer", ), + ( + _FETCH, + lambda doc: doc["exchanges"][0]["request"]["json"]["options"].pop( + "without_party_totals" + ), + f"{_FETCH}: the exchanges do not fit the steps: _UnfitError('exchange 0 posts", + ), + ( + "scenarios/fetch-spec-party-totals-kept.json", + lambda doc: doc["call"][0].pop("party_totals"), + ( + "scenarios/fetch-spec-party-totals-kept.json: the exchanges do not fit " + "the steps: _UnfitError('exchange 0 posts" + ), + ), + ( + _FETCH, + _set_outcome(0, lambda o: o["dataset"]["columns"].reverse()), + f"{_FETCH}: step 0: columns", + ), + ( + _FOLDED, + _part_rows(lambda d: d["columns"].append(d["columns"].pop(1))), + f"{_FOLDED}: step 1: columns", + ), + ( + "scenarios/fetch-ref.json", + _set_outcome(0, _swap_columns("currency", "base_year")), + "scenarios/fetch-ref.json: step 0: columns", + ), + ( + "scenarios/fetch-ref.json", + _set_outcome(0, lambda o: o["dataset"]["columns"].remove("price_basis")), + "scenarios/fetch-ref.json: step 0: columns", + ), + ( + "rules/column-order.json", + lambda doc: doc["vectors"][0]["ordered"].reverse(), + "orders its columns otherwise than presented_columns", + ), + ( + "rules/column-order.json", + lambda doc: doc["vectors"][-1]["ordered"].remove("part"), + "vector 'stack-crs-and-dac2a' orders its columns otherwise", + ), + ( + "rules/column-order.json", + lambda doc: doc.pop("reading_columns"), + ( + "rules/column-order.json: missing or unreadable, or holds no " + "reading_columns" + ), + ), ], ids=[ "strict-pointer-unresolved", @@ -1740,6 +1814,8 @@ def change(doc: Any) -> None: "ref-content-version-stale", "ref-member-not-served", "ref-without-scenario", + "ref-parts-not-served", + "ref-rendering-not-posted", "rule-vector-repeated", "client-code-without-condition", "client-codes-unsorted", @@ -1902,6 +1978,15 @@ def change(doc: Any) -> None: "bound-entities-as-objects-compared", "mentions-as-a-string-matched", "candidate-spec-not-an-object-read", + "party-totals-left-in-by-default", + "party-totals-kept-without-the-option", + "columns-out-of-reading-order", + "stacked-columns-out-of-reading-order", + "served-order-of-other-columns-swapped", + "served-column-dropped", + "column-order-vector-misordered", + "column-order-stacked-vector-misordered", + "column-order-without-reading-columns", ], ) def test_a_broken_contract_is_reported( @@ -1915,6 +2000,14 @@ def test_a_broken_contract_is_reported( assert any(expected in problem for problem in problems), problems +def test_a_missing_column_order_rule_is_reported(package_dir: Path) -> None: + (package_dir / "rules" / "column-order.json").unlink() + assert any( + problem.startswith("rules/column-order.json: missing") + for problem in validator.validate() + ) + + def test_a_record_that_holds_only_under_its_recorded_host_is_reported( package_dir: Path, monkeypatch: pytest.MonkeyPatch ) -> None: diff --git a/tools/tests/test_validate_descriptions_vectors.py b/tools/tests/test_validate_descriptions_vectors.py index 4cf4e6b..d2e5696 100644 --- a/tools/tests/test_validate_descriptions_vectors.py +++ b/tools/tests/test_validate_descriptions_vectors.py @@ -5,7 +5,7 @@ does not get the schema verdict it states, and an operation list that breaks a rule the operation schema cannot express, must each be reported. -Run with: uv run --with jsonschema --with pytest pytest tools/tests -q +Run with: uv run --with jsonschema --with pyarrow --with pytest pytest tools/tests -q """ from __future__ import annotations diff --git a/tools/tests/test_validate_provenance_docs_vectors.py b/tools/tests/test_validate_provenance_docs_vectors.py index 929de7b..567e7bb 100644 --- a/tools/tests/test_validate_provenance_docs_vectors.py +++ b/tools/tests/test_validate_provenance_docs_vectors.py @@ -4,7 +4,7 @@ express, so those checks must read it without raising, and the validator must report every diagnostic and exit 1. -Run with: uv run --with jsonschema --with pytest pytest tools/tests -q +Run with: uv run --with jsonschema --with pyarrow --with pytest pytest tools/tests -q """ from __future__ import annotations diff --git a/tools/tests/test_validate_registry.py b/tools/tests/test_validate_registry.py index 4d504f2..2255e44 100644 --- a/tools/tests/test_validate_registry.py +++ b/tools/tests/test_validate_registry.py @@ -14,7 +14,7 @@ Also tests check_entries' precondition for that matching: an entry's `mappings` may not repeat an `(endpoint, channel)` pair. -Run with: uv run --with jsonschema --with pytest pytest tools/tests -q +Run with: uv run --with jsonschema --with pyarrow --with pytest pytest tools/tests -q (importing tools/validate_registry.py imports jsonschema at module scope, so a plain interpreter needs it on the path; `--with` provisions it for the one invocation without a project-level dependency). diff --git a/tools/tests/test_validate_unit_registry.py b/tools/tests/test_validate_unit_registry.py index dd71b87..0cc8097 100644 --- a/tools/tests/test_validate_unit_registry.py +++ b/tools/tests/test_validate_unit_registry.py @@ -1,7 +1,7 @@ """Tests for tools/validate_unit_registry.py: each mutation of the real registry is one rule the schema or the row checks must refuse. -Run with: uv run --with jsonschema --with pytest pytest tools/tests -q +Run with: uv run --with jsonschema --with pyarrow --with pytest pytest tools/tests -q """ from __future__ import annotations diff --git a/tools/validate_client_contract.py b/tools/validate_client_contract.py index 296b5a3..ff7db6e 100644 --- a/tools/validate_client_contract.py +++ b/tools/validate_client_contract.py @@ -2,6 +2,7 @@ # requires-python = ">=3.12" # dependencies = [ # "jsonschema>=4.23", +# "pyarrow>=15", # ] # /// """Validate the client contract under @@ -60,14 +61,15 @@ `client-codes.json`, as `expected_outcomes` derives them, the waits before each poll included, under the record's base URL and again under REPLAY_ORIGIN with the recorded origin a response names moved there. A - dataset's rows, columns and per-part row counts are left to the Parquet - bodies, and each download hashes to its artifact's digest or the outcome - says it does not. Each Search request a + dataset's columns are the downloaded files' columns, read from their + Parquet footers by `parquet_columns` and ordered by `presented_columns`, + its rows and per-part row counts are left to the Parquet bodies, and each + download hashes to its artifact's digest or the outcome says it does not. Each Search request a record holds posts the input the steps derive: the question, a choice's data_query or dataset_resubmit entries, or a member's identity with the entity groups of the roles its build left bound as they were, and each build posts the body `build_body` gives for the spec the step builds, its - narrowing and its layout, and each Search request the whole body + narrowing, its layout and, for a fetch, its party totals, and each Search request the whole body `search_body` gives. A POST carries its body, a refused request repeated is a retry only as `may_retry` allows, a record that ends a run of retries while `may_retry` holds does not fit, each poll names the operation the @@ -84,11 +86,15 @@ states: from `dataset-ref.schema.json`, then from the rules that each member's definition carries its own `spec_id` and that members hold distinct `spec_id`s. A ref example whose ref holds members names the - recorded `scenario` that serves them, and each member's `spec_id`, + recorded `scenario` that serves them, and each member's `spec_id`, `parts`, `content_version` and `sentence` are a dataset member's of that scenario, and its artifact digest is the digest of a file the scenario downloads. + Each member of an example the schema accepts records the rendering the + scenario's build of its spec posted. - Each rule file under `rules/` validates against `rules.schema.json`, names - the rule its file name names, and names each vector once. + the rule its file name names, and names each vector once, and each + column-order vector's `ordered` is what `presented_columns` gives. A + missing or unreadable `rules/column-order.json` is a problem. It does not import `dfo_client_contract`, whose tests replay the rule vectors. `tools/capture_client_contract.py` imports the outcome @@ -109,6 +115,8 @@ from urllib.parse import quote, urljoin, urlsplit, urlunsplit import jsonschema +import pyarrow as pa +import pyarrow.parquet as pq from referencing import Registry, Resource from referencing.jsonschema import DRAFT202012 @@ -1766,6 +1774,11 @@ class _UnfitError(Exception): "long": {"format": "parquet", "bundle": False}, "frame": {"format": "parquet", "bundle": False, "layout": "frame"}, } +# The rendering member a fetch posts as true unless the caller keeps party +# totals, which leaves out the group totals of the identity's open party roles. +WITHOUT_PARTY_TOTALS = "without_party_totals" +# The column a client presents last. +STAT_VAR = "stat_var" # The snapshot refusal after which a stored version's lookup builds it again. # The version exists, but its file has expired. Any other refusal ends it. FILE_EXPIRED = "artifact_expired" @@ -1781,10 +1794,87 @@ class _UnfitError(Exception): def rendering_for(layout: str | None) -> dict[str, Any]: - """The build request's `options` for a fetch's `layout`, long by default.""" + """The build request's `options` for a mint's or an operation's + `layout`, long by default.""" return dict(LAYOUT_RENDERINGS[layout or "long"]) +def fetch_rendering( + layout: str | None, *, party_totals: bool = False +) -> dict[str, Any]: + """The build request's `options` for a fetch of an answer or a spec: + the layout's rendering, with `without_party_totals` unless the caller + keeps party totals.""" + rendering = rendering_for(layout) + if not party_totals: + rendering[WITHOUT_PARTY_TOTALS] = True + return rendering + + +def column_order(columns: Sequence[str], reading: Sequence[Sequence[str]]) -> list[str]: + """`columns` in the order a client presents them: each reading slot's + first name the columns hold, in slot order, then the other columns in + their own order, with `stat_var` last.""" + first = [ + name + for names in reading + if (name := next((n for n in names if n in columns), None)) is not None + ] + rest = [c for c in columns if c not in first and c != STAT_VAR] + return first + rest + [STAT_VAR] * (STAT_VAR in columns) + + +def presented_columns( + members: Sequence[Sequence[str]], reading: Sequence[Sequence[str]] +) -> list[str]: + """The columns a client presents for a dataset whose members hold + `members`: the members' columns gathered in member order, each once, + in the order `column_order` gives, after `part` when there are several.""" + gathered = list(dict.fromkeys(c for columns in members for c in columns)) + part = ["part"] if len(members) > 1 else [] + return [*part, *column_order(gathered, reading)] + + +def load_reading_columns(package_dir: Path) -> list[list[str]] | None: + """The reading slots `rules/column-order.json` lists, or None when the + file does not hold them, which the rules check reports.""" + try: + reading = _load(package_dir / "rules" / "column-order.json")["reading_columns"] + except (OSError, ValueError, KeyError, TypeError): + return None + if isinstance(reading, list) and all( + isinstance(names, list) and all(isinstance(n, str) for n in names) + for names in reading + ): + return reading + return None + + +def served_columns(data: bytes) -> list[str]: + """A downloaded file's columns, as `parquet_columns` reads them. + + Raises: + _UnfitError: The file is not a Parquet file. + """ + try: + return parquet_columns(data) + except ValueError as exc: + raise _UnfitError(f"a downloaded file is unreadable: {exc}") from exc + + +def parquet_columns(data: bytes) -> list[str]: + """The top-level column names of a Parquet file, in the order its writer + wrote them, read from its footer's schema. + + Raises: + ValueError: `data` is not a Parquet file. + """ + try: + return list(pq.read_schema(pa.BufferReader(data)).names) + except (pa.ArrowException, OSError) as exc: + raise ValueError(f"not a Parquet file: {exc}") from exc + + def posted_scope(step: Mapping[str, Any]) -> dict[str, Any] | None: """The `input.scope` a fetch of a spec posts for the step's narrowing, or None when it narrows nothing. The server's @@ -2231,6 +2321,7 @@ class _Replay: actions: Mapping[str, Mapping[str, Any]] client_codes: Mapping[str, Mapping[str, Any]] body_dir: Path + reading: Sequence[Sequence[str]] | None cursor: int = 0 answer: Answer | None = None minted: _Minted | None = None @@ -2351,8 +2442,8 @@ def body(self, response: dict[str, Any]) -> bytes: return json.dumps(response["json"]).encode() return b"" - def download(self, target: str, digest: str, *, origin: bool) -> None: - """A file through its files route, named by an `origin_path`, as + def download(self, target: str, digest: str, *, origin: bool) -> bytes: + """The bytes of a file through its files route, named by an `origin_path`, as `artifact_route` places an artifact's `url`, when `origin`, else by a path under the base URL. A 302 names the signed URL in its `location`, which the client fetches once where `download_target` @@ -2388,8 +2479,9 @@ def download(self, target: str, digest: str, *, origin: bool) -> None: continue else: raise ClientError("unexpected_response") - if digest_of(self.body(file)) == digest: - return + data = self.body(file) + if digest_of(data) == digest: + return data failure = ClientError("digest_mismatch") raise failure @@ -2500,12 +2592,13 @@ def member( sentence = None if spec is None else spec.get("sentence") if spec is None or built != spec["spec_id"] or sentence is None: sentence = self.sentence(parts, manifest["definition"], spec) - self.download(route, artifact["artifact_digest"], origin=True) + data = self.download(route, artifact["artifact_digest"], origin=True) return { "parts": parts, "spec_id": built, "content_version": manifest["content_version"], "sentence": sentence, + "served_columns": served_columns(data), } def sentence( @@ -2540,8 +2633,10 @@ def stored_version(self, member: dict[str, Any]) -> dict[str, Any]: def stored_file( manifest: dict[str, Any], ) -> tuple[dict[str, Any] | None, ClientError | None]: - served, refusal = self.stored_file(member, manifest) - return (stored if served else None), refusal + data, refusal = self.stored_file(member, manifest) + if data is None: + return None, refusal + return {**stored, "served_columns": served_columns(data)}, None def rebuilt(manifest: dict[str, Any]) -> dict[str, Any]: held = {**spec, "sentence": member["sentence"]} @@ -2561,9 +2656,9 @@ def rebuilt(manifest: dict[str, Any]) -> dict[str, Any]: def stored_file( self, member: dict[str, Any], manifest: dict[str, Any] - ) -> tuple[bool, ClientError | None]: - """Whether the files route at the stored digest, or else the file - selector, served the stored file, and the files route's refusal when + ) -> tuple[bytes | None, ClientError | None]: + """The stored file the files route at the stored digest, or else the + file selector, served, or None, and the files route's refusal when it refused. A selector refusal outside FILE_GONE, and a files route one, raise. A selector file of another digest is not the stored one.""" digest = member["artifact"]["digest"] @@ -2574,27 +2669,24 @@ def stored_file( if artifact is not None: try: route = artifact_route(self.base_url, artifact["url"]) - self.download(route, digest, origin=True) + return self.download(route, digest, origin=True), None except ClientError as error: if error.code not in FILE_GONE: raise refusal = error - else: - return True, None path = selector_path( member["spec"]["spec_id"], member["content_version"], member["artifact"]["rendering"], ) try: - self.download(path, digest, origin=False) + return self.download(path, digest, origin=False), None except ClientError as error: if error.code == "digest_mismatch": - return False, refusal + return None, refusal if error.code in FILE_GONE: - return False, refusal or error + return None, refusal or error raise - return True, None def newest(self, spec_id: str) -> str | None: """The newest stored version, as `newest_plain` reads the versions @@ -2678,7 +2770,9 @@ def _fetch(self, step: dict[str, Any]) -> dict[str, Any]: ClientError(search_warning_code(answer), error="SearchWarning"), answer.trace_id, ) - rendering = rendering_for(step.get("layout")) + rendering = fetch_rendering( + step.get("layout"), party_totals=step.get("party_totals", False) + ) if "layout" in rendering and len(readings) > 1: raise ClientError("invalid_argument") members = [ @@ -2690,18 +2784,20 @@ def _fetch(self, step: dict[str, Any]) -> dict[str, Any]: ) for parts, spec in readings ] - return {"dataset": dataset_summary(members, gaps, search_warning=warns)} + return self.dataset(members, gaps, search_warning=warns) def _fetch_spec(self, step: dict[str, Any]) -> dict[str, Any]: - rendering = rendering_for(step.get("layout")) + rendering = fetch_rendering( + step.get("layout"), party_totals=step.get("party_totals", False) + ) manifest = self.build(step["spec"], rendering, posted_scope(step)) strict = step.get("strict", False) member = self.member([], step["spec"], manifest, rendering, strict) - return {"dataset": dataset_summary([member], [])} + return self.dataset([member], []) def _fetch_ref(self, step: dict[str, Any]) -> dict[str, Any]: members = [self.stored_version(member) for member in step["ref"]["members"]] - return {"dataset": dataset_summary(members, [])} + return self.dataset(members, []) def _mint(self, step: dict[str, Any]) -> dict[str, Any]: rendering = rendering_for(step.get("layout")) @@ -2736,7 +2832,27 @@ def _result(self, step: dict[str, Any]) -> dict[str, Any]: minted = self.minted manifest = self.long_build(minted.resource, minted.headers, minted.request) member = self.member([], minted.spec, manifest, minted.rendering, False) - return {"dataset": dataset_summary([member], [])} + return self.dataset([member], []) + + def dataset( + self, + members: Sequence[Mapping[str, Any]], + gaps: Sequence[Mapping[str, Any]], + *, + search_warning: bool | None = None, + ) -> dict[str, Any]: + """A dataset outcome as `dataset_summary` gives it, with the columns a + client presents: the members' served columns, gathered in member + order with each once and ordered by the column-order rule, after + `part` when there are several members. Without the rule's reading + slots, which the rules check reports, the outcome gives no columns.""" + summary = dataset_summary(members, gaps, search_warning=search_warning) + if self.reading is None: + return {"dataset": summary} + columns = presented_columns( + [m["served_columns"] for m in members], self.reading + ) + return {"dataset": {"columns": columns, **summary}} def _operation_outcome(resource: dict[str, Any]) -> dict[str, Any]: @@ -2773,13 +2889,14 @@ def expected_outcomes( actions: Mapping[str, Mapping[str, Any]], client_codes: Mapping[str, Mapping[str, Any]], body_dir: Path, + reading: Sequence[Sequence[str]] | None, ) -> list[dict[str, Any]]: """The outcome each of `record`'s steps reaches over its exchanges, its binary bodies read from `body_dir`, over `actions` for refusals' error classes and gap kinds, and over `client_codes` for the class of each error the client raises itself. A - dataset outcome holds what `dataset_summary` gives, without rows and - columns. + dataset outcome holds what `dataset_summary` gives and the columns the + `reading` slots order from the downloaded files, without rows. Raises: ValueError: The exchanges do not fit the steps, or deriving an @@ -2794,6 +2911,7 @@ def expected_outcomes( actions, client_codes, body_dir, + reading, ) try: outcomes = [replay.step(step) for step in record["call"]] @@ -2963,9 +3081,10 @@ def _check_expect( derived: list[dict[str, Any]], ) -> list[str]: """Each outcome in `expect` against the one its exchanges give. A dataset - outcome's rows, columns and per-part row counts are the Parquet bodies' - and are not derived, except that several members put the `part` column - first and list each member's `part` value, rows summing to the dataset's.""" + outcome's columns are derived from the downloaded files, and its rows + and per-part row counts are not, except that several members put the + `part` column first and list each member's `part` value, rows summing + to the dataset's.""" problems = [] for index, (stated, wanted) in enumerate( zip(record["expect"], derived, strict=False) @@ -2980,10 +3099,22 @@ def _check_expect( if k not in {"rows", "columns", "part_rows"} } } + wanted = { + "dataset": { + k: v for k, v in wanted["dataset"].items() if k != "columns" + } + } problems.extend( f"scenarios/{file_name}: step {index}: {problem}" for problem in _part_problems(dataset, wanted["dataset"]["members"]) ) + columns = derived[index]["dataset"].get("columns") + if columns is not None and dataset["columns"] != columns: + problems.append( + f"scenarios/{file_name}: step {index}: columns " + f"{json.dumps(dataset['columns'])[:300]} are not the column-order " + f"rule's order of the served columns, {json.dumps(columns)[:300]}" + ) if compared != wanted: problems.append( f"scenarios/{file_name}: step {index} expects " @@ -3035,6 +3166,7 @@ def _check_scenarios( client_codes: Mapping[str, Mapping[str, Any]], proxy_codes: Mapping[str, Mapping[str, Any]], served_commit: str | None, + reading: Sequence[Sequence[str]] | None, ) -> list[str]: directory = PACKAGE_DIR / "scenarios" paths = sorted(directory.glob("*.json")) @@ -3131,6 +3263,7 @@ def _check_scenarios( actions=actions, client_codes=client_codes, body_dir=directory, + reading=reading, ) try: derived = replay(record, base_url=base_url) @@ -3263,7 +3396,7 @@ def _ref_rule(ref: dict[str, Any]) -> str | None: def _served_by(label: str, record: dict[str, Any]) -> list[str]: """Where a ref example's members differ from the members its `scenario` - serves: a `spec_id` no dataset member of it has, another + serves: a `spec_id` no dataset member of it has, other `parts`, another `content_version` or `sentence`, or an artifact digest that is not the digest of a file the scenario downloads. A ref with no members names no scenario.""" @@ -3300,7 +3433,7 @@ def _served_by(label: str, record: dict[str, Any]) -> list[str]: continue problems.extend( f"{label}: member {index} {key} is not {name}'s {found.get(key)!r}" - for key in ("content_version", "sentence") + for key in ("parts", "content_version", "sentence") if member.get(key) != found.get(key) ) artifact = member.get("artifact") @@ -3312,6 +3445,59 @@ def _served_by(label: str, record: dict[str, Any]) -> list[str]: return problems +def posted_renderings(scenario: Mapping[str, Any]) -> dict[str, Any]: + """The rendering each build in `scenario` posted as its `options`, by + the spec_id the build answered: a manifest's own, or for a 202 the + manifest the poll of its operation answered done.""" + renderings: dict[str, Any] = {} + by_operation: dict[str, Any] = {} + for exchange in read_objects(scenario, "exchanges"): + request = read_object(exchange, "request") or {} + body = read_object(read_object(exchange, "response"), "json") or {} + manifest = read_object(body, "manifest") if "manifest" in body else body + operation_id = read_string(read_object(body, "operation"), "operation_id") + if (request.get("method"), request.get("path")) == _BUILD: + options = (read_object(request, "json") or {}).get("options") + if operation_id is not None: + by_operation[operation_id] = options + spec_id = read_string(read_object(manifest, "definition"), "spec_id") + if spec_id is not None: + renderings[spec_id] = options + elif operation_id in by_operation and "manifest" in body: + spec_id = read_string(read_object(manifest, "definition"), "spec_id") + if spec_id is not None: + renderings[spec_id] = by_operation[operation_id] + return renderings + + +def _posted_by(label: str, record: dict[str, Any]) -> list[str]: + """Where a ref example's member records a rendering other than the one + the build of its spec in its `scenario` posted, since a ref records the + rendering its fetch posted.""" + ref = record.get("ref") + members = ref.get("members") if isinstance(ref, dict) else None + name = record.get("scenario") + path = PACKAGE_DIR / "scenarios" / f"{name}.json" + if not isinstance(members, list) or not isinstance(name, str) or not path.is_file(): + return [] # `_served_by` reports a ref that names no scenario + posted = posted_renderings(_load(path)) + problems = [] + for index, member in enumerate(members): + spec = read_object(member, "spec") + spec_id = read_string(spec, "spec_id") + rendering = read_object(read_object(member, "artifact"), "rendering") + if spec_id not in posted: + problems.append( + f"{label}: member {index}'s spec is built by no {name} build" + ) + elif rendering != posted[spec_id]: + problems.append( + f"{label}: member {index} records rendering {json.dumps(rendering)}, " + f"but {name} posted {json.dumps(posted[spec_id])}" + ) + return problems + + def _check_refs(validator: jsonschema.Draft202012Validator) -> list[str]: paths = sorted((PACKAGE_DIR / "refs").glob("*.json")) problems = [] if paths else ["refs: no ref examples found"] @@ -3334,6 +3520,7 @@ def _check_refs(validator: jsonschema.Draft202012Validator) -> list[str]: if valid: problems.append(f"{label}: the schema accepts a ref it should reject") continue + problems.extend(_posted_by(label, record)) if not valid: first = next(validator.iter_errors(record.get("ref"))) problems.append(f"{label}: ref fails the schema at {_where(first)}") @@ -3374,6 +3561,17 @@ def _check_rules(validator: jsonschema.Draft202012Validator) -> list[str]: f"{label}: vector {name!r} repeats" for name in sorted({n for n in names if names.count(n) > 1}) ) + if document["rule"] == "column-order": + problems.extend( + f"{label}: vector {vector['name']!r} orders its columns " + f"otherwise than presented_columns" + for vector in document["vectors"] + if presented_columns( + vector.get("members", [vector.get("columns")]), + document["reading_columns"], + ) + != vector["ordered"] + ) return problems @@ -3452,6 +3650,13 @@ def validate() -> list[str]: ) ) + reading = load_reading_columns(PACKAGE_DIR) + if reading is None: + problems.append( + "rules/column-order.json: missing or unreadable, or holds no " + "reading_columns list of column-name lists, so no dataset's columns " + "are checked" + ) problems.extend( _check_scenarios( validators["scenario.schema.json"], @@ -3462,6 +3667,7 @@ def validate() -> list[str]: client_codes={row["code"]: row for row in client_rows}, proxy_codes={row["code"]: row for row in proxy_rows}, served_commit=source.get("commit") if isinstance(source, dict) else None, + reading=reading, ) ) size = scenarios_size(PACKAGE_DIR / "scenarios")