From 98e53ee2fb400694ebf9e48ecf8f9af25ca2e684 Mon Sep 17 00:00:00 2001 From: Jorge Rivera Date: Sun, 25 Oct 2026 18:51:07 +0100 Subject: [PATCH 01/12] feat(client-contract): add entity_choice and per-row entity_refs, re-record at apis 99e62038c (#26) served/openapi.json and SOURCE.json come from dfo-apis 99e62038c. NoDataOption and SentenceToken carry entity_choice, the index into no_data.ambiguous_entities of the group an option settles or a slot asks, ParsedEntity carries an optional name, and Part.entity_refs has one entry per restatement row. The 32 recorded scenarios are recorded at that commit, including search-place-ambiguous-twice, two entity_ambiguous groups of one text. The long-build questions move to 1964 and 1965, which dev had not built, and the poll-pacing derivation cycles its waits over any recorded build of three or more running polls. Co-authored-by: Claude --- python/client-contract/CHANGELOG.md | 4 +- python/client-contract/README.md | 2 +- .../answer-candidate-specs-not-a-list.json | 50 +- .../answer-candidates-choose-fetch.json | 86 +-- .../scenarios/answer-catalogue.json | 16 +- .../scenarios/answer-declined.json | 20 +- .../scenarios/answer-definite-fetch.json | 71 +- .../answer-definition-spec-id-mismatch.json | 59 +- .../scenarios/answer-empty-parts.json | 13 +- .../answer-folded-parts-unnamed.json | 157 +++-- .../scenarios/answer-mixed-fetch-partial.json | 60 +- .../scenarios/answer-mixed-fetch-raises.json | 72 +- .../answer-nested-specs-unchecked.json | 56 +- .../answer-operations-not-a-list.json | 67 +- .../answer-part-status-not-a-string.json | 68 +- .../answer-several-readings-folded.json | 161 +++-- .../answer-spec-without-identity.json | 59 +- .../answer-spec-without-resolved.json | 55 +- .../scenarios/answer-timed-out.json | 64 +- .../scenarios/answer-unknown-enum-value.json | 22 +- .../scenarios/answer-unknown-kind.json | 24 +- .../scenarios/answer-unknown-part-status.json | 68 +- .../scenarios/answer-unsupported-part.json | 68 +- .../choose-candidate-assumed-reading.json | 72 +- .../scenarios/choose-candidate-by-label.json | 72 +- .../choose-candidate-echoes-assumptions.json | 126 ++-- .../scenarios/choose-candidate-two-parts.json | 156 ++--- .../choose-echo-drops-malformed-items.json | 122 ++-- ...choose-echoes-separate-and-operations.json | 134 ++-- .../choose-option-beside-definite.json | 138 ++-- .../choose-option-two-part-query.json | 20 +- .../choose-option-without-data-query.json | 20 +- .../scenarios/choose-part-by-mention.json | 60 +- .../scenarios/choose-place-one-part.json | 60 +- .../scenarios/choose-place-two-parts.json | 81 ++- .../choose-posts-unsupported-placeholder.json | 128 ++-- .../choose-refused-answered-part.json | 66 +- ...hoose-refused-mention-names-two-parts.json | 29 +- .../scenarios/choose-refused-no-choice.json | 57 +- .../scenarios/choose-refused-no-options.json | 16 +- .../choose-refused-option-out-of-range.json | 48 +- ...se-refused-part-without-variable-text.json | 72 +- ...choose-refused-shared-candidate-label.json | 48 +- .../choose-refused-shared-label.json | 16 +- .../scenarios/choose-refused-two-choices.json | 29 +- ...hoose-refused-unknown-candidate-label.json | 48 +- .../choose-refused-unknown-label.json | 22 +- .../choose-refused-unknown-part.json | 66 +- .../choose-refused-unknown-status.json | 72 +- .../fetch-frame-several-readings.json | 137 ++-- .../scenarios/fetch-null-member.json | 67 +- .../fetch-partial-nothing-answered.json | 24 +- .../fetch-ref-artifact-unlisted.json | 20 +- .../fetch-ref-expired-file-selector.json | 35 +- .../fetch-ref-expired-newer-version.json | 8 +- .../fetch-ref-expired-not-reproducible.json | 2 +- .../fetch-ref-expired-rebuild-other-spec.json | 10 +- ...etch-ref-expired-rebuild-same-version.json | 10 +- .../scenarios/fetch-ref-newest-version.json | 6 +- .../fetch-ref-signed-url-refused-twice.json | 37 +- .../fetch-ref-signed-url-refused.json | 37 +- .../scenarios/fetch-ref-unknown-version.json | 12 +- .../scenarios/fetch-ref.json | 39 +- .../scenarios/fetch-renamed-strict-field.json | 67 +- .../scenarios/fetch-retry-after-504.json | 67 +- .../scenarios/fetch-spec-503-then-504.json | 10 +- .../scenarios/fetch-spec-504-retry-after.json | 10 +- .../fetch-spec-accepted-running.json | 223 ++++-- .../scenarios/fetch-spec-async-build.json | 223 ++++-- .../scenarios/fetch-spec-digest-mismatch.json | 12 +- .../scenarios/fetch-spec-empty-narrowing.json | 10 +- .../scenarios/fetch-spec-entity-dropped.json | 147 +--- .../scenarios/fetch-spec-entity-rebound.json | 174 +---- .../fetch-spec-files-route-no-content.json | 12 +- .../fetch-spec-files-route-serves-file.json | 10 +- ...h-spec-files-route-temporary-redirect.json | 12 +- .../fetch-spec-foreign-artifact-url.json | 10 +- .../scenarios/fetch-spec-frame-layout.json | 14 +- .../scenarios/fetch-spec-group-narrowed.json | 40 +- .../fetch-spec-group-origin-rebound.json | 40 +- .../scenarios/fetch-spec-known-sentence.json | 14 +- .../fetch-spec-manifest-without-identity.json | 10 +- ...-spec-manifest-without-schema-version.json | 10 +- .../scenarios/fetch-spec-narrowed.json | 183 +---- ...tch-spec-operation-failed-resubmitted.json | 245 ++++--- .../scenarios/fetch-spec-poll-not-found.json | 26 +- .../fetch-spec-poll-pacing-changes.json | 221 ++++-- ...-spec-poll-rate-limited-not-retryable.json | 26 +- .../fetch-spec-poll-rate-limited.json | 225 +++++-- .../fetch-spec-poll-refused-backoff.json | 217 ++++-- .../fetch-spec-poll-refused-retry-after.json | 225 +++++-- .../scenarios/fetch-spec-poll-refused.json | 229 +++++-- .../fetch-spec-relative-location.json | 10 +- .../scenarios/fetch-spec-request-invalid.json | 12 +- .../fetch-spec-resubmit-other-spec.json | 179 +---- .../fetch-spec-same-origin-artifact-url.json | 10 +- .../fetch-spec-signed-fetch-partial.json | 12 +- .../fetch-spec-storage-artifact-url.json | 10 +- .../scenarios/fetch-spec-strict-warning.json | 6 +- .../scenarios/fetch-strict-info-notice.json | 67 +- .../scenarios/mint-async-build.json | 229 +++++-- .../scenarios/mint-async-build.parquet | Bin 473679 -> 472796 bytes .../newest-version-unreadable-page.json | 4 +- .../operation-failed-without-error.json | 26 +- .../scenarios/operation-resume.json | 632 +++++++++++------- .../scenarios/operation-resume.parquet | Bin 489647 -> 490836 bytes .../resubmit-candidates-sibling.json | 356 +++------- ...ubmit-placeholder-without-restatement.json | 84 +-- .../scenarios/search-body-not-an-object.json | 24 +- .../search-place-ambiguous-twice.json | 384 +++++++++++ .../scenarios/search-place-ambiguous.json | 26 +- .../scenarios/search-proxy-rate-limited.json | 22 +- .../scenarios/search-retry-after-503.json | 22 +- .../scenarios/search-server-warning.json | 66 +- .../scenarios/search-sunset-warning.json | 44 +- .../search-two-parts-place-ambiguous.json | 33 +- .../scenarios/search-warning-top5.json | 73 +- .../dfo_client_contract/served/SOURCE.json | 2 +- .../dfo_client_contract/served/openapi.json | 216 +++++- tools/capture_client_contract.py | 64 +- 120 files changed, 4961 insertions(+), 3908 deletions(-) create mode 100644 python/client-contract/src/dfo_client_contract/scenarios/search-place-ambiguous-twice.json diff --git a/python/client-contract/CHANGELOG.md b/python/client-contract/CHANGELOG.md index ce4270a..16dc069 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 `0ba344270784ae9929a369da8acd00b399dfced8`. The document admits `timed_out` as a no_data reason and the optional `entity_refs` on each answer part, a list of `EntityRefs`, the graph nodes each restatement entity text binds. +- `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. - `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 120 scenarios: 31 recorded against the deployed dfo-apis dev app at `0ba344270`, and 89 synthetic, each derived from a recorded one by a one-line edit, with 19 binary bodies totalling 1,124,502 bytes and records and bodies together 13,161,129 bytes. 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 121 scenarios: 32 recorded against the deployed dfo-apis dev app at `99e62038c`, and 89 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,186,279 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. diff --git a/python/client-contract/README.md b/python/client-contract/README.md index b0e93d9..6b00aa1 100644 --- a/python/client-contract/README.md +++ b/python/client-contract/README.md @@ -207,7 +207,7 @@ 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 1963 to 2024 for the mint, and from the 38 OECD countries to the G77 countries from 1966 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 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. ## DatasetRef 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 20a8675..189ef3f 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": "21bb19c92c824a70b2eb378e85a9cfd0" + "x-dfo-trace-id": "962188ce8826466e8510fb819d5dc26d" }, "json": { "schema_version": 1, @@ -41,21 +41,21 @@ "extract_skipped": false }, "diagnostics": { - "engine_build": "0ba344270784ae9929a369da8acd00b399dfced8", - "trace_id": "21bb19c92c824a70b2eb378e85a9cfd0", + "engine_build": "99e62038ceb4b459c2ac699549076ff123c166aa", + "trace_id": "962188ce8826466e8510fb819d5dc26d", "warnings": [], "timing_ms": { - "total": 8287, + "total": 1710, "by_step": { "coverage": 0, - "extract": 1330, - "cache_lookup": 2 + "extract": 0, + "cache_lookup": 0 } }, "llm_usage": { - "input_tokens": 2237, - "output_tokens": 143, - "cached_tokens": 842, + "input_tokens": 0, + "output_tokens": 0, + "cached_tokens": 0, "jev_input_tokens": 13358, "jev_output_tokens": 2855 }, @@ -67,28 +67,28 @@ "variable_text": "mortality", "warnings": [], "timing_ms": { - "total": 6951, + "total": 1705, "by_step": { - "recall": 261, + "recall": 1, "phase_resolve_places": 0, "phase_check_entities": 0, - "shape_arcs": 7, - "shape_probe": 122, + "shape_arcs": 4, + "shape_probe": 2, "shape_groups": 6, "shape_labels": 1, "shape_admission": 1, "phase_derive_shapes": 0, - "shape": 241, + "shape": 119, "phase_prune_and_rank": 0, - "bind": 142, - "phase_bind": 17, - "phase_settle": 6, - "phase_place_bindings": 490, + "bind": 146, + "phase_bind": 19, + "phase_settle": 2, + "phase_place_bindings": 30, "phase_facet_requests": 0, - "materialise": 115, - "phase_materialise": 1, - "answer": 243, - "phase_outcome": 5435 + "materialise": 21, + "phase_materialise": 25, + "answer": 30, + "phase_outcome": 1312 } }, "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_9deef72763b45f40", + "capability_version": "cap_88defe77cc79e0c0", "default_reading": { "applied": true, "removed_stat_vars": [] @@ -2344,7 +2344,7 @@ "start_year": 2013, "end_year": 2022 }, - "capability_version": "cap_9deef72763b45f40", + "capability_version": "cap_88defe77cc79e0c0", "default_reading": { "applied": true, "removed_stat_vars": [] @@ -2579,7 +2579,7 @@ "error": { "class": "ContractError", "code": "contract_violation", - "trace_id": "21bb19c92c824a70b2eb378e85a9cfd0" + "trace_id": "962188ce8826466e8510fb819d5dc26d" } } ] 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 524967e..fe09ef6 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": "0ba344270784ae9929a369da8acd00b399dfced8", - "recorded_at": "2026-10-24T16:30:07Z" + "dfo_commit": "99e62038ceb4b459c2ac699549076ff123c166aa", + "recorded_at": "2026-10-25T17:34:55Z" }, "call": [ { @@ -38,7 +38,7 @@ "status": 200, "headers": { "content-type": "application/json", - "x-dfo-trace-id": "21bb19c92c824a70b2eb378e85a9cfd0" + "x-dfo-trace-id": "962188ce8826466e8510fb819d5dc26d" }, "json": { "schema_version": 1, @@ -49,21 +49,21 @@ "extract_skipped": false }, "diagnostics": { - "engine_build": "0ba344270784ae9929a369da8acd00b399dfced8", - "trace_id": "21bb19c92c824a70b2eb378e85a9cfd0", + "engine_build": "99e62038ceb4b459c2ac699549076ff123c166aa", + "trace_id": "962188ce8826466e8510fb819d5dc26d", "warnings": [], "timing_ms": { - "total": 8287, + "total": 1710, "by_step": { "coverage": 0, - "extract": 1330, - "cache_lookup": 2 + "extract": 0, + "cache_lookup": 0 } }, "llm_usage": { - "input_tokens": 2237, - "output_tokens": 143, - "cached_tokens": 842, + "input_tokens": 0, + "output_tokens": 0, + "cached_tokens": 0, "jev_input_tokens": 13358, "jev_output_tokens": 2855 }, @@ -75,28 +75,28 @@ "variable_text": "mortality", "warnings": [], "timing_ms": { - "total": 6951, + "total": 1705, "by_step": { - "recall": 261, + "recall": 1, "phase_resolve_places": 0, "phase_check_entities": 0, - "shape_arcs": 7, - "shape_probe": 122, + "shape_arcs": 4, + "shape_probe": 2, "shape_groups": 6, "shape_labels": 1, "shape_admission": 1, "phase_derive_shapes": 0, - "shape": 241, + "shape": 119, "phase_prune_and_rank": 0, - "bind": 142, - "phase_bind": 17, - "phase_settle": 6, - "phase_place_bindings": 490, + "bind": 146, + "phase_bind": 19, + "phase_settle": 2, + "phase_place_bindings": 30, "phase_facet_requests": 0, - "materialise": 115, - "phase_materialise": 1, - "answer": 243, - "phase_outcome": 5435 + "materialise": 21, + "phase_materialise": 25, + "answer": 30, + "phase_outcome": 1312 } }, "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_9deef72763b45f40", + "capability_version": "cap_88defe77cc79e0c0", "default_reading": { "applied": true, "removed_stat_vars": [] @@ -2352,7 +2352,7 @@ "start_year": 2013, "end_year": 2022 }, - "capability_version": "cap_9deef72763b45f40", + "capability_version": "cap_88defe77cc79e0c0", "default_reading": { "applied": true, "removed_stat_vars": [] @@ -2633,7 +2633,7 @@ "status": 200, "headers": { "content-type": "application/json", - "x-dfo-trace-id": "bb50ec0b45244567bf259cee9e6de857" + "x-dfo-trace-id": "3e98392a1d6a49edbf871ef6d6a14e8d" }, "json": { "schema_version": 1, @@ -2642,11 +2642,11 @@ "extract_skipped": true }, "diagnostics": { - "engine_build": "0ba344270784ae9929a369da8acd00b399dfced8", - "trace_id": "bb50ec0b45244567bf259cee9e6de857", + "engine_build": "99e62038ceb4b459c2ac699549076ff123c166aa", + "trace_id": "3e98392a1d6a49edbf871ef6d6a14e8d", "warnings": [], "timing_ms": { - "total": 486, + "total": 332, "by_step": { "coverage": 0 } @@ -2659,18 +2659,18 @@ "variable_text": "mortality", "warnings": [], "timing_ms": { - "total": 436, + "total": 265, "by_step": { - "validate": 1, - "walk": 182, + "validate": 0, + "walk": 0, "reread_arcs": 0, "detect_edits": 0, "resolve_survivors": 0, - "shape": 158, - "bind": 1, + "shape": 164, + "bind": 0, "where_places": 0, - "materialise": 93, - "answer": 1, + "materialise": 99, + "answer": 2, "options": 0 } }, @@ -3190,7 +3190,7 @@ "start_year": 2013, "end_year": 2022 }, - "capability_version": "cap_9deef72763b45f40" + "capability_version": "cap_88defe77cc79e0c0" }, "confidence": "high", "available_at_place": true, @@ -3411,7 +3411,7 @@ "status": 200, "headers": { "content-type": "application/json", - "x-dfo-trace-id": "cbcf0bde995644728537c2ed3abc531e" + "x-dfo-trace-id": "fbdb664928db4e2abb9e8d67358cd3d3" }, "json": { "schema_version": 1, @@ -3619,7 +3619,7 @@ "frame_grammar_version": "1.1.0", "origin_catalogue_build_id": "20261023T061534Z-06fa7b89", "served_from": "head", - "confirmed_at": "2026-10-24T16:30:17.280841+00:00" + "confirmed_at": "2026-10-25T17:32:46.054393+00:00" }, "warnings": [], "diagnostics": [ @@ -3657,7 +3657,7 @@ ], "series_count": 1, "output_options": { - "capability_version": "dset_cc753cefa9199881", + "capability_version": "dset_76f5fa7244511c58", "columns": [ { "name": "stat_var", @@ -3796,7 +3796,7 @@ ] } }, - "series_coverage_stamp": "45bdd65f2fd33ac77a897180047080d33ed9db812afe0cbb887bf22e2ac52690", + "series_coverage_stamp": "e6e717ab8c77e84d010915893ede5809e9ecec67929a07cfafbcc2210edfa1eb", "retention": { "pinned": false, "held_until": "2026-11-22T17:34:00.253769Z" @@ -3814,7 +3814,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": "86f0988c26f742f59efa2fba3ebcf738" + "x-dfo-trace-id": "4a404bdffcc04f2cad2ebac790436ba6" } } }, 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 a15c230..5101202 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": "0ba344270784ae9929a369da8acd00b399dfced8", - "recorded_at": "2026-10-24T16:31:26Z" + "dfo_commit": "99e62038ceb4b459c2ac699549076ff123c166aa", + "recorded_at": "2026-10-25T17:36:45Z" }, "call": [ { @@ -34,7 +34,7 @@ "status": 200, "headers": { "content-type": "application/json", - "x-dfo-trace-id": "a1f54c790c9c4278af93e96086733481" + "x-dfo-trace-id": "2b68cf1261cf4d72ad5093c3774e4221" }, "json": { "schema_version": 1, @@ -45,14 +45,14 @@ "extract_skipped": false }, "diagnostics": { - "engine_build": "0ba344270784ae9929a369da8acd00b399dfced8", - "trace_id": "a1f54c790c9c4278af93e96086733481", + "engine_build": "99e62038ceb4b459c2ac699549076ff123c166aa", + "trace_id": "2b68cf1261cf4d72ad5093c3774e4221", "warnings": [], "timing_ms": { - "total": 1079, + "total": 859, "by_step": { "coverage": 0, - "extract": 1079, + "extract": 857, "entity_check": 0, "cache_lookup": 0 } @@ -84,7 +84,7 @@ "error": { "class": "DeclinedError", "code": "answer_declined", - "trace_id": "a1f54c790c9c4278af93e96086733481" + "trace_id": "2b68cf1261cf4d72ad5093c3774e4221" } } ] 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 dfd7f8d..a107d3a 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": "0ba344270784ae9929a369da8acd00b399dfced8", - "recorded_at": "2026-10-24T16:31:24Z" + "dfo_commit": "99e62038ceb4b459c2ac699549076ff123c166aa", + "recorded_at": "2026-10-25T17:36:44Z" }, "call": [ { @@ -34,7 +34,7 @@ "status": 200, "headers": { "content-type": "application/json", - "x-dfo-trace-id": "5b2bc45dc7f7419cb3dfb98ed9bf68a3" + "x-dfo-trace-id": "ba24916847894383bc4c13b436724cbe" }, "json": { "schema_version": 1, @@ -45,14 +45,14 @@ "extract_skipped": false }, "diagnostics": { - "engine_build": "0ba344270784ae9929a369da8acd00b399dfced8", - "trace_id": "5b2bc45dc7f7419cb3dfb98ed9bf68a3", + "engine_build": "99e62038ceb4b459c2ac699549076ff123c166aa", + "trace_id": "ba24916847894383bc4c13b436724cbe", "warnings": [], "timing_ms": { - "total": 1050, + "total": 901, "by_step": { - "coverage": 1, - "extract": 1049, + "coverage": 0, + "extract": 899, "entity_check": 0, "cache_lookup": 0 } @@ -60,7 +60,7 @@ "llm_usage": { "input_tokens": 2229, "output_tokens": 64, - "cached_tokens": 840 + "cached_tokens": 0 }, "timed_out": false }, @@ -90,7 +90,7 @@ "error": { "class": "DeclinedError", "code": "answer_declined", - "trace_id": "5b2bc45dc7f7419cb3dfb98ed9bf68a3" + "trace_id": "ba24916847894383bc4c13b436724cbe" } } ] 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 4275254..578c3ad 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": "0ba344270784ae9929a369da8acd00b399dfced8", - "recorded_at": "2026-10-24T16:30:01Z" + "dfo_commit": "99e62038ceb4b459c2ac699549076ff123c166aa", + "recorded_at": "2026-10-25T17:34:54Z" }, "call": [ { @@ -34,7 +34,7 @@ "status": 200, "headers": { "content-type": "application/json", - "x-dfo-trace-id": "bf6613bf82be4bddb4d60879aaf907d9" + "x-dfo-trace-id": "7abc6f06215b4187a4280d87d6f8a51a" }, "json": { "schema_version": 1, @@ -42,26 +42,23 @@ "entry_path": "raw_text", "raw_query": "ODA disbursements from Germany to Nigeria for basic health care", "normalized_query": "ODA disbursements from Germany to Nigeria for basic health care", - "extract_skipped": false + "extract_skipped": true }, "diagnostics": { - "engine_build": "0ba344270784ae9929a369da8acd00b399dfced8", - "trace_id": "bf6613bf82be4bddb4d60879aaf907d9", + "engine_build": "99e62038ceb4b459c2ac699549076ff123c166aa", + "trace_id": "7abc6f06215b4187a4280d87d6f8a51a", "warnings": [], "timing_ms": { - "total": 2620, + "total": 3, "by_step": { "coverage": 0, - "extract": 1068, - "cache_lookup": 0 + "response_cache_layer1": 1 } }, "llm_usage": { - "input_tokens": 2231, - "output_tokens": 102, - "cached_tokens": 841, - "jev_input_tokens": 6586, - "jev_output_tokens": 2060 + "input_tokens": 0, + "output_tokens": 0, + "cached_tokens": 0 }, "timed_out": false }, @@ -71,30 +68,30 @@ "variable_text": "ODA disbursements for basic health care", "warnings": [], "timing_ms": { - "total": 1548, + "total": 1669, "by_step": { - "recall": 437, + "recall": 397, "phase_resolve_places": 0, "phase_check_entities": 0, - "shape_arcs": 2, + "shape_arcs": 1, "shape_probe_coverage": 4, - "shape_probe": 161, - "shape_groups": 45, + "shape_probe": 115, + "shape_groups": 53, "shape_labels": 1, - "shape_admission": 3, + "shape_admission": 1, "phase_derive_shapes": 0, - "shape": 326, + "shape": 276, "phase_prune_and_rank": 0, - "bind": 225, - "phase_bind": 158, - "phase_settle": 56, - "phase_place_bindings": 18, + "bind": 214, + "phase_bind": 203, + "phase_settle": 45, + "phase_place_bindings": 20, "phase_facet_requests": 0, - "materialise": 41, - "phase_materialise": 0, - "answer": 186, - "options": 40, - "phase_outcome": 61 + "materialise": 28, + "phase_materialise": 196, + "answer": 145, + "options": 50, + "phase_outcome": 95 } }, "restatement": { @@ -541,7 +538,7 @@ "label": "OECD Terms and Conditions" } }, - "coverage_stamp": "45bdd65f2fd33ac77a897180047080d33ed9db812afe0cbb887bf22e2ac52690", + "coverage_stamp": "e6e717ab8c77e84d010915893ede5809e9ecec67929a07cfafbcc2210edfa1eb", "facets": { "provenance": { "basis": "fallback", @@ -1194,7 +1191,7 @@ "selected": [] } ], - "capability_version": "cap_9deef72763b45f40", + "capability_version": "cap_88defe77cc79e0c0", "default_reading": { "applied": true, "removed_stat_vars": [] @@ -3792,7 +3789,7 @@ "status": 200, "headers": { "content-type": "application/json", - "x-dfo-trace-id": "42460c90e7274dd19ecba24a6a0377e9" + "x-dfo-trace-id": "70ac3c153571497dab413643b6537466" }, "json": { "schema_version": 1, @@ -4193,7 +4190,7 @@ "frame_grammar_version": "1.1.0", "origin_catalogue_build_id": "20261011T194155Z-80081f08", "served_from": "head", - "confirmed_at": "2026-10-24T16:30:05.017544+00:00" + "confirmed_at": "2026-10-25T17:22:10.027136+00:00" }, "warnings": [ { @@ -4238,7 +4235,7 @@ ], "series_count": 5, "output_options": { - "capability_version": "dset_cc753cefa9199881", + "capability_version": "dset_76f5fa7244511c58", "columns": [ { "name": "stat_var", @@ -4521,7 +4518,7 @@ ] } }, - "series_coverage_stamp": "45bdd65f2fd33ac77a897180047080d33ed9db812afe0cbb887bf22e2ac52690", + "series_coverage_stamp": "e6e717ab8c77e84d010915893ede5809e9ecec67929a07cfafbcc2210edfa1eb", "retention": { "pinned": true } @@ -4538,7 +4535,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": "b9b4b3a90d6546e09cc738a29bbbb1d6" + "x-dfo-trace-id": "d2d4306f79d2411ebcd110cc1e26f49d" } } }, 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 9c3c84d..a6a67b7 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": "bf6613bf82be4bddb4d60879aaf907d9" + "x-dfo-trace-id": "7abc6f06215b4187a4280d87d6f8a51a" }, "json": { "schema_version": 1, @@ -38,26 +38,23 @@ "entry_path": "raw_text", "raw_query": "ODA disbursements from Germany to Nigeria for basic health care", "normalized_query": "ODA disbursements from Germany to Nigeria for basic health care", - "extract_skipped": false + "extract_skipped": true }, "diagnostics": { - "engine_build": "0ba344270784ae9929a369da8acd00b399dfced8", - "trace_id": "bf6613bf82be4bddb4d60879aaf907d9", + "engine_build": "99e62038ceb4b459c2ac699549076ff123c166aa", + "trace_id": "7abc6f06215b4187a4280d87d6f8a51a", "warnings": [], "timing_ms": { - "total": 2620, + "total": 3, "by_step": { "coverage": 0, - "extract": 1068, - "cache_lookup": 0 + "response_cache_layer1": 1 } }, "llm_usage": { - "input_tokens": 2231, - "output_tokens": 102, - "cached_tokens": 841, - "jev_input_tokens": 6586, - "jev_output_tokens": 2060 + "input_tokens": 0, + "output_tokens": 0, + "cached_tokens": 0 }, "timed_out": false }, @@ -67,30 +64,30 @@ "variable_text": "ODA disbursements for basic health care", "warnings": [], "timing_ms": { - "total": 1548, + "total": 1669, "by_step": { - "recall": 437, + "recall": 397, "phase_resolve_places": 0, "phase_check_entities": 0, - "shape_arcs": 2, + "shape_arcs": 1, "shape_probe_coverage": 4, - "shape_probe": 161, - "shape_groups": 45, + "shape_probe": 115, + "shape_groups": 53, "shape_labels": 1, - "shape_admission": 3, + "shape_admission": 1, "phase_derive_shapes": 0, - "shape": 326, + "shape": 276, "phase_prune_and_rank": 0, - "bind": 225, - "phase_bind": 158, - "phase_settle": 56, - "phase_place_bindings": 18, + "bind": 214, + "phase_bind": 203, + "phase_settle": 45, + "phase_place_bindings": 20, "phase_facet_requests": 0, - "materialise": 41, - "phase_materialise": 0, - "answer": 186, - "options": 40, - "phase_outcome": 61 + "materialise": 28, + "phase_materialise": 196, + "answer": 145, + "options": 50, + "phase_outcome": 95 } }, "restatement": { @@ -537,7 +534,7 @@ "label": "OECD Terms and Conditions" } }, - "coverage_stamp": "45bdd65f2fd33ac77a897180047080d33ed9db812afe0cbb887bf22e2ac52690", + "coverage_stamp": "e6e717ab8c77e84d010915893ede5809e9ecec67929a07cfafbcc2210edfa1eb", "facets": { "provenance": { "basis": "fallback", @@ -1190,7 +1187,7 @@ "selected": [] } ], - "capability_version": "cap_9deef72763b45f40", + "capability_version": "cap_88defe77cc79e0c0", "default_reading": { "applied": true, "removed_stat_vars": [] @@ -3707,7 +3704,7 @@ "error": { "class": "ContractError", "code": "contract_violation", - "trace_id": "bf6613bf82be4bddb4d60879aaf907d9" + "trace_id": "7abc6f06215b4187a4280d87d6f8a51a" } } ] 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 35da4e4..697131d 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": "304fe92b998b45849ff11a547aadc3e8" + "x-dfo-trace-id": "7fd4a5b5b50648999f5ead8966bcc02c" }, "json": { "schema_version": 1, @@ -41,14 +41,14 @@ "extract_skipped": false }, "diagnostics": { - "engine_build": "0ba344270784ae9929a369da8acd00b399dfced8", - "trace_id": "304fe92b998b45849ff11a547aadc3e8", + "engine_build": "99e62038ceb4b459c2ac699549076ff123c166aa", + "trace_id": "7fd4a5b5b50648999f5ead8966bcc02c", "warnings": [], "timing_ms": { - "total": 1416, + "total": 1054, "by_step": { "coverage": 0, - "extract": 1297, + "extract": 1050, "cache_lookup": 0 } }, @@ -77,6 +77,7 @@ "axis": "where", "segment": "heading", "role": "destination", + "entity_choice": 0, "entity_refs": [], "states": [], "part_index": 0 @@ -100,7 +101,7 @@ "error": { "class": "ContractError", "code": "contract_violation", - "trace_id": "304fe92b998b45849ff11a547aadc3e8" + "trace_id": "7fd4a5b5b50648999f5ead8966bcc02c" } } ] 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 40f0122..b5a120e 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": "74e9acc99aff40f7a653093976c55e3b" + "x-dfo-trace-id": "7c7e42dd77f94ee08a15cef4438ee7ad" }, "json": { "schema_version": 1, @@ -41,26 +41,23 @@ "entry_path": "raw_text", "raw_query": "ODA disbursements for health and for education from Germany to Kenya, and GDP of Kenya", "normalized_query": "ODA disbursements for health and for education from Germany to Kenya, and GDP of Kenya", - "extract_skipped": false + "extract_skipped": true }, "diagnostics": { - "engine_build": "0ba344270784ae9929a369da8acd00b399dfced8", - "trace_id": "74e9acc99aff40f7a653093976c55e3b", + "engine_build": "99e62038ceb4b459c2ac699549076ff123c166aa", + "trace_id": "7c7e42dd77f94ee08a15cef4438ee7ad", "warnings": [], "timing_ms": { - "total": 4632, + "total": 7, "by_step": { "coverage": 0, - "extract": 1209, - "cache_lookup": 0 + "response_cache_layer1": 1 } }, "llm_usage": { - "input_tokens": 2237, - "output_tokens": 215, - "cached_tokens": 842, - "jev_input_tokens": 25612, - "jev_output_tokens": 5740 + "input_tokens": 0, + "output_tokens": 0, + "cached_tokens": 0 }, "timed_out": false }, @@ -69,30 +66,30 @@ { "warnings": [], "timing_ms": { - "total": 3118, + "total": 2889, "by_step": { - "recall": 753, + "recall": 411, "phase_resolve_places": 0, "phase_check_entities": 0, - "shape_arcs": 75, - "shape_probe_coverage": 3, - "shape_probe": 164, - "shape_groups": 44, - "shape_labels": 9, - "shape_admission": 0, + "shape_arcs": 3, + "shape_probe_coverage": 32, + "shape_probe": 148, + "shape_groups": 58, + "shape_labels": 11, + "shape_admission": 1, "phase_derive_shapes": 0, - "shape": 695, + "shape": 364, "phase_prune_and_rank": 0, - "bind": 275, - "phase_bind": 190, - "phase_settle": 91, - "phase_place_bindings": 19, + "bind": 440, + "phase_bind": 315, + "phase_settle": 55, + "phase_place_bindings": 25, "phase_facet_requests": 0, - "materialise": 616, - "phase_materialise": 0, - "answer": 20, - "options": 307, - "phase_outcome": 152 + "materialise": 471, + "phase_materialise": 208, + "answer": 45, + "options": 348, + "phase_outcome": 207 } }, "restatement": { @@ -1436,7 +1433,7 @@ "selected": [] } ], - "capability_version": "cap_9deef72763b45f40", + "capability_version": "cap_88defe77cc79e0c0", "default_reading": { "applied": true, "removed_stat_vars": [] @@ -3764,30 +3761,30 @@ } ], "timing_ms": { - "total": 3017, + "total": 3494, "by_step": { - "recall": 704, - "phase_resolve_places": 1, + "recall": 445, + "phase_resolve_places": 0, "phase_check_entities": 0, - "shape_arcs": 82, - "shape_probe_coverage": 2, - "shape_probe": 99, - "shape_groups": 47, - "shape_labels": 10, + "shape_arcs": 1, + "shape_probe_coverage": 6, + "shape_probe": 380, + "shape_groups": 80, + "shape_labels": 12, "shape_admission": 1, "phase_derive_shapes": 0, - "shape": 365, + "shape": 785, "phase_prune_and_rank": 0, - "bind": 402, - "phase_bind": 196, - "phase_settle": 88, - "phase_place_bindings": 44, + "bind": 385, + "phase_bind": 179, + "phase_settle": 56, + "phase_place_bindings": 45, "phase_facet_requests": 0, - "materialise": 512, - "phase_materialise": 0, - "answer": 58, - "options": 511, - "phase_outcome": 136 + "materialise": 1028, + "phase_materialise": 194, + "answer": 42, + "options": 209, + "phase_outcome": 126 } }, "restatement": { @@ -5131,7 +5128,7 @@ "selected": [] } ], - "capability_version": "cap_9deef72763b45f40", + "capability_version": "cap_88defe77cc79e0c0", "default_reading": { "applied": true, "removed_stat_vars": [] @@ -7464,30 +7461,30 @@ } ], "timing_ms": { - "total": 1849, + "total": 1747, "by_step": { - "recall": 391, + "recall": 2, "phase_resolve_places": 0, "phase_check_entities": 0, - "shape_arcs": 4, - "shape_probe_coverage": 2, - "shape_probe": 126, - "shape_groups": 55, - "shape_labels": 10, + "shape_arcs": 5, + "shape_probe_coverage": 5, + "shape_probe": 124, + "shape_groups": 68, + "shape_labels": 13, "shape_admission": 1, "phase_derive_shapes": 0, - "shape": 311, + "shape": 405, "phase_prune_and_rank": 0, - "bind": 139, - "phase_bind": 15, - "phase_settle": 27, - "phase_place_bindings": 426, + "bind": 687, + "phase_bind": 24, + "phase_settle": 6, + "phase_place_bindings": 10, "phase_facet_requests": 0, - "materialise": 93, - "phase_materialise": 0, - "answer": 244, - "options": 193, - "phase_outcome": 10 + "materialise": 296, + "phase_materialise": 17, + "answer": 7, + "options": 256, + "phase_outcome": 37 } }, "restatement": { @@ -8101,7 +8098,7 @@ "value": { "ref": { "ref": "FinancialActivities", - "label": "FinancialActivities" + "label": "Financial activities" }, "value_kind": "enum_value" } @@ -8924,7 +8921,7 @@ } ], "query_qualifiers": [], - "capability_version": "cap_9deef72763b45f40", + "capability_version": "cap_88defe77cc79e0c0", "default_reading": { "applied": true, "removed_stat_vars": [ @@ -9457,7 +9454,7 @@ } ], "query_qualifiers": [], - "capability_version": "cap_9deef72763b45f40", + "capability_version": "cap_88defe77cc79e0c0", "default_reading": { "applied": true, "removed_stat_vars": [ @@ -10038,7 +10035,7 @@ "status": 200, "headers": { "content-type": "application/json", - "x-dfo-trace-id": "fc2f3ffbd0f448d2a6dcade27ac985bb" + "x-dfo-trace-id": "0c2e351b089a4167a729427dd00094bc" }, "json": { "schema_version": 1, @@ -14638,7 +14635,7 @@ "frame_grammar_version": "1.1.0", "origin_catalogue_build_id": "20261019T174519Z-2e5e8cfd", "served_from": "head", - "confirmed_at": "2026-10-24T16:30:28.193872+00:00" + "confirmed_at": "2026-10-25T17:30:43.831621+00:00" }, "warnings": [], "diagnostics": [ @@ -14677,7 +14674,7 @@ ], "series_count": 108, "output_options": { - "capability_version": "dset_cc753cefa9199881", + "capability_version": "dset_76f5fa7244511c58", "columns": [ { "name": "stat_var", @@ -14960,7 +14957,7 @@ ] } }, - "series_coverage_stamp": "45bdd65f2fd33ac77a897180047080d33ed9db812afe0cbb887bf22e2ac52690", + "series_coverage_stamp": "e6e717ab8c77e84d010915893ede5809e9ecec67929a07cfafbcc2210edfa1eb", "retention": { "pinned": false, "held_until": "2026-11-19T15:55:47.734809Z" @@ -14978,7 +14975,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": "c0e0b1a4539f4af3b08693b51621e3cb" + "x-dfo-trace-id": "f3fc6fc6e041416f89eb852fb8b0a484" } } }, @@ -15071,7 +15068,7 @@ "status": 200, "headers": { "content-type": "application/json", - "x-dfo-trace-id": "8afa9ef2f2b54f89b6c8c836c84efd26" + "x-dfo-trace-id": "8f823376876f48a9a6cd8187edb64b15" }, "json": { "schema_version": 1, @@ -15248,7 +15245,7 @@ "frame_grammar_version": "1.1.0", "origin_catalogue_build_id": "20261019T174519Z-2e5e8cfd", "served_from": "head", - "confirmed_at": "2026-10-24T16:30:29.978390+00:00" + "confirmed_at": "2026-10-25T17:30:44.944825+00:00" }, "warnings": [], "diagnostics": [ @@ -15286,7 +15283,7 @@ ], "series_count": 2, "output_options": { - "capability_version": "dset_cc753cefa9199881", + "capability_version": "dset_76f5fa7244511c58", "columns": [ { "name": "stat_var", @@ -15440,7 +15437,7 @@ ] } }, - "series_coverage_stamp": "45bdd65f2fd33ac77a897180047080d33ed9db812afe0cbb887bf22e2ac52690", + "series_coverage_stamp": "e6e717ab8c77e84d010915893ede5809e9ecec67929a07cfafbcc2210edfa1eb", "retention": { "pinned": false, "held_until": "2026-11-19T15:55:49.978519Z" @@ -15458,7 +15455,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": "af76c3e1b057409e8bbc7a9647e9aacc" + "x-dfo-trace-id": "a316c99f2ac4411bbb3ea29594a06b35" } } }, 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 70fb08f..e9cfcb8 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": "0ba344270784ae9929a369da8acd00b399dfced8", - "recorded_at": "2026-10-24T16:30:20Z" + "dfo_commit": "99e62038ceb4b459c2ac699549076ff123c166aa", + "recorded_at": "2026-10-25T17:35:00Z" }, "call": [ { @@ -35,7 +35,7 @@ "status": 200, "headers": { "content-type": "application/json", - "x-dfo-trace-id": "5974af081db54d0babd26f8b1de79beb" + "x-dfo-trace-id": "ac85a057c1634b21acdf56582a7a2b14" }, "json": { "schema_version": 1, @@ -46,15 +46,15 @@ "extract_skipped": false }, "diagnostics": { - "engine_build": "0ba344270784ae9929a369da8acd00b399dfced8", - "trace_id": "5974af081db54d0babd26f8b1de79beb", + "engine_build": "99e62038ceb4b459c2ac699549076ff123c166aa", + "trace_id": "ac85a057c1634b21acdf56582a7a2b14", "warnings": [], "timing_ms": { - "total": 328, + "total": 343, "by_step": { "coverage": 0, "extract": 0, - "cache_lookup": 1 + "cache_lookup": 0 } }, "llm_usage": { @@ -72,30 +72,30 @@ "variable_text": "debt service", "warnings": [], "timing_ms": { - "total": 323, + "total": 338, "by_step": { "recall": 1, "phase_resolve_places": 0, "phase_check_entities": 0, "shape_arcs": 2, - "shape_probe_coverage": 15, - "shape_probe": 16, - "shape_groups": 5, - "shape_labels": 10, + "shape_probe_coverage": 18, + "shape_probe": 19, + "shape_groups": 7, + "shape_labels": 12, "shape_admission": 0, "phase_derive_shapes": 0, - "shape": 104, + "shape": 116, "phase_prune_and_rank": 0, - "bind": 101, - "phase_bind": 11, - "phase_settle": 12, - "phase_place_bindings": 11, + "bind": 80, + "phase_bind": 14, + "phase_settle": 5, + "phase_place_bindings": 13, "phase_facet_requests": 0, - "materialise": 9, - "phase_materialise": 0, - "answer": 2, - "options": 7, - "phase_outcome": 65 + "materialise": 11, + "phase_materialise": 23, + "answer": 3, + "options": 8, + "phase_outcome": 64 } }, "restatement": { @@ -570,7 +570,7 @@ "label": "Creative Commons Attribution License" } }, - "coverage_stamp": "45bdd65f2fd33ac77a897180047080d33ed9db812afe0cbb887bf22e2ac52690", + "coverage_stamp": "e6e717ab8c77e84d010915893ede5809e9ecec67929a07cfafbcc2210edfa1eb", "facets": { "provenance": { "basis": "fallback", @@ -1288,7 +1288,7 @@ } ], "query_qualifiers": [], - "capability_version": "cap_9deef72763b45f40", + "capability_version": "cap_88defe77cc79e0c0", "default_reading": { "applied": true, "removed_stat_vars": [] @@ -3280,7 +3280,7 @@ "phase_check_entities": 0, "shape_arcs": 1, "shape_probe": 4, - "shape_groups": 2, + "shape_groups": 1, "shape_labels": 0, "shape_admission": 0, "phase_derive_shapes": 0, @@ -3723,7 +3723,7 @@ "status": 200, "headers": { "content-type": "application/json", - "x-dfo-trace-id": "b8b4bbcd49e14cd49ecea658aea24ec5" + "x-dfo-trace-id": "c2a42c72af28496191a0216c462106b3" }, "json": { "schema_version": 1, @@ -3963,7 +3963,7 @@ "frame_grammar_version": "1.1.0", "origin_catalogue_build_id": "20261012T000033Z-84777283", "served_from": "head", - "confirmed_at": "2026-10-24T16:30:21.793459+00:00" + "confirmed_at": "2026-10-25T17:30:37.872174+00:00" }, "warnings": [ { @@ -4008,7 +4008,7 @@ ], "series_count": 1, "output_options": { - "capability_version": "dset_cc753cefa9199881", + "capability_version": "dset_76f5fa7244511c58", "columns": [ { "name": "stat_var", @@ -4184,7 +4184,7 @@ ] } }, - "series_coverage_stamp": "45bdd65f2fd33ac77a897180047080d33ed9db812afe0cbb887bf22e2ac52690", + "series_coverage_stamp": "e6e717ab8c77e84d010915893ede5809e9ecec67929a07cfafbcc2210edfa1eb", "retention": { "pinned": true } @@ -4201,7 +4201,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": "1ac27caa67d74511b31d6ca9016617df" + "x-dfo-trace-id": "f0e08c1d19c545bca64898e7b8d80bfb" } } }, 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 254d0f6..0815b98 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": "0ba344270784ae9929a369da8acd00b399dfced8", - "recorded_at": "2026-10-24T16:30:18Z" + "dfo_commit": "99e62038ceb4b459c2ac699549076ff123c166aa", + "recorded_at": "2026-10-25T17:34:59Z" }, "call": [ { @@ -34,7 +34,7 @@ "status": 200, "headers": { "content-type": "application/json", - "x-dfo-trace-id": "1e95940d311043d0b63bd27a87996439" + "x-dfo-trace-id": "38ca03326c514418af8164d5740ec677" }, "json": { "schema_version": 1, @@ -45,21 +45,21 @@ "extract_skipped": false }, "diagnostics": { - "engine_build": "0ba344270784ae9929a369da8acd00b399dfced8", - "trace_id": "1e95940d311043d0b63bd27a87996439", + "engine_build": "99e62038ceb4b459c2ac699549076ff123c166aa", + "trace_id": "38ca03326c514418af8164d5740ec677", "warnings": [], "timing_ms": { - "total": 2200, + "total": 492, "by_step": { "coverage": 0, - "extract": 1432, + "extract": 1, "cache_lookup": 0 } }, "llm_usage": { - "input_tokens": 2232, - "output_tokens": 103, - "cached_tokens": 841, + "input_tokens": 0, + "output_tokens": 0, + "cached_tokens": 0, "jev_input_tokens": 5250, "jev_output_tokens": 1104 }, @@ -71,30 +71,30 @@ "variable_text": "debt service", "warnings": [], "timing_ms": { - "total": 757, + "total": 486, "by_step": { - "recall": 316, + "recall": 0, "phase_resolve_places": 0, "phase_check_entities": 0, "shape_arcs": 2, - "shape_probe_coverage": 8, - "shape_probe": 72, - "shape_groups": 5, - "shape_labels": 10, + "shape_probe_coverage": 15, + "shape_probe": 105, + "shape_groups": 7, + "shape_labels": 11, "shape_admission": 0, "phase_derive_shapes": 0, - "shape": 179, + "shape": 219, "phase_prune_and_rank": 0, - "bind": 89, - "phase_bind": 10, - "phase_settle": 13, + "bind": 112, + "phase_bind": 14, + "phase_settle": 5, "phase_place_bindings": 12, "phase_facet_requests": 0, - "materialise": 9, - "phase_materialise": 0, - "answer": 1, - "options": 79, - "phase_outcome": 49 + "materialise": 11, + "phase_materialise": 23, + "answer": 2, + "options": 8, + "phase_outcome": 80 } }, "restatement": { @@ -569,7 +569,7 @@ "label": "Creative Commons Attribution License" } }, - "coverage_stamp": "45bdd65f2fd33ac77a897180047080d33ed9db812afe0cbb887bf22e2ac52690", + "coverage_stamp": "e6e717ab8c77e84d010915893ede5809e9ecec67929a07cfafbcc2210edfa1eb", "facets": { "provenance": { "basis": "fallback", @@ -1287,7 +1287,7 @@ } ], "query_qualifiers": [], - "capability_version": "cap_9deef72763b45f40", + "capability_version": "cap_88defe77cc79e0c0", "default_reading": { "applied": true, "removed_stat_vars": [] @@ -3272,18 +3272,18 @@ "variable_text": "price of tea", "warnings": [], "timing_ms": { - "total": 330, + "total": 100, "by_step": { - "recall": 216, - "phase_resolve_places": 1, + "recall": 0, + "phase_resolve_places": 0, "phase_check_entities": 0, - "shape_arcs": 1, - "shape_probe": 108, - "shape_groups": 2, + "shape_arcs": 2, + "shape_probe": 91, + "shape_groups": 1, "shape_labels": 0, - "shape_admission": 0, + "shape_admission": 1, "phase_derive_shapes": 0, - "shape": 113, + "shape": 100, "phase_prune_and_rank": 0 } }, @@ -3653,7 +3653,7 @@ "error": { "class": "IncompleteAnswerError", "code": "answer_incomplete", - "trace_id": "1e95940d311043d0b63bd27a87996439" + "trace_id": "38ca03326c514418af8164d5740ec677" } } ] 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 7cd013e..7cd19fc 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": "6c90259bc5dc43649740c2e47cb555bc" + "x-dfo-trace-id": "355b1d08f8b442af87e20ecc65522a53" }, "json": { "schema_version": 1, @@ -45,8 +45,8 @@ "extract_skipped": true }, "diagnostics": { - "engine_build": "0ba344270784ae9929a369da8acd00b399dfced8", - "trace_id": "6c90259bc5dc43649740c2e47cb555bc", + "engine_build": "99e62038ceb4b459c2ac699549076ff123c166aa", + "trace_id": "355b1d08f8b442af87e20ecc65522a53", "warnings": [], "timing_ms": { "total": 1, @@ -68,9 +68,9 @@ "variable_text": "ODA disbursements", "warnings": [], "timing_ms": { - "total": 115, + "total": 0, "by_step": { - "recall": 115, + "recall": 0, "phase_resolve_places": 0, "phase_check_entities": 0 } @@ -90,6 +90,7 @@ "axis": "where", "segment": "heading", "role": "destination", + "entity_choice": 0, "entity_refs": [], "states": [] }, @@ -186,7 +187,8 @@ "operations": [] } ] - } + }, + "entity_choice": 0 }, { "mentions": [ @@ -215,7 +217,8 @@ "operations": [] } ] - } + }, + "entity_choice": 0 } ], "flagged_match": { @@ -251,6 +254,7 @@ "axis": "where", "segment": "heading", "role": "destination", + "entity_choice": 0, "entity_refs": [], "states": [], "part_index": 0 @@ -303,7 +307,7 @@ "status": 200, "headers": { "content-type": "application/json", - "x-dfo-trace-id": "67793b9246794fc18d48484eb317d58f" + "x-dfo-trace-id": "13f7792a23294f7b929699cddc6d7713" }, "json": { "schema_version": 1, @@ -312,11 +316,11 @@ "extract_skipped": true }, "diagnostics": { - "engine_build": "0ba344270784ae9929a369da8acd00b399dfced8", - "trace_id": "67793b9246794fc18d48484eb317d58f", + "engine_build": "99e62038ceb4b459c2ac699549076ff123c166aa", + "trace_id": "13f7792a23294f7b929699cddc6d7713", "warnings": [], "timing_ms": { - "total": 932, + "total": 3414, "by_step": { "coverage": 0 } @@ -342,30 +346,30 @@ } ], "timing_ms": { - "total": 907, + "total": 3410, "by_step": { "recall": 0, "phase_resolve_places": 0, "phase_check_entities": 0, "shape_arcs": 1, - "shape_probe_coverage": 6, - "shape_probe": 109, - "shape_groups": 41, + "shape_probe_coverage": 7, + "shape_probe": 2417, + "shape_groups": 58, "shape_labels": 1, - "shape_admission": 1, + "shape_admission": 0, "phase_derive_shapes": 0, - "shape": 387, + "shape": 2795, "phase_prune_and_rank": 0, - "bind": 111, - "phase_bind": 175, + "bind": 138, + "phase_bind": 188, "phase_settle": 9, - "phase_place_bindings": 67, + "phase_place_bindings": 80, "phase_facet_requests": 0, - "materialise": 15, - "phase_materialise": 0, + "materialise": 17, + "phase_materialise": 6, "answer": 10, - "options": 13, - "phase_outcome": 120 + "options": 6, + "phase_outcome": 161 } }, "restatement": { @@ -769,7 +773,7 @@ "label": "OECD Terms and Conditions" } }, - "coverage_stamp": "45bdd65f2fd33ac77a897180047080d33ed9db812afe0cbb887bf22e2ac52690", + "coverage_stamp": "e6e717ab8c77e84d010915893ede5809e9ecec67929a07cfafbcc2210edfa1eb", "facets": { "provenance": { "basis": "fallback", @@ -1223,7 +1227,7 @@ "start_year": 2018, "end_year": 2018 }, - "capability_version": "cap_9deef72763b45f40", + "capability_version": "cap_88defe77cc79e0c0", "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 a9a4400..259d31c 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": "bf6613bf82be4bddb4d60879aaf907d9" + "x-dfo-trace-id": "7abc6f06215b4187a4280d87d6f8a51a" }, "json": { "schema_version": 1, @@ -41,26 +41,23 @@ "entry_path": "raw_text", "raw_query": "ODA disbursements from Germany to Nigeria for basic health care", "normalized_query": "ODA disbursements from Germany to Nigeria for basic health care", - "extract_skipped": false + "extract_skipped": true }, "diagnostics": { - "engine_build": "0ba344270784ae9929a369da8acd00b399dfced8", - "trace_id": "bf6613bf82be4bddb4d60879aaf907d9", + "engine_build": "99e62038ceb4b459c2ac699549076ff123c166aa", + "trace_id": "7abc6f06215b4187a4280d87d6f8a51a", "warnings": [], "timing_ms": { - "total": 2620, + "total": 3, "by_step": { "coverage": 0, - "extract": 1068, - "cache_lookup": 0 + "response_cache_layer1": 1 } }, "llm_usage": { - "input_tokens": 2231, - "output_tokens": 102, - "cached_tokens": 841, - "jev_input_tokens": 6586, - "jev_output_tokens": 2060 + "input_tokens": 0, + "output_tokens": 0, + "cached_tokens": 0 }, "timed_out": false }, @@ -70,30 +67,30 @@ "variable_text": "ODA disbursements for basic health care", "warnings": [], "timing_ms": { - "total": 1548, + "total": 1669, "by_step": { - "recall": 437, + "recall": 397, "phase_resolve_places": 0, "phase_check_entities": 0, - "shape_arcs": 2, + "shape_arcs": 1, "shape_probe_coverage": 4, - "shape_probe": 161, - "shape_groups": 45, + "shape_probe": 115, + "shape_groups": 53, "shape_labels": 1, - "shape_admission": 3, + "shape_admission": 1, "phase_derive_shapes": 0, - "shape": 326, + "shape": 276, "phase_prune_and_rank": 0, - "bind": 225, - "phase_bind": 158, - "phase_settle": 56, - "phase_place_bindings": 18, + "bind": 214, + "phase_bind": 203, + "phase_settle": 45, + "phase_place_bindings": 20, "phase_facet_requests": 0, - "materialise": 41, - "phase_materialise": 0, - "answer": 186, - "options": 40, - "phase_outcome": 61 + "materialise": 28, + "phase_materialise": 196, + "answer": 145, + "options": 50, + "phase_outcome": 95 } }, "restatement": { @@ -544,7 +541,7 @@ "label": "OECD Terms and Conditions" } }, - "coverage_stamp": "45bdd65f2fd33ac77a897180047080d33ed9db812afe0cbb887bf22e2ac52690", + "coverage_stamp": "e6e717ab8c77e84d010915893ede5809e9ecec67929a07cfafbcc2210edfa1eb", "facets": { "provenance": { "basis": "fallback", @@ -1197,7 +1194,7 @@ "selected": [] } ], - "capability_version": "cap_9deef72763b45f40", + "capability_version": "cap_88defe77cc79e0c0", "default_reading": { "applied": true, "removed_stat_vars": [] @@ -3795,7 +3792,7 @@ "status": 200, "headers": { "content-type": "application/json", - "x-dfo-trace-id": "42460c90e7274dd19ecba24a6a0377e9" + "x-dfo-trace-id": "70ac3c153571497dab413643b6537466" }, "json": { "schema_version": 1, @@ -4196,7 +4193,7 @@ "frame_grammar_version": "1.1.0", "origin_catalogue_build_id": "20261011T194155Z-80081f08", "served_from": "head", - "confirmed_at": "2026-10-24T16:30:05.017544+00:00" + "confirmed_at": "2026-10-25T17:22:10.027136+00:00" }, "warnings": [ { @@ -4241,7 +4238,7 @@ ], "series_count": 5, "output_options": { - "capability_version": "dset_cc753cefa9199881", + "capability_version": "dset_76f5fa7244511c58", "columns": [ { "name": "stat_var", @@ -4524,7 +4521,7 @@ ] } }, - "series_coverage_stamp": "45bdd65f2fd33ac77a897180047080d33ed9db812afe0cbb887bf22e2ac52690", + "series_coverage_stamp": "e6e717ab8c77e84d010915893ede5809e9ecec67929a07cfafbcc2210edfa1eb", "retention": { "pinned": true } @@ -4541,7 +4538,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": "b9b4b3a90d6546e09cc738a29bbbb1d6" + "x-dfo-trace-id": "d2d4306f79d2411ebcd110cc1e26f49d" } } }, 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 08f9ae8..f7e28bc 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": "1e95940d311043d0b63bd27a87996439" + "x-dfo-trace-id": "38ca03326c514418af8164d5740ec677" }, "json": { "schema_version": 1, @@ -41,21 +41,21 @@ "extract_skipped": false }, "diagnostics": { - "engine_build": "0ba344270784ae9929a369da8acd00b399dfced8", - "trace_id": "1e95940d311043d0b63bd27a87996439", + "engine_build": "99e62038ceb4b459c2ac699549076ff123c166aa", + "trace_id": "38ca03326c514418af8164d5740ec677", "warnings": [], "timing_ms": { - "total": 2200, + "total": 492, "by_step": { "coverage": 0, - "extract": 1432, + "extract": 1, "cache_lookup": 0 } }, "llm_usage": { - "input_tokens": 2232, - "output_tokens": 103, - "cached_tokens": 841, + "input_tokens": 0, + "output_tokens": 0, + "cached_tokens": 0, "jev_input_tokens": 5250, "jev_output_tokens": 1104 }, @@ -67,30 +67,30 @@ "variable_text": "debt service", "warnings": [], "timing_ms": { - "total": 757, + "total": 486, "by_step": { - "recall": 316, + "recall": 0, "phase_resolve_places": 0, "phase_check_entities": 0, "shape_arcs": 2, - "shape_probe_coverage": 8, - "shape_probe": 72, - "shape_groups": 5, - "shape_labels": 10, + "shape_probe_coverage": 15, + "shape_probe": 105, + "shape_groups": 7, + "shape_labels": 11, "shape_admission": 0, "phase_derive_shapes": 0, - "shape": 179, + "shape": 219, "phase_prune_and_rank": 0, - "bind": 89, - "phase_bind": 10, - "phase_settle": 13, + "bind": 112, + "phase_bind": 14, + "phase_settle": 5, "phase_place_bindings": 12, "phase_facet_requests": 0, - "materialise": 9, - "phase_materialise": 0, - "answer": 1, - "options": 79, - "phase_outcome": 49 + "materialise": 11, + "phase_materialise": 23, + "answer": 2, + "options": 8, + "phase_outcome": 80 } }, "restatement": { @@ -565,7 +565,7 @@ "label": "Creative Commons Attribution License" } }, - "coverage_stamp": "45bdd65f2fd33ac77a897180047080d33ed9db812afe0cbb887bf22e2ac52690", + "coverage_stamp": "e6e717ab8c77e84d010915893ede5809e9ecec67929a07cfafbcc2210edfa1eb", "facets": { "provenance": { "basis": "fallback", @@ -1283,7 +1283,7 @@ } ], "query_qualifiers": [], - "capability_version": "cap_9deef72763b45f40", + "capability_version": "cap_88defe77cc79e0c0", "default_reading": { "applied": true, "removed_stat_vars": [] @@ -3268,18 +3268,18 @@ "variable_text": "price of tea", "warnings": [], "timing_ms": { - "total": 330, + "total": 100, "by_step": { - "recall": 216, - "phase_resolve_places": 1, + "recall": 0, + "phase_resolve_places": 0, "phase_check_entities": 0, - "shape_arcs": 1, - "shape_probe": 108, - "shape_groups": 2, + "shape_arcs": 2, + "shape_probe": 91, + "shape_groups": 1, "shape_labels": 0, - "shape_admission": 0, + "shape_admission": 1, "phase_derive_shapes": 0, - "shape": 113, + "shape": 100, "phase_prune_and_rank": 0 } }, @@ -3631,7 +3631,7 @@ "error": { "class": "ContractError", "code": "contract_violation", - "trace_id": "1e95940d311043d0b63bd27a87996439" + "trace_id": "38ca03326c514418af8164d5740ec677" } } ] 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 93272d8..7d6aec9 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": "0ba344270784ae9929a369da8acd00b399dfced8", - "recorded_at": "2026-10-24T16:30:22Z" + "dfo_commit": "99e62038ceb4b459c2ac699549076ff123c166aa", + "recorded_at": "2026-10-25T17:35:02Z" }, "call": [ { @@ -34,7 +34,7 @@ "status": 200, "headers": { "content-type": "application/json", - "x-dfo-trace-id": "74e9acc99aff40f7a653093976c55e3b" + "x-dfo-trace-id": "7c7e42dd77f94ee08a15cef4438ee7ad" }, "json": { "schema_version": 1, @@ -42,26 +42,23 @@ "entry_path": "raw_text", "raw_query": "ODA disbursements for health and for education from Germany to Kenya, and GDP of Kenya", "normalized_query": "ODA disbursements for health and for education from Germany to Kenya, and GDP of Kenya", - "extract_skipped": false + "extract_skipped": true }, "diagnostics": { - "engine_build": "0ba344270784ae9929a369da8acd00b399dfced8", - "trace_id": "74e9acc99aff40f7a653093976c55e3b", + "engine_build": "99e62038ceb4b459c2ac699549076ff123c166aa", + "trace_id": "7c7e42dd77f94ee08a15cef4438ee7ad", "warnings": [], "timing_ms": { - "total": 4632, + "total": 7, "by_step": { "coverage": 0, - "extract": 1209, - "cache_lookup": 0 + "response_cache_layer1": 1 } }, "llm_usage": { - "input_tokens": 2237, - "output_tokens": 215, - "cached_tokens": 842, - "jev_input_tokens": 25612, - "jev_output_tokens": 5740 + "input_tokens": 0, + "output_tokens": 0, + "cached_tokens": 0 }, "timed_out": false }, @@ -71,30 +68,30 @@ "variable_text": "health ODA disbursements", "warnings": [], "timing_ms": { - "total": 3118, + "total": 2889, "by_step": { - "recall": 753, + "recall": 411, "phase_resolve_places": 0, "phase_check_entities": 0, - "shape_arcs": 75, - "shape_probe_coverage": 3, - "shape_probe": 164, - "shape_groups": 44, - "shape_labels": 9, - "shape_admission": 0, + "shape_arcs": 3, + "shape_probe_coverage": 32, + "shape_probe": 148, + "shape_groups": 58, + "shape_labels": 11, + "shape_admission": 1, "phase_derive_shapes": 0, - "shape": 695, + "shape": 364, "phase_prune_and_rank": 0, - "bind": 275, - "phase_bind": 190, - "phase_settle": 91, - "phase_place_bindings": 19, + "bind": 440, + "phase_bind": 315, + "phase_settle": 55, + "phase_place_bindings": 25, "phase_facet_requests": 0, - "materialise": 616, - "phase_materialise": 0, - "answer": 20, - "options": 307, - "phase_outcome": 152 + "materialise": 471, + "phase_materialise": 208, + "answer": 45, + "options": 348, + "phase_outcome": 207 } }, "restatement": { @@ -1438,7 +1435,7 @@ "selected": [] } ], - "capability_version": "cap_9deef72763b45f40", + "capability_version": "cap_88defe77cc79e0c0", "default_reading": { "applied": true, "removed_stat_vars": [] @@ -3766,30 +3763,30 @@ } ], "timing_ms": { - "total": 3017, + "total": 3494, "by_step": { - "recall": 704, - "phase_resolve_places": 1, + "recall": 445, + "phase_resolve_places": 0, "phase_check_entities": 0, - "shape_arcs": 82, - "shape_probe_coverage": 2, - "shape_probe": 99, - "shape_groups": 47, - "shape_labels": 10, + "shape_arcs": 1, + "shape_probe_coverage": 6, + "shape_probe": 380, + "shape_groups": 80, + "shape_labels": 12, "shape_admission": 1, "phase_derive_shapes": 0, - "shape": 365, + "shape": 785, "phase_prune_and_rank": 0, - "bind": 402, - "phase_bind": 196, - "phase_settle": 88, - "phase_place_bindings": 44, + "bind": 385, + "phase_bind": 179, + "phase_settle": 56, + "phase_place_bindings": 45, "phase_facet_requests": 0, - "materialise": 512, - "phase_materialise": 0, - "answer": 58, - "options": 511, - "phase_outcome": 136 + "materialise": 1028, + "phase_materialise": 194, + "answer": 42, + "options": 209, + "phase_outcome": 126 } }, "restatement": { @@ -5133,7 +5130,7 @@ "selected": [] } ], - "capability_version": "cap_9deef72763b45f40", + "capability_version": "cap_88defe77cc79e0c0", "default_reading": { "applied": true, "removed_stat_vars": [] @@ -7466,30 +7463,30 @@ } ], "timing_ms": { - "total": 1849, + "total": 1747, "by_step": { - "recall": 391, + "recall": 2, "phase_resolve_places": 0, "phase_check_entities": 0, - "shape_arcs": 4, - "shape_probe_coverage": 2, - "shape_probe": 126, - "shape_groups": 55, - "shape_labels": 10, + "shape_arcs": 5, + "shape_probe_coverage": 5, + "shape_probe": 124, + "shape_groups": 68, + "shape_labels": 13, "shape_admission": 1, "phase_derive_shapes": 0, - "shape": 311, + "shape": 405, "phase_prune_and_rank": 0, - "bind": 139, - "phase_bind": 15, - "phase_settle": 27, - "phase_place_bindings": 426, + "bind": 687, + "phase_bind": 24, + "phase_settle": 6, + "phase_place_bindings": 10, "phase_facet_requests": 0, - "materialise": 93, - "phase_materialise": 0, - "answer": 244, - "options": 193, - "phase_outcome": 10 + "materialise": 296, + "phase_materialise": 17, + "answer": 7, + "options": 256, + "phase_outcome": 37 } }, "restatement": { @@ -8103,7 +8100,7 @@ "value": { "ref": { "ref": "FinancialActivities", - "label": "FinancialActivities" + "label": "Financial activities" }, "value_kind": "enum_value" } @@ -8926,7 +8923,7 @@ } ], "query_qualifiers": [], - "capability_version": "cap_9deef72763b45f40", + "capability_version": "cap_88defe77cc79e0c0", "default_reading": { "applied": true, "removed_stat_vars": [ @@ -9459,7 +9456,7 @@ } ], "query_qualifiers": [], - "capability_version": "cap_9deef72763b45f40", + "capability_version": "cap_88defe77cc79e0c0", "default_reading": { "applied": true, "removed_stat_vars": [ @@ -10040,7 +10037,7 @@ "status": 200, "headers": { "content-type": "application/json", - "x-dfo-trace-id": "fc2f3ffbd0f448d2a6dcade27ac985bb" + "x-dfo-trace-id": "0c2e351b089a4167a729427dd00094bc" }, "json": { "schema_version": 1, @@ -14640,7 +14637,7 @@ "frame_grammar_version": "1.1.0", "origin_catalogue_build_id": "20261019T174519Z-2e5e8cfd", "served_from": "head", - "confirmed_at": "2026-10-24T16:30:28.193872+00:00" + "confirmed_at": "2026-10-25T17:30:43.831621+00:00" }, "warnings": [], "diagnostics": [ @@ -14679,7 +14676,7 @@ ], "series_count": 108, "output_options": { - "capability_version": "dset_cc753cefa9199881", + "capability_version": "dset_76f5fa7244511c58", "columns": [ { "name": "stat_var", @@ -14962,7 +14959,7 @@ ] } }, - "series_coverage_stamp": "45bdd65f2fd33ac77a897180047080d33ed9db812afe0cbb887bf22e2ac52690", + "series_coverage_stamp": "e6e717ab8c77e84d010915893ede5809e9ecec67929a07cfafbcc2210edfa1eb", "retention": { "pinned": false, "held_until": "2026-11-19T15:55:47.734809Z" @@ -14980,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": "c0e0b1a4539f4af3b08693b51621e3cb" + "x-dfo-trace-id": "f3fc6fc6e041416f89eb852fb8b0a484" } } }, @@ -15073,7 +15070,7 @@ "status": 200, "headers": { "content-type": "application/json", - "x-dfo-trace-id": "8afa9ef2f2b54f89b6c8c836c84efd26" + "x-dfo-trace-id": "8f823376876f48a9a6cd8187edb64b15" }, "json": { "schema_version": 1, @@ -15250,7 +15247,7 @@ "frame_grammar_version": "1.1.0", "origin_catalogue_build_id": "20261019T174519Z-2e5e8cfd", "served_from": "head", - "confirmed_at": "2026-10-24T16:30:29.978390+00:00" + "confirmed_at": "2026-10-25T17:30:44.944825+00:00" }, "warnings": [], "diagnostics": [ @@ -15288,7 +15285,7 @@ ], "series_count": 2, "output_options": { - "capability_version": "dset_cc753cefa9199881", + "capability_version": "dset_76f5fa7244511c58", "columns": [ { "name": "stat_var", @@ -15442,7 +15439,7 @@ ] } }, - "series_coverage_stamp": "45bdd65f2fd33ac77a897180047080d33ed9db812afe0cbb887bf22e2ac52690", + "series_coverage_stamp": "e6e717ab8c77e84d010915893ede5809e9ecec67929a07cfafbcc2210edfa1eb", "retention": { "pinned": false, "held_until": "2026-11-19T15:55:49.978519Z" @@ -15460,7 +15457,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": "af76c3e1b057409e8bbc7a9647e9aacc" + "x-dfo-trace-id": "a316c99f2ac4411bbb3ea29594a06b35" } } }, 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 ddf62a5..1b42cc0 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": "bf6613bf82be4bddb4d60879aaf907d9" + "x-dfo-trace-id": "7abc6f06215b4187a4280d87d6f8a51a" }, "json": { "schema_version": 1, @@ -38,26 +38,23 @@ "entry_path": "raw_text", "raw_query": "ODA disbursements from Germany to Nigeria for basic health care", "normalized_query": "ODA disbursements from Germany to Nigeria for basic health care", - "extract_skipped": false + "extract_skipped": true }, "diagnostics": { - "engine_build": "0ba344270784ae9929a369da8acd00b399dfced8", - "trace_id": "bf6613bf82be4bddb4d60879aaf907d9", + "engine_build": "99e62038ceb4b459c2ac699549076ff123c166aa", + "trace_id": "7abc6f06215b4187a4280d87d6f8a51a", "warnings": [], "timing_ms": { - "total": 2620, + "total": 3, "by_step": { "coverage": 0, - "extract": 1068, - "cache_lookup": 0 + "response_cache_layer1": 1 } }, "llm_usage": { - "input_tokens": 2231, - "output_tokens": 102, - "cached_tokens": 841, - "jev_input_tokens": 6586, - "jev_output_tokens": 2060 + "input_tokens": 0, + "output_tokens": 0, + "cached_tokens": 0 }, "timed_out": false }, @@ -67,30 +64,30 @@ "variable_text": "ODA disbursements for basic health care", "warnings": [], "timing_ms": { - "total": 1548, + "total": 1669, "by_step": { - "recall": 437, + "recall": 397, "phase_resolve_places": 0, "phase_check_entities": 0, - "shape_arcs": 2, + "shape_arcs": 1, "shape_probe_coverage": 4, - "shape_probe": 161, - "shape_groups": 45, + "shape_probe": 115, + "shape_groups": 53, "shape_labels": 1, - "shape_admission": 3, + "shape_admission": 1, "phase_derive_shapes": 0, - "shape": 326, + "shape": 276, "phase_prune_and_rank": 0, - "bind": 225, - "phase_bind": 158, - "phase_settle": 56, - "phase_place_bindings": 18, + "bind": 214, + "phase_bind": 203, + "phase_settle": 45, + "phase_place_bindings": 20, "phase_facet_requests": 0, - "materialise": 41, - "phase_materialise": 0, - "answer": 186, - "options": 40, - "phase_outcome": 61 + "materialise": 28, + "phase_materialise": 196, + "answer": 145, + "options": 50, + "phase_outcome": 95 } }, "restatement": { @@ -474,7 +471,7 @@ "label": "OECD Terms and Conditions" } }, - "coverage_stamp": "45bdd65f2fd33ac77a897180047080d33ed9db812afe0cbb887bf22e2ac52690", + "coverage_stamp": "e6e717ab8c77e84d010915893ede5809e9ecec67929a07cfafbcc2210edfa1eb", "facets": { "provenance": { "basis": "fallback", @@ -1127,7 +1124,7 @@ "selected": [] } ], - "capability_version": "cap_9deef72763b45f40", + "capability_version": "cap_88defe77cc79e0c0", "default_reading": { "applied": true, "removed_stat_vars": [] @@ -3644,7 +3641,7 @@ "error": { "class": "ContractError", "code": "contract_violation", - "trace_id": "bf6613bf82be4bddb4d60879aaf907d9" + "trace_id": "7abc6f06215b4187a4280d87d6f8a51a" } } ] 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 67702d7..7b92863 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": "bf6613bf82be4bddb4d60879aaf907d9" + "x-dfo-trace-id": "7abc6f06215b4187a4280d87d6f8a51a" }, "json": { "schema_version": 1, @@ -38,26 +38,23 @@ "entry_path": "raw_text", "raw_query": "ODA disbursements from Germany to Nigeria for basic health care", "normalized_query": "ODA disbursements from Germany to Nigeria for basic health care", - "extract_skipped": false + "extract_skipped": true }, "diagnostics": { - "engine_build": "0ba344270784ae9929a369da8acd00b399dfced8", - "trace_id": "bf6613bf82be4bddb4d60879aaf907d9", + "engine_build": "99e62038ceb4b459c2ac699549076ff123c166aa", + "trace_id": "7abc6f06215b4187a4280d87d6f8a51a", "warnings": [], "timing_ms": { - "total": 2620, + "total": 3, "by_step": { "coverage": 0, - "extract": 1068, - "cache_lookup": 0 + "response_cache_layer1": 1 } }, "llm_usage": { - "input_tokens": 2231, - "output_tokens": 102, - "cached_tokens": 841, - "jev_input_tokens": 6586, - "jev_output_tokens": 2060 + "input_tokens": 0, + "output_tokens": 0, + "cached_tokens": 0 }, "timed_out": false }, @@ -67,30 +64,30 @@ "variable_text": "ODA disbursements for basic health care", "warnings": [], "timing_ms": { - "total": 1548, + "total": 1669, "by_step": { - "recall": 437, + "recall": 397, "phase_resolve_places": 0, "phase_check_entities": 0, - "shape_arcs": 2, + "shape_arcs": 1, "shape_probe_coverage": 4, - "shape_probe": 161, - "shape_groups": 45, + "shape_probe": 115, + "shape_groups": 53, "shape_labels": 1, - "shape_admission": 3, + "shape_admission": 1, "phase_derive_shapes": 0, - "shape": 326, + "shape": 276, "phase_prune_and_rank": 0, - "bind": 225, - "phase_bind": 158, - "phase_settle": 56, - "phase_place_bindings": 18, + "bind": 214, + "phase_bind": 203, + "phase_settle": 45, + "phase_place_bindings": 20, "phase_facet_requests": 0, - "materialise": 41, - "phase_materialise": 0, - "answer": 186, - "options": 40, - "phase_outcome": 61 + "materialise": 28, + "phase_materialise": 196, + "answer": 145, + "options": 50, + "phase_outcome": 95 } }, "restatement": { @@ -424,7 +421,7 @@ "error": { "class": "ContractError", "code": "contract_violation", - "trace_id": "bf6613bf82be4bddb4d60879aaf907d9" + "trace_id": "7abc6f06215b4187a4280d87d6f8a51a" } } ] 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 54b6e48..051cdf2 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,21 +44,21 @@ "extract_skipped": false }, "diagnostics": { - "engine_build": "0ba344270784ae9929a369da8acd00b399dfced8", - "trace_id": "1e95940d311043d0b63bd27a87996439", + "engine_build": "99e62038ceb4b459c2ac699549076ff123c166aa", + "trace_id": "38ca03326c514418af8164d5740ec677", "warnings": [], "timing_ms": { - "total": 2200, + "total": 492, "by_step": { "coverage": 0, - "extract": 1432, + "extract": 1, "cache_lookup": 0 } }, "llm_usage": { - "input_tokens": 2232, - "output_tokens": 103, - "cached_tokens": 841, + "input_tokens": 0, + "output_tokens": 0, + "cached_tokens": 0, "jev_input_tokens": 5250, "jev_output_tokens": 1104 }, @@ -70,30 +70,30 @@ "variable_text": "debt service", "warnings": [], "timing_ms": { - "total": 757, + "total": 486, "by_step": { - "recall": 316, + "recall": 0, "phase_resolve_places": 0, "phase_check_entities": 0, "shape_arcs": 2, - "shape_probe_coverage": 8, - "shape_probe": 72, - "shape_groups": 5, - "shape_labels": 10, + "shape_probe_coverage": 15, + "shape_probe": 105, + "shape_groups": 7, + "shape_labels": 11, "shape_admission": 0, "phase_derive_shapes": 0, - "shape": 179, + "shape": 219, "phase_prune_and_rank": 0, - "bind": 89, - "phase_bind": 10, - "phase_settle": 13, + "bind": 112, + "phase_bind": 14, + "phase_settle": 5, "phase_place_bindings": 12, "phase_facet_requests": 0, - "materialise": 9, - "phase_materialise": 0, - "answer": 1, - "options": 79, - "phase_outcome": 49 + "materialise": 11, + "phase_materialise": 23, + "answer": 2, + "options": 8, + "phase_outcome": 80 } }, "restatement": { @@ -568,7 +568,7 @@ "label": "Creative Commons Attribution License" } }, - "coverage_stamp": "45bdd65f2fd33ac77a897180047080d33ed9db812afe0cbb887bf22e2ac52690", + "coverage_stamp": "e6e717ab8c77e84d010915893ede5809e9ecec67929a07cfafbcc2210edfa1eb", "facets": { "provenance": { "basis": "fallback", @@ -1286,7 +1286,7 @@ } ], "query_qualifiers": [], - "capability_version": "cap_9deef72763b45f40", + "capability_version": "cap_88defe77cc79e0c0", "default_reading": { "applied": true, "removed_stat_vars": [] @@ -3271,18 +3271,18 @@ "variable_text": "price of tea", "warnings": [], "timing_ms": { - "total": 330, + "total": 100, "by_step": { - "recall": 216, - "phase_resolve_places": 1, + "recall": 0, + "phase_resolve_places": 0, "phase_check_entities": 0, - "shape_arcs": 1, - "shape_probe": 108, - "shape_groups": 2, + "shape_arcs": 2, + "shape_probe": 91, + "shape_groups": 1, "shape_labels": 0, - "shape_admission": 0, + "shape_admission": 1, "phase_derive_shapes": 0, - "shape": 113, + "shape": 100, "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 d55e0ec..ee7690f 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": "304fe92b998b45849ff11a547aadc3e8" + "x-dfo-trace-id": "7fd4a5b5b50648999f5ead8966bcc02c" }, "json": { "schema_version": 1, @@ -41,14 +41,14 @@ "extract_skipped": false }, "diagnostics": { - "engine_build": "0ba344270784ae9929a369da8acd00b399dfced8", - "trace_id": "304fe92b998b45849ff11a547aadc3e8", + "engine_build": "99e62038ceb4b459c2ac699549076ff123c166aa", + "trace_id": "7fd4a5b5b50648999f5ead8966bcc02c", "warnings": [], "timing_ms": { - "total": 1416, + "total": 1054, "by_step": { "coverage": 0, - "extract": 1297, + "extract": 1050, "cache_lookup": 0 } }, @@ -65,9 +65,9 @@ "variable_text": "ODA disbursements", "warnings": [], "timing_ms": { - "total": 115, + "total": 0, "by_step": { - "recall": 115, + "recall": 0, "phase_resolve_places": 0, "phase_check_entities": 0 } @@ -87,6 +87,7 @@ "axis": "where", "segment": "heading", "role": "destination", + "entity_choice": 0, "entity_refs": [], "states": [] }, @@ -183,7 +184,8 @@ "operations": [] } ] - } + }, + "entity_choice": 0 }, { "mentions": [ @@ -212,7 +214,8 @@ "operations": [] } ] - } + }, + "entity_choice": 0 } ] } @@ -234,6 +237,7 @@ "axis": "where", "segment": "heading", "role": "destination", + "entity_choice": 0, "entity_refs": [], "states": [], "part_index": 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 bf2b909..ad1b2d6 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": "304fe92b998b45849ff11a547aadc3e8" + "x-dfo-trace-id": "7fd4a5b5b50648999f5ead8966bcc02c" }, "json": { "schema_version": 1, @@ -41,14 +41,14 @@ "extract_skipped": false }, "diagnostics": { - "engine_build": "0ba344270784ae9929a369da8acd00b399dfced8", - "trace_id": "304fe92b998b45849ff11a547aadc3e8", + "engine_build": "99e62038ceb4b459c2ac699549076ff123c166aa", + "trace_id": "7fd4a5b5b50648999f5ead8966bcc02c", "warnings": [], "timing_ms": { - "total": 1416, + "total": 1054, "by_step": { "coverage": 0, - "extract": 1297, + "extract": 1050, "cache_lookup": 0 } }, @@ -65,9 +65,9 @@ "variable_text": "ODA disbursements", "warnings": [], "timing_ms": { - "total": 115, + "total": 0, "by_step": { - "recall": 115, + "recall": 0, "phase_resolve_places": 0, "phase_check_entities": 0 } @@ -87,6 +87,7 @@ "axis": "where", "segment": "heading", "role": "destination", + "entity_choice": 0, "entity_refs": [], "states": [] }, @@ -183,7 +184,8 @@ "operations": [] } ] - } + }, + "entity_choice": 0 }, { "mentions": [ @@ -212,7 +214,8 @@ "operations": [] } ] - } + }, + "entity_choice": 0 } ] } @@ -234,6 +237,7 @@ "axis": "where", "segment": "heading", "role": "destination", + "entity_choice": 0, "entity_refs": [], "states": [], "part_index": 0 @@ -257,7 +261,7 @@ "error": { "class": "ContractError", "code": "contract_violation", - "trace_id": "304fe92b998b45849ff11a547aadc3e8" + "trace_id": "7fd4a5b5b50648999f5ead8966bcc02c" } } ] 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 1ca39fd..b26f19d 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": "1e95940d311043d0b63bd27a87996439" + "x-dfo-trace-id": "38ca03326c514418af8164d5740ec677" }, "json": { "schema_version": 1, @@ -44,21 +44,21 @@ "extract_skipped": false }, "diagnostics": { - "engine_build": "0ba344270784ae9929a369da8acd00b399dfced8", - "trace_id": "1e95940d311043d0b63bd27a87996439", + "engine_build": "99e62038ceb4b459c2ac699549076ff123c166aa", + "trace_id": "38ca03326c514418af8164d5740ec677", "warnings": [], "timing_ms": { - "total": 2200, + "total": 492, "by_step": { "coverage": 0, - "extract": 1432, + "extract": 1, "cache_lookup": 0 } }, "llm_usage": { - "input_tokens": 2232, - "output_tokens": 103, - "cached_tokens": 841, + "input_tokens": 0, + "output_tokens": 0, + "cached_tokens": 0, "jev_input_tokens": 5250, "jev_output_tokens": 1104 }, @@ -70,30 +70,30 @@ "variable_text": "debt service", "warnings": [], "timing_ms": { - "total": 757, + "total": 486, "by_step": { - "recall": 316, + "recall": 0, "phase_resolve_places": 0, "phase_check_entities": 0, "shape_arcs": 2, - "shape_probe_coverage": 8, - "shape_probe": 72, - "shape_groups": 5, - "shape_labels": 10, + "shape_probe_coverage": 15, + "shape_probe": 105, + "shape_groups": 7, + "shape_labels": 11, "shape_admission": 0, "phase_derive_shapes": 0, - "shape": 179, + "shape": 219, "phase_prune_and_rank": 0, - "bind": 89, - "phase_bind": 10, - "phase_settle": 13, + "bind": 112, + "phase_bind": 14, + "phase_settle": 5, "phase_place_bindings": 12, "phase_facet_requests": 0, - "materialise": 9, - "phase_materialise": 0, - "answer": 1, - "options": 79, - "phase_outcome": 49 + "materialise": 11, + "phase_materialise": 23, + "answer": 2, + "options": 8, + "phase_outcome": 80 } }, "restatement": { @@ -568,7 +568,7 @@ "label": "Creative Commons Attribution License" } }, - "coverage_stamp": "45bdd65f2fd33ac77a897180047080d33ed9db812afe0cbb887bf22e2ac52690", + "coverage_stamp": "e6e717ab8c77e84d010915893ede5809e9ecec67929a07cfafbcc2210edfa1eb", "facets": { "provenance": { "basis": "fallback", @@ -1286,7 +1286,7 @@ } ], "query_qualifiers": [], - "capability_version": "cap_9deef72763b45f40", + "capability_version": "cap_88defe77cc79e0c0", "default_reading": { "applied": true, "removed_stat_vars": [] @@ -3271,18 +3271,18 @@ "variable_text": "price of tea", "warnings": [], "timing_ms": { - "total": 330, + "total": 100, "by_step": { - "recall": 216, - "phase_resolve_places": 1, + "recall": 0, + "phase_resolve_places": 0, "phase_check_entities": 0, - "shape_arcs": 1, - "shape_probe": 108, - "shape_groups": 2, + "shape_arcs": 2, + "shape_probe": 91, + "shape_groups": 1, "shape_labels": 0, - "shape_admission": 0, + "shape_admission": 1, "phase_derive_shapes": 0, - "shape": 113, + "shape": 100, "phase_prune_and_rank": 0 } }, @@ -3652,7 +3652,7 @@ "error": { "class": "IncompleteAnswerError", "code": "answer_incomplete", - "trace_id": "1e95940d311043d0b63bd27a87996439" + "trace_id": "38ca03326c514418af8164d5740ec677" } } ] 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 3471fd6..f2eb0a9 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": "1e95940d311043d0b63bd27a87996439" + "x-dfo-trace-id": "38ca03326c514418af8164d5740ec677" }, "json": { "schema_version": 1, @@ -44,21 +44,21 @@ "extract_skipped": false }, "diagnostics": { - "engine_build": "0ba344270784ae9929a369da8acd00b399dfced8", - "trace_id": "1e95940d311043d0b63bd27a87996439", + "engine_build": "99e62038ceb4b459c2ac699549076ff123c166aa", + "trace_id": "38ca03326c514418af8164d5740ec677", "warnings": [], "timing_ms": { - "total": 2200, + "total": 492, "by_step": { "coverage": 0, - "extract": 1432, + "extract": 1, "cache_lookup": 0 } }, "llm_usage": { - "input_tokens": 2232, - "output_tokens": 103, - "cached_tokens": 841, + "input_tokens": 0, + "output_tokens": 0, + "cached_tokens": 0, "jev_input_tokens": 5250, "jev_output_tokens": 1104 }, @@ -70,30 +70,30 @@ "variable_text": "debt service", "warnings": [], "timing_ms": { - "total": 757, + "total": 486, "by_step": { - "recall": 316, + "recall": 0, "phase_resolve_places": 0, "phase_check_entities": 0, "shape_arcs": 2, - "shape_probe_coverage": 8, - "shape_probe": 72, - "shape_groups": 5, - "shape_labels": 10, + "shape_probe_coverage": 15, + "shape_probe": 105, + "shape_groups": 7, + "shape_labels": 11, "shape_admission": 0, "phase_derive_shapes": 0, - "shape": 179, + "shape": 219, "phase_prune_and_rank": 0, - "bind": 89, - "phase_bind": 10, - "phase_settle": 13, + "bind": 112, + "phase_bind": 14, + "phase_settle": 5, "phase_place_bindings": 12, "phase_facet_requests": 0, - "materialise": 9, - "phase_materialise": 0, - "answer": 1, - "options": 79, - "phase_outcome": 49 + "materialise": 11, + "phase_materialise": 23, + "answer": 2, + "options": 8, + "phase_outcome": 80 } }, "restatement": { @@ -568,7 +568,7 @@ "label": "Creative Commons Attribution License" } }, - "coverage_stamp": "45bdd65f2fd33ac77a897180047080d33ed9db812afe0cbb887bf22e2ac52690", + "coverage_stamp": "e6e717ab8c77e84d010915893ede5809e9ecec67929a07cfafbcc2210edfa1eb", "facets": { "provenance": { "basis": "fallback", @@ -1286,7 +1286,7 @@ } ], "query_qualifiers": [], - "capability_version": "cap_9deef72763b45f40", + "capability_version": "cap_88defe77cc79e0c0", "default_reading": { "applied": true, "removed_stat_vars": [] @@ -3271,18 +3271,18 @@ "variable_text": "price of tea", "warnings": [], "timing_ms": { - "total": 330, + "total": 100, "by_step": { - "recall": 216, - "phase_resolve_places": 1, + "recall": 0, + "phase_resolve_places": 0, "phase_check_entities": 0, - "shape_arcs": 1, - "shape_probe": 108, - "shape_groups": 2, + "shape_arcs": 2, + "shape_probe": 91, + "shape_groups": 1, "shape_labels": 0, - "shape_admission": 0, + "shape_admission": 1, "phase_derive_shapes": 0, - "shape": 113, + "shape": 100, "phase_prune_and_rank": 0 } }, @@ -3646,7 +3646,7 @@ "error": { "class": "IncompleteAnswerError", "code": "answer_incomplete", - "trace_id": "1e95940d311043d0b63bd27a87996439" + "trace_id": "38ca03326c514418af8164d5740ec677" } } ] 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 d4a4d89..8170879 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": "21bb19c92c824a70b2eb378e85a9cfd0" + "x-dfo-trace-id": "962188ce8826466e8510fb819d5dc26d" }, "json": { "schema_version": 1, @@ -45,21 +45,21 @@ "extract_skipped": false }, "diagnostics": { - "engine_build": "0ba344270784ae9929a369da8acd00b399dfced8", - "trace_id": "21bb19c92c824a70b2eb378e85a9cfd0", + "engine_build": "99e62038ceb4b459c2ac699549076ff123c166aa", + "trace_id": "962188ce8826466e8510fb819d5dc26d", "warnings": [], "timing_ms": { - "total": 8287, + "total": 1710, "by_step": { "coverage": 0, - "extract": 1330, - "cache_lookup": 2 + "extract": 0, + "cache_lookup": 0 } }, "llm_usage": { - "input_tokens": 2237, - "output_tokens": 143, - "cached_tokens": 842, + "input_tokens": 0, + "output_tokens": 0, + "cached_tokens": 0, "jev_input_tokens": 13358, "jev_output_tokens": 2855 }, @@ -71,28 +71,28 @@ "variable_text": "mortality", "warnings": [], "timing_ms": { - "total": 6951, + "total": 1705, "by_step": { - "recall": 261, + "recall": 1, "phase_resolve_places": 0, "phase_check_entities": 0, - "shape_arcs": 7, - "shape_probe": 122, + "shape_arcs": 4, + "shape_probe": 2, "shape_groups": 6, "shape_labels": 1, "shape_admission": 1, "phase_derive_shapes": 0, - "shape": 241, + "shape": 119, "phase_prune_and_rank": 0, - "bind": 142, - "phase_bind": 17, - "phase_settle": 6, - "phase_place_bindings": 490, + "bind": 146, + "phase_bind": 19, + "phase_settle": 2, + "phase_place_bindings": 30, "phase_facet_requests": 0, - "materialise": 115, - "phase_materialise": 1, - "answer": 243, - "phase_outcome": 5435 + "materialise": 21, + "phase_materialise": 25, + "answer": 30, + "phase_outcome": 1312 } }, "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_9deef72763b45f40", + "capability_version": "cap_88defe77cc79e0c0", "default_reading": { "applied": true, "removed_stat_vars": [] @@ -2348,7 +2348,7 @@ "start_year": 2013, "end_year": 2022 }, - "capability_version": "cap_9deef72763b45f40", + "capability_version": "cap_88defe77cc79e0c0", "default_reading": { "applied": true, "removed_stat_vars": [] @@ -2647,7 +2647,7 @@ "status": 200, "headers": { "content-type": "application/json", - "x-dfo-trace-id": "bb50ec0b45244567bf259cee9e6de857" + "x-dfo-trace-id": "3e98392a1d6a49edbf871ef6d6a14e8d" }, "json": { "schema_version": 1, @@ -2656,11 +2656,11 @@ "extract_skipped": true }, "diagnostics": { - "engine_build": "0ba344270784ae9929a369da8acd00b399dfced8", - "trace_id": "bb50ec0b45244567bf259cee9e6de857", + "engine_build": "99e62038ceb4b459c2ac699549076ff123c166aa", + "trace_id": "3e98392a1d6a49edbf871ef6d6a14e8d", "warnings": [], "timing_ms": { - "total": 486, + "total": 332, "by_step": { "coverage": 0 } @@ -2673,18 +2673,18 @@ "variable_text": "mortality", "warnings": [], "timing_ms": { - "total": 436, + "total": 265, "by_step": { - "validate": 1, - "walk": 182, + "validate": 0, + "walk": 0, "reread_arcs": 0, "detect_edits": 0, "resolve_survivors": 0, - "shape": 158, - "bind": 1, + "shape": 164, + "bind": 0, "where_places": 0, - "materialise": 93, - "answer": 1, + "materialise": 99, + "answer": 2, "options": 0 } }, @@ -3213,7 +3213,7 @@ "start_year": 2013, "end_year": 2022 }, - "capability_version": "cap_9deef72763b45f40" + "capability_version": "cap_88defe77cc79e0c0" }, "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 6219a29..23bd82b 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": "21bb19c92c824a70b2eb378e85a9cfd0" + "x-dfo-trace-id": "962188ce8826466e8510fb819d5dc26d" }, "json": { "schema_version": 1, @@ -45,21 +45,21 @@ "extract_skipped": false }, "diagnostics": { - "engine_build": "0ba344270784ae9929a369da8acd00b399dfced8", - "trace_id": "21bb19c92c824a70b2eb378e85a9cfd0", + "engine_build": "99e62038ceb4b459c2ac699549076ff123c166aa", + "trace_id": "962188ce8826466e8510fb819d5dc26d", "warnings": [], "timing_ms": { - "total": 8287, + "total": 1710, "by_step": { "coverage": 0, - "extract": 1330, - "cache_lookup": 2 + "extract": 0, + "cache_lookup": 0 } }, "llm_usage": { - "input_tokens": 2237, - "output_tokens": 143, - "cached_tokens": 842, + "input_tokens": 0, + "output_tokens": 0, + "cached_tokens": 0, "jev_input_tokens": 13358, "jev_output_tokens": 2855 }, @@ -71,28 +71,28 @@ "variable_text": "mortality", "warnings": [], "timing_ms": { - "total": 6951, + "total": 1705, "by_step": { - "recall": 261, + "recall": 1, "phase_resolve_places": 0, "phase_check_entities": 0, - "shape_arcs": 7, - "shape_probe": 122, + "shape_arcs": 4, + "shape_probe": 2, "shape_groups": 6, "shape_labels": 1, "shape_admission": 1, "phase_derive_shapes": 0, - "shape": 241, + "shape": 119, "phase_prune_and_rank": 0, - "bind": 142, - "phase_bind": 17, - "phase_settle": 6, - "phase_place_bindings": 490, + "bind": 146, + "phase_bind": 19, + "phase_settle": 2, + "phase_place_bindings": 30, "phase_facet_requests": 0, - "materialise": 115, - "phase_materialise": 1, - "answer": 243, - "phase_outcome": 5435 + "materialise": 21, + "phase_materialise": 25, + "answer": 30, + "phase_outcome": 1312 } }, "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_9deef72763b45f40", + "capability_version": "cap_88defe77cc79e0c0", "default_reading": { "applied": true, "removed_stat_vars": [] @@ -2348,7 +2348,7 @@ "start_year": 2013, "end_year": 2022 }, - "capability_version": "cap_9deef72763b45f40", + "capability_version": "cap_88defe77cc79e0c0", "default_reading": { "applied": true, "removed_stat_vars": [] @@ -2629,7 +2629,7 @@ "status": 200, "headers": { "content-type": "application/json", - "x-dfo-trace-id": "bb50ec0b45244567bf259cee9e6de857" + "x-dfo-trace-id": "3e98392a1d6a49edbf871ef6d6a14e8d" }, "json": { "schema_version": 1, @@ -2638,11 +2638,11 @@ "extract_skipped": true }, "diagnostics": { - "engine_build": "0ba344270784ae9929a369da8acd00b399dfced8", - "trace_id": "bb50ec0b45244567bf259cee9e6de857", + "engine_build": "99e62038ceb4b459c2ac699549076ff123c166aa", + "trace_id": "3e98392a1d6a49edbf871ef6d6a14e8d", "warnings": [], "timing_ms": { - "total": 486, + "total": 332, "by_step": { "coverage": 0 } @@ -2655,18 +2655,18 @@ "variable_text": "mortality", "warnings": [], "timing_ms": { - "total": 436, + "total": 265, "by_step": { - "validate": 1, - "walk": 182, + "validate": 0, + "walk": 0, "reread_arcs": 0, "detect_edits": 0, "resolve_survivors": 0, - "shape": 158, - "bind": 1, + "shape": 164, + "bind": 0, "where_places": 0, - "materialise": 93, - "answer": 1, + "materialise": 99, + "answer": 2, "options": 0 } }, @@ -3186,7 +3186,7 @@ "start_year": 2013, "end_year": 2022 }, - "capability_version": "cap_9deef72763b45f40" + "capability_version": "cap_88defe77cc79e0c0" }, "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 c0a28da..57e5358 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": "0ba344270784ae9929a369da8acd00b399dfced8", - "recorded_at": "2026-10-24T16:32:01Z" + "dfo_commit": "99e62038ceb4b459c2ac699549076ff123c166aa", + "recorded_at": "2026-10-25T17:37:25Z" }, "call": [ { @@ -36,7 +36,7 @@ "status": 200, "headers": { "content-type": "application/json", - "x-dfo-trace-id": "fef53a976b3e4e1cb64f3bc36f96f076" + "x-dfo-trace-id": "4ef48e41be8145e79e3349df65b71540" }, "json": { "schema_version": 1, @@ -47,14 +47,14 @@ "extract_skipped": false }, "diagnostics": { - "engine_build": "0ba344270784ae9929a369da8acd00b399dfced8", - "trace_id": "fef53a976b3e4e1cb64f3bc36f96f076", + "engine_build": "99e62038ceb4b459c2ac699549076ff123c166aa", + "trace_id": "4ef48e41be8145e79e3349df65b71540", "warnings": [], "timing_ms": { - "total": 3026, + "total": 4896, "by_step": { "coverage": 0, - "extract": 1213, + "extract": 1129, "cache_lookup": 0 } }, @@ -79,28 +79,28 @@ } ], "timing_ms": { - "total": 1634, + "total": 3462, "by_step": { - "recall": 1, + "recall": 2, "phase_resolve_places": 0, "phase_check_entities": 0, - "shape_arcs": 3, - "shape_probe": 138, - "shape_groups": 5, + "shape_arcs": 8, + "shape_probe": 161, + "shape_groups": 7, "shape_labels": 1, - "shape_admission": 1, + "shape_admission": 2, "phase_derive_shapes": 0, - "shape": 249, + "shape": 282, "phase_prune_and_rank": 0, - "bind": 135, - "phase_bind": 11, - "phase_settle": 7, - "phase_place_bindings": 28, + "bind": 137, + "phase_bind": 15, + "phase_settle": 1, + "phase_place_bindings": 34, "phase_facet_requests": 0, - "materialise": 116, - "phase_materialise": 0, - "answer": 57, - "phase_outcome": 1030 + "materialise": 107, + "phase_materialise": 27, + "answer": 69, + "phase_outcome": 2788 } }, "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_9deef72763b45f40", + "capability_version": "cap_88defe77cc79e0c0", "default_reading": { "applied": true, "removed_stat_vars": [] @@ -2378,7 +2378,7 @@ "start_year": 2013, "end_year": 2022 }, - "capability_version": "cap_9deef72763b45f40", + "capability_version": "cap_88defe77cc79e0c0", "default_reading": { "applied": true, "removed_stat_vars": [] @@ -2414,30 +2414,30 @@ } ], "timing_ms": { - "total": 1809, + "total": 3762, "by_step": { - "recall": 452, + "recall": 1361, "phase_resolve_places": 0, "phase_check_entities": 0, - "shape_arcs": 1, - "shape_probe_coverage": 10, - "shape_probe": 142, - "shape_groups": 40, + "shape_arcs": 22, + "shape_probe_coverage": 5, + "shape_probe": 130, + "shape_groups": 121, "shape_labels": 0, "shape_admission": 0, "phase_derive_shapes": 0, - "shape": 666, + "shape": 846, "phase_prune_and_rank": 0, - "bind": 129, - "phase_bind": 297, - "phase_settle": 13, - "phase_place_bindings": 76, + "bind": 653, + "phase_bind": 331, + "phase_settle": 17, + "phase_place_bindings": 102, "phase_facet_requests": 0, - "materialise": 16, - "phase_materialise": 0, - "answer": 8, - "options": 33, - "phase_outcome": 119 + "materialise": 20, + "phase_materialise": 5, + "answer": 263, + "options": 8, + "phase_outcome": 156 } }, "restatement": { @@ -2864,7 +2864,7 @@ "label": "OECD Terms and Conditions" } }, - "coverage_stamp": "45bdd65f2fd33ac77a897180047080d33ed9db812afe0cbb887bf22e2ac52690", + "coverage_stamp": "e6e717ab8c77e84d010915893ede5809e9ecec67929a07cfafbcc2210edfa1eb", "facets": { "provenance": { "basis": "fallback", @@ -3241,7 +3241,7 @@ "label": "disbursement" } ], - "provenance": "measure_elected" + "provenance": "binder" }, { "key": { @@ -3312,7 +3312,7 @@ "start_year": 2013, "end_year": 2022 }, - "capability_version": "cap_9deef72763b45f40", + "capability_version": "cap_88defe77cc79e0c0", "default_reading": { "applied": true, "removed_stat_vars": [] @@ -6073,7 +6073,7 @@ "status": 200, "headers": { "content-type": "application/json", - "x-dfo-trace-id": "6255e04219bd4208bca0a6f26fbe89b2" + "x-dfo-trace-id": "559262a87e7a4f79b1a4761af98f0be8" }, "json": { "schema_version": 1, @@ -6082,11 +6082,11 @@ "extract_skipped": true }, "diagnostics": { - "engine_build": "0ba344270784ae9929a369da8acd00b399dfced8", - "trace_id": "6255e04219bd4208bca0a6f26fbe89b2", + "engine_build": "99e62038ceb4b459c2ac699549076ff123c166aa", + "trace_id": "559262a87e7a4f79b1a4761af98f0be8", "warnings": [], "timing_ms": { - "total": 1746, + "total": 1249, "by_step": { "coverage": 0 } @@ -6099,17 +6099,17 @@ "variable_text": "mortality", "warnings": [], "timing_ms": { - "total": 262, + "total": 298, "by_step": { "validate": 0, "walk": 0, - "reread_arcs": 1, + "reread_arcs": 0, "detect_edits": 0, "resolve_survivors": 0, - "shape": 169, + "shape": 194, "bind": 0, - "where_places": 0, - "materialise": 91, + "where_places": 1, + "materialise": 102, "answer": 1, "options": 0 } @@ -6630,7 +6630,7 @@ "start_year": 2013, "end_year": 2022 }, - "capability_version": "cap_9deef72763b45f40" + "capability_version": "cap_88defe77cc79e0c0" }, "confidence": "high", "available_at_place": true, @@ -6679,19 +6679,19 @@ "variable_text": "aid flows", "warnings": [], "timing_ms": { - "total": 1695, + "total": 1184, "by_step": { "validate": 0, - "walk": 10, - "reread_arcs": 1, + "walk": 15, + "reread_arcs": 0, "detect_edits": 0, "resolve_survivors": 0, - "shape": 1660, - "bind": 0, + "shape": 1120, + "bind": 1, "where_places": 0, - "materialise": 15, - "answer": 7, - "options": 2 + "materialise": 21, + "answer": 9, + "options": 18 } }, "entity_refs": [], @@ -7092,7 +7092,7 @@ "label": "OECD Terms and Conditions" } }, - "coverage_stamp": "45bdd65f2fd33ac77a897180047080d33ed9db812afe0cbb887bf22e2ac52690", + "coverage_stamp": "e6e717ab8c77e84d010915893ede5809e9ecec67929a07cfafbcc2210edfa1eb", "facets": { "provenance": { "basis": "fallback", @@ -7540,7 +7540,7 @@ "start_year": 2013, "end_year": 2022 }, - "capability_version": "cap_9deef72763b45f40" + "capability_version": "cap_88defe77cc79e0c0" }, "confidence": "high", "available_at_place": true, 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 cbcd88d..0239b96 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": "0ba344270784ae9929a369da8acd00b399dfced8", - "recorded_at": "2026-10-24T16:31:37Z" + "dfo_commit": "99e62038ceb4b459c2ac699549076ff123c166aa", + "recorded_at": "2026-10-25T17:36:59Z" }, "call": [ { @@ -39,7 +39,7 @@ "status": 200, "headers": { "content-type": "application/json", - "x-dfo-trace-id": "542dac0d7c43477cb66c1841c20e169d" + "x-dfo-trace-id": "b77a765cb10a47e2a332c4884f011b76" }, "json": { "schema_version": 1, @@ -50,14 +50,14 @@ "extract_skipped": false }, "diagnostics": { - "engine_build": "0ba344270784ae9929a369da8acd00b399dfced8", - "trace_id": "542dac0d7c43477cb66c1841c20e169d", + "engine_build": "99e62038ceb4b459c2ac699549076ff123c166aa", + "trace_id": "b77a765cb10a47e2a332c4884f011b76", "warnings": [], "timing_ms": { - "total": 8962, + "total": 10550, "by_step": { "coverage": 0, - "extract": 1389, + "extract": 1134, "cache_lookup": 0 } }, @@ -65,7 +65,7 @@ "input_tokens": 2245, "output_tokens": 202, "cached_tokens": 844, - "jev_input_tokens": 26840, + "jev_input_tokens": 26836, "jev_output_tokens": 5603 }, "timed_out": false @@ -76,28 +76,28 @@ "variable_text": "mortality", "warnings": [], "timing_ms": { - "total": 7499, + "total": 9309, "by_step": { "recall": 1, - "phase_resolve_places": 83, + "phase_resolve_places": 84, "phase_check_entities": 0, - "shape_arcs": 4, - "shape_probe": 98, - "shape_groups": 5, + "shape_arcs": 5, + "shape_probe": 104, + "shape_groups": 7, "shape_labels": 1, - "shape_admission": 75, + "shape_admission": 83, "phase_derive_shapes": 0, - "shape": 417, + "shape": 486, "phase_prune_and_rank": 0, - "bind": 125, - "phase_bind": 17, - "phase_settle": 7, - "phase_place_bindings": 23, + "bind": 127, + "phase_bind": 15, + "phase_settle": 1, + "phase_place_bindings": 38, "phase_facet_requests": 0, - "materialise": 285, - "phase_materialise": 0, - "answer": 46, - "phase_outcome": 6495 + "materialise": 1079, + "phase_materialise": 30, + "answer": 57, + "phase_outcome": 7391 } }, "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_9deef72763b45f40", + "capability_version": "cap_88defe77cc79e0c0", "default_reading": { "applied": true, "removed_stat_vars": [] @@ -4547,7 +4547,7 @@ "start_year": 2013, "end_year": 2022 }, - "capability_version": "cap_9deef72763b45f40", + "capability_version": "cap_88defe77cc79e0c0", "default_reading": { "applied": true, "removed_stat_vars": [] @@ -6136,7 +6136,7 @@ "start_year": 2013, "end_year": 2022 }, - "capability_version": "cap_9deef72763b45f40", + "capability_version": "cap_88defe77cc79e0c0", "default_reading": { "applied": true, "removed_stat_vars": [] @@ -6162,30 +6162,30 @@ "variable_text": "GDP", "warnings": [], "timing_ms": { - "total": 1683, + "total": 2675, "by_step": { - "recall": 0, - "phase_resolve_places": 103, + "recall": 1, + "phase_resolve_places": 91, "phase_check_entities": 0, - "shape_arcs": 3, - "shape_probe_coverage": 3, - "shape_probe": 5, - "shape_groups": 48, - "shape_labels": 10, - "shape_admission": 112, + "shape_arcs": 4, + "shape_probe_coverage": 4, + "shape_probe": 109, + "shape_groups": 63, + "shape_labels": 12, + "shape_admission": 9, "phase_derive_shapes": 0, - "shape": 447, + "shape": 584, "phase_prune_and_rank": 0, - "bind": 143, - "phase_bind": 12, - "phase_settle": 36, - "phase_place_bindings": 7, + "bind": 134, + "phase_bind": 14, + "phase_settle": 6, + "phase_place_bindings": 10, "phase_facet_requests": 0, - "materialise": 337, - "phase_materialise": 0, - "answer": 33, - "options": 426, - "phase_outcome": 139 + "materialise": 1186, + "phase_materialise": 18, + "answer": 41, + "options": 430, + "phase_outcome": 160 } }, "restatement": { @@ -7510,7 +7510,7 @@ "value": { "ref": { "ref": "FinancialActivities", - "label": "FinancialActivities" + "label": "Financial activities" }, "value_kind": "enum_value" } @@ -8687,7 +8687,7 @@ "start_year": 2013, "end_year": 2022 }, - "capability_version": "cap_9deef72763b45f40", + "capability_version": "cap_88defe77cc79e0c0", "default_reading": { "applied": true, "removed_stat_vars": [ @@ -10256,7 +10256,7 @@ "start_year": 2013, "end_year": 2022 }, - "capability_version": "cap_9deef72763b45f40", + "capability_version": "cap_88defe77cc79e0c0", "default_reading": { "applied": true, "removed_stat_vars": [ @@ -11011,7 +11011,7 @@ "status": 200, "headers": { "content-type": "application/json", - "x-dfo-trace-id": "fed0402857db4d198957a2377d91a266" + "x-dfo-trace-id": "99a1c4af07a2414a9eabf36feadbeaae" }, "json": { "schema_version": 1, @@ -11020,11 +11020,11 @@ "extract_skipped": true }, "diagnostics": { - "engine_build": "0ba344270784ae9929a369da8acd00b399dfced8", - "trace_id": "fed0402857db4d198957a2377d91a266", + "engine_build": "99e62038ceb4b459c2ac699549076ff123c166aa", + "trace_id": "99a1c4af07a2414a9eabf36feadbeaae", "warnings": [], "timing_ms": { - "total": 1060, + "total": 1046, "by_step": { "coverage": 0 } @@ -11037,19 +11037,19 @@ "variable_text": "mortality", "warnings": [], "timing_ms": { - "total": 548, + "total": 543, "by_step": { - "validate": 1, - "walk": 0, + "validate": 0, + "walk": 1, "reread_arcs": 0, "detect_edits": 0, "resolve_survivors": 0, - "shape": 157, + "shape": 173, "bind": 0, "where_places": 0, - "materialise": 256, - "answer": 8, - "options": 126 + "materialise": 260, + "answer": 12, + "options": 97 } }, "entity_refs": [], @@ -12619,7 +12619,7 @@ "start_year": 2013, "end_year": 2022 }, - "capability_version": "cap_9deef72763b45f40" + "capability_version": "cap_88defe77cc79e0c0" }, "confidence": "high", "available_at_place": true, @@ -12633,19 +12633,19 @@ "variable_text": "GDP", "warnings": [], "timing_ms": { - "total": 937, + "total": 929, "by_step": { "validate": 0, "walk": 0, - "reread_arcs": 0, + "reread_arcs": 1, "detect_edits": 0, "resolve_survivors": 0, - "shape": 657, + "shape": 624, "bind": 0, "where_places": 1, - "materialise": 181, - "answer": 7, - "options": 91 + "materialise": 180, + "answer": 8, + "options": 115 } }, "entity_refs": [], @@ -13812,7 +13812,7 @@ "value": { "ref": { "ref": "FinancialActivities", - "label": "FinancialActivities" + "label": "Financial activities" }, "value_kind": "enum_value" } @@ -14777,7 +14777,7 @@ "start_year": 2013, "end_year": 2022 }, - "capability_version": "cap_9deef72763b45f40" + "capability_version": "cap_88defe77cc79e0c0" }, "confidence": "high", "available_at_place": true, @@ -15217,7 +15217,7 @@ "status": 200, "headers": { "content-type": "application/json", - "x-dfo-trace-id": "4afea2b786664a9fa9659b020e0016d6" + "x-dfo-trace-id": "4ce5b18b92824a7695bdec6c98893997" }, "json": { "schema_version": 1, @@ -15478,7 +15478,7 @@ "frame_grammar_version": "1.1.0", "origin_catalogue_build_id": "20261023T061534Z-06fa7b89", "served_from": "head", - "confirmed_at": "2026-10-24T16:31:48.627461+00:00" + "confirmed_at": "2026-10-25T17:37:11.544065+00:00" }, "warnings": [], "diagnostics": [ @@ -15516,7 +15516,7 @@ ], "series_count": 48, "output_options": { - "capability_version": "dset_cc753cefa9199881", + "capability_version": "dset_76f5fa7244511c58", "columns": [ { "name": "stat_var", @@ -15676,7 +15676,7 @@ ] } }, - "series_coverage_stamp": "45bdd65f2fd33ac77a897180047080d33ed9db812afe0cbb887bf22e2ac52690", + "series_coverage_stamp": "e6e717ab8c77e84d010915893ede5809e9ecec67929a07cfafbcc2210edfa1eb", "retention": { "pinned": false, "held_until": "2026-11-22T17:40:52.293692Z" @@ -15694,7 +15694,7 @@ "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": "4035ed942dbd417b883890979c32af7b" + "x-dfo-trace-id": "657f36800a1941c086819a1b69efaaf9" } } }, @@ -15835,7 +15835,7 @@ "status": 200, "headers": { "content-type": "application/json", - "x-dfo-trace-id": "0dd46708d45b47a39b91408cc8700637" + "x-dfo-trace-id": "9a8678b0f63f472bbb91470de525d453" }, "json": { "schema_version": 1, @@ -16060,7 +16060,7 @@ "frame_grammar_version": "1.1.0", "origin_catalogue_build_id": "20261023T061534Z-06fa7b89", "served_from": "head", - "confirmed_at": "2026-10-24T16:31:49.948810+00:00" + "confirmed_at": "2026-10-25T17:37:12.800804+00:00" }, "warnings": [ { @@ -16104,7 +16104,7 @@ ], "series_count": 47, "output_options": { - "capability_version": "dset_cc753cefa9199881", + "capability_version": "dset_76f5fa7244511c58", "columns": [ { "name": "stat_var", @@ -16264,7 +16264,7 @@ ] } }, - "series_coverage_stamp": "45bdd65f2fd33ac77a897180047080d33ed9db812afe0cbb887bf22e2ac52690", + "series_coverage_stamp": "e6e717ab8c77e84d010915893ede5809e9ecec67929a07cfafbcc2210edfa1eb", "retention": { "pinned": false, "held_until": "2026-11-22T17:40:54.208730Z" @@ -16282,7 +16282,7 @@ "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": "7646f48ce8414ae8aefdf014523b025c" + "x-dfo-trace-id": "d25b000882d34d9d9bdee9bb87ccbee7" } } }, 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 8e13000..fb84d9d 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": "fef53a976b3e4e1cb64f3bc36f96f076" + "x-dfo-trace-id": "4ef48e41be8145e79e3349df65b71540" }, "json": { "schema_version": 1, @@ -46,14 +46,14 @@ "extract_skipped": false }, "diagnostics": { - "engine_build": "0ba344270784ae9929a369da8acd00b399dfced8", - "trace_id": "fef53a976b3e4e1cb64f3bc36f96f076", + "engine_build": "99e62038ceb4b459c2ac699549076ff123c166aa", + "trace_id": "4ef48e41be8145e79e3349df65b71540", "warnings": [], "timing_ms": { - "total": 3026, + "total": 4896, "by_step": { "coverage": 0, - "extract": 1213, + "extract": 1129, "cache_lookup": 0 } }, @@ -78,28 +78,28 @@ } ], "timing_ms": { - "total": 1634, + "total": 3462, "by_step": { - "recall": 1, + "recall": 2, "phase_resolve_places": 0, "phase_check_entities": 0, - "shape_arcs": 3, - "shape_probe": 138, - "shape_groups": 5, + "shape_arcs": 8, + "shape_probe": 161, + "shape_groups": 7, "shape_labels": 1, - "shape_admission": 1, + "shape_admission": 2, "phase_derive_shapes": 0, - "shape": 249, + "shape": 282, "phase_prune_and_rank": 0, - "bind": 135, - "phase_bind": 11, - "phase_settle": 7, - "phase_place_bindings": 28, + "bind": 137, + "phase_bind": 15, + "phase_settle": 1, + "phase_place_bindings": 34, "phase_facet_requests": 0, - "materialise": 116, - "phase_materialise": 0, - "answer": 57, - "phase_outcome": 1030 + "materialise": 107, + "phase_materialise": 27, + "answer": 69, + "phase_outcome": 2788 } }, "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_9deef72763b45f40", + "capability_version": "cap_88defe77cc79e0c0", "default_reading": { "applied": true, "removed_stat_vars": [] @@ -2377,7 +2377,7 @@ "start_year": 2013, "end_year": 2022 }, - "capability_version": "cap_9deef72763b45f40", + "capability_version": "cap_88defe77cc79e0c0", "default_reading": { "applied": true, "removed_stat_vars": [] @@ -2420,30 +2420,30 @@ } ], "timing_ms": { - "total": 1809, + "total": 3762, "by_step": { - "recall": 452, + "recall": 1361, "phase_resolve_places": 0, "phase_check_entities": 0, - "shape_arcs": 1, - "shape_probe_coverage": 10, - "shape_probe": 142, - "shape_groups": 40, + "shape_arcs": 22, + "shape_probe_coverage": 5, + "shape_probe": 130, + "shape_groups": 121, "shape_labels": 0, "shape_admission": 0, "phase_derive_shapes": 0, - "shape": 666, + "shape": 846, "phase_prune_and_rank": 0, - "bind": 129, - "phase_bind": 297, - "phase_settle": 13, - "phase_place_bindings": 76, + "bind": 653, + "phase_bind": 331, + "phase_settle": 17, + "phase_place_bindings": 102, "phase_facet_requests": 0, - "materialise": 16, - "phase_materialise": 0, - "answer": 8, - "options": 33, - "phase_outcome": 119 + "materialise": 20, + "phase_materialise": 5, + "answer": 263, + "options": 8, + "phase_outcome": 156 } }, "restatement": { @@ -2903,7 +2903,7 @@ "label": "OECD Terms and Conditions" } }, - "coverage_stamp": "45bdd65f2fd33ac77a897180047080d33ed9db812afe0cbb887bf22e2ac52690", + "coverage_stamp": "e6e717ab8c77e84d010915893ede5809e9ecec67929a07cfafbcc2210edfa1eb", "facets": { "provenance": { "basis": "fallback", @@ -3280,7 +3280,7 @@ "label": "disbursement" } ], - "provenance": "measure_elected" + "provenance": "binder" }, { "key": { @@ -3351,7 +3351,7 @@ "start_year": 2013, "end_year": 2022 }, - "capability_version": "cap_9deef72763b45f40", + "capability_version": "cap_88defe77cc79e0c0", "default_reading": { "applied": true, "removed_stat_vars": [] @@ -6131,7 +6131,7 @@ "status": 200, "headers": { "content-type": "application/json", - "x-dfo-trace-id": "6255e04219bd4208bca0a6f26fbe89b2" + "x-dfo-trace-id": "559262a87e7a4f79b1a4761af98f0be8" }, "json": { "schema_version": 1, @@ -6140,11 +6140,11 @@ "extract_skipped": true }, "diagnostics": { - "engine_build": "0ba344270784ae9929a369da8acd00b399dfced8", - "trace_id": "6255e04219bd4208bca0a6f26fbe89b2", + "engine_build": "99e62038ceb4b459c2ac699549076ff123c166aa", + "trace_id": "559262a87e7a4f79b1a4761af98f0be8", "warnings": [], "timing_ms": { - "total": 1746, + "total": 1249, "by_step": { "coverage": 0 } @@ -6157,17 +6157,17 @@ "variable_text": "mortality", "warnings": [], "timing_ms": { - "total": 262, + "total": 298, "by_step": { "validate": 0, "walk": 0, - "reread_arcs": 1, + "reread_arcs": 0, "detect_edits": 0, "resolve_survivors": 0, - "shape": 169, + "shape": 194, "bind": 0, - "where_places": 0, - "materialise": 91, + "where_places": 1, + "materialise": 102, "answer": 1, "options": 0 } @@ -6688,7 +6688,7 @@ "start_year": 2013, "end_year": 2022 }, - "capability_version": "cap_9deef72763b45f40" + "capability_version": "cap_88defe77cc79e0c0" }, "confidence": "high", "available_at_place": true, @@ -6737,19 +6737,19 @@ "variable_text": "aid flows", "warnings": [], "timing_ms": { - "total": 1695, + "total": 1184, "by_step": { "validate": 0, - "walk": 10, - "reread_arcs": 1, + "walk": 15, + "reread_arcs": 0, "detect_edits": 0, "resolve_survivors": 0, - "shape": 1660, - "bind": 0, + "shape": 1120, + "bind": 1, "where_places": 0, - "materialise": 15, - "answer": 7, - "options": 2 + "materialise": 21, + "answer": 9, + "options": 18 } }, "entity_refs": [], @@ -7150,7 +7150,7 @@ "label": "OECD Terms and Conditions" } }, - "coverage_stamp": "45bdd65f2fd33ac77a897180047080d33ed9db812afe0cbb887bf22e2ac52690", + "coverage_stamp": "e6e717ab8c77e84d010915893ede5809e9ecec67929a07cfafbcc2210edfa1eb", "facets": { "provenance": { "basis": "fallback", @@ -7598,7 +7598,7 @@ "start_year": 2013, "end_year": 2022 }, - "capability_version": "cap_9deef72763b45f40" + "capability_version": "cap_88defe77cc79e0c0" }, "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 0799c24..3c33733 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": "009afd1dc09e44299c2004e111d17991" + "x-dfo-trace-id": "1af94637ff7043abb23f65b60e28d604" }, "json": { "schema_version": 1, @@ -46,14 +46,14 @@ "extract_skipped": false }, "diagnostics": { - "engine_build": "0ba344270784ae9929a369da8acd00b399dfced8", - "trace_id": "009afd1dc09e44299c2004e111d17991", + "engine_build": "99e62038ceb4b459c2ac699549076ff123c166aa", + "trace_id": "1af94637ff7043abb23f65b60e28d604", "warnings": [], "timing_ms": { - "total": 2627, + "total": 2578, "by_step": { "coverage": 0, - "extract": 1263, + "extract": 1025, "cache_lookup": 0 } }, @@ -61,7 +61,7 @@ "input_tokens": 2239, "output_tokens": 164, "cached_tokens": 842, - "jev_input_tokens": 17402, + "jev_input_tokens": 17398, "jev_output_tokens": 3500 }, "timed_out": false @@ -72,30 +72,30 @@ "variable_text": "GDP", "warnings": [], "timing_ms": { - "total": 1129, + "total": 1276, "by_step": { - "recall": 2, - "phase_resolve_places": 0, + "recall": 1, + "phase_resolve_places": 1, "phase_check_entities": 0, "shape_arcs": 4, - "shape_probe_coverage": 4, - "shape_probe": 151, - "shape_groups": 45, - "shape_labels": 10, - "shape_admission": 1, + "shape_probe_coverage": 17, + "shape_probe": 266, + "shape_groups": 61, + "shape_labels": 12, + "shape_admission": 2, "phase_derive_shapes": 0, - "shape": 407, + "shape": 538, "phase_prune_and_rank": 0, - "bind": 127, - "phase_bind": 10, - "phase_settle": 24, - "phase_place_bindings": 8, + "bind": 153, + "phase_bind": 12, + "phase_settle": 6, + "phase_place_bindings": 12, "phase_facet_requests": 0, - "materialise": 144, - "phase_materialise": 0, - "answer": 185, - "options": 98, - "phase_outcome": 124 + "materialise": 120, + "phase_materialise": 19, + "answer": 172, + "options": 115, + "phase_outcome": 127 } }, "restatement": { @@ -993,7 +993,7 @@ "value": { "ref": { "ref": "FinancialActivities", - "label": "FinancialActivities" + "label": "Financial activities" }, "value_kind": "enum_value" } @@ -1965,7 +1965,7 @@ "start_year": 2015, "end_year": 2015 }, - "capability_version": "cap_9deef72763b45f40", + "capability_version": "cap_88defe77cc79e0c0", "default_reading": { "applied": true, "removed_stat_vars": [ @@ -2884,7 +2884,7 @@ "start_year": 2015, "end_year": 2015 }, - "capability_version": "cap_9deef72763b45f40", + "capability_version": "cap_88defe77cc79e0c0", "default_reading": { "applied": true, "removed_stat_vars": [ @@ -2988,24 +2988,24 @@ "variable_text": "ODA", "warnings": [], "timing_ms": { - "total": 619, + "total": 487, "by_step": { - "recall": 315, + "recall": 1, "phase_resolve_places": 0, "phase_check_entities": 0, - "shape_arcs": 1, - "shape_probe_coverage": 5, - "shape_probe": 107, + "shape_arcs": 3, + "shape_probe_coverage": 10, + "shape_probe": 108, "shape_groups": 3, "shape_labels": 0, "shape_admission": 1, "phase_derive_shapes": 0, - "shape": 196, + "shape": 253, "phase_prune_and_rank": 0, - "bind": 97, + "bind": 218, "phase_bind": 2, - "phase_settle": 9, - "phase_place_bindings": 0 + "phase_settle": 8, + "phase_place_bindings": 5 } }, "rendered_sentence": "Could not tell who is giving and who is receiving among \"G20\", \"Germany\", and \"India\". Put \"from\" or \"to\" before a name.", @@ -3575,7 +3575,7 @@ "status": 200, "headers": { "content-type": "application/json", - "x-dfo-trace-id": "6a837108e9cb4b74b197a33c82a6e92f" + "x-dfo-trace-id": "9296d6d509bb4007ab9b828b29f773db" }, "json": { "schema_version": 1, @@ -3584,11 +3584,11 @@ "extract_skipped": true }, "diagnostics": { - "engine_build": "0ba344270784ae9929a369da8acd00b399dfced8", - "trace_id": "6a837108e9cb4b74b197a33c82a6e92f", + "engine_build": "99e62038ceb4b459c2ac699549076ff123c166aa", + "trace_id": "9296d6d509bb4007ab9b828b29f773db", "warnings": [], "timing_ms": { - "total": 953, + "total": 1192, "by_step": { "coverage": 0 } @@ -3608,19 +3608,19 @@ "variable_text": "GDP", "warnings": [], "timing_ms": { - "total": 847, + "total": 1069, "by_step": { "validate": 0, - "walk": 1, - "reread_arcs": 0, + "walk": 0, + "reread_arcs": 1, "detect_edits": 0, "resolve_survivors": 0, - "shape": 638, + "shape": 829, "bind": 0, - "where_places": 0, - "materialise": 110, + "where_places": 1, + "materialise": 123, "answer": 4, - "options": 94 + "options": 111 } }, "entity_refs": [], @@ -4375,7 +4375,7 @@ "value": { "ref": { "ref": "FinancialActivities", - "label": "FinancialActivities" + "label": "Financial activities" }, "value_kind": "enum_value" } @@ -5135,7 +5135,7 @@ "start_year": 2015, "end_year": 2015 }, - "capability_version": "cap_9deef72763b45f40" + "capability_version": "cap_88defe77cc79e0c0" }, "confidence": "high", "available_at_place": true, @@ -5210,30 +5210,30 @@ "variable_text": "ODA", "warnings": [], "timing_ms": { - "total": 339, + "total": 382, "by_step": { - "recall": 1, - "phase_resolve_places": 1, + "recall": 2, + "phase_resolve_places": 0, "phase_check_entities": 0, - "shape_arcs": 1, - "shape_probe_coverage": 6, - "shape_probe": 95, + "shape_arcs": 2, + "shape_probe_coverage": 7, + "shape_probe": 84, "shape_groups": 3, "shape_labels": 0, - "shape_admission": 1, + "shape_admission": 0, "phase_derive_shapes": 0, - "shape": 169, + "shape": 162, "phase_prune_and_rank": 0, - "bind": 84, - "phase_bind": 9, + "bind": 99, + "phase_bind": 11, "phase_settle": 8, "phase_place_bindings": 1, "phase_facet_requests": 0, - "materialise": 17, - "phase_materialise": 0, - "answer": 9, - "options": 6, - "phase_outcome": 34 + "materialise": 21, + "phase_materialise": 5, + "answer": 11, + "options": 12, + "phase_outcome": 50 } }, "restatement": { @@ -5809,7 +5809,7 @@ "label": "OECD Terms and Conditions" } }, - "coverage_stamp": "45bdd65f2fd33ac77a897180047080d33ed9db812afe0cbb887bf22e2ac52690", + "coverage_stamp": "e6e717ab8c77e84d010915893ede5809e9ecec67929a07cfafbcc2210edfa1eb", "facets": { "provenance": { "basis": "fallback", @@ -6276,7 +6276,7 @@ "label": "disbursement" } ], - "provenance": "measure_elected" + "provenance": "binder" }, { "key": { @@ -6347,7 +6347,7 @@ "start_year": 2015, "end_year": 2015 }, - "capability_version": "cap_9deef72763b45f40", + "capability_version": "cap_88defe77cc79e0c0", "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 45ca40c..3310007 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": "0ba344270784ae9929a369da8acd00b399dfced8", - "recorded_at": "2026-10-24T16:31:56Z" + "dfo_commit": "99e62038ceb4b459c2ac699549076ff123c166aa", + "recorded_at": "2026-10-25T17:37:20Z" }, "call": [ { @@ -36,7 +36,7 @@ "status": 200, "headers": { "content-type": "application/json", - "x-dfo-trace-id": "009afd1dc09e44299c2004e111d17991" + "x-dfo-trace-id": "1af94637ff7043abb23f65b60e28d604" }, "json": { "schema_version": 1, @@ -47,14 +47,14 @@ "extract_skipped": false }, "diagnostics": { - "engine_build": "0ba344270784ae9929a369da8acd00b399dfced8", - "trace_id": "009afd1dc09e44299c2004e111d17991", + "engine_build": "99e62038ceb4b459c2ac699549076ff123c166aa", + "trace_id": "1af94637ff7043abb23f65b60e28d604", "warnings": [], "timing_ms": { - "total": 2627, + "total": 2578, "by_step": { "coverage": 0, - "extract": 1263, + "extract": 1025, "cache_lookup": 0 } }, @@ -62,7 +62,7 @@ "input_tokens": 2239, "output_tokens": 164, "cached_tokens": 842, - "jev_input_tokens": 17402, + "jev_input_tokens": 17398, "jev_output_tokens": 3500 }, "timed_out": false @@ -73,30 +73,30 @@ "variable_text": "GDP", "warnings": [], "timing_ms": { - "total": 1129, + "total": 1276, "by_step": { - "recall": 2, - "phase_resolve_places": 0, + "recall": 1, + "phase_resolve_places": 1, "phase_check_entities": 0, "shape_arcs": 4, - "shape_probe_coverage": 4, - "shape_probe": 151, - "shape_groups": 45, - "shape_labels": 10, - "shape_admission": 1, + "shape_probe_coverage": 17, + "shape_probe": 266, + "shape_groups": 61, + "shape_labels": 12, + "shape_admission": 2, "phase_derive_shapes": 0, - "shape": 407, + "shape": 538, "phase_prune_and_rank": 0, - "bind": 127, - "phase_bind": 10, - "phase_settle": 24, - "phase_place_bindings": 8, + "bind": 153, + "phase_bind": 12, + "phase_settle": 6, + "phase_place_bindings": 12, "phase_facet_requests": 0, - "materialise": 144, - "phase_materialise": 0, - "answer": 185, - "options": 98, - "phase_outcome": 124 + "materialise": 120, + "phase_materialise": 19, + "answer": 172, + "options": 115, + "phase_outcome": 127 } }, "restatement": { @@ -988,7 +988,7 @@ "value": { "ref": { "ref": "FinancialActivities", - "label": "FinancialActivities" + "label": "Financial activities" }, "value_kind": "enum_value" } @@ -1960,7 +1960,7 @@ "start_year": 2015, "end_year": 2015 }, - "capability_version": "cap_9deef72763b45f40", + "capability_version": "cap_88defe77cc79e0c0", "default_reading": { "applied": true, "removed_stat_vars": [ @@ -2879,7 +2879,7 @@ "start_year": 2015, "end_year": 2015 }, - "capability_version": "cap_9deef72763b45f40", + "capability_version": "cap_88defe77cc79e0c0", "default_reading": { "applied": true, "removed_stat_vars": [ @@ -2982,24 +2982,24 @@ "variable_text": "ODA", "warnings": [], "timing_ms": { - "total": 619, + "total": 487, "by_step": { - "recall": 315, + "recall": 1, "phase_resolve_places": 0, "phase_check_entities": 0, - "shape_arcs": 1, - "shape_probe_coverage": 5, - "shape_probe": 107, + "shape_arcs": 3, + "shape_probe_coverage": 10, + "shape_probe": 108, "shape_groups": 3, "shape_labels": 0, "shape_admission": 1, "phase_derive_shapes": 0, - "shape": 196, + "shape": 253, "phase_prune_and_rank": 0, - "bind": 97, + "bind": 218, "phase_bind": 2, - "phase_settle": 9, - "phase_place_bindings": 0 + "phase_settle": 8, + "phase_place_bindings": 5 } }, "rendered_sentence": "Could not tell who is giving and who is receiving among \"G20\", \"Germany\", and \"India\". Put \"from\" or \"to\" before a name.", @@ -3561,7 +3561,7 @@ "status": 200, "headers": { "content-type": "application/json", - "x-dfo-trace-id": "6a837108e9cb4b74b197a33c82a6e92f" + "x-dfo-trace-id": "9296d6d509bb4007ab9b828b29f773db" }, "json": { "schema_version": 1, @@ -3570,11 +3570,11 @@ "extract_skipped": true }, "diagnostics": { - "engine_build": "0ba344270784ae9929a369da8acd00b399dfced8", - "trace_id": "6a837108e9cb4b74b197a33c82a6e92f", + "engine_build": "99e62038ceb4b459c2ac699549076ff123c166aa", + "trace_id": "9296d6d509bb4007ab9b828b29f773db", "warnings": [], "timing_ms": { - "total": 953, + "total": 1192, "by_step": { "coverage": 0 } @@ -3594,19 +3594,19 @@ "variable_text": "GDP", "warnings": [], "timing_ms": { - "total": 847, + "total": 1069, "by_step": { "validate": 0, - "walk": 1, - "reread_arcs": 0, + "walk": 0, + "reread_arcs": 1, "detect_edits": 0, "resolve_survivors": 0, - "shape": 638, + "shape": 829, "bind": 0, - "where_places": 0, - "materialise": 110, + "where_places": 1, + "materialise": 123, "answer": 4, - "options": 94 + "options": 111 } }, "entity_refs": [], @@ -4361,7 +4361,7 @@ "value": { "ref": { "ref": "FinancialActivities", - "label": "FinancialActivities" + "label": "Financial activities" }, "value_kind": "enum_value" } @@ -5121,7 +5121,7 @@ "start_year": 2015, "end_year": 2015 }, - "capability_version": "cap_9deef72763b45f40" + "capability_version": "cap_88defe77cc79e0c0" }, "confidence": "high", "available_at_place": true, @@ -5196,30 +5196,30 @@ "variable_text": "ODA", "warnings": [], "timing_ms": { - "total": 339, + "total": 382, "by_step": { - "recall": 1, - "phase_resolve_places": 1, + "recall": 2, + "phase_resolve_places": 0, "phase_check_entities": 0, - "shape_arcs": 1, - "shape_probe_coverage": 6, - "shape_probe": 95, + "shape_arcs": 2, + "shape_probe_coverage": 7, + "shape_probe": 84, "shape_groups": 3, "shape_labels": 0, - "shape_admission": 1, + "shape_admission": 0, "phase_derive_shapes": 0, - "shape": 169, + "shape": 162, "phase_prune_and_rank": 0, - "bind": 84, - "phase_bind": 9, + "bind": 99, + "phase_bind": 11, "phase_settle": 8, "phase_place_bindings": 1, "phase_facet_requests": 0, - "materialise": 17, - "phase_materialise": 0, - "answer": 9, - "options": 6, - "phase_outcome": 34 + "materialise": 21, + "phase_materialise": 5, + "answer": 11, + "options": 12, + "phase_outcome": 50 } }, "restatement": { @@ -5795,7 +5795,7 @@ "label": "OECD Terms and Conditions" } }, - "coverage_stamp": "45bdd65f2fd33ac77a897180047080d33ed9db812afe0cbb887bf22e2ac52690", + "coverage_stamp": "e6e717ab8c77e84d010915893ede5809e9ecec67929a07cfafbcc2210edfa1eb", "facets": { "provenance": { "basis": "fallback", @@ -6262,7 +6262,7 @@ "label": "disbursement" } ], - "provenance": "measure_elected" + "provenance": "binder" }, { "key": { @@ -6333,7 +6333,7 @@ "start_year": 2015, "end_year": 2015 }, - "capability_version": "cap_9deef72763b45f40", + "capability_version": "cap_88defe77cc79e0c0", "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 61d4757..e713398 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": "6c90259bc5dc43649740c2e47cb555bc" + "x-dfo-trace-id": "355b1d08f8b442af87e20ecc65522a53" }, "json": { "schema_version": 1, @@ -45,8 +45,8 @@ "extract_skipped": true }, "diagnostics": { - "engine_build": "0ba344270784ae9929a369da8acd00b399dfced8", - "trace_id": "6c90259bc5dc43649740c2e47cb555bc", + "engine_build": "99e62038ceb4b459c2ac699549076ff123c166aa", + "trace_id": "355b1d08f8b442af87e20ecc65522a53", "warnings": [], "timing_ms": { "total": 1, @@ -68,9 +68,9 @@ "variable_text": "ODA disbursements", "warnings": [], "timing_ms": { - "total": 115, + "total": 0, "by_step": { - "recall": 115, + "recall": 0, "phase_resolve_places": 0, "phase_check_entities": 0 } @@ -90,6 +90,7 @@ "axis": "where", "segment": "heading", "role": "destination", + "entity_choice": 0, "entity_refs": [], "states": [] }, @@ -204,7 +205,8 @@ "operations": [] } ] - } + }, + "entity_choice": 0 }, { "mentions": [ @@ -233,7 +235,8 @@ "operations": [] } ] - } + }, + "entity_choice": 0 } ] } @@ -255,6 +258,7 @@ "axis": "where", "segment": "heading", "role": "destination", + "entity_choice": 0, "entity_refs": [], "states": [], "part_index": 0 @@ -294,7 +298,7 @@ "error": { "class": "ContractError", "code": "contract_violation", - "trace_id": "6c90259bc5dc43649740c2e47cb555bc" + "trace_id": "355b1d08f8b442af87e20ecc65522a53" } } ] 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 f2c90c7..b74ea9b 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": "6c90259bc5dc43649740c2e47cb555bc" + "x-dfo-trace-id": "355b1d08f8b442af87e20ecc65522a53" }, "json": { "schema_version": 1, @@ -45,8 +45,8 @@ "extract_skipped": true }, "diagnostics": { - "engine_build": "0ba344270784ae9929a369da8acd00b399dfced8", - "trace_id": "6c90259bc5dc43649740c2e47cb555bc", + "engine_build": "99e62038ceb4b459c2ac699549076ff123c166aa", + "trace_id": "355b1d08f8b442af87e20ecc65522a53", "warnings": [], "timing_ms": { "total": 1, @@ -68,9 +68,9 @@ "variable_text": "ODA disbursements", "warnings": [], "timing_ms": { - "total": 115, + "total": 0, "by_step": { - "recall": 115, + "recall": 0, "phase_resolve_places": 0, "phase_check_entities": 0 } @@ -90,6 +90,7 @@ "axis": "where", "segment": "heading", "role": "destination", + "entity_choice": 0, "entity_refs": [], "states": [] }, @@ -163,7 +164,8 @@ "mentions": [ "Congo" ], - "label": "Congo [DRC]" + "label": "Congo [DRC]", + "entity_choice": 0 }, { "mentions": [ @@ -192,7 +194,8 @@ "operations": [] } ] - } + }, + "entity_choice": 0 } ] } @@ -214,6 +217,7 @@ "axis": "where", "segment": "heading", "role": "destination", + "entity_choice": 0, "entity_refs": [], "states": [], "part_index": 0 @@ -253,7 +257,7 @@ "error": { "class": "ContractError", "code": "contract_violation", - "trace_id": "6c90259bc5dc43649740c2e47cb555bc" + "trace_id": "355b1d08f8b442af87e20ecc65522a53" } } ] 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 926c0bb..4cbeded 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": "0ba344270784ae9929a369da8acd00b399dfced8", - "recorded_at": "2026-10-24T16:31:31Z" + "dfo_commit": "99e62038ceb4b459c2ac699549076ff123c166aa", + "recorded_at": "2026-10-25T17:36:53Z" }, "call": [ { @@ -36,7 +36,7 @@ "status": 200, "headers": { "content-type": "application/json", - "x-dfo-trace-id": "79f55e76540244d18a4543d497614a89" + "x-dfo-trace-id": "0707e7de12594b1ba74a37d203724685" }, "json": { "schema_version": 1, @@ -47,14 +47,14 @@ "extract_skipped": true }, "diagnostics": { - "engine_build": "0ba344270784ae9929a369da8acd00b399dfced8", - "trace_id": "79f55e76540244d18a4543d497614a89", + "engine_build": "99e62038ceb4b459c2ac699549076ff123c166aa", + "trace_id": "0707e7de12594b1ba74a37d203724685", "warnings": [], "timing_ms": { "total": 1, "by_step": { "coverage": 0, - "response_cache_layer1": 1 + "response_cache_layer1": 0 } }, "llm_usage": { @@ -70,9 +70,9 @@ "variable_text": "ODA disbursements", "warnings": [], "timing_ms": { - "total": 115, + "total": 0, "by_step": { - "recall": 115, + "recall": 0, "phase_resolve_places": 0, "phase_check_entities": 0 } @@ -92,6 +92,7 @@ "axis": "where", "segment": "heading", "role": "destination", + "entity_choice": 0, "entity_refs": [], "states": [] }, @@ -188,7 +189,8 @@ "operations": [] } ] - } + }, + "entity_choice": 0 }, { "mentions": [ @@ -217,7 +219,8 @@ "operations": [] } ] - } + }, + "entity_choice": 0 } ] } @@ -239,6 +242,7 @@ "axis": "where", "segment": "heading", "role": "destination", + "entity_choice": 0, "entity_refs": [], "states": [], "part_index": 0 @@ -291,7 +295,7 @@ "status": 200, "headers": { "content-type": "application/json", - "x-dfo-trace-id": "0a622ff00fe449c19cedbae4fd61f52b" + "x-dfo-trace-id": "14b26656d2d24a659512948ba4a02e77" }, "json": { "schema_version": 1, @@ -300,8 +304,8 @@ "extract_skipped": true }, "diagnostics": { - "engine_build": "0ba344270784ae9929a369da8acd00b399dfced8", - "trace_id": "0a622ff00fe449c19cedbae4fd61f52b", + "engine_build": "99e62038ceb4b459c2ac699549076ff123c166aa", + "trace_id": "14b26656d2d24a659512948ba4a02e77", "warnings": [], "timing_ms": { "total": 3, @@ -329,30 +333,30 @@ } ], "timing_ms": { - "total": 907, + "total": 3410, "by_step": { "recall": 0, "phase_resolve_places": 0, "phase_check_entities": 0, "shape_arcs": 1, - "shape_probe_coverage": 6, - "shape_probe": 109, - "shape_groups": 41, + "shape_probe_coverage": 7, + "shape_probe": 2417, + "shape_groups": 58, "shape_labels": 1, - "shape_admission": 1, + "shape_admission": 0, "phase_derive_shapes": 0, - "shape": 387, + "shape": 2795, "phase_prune_and_rank": 0, - "bind": 111, - "phase_bind": 175, + "bind": 138, + "phase_bind": 188, "phase_settle": 9, - "phase_place_bindings": 67, + "phase_place_bindings": 80, "phase_facet_requests": 0, - "materialise": 15, - "phase_materialise": 0, + "materialise": 17, + "phase_materialise": 6, "answer": 10, - "options": 13, - "phase_outcome": 120 + "options": 6, + "phase_outcome": 161 } }, "restatement": { @@ -756,7 +760,7 @@ "label": "OECD Terms and Conditions" } }, - "coverage_stamp": "45bdd65f2fd33ac77a897180047080d33ed9db812afe0cbb887bf22e2ac52690", + "coverage_stamp": "e6e717ab8c77e84d010915893ede5809e9ecec67929a07cfafbcc2210edfa1eb", "facets": { "provenance": { "basis": "fallback", @@ -1210,7 +1214,7 @@ "start_year": 2018, "end_year": 2018 }, - "capability_version": "cap_9deef72763b45f40", + "capability_version": "cap_88defe77cc79e0c0", "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 81ed866..bcceba0 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": "0ba344270784ae9929a369da8acd00b399dfced8", - "recorded_at": "2026-10-24T16:31:30Z" + "dfo_commit": "99e62038ceb4b459c2ac699549076ff123c166aa", + "recorded_at": "2026-10-25T17:36:49Z" }, "call": [ { @@ -35,7 +35,7 @@ "status": 200, "headers": { "content-type": "application/json", - "x-dfo-trace-id": "6c90259bc5dc43649740c2e47cb555bc" + "x-dfo-trace-id": "355b1d08f8b442af87e20ecc65522a53" }, "json": { "schema_version": 1, @@ -46,8 +46,8 @@ "extract_skipped": true }, "diagnostics": { - "engine_build": "0ba344270784ae9929a369da8acd00b399dfced8", - "trace_id": "6c90259bc5dc43649740c2e47cb555bc", + "engine_build": "99e62038ceb4b459c2ac699549076ff123c166aa", + "trace_id": "355b1d08f8b442af87e20ecc65522a53", "warnings": [], "timing_ms": { "total": 1, @@ -69,9 +69,9 @@ "variable_text": "ODA disbursements", "warnings": [], "timing_ms": { - "total": 115, + "total": 0, "by_step": { - "recall": 115, + "recall": 0, "phase_resolve_places": 0, "phase_check_entities": 0 } @@ -91,6 +91,7 @@ "axis": "where", "segment": "heading", "role": "destination", + "entity_choice": 0, "entity_refs": [], "states": [] }, @@ -187,7 +188,8 @@ "operations": [] } ] - } + }, + "entity_choice": 0 }, { "mentions": [ @@ -216,7 +218,8 @@ "operations": [] } ] - } + }, + "entity_choice": 0 } ] } @@ -238,6 +241,7 @@ "axis": "where", "segment": "heading", "role": "destination", + "entity_choice": 0, "entity_refs": [], "states": [], "part_index": 0 @@ -290,7 +294,7 @@ "status": 200, "headers": { "content-type": "application/json", - "x-dfo-trace-id": "67793b9246794fc18d48484eb317d58f" + "x-dfo-trace-id": "13f7792a23294f7b929699cddc6d7713" }, "json": { "schema_version": 1, @@ -299,11 +303,11 @@ "extract_skipped": true }, "diagnostics": { - "engine_build": "0ba344270784ae9929a369da8acd00b399dfced8", - "trace_id": "67793b9246794fc18d48484eb317d58f", + "engine_build": "99e62038ceb4b459c2ac699549076ff123c166aa", + "trace_id": "13f7792a23294f7b929699cddc6d7713", "warnings": [], "timing_ms": { - "total": 932, + "total": 3414, "by_step": { "coverage": 0 } @@ -329,30 +333,30 @@ } ], "timing_ms": { - "total": 907, + "total": 3410, "by_step": { "recall": 0, "phase_resolve_places": 0, "phase_check_entities": 0, "shape_arcs": 1, - "shape_probe_coverage": 6, - "shape_probe": 109, - "shape_groups": 41, + "shape_probe_coverage": 7, + "shape_probe": 2417, + "shape_groups": 58, "shape_labels": 1, - "shape_admission": 1, + "shape_admission": 0, "phase_derive_shapes": 0, - "shape": 387, + "shape": 2795, "phase_prune_and_rank": 0, - "bind": 111, - "phase_bind": 175, + "bind": 138, + "phase_bind": 188, "phase_settle": 9, - "phase_place_bindings": 67, + "phase_place_bindings": 80, "phase_facet_requests": 0, - "materialise": 15, - "phase_materialise": 0, + "materialise": 17, + "phase_materialise": 6, "answer": 10, - "options": 13, - "phase_outcome": 120 + "options": 6, + "phase_outcome": 161 } }, "restatement": { @@ -756,7 +760,7 @@ "label": "OECD Terms and Conditions" } }, - "coverage_stamp": "45bdd65f2fd33ac77a897180047080d33ed9db812afe0cbb887bf22e2ac52690", + "coverage_stamp": "e6e717ab8c77e84d010915893ede5809e9ecec67929a07cfafbcc2210edfa1eb", "facets": { "provenance": { "basis": "fallback", @@ -1210,7 +1214,7 @@ "start_year": 2018, "end_year": 2018 }, - "capability_version": "cap_9deef72763b45f40", + "capability_version": "cap_88defe77cc79e0c0", "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 4ba7c6a..90c4d22 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": "0ba344270784ae9929a369da8acd00b399dfced8", - "recorded_at": "2026-10-24T16:31:32Z" + "dfo_commit": "99e62038ceb4b459c2ac699549076ff123c166aa", + "recorded_at": "2026-10-25T17:36:53Z" }, "call": [ { @@ -36,7 +36,7 @@ "status": 200, "headers": { "content-type": "application/json", - "x-dfo-trace-id": "a49188b7f477461e9942a92b389f8671" + "x-dfo-trace-id": "76714f7f2e6c422cb6ed291c6100849e" }, "json": { "schema_version": 1, @@ -47,8 +47,8 @@ "extract_skipped": true }, "diagnostics": { - "engine_build": "0ba344270784ae9929a369da8acd00b399dfced8", - "trace_id": "a49188b7f477461e9942a92b389f8671", + "engine_build": "99e62038ceb4b459c2ac699549076ff123c166aa", + "trace_id": "76714f7f2e6c422cb6ed291c6100849e", "warnings": [], "timing_ms": { "total": 1, @@ -72,8 +72,8 @@ "timing_ms": { "total": 1, "by_step": { - "recall": 1, - "phase_resolve_places": 0, + "recall": 0, + "phase_resolve_places": 1, "phase_check_entities": 0 } }, @@ -92,6 +92,7 @@ "axis": "where", "segment": "heading", "role": "destination", + "entity_choice": 0, "entity_refs": [], "states": [] }, @@ -199,7 +200,8 @@ "operations": [] } ] - } + }, + "entity_choice": 0 }, { "mentions": [ @@ -232,7 +234,8 @@ "operations": [] } ] - } + }, + "entity_choice": 0 } ] } @@ -263,6 +266,7 @@ "axis": "where", "segment": "heading", "role": "destination", + "entity_choice": 0, "entity_refs": [], "states": [] }, @@ -370,7 +374,8 @@ "operations": [] } ] - } + }, + "entity_choice": 0 }, { "mentions": [ @@ -403,7 +408,8 @@ "operations": [] } ] - } + }, + "entity_choice": 0 } ] } @@ -424,6 +430,7 @@ "axis": "where", "segment": "heading", "role": "destination", + "entity_choice": 0, "entity_refs": [], "states": [] }, @@ -503,7 +510,7 @@ "status": 200, "headers": { "content-type": "application/json", - "x-dfo-trace-id": "e4482a207d27410a9a03cb6f915ae3df" + "x-dfo-trace-id": "538d2ec3169d4007a41b9969bb6d11ae" }, "json": { "schema_version": 1, @@ -512,11 +519,11 @@ "extract_skipped": true }, "diagnostics": { - "engine_build": "0ba344270784ae9929a369da8acd00b399dfced8", - "trace_id": "e4482a207d27410a9a03cb6f915ae3df", + "engine_build": "99e62038ceb4b459c2ac699549076ff123c166aa", + "trace_id": "538d2ec3169d4007a41b9969bb6d11ae", "warnings": [], "timing_ms": { - "total": 984, + "total": 1883, "by_step": { "coverage": 0 } @@ -542,9 +549,9 @@ } ], "timing_ms": { - "total": 1, + "total": 2, "by_step": { - "recall": 1, + "recall": 2, "phase_resolve_places": 0, "phase_check_entities": 0 } @@ -564,6 +571,7 @@ "axis": "where", "segment": "heading", "role": "destination", + "entity_choice": 0, "entity_refs": [], "states": [] }, @@ -671,7 +679,8 @@ "operations": [] } ] - } + }, + "entity_choice": 0 }, { "mentions": [ @@ -704,7 +713,8 @@ "operations": [] } ] - } + }, + "entity_choice": 0 } ] } @@ -724,30 +734,30 @@ } ], "timing_ms": { - "total": 980, + "total": 1878, "by_step": { - "recall": 1, + "recall": 2, "phase_resolve_places": 0, "phase_check_entities": 0, "shape_arcs": 1, - "shape_probe_coverage": 6, - "shape_probe": 84, - "shape_groups": 40, + "shape_probe_coverage": 8, + "shape_probe": 828, + "shape_groups": 58, "shape_labels": 1, "shape_admission": 0, "phase_derive_shapes": 0, - "shape": 402, + "shape": 1252, "phase_prune_and_rank": 0, - "bind": 106, - "phase_bind": 230, + "bind": 92, + "phase_bind": 235, "phase_settle": 9, - "phase_place_bindings": 83, + "phase_place_bindings": 88, "phase_facet_requests": 0, - "materialise": 13, - "phase_materialise": 0, - "answer": 7, - "options": 6, - "phase_outcome": 123 + "materialise": 16, + "phase_materialise": 6, + "answer": 10, + "options": 7, + "phase_outcome": 161 } }, "restatement": { @@ -1160,7 +1170,7 @@ "label": "OECD Terms and Conditions" } }, - "coverage_stamp": "45bdd65f2fd33ac77a897180047080d33ed9db812afe0cbb887bf22e2ac52690", + "coverage_stamp": "e6e717ab8c77e84d010915893ede5809e9ecec67929a07cfafbcc2210edfa1eb", "facets": { "provenance": { "basis": "fallback", @@ -1633,7 +1643,7 @@ "selected": [] } ], - "capability_version": "cap_9deef72763b45f40", + "capability_version": "cap_88defe77cc79e0c0", "default_reading": { "applied": true, "removed_stat_vars": [] @@ -3788,6 +3798,7 @@ "axis": "where", "segment": "heading", "role": "destination", + "entity_choice": 0, "entity_refs": [], "states": [], "part_index": 0 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 0c8ad89..7c2274c 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": "009afd1dc09e44299c2004e111d17991" + "x-dfo-trace-id": "1af94637ff7043abb23f65b60e28d604" }, "json": { "schema_version": 1, @@ -46,14 +46,14 @@ "extract_skipped": false }, "diagnostics": { - "engine_build": "0ba344270784ae9929a369da8acd00b399dfced8", - "trace_id": "009afd1dc09e44299c2004e111d17991", + "engine_build": "99e62038ceb4b459c2ac699549076ff123c166aa", + "trace_id": "1af94637ff7043abb23f65b60e28d604", "warnings": [], "timing_ms": { - "total": 2627, + "total": 2578, "by_step": { "coverage": 0, - "extract": 1263, + "extract": 1025, "cache_lookup": 0 } }, @@ -61,7 +61,7 @@ "input_tokens": 2239, "output_tokens": 164, "cached_tokens": 842, - "jev_input_tokens": 17402, + "jev_input_tokens": 17398, "jev_output_tokens": 3500 }, "timed_out": false @@ -72,30 +72,30 @@ "variable_text": "GDP", "warnings": [], "timing_ms": { - "total": 1129, + "total": 1276, "by_step": { - "recall": 2, - "phase_resolve_places": 0, + "recall": 1, + "phase_resolve_places": 1, "phase_check_entities": 0, "shape_arcs": 4, - "shape_probe_coverage": 4, - "shape_probe": 151, - "shape_groups": 45, - "shape_labels": 10, - "shape_admission": 1, + "shape_probe_coverage": 17, + "shape_probe": 266, + "shape_groups": 61, + "shape_labels": 12, + "shape_admission": 2, "phase_derive_shapes": 0, - "shape": 407, + "shape": 538, "phase_prune_and_rank": 0, - "bind": 127, - "phase_bind": 10, - "phase_settle": 24, - "phase_place_bindings": 8, + "bind": 153, + "phase_bind": 12, + "phase_settle": 6, + "phase_place_bindings": 12, "phase_facet_requests": 0, - "materialise": 144, - "phase_materialise": 0, - "answer": 185, - "options": 98, - "phase_outcome": 124 + "materialise": 120, + "phase_materialise": 19, + "answer": 172, + "options": 115, + "phase_outcome": 127 } }, "entity_refs": [ @@ -157,24 +157,24 @@ "variable_text": "ODA", "warnings": [], "timing_ms": { - "total": 619, + "total": 487, "by_step": { - "recall": 315, + "recall": 1, "phase_resolve_places": 0, "phase_check_entities": 0, - "shape_arcs": 1, - "shape_probe_coverage": 5, - "shape_probe": 107, + "shape_arcs": 3, + "shape_probe_coverage": 10, + "shape_probe": 108, "shape_groups": 3, "shape_labels": 0, "shape_admission": 1, "phase_derive_shapes": 0, - "shape": 196, + "shape": 253, "phase_prune_and_rank": 0, - "bind": 97, + "bind": 218, "phase_bind": 2, - "phase_settle": 9, - "phase_place_bindings": 0 + "phase_settle": 8, + "phase_place_bindings": 5 } }, "rendered_sentence": "Could not tell who is giving and who is receiving among \"G20\", \"Germany\", and \"India\". Put \"from\" or \"to\" before a name.", @@ -660,7 +660,7 @@ "status": 200, "headers": { "content-type": "application/json", - "x-dfo-trace-id": "6a837108e9cb4b74b197a33c82a6e92f" + "x-dfo-trace-id": "9296d6d509bb4007ab9b828b29f773db" }, "json": { "schema_version": 1, @@ -669,11 +669,11 @@ "extract_skipped": true }, "diagnostics": { - "engine_build": "0ba344270784ae9929a369da8acd00b399dfced8", - "trace_id": "6a837108e9cb4b74b197a33c82a6e92f", + "engine_build": "99e62038ceb4b459c2ac699549076ff123c166aa", + "trace_id": "9296d6d509bb4007ab9b828b29f773db", "warnings": [], "timing_ms": { - "total": 953, + "total": 1192, "by_step": { "coverage": 0 } @@ -693,19 +693,19 @@ "variable_text": "GDP", "warnings": [], "timing_ms": { - "total": 847, + "total": 1069, "by_step": { "validate": 0, - "walk": 1, - "reread_arcs": 0, + "walk": 0, + "reread_arcs": 1, "detect_edits": 0, "resolve_survivors": 0, - "shape": 638, + "shape": 829, "bind": 0, - "where_places": 0, - "materialise": 110, + "where_places": 1, + "materialise": 123, "answer": 4, - "options": 94 + "options": 111 } }, "entity_refs": [], @@ -1460,7 +1460,7 @@ "value": { "ref": { "ref": "FinancialActivities", - "label": "FinancialActivities" + "label": "Financial activities" }, "value_kind": "enum_value" } @@ -2220,7 +2220,7 @@ "start_year": 2015, "end_year": 2015 }, - "capability_version": "cap_9deef72763b45f40" + "capability_version": "cap_88defe77cc79e0c0" }, "confidence": "high", "available_at_place": true, @@ -2295,30 +2295,30 @@ "variable_text": "ODA", "warnings": [], "timing_ms": { - "total": 339, + "total": 382, "by_step": { - "recall": 1, - "phase_resolve_places": 1, + "recall": 2, + "phase_resolve_places": 0, "phase_check_entities": 0, - "shape_arcs": 1, - "shape_probe_coverage": 6, - "shape_probe": 95, + "shape_arcs": 2, + "shape_probe_coverage": 7, + "shape_probe": 84, "shape_groups": 3, "shape_labels": 0, - "shape_admission": 1, + "shape_admission": 0, "phase_derive_shapes": 0, - "shape": 169, + "shape": 162, "phase_prune_and_rank": 0, - "bind": 84, - "phase_bind": 9, + "bind": 99, + "phase_bind": 11, "phase_settle": 8, "phase_place_bindings": 1, "phase_facet_requests": 0, - "materialise": 17, - "phase_materialise": 0, - "answer": 9, - "options": 6, - "phase_outcome": 34 + "materialise": 21, + "phase_materialise": 5, + "answer": 11, + "options": 12, + "phase_outcome": 50 } }, "restatement": { @@ -2894,7 +2894,7 @@ "label": "OECD Terms and Conditions" } }, - "coverage_stamp": "45bdd65f2fd33ac77a897180047080d33ed9db812afe0cbb887bf22e2ac52690", + "coverage_stamp": "e6e717ab8c77e84d010915893ede5809e9ecec67929a07cfafbcc2210edfa1eb", "facets": { "provenance": { "basis": "fallback", @@ -3361,7 +3361,7 @@ "label": "disbursement" } ], - "provenance": "measure_elected" + "provenance": "binder" }, { "key": { @@ -3432,7 +3432,7 @@ "start_year": 2015, "end_year": 2015 }, - "capability_version": "cap_9deef72763b45f40", + "capability_version": "cap_88defe77cc79e0c0", "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 17760cf..4c62233 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": "1e95940d311043d0b63bd27a87996439" + "x-dfo-trace-id": "38ca03326c514418af8164d5740ec677" }, "json": { "schema_version": 1, @@ -46,21 +46,21 @@ "extract_skipped": false }, "diagnostics": { - "engine_build": "0ba344270784ae9929a369da8acd00b399dfced8", - "trace_id": "1e95940d311043d0b63bd27a87996439", + "engine_build": "99e62038ceb4b459c2ac699549076ff123c166aa", + "trace_id": "38ca03326c514418af8164d5740ec677", "warnings": [], "timing_ms": { - "total": 2200, + "total": 492, "by_step": { "coverage": 0, - "extract": 1432, + "extract": 1, "cache_lookup": 0 } }, "llm_usage": { - "input_tokens": 2232, - "output_tokens": 103, - "cached_tokens": 841, + "input_tokens": 0, + "output_tokens": 0, + "cached_tokens": 0, "jev_input_tokens": 5250, "jev_output_tokens": 1104 }, @@ -72,30 +72,30 @@ "variable_text": "debt service", "warnings": [], "timing_ms": { - "total": 757, + "total": 486, "by_step": { - "recall": 316, + "recall": 0, "phase_resolve_places": 0, "phase_check_entities": 0, "shape_arcs": 2, - "shape_probe_coverage": 8, - "shape_probe": 72, - "shape_groups": 5, - "shape_labels": 10, + "shape_probe_coverage": 15, + "shape_probe": 105, + "shape_groups": 7, + "shape_labels": 11, "shape_admission": 0, "phase_derive_shapes": 0, - "shape": 179, + "shape": 219, "phase_prune_and_rank": 0, - "bind": 89, - "phase_bind": 10, - "phase_settle": 13, + "bind": 112, + "phase_bind": 14, + "phase_settle": 5, "phase_place_bindings": 12, "phase_facet_requests": 0, - "materialise": 9, - "phase_materialise": 0, - "answer": 1, - "options": 79, - "phase_outcome": 49 + "materialise": 11, + "phase_materialise": 23, + "answer": 2, + "options": 8, + "phase_outcome": 80 } }, "restatement": { @@ -570,7 +570,7 @@ "label": "Creative Commons Attribution License" } }, - "coverage_stamp": "45bdd65f2fd33ac77a897180047080d33ed9db812afe0cbb887bf22e2ac52690", + "coverage_stamp": "e6e717ab8c77e84d010915893ede5809e9ecec67929a07cfafbcc2210edfa1eb", "facets": { "provenance": { "basis": "fallback", @@ -1288,7 +1288,7 @@ } ], "query_qualifiers": [], - "capability_version": "cap_9deef72763b45f40", + "capability_version": "cap_88defe77cc79e0c0", "default_reading": { "applied": true, "removed_stat_vars": [] @@ -3273,18 +3273,18 @@ "variable_text": "price of tea", "warnings": [], "timing_ms": { - "total": 330, + "total": 100, "by_step": { - "recall": 216, - "phase_resolve_places": 1, + "recall": 0, + "phase_resolve_places": 0, "phase_check_entities": 0, - "shape_arcs": 1, - "shape_probe": 108, - "shape_groups": 2, + "shape_arcs": 2, + "shape_probe": 91, + "shape_groups": 1, "shape_labels": 0, - "shape_admission": 0, + "shape_admission": 1, "phase_derive_shapes": 0, - "shape": 113, + "shape": 100, "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 e8343b6..3925160 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": "4b576ea3cd364ddeb664b3b219dffb19" + "x-dfo-trace-id": "4fae4e9b2aac46e181137e1a5933cad9" }, "json": { "schema_version": 1, @@ -46,14 +46,14 @@ "extract_skipped": false }, "diagnostics": { - "engine_build": "0ba344270784ae9929a369da8acd00b399dfced8", - "trace_id": "4b576ea3cd364ddeb664b3b219dffb19", + "engine_build": "99e62038ceb4b459c2ac699549076ff123c166aa", + "trace_id": "4fae4e9b2aac46e181137e1a5933cad9", "warnings": [], "timing_ms": { - "total": 1260, + "total": 1079, "by_step": { "coverage": 0, - "extract": 1255, + "extract": 1073, "cache_lookup": 0 } }, @@ -72,8 +72,8 @@ "timing_ms": { "total": 1, "by_step": { - "recall": 1, - "phase_resolve_places": 0, + "recall": 0, + "phase_resolve_places": 1, "phase_check_entities": 0 } }, @@ -92,6 +92,7 @@ "axis": "where", "segment": "heading", "role": "destination", + "entity_choice": 0, "entity_refs": [], "states": [] }, @@ -199,7 +200,8 @@ "operations": [] } ] - } + }, + "entity_choice": 0 }, { "mentions": [ @@ -232,7 +234,8 @@ "operations": [] } ] - } + }, + "entity_choice": 0 } ] } @@ -263,6 +266,7 @@ "axis": "where", "segment": "heading", "role": "destination", + "entity_choice": 0, "entity_refs": [], "states": [] }, @@ -370,7 +374,8 @@ "operations": [] } ] - } + }, + "entity_choice": 0 }, { "mentions": [ @@ -403,7 +408,8 @@ "operations": [] } ] - } + }, + "entity_choice": 0 } ] } @@ -424,6 +430,7 @@ "axis": "where", "segment": "heading", "role": "destination", + "entity_choice": 0, "entity_refs": [], "states": [] }, 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 f77a9d9..faca1e0 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": "bf6613bf82be4bddb4d60879aaf907d9" + "x-dfo-trace-id": "7abc6f06215b4187a4280d87d6f8a51a" }, "json": { "schema_version": 1, @@ -42,26 +42,23 @@ "entry_path": "raw_text", "raw_query": "ODA disbursements from Germany to Nigeria for basic health care", "normalized_query": "ODA disbursements from Germany to Nigeria for basic health care", - "extract_skipped": false + "extract_skipped": true }, "diagnostics": { - "engine_build": "0ba344270784ae9929a369da8acd00b399dfced8", - "trace_id": "bf6613bf82be4bddb4d60879aaf907d9", + "engine_build": "99e62038ceb4b459c2ac699549076ff123c166aa", + "trace_id": "7abc6f06215b4187a4280d87d6f8a51a", "warnings": [], "timing_ms": { - "total": 2620, + "total": 3, "by_step": { "coverage": 0, - "extract": 1068, - "cache_lookup": 0 + "response_cache_layer1": 1 } }, "llm_usage": { - "input_tokens": 2231, - "output_tokens": 102, - "cached_tokens": 841, - "jev_input_tokens": 6586, - "jev_output_tokens": 2060 + "input_tokens": 0, + "output_tokens": 0, + "cached_tokens": 0 }, "timed_out": false }, @@ -71,30 +68,30 @@ "variable_text": "ODA disbursements for basic health care", "warnings": [], "timing_ms": { - "total": 1548, + "total": 1669, "by_step": { - "recall": 437, + "recall": 397, "phase_resolve_places": 0, "phase_check_entities": 0, - "shape_arcs": 2, + "shape_arcs": 1, "shape_probe_coverage": 4, - "shape_probe": 161, - "shape_groups": 45, + "shape_probe": 115, + "shape_groups": 53, "shape_labels": 1, - "shape_admission": 3, + "shape_admission": 1, "phase_derive_shapes": 0, - "shape": 326, + "shape": 276, "phase_prune_and_rank": 0, - "bind": 225, - "phase_bind": 158, - "phase_settle": 56, - "phase_place_bindings": 18, + "bind": 214, + "phase_bind": 203, + "phase_settle": 45, + "phase_place_bindings": 20, "phase_facet_requests": 0, - "materialise": 41, - "phase_materialise": 0, - "answer": 186, - "options": 40, - "phase_outcome": 61 + "materialise": 28, + "phase_materialise": 196, + "answer": 145, + "options": 50, + "phase_outcome": 95 } }, "restatement": { @@ -541,7 +538,7 @@ "label": "OECD Terms and Conditions" } }, - "coverage_stamp": "45bdd65f2fd33ac77a897180047080d33ed9db812afe0cbb887bf22e2ac52690", + "coverage_stamp": "e6e717ab8c77e84d010915893ede5809e9ecec67929a07cfafbcc2210edfa1eb", "facets": { "provenance": { "basis": "fallback", @@ -1194,7 +1191,7 @@ "selected": [] } ], - "capability_version": "cap_9deef72763b45f40", + "capability_version": "cap_88defe77cc79e0c0", "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 1ec2f9f..65fbbea 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": "304fe92b998b45849ff11a547aadc3e8" + "x-dfo-trace-id": "7fd4a5b5b50648999f5ead8966bcc02c" }, "json": { "schema_version": 1, @@ -45,14 +45,14 @@ "extract_skipped": false }, "diagnostics": { - "engine_build": "0ba344270784ae9929a369da8acd00b399dfced8", - "trace_id": "304fe92b998b45849ff11a547aadc3e8", + "engine_build": "99e62038ceb4b459c2ac699549076ff123c166aa", + "trace_id": "7fd4a5b5b50648999f5ead8966bcc02c", "warnings": [], "timing_ms": { - "total": 1416, + "total": 1054, "by_step": { "coverage": 0, - "extract": 1297, + "extract": 1050, "cache_lookup": 0 } }, @@ -69,9 +69,9 @@ "variable_text": "ODA disbursements", "warnings": [], "timing_ms": { - "total": 115, + "total": 0, "by_step": { - "recall": 115, + "recall": 0, "phase_resolve_places": 0, "phase_check_entities": 0 } @@ -91,6 +91,7 @@ "axis": "where", "segment": "heading", "role": "destination", + "entity_choice": 0, "entity_refs": [], "states": [] }, @@ -178,6 +179,7 @@ "axis": "where", "segment": "heading", "role": "destination", + "entity_choice": 0, "entity_refs": [], "states": [], "part_index": 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 ac800b2..0e8b742 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": "21bb19c92c824a70b2eb378e85a9cfd0" + "x-dfo-trace-id": "962188ce8826466e8510fb819d5dc26d" }, "json": { "schema_version": 1, @@ -45,21 +45,21 @@ "extract_skipped": false }, "diagnostics": { - "engine_build": "0ba344270784ae9929a369da8acd00b399dfced8", - "trace_id": "21bb19c92c824a70b2eb378e85a9cfd0", + "engine_build": "99e62038ceb4b459c2ac699549076ff123c166aa", + "trace_id": "962188ce8826466e8510fb819d5dc26d", "warnings": [], "timing_ms": { - "total": 8287, + "total": 1710, "by_step": { "coverage": 0, - "extract": 1330, - "cache_lookup": 2 + "extract": 0, + "cache_lookup": 0 } }, "llm_usage": { - "input_tokens": 2237, - "output_tokens": 143, - "cached_tokens": 842, + "input_tokens": 0, + "output_tokens": 0, + "cached_tokens": 0, "jev_input_tokens": 13358, "jev_output_tokens": 2855 }, @@ -71,28 +71,28 @@ "variable_text": "mortality", "warnings": [], "timing_ms": { - "total": 6951, + "total": 1705, "by_step": { - "recall": 261, + "recall": 1, "phase_resolve_places": 0, "phase_check_entities": 0, - "shape_arcs": 7, - "shape_probe": 122, + "shape_arcs": 4, + "shape_probe": 2, "shape_groups": 6, "shape_labels": 1, "shape_admission": 1, "phase_derive_shapes": 0, - "shape": 241, + "shape": 119, "phase_prune_and_rank": 0, - "bind": 142, - "phase_bind": 17, - "phase_settle": 6, - "phase_place_bindings": 490, + "bind": 146, + "phase_bind": 19, + "phase_settle": 2, + "phase_place_bindings": 30, "phase_facet_requests": 0, - "materialise": 115, - "phase_materialise": 1, - "answer": 243, - "phase_outcome": 5435 + "materialise": 21, + "phase_materialise": 25, + "answer": 30, + "phase_outcome": 1312 } }, "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_9deef72763b45f40", + "capability_version": "cap_88defe77cc79e0c0", "default_reading": { "applied": true, "removed_stat_vars": [] @@ -2348,7 +2348,7 @@ "start_year": 2013, "end_year": 2022 }, - "capability_version": "cap_9deef72763b45f40", + "capability_version": "cap_88defe77cc79e0c0", "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 07027a2..e2e8436 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": "009afd1dc09e44299c2004e111d17991" + "x-dfo-trace-id": "1af94637ff7043abb23f65b60e28d604" }, "json": { "schema_version": 1, @@ -46,14 +46,14 @@ "extract_skipped": false }, "diagnostics": { - "engine_build": "0ba344270784ae9929a369da8acd00b399dfced8", - "trace_id": "009afd1dc09e44299c2004e111d17991", + "engine_build": "99e62038ceb4b459c2ac699549076ff123c166aa", + "trace_id": "1af94637ff7043abb23f65b60e28d604", "warnings": [], "timing_ms": { - "total": 2627, + "total": 2578, "by_step": { "coverage": 0, - "extract": 1263, + "extract": 1025, "cache_lookup": 0 } }, @@ -61,7 +61,7 @@ "input_tokens": 2239, "output_tokens": 164, "cached_tokens": 842, - "jev_input_tokens": 17402, + "jev_input_tokens": 17398, "jev_output_tokens": 3500 }, "timed_out": false @@ -71,30 +71,30 @@ { "warnings": [], "timing_ms": { - "total": 1129, + "total": 1276, "by_step": { - "recall": 2, - "phase_resolve_places": 0, + "recall": 1, + "phase_resolve_places": 1, "phase_check_entities": 0, "shape_arcs": 4, - "shape_probe_coverage": 4, - "shape_probe": 151, - "shape_groups": 45, - "shape_labels": 10, - "shape_admission": 1, + "shape_probe_coverage": 17, + "shape_probe": 266, + "shape_groups": 61, + "shape_labels": 12, + "shape_admission": 2, "phase_derive_shapes": 0, - "shape": 407, + "shape": 538, "phase_prune_and_rank": 0, - "bind": 127, - "phase_bind": 10, - "phase_settle": 24, - "phase_place_bindings": 8, + "bind": 153, + "phase_bind": 12, + "phase_settle": 6, + "phase_place_bindings": 12, "phase_facet_requests": 0, - "materialise": 144, - "phase_materialise": 0, - "answer": 185, - "options": 98, - "phase_outcome": 124 + "materialise": 120, + "phase_materialise": 19, + "answer": 172, + "options": 115, + "phase_outcome": 127 } }, "restatement": { @@ -986,7 +986,7 @@ "value": { "ref": { "ref": "FinancialActivities", - "label": "FinancialActivities" + "label": "Financial activities" }, "value_kind": "enum_value" } @@ -1958,7 +1958,7 @@ "start_year": 2015, "end_year": 2015 }, - "capability_version": "cap_9deef72763b45f40", + "capability_version": "cap_88defe77cc79e0c0", "default_reading": { "applied": true, "removed_stat_vars": [ @@ -2877,7 +2877,7 @@ "start_year": 2015, "end_year": 2015 }, - "capability_version": "cap_9deef72763b45f40", + "capability_version": "cap_88defe77cc79e0c0", "default_reading": { "applied": true, "removed_stat_vars": [ @@ -2980,24 +2980,24 @@ "variable_text": "ODA", "warnings": [], "timing_ms": { - "total": 619, + "total": 487, "by_step": { - "recall": 315, + "recall": 1, "phase_resolve_places": 0, "phase_check_entities": 0, - "shape_arcs": 1, - "shape_probe_coverage": 5, - "shape_probe": 107, + "shape_arcs": 3, + "shape_probe_coverage": 10, + "shape_probe": 108, "shape_groups": 3, "shape_labels": 0, "shape_admission": 1, "phase_derive_shapes": 0, - "shape": 196, + "shape": 253, "phase_prune_and_rank": 0, - "bind": 97, + "bind": 218, "phase_bind": 2, - "phase_settle": 9, - "phase_place_bindings": 0 + "phase_settle": 8, + "phase_place_bindings": 5 } }, "rendered_sentence": "Could not tell who is giving and who is receiving among \"G20\", \"Germany\", and \"India\". Put \"from\" or \"to\" before a name.", diff --git a/python/client-contract/src/dfo_client_contract/scenarios/choose-refused-shared-candidate-label.json b/python/client-contract/src/dfo_client_contract/scenarios/choose-refused-shared-candidate-label.json index 91e3f40..4766cec 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": "21bb19c92c824a70b2eb378e85a9cfd0" + "x-dfo-trace-id": "962188ce8826466e8510fb819d5dc26d" }, "json": { "schema_version": 1, @@ -45,21 +45,21 @@ "extract_skipped": false }, "diagnostics": { - "engine_build": "0ba344270784ae9929a369da8acd00b399dfced8", - "trace_id": "21bb19c92c824a70b2eb378e85a9cfd0", + "engine_build": "99e62038ceb4b459c2ac699549076ff123c166aa", + "trace_id": "962188ce8826466e8510fb819d5dc26d", "warnings": [], "timing_ms": { - "total": 8287, + "total": 1710, "by_step": { "coverage": 0, - "extract": 1330, - "cache_lookup": 2 + "extract": 0, + "cache_lookup": 0 } }, "llm_usage": { - "input_tokens": 2237, - "output_tokens": 143, - "cached_tokens": 842, + "input_tokens": 0, + "output_tokens": 0, + "cached_tokens": 0, "jev_input_tokens": 13358, "jev_output_tokens": 2855 }, @@ -71,28 +71,28 @@ "variable_text": "mortality", "warnings": [], "timing_ms": { - "total": 6951, + "total": 1705, "by_step": { - "recall": 261, + "recall": 1, "phase_resolve_places": 0, "phase_check_entities": 0, - "shape_arcs": 7, - "shape_probe": 122, + "shape_arcs": 4, + "shape_probe": 2, "shape_groups": 6, "shape_labels": 1, "shape_admission": 1, "phase_derive_shapes": 0, - "shape": 241, + "shape": 119, "phase_prune_and_rank": 0, - "bind": 142, - "phase_bind": 17, - "phase_settle": 6, - "phase_place_bindings": 490, + "bind": 146, + "phase_bind": 19, + "phase_settle": 2, + "phase_place_bindings": 30, "phase_facet_requests": 0, - "materialise": 115, - "phase_materialise": 1, - "answer": 243, - "phase_outcome": 5435 + "materialise": 21, + "phase_materialise": 25, + "answer": 30, + "phase_outcome": 1312 } }, "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_9deef72763b45f40", + "capability_version": "cap_88defe77cc79e0c0", "default_reading": { "applied": true, "removed_stat_vars": [] @@ -2293,7 +2293,7 @@ "start_year": 2013, "end_year": 2022 }, - "capability_version": "cap_9deef72763b45f40", + "capability_version": "cap_88defe77cc79e0c0", "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 fad67ba..6476e13 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": "0ba344270784ae9929a369da8acd00b399dfced8", - "trace_id": "6c90259bc5dc43649740c2e47cb555bc", + "engine_build": "99e62038ceb4b459c2ac699549076ff123c166aa", + "trace_id": "355b1d08f8b442af87e20ecc65522a53", "warnings": [], "timing_ms": { "total": 1, @@ -68,9 +68,9 @@ "variable_text": "ODA disbursements", "warnings": [], "timing_ms": { - "total": 115, + "total": 0, "by_step": { - "recall": 115, + "recall": 0, "phase_resolve_places": 0, "phase_check_entities": 0 } @@ -90,6 +90,7 @@ "axis": "where", "segment": "heading", "role": "destination", + "entity_choice": 0, "entity_refs": [], "states": [] }, @@ -186,7 +187,8 @@ "operations": [] } ] - } + }, + "entity_choice": 0 }, { "mentions": [ @@ -215,7 +217,8 @@ "operations": [] } ] - } + }, + "entity_choice": 0 } ] } @@ -237,6 +240,7 @@ "axis": "where", "segment": "heading", "role": "destination", + "entity_choice": 0, "entity_refs": [], "states": [], "part_index": 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 ae28288..cf1c0b2 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": "4b576ea3cd364ddeb664b3b219dffb19" + "x-dfo-trace-id": "4fae4e9b2aac46e181137e1a5933cad9" }, "json": { "schema_version": 1, @@ -45,14 +45,14 @@ "extract_skipped": false }, "diagnostics": { - "engine_build": "0ba344270784ae9929a369da8acd00b399dfced8", - "trace_id": "4b576ea3cd364ddeb664b3b219dffb19", + "engine_build": "99e62038ceb4b459c2ac699549076ff123c166aa", + "trace_id": "4fae4e9b2aac46e181137e1a5933cad9", "warnings": [], "timing_ms": { - "total": 1260, + "total": 1079, "by_step": { "coverage": 0, - "extract": 1255, + "extract": 1073, "cache_lookup": 0 } }, @@ -71,8 +71,8 @@ "timing_ms": { "total": 1, "by_step": { - "recall": 1, - "phase_resolve_places": 0, + "recall": 0, + "phase_resolve_places": 1, "phase_check_entities": 0 } }, @@ -91,6 +91,7 @@ "axis": "where", "segment": "heading", "role": "destination", + "entity_choice": 0, "entity_refs": [], "states": [] }, @@ -198,7 +199,8 @@ "operations": [] } ] - } + }, + "entity_choice": 0 }, { "mentions": [ @@ -231,7 +233,8 @@ "operations": [] } ] - } + }, + "entity_choice": 0 } ] } @@ -262,6 +265,7 @@ "axis": "where", "segment": "heading", "role": "destination", + "entity_choice": 0, "entity_refs": [], "states": [] }, @@ -369,7 +373,8 @@ "operations": [] } ] - } + }, + "entity_choice": 0 }, { "mentions": [ @@ -402,7 +407,8 @@ "operations": [] } ] - } + }, + "entity_choice": 0 } ] } @@ -423,6 +429,7 @@ "axis": "where", "segment": "heading", "role": "destination", + "entity_choice": 0, "entity_refs": [], "states": [] }, 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 8a9eadc..3fa6c94 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": "21bb19c92c824a70b2eb378e85a9cfd0" + "x-dfo-trace-id": "962188ce8826466e8510fb819d5dc26d" }, "json": { "schema_version": 1, @@ -45,21 +45,21 @@ "extract_skipped": false }, "diagnostics": { - "engine_build": "0ba344270784ae9929a369da8acd00b399dfced8", - "trace_id": "21bb19c92c824a70b2eb378e85a9cfd0", + "engine_build": "99e62038ceb4b459c2ac699549076ff123c166aa", + "trace_id": "962188ce8826466e8510fb819d5dc26d", "warnings": [], "timing_ms": { - "total": 8287, + "total": 1710, "by_step": { "coverage": 0, - "extract": 1330, - "cache_lookup": 2 + "extract": 0, + "cache_lookup": 0 } }, "llm_usage": { - "input_tokens": 2237, - "output_tokens": 143, - "cached_tokens": 842, + "input_tokens": 0, + "output_tokens": 0, + "cached_tokens": 0, "jev_input_tokens": 13358, "jev_output_tokens": 2855 }, @@ -71,28 +71,28 @@ "variable_text": "mortality", "warnings": [], "timing_ms": { - "total": 6951, + "total": 1705, "by_step": { - "recall": 261, + "recall": 1, "phase_resolve_places": 0, "phase_check_entities": 0, - "shape_arcs": 7, - "shape_probe": 122, + "shape_arcs": 4, + "shape_probe": 2, "shape_groups": 6, "shape_labels": 1, "shape_admission": 1, "phase_derive_shapes": 0, - "shape": 241, + "shape": 119, "phase_prune_and_rank": 0, - "bind": 142, - "phase_bind": 17, - "phase_settle": 6, - "phase_place_bindings": 490, + "bind": 146, + "phase_bind": 19, + "phase_settle": 2, + "phase_place_bindings": 30, "phase_facet_requests": 0, - "materialise": 115, - "phase_materialise": 1, - "answer": 243, - "phase_outcome": 5435 + "materialise": 21, + "phase_materialise": 25, + "answer": 30, + "phase_outcome": 1312 } }, "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_9deef72763b45f40", + "capability_version": "cap_88defe77cc79e0c0", "default_reading": { "applied": true, "removed_stat_vars": [] @@ -2348,7 +2348,7 @@ "start_year": 2013, "end_year": 2022 }, - "capability_version": "cap_9deef72763b45f40", + "capability_version": "cap_88defe77cc79e0c0", "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 e99807c..168b063 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": "304fe92b998b45849ff11a547aadc3e8" + "x-dfo-trace-id": "7fd4a5b5b50648999f5ead8966bcc02c" }, "json": { "schema_version": 1, @@ -45,14 +45,14 @@ "extract_skipped": false }, "diagnostics": { - "engine_build": "0ba344270784ae9929a369da8acd00b399dfced8", - "trace_id": "304fe92b998b45849ff11a547aadc3e8", + "engine_build": "99e62038ceb4b459c2ac699549076ff123c166aa", + "trace_id": "7fd4a5b5b50648999f5ead8966bcc02c", "warnings": [], "timing_ms": { - "total": 1416, + "total": 1054, "by_step": { "coverage": 0, - "extract": 1297, + "extract": 1050, "cache_lookup": 0 } }, @@ -69,9 +69,9 @@ "variable_text": "ODA disbursements", "warnings": [], "timing_ms": { - "total": 115, + "total": 0, "by_step": { - "recall": 115, + "recall": 0, "phase_resolve_places": 0, "phase_check_entities": 0 } @@ -91,6 +91,7 @@ "axis": "where", "segment": "heading", "role": "destination", + "entity_choice": 0, "entity_refs": [], "states": [] }, @@ -187,7 +188,8 @@ "operations": [] } ] - } + }, + "entity_choice": 0 }, { "mentions": [ @@ -216,7 +218,8 @@ "operations": [] } ] - } + }, + "entity_choice": 0 } ] } @@ -238,6 +241,7 @@ "axis": "where", "segment": "heading", "role": "destination", + "entity_choice": 0, "entity_refs": [], "states": [], "part_index": 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 8442bcc..3698118 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": "1e95940d311043d0b63bd27a87996439" + "x-dfo-trace-id": "38ca03326c514418af8164d5740ec677" }, "json": { "schema_version": 1, @@ -46,21 +46,21 @@ "extract_skipped": false }, "diagnostics": { - "engine_build": "0ba344270784ae9929a369da8acd00b399dfced8", - "trace_id": "1e95940d311043d0b63bd27a87996439", + "engine_build": "99e62038ceb4b459c2ac699549076ff123c166aa", + "trace_id": "38ca03326c514418af8164d5740ec677", "warnings": [], "timing_ms": { - "total": 2200, + "total": 492, "by_step": { "coverage": 0, - "extract": 1432, + "extract": 1, "cache_lookup": 0 } }, "llm_usage": { - "input_tokens": 2232, - "output_tokens": 103, - "cached_tokens": 841, + "input_tokens": 0, + "output_tokens": 0, + "cached_tokens": 0, "jev_input_tokens": 5250, "jev_output_tokens": 1104 }, @@ -72,30 +72,30 @@ "variable_text": "debt service", "warnings": [], "timing_ms": { - "total": 757, + "total": 486, "by_step": { - "recall": 316, + "recall": 0, "phase_resolve_places": 0, "phase_check_entities": 0, "shape_arcs": 2, - "shape_probe_coverage": 8, - "shape_probe": 72, - "shape_groups": 5, - "shape_labels": 10, + "shape_probe_coverage": 15, + "shape_probe": 105, + "shape_groups": 7, + "shape_labels": 11, "shape_admission": 0, "phase_derive_shapes": 0, - "shape": 179, + "shape": 219, "phase_prune_and_rank": 0, - "bind": 89, - "phase_bind": 10, - "phase_settle": 13, + "bind": 112, + "phase_bind": 14, + "phase_settle": 5, "phase_place_bindings": 12, "phase_facet_requests": 0, - "materialise": 9, - "phase_materialise": 0, - "answer": 1, - "options": 79, - "phase_outcome": 49 + "materialise": 11, + "phase_materialise": 23, + "answer": 2, + "options": 8, + "phase_outcome": 80 } }, "restatement": { @@ -570,7 +570,7 @@ "label": "Creative Commons Attribution License" } }, - "coverage_stamp": "45bdd65f2fd33ac77a897180047080d33ed9db812afe0cbb887bf22e2ac52690", + "coverage_stamp": "e6e717ab8c77e84d010915893ede5809e9ecec67929a07cfafbcc2210edfa1eb", "facets": { "provenance": { "basis": "fallback", @@ -1288,7 +1288,7 @@ } ], "query_qualifiers": [], - "capability_version": "cap_9deef72763b45f40", + "capability_version": "cap_88defe77cc79e0c0", "default_reading": { "applied": true, "removed_stat_vars": [] @@ -3273,18 +3273,18 @@ "variable_text": "price of tea", "warnings": [], "timing_ms": { - "total": 330, + "total": 100, "by_step": { - "recall": 216, - "phase_resolve_places": 1, + "recall": 0, + "phase_resolve_places": 0, "phase_check_entities": 0, - "shape_arcs": 1, - "shape_probe": 108, - "shape_groups": 2, + "shape_arcs": 2, + "shape_probe": 91, + "shape_groups": 1, "shape_labels": 0, - "shape_admission": 0, + "shape_admission": 1, "phase_derive_shapes": 0, - "shape": 113, + "shape": 100, "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 f6404bf..984fd09 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": "009afd1dc09e44299c2004e111d17991" + "x-dfo-trace-id": "1af94637ff7043abb23f65b60e28d604" }, "json": { "schema_version": 1, @@ -46,14 +46,14 @@ "extract_skipped": false }, "diagnostics": { - "engine_build": "0ba344270784ae9929a369da8acd00b399dfced8", - "trace_id": "009afd1dc09e44299c2004e111d17991", + "engine_build": "99e62038ceb4b459c2ac699549076ff123c166aa", + "trace_id": "1af94637ff7043abb23f65b60e28d604", "warnings": [], "timing_ms": { - "total": 2627, + "total": 2578, "by_step": { "coverage": 0, - "extract": 1263, + "extract": 1025, "cache_lookup": 0 } }, @@ -61,7 +61,7 @@ "input_tokens": 2239, "output_tokens": 164, "cached_tokens": 842, - "jev_input_tokens": 17402, + "jev_input_tokens": 17398, "jev_output_tokens": 3500 }, "timed_out": false @@ -72,30 +72,30 @@ "variable_text": "GDP", "warnings": [], "timing_ms": { - "total": 1129, + "total": 1276, "by_step": { - "recall": 2, - "phase_resolve_places": 0, + "recall": 1, + "phase_resolve_places": 1, "phase_check_entities": 0, "shape_arcs": 4, - "shape_probe_coverage": 4, - "shape_probe": 151, - "shape_groups": 45, - "shape_labels": 10, - "shape_admission": 1, + "shape_probe_coverage": 17, + "shape_probe": 266, + "shape_groups": 61, + "shape_labels": 12, + "shape_admission": 2, "phase_derive_shapes": 0, - "shape": 407, + "shape": 538, "phase_prune_and_rank": 0, - "bind": 127, - "phase_bind": 10, - "phase_settle": 24, - "phase_place_bindings": 8, + "bind": 153, + "phase_bind": 12, + "phase_settle": 6, + "phase_place_bindings": 12, "phase_facet_requests": 0, - "materialise": 144, - "phase_materialise": 0, - "answer": 185, - "options": 98, - "phase_outcome": 124 + "materialise": 120, + "phase_materialise": 19, + "answer": 172, + "options": 115, + "phase_outcome": 127 } }, "entity_refs": [ @@ -970,7 +970,7 @@ "value": { "ref": { "ref": "FinancialActivities", - "label": "FinancialActivities" + "label": "Financial activities" }, "value_kind": "enum_value" } @@ -1942,7 +1942,7 @@ "start_year": 2015, "end_year": 2015 }, - "capability_version": "cap_9deef72763b45f40", + "capability_version": "cap_88defe77cc79e0c0", "default_reading": { "applied": true, "removed_stat_vars": [ @@ -2861,7 +2861,7 @@ "start_year": 2015, "end_year": 2015 }, - "capability_version": "cap_9deef72763b45f40", + "capability_version": "cap_88defe77cc79e0c0", "default_reading": { "applied": true, "removed_stat_vars": [ @@ -2964,24 +2964,24 @@ "variable_text": "ODA", "warnings": [], "timing_ms": { - "total": 619, + "total": 487, "by_step": { - "recall": 315, + "recall": 1, "phase_resolve_places": 0, "phase_check_entities": 0, - "shape_arcs": 1, - "shape_probe_coverage": 5, - "shape_probe": 107, + "shape_arcs": 3, + "shape_probe_coverage": 10, + "shape_probe": 108, "shape_groups": 3, "shape_labels": 0, "shape_admission": 1, "phase_derive_shapes": 0, - "shape": 196, + "shape": 253, "phase_prune_and_rank": 0, - "bind": 97, + "bind": 218, "phase_bind": 2, - "phase_settle": 9, - "phase_place_bindings": 0 + "phase_settle": 8, + "phase_place_bindings": 5 } }, "rendered_sentence": "Could not tell who is giving and who is receiving among \"G20\", \"Germany\", and \"India\". Put \"from\" or \"to\" before a name.", diff --git a/python/client-contract/src/dfo_client_contract/scenarios/fetch-frame-several-readings.json b/python/client-contract/src/dfo_client_contract/scenarios/fetch-frame-several-readings.json index a526083..31d2f68 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": "74e9acc99aff40f7a653093976c55e3b" + "x-dfo-trace-id": "7c7e42dd77f94ee08a15cef4438ee7ad" }, "json": { "schema_version": 1, @@ -42,26 +42,23 @@ "entry_path": "raw_text", "raw_query": "ODA disbursements for health and for education from Germany to Kenya, and GDP of Kenya", "normalized_query": "ODA disbursements for health and for education from Germany to Kenya, and GDP of Kenya", - "extract_skipped": false + "extract_skipped": true }, "diagnostics": { - "engine_build": "0ba344270784ae9929a369da8acd00b399dfced8", - "trace_id": "74e9acc99aff40f7a653093976c55e3b", + "engine_build": "99e62038ceb4b459c2ac699549076ff123c166aa", + "trace_id": "7c7e42dd77f94ee08a15cef4438ee7ad", "warnings": [], "timing_ms": { - "total": 4632, + "total": 7, "by_step": { "coverage": 0, - "extract": 1209, - "cache_lookup": 0 + "response_cache_layer1": 1 } }, "llm_usage": { - "input_tokens": 2237, - "output_tokens": 215, - "cached_tokens": 842, - "jev_input_tokens": 25612, - "jev_output_tokens": 5740 + "input_tokens": 0, + "output_tokens": 0, + "cached_tokens": 0 }, "timed_out": false }, @@ -71,30 +68,30 @@ "variable_text": "health ODA disbursements", "warnings": [], "timing_ms": { - "total": 3118, + "total": 2889, "by_step": { - "recall": 753, + "recall": 411, "phase_resolve_places": 0, "phase_check_entities": 0, - "shape_arcs": 75, - "shape_probe_coverage": 3, - "shape_probe": 164, - "shape_groups": 44, - "shape_labels": 9, - "shape_admission": 0, + "shape_arcs": 3, + "shape_probe_coverage": 32, + "shape_probe": 148, + "shape_groups": 58, + "shape_labels": 11, + "shape_admission": 1, "phase_derive_shapes": 0, - "shape": 695, + "shape": 364, "phase_prune_and_rank": 0, - "bind": 275, - "phase_bind": 190, - "phase_settle": 91, - "phase_place_bindings": 19, + "bind": 440, + "phase_bind": 315, + "phase_settle": 55, + "phase_place_bindings": 25, "phase_facet_requests": 0, - "materialise": 616, - "phase_materialise": 0, - "answer": 20, - "options": 307, - "phase_outcome": 152 + "materialise": 471, + "phase_materialise": 208, + "answer": 45, + "options": 348, + "phase_outcome": 207 } }, "restatement": { @@ -1438,7 +1435,7 @@ "selected": [] } ], - "capability_version": "cap_9deef72763b45f40", + "capability_version": "cap_88defe77cc79e0c0", "default_reading": { "applied": true, "removed_stat_vars": [] @@ -3766,30 +3763,30 @@ } ], "timing_ms": { - "total": 3017, + "total": 3494, "by_step": { - "recall": 704, - "phase_resolve_places": 1, + "recall": 445, + "phase_resolve_places": 0, "phase_check_entities": 0, - "shape_arcs": 82, - "shape_probe_coverage": 2, - "shape_probe": 99, - "shape_groups": 47, - "shape_labels": 10, + "shape_arcs": 1, + "shape_probe_coverage": 6, + "shape_probe": 380, + "shape_groups": 80, + "shape_labels": 12, "shape_admission": 1, "phase_derive_shapes": 0, - "shape": 365, + "shape": 785, "phase_prune_and_rank": 0, - "bind": 402, - "phase_bind": 196, - "phase_settle": 88, - "phase_place_bindings": 44, + "bind": 385, + "phase_bind": 179, + "phase_settle": 56, + "phase_place_bindings": 45, "phase_facet_requests": 0, - "materialise": 512, - "phase_materialise": 0, - "answer": 58, - "options": 511, - "phase_outcome": 136 + "materialise": 1028, + "phase_materialise": 194, + "answer": 42, + "options": 209, + "phase_outcome": 126 } }, "restatement": { @@ -5133,7 +5130,7 @@ "selected": [] } ], - "capability_version": "cap_9deef72763b45f40", + "capability_version": "cap_88defe77cc79e0c0", "default_reading": { "applied": true, "removed_stat_vars": [] @@ -7466,30 +7463,30 @@ } ], "timing_ms": { - "total": 1849, + "total": 1747, "by_step": { - "recall": 391, + "recall": 2, "phase_resolve_places": 0, "phase_check_entities": 0, - "shape_arcs": 4, - "shape_probe_coverage": 2, - "shape_probe": 126, - "shape_groups": 55, - "shape_labels": 10, + "shape_arcs": 5, + "shape_probe_coverage": 5, + "shape_probe": 124, + "shape_groups": 68, + "shape_labels": 13, "shape_admission": 1, "phase_derive_shapes": 0, - "shape": 311, + "shape": 405, "phase_prune_and_rank": 0, - "bind": 139, - "phase_bind": 15, - "phase_settle": 27, - "phase_place_bindings": 426, + "bind": 687, + "phase_bind": 24, + "phase_settle": 6, + "phase_place_bindings": 10, "phase_facet_requests": 0, - "materialise": 93, - "phase_materialise": 0, - "answer": 244, - "options": 193, - "phase_outcome": 10 + "materialise": 296, + "phase_materialise": 17, + "answer": 7, + "options": 256, + "phase_outcome": 37 } }, "restatement": { @@ -8103,7 +8100,7 @@ "value": { "ref": { "ref": "FinancialActivities", - "label": "FinancialActivities" + "label": "Financial activities" }, "value_kind": "enum_value" } @@ -8926,7 +8923,7 @@ } ], "query_qualifiers": [], - "capability_version": "cap_9deef72763b45f40", + "capability_version": "cap_88defe77cc79e0c0", "default_reading": { "applied": true, "removed_stat_vars": [ @@ -9459,7 +9456,7 @@ } ], "query_qualifiers": [], - "capability_version": "cap_9deef72763b45f40", + "capability_version": "cap_88defe77cc79e0c0", "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 e1916ab..f11d0d5 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": "bf6613bf82be4bddb4d60879aaf907d9" + "x-dfo-trace-id": "7abc6f06215b4187a4280d87d6f8a51a" }, "json": { "schema_version": 1, @@ -41,26 +41,23 @@ "entry_path": "raw_text", "raw_query": "ODA disbursements from Germany to Nigeria for basic health care", "normalized_query": "ODA disbursements from Germany to Nigeria for basic health care", - "extract_skipped": false + "extract_skipped": true }, "diagnostics": { - "engine_build": "0ba344270784ae9929a369da8acd00b399dfced8", - "trace_id": "bf6613bf82be4bddb4d60879aaf907d9", + "engine_build": "99e62038ceb4b459c2ac699549076ff123c166aa", + "trace_id": "7abc6f06215b4187a4280d87d6f8a51a", "warnings": [], "timing_ms": { - "total": 2620, + "total": 3, "by_step": { "coverage": 0, - "extract": 1068, - "cache_lookup": 0 + "response_cache_layer1": 1 } }, "llm_usage": { - "input_tokens": 2231, - "output_tokens": 102, - "cached_tokens": 841, - "jev_input_tokens": 6586, - "jev_output_tokens": 2060 + "input_tokens": 0, + "output_tokens": 0, + "cached_tokens": 0 }, "timed_out": false }, @@ -70,30 +67,30 @@ "variable_text": "ODA disbursements for basic health care", "warnings": [], "timing_ms": { - "total": 1548, + "total": 1669, "by_step": { - "recall": 437, + "recall": 397, "phase_resolve_places": 0, "phase_check_entities": 0, - "shape_arcs": 2, + "shape_arcs": 1, "shape_probe_coverage": 4, - "shape_probe": 161, - "shape_groups": 45, + "shape_probe": 115, + "shape_groups": 53, "shape_labels": 1, - "shape_admission": 3, + "shape_admission": 1, "phase_derive_shapes": 0, - "shape": 326, + "shape": 276, "phase_prune_and_rank": 0, - "bind": 225, - "phase_bind": 158, - "phase_settle": 56, - "phase_place_bindings": 18, + "bind": 214, + "phase_bind": 203, + "phase_settle": 45, + "phase_place_bindings": 20, "phase_facet_requests": 0, - "materialise": 41, - "phase_materialise": 0, - "answer": 186, - "options": 40, - "phase_outcome": 61 + "materialise": 28, + "phase_materialise": 196, + "answer": 145, + "options": 50, + "phase_outcome": 95 } }, "restatement": { @@ -540,7 +537,7 @@ "label": "OECD Terms and Conditions" } }, - "coverage_stamp": "45bdd65f2fd33ac77a897180047080d33ed9db812afe0cbb887bf22e2ac52690", + "coverage_stamp": "e6e717ab8c77e84d010915893ede5809e9ecec67929a07cfafbcc2210edfa1eb", "facets": { "provenance": { "basis": "fallback", @@ -1193,7 +1190,7 @@ "selected": [] } ], - "capability_version": "cap_9deef72763b45f40", + "capability_version": "cap_88defe77cc79e0c0", "default_reading": { "applied": true, "removed_stat_vars": [] @@ -3791,7 +3788,7 @@ "status": 200, "headers": { "content-type": "application/json", - "x-dfo-trace-id": "42460c90e7274dd19ecba24a6a0377e9" + "x-dfo-trace-id": "70ac3c153571497dab413643b6537466" }, "json": { "schema_version": 1, @@ -4192,7 +4189,7 @@ "frame_grammar_version": "1.1.0", "origin_catalogue_build_id": "20261011T194155Z-80081f08", "served_from": "head", - "confirmed_at": "2026-10-24T16:30:05.017544+00:00" + "confirmed_at": "2026-10-25T17:22:10.027136+00:00" }, "warnings": [ { @@ -4237,7 +4234,7 @@ ], "series_count": 5, "output_options": { - "capability_version": "dset_cc753cefa9199881", + "capability_version": "dset_76f5fa7244511c58", "columns": [ { "name": "stat_var", @@ -4521,7 +4518,7 @@ ] } }, - "series_coverage_stamp": "45bdd65f2fd33ac77a897180047080d33ed9db812afe0cbb887bf22e2ac52690", + "series_coverage_stamp": "e6e717ab8c77e84d010915893ede5809e9ecec67929a07cfafbcc2210edfa1eb", "retention": { "pinned": true } @@ -4538,7 +4535,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": "b9b4b3a90d6546e09cc738a29bbbb1d6" + "x-dfo-trace-id": "d2d4306f79d2411ebcd110cc1e26f49d" } } }, 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 86968a3..ea94e6f 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": "304fe92b998b45849ff11a547aadc3e8" + "x-dfo-trace-id": "7fd4a5b5b50648999f5ead8966bcc02c" }, "json": { "schema_version": 1, @@ -45,14 +45,14 @@ "extract_skipped": false }, "diagnostics": { - "engine_build": "0ba344270784ae9929a369da8acd00b399dfced8", - "trace_id": "304fe92b998b45849ff11a547aadc3e8", + "engine_build": "99e62038ceb4b459c2ac699549076ff123c166aa", + "trace_id": "7fd4a5b5b50648999f5ead8966bcc02c", "warnings": [], "timing_ms": { - "total": 1416, + "total": 1054, "by_step": { "coverage": 0, - "extract": 1297, + "extract": 1050, "cache_lookup": 0 } }, @@ -69,9 +69,9 @@ "variable_text": "ODA disbursements", "warnings": [], "timing_ms": { - "total": 115, + "total": 0, "by_step": { - "recall": 115, + "recall": 0, "phase_resolve_places": 0, "phase_check_entities": 0 } @@ -91,6 +91,7 @@ "axis": "where", "segment": "heading", "role": "destination", + "entity_choice": 0, "entity_refs": [], "states": [] }, @@ -187,7 +188,8 @@ "operations": [] } ] - } + }, + "entity_choice": 0 }, { "mentions": [ @@ -216,7 +218,8 @@ "operations": [] } ] - } + }, + "entity_choice": 0 } ] } @@ -238,6 +241,7 @@ "axis": "where", "segment": "heading", "role": "destination", + "entity_choice": 0, "entity_refs": [], "states": [], "part_index": 0 @@ -277,7 +281,7 @@ "error": { "class": "IncompleteAnswerError", "code": "answer_incomplete", - "trace_id": "304fe92b998b45849ff11a547aadc3e8" + "trace_id": "7fd4a5b5b50648999f5ead8966bcc02c" } } ] 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 44e3548..8498cc6 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 @@ -111,7 +111,7 @@ "status": 200, "headers": { "content-type": "application/json", - "x-dfo-trace-id": "6a9a38fa39014e7282da94b82d6ba3ee" + "x-dfo-trace-id": "4a5d0c28ab9544b2a8eabefdcaba5eb9" }, "json": { "schema_version": 1, @@ -527,6 +527,20 @@ } ], "artifacts": [ + { + "artifact_digest": "sha256:f4026e80af4b8683d3bb86645ab3aca83dff75cd03fdd4c73ec54ba638922104", + "rendering": { + "bundle": false, + "format": "parquet", + "layout": "frame", + "without_party_totals": true + }, + "bytes": 5627, + "media_type": "application/vnd.apache.parquet", + "created_at": "2026-10-20T20:44:10.228016+00:00", + "tier": "working", + "url": "/api/datasets/spec_774d6c001a6250aa67ca676ab067895e/cv_b92d94774702c7f05f2075d0b03dd756/files/sha256:f4026e80af4b8683d3bb86645ab3aca83dff75cd03fdd4c73ec54ba638922104" + }, { "artifact_digest": "sha256:f4026e80af4b8683d3bb86645ab3aca83dff75cd03fdd4c73ec54ba638922104", "rendering": { @@ -643,7 +657,7 @@ ], "series_count": 5, "output_options": { - "capability_version": "dset_cc753cefa9199881", + "capability_version": "dset_76f5fa7244511c58", "columns": [ { "name": "stat_var", @@ -943,7 +957,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": "7e3ff4f01985498db43aebbf83d13839" + "x-dfo-trace-id": "27db1ff9243247c2b620f137120283ba" } } }, 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 dff0cc7..fc5383d 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 @@ -111,7 +111,7 @@ "status": 200, "headers": { "content-type": "application/json", - "x-dfo-trace-id": "6a9a38fa39014e7282da94b82d6ba3ee" + "x-dfo-trace-id": "4a5d0c28ab9544b2a8eabefdcaba5eb9" }, "json": { "schema_version": 1, @@ -527,6 +527,21 @@ } ], "artifacts": [ + { + "artifact_digest": "sha256:421efacc2dc010af38112a087b0b49ff5539f61d2afd12a88272b27e99b5f5db", + "rendering": { + "bundle": false, + "format": "parquet", + "layout": 4, + "without_party_totals": true + }, + "bytes": 9842, + "media_type": "application/vnd.apache.parquet", + "created_at": "2026-10-23T16:56:32.058938+00:00", + "tier": "working", + "url": "/api/datasets/spec_774d6c001a6250aa67ca676ab067895e/cv_b92d94774702c7f05f2075d0b03dd756/files/sha256:421efacc2dc010af38112a087b0b49ff5539f61d2afd12a88272b27e99b5f5db", + "enrichment_stamp": "08ed6c734fc69ea2204a21f4e1dd8b963f14dd1e03a2484c618049ac2e2d93d8" + }, { "artifact_digest": "sha256:421efacc2dc010af38112a087b0b49ff5539f61d2afd12a88272b27e99b5f5db", "rendering": { @@ -541,6 +556,20 @@ "url": "/api/datasets/spec_774d6c001a6250aa67ca676ab067895e/cv_b92d94774702c7f05f2075d0b03dd756/files/sha256:421efacc2dc010af38112a087b0b49ff5539f61d2afd12a88272b27e99b5f5db", "enrichment_stamp": "08ed6c734fc69ea2204a21f4e1dd8b963f14dd1e03a2484c618049ac2e2d93d8" }, + { + "artifact_digest": "sha256:f4026e80af4b8683d3bb86645ab3aca83dff75cd03fdd4c73ec54ba638922104", + "rendering": { + "bundle": false, + "format": "parquet", + "layout": "frame", + "without_party_totals": true + }, + "bytes": 5627, + "media_type": "application/vnd.apache.parquet", + "created_at": "2026-10-20T20:44:10.228016+00:00", + "tier": "working", + "url": "/api/datasets/spec_774d6c001a6250aa67ca676ab067895e/cv_b92d94774702c7f05f2075d0b03dd756/files/sha256:f4026e80af4b8683d3bb86645ab3aca83dff75cd03fdd4c73ec54ba638922104" + }, { "artifact_digest": "sha256:f4026e80af4b8683d3bb86645ab3aca83dff75cd03fdd4c73ec54ba638922104", "rendering": { @@ -657,7 +686,7 @@ ], "series_count": 5, "output_options": { - "capability_version": "dset_cc753cefa9199881", + "capability_version": "dset_76f5fa7244511c58", "columns": [ { "name": "stat_var", @@ -979,7 +1008,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": "7e3ff4f01985498db43aebbf83d13839" + "x-dfo-trace-id": "27db1ff9243247c2b620f137120283ba" } } }, 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 35c65cb..a00aec1 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 @@ -211,7 +211,7 @@ "status": 200, "headers": { "content-type": "application/json", - "x-dfo-trace-id": "42460c90e7274dd19ecba24a6a0377e9" + "x-dfo-trace-id": "70ac3c153571497dab413643b6537466" }, "json": { "schema_version": 1, @@ -612,7 +612,7 @@ "frame_grammar_version": "1.1.0", "origin_catalogue_build_id": "20261011T194155Z-80081f08", "served_from": "head", - "confirmed_at": "2026-10-24T16:30:05.017544+00:00" + "confirmed_at": "2026-10-25T17:22:10.027136+00:00" }, "warnings": [ { @@ -657,7 +657,7 @@ ], "series_count": 5, "output_options": { - "capability_version": "dset_cc753cefa9199881", + "capability_version": "dset_76f5fa7244511c58", "columns": [ { "name": "stat_var", @@ -940,7 +940,7 @@ ] } }, - "series_coverage_stamp": "45bdd65f2fd33ac77a897180047080d33ed9db812afe0cbb887bf22e2ac52690", + "series_coverage_stamp": "e6e717ab8c77e84d010915893ede5809e9ecec67929a07cfafbcc2210edfa1eb", "retention": { "pinned": true } diff --git a/python/client-contract/src/dfo_client_contract/scenarios/fetch-ref-expired-not-reproducible.json b/python/client-contract/src/dfo_client_contract/scenarios/fetch-ref-expired-not-reproducible.json index 517e8c4..b81f1a0 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 @@ -231,7 +231,7 @@ "status": 200, "headers": { "content-type": "application/json", - "x-dfo-trace-id": "6f93d15300c8413191296f90fbc4b8b0" + "x-dfo-trace-id": "ee36259b6d664e7cb028a433fd51bf38" }, "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 d8e8c73..6f73b47 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 @@ -211,7 +211,7 @@ "status": 200, "headers": { "content-type": "application/json", - "x-dfo-trace-id": "42460c90e7274dd19ecba24a6a0377e9" + "x-dfo-trace-id": "70ac3c153571497dab413643b6537466" }, "json": { "schema_version": 1, @@ -612,7 +612,7 @@ "frame_grammar_version": "1.1.0", "origin_catalogue_build_id": "20261011T194155Z-80081f08", "served_from": "head", - "confirmed_at": "2026-10-24T16:30:05.017544+00:00" + "confirmed_at": "2026-10-25T17:22:10.027136+00:00" }, "warnings": [ { @@ -657,7 +657,7 @@ ], "series_count": 5, "output_options": { - "capability_version": "dset_cc753cefa9199881", + "capability_version": "dset_76f5fa7244511c58", "columns": [ { "name": "stat_var", @@ -940,7 +940,7 @@ ] } }, - "series_coverage_stamp": "45bdd65f2fd33ac77a897180047080d33ed9db812afe0cbb887bf22e2ac52690", + "series_coverage_stamp": "e6e717ab8c77e84d010915893ede5809e9ecec67929a07cfafbcc2210edfa1eb", "retention": { "pinned": true } @@ -953,7 +953,7 @@ "error": { "class": "ContractError", "code": "contract_violation", - "trace_id": "42460c90e7274dd19ecba24a6a0377e9" + "trace_id": "70ac3c153571497dab413643b6537466" } } ] 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 87efd88..0fd8c35 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 @@ -211,7 +211,7 @@ "status": 200, "headers": { "content-type": "application/json", - "x-dfo-trace-id": "42460c90e7274dd19ecba24a6a0377e9" + "x-dfo-trace-id": "70ac3c153571497dab413643b6537466" }, "json": { "schema_version": 1, @@ -612,7 +612,7 @@ "frame_grammar_version": "1.1.0", "origin_catalogue_build_id": "20261011T194155Z-80081f08", "served_from": "head", - "confirmed_at": "2026-10-24T16:30:05.017544+00:00" + "confirmed_at": "2026-10-25T17:22:10.027136+00:00" }, "warnings": [ { @@ -657,7 +657,7 @@ ], "series_count": 5, "output_options": { - "capability_version": "dset_cc753cefa9199881", + "capability_version": "dset_76f5fa7244511c58", "columns": [ { "name": "stat_var", @@ -940,7 +940,7 @@ ] } }, - "series_coverage_stamp": "45bdd65f2fd33ac77a897180047080d33ed9db812afe0cbb887bf22e2ac52690", + "series_coverage_stamp": "e6e717ab8c77e84d010915893ede5809e9ecec67929a07cfafbcc2210edfa1eb", "retention": { "pinned": true } @@ -957,7 +957,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": "b9b4b3a90d6546e09cc738a29bbbb1d6" + "x-dfo-trace-id": "d2d4306f79d2411ebcd110cc1e26f49d" } } }, 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 8916674..acb3daa 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": "0ba344270784ae9929a369da8acd00b399dfced8", - "recorded_at": "2026-10-24T16:32:01Z" + "dfo_commit": "99e62038ceb4b459c2ac699549076ff123c166aa", + "recorded_at": "2026-10-25T17:37:25Z" }, "call": [ { @@ -94,7 +94,7 @@ "status": 200, "headers": { "content-type": "application/json", - "x-dfo-trace-id": "6f93d15300c8413191296f90fbc4b8b0" + "x-dfo-trace-id": "ee36259b6d664e7cb028a433fd51bf38" }, "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 85a980e..46e5a2b 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 @@ -111,7 +111,7 @@ "status": 200, "headers": { "content-type": "application/json", - "x-dfo-trace-id": "6a9a38fa39014e7282da94b82d6ba3ee" + "x-dfo-trace-id": "4a5d0c28ab9544b2a8eabefdcaba5eb9" }, "json": { "schema_version": 1, @@ -527,6 +527,21 @@ } ], "artifacts": [ + { + "artifact_digest": "sha256:421efacc2dc010af38112a087b0b49ff5539f61d2afd12a88272b27e99b5f5db", + "rendering": { + "bundle": false, + "format": "parquet", + "layout": 4, + "without_party_totals": true + }, + "bytes": 9842, + "media_type": "application/vnd.apache.parquet", + "created_at": "2026-10-23T16:56:32.058938+00:00", + "tier": "working", + "url": "/api/datasets/spec_774d6c001a6250aa67ca676ab067895e/cv_b92d94774702c7f05f2075d0b03dd756/files/sha256:421efacc2dc010af38112a087b0b49ff5539f61d2afd12a88272b27e99b5f5db", + "enrichment_stamp": "08ed6c734fc69ea2204a21f4e1dd8b963f14dd1e03a2484c618049ac2e2d93d8" + }, { "artifact_digest": "sha256:421efacc2dc010af38112a087b0b49ff5539f61d2afd12a88272b27e99b5f5db", "rendering": { @@ -541,6 +556,20 @@ "url": "/api/datasets/spec_774d6c001a6250aa67ca676ab067895e/cv_b92d94774702c7f05f2075d0b03dd756/files/sha256:421efacc2dc010af38112a087b0b49ff5539f61d2afd12a88272b27e99b5f5db", "enrichment_stamp": "08ed6c734fc69ea2204a21f4e1dd8b963f14dd1e03a2484c618049ac2e2d93d8" }, + { + "artifact_digest": "sha256:f4026e80af4b8683d3bb86645ab3aca83dff75cd03fdd4c73ec54ba638922104", + "rendering": { + "bundle": false, + "format": "parquet", + "layout": "frame", + "without_party_totals": true + }, + "bytes": 5627, + "media_type": "application/vnd.apache.parquet", + "created_at": "2026-10-20T20:44:10.228016+00:00", + "tier": "working", + "url": "/api/datasets/spec_774d6c001a6250aa67ca676ab067895e/cv_b92d94774702c7f05f2075d0b03dd756/files/sha256:f4026e80af4b8683d3bb86645ab3aca83dff75cd03fdd4c73ec54ba638922104" + }, { "artifact_digest": "sha256:f4026e80af4b8683d3bb86645ab3aca83dff75cd03fdd4c73ec54ba638922104", "rendering": { @@ -657,7 +686,7 @@ ], "series_count": 5, "output_options": { - "capability_version": "dset_cc753cefa9199881", + "capability_version": "dset_76f5fa7244511c58", "columns": [ { "name": "stat_var", @@ -957,7 +986,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": "7e3ff4f01985498db43aebbf83d13839" + "x-dfo-trace-id": "27db1ff9243247c2b620f137120283ba" } } }, @@ -983,7 +1012,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": "7e3ff4f01985498db43aebbf83d13839" + "x-dfo-trace-id": "27db1ff9243247c2b620f137120283ba" } } }, 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 23646db..7937d99 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 @@ -111,7 +111,7 @@ "status": 200, "headers": { "content-type": "application/json", - "x-dfo-trace-id": "6a9a38fa39014e7282da94b82d6ba3ee" + "x-dfo-trace-id": "4a5d0c28ab9544b2a8eabefdcaba5eb9" }, "json": { "schema_version": 1, @@ -527,6 +527,21 @@ } ], "artifacts": [ + { + "artifact_digest": "sha256:421efacc2dc010af38112a087b0b49ff5539f61d2afd12a88272b27e99b5f5db", + "rendering": { + "bundle": false, + "format": "parquet", + "layout": 4, + "without_party_totals": true + }, + "bytes": 9842, + "media_type": "application/vnd.apache.parquet", + "created_at": "2026-10-23T16:56:32.058938+00:00", + "tier": "working", + "url": "/api/datasets/spec_774d6c001a6250aa67ca676ab067895e/cv_b92d94774702c7f05f2075d0b03dd756/files/sha256:421efacc2dc010af38112a087b0b49ff5539f61d2afd12a88272b27e99b5f5db", + "enrichment_stamp": "08ed6c734fc69ea2204a21f4e1dd8b963f14dd1e03a2484c618049ac2e2d93d8" + }, { "artifact_digest": "sha256:421efacc2dc010af38112a087b0b49ff5539f61d2afd12a88272b27e99b5f5db", "rendering": { @@ -541,6 +556,20 @@ "url": "/api/datasets/spec_774d6c001a6250aa67ca676ab067895e/cv_b92d94774702c7f05f2075d0b03dd756/files/sha256:421efacc2dc010af38112a087b0b49ff5539f61d2afd12a88272b27e99b5f5db", "enrichment_stamp": "08ed6c734fc69ea2204a21f4e1dd8b963f14dd1e03a2484c618049ac2e2d93d8" }, + { + "artifact_digest": "sha256:f4026e80af4b8683d3bb86645ab3aca83dff75cd03fdd4c73ec54ba638922104", + "rendering": { + "bundle": false, + "format": "parquet", + "layout": "frame", + "without_party_totals": true + }, + "bytes": 5627, + "media_type": "application/vnd.apache.parquet", + "created_at": "2026-10-20T20:44:10.228016+00:00", + "tier": "working", + "url": "/api/datasets/spec_774d6c001a6250aa67ca676ab067895e/cv_b92d94774702c7f05f2075d0b03dd756/files/sha256:f4026e80af4b8683d3bb86645ab3aca83dff75cd03fdd4c73ec54ba638922104" + }, { "artifact_digest": "sha256:f4026e80af4b8683d3bb86645ab3aca83dff75cd03fdd4c73ec54ba638922104", "rendering": { @@ -657,7 +686,7 @@ ], "series_count": 5, "output_options": { - "capability_version": "dset_cc753cefa9199881", + "capability_version": "dset_76f5fa7244511c58", "columns": [ { "name": "stat_var", @@ -957,7 +986,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": "7e3ff4f01985498db43aebbf83d13839" + "x-dfo-trace-id": "27db1ff9243247c2b620f137120283ba" } } }, @@ -983,7 +1012,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": "7e3ff4f01985498db43aebbf83d13839" + "x-dfo-trace-id": "27db1ff9243247c2b620f137120283ba" } } }, 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 50d58fe..f4cad5f 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": "0ba344270784ae9929a369da8acd00b399dfced8", - "recorded_at": "2026-10-24T16:30:53Z" + "dfo_commit": "99e62038ceb4b459c2ac699549076ff123c166aa", + "recorded_at": "2026-10-25T17:35:18Z" }, "call": [ { @@ -112,7 +112,7 @@ "status": 404, "headers": { "content-type": "application/problem+json", - "x-dfo-trace-id": "5228b20a07a147e9861e20170e7363f1" + "x-dfo-trace-id": "4b703f6e6e1f4d13b433c758319f2705" }, "json": { "type": "/codes/snapshot_not_found", @@ -120,8 +120,8 @@ "status": 404, "detail": "'spec_774d6c001a6250aa67ca676ab067895e' has no version at content_version 'cv_00000000000000000000000000000000'", "code": "snapshot_not_found", - "trace_id": "5228b20a07a147e9861e20170e7363f1", - "capability_version": "dset_cc753cefa9199881", + "trace_id": "4b703f6e6e1f4d13b433c758319f2705", + "capability_version": "dset_76f5fa7244511c58", "retryable": false } } @@ -132,7 +132,7 @@ "error": { "class": "NotFoundError", "code": "snapshot_not_found", - "trace_id": "5228b20a07a147e9861e20170e7363f1" + "trace_id": "4b703f6e6e1f4d13b433c758319f2705" } } ] 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 856d5c5..96db317 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": "0ba344270784ae9929a369da8acd00b399dfced8", - "recorded_at": "2026-10-24T16:30:51Z" + "dfo_commit": "99e62038ceb4b459c2ac699549076ff123c166aa", + "recorded_at": "2026-10-25T17:35:16Z" }, "call": [ { @@ -112,7 +112,7 @@ "status": 200, "headers": { "content-type": "application/json", - "x-dfo-trace-id": "6a9a38fa39014e7282da94b82d6ba3ee" + "x-dfo-trace-id": "4a5d0c28ab9544b2a8eabefdcaba5eb9" }, "json": { "schema_version": 1, @@ -528,6 +528,21 @@ } ], "artifacts": [ + { + "artifact_digest": "sha256:421efacc2dc010af38112a087b0b49ff5539f61d2afd12a88272b27e99b5f5db", + "rendering": { + "bundle": false, + "format": "parquet", + "layout": 4, + "without_party_totals": true + }, + "bytes": 9842, + "media_type": "application/vnd.apache.parquet", + "created_at": "2026-10-23T16:56:32.058938+00:00", + "tier": "working", + "url": "/api/datasets/spec_774d6c001a6250aa67ca676ab067895e/cv_b92d94774702c7f05f2075d0b03dd756/files/sha256:421efacc2dc010af38112a087b0b49ff5539f61d2afd12a88272b27e99b5f5db", + "enrichment_stamp": "08ed6c734fc69ea2204a21f4e1dd8b963f14dd1e03a2484c618049ac2e2d93d8" + }, { "artifact_digest": "sha256:421efacc2dc010af38112a087b0b49ff5539f61d2afd12a88272b27e99b5f5db", "rendering": { @@ -542,6 +557,20 @@ "url": "/api/datasets/spec_774d6c001a6250aa67ca676ab067895e/cv_b92d94774702c7f05f2075d0b03dd756/files/sha256:421efacc2dc010af38112a087b0b49ff5539f61d2afd12a88272b27e99b5f5db", "enrichment_stamp": "08ed6c734fc69ea2204a21f4e1dd8b963f14dd1e03a2484c618049ac2e2d93d8" }, + { + "artifact_digest": "sha256:f4026e80af4b8683d3bb86645ab3aca83dff75cd03fdd4c73ec54ba638922104", + "rendering": { + "bundle": false, + "format": "parquet", + "layout": "frame", + "without_party_totals": true + }, + "bytes": 5627, + "media_type": "application/vnd.apache.parquet", + "created_at": "2026-10-20T20:44:10.228016+00:00", + "tier": "working", + "url": "/api/datasets/spec_774d6c001a6250aa67ca676ab067895e/cv_b92d94774702c7f05f2075d0b03dd756/files/sha256:f4026e80af4b8683d3bb86645ab3aca83dff75cd03fdd4c73ec54ba638922104" + }, { "artifact_digest": "sha256:f4026e80af4b8683d3bb86645ab3aca83dff75cd03fdd4c73ec54ba638922104", "rendering": { @@ -658,7 +687,7 @@ ], "series_count": 5, "output_options": { - "capability_version": "dset_cc753cefa9199881", + "capability_version": "dset_76f5fa7244511c58", "columns": [ { "name": "stat_var", @@ -958,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": "7e3ff4f01985498db43aebbf83d13839" + "x-dfo-trace-id": "27db1ff9243247c2b620f137120283ba" } } }, 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 5e6acb1..ca3527d 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": "bf6613bf82be4bddb4d60879aaf907d9" + "x-dfo-trace-id": "7abc6f06215b4187a4280d87d6f8a51a" }, "json": { "schema_version": 1, @@ -41,26 +41,23 @@ "entry_path": "raw_text", "raw_query": "ODA disbursements from Germany to Nigeria for basic health care", "normalized_query": "ODA disbursements from Germany to Nigeria for basic health care", - "extract_skipped": false + "extract_skipped": true }, "diagnostics": { - "engine_build": "0ba344270784ae9929a369da8acd00b399dfced8", - "trace_id": "bf6613bf82be4bddb4d60879aaf907d9", + "engine_build": "99e62038ceb4b459c2ac699549076ff123c166aa", + "trace_id": "7abc6f06215b4187a4280d87d6f8a51a", "warnings": [], "timing_ms": { - "total": 2620, + "total": 3, "by_step": { "coverage": 0, - "extract": 1068, - "cache_lookup": 0 + "response_cache_layer1": 1 } }, "llm_usage": { - "input_tokens": 2231, - "output_tokens": 102, - "cached_tokens": 841, - "jev_input_tokens": 6586, - "jev_output_tokens": 2060 + "input_tokens": 0, + "output_tokens": 0, + "cached_tokens": 0 }, "timed_out": false }, @@ -70,30 +67,30 @@ "variable_text": "ODA disbursements for basic health care", "warnings": [], "timing_ms": { - "total": 1548, + "total": 1669, "by_step": { - "recall": 437, + "recall": 397, "phase_resolve_places": 0, "phase_check_entities": 0, - "shape_arcs": 2, + "shape_arcs": 1, "shape_probe_coverage": 4, - "shape_probe": 161, - "shape_groups": 45, + "shape_probe": 115, + "shape_groups": 53, "shape_labels": 1, - "shape_admission": 3, + "shape_admission": 1, "phase_derive_shapes": 0, - "shape": 326, + "shape": 276, "phase_prune_and_rank": 0, - "bind": 225, - "phase_bind": 158, - "phase_settle": 56, - "phase_place_bindings": 18, + "bind": 214, + "phase_bind": 203, + "phase_settle": 45, + "phase_place_bindings": 20, "phase_facet_requests": 0, - "materialise": 41, - "phase_materialise": 0, - "answer": 186, - "options": 40, - "phase_outcome": 61 + "materialise": 28, + "phase_materialise": 196, + "answer": 145, + "options": 50, + "phase_outcome": 95 } }, "restatement": { @@ -540,7 +537,7 @@ "label": "OECD Terms and Conditions" } }, - "coverage_stamp": "45bdd65f2fd33ac77a897180047080d33ed9db812afe0cbb887bf22e2ac52690", + "coverage_stamp": "e6e717ab8c77e84d010915893ede5809e9ecec67929a07cfafbcc2210edfa1eb", "facets": { "provenance": { "basis": "fallback", @@ -1193,7 +1190,7 @@ "selected": [] } ], - "capability_version": "cap_9deef72763b45f40", + "capability_version": "cap_88defe77cc79e0c0", "default_reading": { "applied": true, "removed_stat_vars": [] @@ -3791,7 +3788,7 @@ "status": 200, "headers": { "content-type": "application/json", - "x-dfo-trace-id": "42460c90e7274dd19ecba24a6a0377e9" + "x-dfo-trace-id": "70ac3c153571497dab413643b6537466" }, "json": { "schema_version": 1, @@ -4191,7 +4188,7 @@ "frame_grammar_version": "1.1.0", "origin_catalogue_build_id": "20261011T194155Z-80081f08", "served_from": "head", - "confirmed_at": "2026-10-24T16:30:05.017544+00:00" + "confirmed_at": "2026-10-25T17:22:10.027136+00:00" }, "warnings": [ { @@ -4236,7 +4233,7 @@ ], "series_count": 5, "output_options": { - "capability_version": "dset_cc753cefa9199881", + "capability_version": "dset_76f5fa7244511c58", "columns": [ { "name": "stat_var", @@ -4519,7 +4516,7 @@ ] } }, - "series_coverage_stamp": "45bdd65f2fd33ac77a897180047080d33ed9db812afe0cbb887bf22e2ac52690", + "series_coverage_stamp": "e6e717ab8c77e84d010915893ede5809e9ecec67929a07cfafbcc2210edfa1eb", "retention": { "pinned": true }, @@ -4545,7 +4542,7 @@ "error": { "class": "ContractError", "code": "contract_violation", - "trace_id": "42460c90e7274dd19ecba24a6a0377e9" + "trace_id": "70ac3c153571497dab413643b6537466" } } ] 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 6e10641..bc3d8a2 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": "bf6613bf82be4bddb4d60879aaf907d9" + "x-dfo-trace-id": "7abc6f06215b4187a4280d87d6f8a51a" }, "json": { "schema_version": 1, @@ -41,26 +41,23 @@ "entry_path": "raw_text", "raw_query": "ODA disbursements from Germany to Nigeria for basic health care", "normalized_query": "ODA disbursements from Germany to Nigeria for basic health care", - "extract_skipped": false + "extract_skipped": true }, "diagnostics": { - "engine_build": "0ba344270784ae9929a369da8acd00b399dfced8", - "trace_id": "bf6613bf82be4bddb4d60879aaf907d9", + "engine_build": "99e62038ceb4b459c2ac699549076ff123c166aa", + "trace_id": "7abc6f06215b4187a4280d87d6f8a51a", "warnings": [], "timing_ms": { - "total": 2620, + "total": 3, "by_step": { "coverage": 0, - "extract": 1068, - "cache_lookup": 0 + "response_cache_layer1": 1 } }, "llm_usage": { - "input_tokens": 2231, - "output_tokens": 102, - "cached_tokens": 841, - "jev_input_tokens": 6586, - "jev_output_tokens": 2060 + "input_tokens": 0, + "output_tokens": 0, + "cached_tokens": 0 }, "timed_out": false }, @@ -70,30 +67,30 @@ "variable_text": "ODA disbursements for basic health care", "warnings": [], "timing_ms": { - "total": 1548, + "total": 1669, "by_step": { - "recall": 437, + "recall": 397, "phase_resolve_places": 0, "phase_check_entities": 0, - "shape_arcs": 2, + "shape_arcs": 1, "shape_probe_coverage": 4, - "shape_probe": 161, - "shape_groups": 45, + "shape_probe": 115, + "shape_groups": 53, "shape_labels": 1, - "shape_admission": 3, + "shape_admission": 1, "phase_derive_shapes": 0, - "shape": 326, + "shape": 276, "phase_prune_and_rank": 0, - "bind": 225, - "phase_bind": 158, - "phase_settle": 56, - "phase_place_bindings": 18, + "bind": 214, + "phase_bind": 203, + "phase_settle": 45, + "phase_place_bindings": 20, "phase_facet_requests": 0, - "materialise": 41, - "phase_materialise": 0, - "answer": 186, - "options": 40, - "phase_outcome": 61 + "materialise": 28, + "phase_materialise": 196, + "answer": 145, + "options": 50, + "phase_outcome": 95 } }, "restatement": { @@ -540,7 +537,7 @@ "label": "OECD Terms and Conditions" } }, - "coverage_stamp": "45bdd65f2fd33ac77a897180047080d33ed9db812afe0cbb887bf22e2ac52690", + "coverage_stamp": "e6e717ab8c77e84d010915893ede5809e9ecec67929a07cfafbcc2210edfa1eb", "facets": { "provenance": { "basis": "fallback", @@ -1193,7 +1190,7 @@ "selected": [] } ], - "capability_version": "cap_9deef72763b45f40", + "capability_version": "cap_88defe77cc79e0c0", "default_reading": { "applied": true, "removed_stat_vars": [] @@ -3891,7 +3888,7 @@ "status": 200, "headers": { "content-type": "application/json", - "x-dfo-trace-id": "42460c90e7274dd19ecba24a6a0377e9" + "x-dfo-trace-id": "70ac3c153571497dab413643b6537466" }, "json": { "schema_version": 1, @@ -4292,7 +4289,7 @@ "frame_grammar_version": "1.1.0", "origin_catalogue_build_id": "20261011T194155Z-80081f08", "served_from": "head", - "confirmed_at": "2026-10-24T16:30:05.017544+00:00" + "confirmed_at": "2026-10-25T17:22:10.027136+00:00" }, "warnings": [ { @@ -4337,7 +4334,7 @@ ], "series_count": 5, "output_options": { - "capability_version": "dset_cc753cefa9199881", + "capability_version": "dset_76f5fa7244511c58", "columns": [ { "name": "stat_var", @@ -4620,7 +4617,7 @@ ] } }, - "series_coverage_stamp": "45bdd65f2fd33ac77a897180047080d33ed9db812afe0cbb887bf22e2ac52690", + "series_coverage_stamp": "e6e717ab8c77e84d010915893ede5809e9ecec67929a07cfafbcc2210edfa1eb", "retention": { "pinned": true } @@ -4637,7 +4634,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": "b9b4b3a90d6546e09cc738a29bbbb1d6" + "x-dfo-trace-id": "d2d4306f79d2411ebcd110cc1e26f49d" } } }, 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 b3db0e5..74a7778 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 @@ -379,7 +379,7 @@ "status": 200, "headers": { "content-type": "application/json", - "x-dfo-trace-id": "bfc5cc090c4347f489fffcc62fc3d2bf" + "x-dfo-trace-id": "cdb2d56286eb4d468f447309c3bd06d9" }, "json": { "schema_version": 1, @@ -786,7 +786,7 @@ "frame_grammar_version": "1.1.0", "origin_catalogue_build_id": "20261019T174519Z-2e5e8cfd", "served_from": "head", - "confirmed_at": "2026-10-24T16:30:31.570035+00:00" + "confirmed_at": "2026-10-25T17:30:48.703616+00:00" }, "warnings": [ { @@ -831,7 +831,7 @@ ], "series_count": 1, "output_options": { - "capability_version": "dset_cc753cefa9199881", + "capability_version": "dset_76f5fa7244511c58", "columns": [ { "name": "stat_var", @@ -1099,7 +1099,7 @@ ] } }, - "series_coverage_stamp": "45bdd65f2fd33ac77a897180047080d33ed9db812afe0cbb887bf22e2ac52690", + "series_coverage_stamp": "e6e717ab8c77e84d010915893ede5809e9ecec67929a07cfafbcc2210edfa1eb", "retention": { "pinned": false, "held_until": "2026-11-19T13:59:18.051742Z" @@ -1117,7 +1117,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": "8261c9be5a7c406a80692fac6b28ee05" + "x-dfo-trace-id": "114f3d3a1c78408c92fd29cc76887fdc" } } }, 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 05c7be4..796db99 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 @@ -278,7 +278,7 @@ "status": 200, "headers": { "content-type": "application/json", - "x-dfo-trace-id": "bfc5cc090c4347f489fffcc62fc3d2bf" + "x-dfo-trace-id": "cdb2d56286eb4d468f447309c3bd06d9" }, "json": { "schema_version": 1, @@ -685,7 +685,7 @@ "frame_grammar_version": "1.1.0", "origin_catalogue_build_id": "20261019T174519Z-2e5e8cfd", "served_from": "head", - "confirmed_at": "2026-10-24T16:30:31.570035+00:00" + "confirmed_at": "2026-10-25T17:30:48.703616+00:00" }, "warnings": [ { @@ -730,7 +730,7 @@ ], "series_count": 1, "output_options": { - "capability_version": "dset_cc753cefa9199881", + "capability_version": "dset_76f5fa7244511c58", "columns": [ { "name": "stat_var", @@ -998,7 +998,7 @@ ] } }, - "series_coverage_stamp": "45bdd65f2fd33ac77a897180047080d33ed9db812afe0cbb887bf22e2ac52690", + "series_coverage_stamp": "e6e717ab8c77e84d010915893ede5809e9ecec67929a07cfafbcc2210edfa1eb", "retention": { "pinned": false, "held_until": "2026-11-19T13:59:18.051742Z" @@ -1016,7 +1016,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": "8261c9be5a7c406a80692fac6b28ee05" + "x-dfo-trace-id": "114f3d3a1c78408c92fd29cc76887fdc" } } }, 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 8f0d10e..abd557e 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_fbca0f29755230d84729c1243b1d9b45", + "spec_id": "spec_7f538f4f65ac124f47918468b4d2eea7", "definition": { "schema_version": 1, - "spec_id": "spec_fbca0f29755230d84729c1243b1d9b45", + "spec_id": "spec_7f538f4f65ac124f47918468b4d2eea7", "identity": { "identity_version": "spec1", "shape": { @@ -226,12 +226,12 @@ }, "requested_window": { "kind": "range", - "start_year": 1963, + "start_year": 1964, "end_year": 2024 } } }, - "sentence": "Gross disbursements to the 133 G77 countries from the 32 DAC countries for official development assistance, 1963 to 2024. Current US dollars · OECD DAC2a.", + "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.", "entity_groups": { "destination": { "label": "G77 countries", @@ -254,10 +254,10 @@ "schema_version": 1, "input": { "kind": "spec_id", - "spec_id": "spec_fbca0f29755230d84729c1243b1d9b45", + "spec_id": "spec_7f538f4f65ac124f47918468b4d2eea7", "definition": { "schema_version": 1, - "spec_id": "spec_fbca0f29755230d84729c1243b1d9b45", + "spec_id": "spec_7f538f4f65ac124f47918468b4d2eea7", "identity": { "identity_version": "spec1", "shape": { @@ -469,7 +469,7 @@ }, "requested_window": { "kind": "range", - "start_year": 1963, + "start_year": 1964, "end_year": 2024 } } @@ -485,15 +485,15 @@ "status": 202, "headers": { "content-type": "application/json", - "location": "/api/datasets/operations/op_cc325e96d3ac6fdb6721c2468fd261f221bc87ee5eb9d8e82cf4d1f3720bdf6e", + "location": "/api/datasets/operations/op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef", "retry-after": "2", - "x-dfo-trace-id": "a6d5bb2eff5a48578dce7fbf91715755" + "x-dfo-trace-id": "5541c591450f479485c421e20fe4d81d" }, "json": { "operation": { - "operation_id": "op_cc325e96d3ac6fdb6721c2468fd261f221bc87ee5eb9d8e82cf4d1f3720bdf6e", + "operation_id": "op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef", "status": "running", - "poll": "/api/datasets/operations/op_cc325e96d3ac6fdb6721c2468fd261f221bc87ee5eb9d8e82cf4d1f3720bdf6e", + "poll": "/api/datasets/operations/op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef", "retry_after_ms": 1500 } } @@ -502,24 +502,24 @@ { "request": { "method": "GET", - "path": "/datasets/operations/op_cc325e96d3ac6fdb6721c2468fd261f221bc87ee5eb9d8e82cf4d1f3720bdf6e" + "path": "/datasets/operations/op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef" }, "response": { "status": 200, "headers": { "content-type": "application/json", "retry-after": "2", - "x-dfo-trace-id": "71ecc596c6034e27b8ba5dd0a5d2c744" + "x-dfo-trace-id": "3416612a1b3f4a2ebbcf8ddeff74b96a" }, "json": { "operation": { - "operation_id": "op_cc325e96d3ac6fdb6721c2468fd261f221bc87ee5eb9d8e82cf4d1f3720bdf6e", + "operation_id": "op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef", "status": "running", - "poll": "/api/datasets/operations/op_cc325e96d3ac6fdb6721c2468fd261f221bc87ee5eb9d8e82cf4d1f3720bdf6e", + "poll": "/api/datasets/operations/op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef", "retry_after_ms": 1500, "progress": { "rows_written": 0, - "estimate_rows": 109318 + "estimate_rows": 108935 } } } @@ -528,24 +528,24 @@ { "request": { "method": "GET", - "path": "/datasets/operations/op_cc325e96d3ac6fdb6721c2468fd261f221bc87ee5eb9d8e82cf4d1f3720bdf6e" + "path": "/datasets/operations/op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef" }, "response": { "status": 200, "headers": { "content-type": "application/json", "retry-after": "2", - "x-dfo-trace-id": "760a3bb2de5e430fb316b3f6a4059c67" + "x-dfo-trace-id": "65394508d86f443db7528ac38066b9e3" }, "json": { "operation": { - "operation_id": "op_cc325e96d3ac6fdb6721c2468fd261f221bc87ee5eb9d8e82cf4d1f3720bdf6e", + "operation_id": "op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef", "status": "running", - "poll": "/api/datasets/operations/op_cc325e96d3ac6fdb6721c2468fd261f221bc87ee5eb9d8e82cf4d1f3720bdf6e", + "poll": "/api/datasets/operations/op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef", "retry_after_ms": 1500, "progress": { - "rows_written": 0, - "estimate_rows": 109318 + "rows_written": 64600, + "estimate_rows": 108935 } } } @@ -554,24 +554,76 @@ { "request": { "method": "GET", - "path": "/datasets/operations/op_cc325e96d3ac6fdb6721c2468fd261f221bc87ee5eb9d8e82cf4d1f3720bdf6e" + "path": "/datasets/operations/op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef" }, "response": { "status": 200, "headers": { "content-type": "application/json", "retry-after": "2", - "x-dfo-trace-id": "15f9386c84484af983d33c6d183e5349" + "x-dfo-trace-id": "7a2d07cfe29b4993a374ee71104d461a" }, "json": { "operation": { - "operation_id": "op_cc325e96d3ac6fdb6721c2468fd261f221bc87ee5eb9d8e82cf4d1f3720bdf6e", + "operation_id": "op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef", "status": "running", - "poll": "/api/datasets/operations/op_cc325e96d3ac6fdb6721c2468fd261f221bc87ee5eb9d8e82cf4d1f3720bdf6e", + "poll": "/api/datasets/operations/op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef", "retry_after_ms": 1500, "progress": { - "rows_written": 0, - "estimate_rows": 109318 + "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": 1786, + "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" + }, + "json": { + "operation": { + "operation_id": "op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef", + "status": "running", + "poll": "/api/datasets/operations/op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef", + "retry_after_ms": 2268, + "progress": { + "rows_written": 108935, + "estimate_rows": 108935 } } } @@ -580,24 +632,50 @@ { "request": { "method": "GET", - "path": "/datasets/operations/op_cc325e96d3ac6fdb6721c2468fd261f221bc87ee5eb9d8e82cf4d1f3720bdf6e" + "path": "/datasets/operations/op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef" }, "response": { "status": 200, "headers": { "content-type": "application/json", - "x-dfo-trace-id": "2cc73cd4fbaa4a28a350025111f70a79" + "retry-after": "3", + "x-dfo-trace-id": "1ce68951ada64961b3710bb73127c9d8" }, "json": { "operation": { - "operation_id": "op_cc325e96d3ac6fdb6721c2468fd261f221bc87ee5eb9d8e82cf4d1f3720bdf6e", + "operation_id": "op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef", + "status": "running", + "poll": "/api/datasets/operations/op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef", + "retry_after_ms": 2869, + "progress": { + "rows_written": 108935, + "estimate_rows": 108935 + } + } + } + } + }, + { + "request": { + "method": "GET", + "path": "/datasets/operations/op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef" + }, + "response": { + "status": 200, + "headers": { + "content-type": "application/json", + "x-dfo-trace-id": "37207f1ea4574e4e8485e8cebd4f4edc" + }, + "json": { + "operation": { + "operation_id": "op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef", "status": "done" }, "manifest": { "schema_version": 1, "definition": { "schema_version": 1, - "spec_id": "spec_fbca0f29755230d84729c1243b1d9b45", + "spec_id": "spec_7f538f4f65ac124f47918468b4d2eea7", "identity": { "shape": { "kind": "statvar_schema", @@ -810,14 +888,14 @@ "requested_window": { "kind": "range", "end_year": 2024, - "start_year": 1963 + "start_year": 1964 } } }, - "content_version": "cv_3d58d26a874dc30b1bba7d5ad6dd90ee", - "prepared_at": "2026-10-23T18:38:28Z", + "content_version": "cv_ed2cc83eb28d4e6883cde079f05844ed", + "prepared_at": "2026-10-25T17:38:14Z", "coverage": { - "rows": 109318, + "rows": 108935, "dimensions": [ { "label": "financingProvider", @@ -839,14 +917,14 @@ }, { "label": "years", - "count": 62 + "count": 61 } ], "window": { "kind": "range", "origin": "query", "end_year": 2024, - "start_year": 1963 + "start_year": 1964 } }, "citation": { @@ -965,13 +1043,13 @@ "kind": "range", "origin": "query", "end_year": 2024, - "start_year": 1963 + "start_year": 1964 }, - "graph_revision": "dfo-dev-dc-datacommons-service-00264-2s9", + "graph_revision": "dfo-dev-dc-datacommons-service-00273-mmh", "normalisations": [], "code_index_stamp": { - "exported_at": "2026-10-23T18:14:12Z", - "content_hash": "29eb81d7b6c88641b1d4e8eb5e850ca36de66b99d6e9e09680aac020507a6392", + "exported_at": "2026-10-24T19:20:27Z", + "content_hash": "3d946d8f4986dbbe0fa3e5c4c917200381f529d89ce417c11daeb22df56eed99", "graph_endpoint": "graph_release" }, "source_revisions": [ @@ -980,8 +1058,8 @@ "revision": "2026-10-15" } ], - "capability_version": "dset_cc753cefa9199881", - "materialiser_build": "035d29cd05fb31d7cb47cfb33197d4002f773df6", + "capability_version": "dset_76f5fa7244511c58", + "materialiser_build": "99e62038ceb4b459c2ac699549076ff123c166aa", "resolved_stat_vars": [ { "ref": "dcid:Amount_FinancialFlow_Gross_Disbursement_DAC2aAidType206_Nominal", @@ -989,15 +1067,15 @@ "financingProvider", "financingRecipient" ], - "observation_count": 109318 + "observation_count": 108935 } ], "family_member_count": 1, "family_member_digest": "1a36e1a7292b1bfff95a5415de0be74cac7bb033217ed50e79faa8ce51a224c0", "frame_grammar_version": "1.1.0", - "origin_catalogue_build_id": "20261023T061534Z-06fa7b89", + "origin_catalogue_build_id": "20261024T193016Z-775d36a9", "served_from": "materialise", - "confirmed_at": "2026-10-24T16:30:59.952146+00:00" + "confirmed_at": "2026-10-25T17:38:17.505656+00:00" }, "warnings": [], "diagnostics": [ @@ -1009,34 +1087,34 @@ ], "artifacts": [ { - "artifact_digest": "sha256:9242d69bedb460996f21f782b1a85ee5cd7eb967174e3b64a4ec5ade5bebab65", + "artifact_digest": "sha256:4d80e30e27b5a64706113d54946e3a387e422b1115d1437594ac4b1d4307ffd2", "rendering": { "bundle": false, "format": "parquet", "layout": 4 }, - "bytes": 473679, + "bytes": 472796, "media_type": "application/vnd.apache.parquet", - "created_at": "2026-10-23T18:38:31.580044+00:00", + "created_at": "2026-10-25T17:38:17.426404+00:00", "tier": "working", - "url": "/api/datasets/spec_fbca0f29755230d84729c1243b1d9b45/cv_3d58d26a874dc30b1bba7d5ad6dd90ee/files/sha256:9242d69bedb460996f21f782b1a85ee5cd7eb967174e3b64a4ec5ade5bebab65", + "url": "/api/datasets/spec_7f538f4f65ac124f47918468b4d2eea7/cv_ed2cc83eb28d4e6883cde079f05844ed/files/sha256:4d80e30e27b5a64706113d54946e3a387e422b1115d1437594ac4b1d4307ffd2", "enrichment_stamp": "08ed6c734fc69ea2204a21f4e1dd8b963f14dd1e03a2484c618049ac2e2d93d8" }, { - "artifact_digest": "sha256:099d1ce36b440868b72174fb9cdff503cc4c7a0f0ef902e66484c5bfbd270f39", + "artifact_digest": "sha256:4e3ed758ad1a33cf9d150ee5fa71adf7f5bd40e4d342d839633d8386239babe1", "rendering": { "statistics": "series" }, - "bytes": 144274, + "bytes": 144449, "media_type": "application/vnd.apache.parquet", - "created_at": "2026-10-23T18:38:31.580044+00:00", + "created_at": "2026-10-25T17:38:17.426404+00:00", "tier": "working", - "url": "/api/datasets/spec_fbca0f29755230d84729c1243b1d9b45/cv_3d58d26a874dc30b1bba7d5ad6dd90ee/files/sha256:099d1ce36b440868b72174fb9cdff503cc4c7a0f0ef902e66484c5bfbd270f39" + "url": "/api/datasets/spec_7f538f4f65ac124f47918468b4d2eea7/cv_ed2cc83eb28d4e6883cde079f05844ed/files/sha256:4e3ed758ad1a33cf9d150ee5fa71adf7f5bd40e4d342d839633d8386239babe1" } ], "series_count": 3656, "output_options": { - "capability_version": "dset_cc753cefa9199881", + "capability_version": "dset_76f5fa7244511c58", "columns": [ { "name": "stat_var", @@ -1060,7 +1138,7 @@ "name": "time_period", "kind": "grain", "droppable": false, - "distinct": 62 + "distinct": 61 }, { "name": "value", @@ -1300,7 +1378,7 @@ "varying": [ { "column": "time_period", - "distinct": 62 + "distinct": 61 } ] }, @@ -1324,7 +1402,7 @@ "varying": [ { "column": "time_period", - "distinct": 62 + "distinct": 61 } ] }, @@ -1383,10 +1461,10 @@ ] } }, - "series_coverage_stamp": "0b8c9a18fcc5af19013b21e865c64481503b6a6542f7d2e6628999e6559a47de", + "series_coverage_stamp": "e6e717ab8c77e84d010915893ede5809e9ecec67929a07cfafbcc2210edfa1eb", "retention": { "pinned": false, - "held_until": "2026-11-22T18:38:31.579178Z" + "held_until": "2026-11-24T17:38:17.425152Z" } } } @@ -1395,21 +1473,21 @@ { "request": { "method": "GET", - "origin_path": "/api/datasets/spec_fbca0f29755230d84729c1243b1d9b45/cv_3d58d26a874dc30b1bba7d5ad6dd90ee/files/sha256:9242d69bedb460996f21f782b1a85ee5cd7eb967174e3b64a4ec5ade5bebab65" + "origin_path": "/api/datasets/spec_7f538f4f65ac124f47918468b4d2eea7/cv_ed2cc83eb28d4e6883cde079f05844ed/files/sha256:4d80e30e27b5a64706113d54946e3a387e422b1115d1437594ac4b1d4307ffd2" }, "response": { "status": 302, "headers": { "content-type": "text/html", - "location": "https://storage.googleapis.com/dev-fin-observatory-datasets-working/sha256%3A9242d69bedb460996f21f782b1a85ee5cd7eb967174e3b64a4ec5ade5bebab65?X-Goog-Signature=redacted", - "x-dfo-trace-id": "fb09161c837d4874970eaf5a188845da" + "location": "https://storage.googleapis.com/dev-fin-observatory-datasets-working/sha256%3A4d80e30e27b5a64706113d54946e3a387e422b1115d1437594ac4b1d4307ffd2?X-Goog-Signature=redacted", + "x-dfo-trace-id": "919c1e572d914a608b166556417714c9" } } }, { "request": { "method": "GET", - "url": "https://storage.googleapis.com/dev-fin-observatory-datasets-working/sha256%3A9242d69bedb460996f21f782b1a85ee5cd7eb967174e3b64a4ec5ade5bebab65?X-Goog-Signature=redacted" + "url": "https://storage.googleapis.com/dev-fin-observatory-datasets-working/sha256%3A4d80e30e27b5a64706113d54946e3a387e422b1115d1437594ac4b1d4307ffd2?X-Goog-Signature=redacted" }, "response": { "status": 200, @@ -1423,7 +1501,7 @@ "expect": [ { "dataset": { - "rows": 109318, + "rows": 108935, "columns": [ "stat_var", "financingProvider", @@ -1450,20 +1528,23 @@ "members": [ { "parts": [], - "spec_id": "spec_fbca0f29755230d84729c1243b1d9b45", - "content_version": "cv_3d58d26a874dc30b1bba7d5ad6dd90ee", - "sentence": "Gross disbursements to the 133 G77 countries from the 32 DAC countries for official development assistance, 1963 to 2024. Current US dollars · OECD DAC2a." + "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." } ], "missing": [], "long_builds": [ { - "operation_id": "op_cc325e96d3ac6fdb6721c2468fd261f221bc87ee5eb9d8e82cf4d1f3720bdf6e", + "operation_id": "op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef", "poll_waits": [ 1.5, 1.5, 1.5, - 1.5 + 1.5, + 1.786, + 2.268, + 2.869 ], "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 ecdf113..3faa47f 100644 --- a/python/client-contract/src/dfo_client_contract/scenarios/fetch-spec-async-build.json +++ b/python/client-contract/src/dfo_client_contract/scenarios/fetch-spec-async-build.json @@ -11,10 +11,10 @@ { "op": "fetch", "spec": { - "spec_id": "spec_fbca0f29755230d84729c1243b1d9b45", + "spec_id": "spec_7f538f4f65ac124f47918468b4d2eea7", "definition": { "schema_version": 1, - "spec_id": "spec_fbca0f29755230d84729c1243b1d9b45", + "spec_id": "spec_7f538f4f65ac124f47918468b4d2eea7", "identity": { "identity_version": "spec1", "shape": { @@ -226,12 +226,12 @@ }, "requested_window": { "kind": "range", - "start_year": 1963, + "start_year": 1964, "end_year": 2024 } } }, - "sentence": "Gross disbursements to the 133 G77 countries from the 32 DAC countries for official development assistance, 1963 to 2024. Current US dollars · OECD DAC2a.", + "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.", "entity_groups": { "destination": { "label": "G77 countries", @@ -254,10 +254,10 @@ "schema_version": 1, "input": { "kind": "spec_id", - "spec_id": "spec_fbca0f29755230d84729c1243b1d9b45", + "spec_id": "spec_7f538f4f65ac124f47918468b4d2eea7", "definition": { "schema_version": 1, - "spec_id": "spec_fbca0f29755230d84729c1243b1d9b45", + "spec_id": "spec_7f538f4f65ac124f47918468b4d2eea7", "identity": { "identity_version": "spec1", "shape": { @@ -469,7 +469,7 @@ }, "requested_window": { "kind": "range", - "start_year": 1963, + "start_year": 1964, "end_year": 2024 } } @@ -485,15 +485,15 @@ "status": 202, "headers": { "content-type": "application/json", - "location": "/api/datasets/operations/op_cc325e96d3ac6fdb6721c2468fd261f221bc87ee5eb9d8e82cf4d1f3720bdf6e", + "location": "/api/datasets/operations/op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef", "retry-after": "2", - "x-dfo-trace-id": "a6d5bb2eff5a48578dce7fbf91715755" + "x-dfo-trace-id": "5541c591450f479485c421e20fe4d81d" }, "json": { "operation": { - "operation_id": "op_cc325e96d3ac6fdb6721c2468fd261f221bc87ee5eb9d8e82cf4d1f3720bdf6e", + "operation_id": "op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef", "status": "pending", - "poll": "/api/datasets/operations/op_cc325e96d3ac6fdb6721c2468fd261f221bc87ee5eb9d8e82cf4d1f3720bdf6e", + "poll": "/api/datasets/operations/op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef", "retry_after_ms": 1500 } } @@ -502,24 +502,24 @@ { "request": { "method": "GET", - "path": "/datasets/operations/op_cc325e96d3ac6fdb6721c2468fd261f221bc87ee5eb9d8e82cf4d1f3720bdf6e" + "path": "/datasets/operations/op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef" }, "response": { "status": 200, "headers": { "content-type": "application/json", "retry-after": "2", - "x-dfo-trace-id": "71ecc596c6034e27b8ba5dd0a5d2c744" + "x-dfo-trace-id": "3416612a1b3f4a2ebbcf8ddeff74b96a" }, "json": { "operation": { - "operation_id": "op_cc325e96d3ac6fdb6721c2468fd261f221bc87ee5eb9d8e82cf4d1f3720bdf6e", + "operation_id": "op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef", "status": "running", - "poll": "/api/datasets/operations/op_cc325e96d3ac6fdb6721c2468fd261f221bc87ee5eb9d8e82cf4d1f3720bdf6e", + "poll": "/api/datasets/operations/op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef", "retry_after_ms": 1500, "progress": { "rows_written": 0, - "estimate_rows": 109318 + "estimate_rows": 108935 } } } @@ -528,24 +528,24 @@ { "request": { "method": "GET", - "path": "/datasets/operations/op_cc325e96d3ac6fdb6721c2468fd261f221bc87ee5eb9d8e82cf4d1f3720bdf6e" + "path": "/datasets/operations/op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef" }, "response": { "status": 200, "headers": { "content-type": "application/json", "retry-after": "2", - "x-dfo-trace-id": "760a3bb2de5e430fb316b3f6a4059c67" + "x-dfo-trace-id": "65394508d86f443db7528ac38066b9e3" }, "json": { "operation": { - "operation_id": "op_cc325e96d3ac6fdb6721c2468fd261f221bc87ee5eb9d8e82cf4d1f3720bdf6e", + "operation_id": "op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef", "status": "running", - "poll": "/api/datasets/operations/op_cc325e96d3ac6fdb6721c2468fd261f221bc87ee5eb9d8e82cf4d1f3720bdf6e", + "poll": "/api/datasets/operations/op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef", "retry_after_ms": 1500, "progress": { - "rows_written": 0, - "estimate_rows": 109318 + "rows_written": 64600, + "estimate_rows": 108935 } } } @@ -554,24 +554,76 @@ { "request": { "method": "GET", - "path": "/datasets/operations/op_cc325e96d3ac6fdb6721c2468fd261f221bc87ee5eb9d8e82cf4d1f3720bdf6e" + "path": "/datasets/operations/op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef" }, "response": { "status": 200, "headers": { "content-type": "application/json", "retry-after": "2", - "x-dfo-trace-id": "15f9386c84484af983d33c6d183e5349" + "x-dfo-trace-id": "7a2d07cfe29b4993a374ee71104d461a" }, "json": { "operation": { - "operation_id": "op_cc325e96d3ac6fdb6721c2468fd261f221bc87ee5eb9d8e82cf4d1f3720bdf6e", + "operation_id": "op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef", "status": "running", - "poll": "/api/datasets/operations/op_cc325e96d3ac6fdb6721c2468fd261f221bc87ee5eb9d8e82cf4d1f3720bdf6e", + "poll": "/api/datasets/operations/op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef", "retry_after_ms": 1500, "progress": { - "rows_written": 0, - "estimate_rows": 109318 + "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": 1786, + "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" + }, + "json": { + "operation": { + "operation_id": "op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef", + "status": "running", + "poll": "/api/datasets/operations/op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef", + "retry_after_ms": 2268, + "progress": { + "rows_written": 108935, + "estimate_rows": 108935 } } } @@ -580,24 +632,50 @@ { "request": { "method": "GET", - "path": "/datasets/operations/op_cc325e96d3ac6fdb6721c2468fd261f221bc87ee5eb9d8e82cf4d1f3720bdf6e" + "path": "/datasets/operations/op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef" }, "response": { "status": 200, "headers": { "content-type": "application/json", - "x-dfo-trace-id": "2cc73cd4fbaa4a28a350025111f70a79" + "retry-after": "3", + "x-dfo-trace-id": "1ce68951ada64961b3710bb73127c9d8" }, "json": { "operation": { - "operation_id": "op_cc325e96d3ac6fdb6721c2468fd261f221bc87ee5eb9d8e82cf4d1f3720bdf6e", + "operation_id": "op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef", + "status": "running", + "poll": "/api/datasets/operations/op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef", + "retry_after_ms": 2869, + "progress": { + "rows_written": 108935, + "estimate_rows": 108935 + } + } + } + } + }, + { + "request": { + "method": "GET", + "path": "/datasets/operations/op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef" + }, + "response": { + "status": 200, + "headers": { + "content-type": "application/json", + "x-dfo-trace-id": "37207f1ea4574e4e8485e8cebd4f4edc" + }, + "json": { + "operation": { + "operation_id": "op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef", "status": "done" }, "manifest": { "schema_version": 1, "definition": { "schema_version": 1, - "spec_id": "spec_fbca0f29755230d84729c1243b1d9b45", + "spec_id": "spec_7f538f4f65ac124f47918468b4d2eea7", "identity": { "shape": { "kind": "statvar_schema", @@ -810,14 +888,14 @@ "requested_window": { "kind": "range", "end_year": 2024, - "start_year": 1963 + "start_year": 1964 } } }, - "content_version": "cv_3d58d26a874dc30b1bba7d5ad6dd90ee", - "prepared_at": "2026-10-23T18:38:28Z", + "content_version": "cv_ed2cc83eb28d4e6883cde079f05844ed", + "prepared_at": "2026-10-25T17:38:14Z", "coverage": { - "rows": 109318, + "rows": 108935, "dimensions": [ { "label": "financingProvider", @@ -839,14 +917,14 @@ }, { "label": "years", - "count": 62 + "count": 61 } ], "window": { "kind": "range", "origin": "query", "end_year": 2024, - "start_year": 1963 + "start_year": 1964 } }, "citation": { @@ -965,13 +1043,13 @@ "kind": "range", "origin": "query", "end_year": 2024, - "start_year": 1963 + "start_year": 1964 }, - "graph_revision": "dfo-dev-dc-datacommons-service-00264-2s9", + "graph_revision": "dfo-dev-dc-datacommons-service-00273-mmh", "normalisations": [], "code_index_stamp": { - "exported_at": "2026-10-23T18:14:12Z", - "content_hash": "29eb81d7b6c88641b1d4e8eb5e850ca36de66b99d6e9e09680aac020507a6392", + "exported_at": "2026-10-24T19:20:27Z", + "content_hash": "3d946d8f4986dbbe0fa3e5c4c917200381f529d89ce417c11daeb22df56eed99", "graph_endpoint": "graph_release" }, "source_revisions": [ @@ -980,8 +1058,8 @@ "revision": "2026-10-15" } ], - "capability_version": "dset_cc753cefa9199881", - "materialiser_build": "035d29cd05fb31d7cb47cfb33197d4002f773df6", + "capability_version": "dset_76f5fa7244511c58", + "materialiser_build": "99e62038ceb4b459c2ac699549076ff123c166aa", "resolved_stat_vars": [ { "ref": "dcid:Amount_FinancialFlow_Gross_Disbursement_DAC2aAidType206_Nominal", @@ -989,15 +1067,15 @@ "financingProvider", "financingRecipient" ], - "observation_count": 109318 + "observation_count": 108935 } ], "family_member_count": 1, "family_member_digest": "1a36e1a7292b1bfff95a5415de0be74cac7bb033217ed50e79faa8ce51a224c0", "frame_grammar_version": "1.1.0", - "origin_catalogue_build_id": "20261023T061534Z-06fa7b89", + "origin_catalogue_build_id": "20261024T193016Z-775d36a9", "served_from": "materialise", - "confirmed_at": "2026-10-24T16:30:59.952146+00:00" + "confirmed_at": "2026-10-25T17:38:17.505656+00:00" }, "warnings": [], "diagnostics": [ @@ -1009,34 +1087,34 @@ ], "artifacts": [ { - "artifact_digest": "sha256:9242d69bedb460996f21f782b1a85ee5cd7eb967174e3b64a4ec5ade5bebab65", + "artifact_digest": "sha256:4d80e30e27b5a64706113d54946e3a387e422b1115d1437594ac4b1d4307ffd2", "rendering": { "bundle": false, "format": "parquet", "layout": 4 }, - "bytes": 473679, + "bytes": 472796, "media_type": "application/vnd.apache.parquet", - "created_at": "2026-10-23T18:38:31.580044+00:00", + "created_at": "2026-10-25T17:38:17.426404+00:00", "tier": "working", - "url": "/api/datasets/spec_fbca0f29755230d84729c1243b1d9b45/cv_3d58d26a874dc30b1bba7d5ad6dd90ee/files/sha256:9242d69bedb460996f21f782b1a85ee5cd7eb967174e3b64a4ec5ade5bebab65", + "url": "/api/datasets/spec_7f538f4f65ac124f47918468b4d2eea7/cv_ed2cc83eb28d4e6883cde079f05844ed/files/sha256:4d80e30e27b5a64706113d54946e3a387e422b1115d1437594ac4b1d4307ffd2", "enrichment_stamp": "08ed6c734fc69ea2204a21f4e1dd8b963f14dd1e03a2484c618049ac2e2d93d8" }, { - "artifact_digest": "sha256:099d1ce36b440868b72174fb9cdff503cc4c7a0f0ef902e66484c5bfbd270f39", + "artifact_digest": "sha256:4e3ed758ad1a33cf9d150ee5fa71adf7f5bd40e4d342d839633d8386239babe1", "rendering": { "statistics": "series" }, - "bytes": 144274, + "bytes": 144449, "media_type": "application/vnd.apache.parquet", - "created_at": "2026-10-23T18:38:31.580044+00:00", + "created_at": "2026-10-25T17:38:17.426404+00:00", "tier": "working", - "url": "/api/datasets/spec_fbca0f29755230d84729c1243b1d9b45/cv_3d58d26a874dc30b1bba7d5ad6dd90ee/files/sha256:099d1ce36b440868b72174fb9cdff503cc4c7a0f0ef902e66484c5bfbd270f39" + "url": "/api/datasets/spec_7f538f4f65ac124f47918468b4d2eea7/cv_ed2cc83eb28d4e6883cde079f05844ed/files/sha256:4e3ed758ad1a33cf9d150ee5fa71adf7f5bd40e4d342d839633d8386239babe1" } ], "series_count": 3656, "output_options": { - "capability_version": "dset_cc753cefa9199881", + "capability_version": "dset_76f5fa7244511c58", "columns": [ { "name": "stat_var", @@ -1060,7 +1138,7 @@ "name": "time_period", "kind": "grain", "droppable": false, - "distinct": 62 + "distinct": 61 }, { "name": "value", @@ -1300,7 +1378,7 @@ "varying": [ { "column": "time_period", - "distinct": 62 + "distinct": 61 } ] }, @@ -1324,7 +1402,7 @@ "varying": [ { "column": "time_period", - "distinct": 62 + "distinct": 61 } ] }, @@ -1383,10 +1461,10 @@ ] } }, - "series_coverage_stamp": "0b8c9a18fcc5af19013b21e865c64481503b6a6542f7d2e6628999e6559a47de", + "series_coverage_stamp": "e6e717ab8c77e84d010915893ede5809e9ecec67929a07cfafbcc2210edfa1eb", "retention": { "pinned": false, - "held_until": "2026-11-22T18:38:31.579178Z" + "held_until": "2026-11-24T17:38:17.425152Z" } } } @@ -1395,21 +1473,21 @@ { "request": { "method": "GET", - "origin_path": "/api/datasets/spec_fbca0f29755230d84729c1243b1d9b45/cv_3d58d26a874dc30b1bba7d5ad6dd90ee/files/sha256:9242d69bedb460996f21f782b1a85ee5cd7eb967174e3b64a4ec5ade5bebab65" + "origin_path": "/api/datasets/spec_7f538f4f65ac124f47918468b4d2eea7/cv_ed2cc83eb28d4e6883cde079f05844ed/files/sha256:4d80e30e27b5a64706113d54946e3a387e422b1115d1437594ac4b1d4307ffd2" }, "response": { "status": 302, "headers": { "content-type": "text/html", - "location": "https://storage.googleapis.com/dev-fin-observatory-datasets-working/sha256%3A9242d69bedb460996f21f782b1a85ee5cd7eb967174e3b64a4ec5ade5bebab65?X-Goog-Signature=redacted", - "x-dfo-trace-id": "fb09161c837d4874970eaf5a188845da" + "location": "https://storage.googleapis.com/dev-fin-observatory-datasets-working/sha256%3A4d80e30e27b5a64706113d54946e3a387e422b1115d1437594ac4b1d4307ffd2?X-Goog-Signature=redacted", + "x-dfo-trace-id": "919c1e572d914a608b166556417714c9" } } }, { "request": { "method": "GET", - "url": "https://storage.googleapis.com/dev-fin-observatory-datasets-working/sha256%3A9242d69bedb460996f21f782b1a85ee5cd7eb967174e3b64a4ec5ade5bebab65?X-Goog-Signature=redacted" + "url": "https://storage.googleapis.com/dev-fin-observatory-datasets-working/sha256%3A4d80e30e27b5a64706113d54946e3a387e422b1115d1437594ac4b1d4307ffd2?X-Goog-Signature=redacted" }, "response": { "status": 200, @@ -1423,7 +1501,7 @@ "expect": [ { "dataset": { - "rows": 109318, + "rows": 108935, "columns": [ "stat_var", "financingProvider", @@ -1450,20 +1528,23 @@ "members": [ { "parts": [], - "spec_id": "spec_fbca0f29755230d84729c1243b1d9b45", - "content_version": "cv_3d58d26a874dc30b1bba7d5ad6dd90ee", - "sentence": "Gross disbursements to the 133 G77 countries from the 32 DAC countries for official development assistance, 1963 to 2024. Current US dollars · OECD DAC2a." + "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." } ], "missing": [], "long_builds": [ { - "operation_id": "op_cc325e96d3ac6fdb6721c2468fd261f221bc87ee5eb9d8e82cf4d1f3720bdf6e", + "operation_id": "op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef", "poll_waits": [ 1.5, 1.5, 1.5, - 1.5 + 1.5, + 1.786, + 2.268, + 2.869 ], "resubmissions": 0 } diff --git a/python/client-contract/src/dfo_client_contract/scenarios/fetch-spec-digest-mismatch.json b/python/client-contract/src/dfo_client_contract/scenarios/fetch-spec-digest-mismatch.json index ab4e913..780bf09 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 @@ -175,7 +175,7 @@ "status": 200, "headers": { "content-type": "application/json", - "x-dfo-trace-id": "bfc5cc090c4347f489fffcc62fc3d2bf" + "x-dfo-trace-id": "cdb2d56286eb4d468f447309c3bd06d9" }, "json": { "schema_version": 1, @@ -582,7 +582,7 @@ "frame_grammar_version": "1.1.0", "origin_catalogue_build_id": "20261019T174519Z-2e5e8cfd", "served_from": "head", - "confirmed_at": "2026-10-24T16:30:31.570035+00:00" + "confirmed_at": "2026-10-25T17:30:48.703616+00:00" }, "warnings": [ { @@ -627,7 +627,7 @@ ], "series_count": 1, "output_options": { - "capability_version": "dset_cc753cefa9199881", + "capability_version": "dset_76f5fa7244511c58", "columns": [ { "name": "stat_var", @@ -895,7 +895,7 @@ ] } }, - "series_coverage_stamp": "45bdd65f2fd33ac77a897180047080d33ed9db812afe0cbb887bf22e2ac52690", + "series_coverage_stamp": "e6e717ab8c77e84d010915893ede5809e9ecec67929a07cfafbcc2210edfa1eb", "retention": { "pinned": false, "held_until": "2026-11-19T13:59:18.051742Z" @@ -913,7 +913,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": "8261c9be5a7c406a80692fac6b28ee05" + "x-dfo-trace-id": "114f3d3a1c78408c92fd29cc76887fdc" } } }, @@ -940,7 +940,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": "8261c9be5a7c406a80692fac6b28ee05" + "x-dfo-trace-id": "114f3d3a1c78408c92fd29cc76887fdc" } } }, 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 38256c0..909da4f 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 @@ -177,7 +177,7 @@ "status": 200, "headers": { "content-type": "application/json", - "x-dfo-trace-id": "bfc5cc090c4347f489fffcc62fc3d2bf" + "x-dfo-trace-id": "cdb2d56286eb4d468f447309c3bd06d9" }, "json": { "schema_version": 1, @@ -584,7 +584,7 @@ "frame_grammar_version": "1.1.0", "origin_catalogue_build_id": "20261019T174519Z-2e5e8cfd", "served_from": "head", - "confirmed_at": "2026-10-24T16:30:31.570035+00:00" + "confirmed_at": "2026-10-25T17:30:48.703616+00:00" }, "warnings": [ { @@ -629,7 +629,7 @@ ], "series_count": 1, "output_options": { - "capability_version": "dset_cc753cefa9199881", + "capability_version": "dset_76f5fa7244511c58", "columns": [ { "name": "stat_var", @@ -897,7 +897,7 @@ ] } }, - "series_coverage_stamp": "45bdd65f2fd33ac77a897180047080d33ed9db812afe0cbb887bf22e2ac52690", + "series_coverage_stamp": "e6e717ab8c77e84d010915893ede5809e9ecec67929a07cfafbcc2210edfa1eb", "retention": { "pinned": false, "held_until": "2026-11-19T13:59:18.051742Z" @@ -915,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": "8261c9be5a7c406a80692fac6b28ee05" + "x-dfo-trace-id": "114f3d3a1c78408c92fd29cc76887fdc" } } }, 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 6d1c279..3996aa5 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": "0ba344270784ae9929a369da8acd00b399dfced8", - "recorded_at": "2026-10-24T16:30:35Z" + "dfo_commit": "99e62038ceb4b459c2ac699549076ff123c166aa", + "recorded_at": "2026-10-25T17:35:08Z" }, "call": [ { @@ -182,7 +182,7 @@ "status": 200, "headers": { "content-type": "application/json", - "x-dfo-trace-id": "1855a065f7494cd6ba7eecd9fd790858" + "x-dfo-trace-id": "6f43e68b9aeb46b4bc564fc277f0dd5e" }, "json": { "schema_version": 1, @@ -584,7 +584,7 @@ "frame_grammar_version": "1.1.0", "origin_catalogue_build_id": "20261020T170016Z-691bf0da", "served_from": "head", - "confirmed_at": "2026-10-24T16:30:35.784659+00:00" + "confirmed_at": "2026-10-25T17:32:57.004736+00:00" }, "warnings": [], "diagnostics": [ @@ -623,7 +623,7 @@ ], "series_count": 58, "output_options": { - "capability_version": "dset_cc753cefa9199881", + "capability_version": "dset_76f5fa7244511c58", "columns": [ { "name": "stat_var", @@ -1024,7 +1024,7 @@ ] } }, - "series_coverage_stamp": "45bdd65f2fd33ac77a897180047080d33ed9db812afe0cbb887bf22e2ac52690", + "series_coverage_stamp": "e6e717ab8c77e84d010915893ede5809e9ecec67929a07cfafbcc2210edfa1eb", "retention": { "pinned": false, "held_until": "2026-11-20T06:50:59.874372Z" @@ -1113,7 +1113,7 @@ "status": 200, "headers": { "content-type": "application/json", - "x-dfo-trace-id": "37247e5873b241a7aee7ac321de35814" + "x-dfo-trace-id": "0692c2d1a7bd4f6eaea00d7d3ebbf320" }, "json": { "schema_version": 1, @@ -1122,11 +1122,11 @@ "extract_skipped": true }, "diagnostics": { - "engine_build": "0ba344270784ae9929a369da8acd00b399dfced8", - "trace_id": "37247e5873b241a7aee7ac321de35814", + "engine_build": "99e62038ceb4b459c2ac699549076ff123c166aa", + "trace_id": "0692c2d1a7bd4f6eaea00d7d3ebbf320", "warnings": [], "timing_ms": { - "total": 442, + "total": 2, "by_step": { "coverage": 0 } @@ -1145,19 +1145,9 @@ } ], "timing_ms": { - "total": 321, + "total": 0, "by_step": { - "validate": 3, - "walk": 227, - "reread_arcs": 1, - "detect_edits": 0, - "resolve_survivors": 0, - "shape": 4, - "bind": 0, - "where_places": 0, - "materialise": 33, - "answer": 42, - "options": 11 + "response_cache_part_memo": 0 } }, "entity_refs": [], @@ -1572,7 +1562,7 @@ "label": "OECD Terms and Conditions" } }, - "coverage_stamp": "45bdd65f2fd33ac77a897180047080d33ed9db812afe0cbb887bf22e2ac52690", + "coverage_stamp": "e6e717ab8c77e84d010915893ede5809e9ecec67929a07cfafbcc2210edfa1eb", "facets": { "provenance": { "basis": "fallback", @@ -2301,7 +2291,7 @@ } ], "query_qualifiers": [], - "capability_version": "cap_9deef72763b45f40" + "capability_version": "cap_88defe77cc79e0c0" }, "confidence": "high", "available_at_place": true, @@ -2554,43 +2544,44 @@ ], "open_axis_facts": [ { - "property": "crsCooperationModality", + "property": "crsTypeOfFinance", "varies": true, - "distinct_count": 14, - "undeclared_count": 2, + "distinct_count": 2, + "undeclared_count": 0, "values": [ { "value": { - "ref": "CRSCooperationModalityC01", - "label": "project-type intervention" - }, - "count": 5 - }, - { - "value": { - "ref": "CRSCooperationModalityA02", - "label": "sector budget support" + "ref": "CRSTypeOfFinance110", + "label": "standard grant" }, - "count": 2 + "count": 9 }, { "value": { - "ref": "CRSCooperationModalityB04", - "label": "basket fund and pooled funding" + "ref": "CRSTypeOfFinance421", + "label": "standard loan" }, "count": 1 - }, + } + ] + }, + { + "property": "crsCooperationModality", + "varies": true, + "distinct_count": 8, + "undeclared_count": 1, + "values": [ { "value": { - "ref": "CRSCooperationModalityB031", - "label": "contribution to multi-donor and multi-entity funding mechanism" + "ref": "CRSCooperationModalityC01", + "label": "project-type intervention" }, - "count": 1 + "count": 2 }, { "value": { - "ref": "CRSCooperationModalityB032", - "label": "contribution to multi-donor and single-entity funding mechanism" + "ref": "CRSCooperationModalityB04", + "label": "basket fund and pooled funding" }, "count": 1 }, @@ -2622,27 +2613,6 @@ }, "count": 1 }, - { - "value": { - "ref": "CRSCooperationModalityA01", - "label": "general budget support" - }, - "count": 1 - }, - { - "value": { - "ref": "CRSCooperationModalityE02", - "label": "imputed student cost" - }, - "count": 1 - }, - { - "value": { - "ref": "CRSCooperationModalityG01", - "label": "other administrative cost" - }, - "count": 1 - }, { "value": { "ref": "CRSCooperationModalityD02", @@ -2658,49 +2628,6 @@ "count": 1 } ] - }, - { - "property": "crsTypeOfFinance", - "varies": true, - "distinct_count": 5, - "undeclared_count": 0, - "values": [ - { - "value": { - "ref": "CRSTypeOfFinance110", - "label": "standard grant" - }, - "count": 14 - }, - { - "value": { - "ref": "CRSTypeOfFinance421", - "label": "standard loan" - }, - "count": 4 - }, - { - "value": { - "ref": "CRSTypeOfFinance510", - "label": "common equity" - }, - "count": 1 - }, - { - "value": { - "ref": "CRSTypeOfFinance210", - "label": "interest subsidy" - }, - "count": 1 - }, - { - "value": { - "ref": "CRSTypeOfFinance520", - "label": "share in collective investment vehicle" - }, - "count": 1 - } - ] } ], "role_axis_facts": [ @@ -4933,7 +4860,7 @@ "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": "c76ebbf49c774bb7acee93d8877f450d" + "x-dfo-trace-id": "87314d01b1d242878c925123dd2c645e" } } }, 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 9cf73b6..16617f3 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": "0ba344270784ae9929a369da8acd00b399dfced8", - "recorded_at": "2026-10-24T16:30:33Z" + "dfo_commit": "99e62038ceb4b459c2ac699549076ff123c166aa", + "recorded_at": "2026-10-25T17:35:07Z" }, "call": [ { @@ -187,7 +187,7 @@ "status": 200, "headers": { "content-type": "application/json", - "x-dfo-trace-id": "102dc8c602004615becaa7905509e259" + "x-dfo-trace-id": "c300bd110ab946ca8d84150069c17dca" }, "json": { "schema_version": 1, @@ -592,7 +592,7 @@ "frame_grammar_version": "1.1.0", "origin_catalogue_build_id": "20261020T170016Z-691bf0da", "served_from": "head", - "confirmed_at": "2026-10-24T16:30:33.522693+00:00" + "confirmed_at": "2026-10-25T17:32:54.857057+00:00" }, "warnings": [], "diagnostics": [ @@ -631,7 +631,7 @@ ], "series_count": 2, "output_options": { - "capability_version": "dset_cc753cefa9199881", + "capability_version": "dset_76f5fa7244511c58", "columns": [ { "name": "stat_var", @@ -914,7 +914,7 @@ ] } }, - "series_coverage_stamp": "45bdd65f2fd33ac77a897180047080d33ed9db812afe0cbb887bf22e2ac52690", + "series_coverage_stamp": "e6e717ab8c77e84d010915893ede5809e9ecec67929a07cfafbcc2210edfa1eb", "retention": { "pinned": false, "held_until": "2026-11-20T06:50:59.083841Z" @@ -1006,7 +1006,7 @@ "status": 200, "headers": { "content-type": "application/json", - "x-dfo-trace-id": "c379d5c730dc4f85b1a5630c2a8b85f8" + "x-dfo-trace-id": "cda5e03a69994294aafeced4e9f7c863" }, "json": { "schema_version": 1, @@ -1015,11 +1015,11 @@ "extract_skipped": true }, "diagnostics": { - "engine_build": "0ba344270784ae9929a369da8acd00b399dfced8", - "trace_id": "c379d5c730dc4f85b1a5630c2a8b85f8", + "engine_build": "99e62038ceb4b459c2ac699549076ff123c166aa", + "trace_id": "cda5e03a69994294aafeced4e9f7c863", "warnings": [], "timing_ms": { - "total": 461, + "total": 1, "by_step": { "coverage": 0 } @@ -1032,19 +1032,9 @@ "variable_text": "dataset", "warnings": [], "timing_ms": { - "total": 405, + "total": 0, "by_step": { - "validate": 4, - "walk": 190, - "reread_arcs": 2, - "detect_edits": 0, - "resolve_survivors": 0, - "shape": 4, - "bind": 0, - "where_places": 93, - "materialise": 14, - "answer": 95, - "options": 3 + "response_cache_part_memo": 0 } }, "entity_refs": [], @@ -1124,7 +1114,7 @@ "resolved": { "shape": { "shape_id": "financialflow_amount_measuredvalue_nominal", - "label": "gross disbursements (basic health care, official development assistance)", + "label": "gross disbursements (basic health care, official development assistance, standard grant)", "population_type": { "ref": "FinancialFlow", "label": "financial flow" @@ -1458,7 +1448,7 @@ "label": "OECD Terms and Conditions" } }, - "coverage_stamp": "45bdd65f2fd33ac77a897180047080d33ed9db812afe0cbb887bf22e2ac52690", + "coverage_stamp": "e6e717ab8c77e84d010915893ede5809e9ecec67929a07cfafbcc2210edfa1eb", "facets": { "provenance": { "basis": "fallback", @@ -1732,6 +1722,7 @@ "segment": "heading", "entity_refs": [], "states": [ + "how:crsTypeOfFinance", "how:crsTypeOfFlow", "how:financialFlowType", "how:nettingBasis", @@ -2057,7 +2048,7 @@ } ], "query_qualifiers": [], - "capability_version": "cap_9deef72763b45f40" + "capability_version": "cap_88defe77cc79e0c0" }, "confidence": "high", "available_at_place": true, @@ -2318,65 +2309,9 @@ { "property": "crsCooperationModality", "varies": true, - "distinct_count": 14, - "undeclared_count": 2, + "distinct_count": 2, + "undeclared_count": 0, "values": [ - { - "value": { - "ref": "CRSCooperationModalityC01", - "label": "project-type intervention" - }, - "count": 5 - }, - { - "value": { - "ref": "CRSCooperationModalityA02", - "label": "sector budget support" - }, - "count": 2 - }, - { - "value": { - "ref": "CRSCooperationModalityB04", - "label": "basket fund and pooled funding" - }, - "count": 1 - }, - { - "value": { - "ref": "CRSCooperationModalityB031", - "label": "contribution to multi-donor and multi-entity funding mechanism" - }, - "count": 1 - }, - { - "value": { - "ref": "CRSCooperationModalityB032", - "label": "contribution to multi-donor and single-entity funding mechanism" - }, - "count": 1 - }, - { - "value": { - "ref": "CRSCooperationModalityB033", - "label": "contribution to single-donor funding mechanism or earmarked contribution to a specific funding window or geographical location" - }, - "count": 1 - }, - { - "value": { - "ref": "CRSCooperationModalityB03", - "label": "contribution to specific-purpose programme and fund managed by an international organisation" - }, - "count": 1 - }, - { - "value": { - "ref": "CRSCooperationModalityB01", - "label": "core support to non-governmental organisations, other private bodies, public-private partnerships, and research institutes" - }, - "count": 1 - }, { "value": { "ref": "CRSCooperationModalityD01", @@ -2386,36 +2321,8 @@ }, { "value": { - "ref": "CRSCooperationModalityA01", - "label": "general budget support" - }, - "count": 1 - }, - { - "value": { - "ref": "CRSCooperationModalityE02", - "label": "imputed student cost" - }, - "count": 1 - }, - { - "value": { - "ref": "CRSCooperationModalityG01", - "label": "other administrative cost" - }, - "count": 1 - }, - { - "value": { - "ref": "CRSCooperationModalityD02", - "label": "other technical assistance" - }, - "count": 1 - }, - { - "value": { - "ref": "CRSCooperationModalityE01", - "label": "scholarship and training in donor country" + "ref": "CRSCooperationModalityC01", + "label": "project-type intervention" }, "count": 1 } @@ -2423,8 +2330,12 @@ }, { "property": "crsTypeOfFinance", - "varies": true, - "distinct_count": 5, + "varies": false, + "value": { + "ref": "CRSTypeOfFinance110", + "label": "standard grant" + }, + "distinct_count": 1, "undeclared_count": 0, "values": [ { @@ -2432,35 +2343,7 @@ "ref": "CRSTypeOfFinance110", "label": "standard grant" }, - "count": 14 - }, - { - "value": { - "ref": "CRSTypeOfFinance421", - "label": "standard loan" - }, - "count": 4 - }, - { - "value": { - "ref": "CRSTypeOfFinance510", - "label": "common equity" - }, - "count": 1 - }, - { - "value": { - "ref": "CRSTypeOfFinance210", - "label": "interest subsidy" - }, - "count": 1 - }, - { - "value": { - "ref": "CRSTypeOfFinance520", - "label": "share in collective investment vehicle" - }, - "count": 1 + "count": 2 } ] } @@ -4474,6 +4357,7 @@ "segment": "heading", "entity_refs": [], "states": [ + "how:crsTypeOfFinance", "how:crsTypeOfFlow", "how:financialFlowType", "how:nettingBasis", @@ -4664,7 +4548,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": "9e24d0570f8f4988a32209d5670538c9" + "x-dfo-trace-id": "6e619a68dbf24322b376474542adb146" } } }, 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 4130d61..6d9cca9 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 @@ -175,7 +175,7 @@ "status": 200, "headers": { "content-type": "application/json", - "x-dfo-trace-id": "bfc5cc090c4347f489fffcc62fc3d2bf" + "x-dfo-trace-id": "cdb2d56286eb4d468f447309c3bd06d9" }, "json": { "schema_version": 1, @@ -582,7 +582,7 @@ "frame_grammar_version": "1.1.0", "origin_catalogue_build_id": "20261019T174519Z-2e5e8cfd", "served_from": "head", - "confirmed_at": "2026-10-24T16:30:31.570035+00:00" + "confirmed_at": "2026-10-25T17:30:48.703616+00:00" }, "warnings": [ { @@ -627,7 +627,7 @@ ], "series_count": 1, "output_options": { - "capability_version": "dset_cc753cefa9199881", + "capability_version": "dset_76f5fa7244511c58", "columns": [ { "name": "stat_var", @@ -895,7 +895,7 @@ ] } }, - "series_coverage_stamp": "45bdd65f2fd33ac77a897180047080d33ed9db812afe0cbb887bf22e2ac52690", + "series_coverage_stamp": "e6e717ab8c77e84d010915893ede5809e9ecec67929a07cfafbcc2210edfa1eb", "retention": { "pinned": false, "held_until": "2026-11-19T13:59:18.051742Z" @@ -911,7 +911,7 @@ "response": { "status": 204, "headers": { - "x-dfo-trace-id": "8261c9be5a7c406a80692fac6b28ee05" + "x-dfo-trace-id": "114f3d3a1c78408c92fd29cc76887fdc" } } } @@ -921,7 +921,7 @@ "error": { "class": "ContractError", "code": "unexpected_response", - "trace_id": "8261c9be5a7c406a80692fac6b28ee05" + "trace_id": "114f3d3a1c78408c92fd29cc76887fdc" } } ] 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 818ed05..6b6f585 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 @@ -175,7 +175,7 @@ "status": 200, "headers": { "content-type": "application/json", - "x-dfo-trace-id": "bfc5cc090c4347f489fffcc62fc3d2bf" + "x-dfo-trace-id": "cdb2d56286eb4d468f447309c3bd06d9" }, "json": { "schema_version": 1, @@ -582,7 +582,7 @@ "frame_grammar_version": "1.1.0", "origin_catalogue_build_id": "20261019T174519Z-2e5e8cfd", "served_from": "head", - "confirmed_at": "2026-10-24T16:30:31.570035+00:00" + "confirmed_at": "2026-10-25T17:30:48.703616+00:00" }, "warnings": [ { @@ -627,7 +627,7 @@ ], "series_count": 1, "output_options": { - "capability_version": "dset_cc753cefa9199881", + "capability_version": "dset_76f5fa7244511c58", "columns": [ { "name": "stat_var", @@ -895,7 +895,7 @@ ] } }, - "series_coverage_stamp": "45bdd65f2fd33ac77a897180047080d33ed9db812afe0cbb887bf22e2ac52690", + "series_coverage_stamp": "e6e717ab8c77e84d010915893ede5809e9ecec67929a07cfafbcc2210edfa1eb", "retention": { "pinned": false, "held_until": "2026-11-19T13:59:18.051742Z" @@ -912,7 +912,7 @@ "status": 200, "headers": { "content-type": "application/vnd.apache.parquet", - "x-dfo-trace-id": "8261c9be5a7c406a80692fac6b28ee05" + "x-dfo-trace-id": "114f3d3a1c78408c92fd29cc76887fdc" }, "body_file": "fetch-spec-known-sentence.parquet" } diff --git a/python/client-contract/src/dfo_client_contract/scenarios/fetch-spec-files-route-temporary-redirect.json b/python/client-contract/src/dfo_client_contract/scenarios/fetch-spec-files-route-temporary-redirect.json index c24d0d2..9415cf0 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 @@ -175,7 +175,7 @@ "status": 200, "headers": { "content-type": "application/json", - "x-dfo-trace-id": "bfc5cc090c4347f489fffcc62fc3d2bf" + "x-dfo-trace-id": "cdb2d56286eb4d468f447309c3bd06d9" }, "json": { "schema_version": 1, @@ -582,7 +582,7 @@ "frame_grammar_version": "1.1.0", "origin_catalogue_build_id": "20261019T174519Z-2e5e8cfd", "served_from": "head", - "confirmed_at": "2026-10-24T16:30:31.570035+00:00" + "confirmed_at": "2026-10-25T17:30:48.703616+00:00" }, "warnings": [ { @@ -627,7 +627,7 @@ ], "series_count": 1, "output_options": { - "capability_version": "dset_cc753cefa9199881", + "capability_version": "dset_76f5fa7244511c58", "columns": [ { "name": "stat_var", @@ -895,7 +895,7 @@ ] } }, - "series_coverage_stamp": "45bdd65f2fd33ac77a897180047080d33ed9db812afe0cbb887bf22e2ac52690", + "series_coverage_stamp": "e6e717ab8c77e84d010915893ede5809e9ecec67929a07cfafbcc2210edfa1eb", "retention": { "pinned": false, "held_until": "2026-11-19T13:59:18.051742Z" @@ -912,7 +912,7 @@ "status": 307, "headers": { "location": "https://storage.googleapis.com/dev-fin-observatory-datasets-working/sha256%3Ac44200969f19d73104d1bc24ebca905e59f749c2939234cdde10ba6f5a131170?X-Goog-Signature=redacted", - "x-dfo-trace-id": "8261c9be5a7c406a80692fac6b28ee05" + "x-dfo-trace-id": "114f3d3a1c78408c92fd29cc76887fdc" } } } @@ -922,7 +922,7 @@ "error": { "class": "ContractError", "code": "unexpected_response", - "trace_id": "8261c9be5a7c406a80692fac6b28ee05" + "trace_id": "114f3d3a1c78408c92fd29cc76887fdc" } } ] 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 6e83998..b28d40b 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 @@ -175,7 +175,7 @@ "status": 200, "headers": { "content-type": "application/json", - "x-dfo-trace-id": "bfc5cc090c4347f489fffcc62fc3d2bf" + "x-dfo-trace-id": "cdb2d56286eb4d468f447309c3bd06d9" }, "json": { "schema_version": 1, @@ -582,7 +582,7 @@ "frame_grammar_version": "1.1.0", "origin_catalogue_build_id": "20261019T174519Z-2e5e8cfd", "served_from": "head", - "confirmed_at": "2026-10-24T16:30:31.570035+00:00" + "confirmed_at": "2026-10-25T17:30:48.703616+00:00" }, "warnings": [ { @@ -627,7 +627,7 @@ ], "series_count": 1, "output_options": { - "capability_version": "dset_cc753cefa9199881", + "capability_version": "dset_76f5fa7244511c58", "columns": [ { "name": "stat_var", @@ -895,7 +895,7 @@ ] } }, - "series_coverage_stamp": "45bdd65f2fd33ac77a897180047080d33ed9db812afe0cbb887bf22e2ac52690", + "series_coverage_stamp": "e6e717ab8c77e84d010915893ede5809e9ecec67929a07cfafbcc2210edfa1eb", "retention": { "pinned": false, "held_until": "2026-11-19T13:59:18.051742Z" @@ -909,7 +909,7 @@ "error": { "class": "ContractError", "code": "contract_violation", - "trace_id": "bfc5cc090c4347f489fffcc62fc3d2bf" + "trace_id": "cdb2d56286eb4d468f447309c3bd06d9" } } ] 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 728a173..c92644e 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": "0ba344270784ae9929a369da8acd00b399dfced8", - "recorded_at": "2026-10-24T16:31:23Z" + "dfo_commit": "99e62038ceb4b459c2ac699549076ff123c166aa", + "recorded_at": "2026-10-25T17:36:43Z" }, "call": [ { @@ -174,7 +174,7 @@ "status": 200, "headers": { "content-type": "application/json", - "x-dfo-trace-id": "bb332867f3894a6291e202e0b4666901" + "x-dfo-trace-id": "02d03065ffb242dbb868f3f7b8d63608" }, "json": { "schema_version": 1, @@ -575,7 +575,7 @@ "frame_grammar_version": "1.1.0", "origin_catalogue_build_id": "20261011T194155Z-80081f08", "served_from": "head", - "confirmed_at": "2026-10-24T16:30:05.017544+00:00" + "confirmed_at": "2026-10-25T17:22:10.027136+00:00" }, "warnings": [ { @@ -619,7 +619,7 @@ ], "series_count": 5, "output_options": { - "capability_version": "dset_cc753cefa9199881", + "capability_version": "dset_76f5fa7244511c58", "columns": [ { "name": "stat_var", @@ -902,7 +902,7 @@ ] } }, - "series_coverage_stamp": "45bdd65f2fd33ac77a897180047080d33ed9db812afe0cbb887bf22e2ac52690", + "series_coverage_stamp": "e6e717ab8c77e84d010915893ede5809e9ecec67929a07cfafbcc2210edfa1eb", "retention": { "pinned": true } @@ -919,7 +919,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": "1621b753678947a1ab313a52be193785" + "x-dfo-trace-id": "3b2bd09c3ba0491596f2ff115a040356" } } }, 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 9a5b59c..5211725 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": "0ba344270784ae9929a369da8acd00b399dfced8", - "recorded_at": "2026-10-24T16:30:37Z" + "dfo_commit": "99e62038ceb4b459c2ac699549076ff123c166aa", + "recorded_at": "2026-10-25T17:35:10Z" }, "call": [ { @@ -249,7 +249,7 @@ "status": 200, "headers": { "content-type": "application/json", - "x-dfo-trace-id": "031e93c3d83b4ef9bbead5c617599dee" + "x-dfo-trace-id": "2c5831471ed840c29a3775450547ab35" }, "json": { "schema_version": 1, @@ -535,7 +535,7 @@ "frame_grammar_version": "1.1.0", "origin_catalogue_build_id": "20261021T070020Z-7262111e", "served_from": "head", - "confirmed_at": "2026-10-24T16:30:41.604527+00:00" + "confirmed_at": "2026-10-25T17:33:02.255719+00:00" }, "warnings": [ { @@ -580,7 +580,7 @@ ], "series_count": 43, "output_options": { - "capability_version": "dset_cc753cefa9199881", + "capability_version": "dset_76f5fa7244511c58", "columns": [ { "name": "stat_var", @@ -869,7 +869,7 @@ ] } }, - "series_coverage_stamp": "45bdd65f2fd33ac77a897180047080d33ed9db812afe0cbb887bf22e2ac52690", + "series_coverage_stamp": "e6e717ab8c77e84d010915893ede5809e9ecec67929a07cfafbcc2210edfa1eb", "retention": { "pinned": false, "held_until": "2026-11-20T07:08:48.808348Z" @@ -999,7 +999,7 @@ "status": 200, "headers": { "content-type": "application/json", - "x-dfo-trace-id": "11177bfa56c249feaec154d376c0e318" + "x-dfo-trace-id": "134afaa6b00f4af9aca4184c7e3b3da3" }, "json": { "schema_version": 1, @@ -1008,11 +1008,11 @@ "extract_skipped": true }, "diagnostics": { - "engine_build": "0ba344270784ae9929a369da8acd00b399dfced8", - "trace_id": "11177bfa56c249feaec154d376c0e318", + "engine_build": "99e62038ceb4b459c2ac699549076ff123c166aa", + "trace_id": "134afaa6b00f4af9aca4184c7e3b3da3", "warnings": [], "timing_ms": { - "total": 1198, + "total": 2, "by_step": { "coverage": 0 } @@ -1025,19 +1025,9 @@ "variable_text": "dataset", "warnings": [], "timing_ms": { - "total": 1118, + "total": 0, "by_step": { - "validate": 0, - "walk": 11, - "reread_arcs": 0, - "detect_edits": 0, - "resolve_survivors": 0, - "shape": 1069, - "bind": 0, - "where_places": 1, - "materialise": 24, - "answer": 11, - "options": 2 + "response_cache_part_memo": 0 } }, "entity_refs": [], @@ -2030,7 +2020,7 @@ "label": "OECD Terms and Conditions" } }, - "coverage_stamp": "45bdd65f2fd33ac77a897180047080d33ed9db812afe0cbb887bf22e2ac52690", + "coverage_stamp": "e6e717ab8c77e84d010915893ede5809e9ecec67929a07cfafbcc2210edfa1eb", "facets": { "provenance": { "basis": "fallback", @@ -2872,7 +2862,7 @@ "start_year": 2020, "end_year": 2023 }, - "capability_version": "cap_9deef72763b45f40" + "capability_version": "cap_88defe77cc79e0c0" }, "confidence": "high", "available_at_place": true, @@ -5312,7 +5302,7 @@ "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": "f34686e7f0454a87b31b8f3a23ee43a4" + "x-dfo-trace-id": "b41ac53e34ed4270be2c55a3276a92dd" } } }, 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 e961827..f6a6faf 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": "0ba344270784ae9929a369da8acd00b399dfced8", - "recorded_at": "2026-10-24T16:30:44Z" + "dfo_commit": "99e62038ceb4b459c2ac699549076ff123c166aa", + "recorded_at": "2026-10-25T17:35:12Z" }, "call": [ { @@ -296,7 +296,7 @@ "status": 200, "headers": { "content-type": "application/json", - "x-dfo-trace-id": "be9bb0e6abf54384a9226f44f6f09902" + "x-dfo-trace-id": "1db6e6a9c94644ec858a7a31d195930a" }, "json": { "schema_version": 1, @@ -580,7 +580,7 @@ "frame_grammar_version": "1.1.0", "origin_catalogue_build_id": "20261021T070020Z-7262111e", "served_from": "head", - "confirmed_at": "2026-10-24T16:30:44.568363+00:00" + "confirmed_at": "2026-10-25T17:33:05.340244+00:00" }, "warnings": [], "diagnostics": [ @@ -619,7 +619,7 @@ ], "series_count": 44, "output_options": { - "capability_version": "dset_cc753cefa9199881", + "capability_version": "dset_76f5fa7244511c58", "columns": [ { "name": "stat_var", @@ -908,7 +908,7 @@ ] } }, - "series_coverage_stamp": "45bdd65f2fd33ac77a897180047080d33ed9db812afe0cbb887bf22e2ac52690", + "series_coverage_stamp": "e6e717ab8c77e84d010915893ede5809e9ecec67929a07cfafbcc2210edfa1eb", "retention": { "pinned": false, "held_until": "2026-11-20T07:08:52.858156Z" @@ -1036,7 +1036,7 @@ "status": 200, "headers": { "content-type": "application/json", - "x-dfo-trace-id": "de81189cf3d441c69f9bc70f4786a3d4" + "x-dfo-trace-id": "c64c8515eff046ba82eaa03c3c51f486" }, "json": { "schema_version": 1, @@ -1045,11 +1045,11 @@ "extract_skipped": true }, "diagnostics": { - "engine_build": "0ba344270784ae9929a369da8acd00b399dfced8", - "trace_id": "de81189cf3d441c69f9bc70f4786a3d4", + "engine_build": "99e62038ceb4b459c2ac699549076ff123c166aa", + "trace_id": "c64c8515eff046ba82eaa03c3c51f486", "warnings": [], "timing_ms": { - "total": 2566, + "total": 2, "by_step": { "coverage": 0 } @@ -1062,19 +1062,9 @@ "variable_text": "dataset", "warnings": [], "timing_ms": { - "total": 2493, + "total": 0, "by_step": { - "validate": 1, - "walk": 10, - "reread_arcs": 1, - "detect_edits": 0, - "resolve_survivors": 0, - "shape": 1756, - "bind": 1, - "where_places": 0, - "materialise": 20, - "answer": 702, - "options": 2 + "response_cache_part_memo": 0 } }, "entity_refs": [], @@ -2045,7 +2035,7 @@ "label": "OECD Terms and Conditions" } }, - "coverage_stamp": "45bdd65f2fd33ac77a897180047080d33ed9db812afe0cbb887bf22e2ac52690", + "coverage_stamp": "e6e717ab8c77e84d010915893ede5809e9ecec67929a07cfafbcc2210edfa1eb", "facets": { "provenance": { "basis": "fallback", @@ -2883,7 +2873,7 @@ } ], "query_qualifiers": [], - "capability_version": "cap_9deef72763b45f40" + "capability_version": "cap_88defe77cc79e0c0" }, "confidence": "high", "available_at_place": true, @@ -5311,7 +5301,7 @@ "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": "d62572e0146a43f89d89c138493238e1" + "x-dfo-trace-id": "c4da26b179f04d4c8b5df81740f01830" } } }, 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 f58acdc..499fb18 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": "0ba344270784ae9929a369da8acd00b399dfced8", - "recorded_at": "2026-10-24T16:30:48Z" + "dfo_commit": "99e62038ceb4b459c2ac699549076ff123c166aa", + "recorded_at": "2026-10-25T17:35:13Z" }, "call": [ { @@ -176,7 +176,7 @@ "status": 200, "headers": { "content-type": "application/json", - "x-dfo-trace-id": "bfc5cc090c4347f489fffcc62fc3d2bf" + "x-dfo-trace-id": "cdb2d56286eb4d468f447309c3bd06d9" }, "json": { "schema_version": 1, @@ -583,7 +583,7 @@ "frame_grammar_version": "1.1.0", "origin_catalogue_build_id": "20261019T174519Z-2e5e8cfd", "served_from": "head", - "confirmed_at": "2026-10-24T16:30:31.570035+00:00" + "confirmed_at": "2026-10-25T17:30:48.703616+00:00" }, "warnings": [ { @@ -628,7 +628,7 @@ ], "series_count": 1, "output_options": { - "capability_version": "dset_cc753cefa9199881", + "capability_version": "dset_76f5fa7244511c58", "columns": [ { "name": "stat_var", @@ -896,7 +896,7 @@ ] } }, - "series_coverage_stamp": "45bdd65f2fd33ac77a897180047080d33ed9db812afe0cbb887bf22e2ac52690", + "series_coverage_stamp": "e6e717ab8c77e84d010915893ede5809e9ecec67929a07cfafbcc2210edfa1eb", "retention": { "pinned": false, "held_until": "2026-11-19T13:59:18.051742Z" @@ -914,7 +914,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": "8261c9be5a7c406a80692fac6b28ee05" + "x-dfo-trace-id": "114f3d3a1c78408c92fd29cc76887fdc" } } }, 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 5f174b5..a1656d2 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 @@ -175,7 +175,7 @@ "status": 200, "headers": { "content-type": "application/json", - "x-dfo-trace-id": "bfc5cc090c4347f489fffcc62fc3d2bf" + "x-dfo-trace-id": "cdb2d56286eb4d468f447309c3bd06d9" }, "json": { "schema_version": 1, @@ -517,7 +517,7 @@ "frame_grammar_version": "1.1.0", "origin_catalogue_build_id": "20261019T174519Z-2e5e8cfd", "served_from": "head", - "confirmed_at": "2026-10-24T16:30:31.570035+00:00" + "confirmed_at": "2026-10-25T17:30:48.703616+00:00" }, "warnings": [ { @@ -562,7 +562,7 @@ ], "series_count": 1, "output_options": { - "capability_version": "dset_cc753cefa9199881", + "capability_version": "dset_76f5fa7244511c58", "columns": [ { "name": "stat_var", @@ -830,7 +830,7 @@ ] } }, - "series_coverage_stamp": "45bdd65f2fd33ac77a897180047080d33ed9db812afe0cbb887bf22e2ac52690", + "series_coverage_stamp": "e6e717ab8c77e84d010915893ede5809e9ecec67929a07cfafbcc2210edfa1eb", "retention": { "pinned": false, "held_until": "2026-11-19T13:59:18.051742Z" @@ -844,7 +844,7 @@ "error": { "class": "ContractError", "code": "contract_violation", - "trace_id": "bfc5cc090c4347f489fffcc62fc3d2bf" + "trace_id": "cdb2d56286eb4d468f447309c3bd06d9" } } ] 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 40803a3..7312f8f 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 @@ -175,7 +175,7 @@ "status": 200, "headers": { "content-type": "application/json", - "x-dfo-trace-id": "bfc5cc090c4347f489fffcc62fc3d2bf" + "x-dfo-trace-id": "cdb2d56286eb4d468f447309c3bd06d9" }, "json": { "schema_version": 1, @@ -581,7 +581,7 @@ "frame_grammar_version": "1.1.0", "origin_catalogue_build_id": "20261019T174519Z-2e5e8cfd", "served_from": "head", - "confirmed_at": "2026-10-24T16:30:31.570035+00:00" + "confirmed_at": "2026-10-25T17:30:48.703616+00:00" }, "warnings": [ { @@ -626,7 +626,7 @@ ], "series_count": 1, "output_options": { - "capability_version": "dset_cc753cefa9199881", + "capability_version": "dset_76f5fa7244511c58", "columns": [ { "name": "stat_var", @@ -894,7 +894,7 @@ ] } }, - "series_coverage_stamp": "45bdd65f2fd33ac77a897180047080d33ed9db812afe0cbb887bf22e2ac52690", + "series_coverage_stamp": "e6e717ab8c77e84d010915893ede5809e9ecec67929a07cfafbcc2210edfa1eb", "retention": { "pinned": false, "held_until": "2026-11-19T13:59:18.051742Z" @@ -908,7 +908,7 @@ "error": { "class": "ContractError", "code": "contract_violation", - "trace_id": "bfc5cc090c4347f489fffcc62fc3d2bf" + "trace_id": "cdb2d56286eb4d468f447309c3bd06d9" } } ] 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 3e6c833..14be33c 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": "0ba344270784ae9929a369da8acd00b399dfced8", - "recorded_at": "2026-10-24T16:30:30Z" + "dfo_commit": "99e62038ceb4b459c2ac699549076ff123c166aa", + "recorded_at": "2026-10-25T17:35:05Z" }, "call": [ { @@ -183,7 +183,7 @@ "status": 200, "headers": { "content-type": "application/json", - "x-dfo-trace-id": "a1fe53d87b784d23bcc55926b9530dec" + "x-dfo-trace-id": "dbd045d5a84b4818a273bafc3e808e9c" }, "json": { "schema_version": 1, @@ -590,7 +590,7 @@ "frame_grammar_version": "1.1.0", "origin_catalogue_build_id": "20261019T174519Z-2e5e8cfd", "served_from": "head", - "confirmed_at": "2026-10-24T16:30:31.570035+00:00" + "confirmed_at": "2026-10-25T17:30:48.703616+00:00" }, "warnings": [ { @@ -635,7 +635,7 @@ ], "series_count": 1, "output_options": { - "capability_version": "dset_cc753cefa9199881", + "capability_version": "dset_76f5fa7244511c58", "columns": [ { "name": "stat_var", @@ -903,7 +903,7 @@ ] } }, - "series_coverage_stamp": "45bdd65f2fd33ac77a897180047080d33ed9db812afe0cbb887bf22e2ac52690", + "series_coverage_stamp": "e6e717ab8c77e84d010915893ede5809e9ecec67929a07cfafbcc2210edfa1eb", "retention": { "pinned": false, "held_until": "2026-11-19T13:59:18.051742Z" @@ -997,7 +997,7 @@ "status": 200, "headers": { "content-type": "application/json", - "x-dfo-trace-id": "c4313642ac68484fb1d13d6f7b206d66" + "x-dfo-trace-id": "10b2cc32955e4dd1bdbb44ea217a46a1" }, "json": { "schema_version": 1, @@ -1006,11 +1006,11 @@ "extract_skipped": true }, "diagnostics": { - "engine_build": "0ba344270784ae9929a369da8acd00b399dfced8", - "trace_id": "c4313642ac68484fb1d13d6f7b206d66", + "engine_build": "99e62038ceb4b459c2ac699549076ff123c166aa", + "trace_id": "10b2cc32955e4dd1bdbb44ea217a46a1", "warnings": [], "timing_ms": { - "total": 340, + "total": 2, "by_step": { "coverage": 0 } @@ -1023,19 +1023,9 @@ "variable_text": "dataset", "warnings": [], "timing_ms": { - "total": 256, + "total": 0, "by_step": { - "validate": 4, - "walk": 219, - "reread_arcs": 1, - "detect_edits": 0, - "resolve_survivors": 0, - "shape": 3, - "bind": 1, - "where_places": 0, - "materialise": 12, - "answer": 14, - "options": 2 + "response_cache_part_memo": 0 } }, "entity_refs": [], @@ -1117,7 +1107,7 @@ "resolved": { "shape": { "shape_id": "financialflow_amount_measuredvalue_nominal", - "label": "gross disbursements (basic health care, official development assistance)", + "label": "gross disbursements (basic health care, official development assistance, core support to non-governmental organisations, other private bodies, public-private partnerships, and research institutes, standard grant)", "population_type": { "ref": "FinancialFlow", "label": "financial flow" @@ -1469,7 +1459,7 @@ "label": "OECD Terms and Conditions" } }, - "coverage_stamp": "45bdd65f2fd33ac77a897180047080d33ed9db812afe0cbb887bf22e2ac52690", + "coverage_stamp": "e6e717ab8c77e84d010915893ede5809e9ecec67929a07cfafbcc2210edfa1eb", "facets": { "provenance": { "basis": "fallback", @@ -1703,6 +1693,8 @@ "segment": "heading", "entity_refs": [], "states": [ + "how:crsCooperationModality", + "how:crsTypeOfFinance", "how:crsTypeOfFlow", "how:financialFlowType", "how:nettingBasis", @@ -2032,7 +2024,7 @@ "start_year": 2020, "end_year": 2023 }, - "capability_version": "cap_9deef72763b45f40" + "capability_version": "cap_88defe77cc79e0c0" }, "confidence": "high", "available_at_place": true, @@ -2296,114 +2288,31 @@ "open_axis_facts": [ { "property": "crsCooperationModality", - "varies": true, - "distinct_count": 14, - "undeclared_count": 2, + "varies": false, + "value": { + "ref": "CRSCooperationModalityB01", + "label": "core support to non-governmental organisations, other private bodies, public-private partnerships, and research institutes" + }, + "distinct_count": 1, + "undeclared_count": 0, "values": [ - { - "value": { - "ref": "CRSCooperationModalityC01", - "label": "project-type intervention" - }, - "count": 5 - }, - { - "value": { - "ref": "CRSCooperationModalityA02", - "label": "sector budget support" - }, - "count": 2 - }, - { - "value": { - "ref": "CRSCooperationModalityB04", - "label": "basket fund and pooled funding" - }, - "count": 1 - }, - { - "value": { - "ref": "CRSCooperationModalityB031", - "label": "contribution to multi-donor and multi-entity funding mechanism" - }, - "count": 1 - }, - { - "value": { - "ref": "CRSCooperationModalityB032", - "label": "contribution to multi-donor and single-entity funding mechanism" - }, - "count": 1 - }, - { - "value": { - "ref": "CRSCooperationModalityB033", - "label": "contribution to single-donor funding mechanism or earmarked contribution to a specific funding window or geographical location" - }, - "count": 1 - }, - { - "value": { - "ref": "CRSCooperationModalityB03", - "label": "contribution to specific-purpose programme and fund managed by an international organisation" - }, - "count": 1 - }, { "value": { "ref": "CRSCooperationModalityB01", "label": "core support to non-governmental organisations, other private bodies, public-private partnerships, and research institutes" }, "count": 1 - }, - { - "value": { - "ref": "CRSCooperationModalityD01", - "label": "donor country personnel" - }, - "count": 1 - }, - { - "value": { - "ref": "CRSCooperationModalityA01", - "label": "general budget support" - }, - "count": 1 - }, - { - "value": { - "ref": "CRSCooperationModalityE02", - "label": "imputed student cost" - }, - "count": 1 - }, - { - "value": { - "ref": "CRSCooperationModalityG01", - "label": "other administrative cost" - }, - "count": 1 - }, - { - "value": { - "ref": "CRSCooperationModalityD02", - "label": "other technical assistance" - }, - "count": 1 - }, - { - "value": { - "ref": "CRSCooperationModalityE01", - "label": "scholarship and training in donor country" - }, - "count": 1 } ] }, { "property": "crsTypeOfFinance", - "varies": true, - "distinct_count": 5, + "varies": false, + "value": { + "ref": "CRSTypeOfFinance110", + "label": "standard grant" + }, + "distinct_count": 1, "undeclared_count": 0, "values": [ { @@ -2411,34 +2320,6 @@ "ref": "CRSTypeOfFinance110", "label": "standard grant" }, - "count": 14 - }, - { - "value": { - "ref": "CRSTypeOfFinance421", - "label": "standard loan" - }, - "count": 4 - }, - { - "value": { - "ref": "CRSTypeOfFinance510", - "label": "common equity" - }, - "count": 1 - }, - { - "value": { - "ref": "CRSTypeOfFinance210", - "label": "interest subsidy" - }, - "count": 1 - }, - { - "value": { - "ref": "CRSTypeOfFinance520", - "label": "share in collective investment vehicle" - }, "count": 1 } ] @@ -4450,6 +4331,8 @@ "segment": "heading", "entity_refs": [], "states": [ + "how:crsCooperationModality", + "how:crsTypeOfFinance", "how:crsTypeOfFlow", "how:financialFlowType", "how:nettingBasis", @@ -4640,7 +4523,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": "2f0c6beb58394dd390dc7e490b5e6c00" + "x-dfo-trace-id": "3eb8e8c056854f268dff17ba392f1890" } } }, 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 1fec5d0..dc288e2 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_fbca0f29755230d84729c1243b1d9b45", + "spec_id": "spec_7f538f4f65ac124f47918468b4d2eea7", "definition": { "schema_version": 1, - "spec_id": "spec_fbca0f29755230d84729c1243b1d9b45", + "spec_id": "spec_7f538f4f65ac124f47918468b4d2eea7", "identity": { "identity_version": "spec1", "shape": { @@ -226,12 +226,12 @@ }, "requested_window": { "kind": "range", - "start_year": 1963, + "start_year": 1964, "end_year": 2024 } } }, - "sentence": "Gross disbursements to the 133 G77 countries from the 32 DAC countries for official development assistance, 1963 to 2024. Current US dollars · OECD DAC2a.", + "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.", "entity_groups": { "destination": { "label": "G77 countries", @@ -254,10 +254,10 @@ "schema_version": 1, "input": { "kind": "spec_id", - "spec_id": "spec_fbca0f29755230d84729c1243b1d9b45", + "spec_id": "spec_7f538f4f65ac124f47918468b4d2eea7", "definition": { "schema_version": 1, - "spec_id": "spec_fbca0f29755230d84729c1243b1d9b45", + "spec_id": "spec_7f538f4f65ac124f47918468b4d2eea7", "identity": { "identity_version": "spec1", "shape": { @@ -469,7 +469,7 @@ }, "requested_window": { "kind": "range", - "start_year": 1963, + "start_year": 1964, "end_year": 2024 } } @@ -485,15 +485,15 @@ "status": 202, "headers": { "content-type": "application/json", - "location": "/api/datasets/operations/op_cc325e96d3ac6fdb6721c2468fd261f221bc87ee5eb9d8e82cf4d1f3720bdf6e", + "location": "/api/datasets/operations/op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef", "retry-after": "2", - "x-dfo-trace-id": "a6d5bb2eff5a48578dce7fbf91715755" + "x-dfo-trace-id": "5541c591450f479485c421e20fe4d81d" }, "json": { "operation": { - "operation_id": "op_cc325e96d3ac6fdb6721c2468fd261f221bc87ee5eb9d8e82cf4d1f3720bdf6e", + "operation_id": "op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef", "status": "pending", - "poll": "/api/datasets/operations/op_cc325e96d3ac6fdb6721c2468fd261f221bc87ee5eb9d8e82cf4d1f3720bdf6e", + "poll": "/api/datasets/operations/op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef", "retry_after_ms": 1500 } } @@ -502,20 +502,20 @@ { "request": { "method": "GET", - "path": "/datasets/operations/op_cc325e96d3ac6fdb6721c2468fd261f221bc87ee5eb9d8e82cf4d1f3720bdf6e" + "path": "/datasets/operations/op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef" }, "response": { "status": 200, "headers": { "content-type": "application/json", "retry-after": "2", - "x-dfo-trace-id": "71ecc596c6034e27b8ba5dd0a5d2c744" + "x-dfo-trace-id": "3416612a1b3f4a2ebbcf8ddeff74b96a" }, "json": { "operation": { - "operation_id": "op_cc325e96d3ac6fdb6721c2468fd261f221bc87ee5eb9d8e82cf4d1f3720bdf6e", + "operation_id": "op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef", "status": "failed", - "poll": "/api/datasets/operations/op_cc325e96d3ac6fdb6721c2468fd261f221bc87ee5eb9d8e82cf4d1f3720bdf6e", + "poll": "/api/datasets/operations/op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef", "retry_after_ms": 1500 }, "error": { @@ -539,10 +539,10 @@ "schema_version": 1, "input": { "kind": "spec_id", - "spec_id": "spec_fbca0f29755230d84729c1243b1d9b45", + "spec_id": "spec_7f538f4f65ac124f47918468b4d2eea7", "definition": { "schema_version": 1, - "spec_id": "spec_fbca0f29755230d84729c1243b1d9b45", + "spec_id": "spec_7f538f4f65ac124f47918468b4d2eea7", "identity": { "identity_version": "spec1", "shape": { @@ -754,7 +754,7 @@ }, "requested_window": { "kind": "range", - "start_year": 1963, + "start_year": 1964, "end_year": 2024 } } @@ -770,15 +770,15 @@ "status": 202, "headers": { "content-type": "application/json", - "location": "/api/datasets/operations/op_cc325e96d3ac6fdb6721c2468fd261f221bc87ee5eb9d8e82cf4d1f3720bdf6e", + "location": "/api/datasets/operations/op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef", "retry-after": "2", - "x-dfo-trace-id": "a6d5bb2eff5a48578dce7fbf91715755" + "x-dfo-trace-id": "5541c591450f479485c421e20fe4d81d" }, "json": { "operation": { - "operation_id": "op_cc325e96d3ac6fdb6721c2468fd261f221bc87ee5eb9d8e82cf4d1f3720bdf6e", + "operation_id": "op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef", "status": "pending", - "poll": "/api/datasets/operations/op_cc325e96d3ac6fdb6721c2468fd261f221bc87ee5eb9d8e82cf4d1f3720bdf6e", + "poll": "/api/datasets/operations/op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef", "retry_after_ms": 1500 } } @@ -787,24 +787,24 @@ { "request": { "method": "GET", - "path": "/datasets/operations/op_cc325e96d3ac6fdb6721c2468fd261f221bc87ee5eb9d8e82cf4d1f3720bdf6e" + "path": "/datasets/operations/op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef" }, "response": { "status": 200, "headers": { "content-type": "application/json", "retry-after": "2", - "x-dfo-trace-id": "71ecc596c6034e27b8ba5dd0a5d2c744" + "x-dfo-trace-id": "3416612a1b3f4a2ebbcf8ddeff74b96a" }, "json": { "operation": { - "operation_id": "op_cc325e96d3ac6fdb6721c2468fd261f221bc87ee5eb9d8e82cf4d1f3720bdf6e", + "operation_id": "op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef", "status": "running", - "poll": "/api/datasets/operations/op_cc325e96d3ac6fdb6721c2468fd261f221bc87ee5eb9d8e82cf4d1f3720bdf6e", + "poll": "/api/datasets/operations/op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef", "retry_after_ms": 1500, "progress": { "rows_written": 0, - "estimate_rows": 109318 + "estimate_rows": 108935 } } } @@ -813,24 +813,24 @@ { "request": { "method": "GET", - "path": "/datasets/operations/op_cc325e96d3ac6fdb6721c2468fd261f221bc87ee5eb9d8e82cf4d1f3720bdf6e" + "path": "/datasets/operations/op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef" }, "response": { "status": 200, "headers": { "content-type": "application/json", "retry-after": "2", - "x-dfo-trace-id": "760a3bb2de5e430fb316b3f6a4059c67" + "x-dfo-trace-id": "65394508d86f443db7528ac38066b9e3" }, "json": { "operation": { - "operation_id": "op_cc325e96d3ac6fdb6721c2468fd261f221bc87ee5eb9d8e82cf4d1f3720bdf6e", + "operation_id": "op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef", "status": "running", - "poll": "/api/datasets/operations/op_cc325e96d3ac6fdb6721c2468fd261f221bc87ee5eb9d8e82cf4d1f3720bdf6e", + "poll": "/api/datasets/operations/op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef", "retry_after_ms": 1500, "progress": { - "rows_written": 0, - "estimate_rows": 109318 + "rows_written": 64600, + "estimate_rows": 108935 } } } @@ -839,24 +839,76 @@ { "request": { "method": "GET", - "path": "/datasets/operations/op_cc325e96d3ac6fdb6721c2468fd261f221bc87ee5eb9d8e82cf4d1f3720bdf6e" + "path": "/datasets/operations/op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef" }, "response": { "status": 200, "headers": { "content-type": "application/json", "retry-after": "2", - "x-dfo-trace-id": "15f9386c84484af983d33c6d183e5349" + "x-dfo-trace-id": "7a2d07cfe29b4993a374ee71104d461a" }, "json": { "operation": { - "operation_id": "op_cc325e96d3ac6fdb6721c2468fd261f221bc87ee5eb9d8e82cf4d1f3720bdf6e", + "operation_id": "op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef", "status": "running", - "poll": "/api/datasets/operations/op_cc325e96d3ac6fdb6721c2468fd261f221bc87ee5eb9d8e82cf4d1f3720bdf6e", + "poll": "/api/datasets/operations/op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef", "retry_after_ms": 1500, "progress": { - "rows_written": 0, - "estimate_rows": 109318 + "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": 1786, + "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" + }, + "json": { + "operation": { + "operation_id": "op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef", + "status": "running", + "poll": "/api/datasets/operations/op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef", + "retry_after_ms": 2268, + "progress": { + "rows_written": 108935, + "estimate_rows": 108935 } } } @@ -865,24 +917,50 @@ { "request": { "method": "GET", - "path": "/datasets/operations/op_cc325e96d3ac6fdb6721c2468fd261f221bc87ee5eb9d8e82cf4d1f3720bdf6e" + "path": "/datasets/operations/op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef" }, "response": { "status": 200, "headers": { "content-type": "application/json", - "x-dfo-trace-id": "2cc73cd4fbaa4a28a350025111f70a79" + "retry-after": "3", + "x-dfo-trace-id": "1ce68951ada64961b3710bb73127c9d8" }, "json": { "operation": { - "operation_id": "op_cc325e96d3ac6fdb6721c2468fd261f221bc87ee5eb9d8e82cf4d1f3720bdf6e", + "operation_id": "op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef", + "status": "running", + "poll": "/api/datasets/operations/op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef", + "retry_after_ms": 2869, + "progress": { + "rows_written": 108935, + "estimate_rows": 108935 + } + } + } + } + }, + { + "request": { + "method": "GET", + "path": "/datasets/operations/op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef" + }, + "response": { + "status": 200, + "headers": { + "content-type": "application/json", + "x-dfo-trace-id": "37207f1ea4574e4e8485e8cebd4f4edc" + }, + "json": { + "operation": { + "operation_id": "op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef", "status": "done" }, "manifest": { "schema_version": 1, "definition": { "schema_version": 1, - "spec_id": "spec_fbca0f29755230d84729c1243b1d9b45", + "spec_id": "spec_7f538f4f65ac124f47918468b4d2eea7", "identity": { "shape": { "kind": "statvar_schema", @@ -1095,14 +1173,14 @@ "requested_window": { "kind": "range", "end_year": 2024, - "start_year": 1963 + "start_year": 1964 } } }, - "content_version": "cv_3d58d26a874dc30b1bba7d5ad6dd90ee", - "prepared_at": "2026-10-23T18:38:28Z", + "content_version": "cv_ed2cc83eb28d4e6883cde079f05844ed", + "prepared_at": "2026-10-25T17:38:14Z", "coverage": { - "rows": 109318, + "rows": 108935, "dimensions": [ { "label": "financingProvider", @@ -1124,14 +1202,14 @@ }, { "label": "years", - "count": 62 + "count": 61 } ], "window": { "kind": "range", "origin": "query", "end_year": 2024, - "start_year": 1963 + "start_year": 1964 } }, "citation": { @@ -1250,13 +1328,13 @@ "kind": "range", "origin": "query", "end_year": 2024, - "start_year": 1963 + "start_year": 1964 }, - "graph_revision": "dfo-dev-dc-datacommons-service-00264-2s9", + "graph_revision": "dfo-dev-dc-datacommons-service-00273-mmh", "normalisations": [], "code_index_stamp": { - "exported_at": "2026-10-23T18:14:12Z", - "content_hash": "29eb81d7b6c88641b1d4e8eb5e850ca36de66b99d6e9e09680aac020507a6392", + "exported_at": "2026-10-24T19:20:27Z", + "content_hash": "3d946d8f4986dbbe0fa3e5c4c917200381f529d89ce417c11daeb22df56eed99", "graph_endpoint": "graph_release" }, "source_revisions": [ @@ -1265,8 +1343,8 @@ "revision": "2026-10-15" } ], - "capability_version": "dset_cc753cefa9199881", - "materialiser_build": "035d29cd05fb31d7cb47cfb33197d4002f773df6", + "capability_version": "dset_76f5fa7244511c58", + "materialiser_build": "99e62038ceb4b459c2ac699549076ff123c166aa", "resolved_stat_vars": [ { "ref": "dcid:Amount_FinancialFlow_Gross_Disbursement_DAC2aAidType206_Nominal", @@ -1274,15 +1352,15 @@ "financingProvider", "financingRecipient" ], - "observation_count": 109318 + "observation_count": 108935 } ], "family_member_count": 1, "family_member_digest": "1a36e1a7292b1bfff95a5415de0be74cac7bb033217ed50e79faa8ce51a224c0", "frame_grammar_version": "1.1.0", - "origin_catalogue_build_id": "20261023T061534Z-06fa7b89", + "origin_catalogue_build_id": "20261024T193016Z-775d36a9", "served_from": "materialise", - "confirmed_at": "2026-10-24T16:30:59.952146+00:00" + "confirmed_at": "2026-10-25T17:38:17.505656+00:00" }, "warnings": [], "diagnostics": [ @@ -1294,34 +1372,34 @@ ], "artifacts": [ { - "artifact_digest": "sha256:9242d69bedb460996f21f782b1a85ee5cd7eb967174e3b64a4ec5ade5bebab65", + "artifact_digest": "sha256:4d80e30e27b5a64706113d54946e3a387e422b1115d1437594ac4b1d4307ffd2", "rendering": { "bundle": false, "format": "parquet", "layout": 4 }, - "bytes": 473679, + "bytes": 472796, "media_type": "application/vnd.apache.parquet", - "created_at": "2026-10-23T18:38:31.580044+00:00", + "created_at": "2026-10-25T17:38:17.426404+00:00", "tier": "working", - "url": "/api/datasets/spec_fbca0f29755230d84729c1243b1d9b45/cv_3d58d26a874dc30b1bba7d5ad6dd90ee/files/sha256:9242d69bedb460996f21f782b1a85ee5cd7eb967174e3b64a4ec5ade5bebab65", + "url": "/api/datasets/spec_7f538f4f65ac124f47918468b4d2eea7/cv_ed2cc83eb28d4e6883cde079f05844ed/files/sha256:4d80e30e27b5a64706113d54946e3a387e422b1115d1437594ac4b1d4307ffd2", "enrichment_stamp": "08ed6c734fc69ea2204a21f4e1dd8b963f14dd1e03a2484c618049ac2e2d93d8" }, { - "artifact_digest": "sha256:099d1ce36b440868b72174fb9cdff503cc4c7a0f0ef902e66484c5bfbd270f39", + "artifact_digest": "sha256:4e3ed758ad1a33cf9d150ee5fa71adf7f5bd40e4d342d839633d8386239babe1", "rendering": { "statistics": "series" }, - "bytes": 144274, + "bytes": 144449, "media_type": "application/vnd.apache.parquet", - "created_at": "2026-10-23T18:38:31.580044+00:00", + "created_at": "2026-10-25T17:38:17.426404+00:00", "tier": "working", - "url": "/api/datasets/spec_fbca0f29755230d84729c1243b1d9b45/cv_3d58d26a874dc30b1bba7d5ad6dd90ee/files/sha256:099d1ce36b440868b72174fb9cdff503cc4c7a0f0ef902e66484c5bfbd270f39" + "url": "/api/datasets/spec_7f538f4f65ac124f47918468b4d2eea7/cv_ed2cc83eb28d4e6883cde079f05844ed/files/sha256:4e3ed758ad1a33cf9d150ee5fa71adf7f5bd40e4d342d839633d8386239babe1" } ], "series_count": 3656, "output_options": { - "capability_version": "dset_cc753cefa9199881", + "capability_version": "dset_76f5fa7244511c58", "columns": [ { "name": "stat_var", @@ -1345,7 +1423,7 @@ "name": "time_period", "kind": "grain", "droppable": false, - "distinct": 62 + "distinct": 61 }, { "name": "value", @@ -1585,7 +1663,7 @@ "varying": [ { "column": "time_period", - "distinct": 62 + "distinct": 61 } ] }, @@ -1609,7 +1687,7 @@ "varying": [ { "column": "time_period", - "distinct": 62 + "distinct": 61 } ] }, @@ -1668,10 +1746,10 @@ ] } }, - "series_coverage_stamp": "0b8c9a18fcc5af19013b21e865c64481503b6a6542f7d2e6628999e6559a47de", + "series_coverage_stamp": "e6e717ab8c77e84d010915893ede5809e9ecec67929a07cfafbcc2210edfa1eb", "retention": { "pinned": false, - "held_until": "2026-11-22T18:38:31.579178Z" + "held_until": "2026-11-24T17:38:17.425152Z" } } } @@ -1680,21 +1758,21 @@ { "request": { "method": "GET", - "origin_path": "/api/datasets/spec_fbca0f29755230d84729c1243b1d9b45/cv_3d58d26a874dc30b1bba7d5ad6dd90ee/files/sha256:9242d69bedb460996f21f782b1a85ee5cd7eb967174e3b64a4ec5ade5bebab65" + "origin_path": "/api/datasets/spec_7f538f4f65ac124f47918468b4d2eea7/cv_ed2cc83eb28d4e6883cde079f05844ed/files/sha256:4d80e30e27b5a64706113d54946e3a387e422b1115d1437594ac4b1d4307ffd2" }, "response": { "status": 302, "headers": { "content-type": "text/html", - "location": "https://storage.googleapis.com/dev-fin-observatory-datasets-working/sha256%3A9242d69bedb460996f21f782b1a85ee5cd7eb967174e3b64a4ec5ade5bebab65?X-Goog-Signature=redacted", - "x-dfo-trace-id": "fb09161c837d4874970eaf5a188845da" + "location": "https://storage.googleapis.com/dev-fin-observatory-datasets-working/sha256%3A4d80e30e27b5a64706113d54946e3a387e422b1115d1437594ac4b1d4307ffd2?X-Goog-Signature=redacted", + "x-dfo-trace-id": "919c1e572d914a608b166556417714c9" } } }, { "request": { "method": "GET", - "url": "https://storage.googleapis.com/dev-fin-observatory-datasets-working/sha256%3A9242d69bedb460996f21f782b1a85ee5cd7eb967174e3b64a4ec5ade5bebab65?X-Goog-Signature=redacted" + "url": "https://storage.googleapis.com/dev-fin-observatory-datasets-working/sha256%3A4d80e30e27b5a64706113d54946e3a387e422b1115d1437594ac4b1d4307ffd2?X-Goog-Signature=redacted" }, "response": { "status": 200, @@ -1708,7 +1786,7 @@ "expect": [ { "dataset": { - "rows": 109318, + "rows": 108935, "columns": [ "stat_var", "financingProvider", @@ -1735,21 +1813,24 @@ "members": [ { "parts": [], - "spec_id": "spec_fbca0f29755230d84729c1243b1d9b45", - "content_version": "cv_3d58d26a874dc30b1bba7d5ad6dd90ee", - "sentence": "Gross disbursements to the 133 G77 countries from the 32 DAC countries for official development assistance, 1963 to 2024. Current US dollars · OECD DAC2a." + "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." } ], "missing": [], "long_builds": [ { - "operation_id": "op_cc325e96d3ac6fdb6721c2468fd261f221bc87ee5eb9d8e82cf4d1f3720bdf6e", + "operation_id": "op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef", "poll_waits": [ 1.5, 1.5, 1.5, 1.5, - 1.5 + 1.5, + 1.786, + 2.268, + 2.869 ], "resubmissions": 1 } 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 96921e6..e4390ab 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_fbca0f29755230d84729c1243b1d9b45", + "spec_id": "spec_7f538f4f65ac124f47918468b4d2eea7", "definition": { "schema_version": 1, - "spec_id": "spec_fbca0f29755230d84729c1243b1d9b45", + "spec_id": "spec_7f538f4f65ac124f47918468b4d2eea7", "identity": { "identity_version": "spec1", "shape": { @@ -226,12 +226,12 @@ }, "requested_window": { "kind": "range", - "start_year": 1963, + "start_year": 1964, "end_year": 2024 } } }, - "sentence": "Gross disbursements to the 133 G77 countries from the 32 DAC countries for official development assistance, 1963 to 2024. Current US dollars · OECD DAC2a.", + "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.", "entity_groups": { "destination": { "label": "G77 countries", @@ -254,10 +254,10 @@ "schema_version": 1, "input": { "kind": "spec_id", - "spec_id": "spec_fbca0f29755230d84729c1243b1d9b45", + "spec_id": "spec_7f538f4f65ac124f47918468b4d2eea7", "definition": { "schema_version": 1, - "spec_id": "spec_fbca0f29755230d84729c1243b1d9b45", + "spec_id": "spec_7f538f4f65ac124f47918468b4d2eea7", "identity": { "identity_version": "spec1", "shape": { @@ -469,7 +469,7 @@ }, "requested_window": { "kind": "range", - "start_year": 1963, + "start_year": 1964, "end_year": 2024 } } @@ -485,15 +485,15 @@ "status": 202, "headers": { "content-type": "application/json", - "location": "/api/datasets/operations/op_cc325e96d3ac6fdb6721c2468fd261f221bc87ee5eb9d8e82cf4d1f3720bdf6e", + "location": "/api/datasets/operations/op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef", "retry-after": "2", - "x-dfo-trace-id": "a6d5bb2eff5a48578dce7fbf91715755" + "x-dfo-trace-id": "5541c591450f479485c421e20fe4d81d" }, "json": { "operation": { - "operation_id": "op_cc325e96d3ac6fdb6721c2468fd261f221bc87ee5eb9d8e82cf4d1f3720bdf6e", + "operation_id": "op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef", "status": "pending", - "poll": "/api/datasets/operations/op_cc325e96d3ac6fdb6721c2468fd261f221bc87ee5eb9d8e82cf4d1f3720bdf6e", + "poll": "/api/datasets/operations/op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef", "retry_after_ms": 1500 } } @@ -502,7 +502,7 @@ { "request": { "method": "GET", - "path": "/datasets/operations/op_cc325e96d3ac6fdb6721c2468fd261f221bc87ee5eb9d8e82cf4d1f3720bdf6e" + "path": "/datasets/operations/op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef" }, "response": { "status": 404, @@ -530,7 +530,7 @@ "trace_id": "00000000000000000000000000000000", "long_builds": [ { - "operation_id": "op_cc325e96d3ac6fdb6721c2468fd261f221bc87ee5eb9d8e82cf4d1f3720bdf6e", + "operation_id": "op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef", "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 099416b..3d315b2 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_fbca0f29755230d84729c1243b1d9b45", + "spec_id": "spec_7f538f4f65ac124f47918468b4d2eea7", "definition": { "schema_version": 1, - "spec_id": "spec_fbca0f29755230d84729c1243b1d9b45", + "spec_id": "spec_7f538f4f65ac124f47918468b4d2eea7", "identity": { "identity_version": "spec1", "shape": { @@ -226,12 +226,12 @@ }, "requested_window": { "kind": "range", - "start_year": 1963, + "start_year": 1964, "end_year": 2024 } } }, - "sentence": "Gross disbursements to the 133 G77 countries from the 32 DAC countries for official development assistance, 1963 to 2024. Current US dollars · OECD DAC2a.", + "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.", "entity_groups": { "destination": { "label": "G77 countries", @@ -254,10 +254,10 @@ "schema_version": 1, "input": { "kind": "spec_id", - "spec_id": "spec_fbca0f29755230d84729c1243b1d9b45", + "spec_id": "spec_7f538f4f65ac124f47918468b4d2eea7", "definition": { "schema_version": 1, - "spec_id": "spec_fbca0f29755230d84729c1243b1d9b45", + "spec_id": "spec_7f538f4f65ac124f47918468b4d2eea7", "identity": { "identity_version": "spec1", "shape": { @@ -469,7 +469,7 @@ }, "requested_window": { "kind": "range", - "start_year": 1963, + "start_year": 1964, "end_year": 2024 } } @@ -485,15 +485,15 @@ "status": 202, "headers": { "content-type": "application/json", - "location": "/api/datasets/operations/op_cc325e96d3ac6fdb6721c2468fd261f221bc87ee5eb9d8e82cf4d1f3720bdf6e", + "location": "/api/datasets/operations/op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef", "retry-after": "2", - "x-dfo-trace-id": "a6d5bb2eff5a48578dce7fbf91715755" + "x-dfo-trace-id": "5541c591450f479485c421e20fe4d81d" }, "json": { "operation": { - "operation_id": "op_cc325e96d3ac6fdb6721c2468fd261f221bc87ee5eb9d8e82cf4d1f3720bdf6e", + "operation_id": "op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef", "status": "pending", - "poll": "/api/datasets/operations/op_cc325e96d3ac6fdb6721c2468fd261f221bc87ee5eb9d8e82cf4d1f3720bdf6e", + "poll": "/api/datasets/operations/op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef", "retry_after_ms": 1500 } } @@ -502,24 +502,24 @@ { "request": { "method": "GET", - "path": "/datasets/operations/op_cc325e96d3ac6fdb6721c2468fd261f221bc87ee5eb9d8e82cf4d1f3720bdf6e" + "path": "/datasets/operations/op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef" }, "response": { "status": 200, "headers": { "content-type": "application/json", "retry-after": "2", - "x-dfo-trace-id": "71ecc596c6034e27b8ba5dd0a5d2c744" + "x-dfo-trace-id": "3416612a1b3f4a2ebbcf8ddeff74b96a" }, "json": { "operation": { - "operation_id": "op_cc325e96d3ac6fdb6721c2468fd261f221bc87ee5eb9d8e82cf4d1f3720bdf6e", + "operation_id": "op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef", "status": "running", - "poll": "/api/datasets/operations/op_cc325e96d3ac6fdb6721c2468fd261f221bc87ee5eb9d8e82cf4d1f3720bdf6e", + "poll": "/api/datasets/operations/op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef", "retry_after_ms": 2500, "progress": { "rows_written": 0, - "estimate_rows": 109318 + "estimate_rows": 108935 } } } @@ -528,24 +528,24 @@ { "request": { "method": "GET", - "path": "/datasets/operations/op_cc325e96d3ac6fdb6721c2468fd261f221bc87ee5eb9d8e82cf4d1f3720bdf6e" + "path": "/datasets/operations/op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef" }, "response": { "status": 200, "headers": { "content-type": "application/json", "retry-after": "2", - "x-dfo-trace-id": "760a3bb2de5e430fb316b3f6a4059c67" + "x-dfo-trace-id": "65394508d86f443db7528ac38066b9e3" }, "json": { "operation": { - "operation_id": "op_cc325e96d3ac6fdb6721c2468fd261f221bc87ee5eb9d8e82cf4d1f3720bdf6e", + "operation_id": "op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef", "status": "running", - "poll": "/api/datasets/operations/op_cc325e96d3ac6fdb6721c2468fd261f221bc87ee5eb9d8e82cf4d1f3720bdf6e", + "poll": "/api/datasets/operations/op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef", "retry_after_ms": 4000, "progress": { - "rows_written": 0, - "estimate_rows": 109318 + "rows_written": 64600, + "estimate_rows": 108935 } } } @@ -554,24 +554,76 @@ { "request": { "method": "GET", - "path": "/datasets/operations/op_cc325e96d3ac6fdb6721c2468fd261f221bc87ee5eb9d8e82cf4d1f3720bdf6e" + "path": "/datasets/operations/op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef" }, "response": { "status": 200, "headers": { "content-type": "application/json", "retry-after": "2", - "x-dfo-trace-id": "15f9386c84484af983d33c6d183e5349" + "x-dfo-trace-id": "7a2d07cfe29b4993a374ee71104d461a" }, "json": { "operation": { - "operation_id": "op_cc325e96d3ac6fdb6721c2468fd261f221bc87ee5eb9d8e82cf4d1f3720bdf6e", + "operation_id": "op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef", "status": "running", - "poll": "/api/datasets/operations/op_cc325e96d3ac6fdb6721c2468fd261f221bc87ee5eb9d8e82cf4d1f3720bdf6e", + "poll": "/api/datasets/operations/op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef", "retry_after_ms": 1000, "progress": { - "rows_written": 0, - "estimate_rows": 109318 + "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" + }, + "json": { + "operation": { + "operation_id": "op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef", + "status": "running", + "poll": "/api/datasets/operations/op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef", + "retry_after_ms": 4000, + "progress": { + "rows_written": 108935, + "estimate_rows": 108935 } } } @@ -580,24 +632,50 @@ { "request": { "method": "GET", - "path": "/datasets/operations/op_cc325e96d3ac6fdb6721c2468fd261f221bc87ee5eb9d8e82cf4d1f3720bdf6e" + "path": "/datasets/operations/op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef" }, "response": { "status": 200, "headers": { "content-type": "application/json", - "x-dfo-trace-id": "2cc73cd4fbaa4a28a350025111f70a79" + "retry-after": "3", + "x-dfo-trace-id": "1ce68951ada64961b3710bb73127c9d8" }, "json": { "operation": { - "operation_id": "op_cc325e96d3ac6fdb6721c2468fd261f221bc87ee5eb9d8e82cf4d1f3720bdf6e", + "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", + "x-dfo-trace-id": "37207f1ea4574e4e8485e8cebd4f4edc" + }, + "json": { + "operation": { + "operation_id": "op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef", "status": "done" }, "manifest": { "schema_version": 1, "definition": { "schema_version": 1, - "spec_id": "spec_fbca0f29755230d84729c1243b1d9b45", + "spec_id": "spec_7f538f4f65ac124f47918468b4d2eea7", "identity": { "shape": { "kind": "statvar_schema", @@ -810,14 +888,14 @@ "requested_window": { "kind": "range", "end_year": 2024, - "start_year": 1963 + "start_year": 1964 } } }, - "content_version": "cv_3d58d26a874dc30b1bba7d5ad6dd90ee", - "prepared_at": "2026-10-23T18:38:28Z", + "content_version": "cv_ed2cc83eb28d4e6883cde079f05844ed", + "prepared_at": "2026-10-25T17:38:14Z", "coverage": { - "rows": 109318, + "rows": 108935, "dimensions": [ { "label": "financingProvider", @@ -839,14 +917,14 @@ }, { "label": "years", - "count": 62 + "count": 61 } ], "window": { "kind": "range", "origin": "query", "end_year": 2024, - "start_year": 1963 + "start_year": 1964 } }, "citation": { @@ -965,13 +1043,13 @@ "kind": "range", "origin": "query", "end_year": 2024, - "start_year": 1963 + "start_year": 1964 }, - "graph_revision": "dfo-dev-dc-datacommons-service-00264-2s9", + "graph_revision": "dfo-dev-dc-datacommons-service-00273-mmh", "normalisations": [], "code_index_stamp": { - "exported_at": "2026-10-23T18:14:12Z", - "content_hash": "29eb81d7b6c88641b1d4e8eb5e850ca36de66b99d6e9e09680aac020507a6392", + "exported_at": "2026-10-24T19:20:27Z", + "content_hash": "3d946d8f4986dbbe0fa3e5c4c917200381f529d89ce417c11daeb22df56eed99", "graph_endpoint": "graph_release" }, "source_revisions": [ @@ -980,8 +1058,8 @@ "revision": "2026-10-15" } ], - "capability_version": "dset_cc753cefa9199881", - "materialiser_build": "035d29cd05fb31d7cb47cfb33197d4002f773df6", + "capability_version": "dset_76f5fa7244511c58", + "materialiser_build": "99e62038ceb4b459c2ac699549076ff123c166aa", "resolved_stat_vars": [ { "ref": "dcid:Amount_FinancialFlow_Gross_Disbursement_DAC2aAidType206_Nominal", @@ -989,15 +1067,15 @@ "financingProvider", "financingRecipient" ], - "observation_count": 109318 + "observation_count": 108935 } ], "family_member_count": 1, "family_member_digest": "1a36e1a7292b1bfff95a5415de0be74cac7bb033217ed50e79faa8ce51a224c0", "frame_grammar_version": "1.1.0", - "origin_catalogue_build_id": "20261023T061534Z-06fa7b89", + "origin_catalogue_build_id": "20261024T193016Z-775d36a9", "served_from": "materialise", - "confirmed_at": "2026-10-24T16:30:59.952146+00:00" + "confirmed_at": "2026-10-25T17:38:17.505656+00:00" }, "warnings": [], "diagnostics": [ @@ -1009,34 +1087,34 @@ ], "artifacts": [ { - "artifact_digest": "sha256:9242d69bedb460996f21f782b1a85ee5cd7eb967174e3b64a4ec5ade5bebab65", + "artifact_digest": "sha256:4d80e30e27b5a64706113d54946e3a387e422b1115d1437594ac4b1d4307ffd2", "rendering": { "bundle": false, "format": "parquet", "layout": 4 }, - "bytes": 473679, + "bytes": 472796, "media_type": "application/vnd.apache.parquet", - "created_at": "2026-10-23T18:38:31.580044+00:00", + "created_at": "2026-10-25T17:38:17.426404+00:00", "tier": "working", - "url": "/api/datasets/spec_fbca0f29755230d84729c1243b1d9b45/cv_3d58d26a874dc30b1bba7d5ad6dd90ee/files/sha256:9242d69bedb460996f21f782b1a85ee5cd7eb967174e3b64a4ec5ade5bebab65", + "url": "/api/datasets/spec_7f538f4f65ac124f47918468b4d2eea7/cv_ed2cc83eb28d4e6883cde079f05844ed/files/sha256:4d80e30e27b5a64706113d54946e3a387e422b1115d1437594ac4b1d4307ffd2", "enrichment_stamp": "08ed6c734fc69ea2204a21f4e1dd8b963f14dd1e03a2484c618049ac2e2d93d8" }, { - "artifact_digest": "sha256:099d1ce36b440868b72174fb9cdff503cc4c7a0f0ef902e66484c5bfbd270f39", + "artifact_digest": "sha256:4e3ed758ad1a33cf9d150ee5fa71adf7f5bd40e4d342d839633d8386239babe1", "rendering": { "statistics": "series" }, - "bytes": 144274, + "bytes": 144449, "media_type": "application/vnd.apache.parquet", - "created_at": "2026-10-23T18:38:31.580044+00:00", + "created_at": "2026-10-25T17:38:17.426404+00:00", "tier": "working", - "url": "/api/datasets/spec_fbca0f29755230d84729c1243b1d9b45/cv_3d58d26a874dc30b1bba7d5ad6dd90ee/files/sha256:099d1ce36b440868b72174fb9cdff503cc4c7a0f0ef902e66484c5bfbd270f39" + "url": "/api/datasets/spec_7f538f4f65ac124f47918468b4d2eea7/cv_ed2cc83eb28d4e6883cde079f05844ed/files/sha256:4e3ed758ad1a33cf9d150ee5fa71adf7f5bd40e4d342d839633d8386239babe1" } ], "series_count": 3656, "output_options": { - "capability_version": "dset_cc753cefa9199881", + "capability_version": "dset_76f5fa7244511c58", "columns": [ { "name": "stat_var", @@ -1060,7 +1138,7 @@ "name": "time_period", "kind": "grain", "droppable": false, - "distinct": 62 + "distinct": 61 }, { "name": "value", @@ -1300,7 +1378,7 @@ "varying": [ { "column": "time_period", - "distinct": 62 + "distinct": 61 } ] }, @@ -1324,7 +1402,7 @@ "varying": [ { "column": "time_period", - "distinct": 62 + "distinct": 61 } ] }, @@ -1383,10 +1461,10 @@ ] } }, - "series_coverage_stamp": "0b8c9a18fcc5af19013b21e865c64481503b6a6542f7d2e6628999e6559a47de", + "series_coverage_stamp": "e6e717ab8c77e84d010915893ede5809e9ecec67929a07cfafbcc2210edfa1eb", "retention": { "pinned": false, - "held_until": "2026-11-22T18:38:31.579178Z" + "held_until": "2026-11-24T17:38:17.425152Z" } } } @@ -1395,21 +1473,21 @@ { "request": { "method": "GET", - "origin_path": "/api/datasets/spec_fbca0f29755230d84729c1243b1d9b45/cv_3d58d26a874dc30b1bba7d5ad6dd90ee/files/sha256:9242d69bedb460996f21f782b1a85ee5cd7eb967174e3b64a4ec5ade5bebab65" + "origin_path": "/api/datasets/spec_7f538f4f65ac124f47918468b4d2eea7/cv_ed2cc83eb28d4e6883cde079f05844ed/files/sha256:4d80e30e27b5a64706113d54946e3a387e422b1115d1437594ac4b1d4307ffd2" }, "response": { "status": 302, "headers": { "content-type": "text/html", - "location": "https://storage.googleapis.com/dev-fin-observatory-datasets-working/sha256%3A9242d69bedb460996f21f782b1a85ee5cd7eb967174e3b64a4ec5ade5bebab65?X-Goog-Signature=redacted", - "x-dfo-trace-id": "fb09161c837d4874970eaf5a188845da" + "location": "https://storage.googleapis.com/dev-fin-observatory-datasets-working/sha256%3A4d80e30e27b5a64706113d54946e3a387e422b1115d1437594ac4b1d4307ffd2?X-Goog-Signature=redacted", + "x-dfo-trace-id": "919c1e572d914a608b166556417714c9" } } }, { "request": { "method": "GET", - "url": "https://storage.googleapis.com/dev-fin-observatory-datasets-working/sha256%3A9242d69bedb460996f21f782b1a85ee5cd7eb967174e3b64a4ec5ade5bebab65?X-Goog-Signature=redacted" + "url": "https://storage.googleapis.com/dev-fin-observatory-datasets-working/sha256%3A4d80e30e27b5a64706113d54946e3a387e422b1115d1437594ac4b1d4307ffd2?X-Goog-Signature=redacted" }, "response": { "status": 200, @@ -1423,7 +1501,7 @@ "expect": [ { "dataset": { - "rows": 109318, + "rows": 108935, "columns": [ "stat_var", "financingProvider", @@ -1450,19 +1528,22 @@ "members": [ { "parts": [], - "spec_id": "spec_fbca0f29755230d84729c1243b1d9b45", - "content_version": "cv_3d58d26a874dc30b1bba7d5ad6dd90ee", - "sentence": "Gross disbursements to the 133 G77 countries from the 32 DAC countries for official development assistance, 1963 to 2024. Current US dollars · OECD DAC2a." + "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." } ], "missing": [], "long_builds": [ { - "operation_id": "op_cc325e96d3ac6fdb6721c2468fd261f221bc87ee5eb9d8e82cf4d1f3720bdf6e", + "operation_id": "op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef", "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 eb3fdc5..342444b 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_fbca0f29755230d84729c1243b1d9b45", + "spec_id": "spec_7f538f4f65ac124f47918468b4d2eea7", "definition": { "schema_version": 1, - "spec_id": "spec_fbca0f29755230d84729c1243b1d9b45", + "spec_id": "spec_7f538f4f65ac124f47918468b4d2eea7", "identity": { "identity_version": "spec1", "shape": { @@ -226,12 +226,12 @@ }, "requested_window": { "kind": "range", - "start_year": 1963, + "start_year": 1964, "end_year": 2024 } } }, - "sentence": "Gross disbursements to the 133 G77 countries from the 32 DAC countries for official development assistance, 1963 to 2024. Current US dollars · OECD DAC2a.", + "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.", "entity_groups": { "destination": { "label": "G77 countries", @@ -254,10 +254,10 @@ "schema_version": 1, "input": { "kind": "spec_id", - "spec_id": "spec_fbca0f29755230d84729c1243b1d9b45", + "spec_id": "spec_7f538f4f65ac124f47918468b4d2eea7", "definition": { "schema_version": 1, - "spec_id": "spec_fbca0f29755230d84729c1243b1d9b45", + "spec_id": "spec_7f538f4f65ac124f47918468b4d2eea7", "identity": { "identity_version": "spec1", "shape": { @@ -469,7 +469,7 @@ }, "requested_window": { "kind": "range", - "start_year": 1963, + "start_year": 1964, "end_year": 2024 } } @@ -485,15 +485,15 @@ "status": 202, "headers": { "content-type": "application/json", - "location": "/api/datasets/operations/op_cc325e96d3ac6fdb6721c2468fd261f221bc87ee5eb9d8e82cf4d1f3720bdf6e", + "location": "/api/datasets/operations/op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef", "retry-after": "2", - "x-dfo-trace-id": "a6d5bb2eff5a48578dce7fbf91715755" + "x-dfo-trace-id": "5541c591450f479485c421e20fe4d81d" }, "json": { "operation": { - "operation_id": "op_cc325e96d3ac6fdb6721c2468fd261f221bc87ee5eb9d8e82cf4d1f3720bdf6e", + "operation_id": "op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef", "status": "pending", - "poll": "/api/datasets/operations/op_cc325e96d3ac6fdb6721c2468fd261f221bc87ee5eb9d8e82cf4d1f3720bdf6e", + "poll": "/api/datasets/operations/op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef", "retry_after_ms": 1500 } } @@ -502,7 +502,7 @@ { "request": { "method": "GET", - "path": "/datasets/operations/op_cc325e96d3ac6fdb6721c2468fd261f221bc87ee5eb9d8e82cf4d1f3720bdf6e" + "path": "/datasets/operations/op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef" }, "response": { "status": 429, @@ -527,7 +527,7 @@ "trace_id": "00000000000000000000000000000000", "long_builds": [ { - "operation_id": "op_cc325e96d3ac6fdb6721c2468fd261f221bc87ee5eb9d8e82cf4d1f3720bdf6e", + "operation_id": "op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef", "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 5dc6d95..a2e9fb7 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_fbca0f29755230d84729c1243b1d9b45", + "spec_id": "spec_7f538f4f65ac124f47918468b4d2eea7", "definition": { "schema_version": 1, - "spec_id": "spec_fbca0f29755230d84729c1243b1d9b45", + "spec_id": "spec_7f538f4f65ac124f47918468b4d2eea7", "identity": { "identity_version": "spec1", "shape": { @@ -226,12 +226,12 @@ }, "requested_window": { "kind": "range", - "start_year": 1963, + "start_year": 1964, "end_year": 2024 } } }, - "sentence": "Gross disbursements to the 133 G77 countries from the 32 DAC countries for official development assistance, 1963 to 2024. Current US dollars · OECD DAC2a.", + "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.", "entity_groups": { "destination": { "label": "G77 countries", @@ -254,10 +254,10 @@ "schema_version": 1, "input": { "kind": "spec_id", - "spec_id": "spec_fbca0f29755230d84729c1243b1d9b45", + "spec_id": "spec_7f538f4f65ac124f47918468b4d2eea7", "definition": { "schema_version": 1, - "spec_id": "spec_fbca0f29755230d84729c1243b1d9b45", + "spec_id": "spec_7f538f4f65ac124f47918468b4d2eea7", "identity": { "identity_version": "spec1", "shape": { @@ -469,7 +469,7 @@ }, "requested_window": { "kind": "range", - "start_year": 1963, + "start_year": 1964, "end_year": 2024 } } @@ -485,15 +485,15 @@ "status": 202, "headers": { "content-type": "application/json", - "location": "/api/datasets/operations/op_cc325e96d3ac6fdb6721c2468fd261f221bc87ee5eb9d8e82cf4d1f3720bdf6e", + "location": "/api/datasets/operations/op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef", "retry-after": "2", - "x-dfo-trace-id": "a6d5bb2eff5a48578dce7fbf91715755" + "x-dfo-trace-id": "5541c591450f479485c421e20fe4d81d" }, "json": { "operation": { - "operation_id": "op_cc325e96d3ac6fdb6721c2468fd261f221bc87ee5eb9d8e82cf4d1f3720bdf6e", + "operation_id": "op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef", "status": "pending", - "poll": "/api/datasets/operations/op_cc325e96d3ac6fdb6721c2468fd261f221bc87ee5eb9d8e82cf4d1f3720bdf6e", + "poll": "/api/datasets/operations/op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef", "retry_after_ms": 1500 } } @@ -502,7 +502,7 @@ { "request": { "method": "GET", - "path": "/datasets/operations/op_cc325e96d3ac6fdb6721c2468fd261f221bc87ee5eb9d8e82cf4d1f3720bdf6e" + "path": "/datasets/operations/op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef" }, "response": { "status": 429, @@ -514,24 +514,24 @@ { "request": { "method": "GET", - "path": "/datasets/operations/op_cc325e96d3ac6fdb6721c2468fd261f221bc87ee5eb9d8e82cf4d1f3720bdf6e" + "path": "/datasets/operations/op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef" }, "response": { "status": 200, "headers": { "content-type": "application/json", "retry-after": "2", - "x-dfo-trace-id": "71ecc596c6034e27b8ba5dd0a5d2c744" + "x-dfo-trace-id": "3416612a1b3f4a2ebbcf8ddeff74b96a" }, "json": { "operation": { - "operation_id": "op_cc325e96d3ac6fdb6721c2468fd261f221bc87ee5eb9d8e82cf4d1f3720bdf6e", + "operation_id": "op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef", "status": "running", - "poll": "/api/datasets/operations/op_cc325e96d3ac6fdb6721c2468fd261f221bc87ee5eb9d8e82cf4d1f3720bdf6e", + "poll": "/api/datasets/operations/op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef", "retry_after_ms": 1500, "progress": { "rows_written": 0, - "estimate_rows": 109318 + "estimate_rows": 108935 } } } @@ -540,24 +540,24 @@ { "request": { "method": "GET", - "path": "/datasets/operations/op_cc325e96d3ac6fdb6721c2468fd261f221bc87ee5eb9d8e82cf4d1f3720bdf6e" + "path": "/datasets/operations/op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef" }, "response": { "status": 200, "headers": { "content-type": "application/json", "retry-after": "2", - "x-dfo-trace-id": "760a3bb2de5e430fb316b3f6a4059c67" + "x-dfo-trace-id": "65394508d86f443db7528ac38066b9e3" }, "json": { "operation": { - "operation_id": "op_cc325e96d3ac6fdb6721c2468fd261f221bc87ee5eb9d8e82cf4d1f3720bdf6e", + "operation_id": "op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef", "status": "running", - "poll": "/api/datasets/operations/op_cc325e96d3ac6fdb6721c2468fd261f221bc87ee5eb9d8e82cf4d1f3720bdf6e", + "poll": "/api/datasets/operations/op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef", "retry_after_ms": 1500, "progress": { - "rows_written": 0, - "estimate_rows": 109318 + "rows_written": 64600, + "estimate_rows": 108935 } } } @@ -566,24 +566,76 @@ { "request": { "method": "GET", - "path": "/datasets/operations/op_cc325e96d3ac6fdb6721c2468fd261f221bc87ee5eb9d8e82cf4d1f3720bdf6e" + "path": "/datasets/operations/op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef" }, "response": { "status": 200, "headers": { "content-type": "application/json", "retry-after": "2", - "x-dfo-trace-id": "15f9386c84484af983d33c6d183e5349" + "x-dfo-trace-id": "7a2d07cfe29b4993a374ee71104d461a" }, "json": { "operation": { - "operation_id": "op_cc325e96d3ac6fdb6721c2468fd261f221bc87ee5eb9d8e82cf4d1f3720bdf6e", + "operation_id": "op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef", "status": "running", - "poll": "/api/datasets/operations/op_cc325e96d3ac6fdb6721c2468fd261f221bc87ee5eb9d8e82cf4d1f3720bdf6e", + "poll": "/api/datasets/operations/op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef", "retry_after_ms": 1500, "progress": { - "rows_written": 0, - "estimate_rows": 109318 + "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": 1786, + "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" + }, + "json": { + "operation": { + "operation_id": "op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef", + "status": "running", + "poll": "/api/datasets/operations/op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef", + "retry_after_ms": 2268, + "progress": { + "rows_written": 108935, + "estimate_rows": 108935 } } } @@ -592,24 +644,50 @@ { "request": { "method": "GET", - "path": "/datasets/operations/op_cc325e96d3ac6fdb6721c2468fd261f221bc87ee5eb9d8e82cf4d1f3720bdf6e" + "path": "/datasets/operations/op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef" }, "response": { "status": 200, "headers": { "content-type": "application/json", - "x-dfo-trace-id": "2cc73cd4fbaa4a28a350025111f70a79" + "retry-after": "3", + "x-dfo-trace-id": "1ce68951ada64961b3710bb73127c9d8" }, "json": { "operation": { - "operation_id": "op_cc325e96d3ac6fdb6721c2468fd261f221bc87ee5eb9d8e82cf4d1f3720bdf6e", + "operation_id": "op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef", + "status": "running", + "poll": "/api/datasets/operations/op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef", + "retry_after_ms": 2869, + "progress": { + "rows_written": 108935, + "estimate_rows": 108935 + } + } + } + } + }, + { + "request": { + "method": "GET", + "path": "/datasets/operations/op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef" + }, + "response": { + "status": 200, + "headers": { + "content-type": "application/json", + "x-dfo-trace-id": "37207f1ea4574e4e8485e8cebd4f4edc" + }, + "json": { + "operation": { + "operation_id": "op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef", "status": "done" }, "manifest": { "schema_version": 1, "definition": { "schema_version": 1, - "spec_id": "spec_fbca0f29755230d84729c1243b1d9b45", + "spec_id": "spec_7f538f4f65ac124f47918468b4d2eea7", "identity": { "shape": { "kind": "statvar_schema", @@ -822,14 +900,14 @@ "requested_window": { "kind": "range", "end_year": 2024, - "start_year": 1963 + "start_year": 1964 } } }, - "content_version": "cv_3d58d26a874dc30b1bba7d5ad6dd90ee", - "prepared_at": "2026-10-23T18:38:28Z", + "content_version": "cv_ed2cc83eb28d4e6883cde079f05844ed", + "prepared_at": "2026-10-25T17:38:14Z", "coverage": { - "rows": 109318, + "rows": 108935, "dimensions": [ { "label": "financingProvider", @@ -851,14 +929,14 @@ }, { "label": "years", - "count": 62 + "count": 61 } ], "window": { "kind": "range", "origin": "query", "end_year": 2024, - "start_year": 1963 + "start_year": 1964 } }, "citation": { @@ -977,13 +1055,13 @@ "kind": "range", "origin": "query", "end_year": 2024, - "start_year": 1963 + "start_year": 1964 }, - "graph_revision": "dfo-dev-dc-datacommons-service-00264-2s9", + "graph_revision": "dfo-dev-dc-datacommons-service-00273-mmh", "normalisations": [], "code_index_stamp": { - "exported_at": "2026-10-23T18:14:12Z", - "content_hash": "29eb81d7b6c88641b1d4e8eb5e850ca36de66b99d6e9e09680aac020507a6392", + "exported_at": "2026-10-24T19:20:27Z", + "content_hash": "3d946d8f4986dbbe0fa3e5c4c917200381f529d89ce417c11daeb22df56eed99", "graph_endpoint": "graph_release" }, "source_revisions": [ @@ -992,8 +1070,8 @@ "revision": "2026-10-15" } ], - "capability_version": "dset_cc753cefa9199881", - "materialiser_build": "035d29cd05fb31d7cb47cfb33197d4002f773df6", + "capability_version": "dset_76f5fa7244511c58", + "materialiser_build": "99e62038ceb4b459c2ac699549076ff123c166aa", "resolved_stat_vars": [ { "ref": "dcid:Amount_FinancialFlow_Gross_Disbursement_DAC2aAidType206_Nominal", @@ -1001,15 +1079,15 @@ "financingProvider", "financingRecipient" ], - "observation_count": 109318 + "observation_count": 108935 } ], "family_member_count": 1, "family_member_digest": "1a36e1a7292b1bfff95a5415de0be74cac7bb033217ed50e79faa8ce51a224c0", "frame_grammar_version": "1.1.0", - "origin_catalogue_build_id": "20261023T061534Z-06fa7b89", + "origin_catalogue_build_id": "20261024T193016Z-775d36a9", "served_from": "materialise", - "confirmed_at": "2026-10-24T16:30:59.952146+00:00" + "confirmed_at": "2026-10-25T17:38:17.505656+00:00" }, "warnings": [], "diagnostics": [ @@ -1021,34 +1099,34 @@ ], "artifacts": [ { - "artifact_digest": "sha256:9242d69bedb460996f21f782b1a85ee5cd7eb967174e3b64a4ec5ade5bebab65", + "artifact_digest": "sha256:4d80e30e27b5a64706113d54946e3a387e422b1115d1437594ac4b1d4307ffd2", "rendering": { "bundle": false, "format": "parquet", "layout": 4 }, - "bytes": 473679, + "bytes": 472796, "media_type": "application/vnd.apache.parquet", - "created_at": "2026-10-23T18:38:31.580044+00:00", + "created_at": "2026-10-25T17:38:17.426404+00:00", "tier": "working", - "url": "/api/datasets/spec_fbca0f29755230d84729c1243b1d9b45/cv_3d58d26a874dc30b1bba7d5ad6dd90ee/files/sha256:9242d69bedb460996f21f782b1a85ee5cd7eb967174e3b64a4ec5ade5bebab65", + "url": "/api/datasets/spec_7f538f4f65ac124f47918468b4d2eea7/cv_ed2cc83eb28d4e6883cde079f05844ed/files/sha256:4d80e30e27b5a64706113d54946e3a387e422b1115d1437594ac4b1d4307ffd2", "enrichment_stamp": "08ed6c734fc69ea2204a21f4e1dd8b963f14dd1e03a2484c618049ac2e2d93d8" }, { - "artifact_digest": "sha256:099d1ce36b440868b72174fb9cdff503cc4c7a0f0ef902e66484c5bfbd270f39", + "artifact_digest": "sha256:4e3ed758ad1a33cf9d150ee5fa71adf7f5bd40e4d342d839633d8386239babe1", "rendering": { "statistics": "series" }, - "bytes": 144274, + "bytes": 144449, "media_type": "application/vnd.apache.parquet", - "created_at": "2026-10-23T18:38:31.580044+00:00", + "created_at": "2026-10-25T17:38:17.426404+00:00", "tier": "working", - "url": "/api/datasets/spec_fbca0f29755230d84729c1243b1d9b45/cv_3d58d26a874dc30b1bba7d5ad6dd90ee/files/sha256:099d1ce36b440868b72174fb9cdff503cc4c7a0f0ef902e66484c5bfbd270f39" + "url": "/api/datasets/spec_7f538f4f65ac124f47918468b4d2eea7/cv_ed2cc83eb28d4e6883cde079f05844ed/files/sha256:4e3ed758ad1a33cf9d150ee5fa71adf7f5bd40e4d342d839633d8386239babe1" } ], "series_count": 3656, "output_options": { - "capability_version": "dset_cc753cefa9199881", + "capability_version": "dset_76f5fa7244511c58", "columns": [ { "name": "stat_var", @@ -1072,7 +1150,7 @@ "name": "time_period", "kind": "grain", "droppable": false, - "distinct": 62 + "distinct": 61 }, { "name": "value", @@ -1312,7 +1390,7 @@ "varying": [ { "column": "time_period", - "distinct": 62 + "distinct": 61 } ] }, @@ -1336,7 +1414,7 @@ "varying": [ { "column": "time_period", - "distinct": 62 + "distinct": 61 } ] }, @@ -1395,10 +1473,10 @@ ] } }, - "series_coverage_stamp": "0b8c9a18fcc5af19013b21e865c64481503b6a6542f7d2e6628999e6559a47de", + "series_coverage_stamp": "e6e717ab8c77e84d010915893ede5809e9ecec67929a07cfafbcc2210edfa1eb", "retention": { "pinned": false, - "held_until": "2026-11-22T18:38:31.579178Z" + "held_until": "2026-11-24T17:38:17.425152Z" } } } @@ -1407,21 +1485,21 @@ { "request": { "method": "GET", - "origin_path": "/api/datasets/spec_fbca0f29755230d84729c1243b1d9b45/cv_3d58d26a874dc30b1bba7d5ad6dd90ee/files/sha256:9242d69bedb460996f21f782b1a85ee5cd7eb967174e3b64a4ec5ade5bebab65" + "origin_path": "/api/datasets/spec_7f538f4f65ac124f47918468b4d2eea7/cv_ed2cc83eb28d4e6883cde079f05844ed/files/sha256:4d80e30e27b5a64706113d54946e3a387e422b1115d1437594ac4b1d4307ffd2" }, "response": { "status": 302, "headers": { "content-type": "text/html", - "location": "https://storage.googleapis.com/dev-fin-observatory-datasets-working/sha256%3A9242d69bedb460996f21f782b1a85ee5cd7eb967174e3b64a4ec5ade5bebab65?X-Goog-Signature=redacted", - "x-dfo-trace-id": "fb09161c837d4874970eaf5a188845da" + "location": "https://storage.googleapis.com/dev-fin-observatory-datasets-working/sha256%3A4d80e30e27b5a64706113d54946e3a387e422b1115d1437594ac4b1d4307ffd2?X-Goog-Signature=redacted", + "x-dfo-trace-id": "919c1e572d914a608b166556417714c9" } } }, { "request": { "method": "GET", - "url": "https://storage.googleapis.com/dev-fin-observatory-datasets-working/sha256%3A9242d69bedb460996f21f782b1a85ee5cd7eb967174e3b64a4ec5ade5bebab65?X-Goog-Signature=redacted" + "url": "https://storage.googleapis.com/dev-fin-observatory-datasets-working/sha256%3A4d80e30e27b5a64706113d54946e3a387e422b1115d1437594ac4b1d4307ffd2?X-Goog-Signature=redacted" }, "response": { "status": 200, @@ -1435,7 +1513,7 @@ "expect": [ { "dataset": { - "rows": 109318, + "rows": 108935, "columns": [ "stat_var", "financingProvider", @@ -1462,21 +1540,24 @@ "members": [ { "parts": [], - "spec_id": "spec_fbca0f29755230d84729c1243b1d9b45", - "content_version": "cv_3d58d26a874dc30b1bba7d5ad6dd90ee", - "sentence": "Gross disbursements to the 133 G77 countries from the 32 DAC countries for official development assistance, 1963 to 2024. Current US dollars · OECD DAC2a." + "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." } ], "missing": [], "long_builds": [ { - "operation_id": "op_cc325e96d3ac6fdb6721c2468fd261f221bc87ee5eb9d8e82cf4d1f3720bdf6e", + "operation_id": "op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef", "poll_waits": [ 1.5, 3.0, 1.5, 1.5, - 1.5 + 1.5, + 1.786, + 2.268, + 2.869 ], "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 ed5514f..c2912af 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_fbca0f29755230d84729c1243b1d9b45", + "spec_id": "spec_7f538f4f65ac124f47918468b4d2eea7", "definition": { "schema_version": 1, - "spec_id": "spec_fbca0f29755230d84729c1243b1d9b45", + "spec_id": "spec_7f538f4f65ac124f47918468b4d2eea7", "identity": { "identity_version": "spec1", "shape": { @@ -226,12 +226,12 @@ }, "requested_window": { "kind": "range", - "start_year": 1963, + "start_year": 1964, "end_year": 2024 } } }, - "sentence": "Gross disbursements to the 133 G77 countries from the 32 DAC countries for official development assistance, 1963 to 2024. Current US dollars · OECD DAC2a.", + "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.", "entity_groups": { "destination": { "label": "G77 countries", @@ -254,10 +254,10 @@ "schema_version": 1, "input": { "kind": "spec_id", - "spec_id": "spec_fbca0f29755230d84729c1243b1d9b45", + "spec_id": "spec_7f538f4f65ac124f47918468b4d2eea7", "definition": { "schema_version": 1, - "spec_id": "spec_fbca0f29755230d84729c1243b1d9b45", + "spec_id": "spec_7f538f4f65ac124f47918468b4d2eea7", "identity": { "identity_version": "spec1", "shape": { @@ -469,7 +469,7 @@ }, "requested_window": { "kind": "range", - "start_year": 1963, + "start_year": 1964, "end_year": 2024 } } @@ -485,14 +485,14 @@ "status": 202, "headers": { "content-type": "application/json", - "location": "/api/datasets/operations/op_cc325e96d3ac6fdb6721c2468fd261f221bc87ee5eb9d8e82cf4d1f3720bdf6e", - "x-dfo-trace-id": "a6d5bb2eff5a48578dce7fbf91715755" + "location": "/api/datasets/operations/op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef", + "x-dfo-trace-id": "5541c591450f479485c421e20fe4d81d" }, "json": { "operation": { - "operation_id": "op_cc325e96d3ac6fdb6721c2468fd261f221bc87ee5eb9d8e82cf4d1f3720bdf6e", + "operation_id": "op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef", "status": "pending", - "poll": "/api/datasets/operations/op_cc325e96d3ac6fdb6721c2468fd261f221bc87ee5eb9d8e82cf4d1f3720bdf6e" + "poll": "/api/datasets/operations/op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef" } } } @@ -500,22 +500,22 @@ { "request": { "method": "GET", - "path": "/datasets/operations/op_cc325e96d3ac6fdb6721c2468fd261f221bc87ee5eb9d8e82cf4d1f3720bdf6e" + "path": "/datasets/operations/op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef" }, "response": { "status": 200, "headers": { "content-type": "application/json", - "x-dfo-trace-id": "71ecc596c6034e27b8ba5dd0a5d2c744" + "x-dfo-trace-id": "3416612a1b3f4a2ebbcf8ddeff74b96a" }, "json": { "operation": { - "operation_id": "op_cc325e96d3ac6fdb6721c2468fd261f221bc87ee5eb9d8e82cf4d1f3720bdf6e", + "operation_id": "op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef", "status": "running", - "poll": "/api/datasets/operations/op_cc325e96d3ac6fdb6721c2468fd261f221bc87ee5eb9d8e82cf4d1f3720bdf6e", + "poll": "/api/datasets/operations/op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef", "progress": { "rows_written": 0, - "estimate_rows": 109318 + "estimate_rows": 108935 } } } @@ -524,7 +524,7 @@ { "request": { "method": "GET", - "path": "/datasets/operations/op_cc325e96d3ac6fdb6721c2468fd261f221bc87ee5eb9d8e82cf4d1f3720bdf6e" + "path": "/datasets/operations/op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef" }, "response": { "status": 503, @@ -546,22 +546,22 @@ { "request": { "method": "GET", - "path": "/datasets/operations/op_cc325e96d3ac6fdb6721c2468fd261f221bc87ee5eb9d8e82cf4d1f3720bdf6e" + "path": "/datasets/operations/op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef" }, "response": { "status": 200, "headers": { "content-type": "application/json", - "x-dfo-trace-id": "760a3bb2de5e430fb316b3f6a4059c67" + "x-dfo-trace-id": "65394508d86f443db7528ac38066b9e3" }, "json": { "operation": { - "operation_id": "op_cc325e96d3ac6fdb6721c2468fd261f221bc87ee5eb9d8e82cf4d1f3720bdf6e", + "operation_id": "op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef", "status": "running", - "poll": "/api/datasets/operations/op_cc325e96d3ac6fdb6721c2468fd261f221bc87ee5eb9d8e82cf4d1f3720bdf6e", + "poll": "/api/datasets/operations/op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef", "progress": { - "rows_written": 0, - "estimate_rows": 109318 + "rows_written": 64600, + "estimate_rows": 108935 } } } @@ -570,22 +570,46 @@ { "request": { "method": "GET", - "path": "/datasets/operations/op_cc325e96d3ac6fdb6721c2468fd261f221bc87ee5eb9d8e82cf4d1f3720bdf6e" + "path": "/datasets/operations/op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef" }, "response": { "status": 200, "headers": { "content-type": "application/json", - "x-dfo-trace-id": "15f9386c84484af983d33c6d183e5349" + "x-dfo-trace-id": "7a2d07cfe29b4993a374ee71104d461a" }, "json": { "operation": { - "operation_id": "op_cc325e96d3ac6fdb6721c2468fd261f221bc87ee5eb9d8e82cf4d1f3720bdf6e", + "operation_id": "op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef", "status": "running", - "poll": "/api/datasets/operations/op_cc325e96d3ac6fdb6721c2468fd261f221bc87ee5eb9d8e82cf4d1f3720bdf6e", + "poll": "/api/datasets/operations/op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef", "progress": { - "rows_written": 0, - "estimate_rows": 109318 + "rows_written": 108935, + "estimate_rows": 108935 + } + } + } + } + }, + { + "request": { + "method": "GET", + "path": "/datasets/operations/op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef" + }, + "response": { + "status": 200, + "headers": { + "content-type": "application/json", + "x-dfo-trace-id": "7c7c516f463a471583976147759c6250" + }, + "json": { + "operation": { + "operation_id": "op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef", + "status": "running", + "poll": "/api/datasets/operations/op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef", + "progress": { + "rows_written": 108935, + "estimate_rows": 108935 } } } @@ -594,24 +618,72 @@ { "request": { "method": "GET", - "path": "/datasets/operations/op_cc325e96d3ac6fdb6721c2468fd261f221bc87ee5eb9d8e82cf4d1f3720bdf6e" + "path": "/datasets/operations/op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef" }, "response": { "status": 200, "headers": { "content-type": "application/json", - "x-dfo-trace-id": "2cc73cd4fbaa4a28a350025111f70a79" + "x-dfo-trace-id": "9ddce1ae50fd4187abeb32c45a0f03ba" }, "json": { "operation": { - "operation_id": "op_cc325e96d3ac6fdb6721c2468fd261f221bc87ee5eb9d8e82cf4d1f3720bdf6e", + "operation_id": "op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef", + "status": "running", + "poll": "/api/datasets/operations/op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef", + "progress": { + "rows_written": 108935, + "estimate_rows": 108935 + } + } + } + } + }, + { + "request": { + "method": "GET", + "path": "/datasets/operations/op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef" + }, + "response": { + "status": 200, + "headers": { + "content-type": "application/json", + "x-dfo-trace-id": "1ce68951ada64961b3710bb73127c9d8" + }, + "json": { + "operation": { + "operation_id": "op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef", + "status": "running", + "poll": "/api/datasets/operations/op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef", + "progress": { + "rows_written": 108935, + "estimate_rows": 108935 + } + } + } + } + }, + { + "request": { + "method": "GET", + "path": "/datasets/operations/op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef" + }, + "response": { + "status": 200, + "headers": { + "content-type": "application/json", + "x-dfo-trace-id": "37207f1ea4574e4e8485e8cebd4f4edc" + }, + "json": { + "operation": { + "operation_id": "op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef", "status": "done" }, "manifest": { "schema_version": 1, "definition": { "schema_version": 1, - "spec_id": "spec_fbca0f29755230d84729c1243b1d9b45", + "spec_id": "spec_7f538f4f65ac124f47918468b4d2eea7", "identity": { "shape": { "kind": "statvar_schema", @@ -824,14 +896,14 @@ "requested_window": { "kind": "range", "end_year": 2024, - "start_year": 1963 + "start_year": 1964 } } }, - "content_version": "cv_3d58d26a874dc30b1bba7d5ad6dd90ee", - "prepared_at": "2026-10-23T18:38:28Z", + "content_version": "cv_ed2cc83eb28d4e6883cde079f05844ed", + "prepared_at": "2026-10-25T17:38:14Z", "coverage": { - "rows": 109318, + "rows": 108935, "dimensions": [ { "label": "financingProvider", @@ -853,14 +925,14 @@ }, { "label": "years", - "count": 62 + "count": 61 } ], "window": { "kind": "range", "origin": "query", "end_year": 2024, - "start_year": 1963 + "start_year": 1964 } }, "citation": { @@ -979,13 +1051,13 @@ "kind": "range", "origin": "query", "end_year": 2024, - "start_year": 1963 + "start_year": 1964 }, - "graph_revision": "dfo-dev-dc-datacommons-service-00264-2s9", + "graph_revision": "dfo-dev-dc-datacommons-service-00273-mmh", "normalisations": [], "code_index_stamp": { - "exported_at": "2026-10-23T18:14:12Z", - "content_hash": "29eb81d7b6c88641b1d4e8eb5e850ca36de66b99d6e9e09680aac020507a6392", + "exported_at": "2026-10-24T19:20:27Z", + "content_hash": "3d946d8f4986dbbe0fa3e5c4c917200381f529d89ce417c11daeb22df56eed99", "graph_endpoint": "graph_release" }, "source_revisions": [ @@ -994,8 +1066,8 @@ "revision": "2026-10-15" } ], - "capability_version": "dset_cc753cefa9199881", - "materialiser_build": "035d29cd05fb31d7cb47cfb33197d4002f773df6", + "capability_version": "dset_76f5fa7244511c58", + "materialiser_build": "99e62038ceb4b459c2ac699549076ff123c166aa", "resolved_stat_vars": [ { "ref": "dcid:Amount_FinancialFlow_Gross_Disbursement_DAC2aAidType206_Nominal", @@ -1003,15 +1075,15 @@ "financingProvider", "financingRecipient" ], - "observation_count": 109318 + "observation_count": 108935 } ], "family_member_count": 1, "family_member_digest": "1a36e1a7292b1bfff95a5415de0be74cac7bb033217ed50e79faa8ce51a224c0", "frame_grammar_version": "1.1.0", - "origin_catalogue_build_id": "20261023T061534Z-06fa7b89", + "origin_catalogue_build_id": "20261024T193016Z-775d36a9", "served_from": "materialise", - "confirmed_at": "2026-10-24T16:30:59.952146+00:00" + "confirmed_at": "2026-10-25T17:38:17.505656+00:00" }, "warnings": [], "diagnostics": [ @@ -1023,34 +1095,34 @@ ], "artifacts": [ { - "artifact_digest": "sha256:9242d69bedb460996f21f782b1a85ee5cd7eb967174e3b64a4ec5ade5bebab65", + "artifact_digest": "sha256:4d80e30e27b5a64706113d54946e3a387e422b1115d1437594ac4b1d4307ffd2", "rendering": { "bundle": false, "format": "parquet", "layout": 4 }, - "bytes": 473679, + "bytes": 472796, "media_type": "application/vnd.apache.parquet", - "created_at": "2026-10-23T18:38:31.580044+00:00", + "created_at": "2026-10-25T17:38:17.426404+00:00", "tier": "working", - "url": "/api/datasets/spec_fbca0f29755230d84729c1243b1d9b45/cv_3d58d26a874dc30b1bba7d5ad6dd90ee/files/sha256:9242d69bedb460996f21f782b1a85ee5cd7eb967174e3b64a4ec5ade5bebab65", + "url": "/api/datasets/spec_7f538f4f65ac124f47918468b4d2eea7/cv_ed2cc83eb28d4e6883cde079f05844ed/files/sha256:4d80e30e27b5a64706113d54946e3a387e422b1115d1437594ac4b1d4307ffd2", "enrichment_stamp": "08ed6c734fc69ea2204a21f4e1dd8b963f14dd1e03a2484c618049ac2e2d93d8" }, { - "artifact_digest": "sha256:099d1ce36b440868b72174fb9cdff503cc4c7a0f0ef902e66484c5bfbd270f39", + "artifact_digest": "sha256:4e3ed758ad1a33cf9d150ee5fa71adf7f5bd40e4d342d839633d8386239babe1", "rendering": { "statistics": "series" }, - "bytes": 144274, + "bytes": 144449, "media_type": "application/vnd.apache.parquet", - "created_at": "2026-10-23T18:38:31.580044+00:00", + "created_at": "2026-10-25T17:38:17.426404+00:00", "tier": "working", - "url": "/api/datasets/spec_fbca0f29755230d84729c1243b1d9b45/cv_3d58d26a874dc30b1bba7d5ad6dd90ee/files/sha256:099d1ce36b440868b72174fb9cdff503cc4c7a0f0ef902e66484c5bfbd270f39" + "url": "/api/datasets/spec_7f538f4f65ac124f47918468b4d2eea7/cv_ed2cc83eb28d4e6883cde079f05844ed/files/sha256:4e3ed758ad1a33cf9d150ee5fa71adf7f5bd40e4d342d839633d8386239babe1" } ], "series_count": 3656, "output_options": { - "capability_version": "dset_cc753cefa9199881", + "capability_version": "dset_76f5fa7244511c58", "columns": [ { "name": "stat_var", @@ -1074,7 +1146,7 @@ "name": "time_period", "kind": "grain", "droppable": false, - "distinct": 62 + "distinct": 61 }, { "name": "value", @@ -1314,7 +1386,7 @@ "varying": [ { "column": "time_period", - "distinct": 62 + "distinct": 61 } ] }, @@ -1338,7 +1410,7 @@ "varying": [ { "column": "time_period", - "distinct": 62 + "distinct": 61 } ] }, @@ -1397,10 +1469,10 @@ ] } }, - "series_coverage_stamp": "0b8c9a18fcc5af19013b21e865c64481503b6a6542f7d2e6628999e6559a47de", + "series_coverage_stamp": "e6e717ab8c77e84d010915893ede5809e9ecec67929a07cfafbcc2210edfa1eb", "retention": { "pinned": false, - "held_until": "2026-11-22T18:38:31.579178Z" + "held_until": "2026-11-24T17:38:17.425152Z" } } } @@ -1409,21 +1481,21 @@ { "request": { "method": "GET", - "origin_path": "/api/datasets/spec_fbca0f29755230d84729c1243b1d9b45/cv_3d58d26a874dc30b1bba7d5ad6dd90ee/files/sha256:9242d69bedb460996f21f782b1a85ee5cd7eb967174e3b64a4ec5ade5bebab65" + "origin_path": "/api/datasets/spec_7f538f4f65ac124f47918468b4d2eea7/cv_ed2cc83eb28d4e6883cde079f05844ed/files/sha256:4d80e30e27b5a64706113d54946e3a387e422b1115d1437594ac4b1d4307ffd2" }, "response": { "status": 302, "headers": { "content-type": "text/html", - "location": "https://storage.googleapis.com/dev-fin-observatory-datasets-working/sha256%3A9242d69bedb460996f21f782b1a85ee5cd7eb967174e3b64a4ec5ade5bebab65?X-Goog-Signature=redacted", - "x-dfo-trace-id": "fb09161c837d4874970eaf5a188845da" + "location": "https://storage.googleapis.com/dev-fin-observatory-datasets-working/sha256%3A4d80e30e27b5a64706113d54946e3a387e422b1115d1437594ac4b1d4307ffd2?X-Goog-Signature=redacted", + "x-dfo-trace-id": "919c1e572d914a608b166556417714c9" } } }, { "request": { "method": "GET", - "url": "https://storage.googleapis.com/dev-fin-observatory-datasets-working/sha256%3A9242d69bedb460996f21f782b1a85ee5cd7eb967174e3b64a4ec5ade5bebab65?X-Goog-Signature=redacted" + "url": "https://storage.googleapis.com/dev-fin-observatory-datasets-working/sha256%3A4d80e30e27b5a64706113d54946e3a387e422b1115d1437594ac4b1d4307ffd2?X-Goog-Signature=redacted" }, "response": { "status": 200, @@ -1437,7 +1509,7 @@ "expect": [ { "dataset": { - "rows": 109318, + "rows": 108935, "columns": [ "stat_var", "financingProvider", @@ -1464,20 +1536,23 @@ "members": [ { "parts": [], - "spec_id": "spec_fbca0f29755230d84729c1243b1d9b45", - "content_version": "cv_3d58d26a874dc30b1bba7d5ad6dd90ee", - "sentence": "Gross disbursements to the 133 G77 countries from the 32 DAC countries for official development assistance, 1963 to 2024. Current US dollars · OECD DAC2a." + "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." } ], "missing": [], "long_builds": [ { - "operation_id": "op_cc325e96d3ac6fdb6721c2468fd261f221bc87ee5eb9d8e82cf4d1f3720bdf6e", + "operation_id": "op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef", "poll_waits": [ 1.0, 2.0, 4.0, 8.0, + 8.0, + 8.0, + 8.0, 8.0 ], "resubmissions": 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 02becd9..18daf7d 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_fbca0f29755230d84729c1243b1d9b45", + "spec_id": "spec_7f538f4f65ac124f47918468b4d2eea7", "definition": { "schema_version": 1, - "spec_id": "spec_fbca0f29755230d84729c1243b1d9b45", + "spec_id": "spec_7f538f4f65ac124f47918468b4d2eea7", "identity": { "identity_version": "spec1", "shape": { @@ -226,12 +226,12 @@ }, "requested_window": { "kind": "range", - "start_year": 1963, + "start_year": 1964, "end_year": 2024 } } }, - "sentence": "Gross disbursements to the 133 G77 countries from the 32 DAC countries for official development assistance, 1963 to 2024. Current US dollars · OECD DAC2a.", + "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.", "entity_groups": { "destination": { "label": "G77 countries", @@ -254,10 +254,10 @@ "schema_version": 1, "input": { "kind": "spec_id", - "spec_id": "spec_fbca0f29755230d84729c1243b1d9b45", + "spec_id": "spec_7f538f4f65ac124f47918468b4d2eea7", "definition": { "schema_version": 1, - "spec_id": "spec_fbca0f29755230d84729c1243b1d9b45", + "spec_id": "spec_7f538f4f65ac124f47918468b4d2eea7", "identity": { "identity_version": "spec1", "shape": { @@ -469,7 +469,7 @@ }, "requested_window": { "kind": "range", - "start_year": 1963, + "start_year": 1964, "end_year": 2024 } } @@ -485,15 +485,15 @@ "status": 202, "headers": { "content-type": "application/json", - "location": "/api/datasets/operations/op_cc325e96d3ac6fdb6721c2468fd261f221bc87ee5eb9d8e82cf4d1f3720bdf6e", + "location": "/api/datasets/operations/op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef", "retry-after": "2", - "x-dfo-trace-id": "a6d5bb2eff5a48578dce7fbf91715755" + "x-dfo-trace-id": "5541c591450f479485c421e20fe4d81d" }, "json": { "operation": { - "operation_id": "op_cc325e96d3ac6fdb6721c2468fd261f221bc87ee5eb9d8e82cf4d1f3720bdf6e", + "operation_id": "op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef", "status": "pending", - "poll": "/api/datasets/operations/op_cc325e96d3ac6fdb6721c2468fd261f221bc87ee5eb9d8e82cf4d1f3720bdf6e", + "poll": "/api/datasets/operations/op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef", "retry_after_ms": 1500 } } @@ -502,7 +502,7 @@ { "request": { "method": "GET", - "path": "/datasets/operations/op_cc325e96d3ac6fdb6721c2468fd261f221bc87ee5eb9d8e82cf4d1f3720bdf6e" + "path": "/datasets/operations/op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef" }, "response": { "status": 503, @@ -525,24 +525,24 @@ { "request": { "method": "GET", - "path": "/datasets/operations/op_cc325e96d3ac6fdb6721c2468fd261f221bc87ee5eb9d8e82cf4d1f3720bdf6e" + "path": "/datasets/operations/op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef" }, "response": { "status": 200, "headers": { "content-type": "application/json", "retry-after": "2", - "x-dfo-trace-id": "71ecc596c6034e27b8ba5dd0a5d2c744" + "x-dfo-trace-id": "3416612a1b3f4a2ebbcf8ddeff74b96a" }, "json": { "operation": { - "operation_id": "op_cc325e96d3ac6fdb6721c2468fd261f221bc87ee5eb9d8e82cf4d1f3720bdf6e", + "operation_id": "op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef", "status": "running", - "poll": "/api/datasets/operations/op_cc325e96d3ac6fdb6721c2468fd261f221bc87ee5eb9d8e82cf4d1f3720bdf6e", + "poll": "/api/datasets/operations/op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef", "retry_after_ms": 1500, "progress": { "rows_written": 0, - "estimate_rows": 109318 + "estimate_rows": 108935 } } } @@ -551,24 +551,24 @@ { "request": { "method": "GET", - "path": "/datasets/operations/op_cc325e96d3ac6fdb6721c2468fd261f221bc87ee5eb9d8e82cf4d1f3720bdf6e" + "path": "/datasets/operations/op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef" }, "response": { "status": 200, "headers": { "content-type": "application/json", "retry-after": "2", - "x-dfo-trace-id": "760a3bb2de5e430fb316b3f6a4059c67" + "x-dfo-trace-id": "65394508d86f443db7528ac38066b9e3" }, "json": { "operation": { - "operation_id": "op_cc325e96d3ac6fdb6721c2468fd261f221bc87ee5eb9d8e82cf4d1f3720bdf6e", + "operation_id": "op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef", "status": "running", - "poll": "/api/datasets/operations/op_cc325e96d3ac6fdb6721c2468fd261f221bc87ee5eb9d8e82cf4d1f3720bdf6e", + "poll": "/api/datasets/operations/op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef", "retry_after_ms": 1500, "progress": { - "rows_written": 0, - "estimate_rows": 109318 + "rows_written": 64600, + "estimate_rows": 108935 } } } @@ -577,24 +577,76 @@ { "request": { "method": "GET", - "path": "/datasets/operations/op_cc325e96d3ac6fdb6721c2468fd261f221bc87ee5eb9d8e82cf4d1f3720bdf6e" + "path": "/datasets/operations/op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef" }, "response": { "status": 200, "headers": { "content-type": "application/json", "retry-after": "2", - "x-dfo-trace-id": "15f9386c84484af983d33c6d183e5349" + "x-dfo-trace-id": "7a2d07cfe29b4993a374ee71104d461a" }, "json": { "operation": { - "operation_id": "op_cc325e96d3ac6fdb6721c2468fd261f221bc87ee5eb9d8e82cf4d1f3720bdf6e", + "operation_id": "op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef", "status": "running", - "poll": "/api/datasets/operations/op_cc325e96d3ac6fdb6721c2468fd261f221bc87ee5eb9d8e82cf4d1f3720bdf6e", + "poll": "/api/datasets/operations/op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef", "retry_after_ms": 1500, "progress": { - "rows_written": 0, - "estimate_rows": 109318 + "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": 1786, + "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" + }, + "json": { + "operation": { + "operation_id": "op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef", + "status": "running", + "poll": "/api/datasets/operations/op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef", + "retry_after_ms": 2268, + "progress": { + "rows_written": 108935, + "estimate_rows": 108935 } } } @@ -603,24 +655,50 @@ { "request": { "method": "GET", - "path": "/datasets/operations/op_cc325e96d3ac6fdb6721c2468fd261f221bc87ee5eb9d8e82cf4d1f3720bdf6e" + "path": "/datasets/operations/op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef" }, "response": { "status": 200, "headers": { "content-type": "application/json", - "x-dfo-trace-id": "2cc73cd4fbaa4a28a350025111f70a79" + "retry-after": "3", + "x-dfo-trace-id": "1ce68951ada64961b3710bb73127c9d8" }, "json": { "operation": { - "operation_id": "op_cc325e96d3ac6fdb6721c2468fd261f221bc87ee5eb9d8e82cf4d1f3720bdf6e", + "operation_id": "op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef", + "status": "running", + "poll": "/api/datasets/operations/op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef", + "retry_after_ms": 2869, + "progress": { + "rows_written": 108935, + "estimate_rows": 108935 + } + } + } + } + }, + { + "request": { + "method": "GET", + "path": "/datasets/operations/op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef" + }, + "response": { + "status": 200, + "headers": { + "content-type": "application/json", + "x-dfo-trace-id": "37207f1ea4574e4e8485e8cebd4f4edc" + }, + "json": { + "operation": { + "operation_id": "op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef", "status": "done" }, "manifest": { "schema_version": 1, "definition": { "schema_version": 1, - "spec_id": "spec_fbca0f29755230d84729c1243b1d9b45", + "spec_id": "spec_7f538f4f65ac124f47918468b4d2eea7", "identity": { "shape": { "kind": "statvar_schema", @@ -833,14 +911,14 @@ "requested_window": { "kind": "range", "end_year": 2024, - "start_year": 1963 + "start_year": 1964 } } }, - "content_version": "cv_3d58d26a874dc30b1bba7d5ad6dd90ee", - "prepared_at": "2026-10-23T18:38:28Z", + "content_version": "cv_ed2cc83eb28d4e6883cde079f05844ed", + "prepared_at": "2026-10-25T17:38:14Z", "coverage": { - "rows": 109318, + "rows": 108935, "dimensions": [ { "label": "financingProvider", @@ -862,14 +940,14 @@ }, { "label": "years", - "count": 62 + "count": 61 } ], "window": { "kind": "range", "origin": "query", "end_year": 2024, - "start_year": 1963 + "start_year": 1964 } }, "citation": { @@ -988,13 +1066,13 @@ "kind": "range", "origin": "query", "end_year": 2024, - "start_year": 1963 + "start_year": 1964 }, - "graph_revision": "dfo-dev-dc-datacommons-service-00264-2s9", + "graph_revision": "dfo-dev-dc-datacommons-service-00273-mmh", "normalisations": [], "code_index_stamp": { - "exported_at": "2026-10-23T18:14:12Z", - "content_hash": "29eb81d7b6c88641b1d4e8eb5e850ca36de66b99d6e9e09680aac020507a6392", + "exported_at": "2026-10-24T19:20:27Z", + "content_hash": "3d946d8f4986dbbe0fa3e5c4c917200381f529d89ce417c11daeb22df56eed99", "graph_endpoint": "graph_release" }, "source_revisions": [ @@ -1003,8 +1081,8 @@ "revision": "2026-10-15" } ], - "capability_version": "dset_cc753cefa9199881", - "materialiser_build": "035d29cd05fb31d7cb47cfb33197d4002f773df6", + "capability_version": "dset_76f5fa7244511c58", + "materialiser_build": "99e62038ceb4b459c2ac699549076ff123c166aa", "resolved_stat_vars": [ { "ref": "dcid:Amount_FinancialFlow_Gross_Disbursement_DAC2aAidType206_Nominal", @@ -1012,15 +1090,15 @@ "financingProvider", "financingRecipient" ], - "observation_count": 109318 + "observation_count": 108935 } ], "family_member_count": 1, "family_member_digest": "1a36e1a7292b1bfff95a5415de0be74cac7bb033217ed50e79faa8ce51a224c0", "frame_grammar_version": "1.1.0", - "origin_catalogue_build_id": "20261023T061534Z-06fa7b89", + "origin_catalogue_build_id": "20261024T193016Z-775d36a9", "served_from": "materialise", - "confirmed_at": "2026-10-24T16:30:59.952146+00:00" + "confirmed_at": "2026-10-25T17:38:17.505656+00:00" }, "warnings": [], "diagnostics": [ @@ -1032,34 +1110,34 @@ ], "artifacts": [ { - "artifact_digest": "sha256:9242d69bedb460996f21f782b1a85ee5cd7eb967174e3b64a4ec5ade5bebab65", + "artifact_digest": "sha256:4d80e30e27b5a64706113d54946e3a387e422b1115d1437594ac4b1d4307ffd2", "rendering": { "bundle": false, "format": "parquet", "layout": 4 }, - "bytes": 473679, + "bytes": 472796, "media_type": "application/vnd.apache.parquet", - "created_at": "2026-10-23T18:38:31.580044+00:00", + "created_at": "2026-10-25T17:38:17.426404+00:00", "tier": "working", - "url": "/api/datasets/spec_fbca0f29755230d84729c1243b1d9b45/cv_3d58d26a874dc30b1bba7d5ad6dd90ee/files/sha256:9242d69bedb460996f21f782b1a85ee5cd7eb967174e3b64a4ec5ade5bebab65", + "url": "/api/datasets/spec_7f538f4f65ac124f47918468b4d2eea7/cv_ed2cc83eb28d4e6883cde079f05844ed/files/sha256:4d80e30e27b5a64706113d54946e3a387e422b1115d1437594ac4b1d4307ffd2", "enrichment_stamp": "08ed6c734fc69ea2204a21f4e1dd8b963f14dd1e03a2484c618049ac2e2d93d8" }, { - "artifact_digest": "sha256:099d1ce36b440868b72174fb9cdff503cc4c7a0f0ef902e66484c5bfbd270f39", + "artifact_digest": "sha256:4e3ed758ad1a33cf9d150ee5fa71adf7f5bd40e4d342d839633d8386239babe1", "rendering": { "statistics": "series" }, - "bytes": 144274, + "bytes": 144449, "media_type": "application/vnd.apache.parquet", - "created_at": "2026-10-23T18:38:31.580044+00:00", + "created_at": "2026-10-25T17:38:17.426404+00:00", "tier": "working", - "url": "/api/datasets/spec_fbca0f29755230d84729c1243b1d9b45/cv_3d58d26a874dc30b1bba7d5ad6dd90ee/files/sha256:099d1ce36b440868b72174fb9cdff503cc4c7a0f0ef902e66484c5bfbd270f39" + "url": "/api/datasets/spec_7f538f4f65ac124f47918468b4d2eea7/cv_ed2cc83eb28d4e6883cde079f05844ed/files/sha256:4e3ed758ad1a33cf9d150ee5fa71adf7f5bd40e4d342d839633d8386239babe1" } ], "series_count": 3656, "output_options": { - "capability_version": "dset_cc753cefa9199881", + "capability_version": "dset_76f5fa7244511c58", "columns": [ { "name": "stat_var", @@ -1083,7 +1161,7 @@ "name": "time_period", "kind": "grain", "droppable": false, - "distinct": 62 + "distinct": 61 }, { "name": "value", @@ -1323,7 +1401,7 @@ "varying": [ { "column": "time_period", - "distinct": 62 + "distinct": 61 } ] }, @@ -1347,7 +1425,7 @@ "varying": [ { "column": "time_period", - "distinct": 62 + "distinct": 61 } ] }, @@ -1406,10 +1484,10 @@ ] } }, - "series_coverage_stamp": "0b8c9a18fcc5af19013b21e865c64481503b6a6542f7d2e6628999e6559a47de", + "series_coverage_stamp": "e6e717ab8c77e84d010915893ede5809e9ecec67929a07cfafbcc2210edfa1eb", "retention": { "pinned": false, - "held_until": "2026-11-22T18:38:31.579178Z" + "held_until": "2026-11-24T17:38:17.425152Z" } } } @@ -1418,21 +1496,21 @@ { "request": { "method": "GET", - "origin_path": "/api/datasets/spec_fbca0f29755230d84729c1243b1d9b45/cv_3d58d26a874dc30b1bba7d5ad6dd90ee/files/sha256:9242d69bedb460996f21f782b1a85ee5cd7eb967174e3b64a4ec5ade5bebab65" + "origin_path": "/api/datasets/spec_7f538f4f65ac124f47918468b4d2eea7/cv_ed2cc83eb28d4e6883cde079f05844ed/files/sha256:4d80e30e27b5a64706113d54946e3a387e422b1115d1437594ac4b1d4307ffd2" }, "response": { "status": 302, "headers": { "content-type": "text/html", - "location": "https://storage.googleapis.com/dev-fin-observatory-datasets-working/sha256%3A9242d69bedb460996f21f782b1a85ee5cd7eb967174e3b64a4ec5ade5bebab65?X-Goog-Signature=redacted", - "x-dfo-trace-id": "fb09161c837d4874970eaf5a188845da" + "location": "https://storage.googleapis.com/dev-fin-observatory-datasets-working/sha256%3A4d80e30e27b5a64706113d54946e3a387e422b1115d1437594ac4b1d4307ffd2?X-Goog-Signature=redacted", + "x-dfo-trace-id": "919c1e572d914a608b166556417714c9" } } }, { "request": { "method": "GET", - "url": "https://storage.googleapis.com/dev-fin-observatory-datasets-working/sha256%3A9242d69bedb460996f21f782b1a85ee5cd7eb967174e3b64a4ec5ade5bebab65?X-Goog-Signature=redacted" + "url": "https://storage.googleapis.com/dev-fin-observatory-datasets-working/sha256%3A4d80e30e27b5a64706113d54946e3a387e422b1115d1437594ac4b1d4307ffd2?X-Goog-Signature=redacted" }, "response": { "status": 200, @@ -1446,7 +1524,7 @@ "expect": [ { "dataset": { - "rows": 109318, + "rows": 108935, "columns": [ "stat_var", "financingProvider", @@ -1473,21 +1551,24 @@ "members": [ { "parts": [], - "spec_id": "spec_fbca0f29755230d84729c1243b1d9b45", - "content_version": "cv_3d58d26a874dc30b1bba7d5ad6dd90ee", - "sentence": "Gross disbursements to the 133 G77 countries from the 32 DAC countries for official development assistance, 1963 to 2024. Current US dollars · OECD DAC2a." + "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." } ], "missing": [], "long_builds": [ { - "operation_id": "op_cc325e96d3ac6fdb6721c2468fd261f221bc87ee5eb9d8e82cf4d1f3720bdf6e", + "operation_id": "op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef", "poll_waits": [ 1.5, 5.0, 1.5, 1.5, - 1.5 + 1.5, + 1.786, + 2.268, + 2.869 ], "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 b1f3dcf..15a5881 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_fbca0f29755230d84729c1243b1d9b45", + "spec_id": "spec_7f538f4f65ac124f47918468b4d2eea7", "definition": { "schema_version": 1, - "spec_id": "spec_fbca0f29755230d84729c1243b1d9b45", + "spec_id": "spec_7f538f4f65ac124f47918468b4d2eea7", "identity": { "identity_version": "spec1", "shape": { @@ -226,12 +226,12 @@ }, "requested_window": { "kind": "range", - "start_year": 1963, + "start_year": 1964, "end_year": 2024 } } }, - "sentence": "Gross disbursements to the 133 G77 countries from the 32 DAC countries for official development assistance, 1963 to 2024. Current US dollars · OECD DAC2a.", + "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.", "entity_groups": { "destination": { "label": "G77 countries", @@ -254,10 +254,10 @@ "schema_version": 1, "input": { "kind": "spec_id", - "spec_id": "spec_fbca0f29755230d84729c1243b1d9b45", + "spec_id": "spec_7f538f4f65ac124f47918468b4d2eea7", "definition": { "schema_version": 1, - "spec_id": "spec_fbca0f29755230d84729c1243b1d9b45", + "spec_id": "spec_7f538f4f65ac124f47918468b4d2eea7", "identity": { "identity_version": "spec1", "shape": { @@ -469,7 +469,7 @@ }, "requested_window": { "kind": "range", - "start_year": 1963, + "start_year": 1964, "end_year": 2024 } } @@ -485,15 +485,15 @@ "status": 202, "headers": { "content-type": "application/json", - "location": "/api/datasets/operations/op_cc325e96d3ac6fdb6721c2468fd261f221bc87ee5eb9d8e82cf4d1f3720bdf6e", + "location": "/api/datasets/operations/op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef", "retry-after": "2", - "x-dfo-trace-id": "a6d5bb2eff5a48578dce7fbf91715755" + "x-dfo-trace-id": "5541c591450f479485c421e20fe4d81d" }, "json": { "operation": { - "operation_id": "op_cc325e96d3ac6fdb6721c2468fd261f221bc87ee5eb9d8e82cf4d1f3720bdf6e", + "operation_id": "op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef", "status": "pending", - "poll": "/api/datasets/operations/op_cc325e96d3ac6fdb6721c2468fd261f221bc87ee5eb9d8e82cf4d1f3720bdf6e", + "poll": "/api/datasets/operations/op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef", "retry_after_ms": 1500 } } @@ -502,7 +502,7 @@ { "request": { "method": "GET", - "path": "/datasets/operations/op_cc325e96d3ac6fdb6721c2468fd261f221bc87ee5eb9d8e82cf4d1f3720bdf6e" + "path": "/datasets/operations/op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef" }, "response": { "status": 503, @@ -524,24 +524,24 @@ { "request": { "method": "GET", - "path": "/datasets/operations/op_cc325e96d3ac6fdb6721c2468fd261f221bc87ee5eb9d8e82cf4d1f3720bdf6e" + "path": "/datasets/operations/op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef" }, "response": { "status": 200, "headers": { "content-type": "application/json", "retry-after": "2", - "x-dfo-trace-id": "71ecc596c6034e27b8ba5dd0a5d2c744" + "x-dfo-trace-id": "3416612a1b3f4a2ebbcf8ddeff74b96a" }, "json": { "operation": { - "operation_id": "op_cc325e96d3ac6fdb6721c2468fd261f221bc87ee5eb9d8e82cf4d1f3720bdf6e", + "operation_id": "op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef", "status": "running", - "poll": "/api/datasets/operations/op_cc325e96d3ac6fdb6721c2468fd261f221bc87ee5eb9d8e82cf4d1f3720bdf6e", + "poll": "/api/datasets/operations/op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef", "retry_after_ms": 1500, "progress": { "rows_written": 0, - "estimate_rows": 109318 + "estimate_rows": 108935 } } } @@ -550,24 +550,24 @@ { "request": { "method": "GET", - "path": "/datasets/operations/op_cc325e96d3ac6fdb6721c2468fd261f221bc87ee5eb9d8e82cf4d1f3720bdf6e" + "path": "/datasets/operations/op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef" }, "response": { "status": 200, "headers": { "content-type": "application/json", "retry-after": "2", - "x-dfo-trace-id": "760a3bb2de5e430fb316b3f6a4059c67" + "x-dfo-trace-id": "65394508d86f443db7528ac38066b9e3" }, "json": { "operation": { - "operation_id": "op_cc325e96d3ac6fdb6721c2468fd261f221bc87ee5eb9d8e82cf4d1f3720bdf6e", + "operation_id": "op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef", "status": "running", - "poll": "/api/datasets/operations/op_cc325e96d3ac6fdb6721c2468fd261f221bc87ee5eb9d8e82cf4d1f3720bdf6e", + "poll": "/api/datasets/operations/op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef", "retry_after_ms": 1500, "progress": { - "rows_written": 0, - "estimate_rows": 109318 + "rows_written": 64600, + "estimate_rows": 108935 } } } @@ -576,7 +576,7 @@ { "request": { "method": "GET", - "path": "/datasets/operations/op_cc325e96d3ac6fdb6721c2468fd261f221bc87ee5eb9d8e82cf4d1f3720bdf6e" + "path": "/datasets/operations/op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef" }, "response": { "status": 503, @@ -598,7 +598,7 @@ { "request": { "method": "GET", - "path": "/datasets/operations/op_cc325e96d3ac6fdb6721c2468fd261f221bc87ee5eb9d8e82cf4d1f3720bdf6e" + "path": "/datasets/operations/op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef" }, "response": { "status": 503, @@ -620,24 +620,76 @@ { "request": { "method": "GET", - "path": "/datasets/operations/op_cc325e96d3ac6fdb6721c2468fd261f221bc87ee5eb9d8e82cf4d1f3720bdf6e" + "path": "/datasets/operations/op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef" }, "response": { "status": 200, "headers": { "content-type": "application/json", "retry-after": "2", - "x-dfo-trace-id": "15f9386c84484af983d33c6d183e5349" + "x-dfo-trace-id": "7a2d07cfe29b4993a374ee71104d461a" }, "json": { "operation": { - "operation_id": "op_cc325e96d3ac6fdb6721c2468fd261f221bc87ee5eb9d8e82cf4d1f3720bdf6e", + "operation_id": "op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef", "status": "running", - "poll": "/api/datasets/operations/op_cc325e96d3ac6fdb6721c2468fd261f221bc87ee5eb9d8e82cf4d1f3720bdf6e", + "poll": "/api/datasets/operations/op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef", "retry_after_ms": 1500, "progress": { - "rows_written": 0, - "estimate_rows": 109318 + "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": 1786, + "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" + }, + "json": { + "operation": { + "operation_id": "op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef", + "status": "running", + "poll": "/api/datasets/operations/op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef", + "retry_after_ms": 2268, + "progress": { + "rows_written": 108935, + "estimate_rows": 108935 } } } @@ -646,24 +698,50 @@ { "request": { "method": "GET", - "path": "/datasets/operations/op_cc325e96d3ac6fdb6721c2468fd261f221bc87ee5eb9d8e82cf4d1f3720bdf6e" + "path": "/datasets/operations/op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef" }, "response": { "status": 200, "headers": { "content-type": "application/json", - "x-dfo-trace-id": "2cc73cd4fbaa4a28a350025111f70a79" + "retry-after": "3", + "x-dfo-trace-id": "1ce68951ada64961b3710bb73127c9d8" }, "json": { "operation": { - "operation_id": "op_cc325e96d3ac6fdb6721c2468fd261f221bc87ee5eb9d8e82cf4d1f3720bdf6e", + "operation_id": "op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef", + "status": "running", + "poll": "/api/datasets/operations/op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef", + "retry_after_ms": 2869, + "progress": { + "rows_written": 108935, + "estimate_rows": 108935 + } + } + } + } + }, + { + "request": { + "method": "GET", + "path": "/datasets/operations/op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef" + }, + "response": { + "status": 200, + "headers": { + "content-type": "application/json", + "x-dfo-trace-id": "37207f1ea4574e4e8485e8cebd4f4edc" + }, + "json": { + "operation": { + "operation_id": "op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef", "status": "done" }, "manifest": { "schema_version": 1, "definition": { "schema_version": 1, - "spec_id": "spec_fbca0f29755230d84729c1243b1d9b45", + "spec_id": "spec_7f538f4f65ac124f47918468b4d2eea7", "identity": { "shape": { "kind": "statvar_schema", @@ -876,14 +954,14 @@ "requested_window": { "kind": "range", "end_year": 2024, - "start_year": 1963 + "start_year": 1964 } } }, - "content_version": "cv_3d58d26a874dc30b1bba7d5ad6dd90ee", - "prepared_at": "2026-10-23T18:38:28Z", + "content_version": "cv_ed2cc83eb28d4e6883cde079f05844ed", + "prepared_at": "2026-10-25T17:38:14Z", "coverage": { - "rows": 109318, + "rows": 108935, "dimensions": [ { "label": "financingProvider", @@ -905,14 +983,14 @@ }, { "label": "years", - "count": 62 + "count": 61 } ], "window": { "kind": "range", "origin": "query", "end_year": 2024, - "start_year": 1963 + "start_year": 1964 } }, "citation": { @@ -1031,13 +1109,13 @@ "kind": "range", "origin": "query", "end_year": 2024, - "start_year": 1963 + "start_year": 1964 }, - "graph_revision": "dfo-dev-dc-datacommons-service-00264-2s9", + "graph_revision": "dfo-dev-dc-datacommons-service-00273-mmh", "normalisations": [], "code_index_stamp": { - "exported_at": "2026-10-23T18:14:12Z", - "content_hash": "29eb81d7b6c88641b1d4e8eb5e850ca36de66b99d6e9e09680aac020507a6392", + "exported_at": "2026-10-24T19:20:27Z", + "content_hash": "3d946d8f4986dbbe0fa3e5c4c917200381f529d89ce417c11daeb22df56eed99", "graph_endpoint": "graph_release" }, "source_revisions": [ @@ -1046,8 +1124,8 @@ "revision": "2026-10-15" } ], - "capability_version": "dset_cc753cefa9199881", - "materialiser_build": "035d29cd05fb31d7cb47cfb33197d4002f773df6", + "capability_version": "dset_76f5fa7244511c58", + "materialiser_build": "99e62038ceb4b459c2ac699549076ff123c166aa", "resolved_stat_vars": [ { "ref": "dcid:Amount_FinancialFlow_Gross_Disbursement_DAC2aAidType206_Nominal", @@ -1055,15 +1133,15 @@ "financingProvider", "financingRecipient" ], - "observation_count": 109318 + "observation_count": 108935 } ], "family_member_count": 1, "family_member_digest": "1a36e1a7292b1bfff95a5415de0be74cac7bb033217ed50e79faa8ce51a224c0", "frame_grammar_version": "1.1.0", - "origin_catalogue_build_id": "20261023T061534Z-06fa7b89", + "origin_catalogue_build_id": "20261024T193016Z-775d36a9", "served_from": "materialise", - "confirmed_at": "2026-10-24T16:30:59.952146+00:00" + "confirmed_at": "2026-10-25T17:38:17.505656+00:00" }, "warnings": [], "diagnostics": [ @@ -1075,34 +1153,34 @@ ], "artifacts": [ { - "artifact_digest": "sha256:9242d69bedb460996f21f782b1a85ee5cd7eb967174e3b64a4ec5ade5bebab65", + "artifact_digest": "sha256:4d80e30e27b5a64706113d54946e3a387e422b1115d1437594ac4b1d4307ffd2", "rendering": { "bundle": false, "format": "parquet", "layout": 4 }, - "bytes": 473679, + "bytes": 472796, "media_type": "application/vnd.apache.parquet", - "created_at": "2026-10-23T18:38:31.580044+00:00", + "created_at": "2026-10-25T17:38:17.426404+00:00", "tier": "working", - "url": "/api/datasets/spec_fbca0f29755230d84729c1243b1d9b45/cv_3d58d26a874dc30b1bba7d5ad6dd90ee/files/sha256:9242d69bedb460996f21f782b1a85ee5cd7eb967174e3b64a4ec5ade5bebab65", + "url": "/api/datasets/spec_7f538f4f65ac124f47918468b4d2eea7/cv_ed2cc83eb28d4e6883cde079f05844ed/files/sha256:4d80e30e27b5a64706113d54946e3a387e422b1115d1437594ac4b1d4307ffd2", "enrichment_stamp": "08ed6c734fc69ea2204a21f4e1dd8b963f14dd1e03a2484c618049ac2e2d93d8" }, { - "artifact_digest": "sha256:099d1ce36b440868b72174fb9cdff503cc4c7a0f0ef902e66484c5bfbd270f39", + "artifact_digest": "sha256:4e3ed758ad1a33cf9d150ee5fa71adf7f5bd40e4d342d839633d8386239babe1", "rendering": { "statistics": "series" }, - "bytes": 144274, + "bytes": 144449, "media_type": "application/vnd.apache.parquet", - "created_at": "2026-10-23T18:38:31.580044+00:00", + "created_at": "2026-10-25T17:38:17.426404+00:00", "tier": "working", - "url": "/api/datasets/spec_fbca0f29755230d84729c1243b1d9b45/cv_3d58d26a874dc30b1bba7d5ad6dd90ee/files/sha256:099d1ce36b440868b72174fb9cdff503cc4c7a0f0ef902e66484c5bfbd270f39" + "url": "/api/datasets/spec_7f538f4f65ac124f47918468b4d2eea7/cv_ed2cc83eb28d4e6883cde079f05844ed/files/sha256:4e3ed758ad1a33cf9d150ee5fa71adf7f5bd40e4d342d839633d8386239babe1" } ], "series_count": 3656, "output_options": { - "capability_version": "dset_cc753cefa9199881", + "capability_version": "dset_76f5fa7244511c58", "columns": [ { "name": "stat_var", @@ -1126,7 +1204,7 @@ "name": "time_period", "kind": "grain", "droppable": false, - "distinct": 62 + "distinct": 61 }, { "name": "value", @@ -1366,7 +1444,7 @@ "varying": [ { "column": "time_period", - "distinct": 62 + "distinct": 61 } ] }, @@ -1390,7 +1468,7 @@ "varying": [ { "column": "time_period", - "distinct": 62 + "distinct": 61 } ] }, @@ -1449,10 +1527,10 @@ ] } }, - "series_coverage_stamp": "0b8c9a18fcc5af19013b21e865c64481503b6a6542f7d2e6628999e6559a47de", + "series_coverage_stamp": "e6e717ab8c77e84d010915893ede5809e9ecec67929a07cfafbcc2210edfa1eb", "retention": { "pinned": false, - "held_until": "2026-11-22T18:38:31.579178Z" + "held_until": "2026-11-24T17:38:17.425152Z" } } } @@ -1461,21 +1539,21 @@ { "request": { "method": "GET", - "origin_path": "/api/datasets/spec_fbca0f29755230d84729c1243b1d9b45/cv_3d58d26a874dc30b1bba7d5ad6dd90ee/files/sha256:9242d69bedb460996f21f782b1a85ee5cd7eb967174e3b64a4ec5ade5bebab65" + "origin_path": "/api/datasets/spec_7f538f4f65ac124f47918468b4d2eea7/cv_ed2cc83eb28d4e6883cde079f05844ed/files/sha256:4d80e30e27b5a64706113d54946e3a387e422b1115d1437594ac4b1d4307ffd2" }, "response": { "status": 302, "headers": { "content-type": "text/html", - "location": "https://storage.googleapis.com/dev-fin-observatory-datasets-working/sha256%3A9242d69bedb460996f21f782b1a85ee5cd7eb967174e3b64a4ec5ade5bebab65?X-Goog-Signature=redacted", - "x-dfo-trace-id": "fb09161c837d4874970eaf5a188845da" + "location": "https://storage.googleapis.com/dev-fin-observatory-datasets-working/sha256%3A4d80e30e27b5a64706113d54946e3a387e422b1115d1437594ac4b1d4307ffd2?X-Goog-Signature=redacted", + "x-dfo-trace-id": "919c1e572d914a608b166556417714c9" } } }, { "request": { "method": "GET", - "url": "https://storage.googleapis.com/dev-fin-observatory-datasets-working/sha256%3A9242d69bedb460996f21f782b1a85ee5cd7eb967174e3b64a4ec5ade5bebab65?X-Goog-Signature=redacted" + "url": "https://storage.googleapis.com/dev-fin-observatory-datasets-working/sha256%3A4d80e30e27b5a64706113d54946e3a387e422b1115d1437594ac4b1d4307ffd2?X-Goog-Signature=redacted" }, "response": { "status": 200, @@ -1489,7 +1567,7 @@ "expect": [ { "dataset": { - "rows": 109318, + "rows": 108935, "columns": [ "stat_var", "financingProvider", @@ -1516,15 +1594,15 @@ "members": [ { "parts": [], - "spec_id": "spec_fbca0f29755230d84729c1243b1d9b45", - "content_version": "cv_3d58d26a874dc30b1bba7d5ad6dd90ee", - "sentence": "Gross disbursements to the 133 G77 countries from the 32 DAC countries for official development assistance, 1963 to 2024. Current US dollars · OECD DAC2a." + "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." } ], "missing": [], "long_builds": [ { - "operation_id": "op_cc325e96d3ac6fdb6721c2468fd261f221bc87ee5eb9d8e82cf4d1f3720bdf6e", + "operation_id": "op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef", "poll_waits": [ 1.5, 1.5, @@ -1532,7 +1610,10 @@ 1.5, 1.5, 1.5, - 1.5 + 1.5, + 1.786, + 2.268, + 2.869 ], "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 1b2da24..39556c4 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 @@ -175,7 +175,7 @@ "status": 200, "headers": { "content-type": "application/json", - "x-dfo-trace-id": "bfc5cc090c4347f489fffcc62fc3d2bf" + "x-dfo-trace-id": "cdb2d56286eb4d468f447309c3bd06d9" }, "json": { "schema_version": 1, @@ -582,7 +582,7 @@ "frame_grammar_version": "1.1.0", "origin_catalogue_build_id": "20261019T174519Z-2e5e8cfd", "served_from": "head", - "confirmed_at": "2026-10-24T16:30:31.570035+00:00" + "confirmed_at": "2026-10-25T17:30:48.703616+00:00" }, "warnings": [ { @@ -627,7 +627,7 @@ ], "series_count": 1, "output_options": { - "capability_version": "dset_cc753cefa9199881", + "capability_version": "dset_76f5fa7244511c58", "columns": [ { "name": "stat_var", @@ -895,7 +895,7 @@ ] } }, - "series_coverage_stamp": "45bdd65f2fd33ac77a897180047080d33ed9db812afe0cbb887bf22e2ac52690", + "series_coverage_stamp": "e6e717ab8c77e84d010915893ede5809e9ecec67929a07cfafbcc2210edfa1eb", "retention": { "pinned": false, "held_until": "2026-11-19T13:59:18.051742Z" @@ -913,7 +913,7 @@ "headers": { "content-type": "text/html", "location": "bytes", - "x-dfo-trace-id": "8261c9be5a7c406a80692fac6b28ee05" + "x-dfo-trace-id": "114f3d3a1c78408c92fd29cc76887fdc" } } }, 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 29a3f26..4b656df 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": "0ba344270784ae9929a369da8acd00b399dfced8", - "recorded_at": "2026-10-24T16:30:51Z" + "dfo_commit": "99e62038ceb4b459c2ac699549076ff123c166aa", + "recorded_at": "2026-10-25T17:35:16Z" }, "call": [ { @@ -182,7 +182,7 @@ "status": 400, "headers": { "content-type": "application/problem+json", - "x-dfo-trace-id": "e229106e38d04e07af32b2895e017913" + "x-dfo-trace-id": "2e9e43a5095e4b10b1589c58cb4f8ecd" }, "json": { "type": "/codes/request_invalid", @@ -191,8 +191,8 @@ "detail": "Value error, unknown facet axis/axes: colour", "code": "request_invalid", "pointer": "/input/scope", - "trace_id": "e229106e38d04e07af32b2895e017913", - "capability_version": "dset_cc753cefa9199881", + "trace_id": "2e9e43a5095e4b10b1589c58cb4f8ecd", + "capability_version": "dset_76f5fa7244511c58", "retryable": false } } @@ -203,7 +203,7 @@ "error": { "class": "InvalidRequestError", "code": "request_invalid", - "trace_id": "e229106e38d04e07af32b2895e017913" + "trace_id": "2e9e43a5095e4b10b1589c58cb4f8ecd" } } ] 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 e3b2dfb..ef73afb 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 @@ -182,7 +182,7 @@ "status": 200, "headers": { "content-type": "application/json", - "x-dfo-trace-id": "a1fe53d87b784d23bcc55926b9530dec" + "x-dfo-trace-id": "dbd045d5a84b4818a273bafc3e808e9c" }, "json": { "schema_version": 1, @@ -589,7 +589,7 @@ "frame_grammar_version": "1.1.0", "origin_catalogue_build_id": "20261019T174519Z-2e5e8cfd", "served_from": "head", - "confirmed_at": "2026-10-24T16:30:31.570035+00:00" + "confirmed_at": "2026-10-25T17:30:48.703616+00:00" }, "warnings": [ { @@ -634,7 +634,7 @@ ], "series_count": 1, "output_options": { - "capability_version": "dset_cc753cefa9199881", + "capability_version": "dset_76f5fa7244511c58", "columns": [ { "name": "stat_var", @@ -902,7 +902,7 @@ ] } }, - "series_coverage_stamp": "45bdd65f2fd33ac77a897180047080d33ed9db812afe0cbb887bf22e2ac52690", + "series_coverage_stamp": "e6e717ab8c77e84d010915893ede5809e9ecec67929a07cfafbcc2210edfa1eb", "retention": { "pinned": false, "held_until": "2026-11-19T13:59:18.051742Z" @@ -996,7 +996,7 @@ "status": 200, "headers": { "content-type": "application/json", - "x-dfo-trace-id": "c4313642ac68484fb1d13d6f7b206d66" + "x-dfo-trace-id": "10b2cc32955e4dd1bdbb44ea217a46a1" }, "json": { "schema_version": 1, @@ -1005,11 +1005,11 @@ "extract_skipped": true }, "diagnostics": { - "engine_build": "0ba344270784ae9929a369da8acd00b399dfced8", - "trace_id": "c4313642ac68484fb1d13d6f7b206d66", + "engine_build": "99e62038ceb4b459c2ac699549076ff123c166aa", + "trace_id": "10b2cc32955e4dd1bdbb44ea217a46a1", "warnings": [], "timing_ms": { - "total": 340, + "total": 2, "by_step": { "coverage": 0 } @@ -1022,19 +1022,9 @@ "variable_text": "dataset", "warnings": [], "timing_ms": { - "total": 256, + "total": 0, "by_step": { - "validate": 4, - "walk": 219, - "reread_arcs": 1, - "detect_edits": 0, - "resolve_survivors": 0, - "shape": 3, - "bind": 1, - "where_places": 0, - "materialise": 12, - "answer": 14, - "options": 2 + "response_cache_part_memo": 0 } }, "entity_refs": [], @@ -1116,7 +1106,7 @@ "resolved": { "shape": { "shape_id": "financialflow_amount_measuredvalue_nominal", - "label": "gross disbursements (basic health care, official development assistance)", + "label": "gross disbursements (basic health care, official development assistance, core support to non-governmental organisations, other private bodies, public-private partnerships, and research institutes, standard grant)", "population_type": { "ref": "FinancialFlow", "label": "financial flow" @@ -1468,7 +1458,7 @@ "label": "OECD Terms and Conditions" } }, - "coverage_stamp": "45bdd65f2fd33ac77a897180047080d33ed9db812afe0cbb887bf22e2ac52690", + "coverage_stamp": "e6e717ab8c77e84d010915893ede5809e9ecec67929a07cfafbcc2210edfa1eb", "facets": { "provenance": { "basis": "fallback", @@ -1702,6 +1692,8 @@ "segment": "heading", "entity_refs": [], "states": [ + "how:crsCooperationModality", + "how:crsTypeOfFinance", "how:crsTypeOfFlow", "how:financialFlowType", "how:nettingBasis", @@ -2031,7 +2023,7 @@ "start_year": 2020, "end_year": 2023 }, - "capability_version": "cap_9deef72763b45f40" + "capability_version": "cap_88defe77cc79e0c0" }, "confidence": "high", "available_at_place": true, @@ -2295,114 +2287,31 @@ "open_axis_facts": [ { "property": "crsCooperationModality", - "varies": true, - "distinct_count": 14, - "undeclared_count": 2, + "varies": false, + "value": { + "ref": "CRSCooperationModalityB01", + "label": "core support to non-governmental organisations, other private bodies, public-private partnerships, and research institutes" + }, + "distinct_count": 1, + "undeclared_count": 0, "values": [ - { - "value": { - "ref": "CRSCooperationModalityC01", - "label": "project-type intervention" - }, - "count": 5 - }, - { - "value": { - "ref": "CRSCooperationModalityA02", - "label": "sector budget support" - }, - "count": 2 - }, - { - "value": { - "ref": "CRSCooperationModalityB04", - "label": "basket fund and pooled funding" - }, - "count": 1 - }, - { - "value": { - "ref": "CRSCooperationModalityB031", - "label": "contribution to multi-donor and multi-entity funding mechanism" - }, - "count": 1 - }, - { - "value": { - "ref": "CRSCooperationModalityB032", - "label": "contribution to multi-donor and single-entity funding mechanism" - }, - "count": 1 - }, - { - "value": { - "ref": "CRSCooperationModalityB033", - "label": "contribution to single-donor funding mechanism or earmarked contribution to a specific funding window or geographical location" - }, - "count": 1 - }, - { - "value": { - "ref": "CRSCooperationModalityB03", - "label": "contribution to specific-purpose programme and fund managed by an international organisation" - }, - "count": 1 - }, { "value": { "ref": "CRSCooperationModalityB01", "label": "core support to non-governmental organisations, other private bodies, public-private partnerships, and research institutes" }, "count": 1 - }, - { - "value": { - "ref": "CRSCooperationModalityD01", - "label": "donor country personnel" - }, - "count": 1 - }, - { - "value": { - "ref": "CRSCooperationModalityA01", - "label": "general budget support" - }, - "count": 1 - }, - { - "value": { - "ref": "CRSCooperationModalityE02", - "label": "imputed student cost" - }, - "count": 1 - }, - { - "value": { - "ref": "CRSCooperationModalityG01", - "label": "other administrative cost" - }, - "count": 1 - }, - { - "value": { - "ref": "CRSCooperationModalityD02", - "label": "other technical assistance" - }, - "count": 1 - }, - { - "value": { - "ref": "CRSCooperationModalityE01", - "label": "scholarship and training in donor country" - }, - "count": 1 } ] }, { "property": "crsTypeOfFinance", - "varies": true, - "distinct_count": 5, + "varies": false, + "value": { + "ref": "CRSTypeOfFinance110", + "label": "standard grant" + }, + "distinct_count": 1, "undeclared_count": 0, "values": [ { @@ -2410,34 +2319,6 @@ "ref": "CRSTypeOfFinance110", "label": "standard grant" }, - "count": 14 - }, - { - "value": { - "ref": "CRSTypeOfFinance421", - "label": "standard loan" - }, - "count": 4 - }, - { - "value": { - "ref": "CRSTypeOfFinance510", - "label": "common equity" - }, - "count": 1 - }, - { - "value": { - "ref": "CRSTypeOfFinance210", - "label": "interest subsidy" - }, - "count": 1 - }, - { - "value": { - "ref": "CRSTypeOfFinance520", - "label": "share in collective investment vehicle" - }, "count": 1 } ] @@ -4449,6 +4330,8 @@ "segment": "heading", "entity_refs": [], "states": [ + "how:crsCooperationModality", + "how:crsTypeOfFinance", "how:crsTypeOfFlow", "how:financialFlowType", "how:nettingBasis", @@ -4635,7 +4518,7 @@ "error": { "class": "ContractError", "code": "contract_violation", - "trace_id": "c4313642ac68484fb1d13d6f7b206d66" + "trace_id": "10b2cc32955e4dd1bdbb44ea217a46a1" } } ] 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 2878965..fce4fa5 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 @@ -175,7 +175,7 @@ "status": 200, "headers": { "content-type": "application/json", - "x-dfo-trace-id": "bfc5cc090c4347f489fffcc62fc3d2bf" + "x-dfo-trace-id": "cdb2d56286eb4d468f447309c3bd06d9" }, "json": { "schema_version": 1, @@ -582,7 +582,7 @@ "frame_grammar_version": "1.1.0", "origin_catalogue_build_id": "20261019T174519Z-2e5e8cfd", "served_from": "head", - "confirmed_at": "2026-10-24T16:30:31.570035+00:00" + "confirmed_at": "2026-10-25T17:30:48.703616+00:00" }, "warnings": [ { @@ -627,7 +627,7 @@ ], "series_count": 1, "output_options": { - "capability_version": "dset_cc753cefa9199881", + "capability_version": "dset_76f5fa7244511c58", "columns": [ { "name": "stat_var", @@ -895,7 +895,7 @@ ] } }, - "series_coverage_stamp": "45bdd65f2fd33ac77a897180047080d33ed9db812afe0cbb887bf22e2ac52690", + "series_coverage_stamp": "e6e717ab8c77e84d010915893ede5809e9ecec67929a07cfafbcc2210edfa1eb", "retention": { "pinned": false, "held_until": "2026-11-19T13:59:18.051742Z" @@ -913,7 +913,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": "8261c9be5a7c406a80692fac6b28ee05" + "x-dfo-trace-id": "114f3d3a1c78408c92fd29cc76887fdc" } } }, 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 dc97e7e..dc19b1a 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 @@ -175,7 +175,7 @@ "status": 200, "headers": { "content-type": "application/json", - "x-dfo-trace-id": "bfc5cc090c4347f489fffcc62fc3d2bf" + "x-dfo-trace-id": "cdb2d56286eb4d468f447309c3bd06d9" }, "json": { "schema_version": 1, @@ -582,7 +582,7 @@ "frame_grammar_version": "1.1.0", "origin_catalogue_build_id": "20261019T174519Z-2e5e8cfd", "served_from": "head", - "confirmed_at": "2026-10-24T16:30:31.570035+00:00" + "confirmed_at": "2026-10-25T17:30:48.703616+00:00" }, "warnings": [ { @@ -627,7 +627,7 @@ ], "series_count": 1, "output_options": { - "capability_version": "dset_cc753cefa9199881", + "capability_version": "dset_76f5fa7244511c58", "columns": [ { "name": "stat_var", @@ -895,7 +895,7 @@ ] } }, - "series_coverage_stamp": "45bdd65f2fd33ac77a897180047080d33ed9db812afe0cbb887bf22e2ac52690", + "series_coverage_stamp": "e6e717ab8c77e84d010915893ede5809e9ecec67929a07cfafbcc2210edfa1eb", "retention": { "pinned": false, "held_until": "2026-11-19T13:59:18.051742Z" @@ -913,7 +913,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": "8261c9be5a7c406a80692fac6b28ee05" + "x-dfo-trace-id": "114f3d3a1c78408c92fd29cc76887fdc" } } }, @@ -940,7 +940,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": "8261c9be5a7c406a80692fac6b28ee05" + "x-dfo-trace-id": "114f3d3a1c78408c92fd29cc76887fdc" } } }, 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 29d6a08..51014a0 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 @@ -175,7 +175,7 @@ "status": 200, "headers": { "content-type": "application/json", - "x-dfo-trace-id": "bfc5cc090c4347f489fffcc62fc3d2bf" + "x-dfo-trace-id": "cdb2d56286eb4d468f447309c3bd06d9" }, "json": { "schema_version": 1, @@ -582,7 +582,7 @@ "frame_grammar_version": "1.1.0", "origin_catalogue_build_id": "20261019T174519Z-2e5e8cfd", "served_from": "head", - "confirmed_at": "2026-10-24T16:30:31.570035+00:00" + "confirmed_at": "2026-10-25T17:30:48.703616+00:00" }, "warnings": [ { @@ -627,7 +627,7 @@ ], "series_count": 1, "output_options": { - "capability_version": "dset_cc753cefa9199881", + "capability_version": "dset_76f5fa7244511c58", "columns": [ { "name": "stat_var", @@ -895,7 +895,7 @@ ] } }, - "series_coverage_stamp": "45bdd65f2fd33ac77a897180047080d33ed9db812afe0cbb887bf22e2ac52690", + "series_coverage_stamp": "e6e717ab8c77e84d010915893ede5809e9ecec67929a07cfafbcc2210edfa1eb", "retention": { "pinned": false, "held_until": "2026-11-19T13:59:18.051742Z" @@ -909,7 +909,7 @@ "error": { "class": "ContractError", "code": "contract_violation", - "trace_id": "bfc5cc090c4347f489fffcc62fc3d2bf" + "trace_id": "cdb2d56286eb4d468f447309c3bd06d9" } } ] 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 f5755d2..63d9e87 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 @@ -583,7 +583,7 @@ "frame_grammar_version": "1.1.0", "origin_catalogue_build_id": "20261019T174519Z-2e5e8cfd", "served_from": "head", - "confirmed_at": "2026-10-24T16:30:31.570035+00:00" + "confirmed_at": "2026-10-25T17:30:48.703616+00:00" }, "warnings": [ { @@ -628,7 +628,7 @@ ], "series_count": 1, "output_options": { - "capability_version": "dset_cc753cefa9199881", + "capability_version": "dset_76f5fa7244511c58", "columns": [ { "name": "stat_var", @@ -896,7 +896,7 @@ ] } }, - "series_coverage_stamp": "45bdd65f2fd33ac77a897180047080d33ed9db812afe0cbb887bf22e2ac52690", + "series_coverage_stamp": "e6e717ab8c77e84d010915893ede5809e9ecec67929a07cfafbcc2210edfa1eb", "retention": { "pinned": false, "held_until": "2026-11-19T13:59:18.051742Z" diff --git a/python/client-contract/src/dfo_client_contract/scenarios/fetch-strict-info-notice.json b/python/client-contract/src/dfo_client_contract/scenarios/fetch-strict-info-notice.json index 1463a62..9e3366f 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": "bf6613bf82be4bddb4d60879aaf907d9" + "x-dfo-trace-id": "7abc6f06215b4187a4280d87d6f8a51a" }, "json": { "schema_version": 1, @@ -42,26 +42,23 @@ "entry_path": "raw_text", "raw_query": "ODA disbursements from Germany to Nigeria for basic health care", "normalized_query": "ODA disbursements from Germany to Nigeria for basic health care", - "extract_skipped": false + "extract_skipped": true }, "diagnostics": { - "engine_build": "0ba344270784ae9929a369da8acd00b399dfced8", - "trace_id": "bf6613bf82be4bddb4d60879aaf907d9", + "engine_build": "99e62038ceb4b459c2ac699549076ff123c166aa", + "trace_id": "7abc6f06215b4187a4280d87d6f8a51a", "warnings": [], "timing_ms": { - "total": 2620, + "total": 3, "by_step": { "coverage": 0, - "extract": 1068, - "cache_lookup": 0 + "response_cache_layer1": 1 } }, "llm_usage": { - "input_tokens": 2231, - "output_tokens": 102, - "cached_tokens": 841, - "jev_input_tokens": 6586, - "jev_output_tokens": 2060 + "input_tokens": 0, + "output_tokens": 0, + "cached_tokens": 0 }, "timed_out": false }, @@ -77,30 +74,30 @@ } ], "timing_ms": { - "total": 1548, + "total": 1669, "by_step": { - "recall": 437, + "recall": 397, "phase_resolve_places": 0, "phase_check_entities": 0, - "shape_arcs": 2, + "shape_arcs": 1, "shape_probe_coverage": 4, - "shape_probe": 161, - "shape_groups": 45, + "shape_probe": 115, + "shape_groups": 53, "shape_labels": 1, - "shape_admission": 3, + "shape_admission": 1, "phase_derive_shapes": 0, - "shape": 326, + "shape": 276, "phase_prune_and_rank": 0, - "bind": 225, - "phase_bind": 158, - "phase_settle": 56, - "phase_place_bindings": 18, + "bind": 214, + "phase_bind": 203, + "phase_settle": 45, + "phase_place_bindings": 20, "phase_facet_requests": 0, - "materialise": 41, - "phase_materialise": 0, - "answer": 186, - "options": 40, - "phase_outcome": 61 + "materialise": 28, + "phase_materialise": 196, + "answer": 145, + "options": 50, + "phase_outcome": 95 } }, "restatement": { @@ -547,7 +544,7 @@ "label": "OECD Terms and Conditions" } }, - "coverage_stamp": "45bdd65f2fd33ac77a897180047080d33ed9db812afe0cbb887bf22e2ac52690", + "coverage_stamp": "e6e717ab8c77e84d010915893ede5809e9ecec67929a07cfafbcc2210edfa1eb", "facets": { "provenance": { "basis": "fallback", @@ -1200,7 +1197,7 @@ "selected": [] } ], - "capability_version": "cap_9deef72763b45f40", + "capability_version": "cap_88defe77cc79e0c0", "default_reading": { "applied": true, "removed_stat_vars": [] @@ -3798,7 +3795,7 @@ "status": 200, "headers": { "content-type": "application/json", - "x-dfo-trace-id": "42460c90e7274dd19ecba24a6a0377e9" + "x-dfo-trace-id": "70ac3c153571497dab413643b6537466" }, "json": { "schema_version": 1, @@ -4199,7 +4196,7 @@ "frame_grammar_version": "1.1.0", "origin_catalogue_build_id": "20261011T194155Z-80081f08", "served_from": "head", - "confirmed_at": "2026-10-24T16:30:05.017544+00:00" + "confirmed_at": "2026-10-25T17:22:10.027136+00:00" }, "warnings": [ { @@ -4244,7 +4241,7 @@ ], "series_count": 5, "output_options": { - "capability_version": "dset_cc753cefa9199881", + "capability_version": "dset_76f5fa7244511c58", "columns": [ { "name": "stat_var", @@ -4527,7 +4524,7 @@ ] } }, - "series_coverage_stamp": "45bdd65f2fd33ac77a897180047080d33ed9db812afe0cbb887bf22e2ac52690", + "series_coverage_stamp": "e6e717ab8c77e84d010915893ede5809e9ecec67929a07cfafbcc2210edfa1eb", "retention": { "pinned": true } @@ -4544,7 +4541,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": "b9b4b3a90d6546e09cc738a29bbbb1d6" + "x-dfo-trace-id": "d2d4306f79d2411ebcd110cc1e26f49d" } } }, 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 8fc7eea..2c53e3b 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": "0ba344270784ae9929a369da8acd00b399dfced8", - "recorded_at": "2026-10-24T16:30:53Z" + "dfo_commit": "99e62038ceb4b459c2ac699549076ff123c166aa", + "recorded_at": "2026-10-25T17:38:05Z" }, "call": [ { "op": "mint", "spec": { - "spec_id": "spec_fbca0f29755230d84729c1243b1d9b45", + "spec_id": "spec_7f538f4f65ac124f47918468b4d2eea7", "definition": { "schema_version": 1, - "spec_id": "spec_fbca0f29755230d84729c1243b1d9b45", + "spec_id": "spec_7f538f4f65ac124f47918468b4d2eea7", "identity": { "identity_version": "spec1", "shape": { @@ -227,12 +227,12 @@ }, "requested_window": { "kind": "range", - "start_year": 1963, + "start_year": 1964, "end_year": 2024 } } }, - "sentence": "Gross disbursements to the 133 G77 countries from the 32 DAC countries for official development assistance, 1963 to 2024. Current US dollars · OECD DAC2a.", + "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.", "entity_groups": { "destination": { "label": "G77 countries", @@ -258,10 +258,10 @@ "schema_version": 1, "input": { "kind": "spec_id", - "spec_id": "spec_fbca0f29755230d84729c1243b1d9b45", + "spec_id": "spec_7f538f4f65ac124f47918468b4d2eea7", "definition": { "schema_version": 1, - "spec_id": "spec_fbca0f29755230d84729c1243b1d9b45", + "spec_id": "spec_7f538f4f65ac124f47918468b4d2eea7", "identity": { "identity_version": "spec1", "shape": { @@ -473,7 +473,7 @@ }, "requested_window": { "kind": "range", - "start_year": 1963, + "start_year": 1964, "end_year": 2024 } } @@ -489,15 +489,15 @@ "status": 202, "headers": { "content-type": "application/json", - "location": "/api/datasets/operations/op_cc325e96d3ac6fdb6721c2468fd261f221bc87ee5eb9d8e82cf4d1f3720bdf6e", + "location": "/api/datasets/operations/op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef", "retry-after": "2", - "x-dfo-trace-id": "a6d5bb2eff5a48578dce7fbf91715755" + "x-dfo-trace-id": "5541c591450f479485c421e20fe4d81d" }, "json": { "operation": { - "operation_id": "op_cc325e96d3ac6fdb6721c2468fd261f221bc87ee5eb9d8e82cf4d1f3720bdf6e", + "operation_id": "op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef", "status": "pending", - "poll": "/api/datasets/operations/op_cc325e96d3ac6fdb6721c2468fd261f221bc87ee5eb9d8e82cf4d1f3720bdf6e", + "poll": "/api/datasets/operations/op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef", "retry_after_ms": 1500 } } @@ -506,24 +506,24 @@ { "request": { "method": "GET", - "path": "/datasets/operations/op_cc325e96d3ac6fdb6721c2468fd261f221bc87ee5eb9d8e82cf4d1f3720bdf6e" + "path": "/datasets/operations/op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef" }, "response": { "status": 200, "headers": { "content-type": "application/json", "retry-after": "2", - "x-dfo-trace-id": "71ecc596c6034e27b8ba5dd0a5d2c744" + "x-dfo-trace-id": "3416612a1b3f4a2ebbcf8ddeff74b96a" }, "json": { "operation": { - "operation_id": "op_cc325e96d3ac6fdb6721c2468fd261f221bc87ee5eb9d8e82cf4d1f3720bdf6e", + "operation_id": "op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef", "status": "running", - "poll": "/api/datasets/operations/op_cc325e96d3ac6fdb6721c2468fd261f221bc87ee5eb9d8e82cf4d1f3720bdf6e", + "poll": "/api/datasets/operations/op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef", "retry_after_ms": 1500, "progress": { "rows_written": 0, - "estimate_rows": 109318 + "estimate_rows": 108935 } } } @@ -532,24 +532,24 @@ { "request": { "method": "GET", - "path": "/datasets/operations/op_cc325e96d3ac6fdb6721c2468fd261f221bc87ee5eb9d8e82cf4d1f3720bdf6e" + "path": "/datasets/operations/op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef" }, "response": { "status": 200, "headers": { "content-type": "application/json", "retry-after": "2", - "x-dfo-trace-id": "760a3bb2de5e430fb316b3f6a4059c67" + "x-dfo-trace-id": "65394508d86f443db7528ac38066b9e3" }, "json": { "operation": { - "operation_id": "op_cc325e96d3ac6fdb6721c2468fd261f221bc87ee5eb9d8e82cf4d1f3720bdf6e", + "operation_id": "op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef", "status": "running", - "poll": "/api/datasets/operations/op_cc325e96d3ac6fdb6721c2468fd261f221bc87ee5eb9d8e82cf4d1f3720bdf6e", + "poll": "/api/datasets/operations/op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef", "retry_after_ms": 1500, "progress": { - "rows_written": 0, - "estimate_rows": 109318 + "rows_written": 64600, + "estimate_rows": 108935 } } } @@ -558,24 +558,76 @@ { "request": { "method": "GET", - "path": "/datasets/operations/op_cc325e96d3ac6fdb6721c2468fd261f221bc87ee5eb9d8e82cf4d1f3720bdf6e" + "path": "/datasets/operations/op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef" }, "response": { "status": 200, "headers": { "content-type": "application/json", "retry-after": "2", - "x-dfo-trace-id": "15f9386c84484af983d33c6d183e5349" + "x-dfo-trace-id": "7a2d07cfe29b4993a374ee71104d461a" }, "json": { "operation": { - "operation_id": "op_cc325e96d3ac6fdb6721c2468fd261f221bc87ee5eb9d8e82cf4d1f3720bdf6e", + "operation_id": "op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef", "status": "running", - "poll": "/api/datasets/operations/op_cc325e96d3ac6fdb6721c2468fd261f221bc87ee5eb9d8e82cf4d1f3720bdf6e", + "poll": "/api/datasets/operations/op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef", "retry_after_ms": 1500, "progress": { - "rows_written": 0, - "estimate_rows": 109318 + "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": 1786, + "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" + }, + "json": { + "operation": { + "operation_id": "op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef", + "status": "running", + "poll": "/api/datasets/operations/op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef", + "retry_after_ms": 2268, + "progress": { + "rows_written": 108935, + "estimate_rows": 108935 } } } @@ -584,24 +636,50 @@ { "request": { "method": "GET", - "path": "/datasets/operations/op_cc325e96d3ac6fdb6721c2468fd261f221bc87ee5eb9d8e82cf4d1f3720bdf6e" + "path": "/datasets/operations/op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef" }, "response": { "status": 200, "headers": { "content-type": "application/json", - "x-dfo-trace-id": "2cc73cd4fbaa4a28a350025111f70a79" + "retry-after": "3", + "x-dfo-trace-id": "1ce68951ada64961b3710bb73127c9d8" }, "json": { "operation": { - "operation_id": "op_cc325e96d3ac6fdb6721c2468fd261f221bc87ee5eb9d8e82cf4d1f3720bdf6e", + "operation_id": "op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef", + "status": "running", + "poll": "/api/datasets/operations/op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef", + "retry_after_ms": 2869, + "progress": { + "rows_written": 108935, + "estimate_rows": 108935 + } + } + } + } + }, + { + "request": { + "method": "GET", + "path": "/datasets/operations/op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef" + }, + "response": { + "status": 200, + "headers": { + "content-type": "application/json", + "x-dfo-trace-id": "37207f1ea4574e4e8485e8cebd4f4edc" + }, + "json": { + "operation": { + "operation_id": "op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef", "status": "done" }, "manifest": { "schema_version": 1, "definition": { "schema_version": 1, - "spec_id": "spec_fbca0f29755230d84729c1243b1d9b45", + "spec_id": "spec_7f538f4f65ac124f47918468b4d2eea7", "identity": { "shape": { "kind": "statvar_schema", @@ -814,14 +892,14 @@ "requested_window": { "kind": "range", "end_year": 2024, - "start_year": 1963 + "start_year": 1964 } } }, - "content_version": "cv_3d58d26a874dc30b1bba7d5ad6dd90ee", - "prepared_at": "2026-10-23T18:38:28Z", + "content_version": "cv_ed2cc83eb28d4e6883cde079f05844ed", + "prepared_at": "2026-10-25T17:38:14Z", "coverage": { - "rows": 109318, + "rows": 108935, "dimensions": [ { "label": "financingProvider", @@ -843,14 +921,14 @@ }, { "label": "years", - "count": 62 + "count": 61 } ], "window": { "kind": "range", "origin": "query", "end_year": 2024, - "start_year": 1963 + "start_year": 1964 } }, "citation": { @@ -969,13 +1047,13 @@ "kind": "range", "origin": "query", "end_year": 2024, - "start_year": 1963 + "start_year": 1964 }, - "graph_revision": "dfo-dev-dc-datacommons-service-00264-2s9", + "graph_revision": "dfo-dev-dc-datacommons-service-00273-mmh", "normalisations": [], "code_index_stamp": { - "exported_at": "2026-10-23T18:14:12Z", - "content_hash": "29eb81d7b6c88641b1d4e8eb5e850ca36de66b99d6e9e09680aac020507a6392", + "exported_at": "2026-10-24T19:20:27Z", + "content_hash": "3d946d8f4986dbbe0fa3e5c4c917200381f529d89ce417c11daeb22df56eed99", "graph_endpoint": "graph_release" }, "source_revisions": [ @@ -984,8 +1062,8 @@ "revision": "2026-10-15" } ], - "capability_version": "dset_cc753cefa9199881", - "materialiser_build": "035d29cd05fb31d7cb47cfb33197d4002f773df6", + "capability_version": "dset_76f5fa7244511c58", + "materialiser_build": "99e62038ceb4b459c2ac699549076ff123c166aa", "resolved_stat_vars": [ { "ref": "dcid:Amount_FinancialFlow_Gross_Disbursement_DAC2aAidType206_Nominal", @@ -993,15 +1071,15 @@ "financingProvider", "financingRecipient" ], - "observation_count": 109318 + "observation_count": 108935 } ], "family_member_count": 1, "family_member_digest": "1a36e1a7292b1bfff95a5415de0be74cac7bb033217ed50e79faa8ce51a224c0", "frame_grammar_version": "1.1.0", - "origin_catalogue_build_id": "20261023T061534Z-06fa7b89", + "origin_catalogue_build_id": "20261024T193016Z-775d36a9", "served_from": "materialise", - "confirmed_at": "2026-10-24T16:30:59.952146+00:00" + "confirmed_at": "2026-10-25T17:38:17.505656+00:00" }, "warnings": [], "diagnostics": [ @@ -1013,34 +1091,34 @@ ], "artifacts": [ { - "artifact_digest": "sha256:9242d69bedb460996f21f782b1a85ee5cd7eb967174e3b64a4ec5ade5bebab65", + "artifact_digest": "sha256:4d80e30e27b5a64706113d54946e3a387e422b1115d1437594ac4b1d4307ffd2", "rendering": { "bundle": false, "format": "parquet", "layout": 4 }, - "bytes": 473679, + "bytes": 472796, "media_type": "application/vnd.apache.parquet", - "created_at": "2026-10-23T18:38:31.580044+00:00", + "created_at": "2026-10-25T17:38:17.426404+00:00", "tier": "working", - "url": "/api/datasets/spec_fbca0f29755230d84729c1243b1d9b45/cv_3d58d26a874dc30b1bba7d5ad6dd90ee/files/sha256:9242d69bedb460996f21f782b1a85ee5cd7eb967174e3b64a4ec5ade5bebab65", + "url": "/api/datasets/spec_7f538f4f65ac124f47918468b4d2eea7/cv_ed2cc83eb28d4e6883cde079f05844ed/files/sha256:4d80e30e27b5a64706113d54946e3a387e422b1115d1437594ac4b1d4307ffd2", "enrichment_stamp": "08ed6c734fc69ea2204a21f4e1dd8b963f14dd1e03a2484c618049ac2e2d93d8" }, { - "artifact_digest": "sha256:099d1ce36b440868b72174fb9cdff503cc4c7a0f0ef902e66484c5bfbd270f39", + "artifact_digest": "sha256:4e3ed758ad1a33cf9d150ee5fa71adf7f5bd40e4d342d839633d8386239babe1", "rendering": { "statistics": "series" }, - "bytes": 144274, + "bytes": 144449, "media_type": "application/vnd.apache.parquet", - "created_at": "2026-10-23T18:38:31.580044+00:00", + "created_at": "2026-10-25T17:38:17.426404+00:00", "tier": "working", - "url": "/api/datasets/spec_fbca0f29755230d84729c1243b1d9b45/cv_3d58d26a874dc30b1bba7d5ad6dd90ee/files/sha256:099d1ce36b440868b72174fb9cdff503cc4c7a0f0ef902e66484c5bfbd270f39" + "url": "/api/datasets/spec_7f538f4f65ac124f47918468b4d2eea7/cv_ed2cc83eb28d4e6883cde079f05844ed/files/sha256:4e3ed758ad1a33cf9d150ee5fa71adf7f5bd40e4d342d839633d8386239babe1" } ], "series_count": 3656, "output_options": { - "capability_version": "dset_cc753cefa9199881", + "capability_version": "dset_76f5fa7244511c58", "columns": [ { "name": "stat_var", @@ -1064,7 +1142,7 @@ "name": "time_period", "kind": "grain", "droppable": false, - "distinct": 62 + "distinct": 61 }, { "name": "value", @@ -1304,7 +1382,7 @@ "varying": [ { "column": "time_period", - "distinct": 62 + "distinct": 61 } ] }, @@ -1328,7 +1406,7 @@ "varying": [ { "column": "time_period", - "distinct": 62 + "distinct": 61 } ] }, @@ -1387,10 +1465,10 @@ ] } }, - "series_coverage_stamp": "0b8c9a18fcc5af19013b21e865c64481503b6a6542f7d2e6628999e6559a47de", + "series_coverage_stamp": "e6e717ab8c77e84d010915893ede5809e9ecec67929a07cfafbcc2210edfa1eb", "retention": { "pinned": false, - "held_until": "2026-11-22T18:38:31.579178Z" + "held_until": "2026-11-24T17:38:17.425152Z" } } } @@ -1399,21 +1477,21 @@ { "request": { "method": "GET", - "origin_path": "/api/datasets/spec_fbca0f29755230d84729c1243b1d9b45/cv_3d58d26a874dc30b1bba7d5ad6dd90ee/files/sha256:9242d69bedb460996f21f782b1a85ee5cd7eb967174e3b64a4ec5ade5bebab65" + "origin_path": "/api/datasets/spec_7f538f4f65ac124f47918468b4d2eea7/cv_ed2cc83eb28d4e6883cde079f05844ed/files/sha256:4d80e30e27b5a64706113d54946e3a387e422b1115d1437594ac4b1d4307ffd2" }, "response": { "status": 302, "headers": { "content-type": "text/html", - "location": "https://storage.googleapis.com/dev-fin-observatory-datasets-working/sha256%3A9242d69bedb460996f21f782b1a85ee5cd7eb967174e3b64a4ec5ade5bebab65?X-Goog-Signature=redacted", - "x-dfo-trace-id": "fb09161c837d4874970eaf5a188845da" + "location": "https://storage.googleapis.com/dev-fin-observatory-datasets-working/sha256%3A4d80e30e27b5a64706113d54946e3a387e422b1115d1437594ac4b1d4307ffd2?X-Goog-Signature=redacted", + "x-dfo-trace-id": "919c1e572d914a608b166556417714c9" } } }, { "request": { "method": "GET", - "url": "https://storage.googleapis.com/dev-fin-observatory-datasets-working/sha256%3A9242d69bedb460996f21f782b1a85ee5cd7eb967174e3b64a4ec5ade5bebab65?X-Goog-Signature=redacted" + "url": "https://storage.googleapis.com/dev-fin-observatory-datasets-working/sha256%3A4d80e30e27b5a64706113d54946e3a387e422b1115d1437594ac4b1d4307ffd2?X-Goog-Signature=redacted" }, "response": { "status": 200, @@ -1427,13 +1505,13 @@ "expect": [ { "operation": { - "operation_id": "op_cc325e96d3ac6fdb6721c2468fd261f221bc87ee5eb9d8e82cf4d1f3720bdf6e", + "operation_id": "op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef", "status": "pending" } }, { "dataset": { - "rows": 109318, + "rows": 108935, "columns": [ "stat_var", "financingProvider", @@ -1460,20 +1538,23 @@ "members": [ { "parts": [], - "spec_id": "spec_fbca0f29755230d84729c1243b1d9b45", - "content_version": "cv_3d58d26a874dc30b1bba7d5ad6dd90ee", - "sentence": "Gross disbursements to the 133 G77 countries from the 32 DAC countries for official development assistance, 1963 to 2024. Current US dollars · OECD DAC2a." + "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." } ], "missing": [], "long_builds": [ { - "operation_id": "op_cc325e96d3ac6fdb6721c2468fd261f221bc87ee5eb9d8e82cf4d1f3720bdf6e", + "operation_id": "op_fd0d8669859445256b111f73468a96f51525dc1712aeda8b27bd8c28c3f5e5ef", "poll_waits": [ 1.5, 1.5, 1.5, - 1.5 + 1.5, + 1.786, + 2.268, + 2.869 ], "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 212b05da950a5f6112451446893fea1397c7d073..a555723f302c748e8f2392f2de23b35f9c790870 100644 GIT binary patch delta 264303 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≪q71=Rgmv^1im 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 z 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 (D+ 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

o9{IGz)oO-R|zz%gI6iA&elI8nP2uE#B_k^=V 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�woaspuqe8 z#z;b+`ak>l&8>t1Run)D5Q>E12INoFuZDC0J~5cuXJl~1P8tQ7C1~&BV8BHYbXKXb z5a}ihnunY&m+jL~lykmac0fbP-}!M_vW9ZC^N6t&x~YuruF^v6*HTGQ(|Zte+IXq# zjwdNx<#n0pq`^7cu=rN_FOl3Ir6DAhN#}2691W(Ni)eX{hN{1de0hO}TD6N_`5_JU z&SI1D(m8bzSEuswIR_0_*X`w%bDBl25#`6{v<6+1%Ih^Ye00q&m(S(U-ISUAl{yw~ zv&?x(UEN$wthGhAQ>(VTBTUaCzoYz5jkS|*f0Xee9Y9as{W&8MkKYlB35XXLK-GX& zK@baufShR5FY4A@m_xy4*_1EP6A0KfGo(~s=>37x2FSx)=>@eG`M~^OIuOM z2Y|mq4-t?tXoXRrD}O;_Wh+SPz1ytTxPcVNCTfko4KWKi0I?31fhH> zRI~@n#iUz6cLZ^WJ_?giV_gr=qoZLa(H_A^C&ElSJz|eeg_*qsU>HZ0*I4xy(SS*C zeVnC$RBOKlWf^ZgJf&Rpl)Lj~mf2SiHRtItb6ro*beUl_wt=p=(iEejKvJH?U3s|M zN7FY?Zi6SMT;^pC0rjjrx-e%^NhFp#x`Bw`4F|kLvP>(e^Y)YHY%9cD z9W1=IR!Frvrh0`|$hA6kd&O5MwK{+G%C1mtb+OobAL>-lb>3Q8p*8PXw6(25Z{BTi z>xBx=AM=|zLd8)dbRpkY&$OE zGe5h1+wL9zJ|IVK3qIx-zFjvk`dEOb@8mYEieS#XZ|c#FiARTzLEH0>h0goAZm&ER zG4Efrz3tfU`5lAXFC2@V4-oOi;fzsv%tFAx3YVA%1yb;^#AhdCRvj(P$gJ;Jd~1ZU zubTJs2Y2jLhmR$Oi$(iBJC+h2-0A!FSgGXBN#AeBIGR?lAF(ofp6%)}=ira?`2Gli_<_?zmpr z6&|A-aKG|g_}=J%XO)-2V><&(AsYY&-B@IhlCn7zYn3rU2MWqD91~2bOLkQvzm#YY zutM_nCJyJa)~e<@x0Rj8?aaRZ(Dtxou%odL`>FI!ByY%qMaTMMMcTd_6hkk>KfbTL z*1GR&0FKww8fOv6;PtoePYqP#4Tdu??G6er$1eLny3~FL>GD^3^c&^zol7pscQg-7 zasn-RwLx>+H8%2w=C5x@oOmPQs|G<^dD_HF+k$rR#^-;fi}8*h0&Z7|qS=xD*MT!7^_U2&ZN>ChK1=_mpzYd($` zNL@lHL-rbA9;k}Y6@y%K2;vBFHUM7dcyH&^MRwlgeVEU1-T8<|6`1m=9cz>wWmOf9 z8E+0w2Mm%zV86HT!E09L6%Ow;^`%ttRj5gcWNhw>#eFVHnZ54tdVP;2N8=BL6;uhx zBV^|@-k0!$ojc$1zK3&O?)=GvA~0RH4R}I2+hQ7i0~vH#4RIt-+If}#>mz!~$ye3O zKt?Gy$(Ztnw!80~o$(U#?D0R&m!F0qT3K>#PL%Ybv=;mKMjw&WSt~JNJxAN@;Xx}x z#EwXIHix8@UCq|3TBDUS$+oPbY30g=xK&BC{l?W)3>*ssxLTMA-~mDexr!_#2GKFu zJ~2*paS-2rlyGd&%T5)Ki|C8rV9m7V4Cr}{7-%f#$h~*$lah?ciw+5{l8wmk42i8$ zj3{^+ar976nBRHRiz(ss0f@^zybFS2vk?dl!XL> z(vW2rY>dRc2bH)w^sUB5E>? z=)jvmDhsrGNnn97*f2F0QB7P5`Goj3?t08JWpNw~2VPgDbG7?-*~qljq|UUY$m-tJP zdz@{*GU%M`&PNByn(p;JPBUQI0*2dL~ZhNQ@1ZcUhSu2l_^hWCtfJpJ(N$6^!86WR42jZ&&bCP}-@4_4pJF%yZf ziQu)4?vl){4!;GfMR?+zMygyNmsRiguXc})sIT57bG$m@MD-r6n#qXE)%&z+yHoe|8q3s(JpDyA!&+~sE<19eI&GnTF!EFN!G#8qDB|(#1-@&P^zr-! z-VS&CMowqj35z$Uj-QNZ9J4&d&~nM37sp6$J{qF|Ix574UGlG?Q*D2K-Q9cqblXXb zJtN1@x1CDeGkd(d%|A|?5BEEfj&2)rap+g)?{SjMx%=0==8%=5c<%fg9joD|e+};W zbo~0l-y$)@n%;#j*BI%Vn+vClVzg>L9X-<>V_0*K({}c2j9txe+c}H9kIP3Rz;VIg znu&-DoqJJb2KK>(W3p-q?pM#_a1vo2Z0mer~=+;542y$SSRM-0EZ1~UrvPW@%DqH zpD@0$;H356B(L{QQFN#<-L^gu9ri^N7#U<2JNb}*2c+wA!1fGC*5^~judP5**%o{% zgmY{M-TrEIuI(e;35InZ?V$bLuFk6+_&{Tb1WKdiB5g75^DT_N3txY?r?iCgQowU4DHhSvGF zKk815uM27)e+k%7M(<)5v??Z!r^Zn`CKxPVg0MOnh0O%7G%?0Bk zN%?i5ixaL%l^oD(Jz130R=0cc@mFCy!jNgi4@m@_#`qG^2nfMQ-vM(2d^do@(vT4u z0{44e`D1k(0i4PbBweVBU3?;ve6ucoamqFMQC-sF)1u^Oup8RKr|1*S1t$ddDv=G{8@MMhr0K3RwJG)T4p=wusvRVy=HvB z7F3_5eOx4vS6>zhtN}1f0vekbh-|_v zxFD>6@~M#gL4neMA3_fpaj8hzaLANRKZzI<8irz4p(KG7Q&$mB;t0N(=+(l#kOa%} z5;9UeXOX(K{#g5bYHDbGb^AhhYJ7cN`=TpR5=zG81fW&GO<>wZ$pt6WJhK8~B>Y5} zTQ{M$4H)Iv8MZ^cWYWK>+4WK5e%*2I?vLtKDqiH(S4<+&+^nRMsouHP!uswCUXydQ z(!rtg#%bmCt?d#oQ`4I2JKLAL)6UeNYJc@L%@X2edg0|cuib1)icvP~-7~Zdr`tG5 zJDPcs4ok4OBB3%V6042{ZDmhs(*^f)EG4Bb2LLW~TI{6XYu$9wz_Z$K{L>%TU(|kE zoxWUuMf=@k`nURjw22OT=Cuwv{wh9^(gvMudJT89|DDXR zYFdM!QzG&+Ftj_r1ewUh=#wf@tcuI(tUko-+=V)EzkY`Mt4Bn1k43%OJDq0x`>+ z5xz+WB`s%`Z_z=$ob!Rdv4i$42iG_fPS?w&HabL!@6J_jT#{iN&(&+(tRwL_*RpYo zj--5^TcfuQsA5Uu!Cg0Wq9SN5m}ikHc&6Uq%x0<7a^(g~-wr}{-U2(pUiw5{Y-5L{ z%;UVY#+^%!BKi4^p-ZxE`IU_kOLE2eZH>E^WGNA|u4Ky|sD$e8@Xb>4;_+AYS@m`K4 zi!udo0*8GG8gQ6E(XHT7W73jRalt}k+LH3^f=`VHmsIouF!4lNJQ{;pn>*fTd84`` z_x!rAz)gRm+guw6O>KcHy?)Z`0`xz%Gw8o$pwec4)TAEdnsWZ=0^_{4;du zThl)}2J$7M;EL-FJ4)o6Z|N8wFVSnhqhs{A#IpH;jtx2|8zDzKJu;EUsygc$Gbz$ zTo*-6N}siXFJ1me(LE#g3~{epdOb;1#v9h~FPu@-zZ;H#8d$kBEuxPP>WMFURBriC8u;I>k2$mm=g zTGPoe!of|Tvt;891n#ZHkGb{w9R9RtYUIp@GP~+n(w)(?4qFe!0wZs}Om#6n#GBP( zf#E}>9o9GGwtI~PYThlTNoe}CEL1qAm4&v*bvkh_m&LazbplQ%yG6Cr#j?D-CA`N} zcuJTGQy@UL5iz+H9nfij+JdWQ0p0l)11IJuAPTp}k6H#U=Al#&UI|n{?-{ir$GVHY zBsSN7hYp9}x*W@=i>6XEJ6+Stn*cN8cDeja%ev0Z-^zPiHbev7DojX9(K(=U2b`{u zjsk@WrdF`DBgi1A4-9AGsZnOD&Kf{rAk5wJ=tzr6r$^e+*%pgV&&x+Yv@F{jFf+OG z8t&;?%9&)p{#P@$t1ULsnM20kThM5hyyr}+o$hthiddRMwAbzmtTiu|J!ZF)?YYDm#%%jtytZ;9d ztaGg&C0+qN%4odE4IG6$rKKkfhZic@a5Rs_O2vYNqyq}AjgjJICJ9dP8(lfk2xVP)>fQtbuLtCck z(EW*w^J>Q*-8a3s_xAnAhtZa_n9OIs7%FN^;1?o}h2DVNT}VuoYCg72l#AaocOlnB zdBtI&?+>_VlUy7_9{M~&8d|v5OvRG$8^Yu` zNvaCy7Qq-#w<&;*0V)^Ab`TJ!bOJL);79zh7?po2v)VT>H*FQj1A#pBPbSlss-BL| z`iDL{Dl;R}*P?W`W(P<2NiuGAO{Pb>*dZ&O4XoJQ$c{eD4;ztxvh@HKsv z7QyljdqgbIMEOp}N7`rUE;N}uJ`?%%=%)SSgIOb=!V?~!$=XamSNk|5>#c9ye~&L` z&G=qWe{w5p&iA6aUB5VY=8~HJ0vvGbgzcN&_dDUYl7^c|*>T#0K9I}Pg zU89=t=y`6ohI-<}bIT0v#YCPL?b&*ZHymD!WE(BsOn5P$ZJLWBg6Ic8We8`C7H$TV zb%^Ip*S6Vx_L{ACE+z|j@YD>`Zaw1a^Y}9M`2CLc?47x{O+PP~nX4y7Fn?OQTP97M zoDx6vdQv`A%`EFmlIhF&fQ+MRb}z+pY!{OgUMlA}ET(k5G|Jhtc!wtgP)EQyM}ssJ z<_DxJo(o_{6o|UvkXf+=8s%e=8lhH=+wTXqxy-rnz(;4amZ4R;1&x6wKno}?a1(%j z#`_sKN+=acBxUT+IgoodBEu`^NG>>5Avwo#@BhjGEh``!W!NFaWNIMrYhcRhN3{Dj zmHD_~8$)`|+#y&p^Bgrw3a653lypk{;nB=TIcL=$J<80@@mEiq$gItAxovT8WnA2- z>10+;lxvWBx+E=2!98R#-63lv=iK7sgsl0Th{Y#eS>JLl=WgRn;3qJ9fHEyU9DyO3 z&k>Y)%M`||aixNb`)uQI?XirL5hA9M778e1FPWKJwz^+CuV4?9qr;zR(xmz&5s`cX zGDl9oK+bYqK%^3cw{p_xytr&kZp%Hp#GTDEd-!s7F;>_vhY-0C$QwWlvm z&RX9v_txSI^;2+ea_-A6p;wAVqX?6nb4QP2GalvMeSSALBO=Eu_hByhNFlk8bF+Ts z#N*A-3bkV%_+*iar*}M+*;Jf+idEM$| z6Zxij{p#hC1rB*b>J>)|kRZIgaN&?uVSWg)LHJ-(7wVd%8I5ER9Qls#ja4TSRRvuL zvU87rdkrOoSveiai}>hszQ8MQd@=52L15mLpDU{%BJW);gebg{_kOY3p>WZM_A$36 zqVRd%r`+1w!qU8z+`3WRc`&n^Nx((UW)e zx+{y49llTCRafFj-nYe92}KS&?;dNYL|YLAvW37(XF6Vj!)~LaNg#|N>HH9qhq+2D*^@8g-{wa-fD~J5ODK7tBDJqQ zw^f3BSS zM{B;`QjbH~NWRfhZ$jC8zUfk5SJ}7xT}%Bu<(LA?C6+_E*!_?b=mRv{rGbQUjmRH*e%+Wnlrue{!+1p@8Z?rC!xn z5a$2ZuWGvBg8y`G)oKAP%KzPBm9}^$N|J$3(u_nrWy3y@P?E0#q8v&8z_)Jk#`IY8 zsh7;(1>5B0F#C{&(Rnkb)k1~wd9xAK3WeA6-q%*^72aHmi({A;-qx6ttZ^v3QTuqh&iYvZ`pKjrt&WfE~bg~u@Br5 zYc@TF<^Hr4zq;wdYX8;Ty4AvZ|Idqce+q45AixE~hg(>?JhTSmlhJWk)6xHNU6r@x zBT}pvjpQimUtY2-$8^oM$EkdDK@`c}*gL#&_~2e4odX8~&;ChB@RXf#$-8hNFBt=BH<@&B^@5fHrqITgTb0mktEAy&>e0Lb9< z-TKjvl8kOyJrL8JH{V4kDANKv`8zPkNEXJJ9Lu$5MJj-8~GvNaKxsmS#^IHC^1c`#Q7kwcJp!3n$Y-NgQD>rUQxOA)?zY^6 zZ78L?|ldl?^e zOPuqCH=B-~s~$=FwTE01b++)M;Q0Bd!@B4;+mikHsqkl~61V0418ql34rz*|wfU8} zYl=^{MUMoJNy36i1Qw?~pCMMp4M? z&@P>h0f)^AWw-k%Lk7r^z<}?=A+Ul{41C7~G)FL@|9|I^^KyL(~B6ivT*?TM!DYwG{9`iC8MaC{UF1hKztf&mIRp8Sf&9L!$4(OnLiWtL?nQQ4X7T$AM*sG zQ5<-aQ%`asz^E!`G{}MqJt)o6R8Q;5EzP4SSnyNPiO~m%6l1h+^hcQA1uEh4qDS8q zURg40@2V_qVYwY~^;S2!)-d1o=VXzlrUvR!V8R|vjlb2WN|!Y^8wX3roV7GAn-o

Pta+K_*dtcfzO0+ra|T?E02O*EAWTn&1UDcXBxP15 zTd0|7GGo??-5G0=B*f-I#A~IjKSY8hl?M{@g%2WG3{OOax45JfXt{S%%3Lj3w-EQ& znO8sZcI6jw@3tuE*3_TuF)i!YG?40bC>zo=bniV{Hkv=d*h3>o-HXWp9>)3Z&8{+s zYH{B^&8e7Zn=wj@NM4G0mY=?`^%7hgp3_;m91jDzQO^tgpj9 zb%U@I5=4D**LGRs-S75Xn&^!vd#7nE)t6BALDR&&?@`%*nx<)ewuEx)E~|Ynqon%6 zJ~$5xsB~PkDyXN)3|uukGnG@eq-o|32d0LN8BO+$c&{#-@%Ae`U&|+(^$(VP&EFZ> z|Gw;J{w@uJFl$Xg{@VV)ds~_wBmKY1{%XQfES_?dmW4Y@vK*^rnZ{Bt=Ust_d~B{2 zlqABDWp8vK(Zxs9zC8XKDYkV7Uw{>_g=x8fmbKJ?Lpe=Y%f@}+Xt}tSZQ6iexl{od zbs<97==Tf^28t%H<2}%?4A-w-@Y=9DH7W zp1Du&cn|a&bFj&*d{5(pL&?WAcj_N<$Qvvy*9>r68f+*h1vqI8^_3e0IB$YRV(pV{ z2(kg%hXy&&F$+*`EBYDGkspGTt@xFM65__jvSuu969v9+@xSn z-OzgZ&Vs$0L&ypc2|51rUuEB7?wv7@IPaFQR7|;LO#+U$ISYpZl<6 zg`L*^v|;rMM=jUMVdSno0arGL@0m`jx=FopsBqOfP-l0bqA>eF6)AE!W)lHOE78LkzPBd4R6j0122P^rQCfv4sX^d=_lCI7;A)K@ZjT% zXouf98n-RCml(@UT7w<`GBkf#FX)a)1@diOrL`o~h zNH>BY6>F=7Sf9fk!CA#G(?yTqhCiO{;1f>@-h3S(|9YkBpid|9c&l&j)ncOZ&H1GG z>|?z=pMtw)xbm^K7PiEy&VrD-DZQ%Rg3!$=%c_BbFtfM&tKw`oVPdK#0m;P>&A~a! zmPL0EL_=ix>2w3ob>zdtddl;Bwu&^(uZ?2tvEzkdW_vCkmQGv!X4%`%?u4(luuA)o5*5 z7U3}d1rkJr9^5Nbw^}%tBUfQW`MH3oJ(|;CY^$5o;>>3ESBn@S55Cl32E;!gy}m8b?-~7wF(nA-}mv80&i%1=&Lr+et-DGMD-5sTWKE_tIf1; zPk#7SZLXapHFt(HCgCDRMJLc5m=5*02>aAr7j6M5OhGsqOj&6sFOddLX*eeP&w1Uo z(@sg7YuM?qn$kUIRP*!Joy|GRntg=_H9qdCaSOal^Z$6f=5XM>ypMr39)b6lK3=Zz z41Az5f2+nj@S*?wlNux^y#_#@B}fCdAa14ri$EZX#MLrEW1J>rlcLo8tfpSM=Fxm^ zjelT5_q_;0W#yzp`4fA4E9 z7CxcX{kL9osqpFMf5_VC!hh)m;G?rRPY)9FbR{B|z+^+Gs?dcP(2wPe%4s&~Z^^H= zP-gcs`9uU2-(S0-a@yjU{6TNKj(x|!XY$m>YCm&dkgUC`{XA_!y*5$%#pHr%?QQLs zQlA`Z?*xibO~^dDEqqBr(&XqX7(f69OW^u{Lpor1f+;==8$+puj!9y3+?laj3YW$p z11>z{@iW{3JB<9QHRJp)a6dj%2;j!WjZu!13K?c-JO z-G$nx+SyWz3AKPCLRw6z%_sy0`Oiw(;NSuhvI`arU>>3WORYxWRS1d$DxVys4ipUn z$&`{3Z|Ck03KzVebntsFKB>(P%*|UYtj!P1+f;Q!G0_Belp7e_&uVH(;Xr&dum?&j zrsFPWX0*xa4g6BDy!H2o#fIAA)hn^b5~vgV^EHrJ1N@Q^d6=|93{7x-cNd%Eni;1e+kbhCD+p6&c9%lNuh zZPZW8{kb^r68~k{x{kooyk+gWaCF(^vT0qvcDdAwL*0;eh5O3Ux>4=QG|Y^^Ijdpp z`m)P-VWrgLz`BiXRo#B)>J+8}U;J7@^34QRCl+0=`=DLpzWS){*6W(Y)&13<3Txd{ z3+{_k(XzC_#--1@z)c1tb#wUJ&H2qLWWYHAoos7J%d*E4?`DE+N~9i$66)!~unoP{ z@o|!#^m?;Q>~FS+lem`aykHU+voxSvE_ncni(6G-fq}Z=XzHY z!E+$pC$W$Pe$3Q4g zAlV;{bSMU0LL5|4OnATrw#9ygmcwj{1|l~UUhOVIxe$$^FE3GS5pRTpj$x9D3(qb( zf(`YEIqHxsw8GRB+&9BYC1^ z$b=~e^K-H~P)HHLvl^WQ@Wk=YqrBg)yz&YH&jUCV;BEz#AT<4-L-`lejA@)#aQI~} zEQLsUI4HmQ1?Q=qhaol?VF%R%3Cs+S(7|knH*`v8+#P@&XLTmhzU991*O{FBR{ILc z35G!UA6}gSBsp74&}DW)O<0^xsU$%|bO9o`l>(fJ=N@(NM*qAN9dP-9UR{$MP!YAH zX*aDhtu&znx3mUfYaR?IH}!_tFp3Ud=*?-&0ToD&qcpna+6-RAcZ1P_q;z_OyiQRP&1 z=V380@P&Q@#?^^vsLa9W8NhaF9Y(?XT2asKdS~$I2oYEUs4x(A(ziiBFc7d+P%+|Z zjxdTUw?Sx){Y|&(b&IBbK8W~ZfqcN{t%MLHX8JMMFl-w0IoaSxjC{{pXQ^T$M>2oBhUY;c45VHz-YCFm0X9zhfaZ8IWx zG$)}|6fRv551BEP+^mJI(Vjf%=XKjC(MlH-zS4VN?AnsM)gk7VNzp-%iX{Z-E zUiCAi;c?M_n?GY3o)s;a{Yq)bDEbun>)(tP8`vJea@YV=1BZ)^`XRgkA(PA&2urab zUj#qB-3%-e2hm3jITFkln7dp@qpeI@E#rS7i*kw<{i6yS@`IK%Y{BP`KzH(hwYCCzyi~Nu`a>=Jk~B*g6iVT%wEHh z(I2h*to-8eeDJ>t2o19}Xj_j!MPr(T$VS=4Y-0l%_5~QhR%Kx`F>NEV#WJc*acnFR z+RZd@0iObFoCPz75I1N)15Niyh@Z5j434IGQ_=?a056$=?h%~?Y9V3-;yQDcp^}8p zL~#l7&55ia7FYxi)CDj#572Ku$dsybg9pVVz*{u2#$(RF=s2A&U|2v;5C&81*$890 zB`i-?ph;iy#LNn?+sYK=JjLweyy-soY@NDvX zyDv*yyBb+R8ydg&G!6%S_5W=|Kr(^20)Rlk!2)v&_Rz<3zr7mAi?$Ikhw+IPdvw)F zhzCrN&XIYr2-75tJam=`#0a(^5!j1SS}!=+s#$72b$W-5f!_E70lgSUw%!HF{a4X5 zUeIn@j%|@azy%kXPo7!|YE=Tg)s`J&7 zj+`F8qo?LZ3$svoA^J*Ya%{`-??~gf&%YD@&NtG2eg4z^_gmwi&wqKrUA%2+(jHjB!mYf#l(`3>5v8!SosX_RKW2- zKrcD1V`jXyxtf=)_8MvlZpEzckxqD@0i9^&=vj6 zBvS>JQGb~*m7qzH-p;fZu%J`Xhkh9t=c=frrJ?0qIzgBZ)~nHX2$-j}UTg^`%>AY_>}@wNSxtUyNj~t`K$P<& z8bXt3sVPidQxLU_7yG&?ge~m^Rso!2%Pd0|aH*CuOu_L>krb&Xw#-X`QK%Q$TFhdxPg7I(s(J%^s)06F< zO5IN3Rs^^(kfD%(un4ai<%>ApCON7~I-*3d55}Y-o?%FcWD#)1<|i>eHZ8)(!?;g1 z*TjNwBO>JoOStfNsGG)GBFUbRWZ!1er($tKE;0*frt#xHdv4ePJy_^yv}p78m*EeK zmFu}fn;#deY;ngnKPy%x^W169C{~N&NdwqdM6x2#-g=`Hz-q+2gY)vQL(dJ6F)(sOD*HZRlVhRiK@3#>Tqg7NIAE%QMY2BoL7waM`w@!|vxG8(B7C)6lJ5 zJxfYYA3IvaF1_R}<4ao9)~sG{wny*`gYHKo6&=%vY-uVMSK||CX{G8?`1U?}P0~x} z(`e}?=}&>qNI%Iyn%}WyhFXMC3h93Op9G}Ap z901$rh=H7^|3lzG{z!*FdT~u*pVBf^bNyEm8&=wFb7)qj!*rYVmy?g22w_bZ^(myn zS5{pjmzuCGS5OwFV~9m(KRLvkb=@-i&1 z8Qqey&v**{sOEP_LNM~03OC)DjK9jP5^RBz60EYR(0; z_4TVsKs9%RMvo&P+;AYY5e1|{WCh|=(vn#%ABmb+VBb~ zz4hjQecX#+XHV-~RR|}fNu=GYzXFzj*e6)l6ZBj8ORTmC!d!%48i2p|wu%JXPy|o3 zN(9^H3kJ3BqN`h|5fS<@G6^b|F$X&xfRg)kvu%?`aBJY}ok@O#-7;&1S&lVDR)MRt zg6`IGx{U{4RhAJ;Dy4)HTNQP8dkCeqs^~hT3+1(H=sHdb)wSyAI!Oz6w*mtq0=oj! zot%9zyv$V^L&Xipx0{{hT#gcHm3zKtHyqiq5sZ}pZsLUth?u+S7D*-@v`?@=$ zeO*IXc(m03ercsfg3dXtdMX)1Phy>?_Dr=J2k*%j{@h9q-n%UPw-pX{(G(GA1ABMa zz=XgC7#Msc115+R3;<8>^AHJY-Nuxm)6fJ+I0kJ2Z6VMw!qWtX@+<>|EQ-N!yCMLMu|+w;uDI~%H{3+h1#|ly>wvPZ7B``{4cg zB06nO!LG}k5Cf)h^s5EzI>S<&Z-}kXhoirM83R~|wU?w6VUZ(Gp}FxSwq=*ZO=0D^ z4xuxR+k#u)2qt^(TWG-sr}jYHodM5`mifBdT=_)p+V-!xIf2zD2iFeV5IqZehTvF$ zfloU4;)Wwct4GUvBiwZlZGlt|4}+#pSlf9zxOx%v89IVvWgxp?fgFdQE|3J_Kt2H~ zA0iC_!4fR1R-sbsNEoa!-^r8%c`MjemppT=9QCl}2}?E|KY(*qe3B}DeC-gQ*wr?# zwZqFm6)OR4>PfIyG=)FG&0$BM#F`QkbrEOjA<6U_S#Mp%*Ulu3o7XmU`G>gxSp5ti zhgd-vLTaAd^X_>f1}YLd;t?ugAnx5PsR8Sp%WCE+G&JpE z$xi@R6&HMxA|clf+%6}7#4-Pu2+>1yEqb7HO`~j>>J6v-olpTp3&`t+M2|XG(>|fq zD7i7FP*NIL-F}U=9;4LWA1nOg{!|Pg6ub=fT?W4j(aA~9aiBk09NlS*USk6IA(aaQ zi@88|L1P3z>QXjl#nCZAlUa(BXImhJ7|7HO7<)>R=jE23GR~)N^1roHZlB zu!OK@@QR?lGuulSL3_pxpDZO4GS_@>NM^O?uKD#yR<#$d`Sa1FUbmM9qwuG^#wHLM zKys4@1ayKU*e?JBOB6xd105>VLYNQz3Bybi!GwfKQbX+(B>_=V{#*uaIM>VE_{dZ2 z6~cA~+V9pD)l@=so@oT9l6iopkSDenl^b`2A=HE7MFgfxEw$I_22FupHinJ>id)cW z1d&MNo8lHiN+!9AaO2T-gm<0@Gl=rcnStIr|pgtANr6yn)F7oOn5E5fzdy zt?{~BH*^a0&_UAA0-hZSuq+NQl?h`!0oKzWjN!l(XjqK1oCt$3C8=vd=b{x(@^_#{ z01^V0iQPs%O#+YVHWHFQ#Euq4hDpmfz8=yI_mFXaJ*s;yUB>_Qr0)4BLN& z*&I4j*VROKT=vnZOyui#C9+(yS6{!^UDcJn^ZH}S#VA=bJl{faM80g%>*e4`5Bu8t zV)1AVTdZEpGG5h>%#`tTbCNT$*-4~~AO@xQr+a?ZeLNVyc{f{}() z^b*n)%z3==F(mf!Wqi<36Y4?rDcbRmS5KB?pbFzm=wh0XA!JBLDM_j86|{(qoz&1v zoKmRk(9ydgt=Qf1ZtaGX;%JA_`pp|)laJ~8tscei9lO?V^C@9FE!UHrl*}NTQd;sd zfLplnQ9O`0-V1C6#%ua-Adz%4$cZD4egLpX2>fw|Np~TfJhH-I--4Ox^d(Zl1i}eE zv~~TO92&+DfzLb}?UkfNQTQ3H;`K^36UrDFaDdf(wl6j{~NUG-cy`4hMJGfh2 zIuESZo!Nfs_LqmHU*(T=l4%n6JR*s$M@nyf+wRlpu6KWGdt~Pcy$90DiJhnP9(pLJ zb#ei*Lo*k!9Lth)h|RZva<-x`a7V+6LgswJgZ6LMqFQAJu*BvTBaO4Ayp-Yhs6zEe z9u?|IrF$ObD;ITs)=8UEuImiaOP5x8Q4q48?xZr>d2apj4X~{!V%_&ikIMJX%j-}1 zRL?>?;U)B+RsjvvC;6HTvZy12{I%HW{1Zn09{w(F>1UK(s^0T-z;H;^doiVI)^%I&rL>wk1Y`+a0JM1mw{JE)>fy%I`$<>P(zI-{ zdLAlRdn;5isVhV84b}f)m#7f(oVx4bsUtEXW~Y(arHWL__Pt(q&R+>N=JI=U^VN&G z^4AlF)a$y6^zx-Oy1Q(EmIdL${v!+dP8y?KmFv_{4Oi~fjw7s~DROm4A;sXq!GWB@ zdW|n#UO5*O4sCQbtQYZVV!NByi)l`p;@$1*CCkA5LNGsFQ>D8r1SCgz0baH{5UAon zghmVy(}4O(v8H}^Z)w?P_!6HVM(uUO1rN6vtGTlPIvbgy;mMOynr+S6yk|s z0U&2lEoZ3N`rJqnywY%uaCe6aZFS5Z12x__27)a!idru{B$+|ohy@LtDr z6l=lyFi(sUkeC8OIV2GFQ3Mii4@$qugCy1C*LpD+>5D|qHEo3#JJx&{k0#Y6Ss!k$ z?^W;N)o+<1ne_*dF<^4ziv=g;MCuVZF2-75%Psy}TX`{q8Bfx*nY} z6rN%u^wR)GhR)zkO@X2n9_qR21*$X&2nqLS>i72mhss9bmkc&0X$MLZ%s0^K zg(Qcj49t4>>eGg$4IO)3zg%)MJk+b)Vd-UfqW5stK zZz((8^2;)svaB&VT3y{BC*2 z-(KM_E2=e!zUZX#voYq&lsEcC56sun(XaM4gE+lIRP}Kp3dOiE(pX;W6W{8)xE{WU3hLiESu+p zZ>1n+?oTBGCFH^{OH&|wz(dQ@X5FZ$=CBaT5AO3wbTL61&1FGis92+K+b_&GI9Y9= zg!kY6>ACba<#{!i_3G_qve{5yMcGP}*@wQGvekOCFMVWq!>h}QK(RxI#dz|p-BgC3 zc#2C3-ZWThMVIZ_2`fG%myhro9|X(xtom7In|+NmeYP~2x4%Vy&4Vn}|5{(E8Aa^B zD`T&0-eJ4{^{q}l8{4lB>sgdkTz~uz;bYc!J44m8$U6N!`Y%5uzp>~o`?5v0>Zc8q zZIE}m_P;6n8nsgc?PrCD`RxJh6h8xb_M`PdE5f^f;>)+5o#*?9=<3gKEDIfX8&J(NCxI*p$rfKo=su!4RHzH+>6^dI*U_c@oXSh9Ccaz<*47V zekIsOre)#CFKobd43M3~4KR-_{8>^4*tZsuto&v}7mO-?5h9%wn^QK9RrzX>g=X7i zR*cWu5Dl0bbzM7TbaCtmhRKoZr-dvNS&9bS#{gGK#enCrWgbhz0OX3Cj-DwE^m`FC zD4=oul8X;MLdQUe2%sqd5*`f1`_{6KrDMP+WA%X>*^z?fn&rm8{GJ3Qp?Ug|Bmh)r zI^j>+*6-1~!MD?Dh-FyLuf=mic!vT0vDFgG%s}9+)h5f_fFNUS29i?*46-lKG9z;0 z06^^^AQ1?gvS@e$SSlpoBBlfyi`yUskjH~9h}HrF)?tDH)^Y>(VL}DgIs;Ay*6d4T zpy>$o7$B$>qdXKrb^X-lr7LJSu;ZHWV|_Y#|2v(851lgn7HGD$)xf@Tk)1ZK0|&}Q zFWHz<< z@Y;}YwlxO`8$iDxgaMs2>tHXpqpjrGt}*Cz`L;{8F9v+eC12T=4Fr@+{kFX=M&neC zJ)j;ogao`1BJ^TGfoieP_@8uJKHT+(jb01V2j{E<5O%KzLN=tG!9KWi8!|WT{-X^< z82DD06`vpr>Q>l&890gb<$k#s@g()|fZZKG`R2oOc7F%xl@0lu_9}x38w$Pl8VDq;xMF_?kE1_f1uZM<#t&NgAISG!R$MVxHI)`rdh0t& zO)gj3x!ZN{Zu$0O2TGCm4U`}6_8+9B8K}GkoVKS1sxl6@#kVoz@ZKV9Cp=wsr^B7W zXZE%))2`)pxvAZ>pEaBG7xs5}I%uP<{unUb@(eTrY$^w7g&P|Dj;{wR_FR>B>>n%- z(+Y5WH&`8}UEuh6u)Z7x@sWj?B4Df%y&Qd_g@0ym2Z{;TdhW8;S-JJ_t2fO{{8hQm zZ%5QnlYz9nlfY1Gm~McR+)ziDUV)R&P>+ES%gJoWWI&(ad2iN0xq-8|)6j63;qMx{ z8I@sp$@$dK_y%8=0a<@QQ45LY4I)A{?qkZr9p+6hu{4P&Hk4=`X>VcvmD&U}3RnOrCPW(Mudw><0(zzu z);ssP4vSXU{6@_YcEHIbc^6*6X3IgV4jkt8D#1zA{){+oh3kzRFMrI4_&8T)gq$(cDWh}q{PMc!5 z*q8?$FN)lK3@`*$3>_Zt&l}b-bbPzNZkP*PuTX>Y0|XILg+ACkfcTy5r45(mcf&((0nzb<;bEDBiEjWDpM)SorworAJDB$7Yz4T` zR?X*EREd8>)XpQH6ay-~Px#S-gGFyB;qEI38{be3KYM~__|!U*w5JnQhz=1uBzJP^ zipS1F8s2fL$9Rt&ntUUK;ycnm*nj`r9T1Q;MiMJf92D+Gg}@9-6@5td$Zsk;+u~-$ zHc#_xKX;o|Ps|VCP*43nY&DWx;l1;S>&V@T)0d8%8bN?Yz!CqEv;)FAh}YT$s_@vv-x&OT}RH3Jo$Q-e+gf~2=~!CdVAz$xNpGGrz6?neg#KqX?DhR z0CVJz`^e|XNmCm_G0ojUiw$Q0m42l-yN?2DrzsN!wgwoM z4qUfBvj-LU*xenbUiE(Io_I^M>yZ<6Wkgivc(42Skp{zSzuXVmGQ+7_9s;AS;lTkO za-$vLAq5_LjhJYDs+$Xq;(*4_tcHO}eia3}y@pIX{bTN*qPIYO`lI$J%Dq8Mp#phq zd+1w07wtC;lR4%%I%F7r46sIi-Kaf)-%(B~Pi?!%SMU0rgM<0Xo}vN z*ypdGha;HSopDE?6R$_tzeYKq7#;og_0mnSfbmxaihw{UM8lUsX9t{a;7q2tmuN7a zuv92C(|WmJoU4ATg4AleG5Y5#jo%YHhWti%_7oq(e2bO=Mhi2y(eXgp7ebMo(g9)4 zkfcZ)qeJ($lFCth09nKGj+(hW{4Jf6{JD=v&;*y}NcxNyk4Hjz*duj}JI` zVoVegZS6vfvbxZkqReWf=zYceXhYib4CKbM6p#f#;Adc?iiFWU#HwnGZOuS&z?d=R zObI^i>Pid7>x;tgY=W1(k>KRDo2>`E^h+L(xlq)ML?;t^K>Vj=5KE->RHfHjM`C-$~|^NKBL8}p{<8%es~?4`BOgBKfv-#?B2%@^Hf z4HH>B3~>yUi&lcIymX<+>=4aYG5eja?TbD)({3x%T=H=&jACXa>wdfU^|w=~(r1Wf z96i1V5#cGzQeg5%S$Q335!FV+O=;B2*X{WvN3=I@_}W`;XM3R#%Bg}e6w69^spNu= zGu~#U^5e7=ibLi0G!2BXX9Qi5G`>rv1HXV=jJFBCxt?!0&XO{cRhhiQU(9tnv2^!% zCdI8%J?-vF*Ok-VrM}~p6pu>nwEHXFm@~X(*T>r_W^_}gU33iT#E;)|`}_peh4m)q zY`?^dU$bC3by2imw%vTV(sSiZq-usLEMt{IuzEyu?yWp?s;pvsiV|dG?4Iu2XLPn3 zKq_wB7|7JUG{0{i@&Px82qcUTS{O3>&YktgW+O_uxvsrMED%r27d#MJ&NhawV07;E zDjr@>>bT@B^2_i-CD~onQT9dM?%NCF-zZU)yV9Pn^kaN@%ef~o0dbWvFk%M5M7z|X zX~JHLbV!blpks&>peu|nMyMhVM&JMBU{TX4Exo;zdzEgP_H2c9#mBK+Z9**IMx|}q ziT8BTUUN^LNDM^rLz=GfC0g8VfAcO2XrBNumw1q86i^0Lt#B>w`;>fSp`G$ zzMGntCg6Z)l}Sg^yT=s#q$-jp90D>cU8Qoh-emf@SCmY!AtW6GL7eNLg2SbW#nbs9 z6g@0ySCUA&z-8>=_z=sNz~y6nDrzQ<2NYKxPRkD%vGvcZpp8!i2AF|YY9hi(v0z8I zW|*pC{8tQEffeW9UD5lz`hZWq*!{wQ(RTl(ik}mg1De%6-HV;aj3|ngqLViQUK@G4 zmpTJe2!*D^Wx@RbGQ4mMM5c%9PB!C^+kaTbGsfpBk(Cyc&jSW4eWfZ2Ce8$;?Gk|s z1I8*Tw6w~A$@YMy%8Qc?0W+0UcPogSjx|OxP+dqE;%NJ0A<+68gU(@g#^E3$6HDZq z5f+hTA-_O_(LlGD7${YhJlPdMo39L&s?~b?4eCHbbmJXH(d*W#%C>zB>5a=ZMC{vT5W{)*M_aKFkUz^NNdLrzy18<1A z2{7-Rm#WvARt`$58kk%R_*NMy)u8oG%-vY01GJBJgD0L12Sey;j1%e{c6ZEGW~Udl zCUW5je5^tI8tAPx1iWhxTB`av`6mFXqNgzfW^AdU0KP>+vov%p{UaRU390fj5NuE& zAn5)UdtujXhiaTXmTO1sq}+3pgV63H{g@V>`0#MxH)I5_JCl`^B!SL=b|5hEE%E_@;!X_ z^!w3L_Qx37E+P6gkEdJ$)plUPGyhl_5(-YLECc~l6oR@I1sfz6qwEaKrn+C@PDtM1;9-$G(*+NQh%$#KZRo}2RrL(6L3PEi9* zc08W!yZPTpXc{J+ILw=gl0~9DkyKMgvMTo#Zds&_B@qrFoFIC;$k_7B$Bf7HuWT|q zq6tp8%YkqeBaIcXU>l}UyY20*K>Mnf?oogkA}jIZnk$88Et=G9!nCK6KXwT5rg1NZL8b_bx6QTU7643ras2iga}32=TB zati$tVT#p>rp55jU>Mqp23wJpJpT#hO|EqON!~}t&F~cl9Oh8w z^J~TTnuJ$$G+O{os~dm28hBv`mJYIP(Dnma+InC_)vHMqlLoHK2V%ed6{x;L3ASJm31p%Q zksGX%i9^y6%pn3IhnH@Z1YNFbl$z0ED_@YR7o6q^y0Swb_L`CO#LUS5;HE+sz=CLC zc(599efV?#iF`~| zhPWG&8}f%CCYZ{FAp`UU?8`^U=!_XWL2ax)c-l1RNmakpg4Tv|gw(6#X@?*roewsI zWL)GAi@KRO1!e6RcBd^mf31u-^{QgpBdBP{nEP@sf`pa;zFZmrMOgZB!3U$r7q8w- zQ-Z2?Ou4T*f3J+>h1k;(K@C;!()Qqfh(!rE@V`SttyS;S)&g+UsBVb(E+q&=0s4Bt z&-N()hMiD)Q2&kv_l<&au=||!Z>LKknbUv>XpEggX+uzSB6IhQGSv#=@!;x1 zo{w%}o}MwFN*UulEEuT&qC*=7#(NN4;HmytL1ANrp|}}qs-m%w2QW2I9^t$p2dZ+l z_qMGS^wk*0rkt6BRLyF!blzKhE`$rTrtRIHR9)k3Q+&5D=RxUNKjTL=s+N*&nA=B> z?QZ%sbB;=`mQ5E}#bVxH->P#PHnPbNSQg+DPNc*sR+gYO60H12^-t>*)xDczoGqoja+h)T@0 zRalQt3!~5aX`M9Ioszi4cj$_K%i~!V)z{c?O7a%}=#|hG1Z2y_2dCFabuO(7wKWLl8rMfMP8DhkOUWQi%!BAEyw{OscG{By zM7XWoLk2-D7~ujmL1sYNO_Xa3D17Qj=N|!Hi@rO(tetLd>!Rn7 zf3Pv4%lv;_E<;5{PfQt3u^NL8-=mD4Y8VRNN~rQfou@QC)9QE6VG}sdgWYbv|#J`TOD13#4DcBuUuN; zJ<*_B1z8hN;djUb0{Bsw2obRg3mk^^ARi;pm+Nw}As$}?JM*kYK(cmmddApZQbV;2%IlBhWGp6AM_Nv$T| zw`JX)`nD?Zv1dY*N2_TMT=gsZQHYs`M=gh1LbC~T=;CP0tu)g_w+i2y-i%^3PDQu1LmY z1vZ-(jd3K;XHqc_ITQ+xP_RK~3J|d%8MOU`25rEROofE%#W$Z`IId~`+t$S1+LTi7 z^%hNq2cgkb!QQO{#N609%EIKP>u*(wKDEM9-}RQ$cbsf`{&p~Nq?U>i_!fNlQeQ~7 zx;PbsmXW4B!B@nXM$VyFNL*D^n46+T5;MWS(69`F;7bEv1_OiuH{44`k&|Rd_uJvb zU!Gf{0tT4^9gWuppws6jFOLEEB1dyhNEkYZ@b6?G_a9w*-kQmJZPt=&q?pyY?wn=2 zR_2<|Qz|Gqca;jO?>mUiSGcVc#e6{X--ekrslwI>mcN7Bwy0=JL+BqUMd=zDZ2T_K1p!IZ0{GlmyU+ zw+0eq&JZT1-$DdhC0Qrybyk#1f)r@+vNk$p_YU(A7h8v2W_NaWhbGxy*=-)`Vs~uU zk~?I0AON3^0F=mwX1IpRp)n{Y;&#t=CEvN;%}>&SFM;;}Ho zD@0oZJG z{rJwuZefz&73g`$P>t;N1(`_!UeFiEfvZlfxjUp$xI;O75kye~jc$j%k#Wc{JUH(L z@+bi=iJ&0~m`Q}+g%ktHRXM4X3X=nO$?vk0g1josbuhXsQ0s?*QF^5$RZiqb7Lhe1 zV6G8H{|qN57De-sjGzFhBKQ;`#LGeiH+&PU=1>90yC&~W3rfY6nz!>nGyD$Yts+nr zH7DHZa`E!J9`8z%W_wka!gaZlq<3e$`^VREXsPq43#sOs1TL_}bmZEukTPNO9pouw zWDhx2MKm@Hdsm$_&+Fu?dCYP9_B_73?pOL=w={I#a=mUzUZ{`s=Yq<%HKUoO89@z()@BNH4Tpt z1DPotO{B$RWNPr;aDz+%H69WhgYX1;Y1Np8Mr4N2+K>Wp5z$p8*X&(>@8Y{xNgKRs zqoTrHG~$H@TH*PFsq$FaG#T%XNlT=Q)>z3!tY#h5TNR7zgrz zKF+COwo_C{0tmo^AV!{x8@s|qGYLB4WSqYq`adP(T1?(ElciT|F$=)rvuY@j_L_#n zcS)LR16C34X&pveNZm@fGawjtp3yQCijphIxJ0kheTatnk*q1K2L)+irL)g~s` z#~_)Zx9(1C;lyVp$t`~G(d3<8cV5L6x-Hm$z9ss-Ig}@+7?1-T)KYki77-GMLz_bd zDN{z#2qyqqqE?1a>Vc;NM^I__TJxo$+eo4*fD>VDaUer6z%wt=tp@>sBnNydL|RjL zL}zM0xFz;L=|!+mj7QXlo++$%;ZJJX|Dh%Qy??Uoin26*z5Db7W&AD&EubW0SW zS{i252ya9aU;}g(^alVqioj|T04V||VNjx5g6b=6r3vdjnhvbFpZF{)`Ha^;wV?hN z>T-m;fs8AMd=?K^JqXJP36K|I_a#@NEwTmFTxl;|yMFTYgD3Alf4@Gt_R6c$_3NiJ z9V9~e3ppkZQ00^5rhI0temwaR;kwrwjftXpmWH30P={%Vn52On(ZCbnjGM?&oE)!P zg`i+B(NgZsH?3h6d5^xwlNDZ_uLOmj3rZ)oTJ#hp-|>PJ2O+iaQU5VLp5rS=)nG&M8MiEQcI(ef!P!8v>7F}(}s+k7a?wB*ON>;Yy!P%Y{$%9wEn`gTC zI~+dv;9*aH^0zA?VqH1hgAg7qj9CFI5svV=0CCl-*7GK?@eFya*f8iZZ%hp%iXbEq zf}IuBXkf^g5p7FCIMH;*{Mbv%Jl=j5Z7_M{%4q49^#M(XKRo!+^CuZx1&8qUn1-)W z%~9bHF)2fEk^s(!qJROS2lYKRt;R=SM@7fQ1|?k2YxG3vum3 zx$A?P%0DR6d;L?;tE@xP^}*9C#yv!kcp!4eUn#0FDz;RKG+Pwt1yKzeGh~EV(J{F< z@4v7V{R{dQ1>x#EM%#rdky zp{;{csg+wF-sxSL;(pci(DuP;dC*@gf!s!ctFx3bp&<#3VH9RcmSw$(3aU0C)t2OD zxEkN5_}h5`^+gx88@<;OO))qbtQCI}N8}IR^`@lwcw0vAXr2DOlK6<+mz@&iZG8wH zh%2d?0LP3&Eh@o*3~E>vr&?zv$dsrQRWcXW^;)EO%vwe*dC}C`27{ujGfE8lwxvw> zwvFBuKI3xL@<$$hr75$$9ixi};iW>tg{SufKlp)!kAWur|S6gnh3 z+{TfP(^rZ^kRViKCTA;|qevU*0S}O6sycO;=ZYE&U&dzdfR4jV-k56rHl2Rj#vJdU zj&f$izUt(EgsOwXkQ)w^LGikP@CV9VHwddj1T4*tp^CxbU^NWLs%O@Z?>F9fmj=mK z4qO3?vW;O3+~H4&Dke?>kZwglqeF1m$_m%1CT1hA5sG-)p~}Gs>hY~@Gy3f}7GDiL zbYyT&-tl{Fus8tP{}TADe-Z>1q5%YV28fCZ4K^rIi=e@#Db=u$9e>%D*zdiu?CNZb zYL`fd6J}3#_J?jf>ith=sDMVCTfzlv<9Z?#0uL~F%i$ZVuR7VbY6zYV5L62XC18Mg4%uk&L~IQ#Ty<)mbcp%|8?SgrcbqO<@a*K5 zC%^mgjSBCWLqr)0U1E6UJc5XYC*#(TpLF=pQe^$p-_Tm-5o;hl7!es_K~qiP!Ud-$ zJ+=5ywDFGjijH%Ii=LfIe(Lu@(*l8xkvS_}!%Ef)t*5*_ z@6_mPt?=6Z&jSMRCIE09Yb-Ks0|}r~k^qRfwt)J-XTflJ$2I2CF=uwez$BE4I2D7B z<^fk&z+enb5+dYbXkzE;3xt%Z!y_2elNg3RTRUzsm+w3K7)EA2Q!RXU zbTq**8A)oO1lve6z#1H$RuL5Xub_TF0GuHpgO}3`6`>=jB*5S&JUqk^o}?Ohz$7d- zS&U#rSDGu50oX`UbaQyzlyf%E_Y8!kI`|Yv-wj`J`P}m7E1)(yOSU8gRaB#sMo7{q z>q)7M2ZbM-XFe>7pD$xCPCcwu^0LUI?7QQGF?rBR|A9 zd~7A-n$u-E*2UqZM=q<6U0CvB;>QE2;n$8?w7DcWTs-)~57Im&OwA_Hf3K-do#%71 z;|X)kcOchi={i$Ize%<@^odpQ$L$76NKr$L-xXrKPbp|K_@jIE;HgF(xk%g9Z7y{L zWP$?~;;8YqHK`XLj3Pr_FIT>N@^K(F&Bqq>s;EG>1Rd7COFv3f2DZvM zV4>8Y*-)LD?sL84wWx5zv&&yz{{9HkV9pSSdxG=|4Soh;5rA((1rD`luh@f(wEqh_ zvY=9RB-xUt=WD`ssOwnPY)>mAIP)g~x4=znm?h!Ez!42jAJ3L9_;=r~K|15kA8W|ePAPUOVe_;?DDg{qk6*-dbmUCh1 zQSQN-NF^5w;Z0a7eF7VC{J<#!JJ=fz6cL6o66X>KQ;zN4P^^<-%-=KV?eT`x86{zZ zj%j;*?sdFlChxoQ80JAd(+*uDV2E712nb>8_CY8kZy_RId=G18?`)C*MwR2U3HtaP zoZ1YBon=ymzzR%OS;$~~4iK~nTH*)dp21}5RjrPEm{X~`_UKUGU`pQAnH|RmHKz3c zU6T;1Kp1Y&e3V&ee24!jWNmrO@{LVbli|lAfZ$NmVL)S`K>f=g)WeJW=UQM?9?_hj zPmtoo@*l1X_yjem0m(UhEE=3wUQO<}KFCiy>jN3MFm=JT^Bo<7g0w5wtS}GwJQ58C zLd~HvNASrwMRx5TAr72?%|jC8Rw|1kCJ%lzpe_Qb^1;HiXV<=T_yHK;2UOTq2QHUZ z@E!S)UzqF=*ugiKp^;1>aW1s%$udNwr z*Bf51_~Zs&_`u^qA-n%3*{KT!tN(+Fe<9QVc+si5Z}gscgtR>0r{d=($4 z5t^9*V%ZC^pW&M?!?~gtKfOx(B=Q-F9u40zDqj%Bb;yp=gNS!c&ePE6h(Lj@(Czo2{}e;XdQaQ5~oWoOIba{ z=aM`$g&)Zy))HSs*s8DC6vL;;ZB&M8Z6VaEO9`{Zm*vY<9%^%8AAYwH!RRO_p4Lbl zOZo&LI!fj&C{~&9Xk$r3IMtFgLE@k|sESaJ6&lrPSyCos9aFqic|ogD1cRZFQc+Fz zz!yg3$bh+&`XKAOg4hY0*$8cX0Y;Qb`1|GN+s62k_7h(bJTMR4c}Y2s zzs=ayqEa*Cmz*>&V{XW6YS21*KR|80jrD*km9-2N1b!&KtLFFUy;`iR8`RbCs}mWL z2)T6}OZFM*sz#qK&d@HAFtpCjQvXbTPoowr%FqN{;CbNMETqOf%;6j;Ch!S9vK7;j zl5xdI5@b_fEEt7?4OqyWO$i2Iotz+F#or^CFEBJ1yL#)Q>^oig)LUD-W(*w_M%Ilj zGyGJLck5o)>Y+=*e=RvKJe#5>A`1B*9@i-t+F1mkaFQYNTOYd8hi(Yta4Il< z0G&-uG)BYMQ~*T;{5LQsnSwYx0oRkk2&c>-iijhRan~~A4cn&QK2KDFyIQH@dB|i; z%g*GXR29syn7m^vEsB_(#M% z`d#6kv2*W})&<4h_IX=A^hlUc=V57fW_!==O>Y%LUBaX~AG!IC!XCIRO$Y^^7QAD~ z$eL)Lxn`;qG!-?UF{tb{v$!;TPDiy}16z#xg{gHumX;HC9BX>{c4+9Qa7$f)r3jr+ zbeZU?H3Dd?n^_}-25c{)iP8yiD$Nrd6j0!-Y;HVzaH3^{FLcWrX9+16suP3VQt5Bi>U>q0elTM zxf3?6tf4sS#T(K0*Ag5j6g%8Cd$;p*X!_B*xt3!m>^XLK$-A?kFTfb2j|kz%P?aoC zD`OImFpXd$&Xc>SFtxs|VJ3AMDOvIZ%|Ntqe_Wts;_hyHPmbd~y_@{*`e%OnSzm{J z&KvelzjyN8^Uv$kYwM!QTsG`$y0;vLoy}>V0X>kbvgfXCcN`$g!djTic0Z31KE5|o zTjqMj{GZz7eL0c-v~G>%O^k{n9%p z_e^S8;rq)#XJT9_4NNEPzMJba!S-|O67hW>RXR6IST<5AB&^ugbN@?k`d8mgul;ln z?|bmL=i`?;|I5V|1#RyLdeeoZW;7%6w1~Q$8=SoiVR(9|znqE-yR>0Wz-%{tv(G&b zg`p9n%iSzfW~_I*D9yi>7K-xj{F;ldb(Tz8=kpyndo=-lr3JPww@{5ZhqpHWWFc(st!QVFbe< zB1i&0s_+^nM!f(*T_1rD<^wGFtazHEo+bqZ$wvlj?*t$oVm_j-pDtT4LFDrN3Gu^2 zm|)Zf_VUSrM3r>Jw#3bteU3b*!3!~9qn@UYPW2g1-Y>EiZaCHS>tVi>P~rc>?40G^ z*cX+sC9?;|AB>X@<3s4qi8?Xt5@_bcU%ybcc*B29PuG07^7VB_w#}MbdF3HBvsC&Z zI&+G^Zy$EF-ey(vu}!mG)W}xet)ru#T)C6K*IpU1g)HX{_^v;0~^2j zZaVCzTpB<7!sVcc6Zf-PeXI8DY6^~fr$|uC)_SiethPMYaCF55Y6$1!o^N$Ck6wRV zwnyjUz87;p{`YO+rvLn&ya*GB@4ygXv4zO67)La~|WTjt9{t-*07_9QIRC z)BkxnST=ti8d$Qnlzdm~0VAJ$pWv_7@zV93c4En}@ghUPgM&%v6|Pd7N4gBhSQXx8 zD}xW3^salc{>EVg+P(k$zs%Jdq<_!dluZ#Gm=G=1jn+C3bE8FzxI`z%gPj|k*-!y#v zXW8aYH}XVp?tSX}{%zCf^*?2zPdBM5Ej4|Fl1aKjI4u4o&r{7*J3&N|_6^G6tWOGR z=T`NM5&KMo8;rv_pX&2E@6F+ladR!+e_%%L4qmQHMA5{r=ORpR=vd{QY3S+vrOugy zWpe!4Z=^dK7j#V;IyAz|bn-WRQ?TRKv##W!>m&S3(L{ffH`{jHUhww(P{)WM)63uD zP2rBFXK%j@{T{(H1N}K~igq+F=$`c1;zv>D41c?2+5B@8pQDQ)7}3a0>l-%Gn-D4l?=SZ*Bg?`JaZE*sZZ_h;jp3*;& zIse8utGyHMiT3Fd3*vuV$_zzZ4qF|$*YobzXYr5v%-9={AO7&^e%`E!?*KTxLi1`XT& zG}ye=f11@1zNwr@qg0s|=t;%*xX$8}EY3(kqtw?Vf$tYX^1rqC4N@E5bK76NeU_ zpgh^vKlkf@KNoKP&ws(2le$mGe3%RE>Qrzx8+MD#V!K*3A8V$Hx|kHb#|^!K2hngu zWMDeX>Lahry7qQsm%C?mDQeE1np2+DgJLYJkdB)5R~g$teol+^M)iL?zux~Dzxks7 zk~jb9KHK-4llgnYB|u&2=1DwSH0Jui@4{s#B%ol>gXLVJ{V9=9P}R(cuR z*V=5`ENb$PTXt^t^UDLvzj^#B-TdH&RX~EaFYuyY%6>aByM53x|(BRaJ?5 z!x*yFZ?b|jr+w5<*?;%M=BGE-SY4X%^4Q0h-x7aa-TZy`&i4IxUpC1*zj)5Lu~~IP z@aAF56^FqfhVt(1%@5s^mR))9Ds3?6`;lL5n?LxcF1z-iBaJcwhy2AuO5LwA5s2tR0BkWPe7I~HN zKE)?ho_gkp)2PuF?VGuW8$NYXhqjK)7`5MGaI@g>S*=ZWPUoScyla;6&25KoZ+P1@ z^kF1@)PDX1Y*&xZHb3@^hHY^OC|-7V_PfiUm;bmp8ntCYK*_R}+3%-(sr>O| zbnTWY0ix1nt+RWYz=-V#T}eEgWsMk@`xRMB=MCt_la7F_*R4Ciu#bsD${Nh`-u~TG z6>UNn;e?rUT$#82&WxsAc{WFvuvm_4;TFGu!*3qw_Kq3W|Ecp^x@BrW<(r2S8k!t< z7R~4`9YbJNK{tQ$e3YwkYAJ*YC0|>WS6M+Gh7p`C9pN-tSXe z76hDH_H_1#%U|FA-1xh0%d&u)W$m*ErhK#cwdZ%smQ?{4mc5w$@$$Fjzb^iMwPiy< z?Xp+12gfXtnzZ{$Nd?)3z_#loj~!tKTi?Jqn5CR4XUc$*;ZA~u;`kM-jx&R+zF+&* z`TO&h4AIT&R&QpH!<oFOJ-~5Lts)JO4x}((ce(6`wArjD2I z`o%S>crE^`{v|ec(O*fO-gNg)e=2ndRLB0=g5Q)MR&7vE9~n1l@`ovs-fTRK@FN8< zNl^v6;ZMd_-cC{+m4}AVWQZOi3@?-ua8sEm1V9*D4bUfr<@$p05W_+ZbI_x|z%8-G ze5!0@$>_vCFeP!b$*Oz8XNMmLM>Y6U=;O(W_~*+{%))HVsw^HAS`>V2Ruz{XAD!ys zEQnLMqnrO=qVj-;Z+dqOFZem>_n|*Lk?42; zCo*rs^QxaqexLobSaka4Gpm6K->4xwf8YNTFA`l0c=_g|?)QDa9{>LMM<}`;@aD~$ z@?^n0mA;yOj(&>ZAK1oOrS_1USCgU$??@f>pEfwZn_=Pu{#F?%0y?eotuI(RcP_X< z;E@`3zqzm8F|uHE(jW1JLQ(V0?!%uqh<-GUuKDBjw@jqG*?V|+!_VozPySi-*BZk7 z$`DH&!2&$fQ|4AvT62#yeSJ`#{rldZ)qe+8y$l#!_Wi-H@4tzEbN)7p-UfVL_T#~5 z+Ml4m$G;q%+ZXWl&CeabpZ!Vxd;PCUG!*dT&FGFl3;v$}+woT|`VsK^u&>Gj*Yl)} zazwbjStv|m|t#frFM|cO+Z(}vW7enCm&ynkLOLPWgI20n$G2O(Cv;84Fuy`a*~W7K$^i? z;0>I}e@GdaGsmB`puKPS%V)=zCOaik` zvkzn$>Ys&`QIT2mkwq|uK3O<$!VNJk6`4g8QeiGd1S6C%@&!|uT-hwSev2WG zK*dcla%Y5!7(ze+jsQFuHfe%BUNg)SOu;XCLG+gr#{Ec0E-(RfpaC(l1Qc~}t#g5n zn?xCSm0yPj%FVScev5rJ^fC3x^KH`b^!mzO1?3EWDEg$;TQoh2G)RtOJJS`27a3X4TfYNLy!TYG6ysvo5#Q*gi?b|gw=0+ zNlr-?3&M-W%f^Hoy~%qhHs?I%L{yJ|wb-0yA)a(l zhb2QtWjo>g>(=y-g=YLOVgMUe(whxe8coevMPRy8t6>etXRrzPms_DMS6c6C*bCNj zA-N};hWDfM#oi;ggoeiU9i*R4$uln4k|MXITiB*Y7jRH^jd(7p^jkGLfXWZP*?x&S zYwsVuzb42IJOtalRF6lmez%z5h8)Dh?eyAUAQo+*M{Q&<>$!@7ROf$5&zQd{Z98 z0ml(@FP)1Jt;43M%y_9^s|0omI%rq_9o z*FL?|I3`QCff{K!3~O_*Sq7-ASS(|j0f|YVi*q3CGyM}wN^3l6N4Pxq=Gip|sO81h z7?0#a_#6Gv#*JiC!|tVJlDGsL@h!nef-n-WMk zz~*(aBb=mb+prUQ(IS$Rw7Ih*W-TlCmD5vN)J}G8J}OJ;Es>i0G&&ux*>HciYOf?( z_E$id=P`b3+*6fQODyRnWe@_yGC5D?C@=_NIFk<$ei&{ge;2z~tiFSl(jBzE;`oLuv)~h-G%AQ(Rn~g$YBwGjwHHZ+`1nwbh zKuC=zw<6l&Nx)lf3e&G(A<>Z>iZ7OpR~t#STFCtns$VBxDx1JdDRM9JUppS6t(_2z z6wFbggT29{ga)3^p(KXWSjSsAw4)((n!ke<1SWOqkf)<#s{(y#a`~n(SDvw_cFQP> zxK(^xz8rOPHL2E)qPP(cii62mX)xwbyVCYPmp=2O+`|j%n^?(=fp4M>(D7RX1zM26bZ3G+$B#$y=u(knZDEt z;&S>+Qc%O$1|e_D^Psf`sEwt`(fk)j#&&{Ujw6Ky-s61W&G$ZAgauYlcb(LSZB%)) z9#p#D3oPQrMiZ*CN+jK%9=eL9$ji0~1K85txm6au%uH%M@vTVwS)Pvi)mX;s)=|5N z7XM-bFoFm%Z-w2&9OOzCtVDr9cO6a8)eRznedI(8W-_ZGZ1yQq4*_yUIJJnlP}?0z zrDjUjVSRwgk8~u~FcK&@?V)0tcxF;yt#g#oN|(I7!x9T%#^T7ds)=yXfB*%n2v!El zjDmr$&Z7LD`qhjHf(t)l9KR}^2aPxL>48=wbAy`O&YiaVg&i?!TmHK9Tti{=?h)}t z=@wal+KR@~rZGrV2}vQ51-f!;d@z`IFb2~kS+f6@mo;9aA6;RJK!7E0T?D zAt)6k1r$^-+aQiPKv;qAL}%34#_RdgD@b!CV-Co%%%{^WFcy= zb_-k5AW26ogsQF`LwK;IUlJn}_m&@0g%|0mO;q&7lIJ#K0%NI5)m!to*OHb=Toom< zFoAuD{wewk(guk;ZlyuP0HCBmu&XB30#&Hkt)%)x%b4|yGkIpAFSs0*c8P(AXW^^! ziJ3LsCN{B%2n%gV1F#iZv3w9Xl<2q72TAD?zre$)*(^t6gKSo_fwO)HAp{yg=1B-W zM!mj}#A1asu8ZjtFP!o42oh=Zqj>3zsa3PlGJbHWZm6ll)_s8pVXoRO+1L7jI= zh}kX@TWrqN>kL65A~_18zdr&#Zh>=To;-6N{Md)50FvAsLXa8$;?{AJ1sBV$O~6bd;jE3lp)qjVJ- z2W#6?470Wd-sUe?P8>0IPNLVTCl)C_TQXt{)$a?mLn#hfE9w;c#QAO^dMC9P!<Rq2omMHIQs$4CW)C$%@0jWC*l| ztyBg_5d^1mO;njhYLPKEN)cx%0y|ZLBF}~9?o3PS&MZhTSTZS#r9IKTn>S)uW%op( zZSB>*QNF;ix;Sft%d!GaPSH8@;Zr{jlw{ox>`^7Nyp1i2nY+NztTsizY@^y+YTVyTUmU?5Sm`&8*k~WTS0xC)h|+fMK{&>^;%}?)>GeR2_*|9 z-l`L*x8np^pq^!h_^Vit)35h6|3(XKfRey^-1v#V$JJM9-#xd)K1}}(MQMAOd(Kk` zm5{9{u5hbVv0SP8qY^Yz$Bg|F_>;d`=`XZu)O}C=n)NI24+;_eENCpUV0H~cDWNN> zBZ3eXYBuvOJrzlj$I4R#YS*!~Bnt3@*y!q*el(uvQp5h4^+)j+#a%H+)SRV9)5@mQ zTVUzsoFNJ5G^eq%ozHcJN_c^_XdG)Y?RgZlo?4!!#cjV>zzU@~WG}Z5Dcc=fn$0O^ zQBLw~4eLK!KEB5lavE7HX&$0%GcGeGPZ>1AA+aTd(|WlSlVH#C(MN9aCNu*XDV*?h z`|CR&zUb508NXh6^ct{Z_E}%>cvo<=@8Y!V<>T~X@|D5uUOwy!+J{B{rwlj`HauxO zw98B`kIXJ8HsowouWpzS&%R1qmVH;>IA$Afnx{<_`zdW*_7tvpOrbzTmFd->f*Er9 z14??+#U|0ay*uB{TIsU(PT`w795oo;ryk!+BQ9BU+M*MG_wtsF^R>DapU3)fBlmaZ zR#I!Z9`ee_)hc7F&K;}}V_O3~COtoUD%YlSCu>HDZKR$HeSh{W?pk1!!{IrNICT3? z)4G^baw|RXbxdE$iik}jlysWJx*ed{T9{*;5l5Z&#;xRnL)BQkWqBhj}Ssg;~{T1)V4~#tO)Z@rZ$vT$5cw zG{c&0W;&XckF&KHOG_tQ!+v5Da4N^Waasa;FUO1fMiXj_f~Wi?f$Zo1E=J4_!39)ptYvU0SJYxOCB@ z1$RXB^P7{oL3)Q=9bI1}U23C$%ueI_#+319*E)3Tf204-7ICo{8IR}bXlr1^(85 zL^JSDS!8UYe3IJ2*Q&zhLjB@$M|tj-u;x%l+dr%$xr-#j$a&rv;LI}pMk>*sA*Nu_ z0&gV}r{79*B`_raspm__wHWp@(sJtRmzJMVFX#mV=odDFmw+PI#bJS7HKh$=t@`j} zXxzY7?-+D1ln87x9|K%f+5)I^oGFoXLrGt75Ff}%GJ`s!U@AL%3o$&qn|&tVYI9@M z#DOte&>H1T^vc5y5?;1Y!HwyxaeW-<>}+JJl|PI7-&MsJmv@QIjdx1eML9h?lNO)j zEvj{n3w#x4Yb~-|8FS#oqF(1rBd%6u&ZGL(oQpM!<6%2k#1*=m#e`c56R7DERJ1VK z0JN%#ae_*l57RbnND{Rj79O~wJC#8);7WqsdVvo(!ndd)I%;Jj&eUhzwK11?OKQh= z8>MPp&w0ZYly8xDhy$hYL5`F4aRx?4=kWh)cTC~&qthAI`8Fhd;D~zk`p%iMK%_6b zcjlHQ@yhXy*;+bbQ}v!91{LL>$0;nIgq${ zzGEu19_RGeZ!9+zv#kS-K_fAg>XswLqB~ci>d(J@p9ixC>Ql>?=YD^CL@?&S6e;y3 zX;|TmT$UNvkh1CB%un2GOfRMqh$d_sb62Y;XShD2{JMInbVAFRel0f81|)#U0B&53 z0K|a$7%<=z7%psVL{Nfy0P85_llg=i=n340Xc<9{vYVqjM{3xZhftAS zG1XDpY)>ttZJg1uwr;1otnf~LPF&P7) zRfgfjRa3R3SL6XDQ@eTbTIZ>cks&_&oWg1RRByoSEFL1>5veV{eCjL^GDCCi8+LQ< zx~`~pi!wQb5T7IN zW6k!3c0&)y!Sv8H4eIZI#Yvi4C5ZG9fNY&xxlilPa-P?$ji2mmMz9uWO~x&;U|`3y zY>phz{zH$TPS3v3X^ZYWH=l2G3H8oS#YH|~Y0*3Zz0IImYck;8?Sr^sBOC@?>>WtDPKYc1forcSBHZ%qzjsBnm`-Lm%e}w023D&vMJ>5*cDoYoO2-<(+HLWwm&- z&P3!|RwIbU`gtfXU9P8XTaz=4ICFZ~1-PR!oTGAB&?jgX~JMMc`iwo0U}(1CT1zSn0*`Xh!|n z+wcSRUL1qKxxHpTb^hk!4f1l8KoH{TY;MZb2W2#i`XH4+>KSG}mN_PGTf^=0x9UWi zS1I5zN??>IMuZt_K6Eu8=w9bLR&t3~o4Fp0R?%<@4((kfguv0D zd=0??mV?1oYC-@Z>kx$QgZ+a&x{CB*A0^}zX;@NIzO{x`d#7~f9JEM!pVL#5-0L-J zE@1}cRWv;0^c4Xm)EqQ$4(K2Wfs0Tr`M*b#z)AoEcqkEt$|epz8Uc_XP+}2D4PPD) ze>w@81yH@Xf@0>ZykkLaG5x%awcc?SmzdFc2oR-X>pQJh{KpHCF`LcT1tA9j6Ir?xBI!g`ko@~#ARbPg7!wfhWP{9%go6bOtc%h= zSainBK2bW^x8+&C(EUyB3HrwVsYLgV&;NEr_l)DcNnbmE7Hw|#PqDH;@;dLh`$)_vZ;Qw? zpvvm0?#I0EL8CE$1P8$&FFDdK0sSCm;BB|~deUA%LQALo3|jd5kMc^@9tixW)L{f_(t6cz*@zIbb60h?%2$EG;Rek!VdAqQZy@ z&_FrK2uvQR5EZC~hj66|Ah)Kq#k?VIzfD@ z++(Oh;A}CR4i{~KK}3HsxeG$`R>NTEcv+~DQp^p+3XkVc}luw(w%{mlzU5IQPTVXg*e3>Q;Jv2#NhYn-_#(sz7R4mYnZ=p)x{jm_da7wBHud|aPOd^-)c z^I*S~CN+9lTbwP7pI&DZPHaa+gW#InLCme;&7ikOs?km2?F3Kp%w0?H`EsoS#uiC2 z-iM|DR61^(rLEb=?cb4T`5U#U*}Ru*i-wSWV=W_g2&otZv}^KM5FiBMWGZ;8bufmq zokk`2q7rCjLhIO;R1ac^TpT?mU`^`{NSn9adE<=0iF$?5JftawS{O~k)}E&2&_Z< z87#w==D8n^?WH=c-ezfS^p_e2`Z<^Rj{y5soKgNuyJ@jD4|k4)WZO>D+ml0fn9*gs zbJs$cAy}&CGpnRAtinEVck_$^+YG&cd|9K2SK*jg91`kmcR+7;zNTfJj@*vVlp(hK zF0JZD1~?w0uG&ryb0(Z(DM+nitUSNL?yS`S?|{w)DW5>gi+dj==hmRxbm+z#xRjXH zgmE*3Rb%|!F7KV%+$F12Wz$%;hI8^yG|sagcXm&2Xr^7g-tzo&!9?oYkRoZG3L&5cjCIv>*HB%r2D$fJsfQ3ZJ1vwAtGn?&|mC4>x91_zjgwXSX=?>wnK5ZQN23FmyPC0^6HF z@hc+X5O)vX%)$YbiNF*eJ6%ugzi8;=xOw@ZsEwJ4?9OAAi_K1N4`tyfy1giCMqIGJ z+!q$-6F~toRosQ`lr7}BJ6amB3+PjGy0~l${=R!XBr8$#J!4Y_;SDnxR*up6u<>3A z@dZ*TStEz#78=V`Q>_k*S1==)X%Ptn0NDcQ_*M?=zk`j(v`S${WssN~8}zVzgqQ6& z&A_fee`-PO)Q1(qh+rBEP15%QRKhqU1&(~ObA)PZ6_85?RZ19KG|;w)XPgy5fi)SO zD4^6j8IzJM8RBBh1JG5_*3w|$jc;wMn3h=C95LXSVetR)bRA$#U2p%~Y*q+UKt|XB zQNom|7i7x_Lq)4LvP48hKm@DJ4MPDD!;rAlFhp<_ky^F34HOj+kyUqXR79{26l&F4 z`@NU;|D{j+G$gtAo^#$ke(%y^?iD41j-SUX`Q|0_*nr5EO_*UEKpLUaK-0WY;mQ$G5Ae$VN|Hi3GG$IcK#5=M6i4R+TM_cCrIffg7+lnLK6uNR$m&k zm!b!`QWnu6ca_=6SbEMcl#dqMOUO| zp$;v)=z5zG?ajrmSL)2d9ggdP!RJNF1Z06gZ2~%zb^@sIorEU=HyeUb;(KT*5#h)L z*HakcYQ0818jw3i#=g2piHnA8Mx0aPpw*qo5+3i3eqr-bTU3l+ku}cAT<%;q1|V=D zjFbe^7)&SuybmY2tAa@Y_JJYf{(=gWFb@SY4J3mdtpmLzoX{?Uk;W8Qb7|e`zWz># zN-#unn#597r>NN9zv*$LMq71EjO`+wn&L438(2T(#^adFi#QEOiUn6%8)LSgU@dL1 z&60lPukb(lc!kEv>J?+QTXilLuk#PAT=nK8Yo+P}Ta7El@%|lgtA|fzuk>5cqVr4f zX8-eXUksmqzcPQpRh_5B8UB~z)(xM@Ue&W;4I2Wsvx@n7Km2-8z*KF|tRw#D1!Le+vKhzO1Fs^)k**AAq%`W(?gY6fI{kt9u z%i3dOo$ZcL!385WBZ?eyTkVWW`Uwn*VevJnT^L=xq?a{I*+ewa=$Nn2!_Brwq{B9T zPD?C)VVWQRHFim&^iO1BeyDuI@KPc+L2Rk3vwvdV#_p#=2O$%D1WcE@-~Vb{{P5ZL zvH5lZx|aJZ{QKh)-_#SB+*X^W4CYdvJfAS|a2K^~A8(ydN)HcMANPThceDAZ-_b`=@jjJ1<; zy-OcKw^t!^8r)GWh{3GpLXU7VU_ac$7+98Eor?`=v|^%a>If4fYJD^ns$}1T7x3u+ zcoSGt8#-U;1nDNji6Z!vgc10cbN>?&|Gk|CZUec9pbZ*_s`hCriE~6C7idqX$&KVt zLu5xYqXZQA`GV>c!f)Y5_G~mNdb~;F+v+tj3(x4T-hbNvcH=RkQ79(g%i3v_V1EF z6S-`T&dG$!T(h8{wm~`23>eb*sT08VaoX-jXR0V=#VDpYQU5=?+Su;YuZ?B>^|G*g+BX=0IFB3Lx8ZN_4Ni(rDA64XMb9&H3u#mvQgxncL8j7Wqa1xXU=NmyL)Ldb~ zGH%!Sq;`O{3r1i@@u&27&GUZQ|GWRYxUYtPc)vd1{_4D^`$eJ||BrEd&T`Y#cq*xo z0Dew%5-Yi?NS))FOxL9tViDA>T}E2=1kpb4f|93EUANOC3xbJhcdFOxoTp#UKlQjp zVa9Uaosg;GS1^2J_thVJ=UuRWJkMKMGoOyMgqI~>j@iGO_hJ9v{{K7{X~^}2+I+U2 zQi%};GkFw|BB;%wjG@nNsQ0sg^}gwCfXU@Q@00M{7HRRs`(AU(Y%iYKBGQ5=9t8fQPJe4Eb> zLr_i;-L7v4NVuv5li2G(ZQn4?&(iZQF$n-KE3#)2np`1yfpC-|C)-$|fnZiisNP?o zzzSr@Vf~O1Ko_BVn38xMZYk4~Cji!@x`oOe-+L6%`u13v2}{dRGq&KIJmKfc;iJ{e zSjcy`6#W{3J^nTF7XycKz2zlVSGCNG9j>&-t##7TmWZ;di0OOd-?L;<>S{<9Ty zk!dq%WYnsjua-^R^eG$e%}(%hw9-FRvOK^lzGArVeM07(>yMyE&4o*CXY0AH*4q^29pFWikA*wf1gNm0*LdH_^T_sU!w|f^aZ<^#p416=M*Kp;X_)o zAZL=}rQxdn)HeiC9;K6*Y`?Y||r;fAFU;w2@!WWQ70Wt{zR2L4q zej2?mKcIhB;5Yp6;fB zYn_5%?jgZEo~8m35V`mF^~PKHHk^ohEe>TOZz1bS%RJxLts1dLm+4~^(M!1pz8$x@ zz!)fHA1DkkA=DLylH?fYMF#o@4g>@~Y0?4wmzFUd z12gk}5G?E4!>yl4|LOZ4Gdn9^-%CE_nWnY}e){%9=nT4+@!)Y`S-O`=6;XQdm|TP6 z+_zsg&+b4A3a{IO8RQB@T>~sN=Y`UM(D;_f(F>c#owE$Q4;&2;#J5I{RR>J>3U%w% zC-S|0mZ40c6HilO9iskuuUg)>kGD{?3NIy7-r6(;M8&rak7cL$xwIIpIB+sxW&FwE zUm#P?NTr^~vY;$FDs_m`3D z542x3T5+n()N1qP@?Wyel*1?<2c5Uv3fg?i<(|Q|0~fBYZ9234cJJmFE*}j<2jo|U zP3_z71f|-!8q7al$dvyd(W{mS!vJIB@Uk7W40h_sEQ8HUlVKYx}wL zUwl_~_bpTdBv5sdT8 z|BnNI1%T8MDKG_yG18dZfimS}*Qa_bCxKmyc0yn}OK!wRK~QGQqi5%);zx;>Lrwx} z5X+1;TC^FzMErJV+w9`c^RZGaQ2az*rie{*b~84dubD&(1r54UUO1%Rim^CX7;k!3 zV49KYLwWi9a0AA{Qq|EOTI5na=R(m^iR;RJ$Ggr^?{@7A`a@Dpe0Gj0a3ox9yq0;)ckIWeI>4 zi@;8xdO>Vm4Qk>vLHl6YutW+X^Y2CqFvv*T&H#`f0!0|0T?;rex0QwqOXmfGG>Uw3 zVf(mSmZ5j4Isq8H;3{xP?{G;e_nM@sS0gITnm{sIClx}PNFTbgd2&iG3uhXM>$_$) zTo&%)*^be*vB07TD4Oz5W5hB;sh!v>luf9#`lbOc0f`Q29#|gVHw?Ikej@i4!xg0q z0;`&+GB^oRCy@3?9sxKb2y`U5ra9rl1<}I?ll&G2W|DX{VGfv3es)Q0fKytEYa(?% zmdw;sG6U?TTzs_Y>16tD_in@ZQpamG<~PnxBxhW9e{2}ZnHCQ%OMF7p;D}9VrMFnQ zMIwFi$_-;gG@&tYh+@W(Tw9HOn znX3a&Ke<)*`<)%L9$y=&K|CB0R5?TF!*hONB`^I@+Ogbgn*5k$7KWT za;}a4>Xo#dNwuNKcYZHgTMRr~zV9tf3_KTKSiH#mm8WN;(Y_Vb=FX;j+h6vIvSw}1 z8-1U9f&JZ+`x>wGc2;^08cmh%2>kxZuNtqbcc!LH8U0zh``V99zrA@Kl!Lq&#`J@E zf!*z1P_PU{l~o{M7Jl_AWo~7ULBMMJEGq#s5D1$NOFR-dBwi51tFW7yoh?xZaJ) zw^*dyqMG8Pk821l1T2AyHl>?LkvHLB+OS|V8#NxW&3$y`T%mh4Ck>{)i;`&30aHXa zQcY$G06v~WuyS9%c~=O{dC!e^9=v?*Vbkk3f3kL~E}_5~LM#C`Q-pEBn&TixFbgaQ zFzKcdXUTdrZRV8c<|~XVZ4cmv-YKhZk!( zz#V2O&(G+>H3I~0Q@f3AC&V@MHmjm(=W1u3#^q2$eHM!*8uyl^=q>0niVGhP^t~E- z><_^gvcgHP_0~MG6Z%_rR6w|?By;)?PF$NY|LE{{D*)JbnA|`3>e`>?(C@($)h`_} znZNjtz`vS)d;Pgk^eOhK$sY&*3Tz83DEQ}&Xm;smlcE)ymmrIVp)MUl8)tKsB=O#Z zn(w|rHc?J^uIPKVgw;!Hrlezc_ieykxkeJ`6i=WiFJ^6f^ro7 zV(wa~EcuMah{=KwoXPRvM3fk;v5uqVU2ETv-JaEE`AOH!ZGd62H_K|va299hCw4Pi zwP=0s0!(elDON|DCLte%Ape7eKIggXB=$ji393;H_q=8w(Jk%_wNT6wo8kNTtL}i| z{DNXDX5rK>%V`&`s~?Pk+{cLZoi!_yJMq**tv&Q65rppK7@pehV+QalP0R{=oU(Q#7YFcrWsT(I<-C(IkU)CD?9h5sLNf> zCTsD>wWrbVASS~aHm2qE_)KtjNIZj#6VykTAM$9v3@BnG4O9pCkfs8V z;99X*_5kG|)RA%#1p3G@Ac;S`8COFbf{fE6TiO(10+18TcC}Wl1VEF!QHuJ)M;S=J zNEEBheMJ#13o=X47-8k)`}ta#9+E5%f^x7CC4B(XEFn>p2}l-`F|#0ukd&hk;(^#* zxD&^EO?x%>GQZAU;WOL4XvjF3;ta)__ppec8%%xM7nGSNLuO_L+ZkWG;g2*ok5(^J zvCY@kyyiOFI^Frjz9FW^B{8C2+h(1&%FwCkn_~K%WNpx`8#=iykAQwi1wALrg)xMl zo)ON5F$#fHK{0clSS+l#>37mC2+CBg5={&G!(N%qD7O!HmI zmY~Js^EKJ}`fFq;|?k!i2eOp+{HM8Bnw3hIXKvTVGnaQ#0 zqU>I;X5)1AzI`v2eKh??LiFOz+;mRSQrSYTC*{j8bCZK~C;>>aMnlyg%VTZXeM(zb z@FS*8XEo;*b%aquX^{;HPb-SuYHCA|>FD(wiL>W_6P1UW&#+&!KZ>X0lf(f6vs1=0 z&Lw)QO55Ha`Q}6r$4sScZ|^b-Ge-@Tw!*c3j%M@AN_zvPIsed%4Pd?%R6AT?Xamc@ z%mze9nyVRU(ERdPdiEchzTO>~pP6M@MNmkB<%niZQIB7enM+w+P`LE*KeP}L9%KFX zvWCXA{3f0Kcg%s#=+koiYoia7P3QzMnWsJh4V2?BSK50xIE6JT@MiNgP!UmO4 z%A1QY8C!xx?F=C`rtD0Y zSzwN65*zScqkxdid&7Ew>sboOpnP170COA)-k6i(K`~8yNWkD**BhmyyZL5auaE=( zbSt14ap`rebry3x3FD5_)aAA-Idx7XCuFVPNQn-`T`35rjEHqmwnw||1_xG|8H z6mFEjv{glcb}^>K6xvi*;=K3$T!rd5^xE9*KFW=22qK~SlqpJ3I!05dL)AEwr@4eV zL93R(?=l)q<+YDTmX`JQCNw*y>-UwU26&hsEgR}hZgx&L5CtDN6|lzqn=%02#i>49 z1oPaO?NkE_8_UK;kBx9OIU|;8g_4Pg?pNG}653FX(EME4z1}Sri#z5|9rzTGYyNZD zyUA)m<#E^#j#i%!0iSd?T?E!b!MN zuKJFtj;WwEvZgdC#*?u_)mImNP31inD@>;shni$DSYk|$xRwNJWso@e7(pRCWSz4T z$xS^a!*ccD!UVr4GxxIQpp_O2%jX4`Bm|6jG?qOG`Wz){x1=21*8MKz*O|4CgWjn} z>{+S4aZTWex&GddK`FK;lBP6+A6}+f=$9u-=LcW4NGx{>u1yFVvC66F37)XnQSKT1s^qdP;Bm*O z=l11UJabB;Pnl?ZV#7ar%a3hk*@;-cVLI1;eUxb69OK@~_UcOt9zrjwQU4LYzoKBo z=F#zpa;v0hz7da-h1gggZqjYZu|y&4BS&<$z$myjQ=UzwVTh*X{_=pnCW|OXo3_fe zA&!>cLQCq1j~E?KTOorXSM_d-^3?DIn%>AMK~1)ZozA+SzkxD{LpI`qmNPa0(MGDA zCbOBU+#TX;*;F3Y*JiPz!*b;+%bJG$qB5dR?#{F2(`aZ- z-)W0g9Sf!oeG197{JA`?FPf2smAF-nl@_k_D0^Gmb7$SYKsP5h12>ylO!R~11|@Y% zXqTBplUvuS=SuG`JDq2jbBwpVWAP%_vs&US9pXQo>?|UiDR*L$`p#Lbaa`C|wRU-j z<^A%lecxHEbzEd4trx*@{a&8c_r1k>NBcJEgXM26=R6V|P^kn|H#7@4ZgOG^;X^Pa zG&0(3h!{km&uRiDOMtG0Kx8a2NmuV`<$O`?Z)mxTrGeFp7bZ5m&3j|z;q< zYG>YeIZUo6Ue3ScW@uzp<9hV)>-{g&w2A7Ti-LKNUA`=SQS{eyy6$9fsIAq!ijv@( z_3~)w)9(#s z1Z&YG*gJS*@ywbGntV`E5?&!tG%{T5YH}8+>;>wcK@eU1!)s zD2})o{OkDE^2K-SX2U*Pi7P-ej;EEoiB{MD8^pw5Yjx$!G^inY4+51!FbGTm-KwqF z155%|4XHGc0LHy1Xf@8eL=Ebq2u*S94%kyI*bbrt2NZNN6PSD)61E^uA-*Qm<%b(v zmsRuyKOIjmcfVVo8NS520pg}G*ND_(llrr$Uj(HpU+3nd0Dfva8WUu*jB}smEqzom zt#;N>Tgj2Boy(-$lsWn&qYZqgAC=$bJ;X8})%6Sn8BA_pX0JZ2Y6S2uz z5y{NK`7h|TzJc7GLU$R2E(4fpvLaS@d|Ho%TW_n@XSauaYRIo4puO#aVJznzZL{wW zIBfu;gV?fIm?e^_ZKGZ4cE_+ZYOhf!@}d=CDP2>D!;OxO=zxiYuloM9*zLH)=4gGy zi1qIk@A?q&SePs1xWQDu^Gc!#)J!pu8w{aXCM0NSe+GX__&RFoMG#o;tpBd~Cm4#- zsnaEoaWtt6b6{uA0VBuym$ZH1~ek}oY7g8boa&1kcWJa;fAxIfyqdY=g z2A&HHVc?a)sWRcQ5l5yiVDpqJ=^@moVojeKS&YB~I1{uJ$R>DY&qWd-H%z{rh8hWN z2riJ9@h{rNnF8* zZ%#vxAc^NvIX{G*xNl_HhXz_CnScsH6x@eUou=Xx5;Bnu%FiNh2-z$2r%{!PJNQ6x ziW7opNqoK0pndOUeoSGMpL=6Zco}bb1mNX>wGsIgHs z$H6q6_MNu+jpC6P*BVnJFY&&t*J>p`3OwcXNYzS|x5f4P(Td z={wO@AGK+)shQRDc)H~pI?K&WcTjDFIuiHYl}kgoiIS)w_hySIU7G`yfgzyK%GU_l zg87J|Y!Or-xqWhhq3$uswHQl)IH2s6FTcaUl806t-Q&$<@Z*5uW7-Dm*J}S!QWaT`GH?4(x z)G_pq)@4nJ@^InQveZWz9E@u;M&(duF+?-=6$y87UHn|b_0JcCG6NfS3YLl_E2^z% zoM}DpgZCdLmT@1YG_;+nTov-0L6zh3wqp;X(rv!4T;FeRS?w5V(_$E1Zgagdso%-6 z)-kNDWo@(>IEr-SgllpER$Zpentum#FW4z}#}^DO8)B119k*aiiz{J7CRoV)K_X^} zdk85)wL1_3|BN`I`~ceeiFyew8wn2r`I2NTGmy8WMqdJ$pR|6rWA*9b!N*TU-@?e? zA_b|*jMBi!;<3}2-E*Y`qnxh=-(OID$b3`qPu>UlCgFo3VOwCcx+d~``ug=2&83Ct zlgSbFzm>eY+D#w$titc5ab8u5virS`9Z8Q6P5tpC`kl?+m7)+lQ5Gd|Z?%ZgwN*Q` zFT^jgF)H$6YeI~xtsN&1oz=D9QK8F zdD^mRj({Ve4RU`F?iw0ArQxSGzaTHr1N+l7sodVr^@2qs<2Rpaxurr=FrTM+0&9ZW zP=*2mhSkoMwqb{khr}eFh+1*+M8b;mw(Aak6B7G0AE^lEUC^?dXUx(NfAGDBRlZG? zt2>)cQs-+Y5A#UX;4?H7x-9=g!K z_Sl*9RedL4toUdvIwbEG9&1mJ)d$h!1_3p=FARtvH?EeK3}p{$JK48)~5C-jf1e3>pMGMa> zKrZs5(`*8fX?_u?un?JPnp!W#62@v(b{7?U{he&IzoYn-H|Bz`-xCg*g|%A^I~9=ad0HSxQVFFu@pz(}wa zDs?c^ddn1%FinDjYfsbu&L5@jLCPch_}n@&ghSTh)Xyq;?^vQUMs1?}i6;dNo&@t{#F5<&bhdYN}hU|R$z2l3SaC;O4VJq2e}!4rMWT8Lr-{qNl?^BGC@O*mIS!`5-w3zziZ%S#nkQ zY9wq1`N~b~8WHBS`^8$>=~SsK-<$aJ$c7w?YMW%{8l^Mzipx@Ww@Tu!i~j4x3K$AgKbP;A^?MDfL%{HNU4<5 zWCmnVo`f2O*&H|(R{{uoollSh4*^=ym#gB8YNiF$)%j6`gc)HjTb9NQHEF>@&}O72 zhY4u!sbf$vphm2{&TT^cRa}?d8q<{KL;Eay9OG=x*2hNKEvVAHzTfhyV|?4$-R@^Q z-in+;si%BbHM|r$ReKER@>MeF34!am3?Iuov9IREMH1h-*Q~P|3EXVDf4iM$RlnB3 zr`I$Sl+qrZDzNjfGGAVv*f)}p)8V(e#coB_g6nrJu6HC(b?jcTyuLTT;Acl{ zaBp%@s4y*)|NH7!D!VtRvW`BzshO4krtf>lHe*EcZ zR3G}bWKGDz<5e-&PaON@ZA#I%18Y(ieg`fH@S+?e%MG02MAbJo`e7&%%YQy#0zV|WH zX*1b^RJIj8YTr=TD}4SC&CMu*oyqj0JoUYV?^9UEQes$Rm^QJ6!WP1eydX^u$nPW~ zlQ4qp;xrt10_v%XU*3^;cO*6Eyx$is3xBEFe4UAdl;yyuH27yVxcVSF(wL<12l^l& z9sn|sc>%B+QqV=JC8X0Ce6=8C0gl~Hs9iCUL-_@t)u}m6yGM9o_dB*so!|XM_rfPt z>DMn>{@Ss1(|4D@P!>V75(hiYLujg4$k$XTDMR}r3#Z61K@D#5qS}r{W&}ND46_|P zLkH6yWk#Wn81sE6`#fTtcyYQaXZa6LAC_;s``zpppBG|M@$#;xit@D87o67`FVc_} zEx+>garyQ(w{}BAG=e_UR&|>^Rxg_ov^6Pz;Pdm~#UA(+DZjqA| z++>nn|E&Y*0M{i@tp0E4EQU%>Vk5T;B57cm(j@3M!thsfUlxJHfgK=r5EJPceHUM> z-L+_`RCaynsVyV>kheIxXpyNVfMCgI8x{#YSl&WQi}{rY2v)Uk+1c?(Yk{4c>Rv|5 z!8X%RkBT!K6DcdL6s5__J}P#i&|vDc>WFTO(#+mepY?b+*8HuG?-xzWM-rz-GIK8Z zt!r7dLV9w!=vLzIBRf7^%3pVNQKEEZu2kzGAYA@ayKZFBX6fOdqViw9%_{nSVBK>V z19tiP!(*@C?)&q5+Ioh4f%NC)j}rmGIOnq8dMo=w(oTAGX_0Kj6@u7dI`dwCd|tV} zi6A)lo5##ck}9e0qOZI9i*oJ;43xXrAC}&{-o8wYwM+j8QRVu#DlJlf#%Agt9lJLD zaCv>4{WEy-Aqe|Q>_D`iV%PU57Y;G6HC*lM6k#^u{u4GM8w{B5NU(=v59@zoKJsa{+1`#Z`6B_VMfKx3I zl=+ebK^g|?1l5Y7MU#F-V$_q~83kW0XA&Yc4kI74qA|n|d??Z4i}D1aE8nOZfJ|@( zfw*(h7@}~YtR&hw!ltW}!2$sb!~UIgF% z9fp9Yaj9}xNE+X>+IT?SiZu!{;XfgOm^e!-cWTa@A?M=c%6$nV4&=Fc>_N1Vpb@N$ z{NQf84YmA;YLFN>T$B6XZ%N0FpsC`=lKf2m>AeR6k`LDq;0LIP^LSMmd?@rio z9wr894lr|gyZH0?hIf3QYOsHB7(YmE7Z?1mL@X8QZP>|Q-;TJ9EM^teWI|o5P`^hz zj_puX?H_7Bp`lfzL|R>ll!`DUoePMB)f|MiV4j3h7bX(U7peut**Zw8LkFx{v}THO zdh+9R!R-7mOHPJ262MjjaC=-ky4d|nbKFV?BLv$=P`R)O@+7#`8UvIT+Gugk6*8x!?-{Z z5PYYEqMdRNf`OdNn7y`K<)d1E1;#y7)=jlS0Q%kx$dxHK(fV%~0}N<*4a`jC!dO!HJwi3&P#@r4HV5&L zAKWeY-*cAGxloA4LN0`boLeDT-D@{Lgs)b!FBA&=x$vZ1K&Q&boQR#cks_Rf4Jq@W zgIEoN%ujUL#omMjS4X27?m(cGg;TjrpT%5K1ra1miJnjQY%tfO4N*?f-sWb3eaNX! zh;m#|Ll0d(VX0M7(>Io|)v>G^)Ekb_P#K-$x|TWsj|KjOFo1Jl$kYx?W&F*!>YHPl zL>Ma)vK+l@j)p=ACAw0n+c2@*(LU?g0PH8?5a8`<)5;Nxut56YIRk2RC`UAeC1M%4 z_Go2Jzh9!OLv+oFffZH@&K;WSC(DJ5QS5+Si|!1Z4XK5p5*p5CfzwU_gbWp!p+-RN z5ue?U)E%g}CvL$r3#7{_-^zT^^~;4<920BKg|10jI9io+y(e+P@dl)N{~KZYKNAM* zE)ldyL;l5%Rzl+t?~pz&y?A{*@txzInx8_2EpVvhDOO|9>7GBFHw8DJJJj5o?tu+f z4$%lI6`2V@MldD}pX*HMMPuj`b{jbo`naB8z&Xj-=}=nlKthXSMor&rwcdqsjjdS)AjFBuyt$4qyaQ zVCcrc4;udy8eCW>*&Shsh6g;6vBE&W5&kC@HY`JUtv*yWlH3dTg-9I1nC4|e2lWUB zmM8ff{2R?lE1gUr#3Wp-RZ9D~6yQ0q&Gz^6e<_;(9fZioV(&T)R4 z+65?uRtB3FhG8P{>cQP}+Xt2?f?G*|4@t^|vI#5rAIL#L+JMaGgGd3Li3tF_D}-QSLLj>2a5CB2q~d^y5^^|m2uK*60_ArHnc#8q z^V~1e0(*5kG&xGo8M_*Cr}65IBTm29yc_t+YKha)wwn(&E^+u!6BPQNo5O;rfgw~< z{Mt2lWm3&9t_I~tz|)ZmD}n!4&1d+sKG%p4L4epxnFZ=C7tD~n4>vQ_$mdXn3c9%; zqhy9NnS)};=iWjP6Fvn2OI}NYNCjUB0wuCbABuNr7l5ZyV7Cn9O)@Twxk%P@R;gv& z$g}d*%C8xUNj8Arg4IM|NQnbuT|t+?NDbHzBy6YwCMHRd0;(4D8PpedN)d}SmcaO zQtA9l<#6Pr#&U)~9HemNaO4~`1OsQ?YoS!w3J?eg$XCI4kv>$GK<=1eD6m;AUFr#t zyEJ*zhhf^Lz0Ur%=3(VlbK`{hRG9fLLNtPb1A%b5OOmRb!)mQ>%n1R~Y-ItlY=pbH z$h^`x7Z?_x|9LkmTSCqecYD@u>Tv$Oy4=(vsZ6*NM>6eDDxnmFGSNcp&oY5n=>eUu z|C*?3Sw3@2X|!Zhzw^dg=Nq*xVWU{uXwRkz=N+}4VMmf8Mn%UzjM7pVF8hFPF*zJ6 zcg!$F)5S#9KdfmYQmd_IEGA`SZ&hvRjh2?^nKqEX@G>C#A4#2ZLjRY_lyH}}+7)3Z zCst^ktodbaN{UNe?H6HZCZf-sociC}8z~d3v`*>Y(%!rXM(ifs=$Ke}uJ*&2VJITy zFB_ekSgm!s=2pz+GcI>)w}gE+@rBkI{o7+H{VvaHb=)o`t*eOOn36F&Wr{kY5$k5o z6x|-!{M_Zw+TAyPZ25BL8>Ks{smiX*x_t66$xGX%8o2(obzfLd3%Mo~lxpibuZ{wm zj{>nCk0A&H+rqJ2O%lbAp8aqqKQ+MBvaTYmKPhpvBj@gm@3*@+)PZ2ffqo=+$6&ax zd)?u%n@R37=g1v!LwH?7*p;N;!aCh=8*V9gU0&C6V-)W6ZOy%yEoUJ4b~^0##GKKV zy`|eVzOLiOU8^nU&TqPZc}wnZX>}KGv`j=te|Pcz_!iMS*FAMVg(;HKD%xyrYj0&Q zE~>i{_GDsv^ecWfF16UA?Nkgc0C896rN6oq@`Ak=!G^qVG~Ii zqZdCsNZ7K{NuzG)My(I;aYxzKH?>V66PePV~!_cgzc!GL0L zrqL@=($3NEKm1DDws-NBx+h_8lX6BEwR^U!6tYX0hx4xc9uXRF)j{lmm{>-b%Aqtk zjY;x>GL(AGOyp?6;Eb4UXCS}$G7JU*X#J@FTTJRA*Qa$eVIPzBjQ*JOThF$8^em<) zak6L50U@QJGVqV1ya|-oZ)2iuuNHr(`#bEP36YjuU!k4GcB`wU4N{JaXXG{a*QRcD zQLkf#gPixsbpZSePK^(=d-Z+JEpGGB`kx|+>q!H&d-JGB& z#zWI>-KF)RgI32YX8M$#mZXQc8zJD-B$t_<4Kp^)-cI?(}Y(>qx*cyDauMLydg=kCe8A) zZY;f$LM1>b0a65NcK@Y*bGYlqy3rdSCh{|`x<7?6)0^apk2=y;2buL!ZP6lZRqg`Q zh#{yY<6@mueUw1~ziS#|QbX>)*JllSS|4$`DQbK6Amgq3U-e&y&n=3J-e*uesE2b0 zeXJYK4Q-nA$~5!PI-GvvwAHGap0>%gnT{SLuIbz?zag0DyTrrva2e!kHaneipK8w3 z1gS{_9x;-E!OvsaF>DW44KBBCaT;xd>DTEVo`;Wwe=q0A;5kTATp~Iw8x$OG&46LB zb~|c4A`Z6>#ypFP{^jEHgdOK$`mOcgDr=a1+BcS(((keHaOdC}>!J!wKGwP8p~v>a z7sJ;*J5zD{?(eDSy@%+qd{B5CMr;PZu*)*=Jb1WwFxJ=3w2HI5(6UD}PU(I=$O7?- zb~yJT$V6A=!GeV%BMw-DWVRH7e0WFn-HR_0vRpk6AHEr$ysk))YYM~W zwpM2NChKd@uEUSQw?Dg3@nH2U=bcA9MNo|j0)>ixt$7u*^Ni=+!!N^kKKowlq5kX2 zor_$)t(^%!4m;l#{JNeILrrIHBz7JDVdi1c>w%rmJ^wuXY4GdgKh6BshpHL94VAR- z^GtCNWK&~asT42j5jLTHT%Mr_p0>+2@KT4jrUV4xNLPaErFBI4W`Xt3qH~X?rgvxi zdYK-}AP<;bFPXON7tf@JiFW(k?^7@)C)fMuBXKv+THihQV$(Z6O1*boZSu{| zd{v6=+dOtgodGpfoUuRww{W{o*>{~RH1%8x5DrrR{k zck3=uJGw8TXXE4OHy7V0>`w7ks~?3_)G;C7XQ>eJA?uMtVd76lMQ=X5&)*%e#PTT2 z_SpDz^li?EW{ituwCbA!$0yDeUxYy?SxdZ+E*-pSJxTg0tUbj`0*^M|963HUGh6gA zbkB(;tB#JMoP9t)@{g%|Qd~|}lO_pC^dEQc>0T0lv;!#OMa8?-fB8u(|Lli^(c2?Q z{x9&LhC>=rq5N`_F~%M)XWHO(Vaj*j4`J$g1>@qYCu z=dX>ImL2Vjc>3&Z#RqpdN2I43nqDfxr`B65c;zdZt z#Q|(0mU;pUCMZZ>#+?SS7X$mV6kQ>nBFOG0Qw9JixHx~Q-vC!zBcK;cunl6m7wF^E zh9H?|yXYanZ+wXO``PD;fA0P>3wNTy&SN+j+2FU$amY?0mjHDwfWKE`1MtvD{*M+I ztAETBDdP~O8lp^6Wn6NJUT|y)$cu0x7!r6agbiSTTtN6DJvo&uWyx1NnzsXYk)vJ6 zpRmGpWGVtiGIb352v#{+Sq@GMfk@YabUc*7<5@~zTq+K3Yc(|)aVRd}(TMqn1r~f- z5Yqz%i?Dn-Ph%(Aw_8o3{8%a2XQrzj*<=&GxVcPoNQp=9q@-X!5ao~uq>Bx3T`ts3 z;IP%n&=j>9x^WB$j1EgAjSK`nFc_sk9OQ!_l!@!gVaaaHR+$au~Q z6#)%E$cc=Tl_K@>FWAr)yjUTuc?Q9r@0?&aDaa%c=tPtA5Tmzqj03r#;gn(84-479& zM4P)YNk3#TnIea(O`O4}lKBKB0vtwsdm0CUUs4HJ7M1dRg2Gh|%C+^8%0h>%TD4}C zl<5bc!5GqpISvWGe&< zCUvw`M78u^azA5+K(*>W?-#1{(_iN9^7%<79O5U#L68v@(y%1MGf0LBplXJP5ts(y z>%~Zs#Hw-u&5)+l(Es zZa74Ar*8fj&=(^H}hJ&y;NL#&T6TTL?1K z5$zCoPI{vG3UndwvCm7Ht~Ax2ZlpTy^M~v!K{UstQ~kO0kUiZ+L%fv7b>`TzjPf;o zRT}mVEtB52r}IRdh9ZIgq*JOsxKp=IzHP^E8}bU&YtYshW1b!wGY6rAy0-Edm4 zYI1?}0iV7=1KBz2+NvBb81dcQaDM0u-Xf`<1AX~Y?z|H!zZSgp{i@-|p)V)F#v>r7 zTTPutw~#OykV`#OE%)j!JJ4`VkU$2}NI{^0iV}pVI7Ah=(nbfmt%j-o3DtFb9hcQL z3=VDNIXfFje|4Z6(r^P0HR<0DbYr95S6&QNNrYv%lZ zshcC+meV-@x!T`*bC>aaS<;h^bT4yx zxb^y>Q#|ip4KLv!oJ7LW*R;UJd+U_ z1mc4ZD2LEYWETiq!LNMVQ`Az;u_J0fo5z_-JbS@}*oAiG?%^%%GoZx6^vJwPAL&6Sy1fR$2`jYqo7bp1ytj4Ptf{hw^rjPiiRsuTz7%O-;=E!Idg zoM9j2050ZV)Z(|IaY1BN^71k1X=gf5yU2i*udr0sI#AT_x3STAxVANHRyyTOcV1s@ z6~-F7?P1y^^nIVrbyN+BIJOi6ys8sgzZSjq`>Jut@KK(C0ltxDd!zra({zr{b(^%H&o}{frXr zceJjawJX*Q+kXPUT~eh|SGomf2q0H}^ncX2J@Vq@+R8<1q}SoQ)I0vKrPHqT`HK|( zzdPncGWV~~v|qFB(f)V-e>aLEM~#y-SeTv~bZar2@`t-yH_Y;j^}0Ot! z!o0h!r0SzxQ*qVx*1zABoNY7UGGIh-dsw~)arRCH6rO({x3ppG^olkV1Dl#a&m$VCec)y4HXSP6=}vbyZEhNk ze4e~x%ww0)mC~fZZ^^G=ksQ*>KqPHNNQd3&_5t#&O3!;nf0TY5*wyqX^37y6NvovE z1OO1AOsVq3A#L)FJ}Nj1rqWgxD2@X8q#SO?Jy;c}zI|eNhPO)^=0WFr3pK+Io(R0% zG#ep5Y}t&`3T%NKU?w-hksRXyk#OJ%59WfZ&u^Giy3E9a6X&H!D`_FZjUQ)43!CI!hl1&NO`-{=3SP?qscK$egdT_S0|xoBJ}a zIqQ-71A5ek@Vw8hqS>X&Trj$Vn9Z~iigb-9eW4Q}p2dryebP2)UbE^5qb+X?($9@;q%{1L*McK29rbul1VK5gaS~a|OJxHv+3> z?Gfd+f?3~U(;JeMpv6*UFS@-N#@@7V4EojRWqX7Cr2$@atH87e#d|MjJ)zPnfMMJF!lc6JC6VB`)y4XSSp4$Dj?(4pI73C6xiT|Hsmm zfW^4J?|1fTo2F^eZd$cVDrqy*rd6Yw_Lvgdg-XJiZ(0Z;ltP$j-&88eHf1>>q)ifM zERo0=>mi5pf5z{x>s;4y>8fwO_kExDdG6=F?+11FfmLml{g77KIcJhL-(g7GbhF2D zSy&krXah@``X1sJvCip=@4UBGxdhFBb3nyg(@^yg%?DVEn6&=YhD{GxzZ&wv!uuNI zRgBsa?9`2hD1O*&kAs+Zq@mp*U7v$hK0!ur4wd+rK?f%qkf{hz2psN^n=$;EE9GHB z{>dVwRXp#STj9O#JFdrSRSJ@%&=a;Gs01 z3so^eAm>o=*VNbqhZWjW2w3LQ+gu$V4`(+vXwjSU68}i!&ay?WBwe=X^vhshMT+8G zc8M(E%sX|Z>34m;zuXs_=6&?vV;pe!`Pq@GZ?~qT}GPE zkLvZVkL~l9TvQIV^gpzffcJS*RT30w+F7#7cTx4xpn&?{pK-ioldn_t$ssr*VjL>? z%NAA<$Xz<(U|BQELcFPjC?enr1V7b(H^y1GXWpMr!dO`*EDv~|vDjkGbXqG}T}D@_ zGHB(Sx{{DcGrQ80zAGK8>w|V)A2Mw3U0H0x%pGjkU*o}@W{!#(VE z*Pml-84s!R4XbV%3axMa%#}6YS9-hb^)iy7Bi{Vx))%@aoBN&CDZWym-`kw{=wSNX z$!5(#*>gc#_U_sl>O10S@#p z;s!r8Jpzl+sRgAnUIPmf1o!uk7EO+vun?Qmm3x=Zz^02L%R zkpb&vZd0!7uTOm>T5=~|m{%B}qQfPN#yzt#~uW4)u?&EKGgF}&OKMurv>PF#q; zWzD?cqQsjaYkC$7LGYnO-~{B@7y*==gvK#FblY}q zgH6oQcK@gvt6+lYjtUIsV%mw-a**|Kc_JA@%*7{;4*4&r;oAjkB1cS<&K8$_Vw2`6 z=HKm@w`uW>qp$okYn*~lmT9<=3{|F&Zc^D^vn*Jc2rWBDTccxY0sG2Ux{>r1L=RLF z9T!(0UEzPY#U$JA+-N#xo7`acinzFns3=Z@H~AFmsMfB zLbY~p@XbVk>*pK_D!f)0)gBJMoj5hJDQBrCge)6WK0HwWDr58QrLz?|E0)!IV-N<# zG#YYLMTSrBov93d@MgNK(w$_-r@B@JZ}EFGVwdRXa^m!g;M#`a(R%sanG=qgC$6lB zt!)c_^yXbjR-{uWj2V{__o2lnmQooYg-;@OsBzUdzgZ~QGm&W#m0oK_HV>LDUOsK* zyx&`|N~`4fe=K5h6K}=$*lh1O)n84M^{;r-*1_IXkA<6LdxoEw{>|?IX!hp`d|+N} z-|(|UxM{@@Go@a9KO46n2_ma^o&H*^pIFNn#hvs7OCB!{a?kD<}!eoXWw!DAzuBP45h!&IJEAtxj2iY}l zTYH?>p0wu&o~XSaJe>#_sH00J;siFUpXraI_ZM2rM!aFGhuyD$p^9W*M9nf)v#e5r7&&g^s_w(1e}9^Wdotq4GTM-hf`5 znEuUGN=&mw%DxJyNP;j;XL!t|=sG$m4CENn`S$*@RQlWCuZb`-ch0ro)Xl)D+E2lA zZy?DjhNx6d=tm^jJ!~-!x*bG+!W^-qV6Oh_?LYRI-ErFJDX*}aFg=v5Z^U%=cC;mK zGAR_O_fD*pi<>7@dna#5U7@`+_b#i8b#ideWZ;L|@4-Lc{3_v3Ec;$n_0BcU3A0+bM95}qs2giG5QP#h<0vKL<}m|$fJT{%)F z43GlEa4qwtv@Ho7RDcwOnque`A)F1cie*{usCIB=IwRlOyLK_|`N2DP%Nf^VLoWqX zsQ$UX1s|)wPVmD!N?!Sj-F;bQ;x^uX+_~{LMe`34&lfC5L^}XOPJmX%yiRRI&WvoA z*PxTQ?z3Lp3PmgrgM<n&aMMH0=>u15BHe zbyKL^!&zQuIKr5Lk4Tpa+K3(abqE$wM3ELdO!)Ltn4BQW&*8gyR@QL1b><;zNphnF zb8b>ZM4GnD#|TW^AX0}WYAZ;zK)5TyAt>cZj7g#~pJN8uZe z&K#jW#$-hAu?&`im>L3Zz>hEwJa_<#k@bQS(gco%QTrUF2~oMLI`Os~KMQ`79Y*1} zcUC^-Y^+-vqBBD)-8JF}B)3kpG};9f2XE2;Yq3$?y~$<{L6@ z<6mL&B1P3gzNW`zAj|zik5J9>`kh~y9y+HPEBDrUjTo3Q>~=SJWCk&{M0$Q9%jX{! z<>}ipw^^_JE9QvJ7oTch-D}rQ7hYQ743-(j4a#5E%y|@?_F7q87aU@iq&g}sL>SRZ zpFQbP8mIyjCj#(R+KUDz6$|(}JlZ(Ufyf76^^x3N7#S@RM@lrDWt(tBWZv+cr^$<6 z1Qe#*__a8mNJ(;-h2!Ccl$JVgk|&~gI;GP@r`N6QtcwbkXiJ&F2D z%8L?NvFk&uy-4V~d=~oK+lRgUrpZP~Qj5TYr5q1#fTKk@UY=)aR*u#shd@2ZbrV~P z$WjxLEfAfm(4urlk+ReR`T`*pvu6E);poe{SN=)8MEd8Umg;`Z<)dHngH1>ySVaCC zrao&pU5T$P;|-GsmNqO;S!Au)tyrA&QJ<5y)U0zsdI_iU%-G7=x-B8jNnmZ%vwZ5z z*Odf>2YA+=7a}djq)dApCJjz6duw-Q*)%(aaCvLIh5dBFi50~7^;ocoXd9$ce;~v=$&h=<(WjbU6&hq&{~J?6Q1DCX zyTInfC{X3&F`BgC|3)MU{LDb4eGGPeG@%cD#CD3d>t(w8Wv3U=Z7ly$cgXb>dk?yo zt4QcIaJ~$YH4_Q#B{-^99Vr`?h_;KiaKNB7nota%I$*}Q^zekwm#RO4*!7hm{FO5% zT=>Q55EZ2TcM5z9#3vIf6%gqogk*RDhXu4crECt8~Wy7KZG=qv$%H-b|{XRhxR zZ%&8a$p6>d7!pFrs3SWd@A~SH;2BfZ(qq2d>Xx90`sNV$$)ewV7HN}n49yqWA^ac> zD1HCJD*h(fA{i#?&X^2&j~en<5<=q?HzshrtK@98E%7&4KJGR2Wztwag!96maZ}_` zc(iZs;l|PRXG0+W=0b*DT|E|*T7Q0IIr}|^c;M{aL}Tf8+r8TvZq{*5-1kiAS3&L~ zMc}P_-P50npy}cYQz+1xJ{mH@5DE%_&~HVsVJV=pV}7I6?}N71Uk+J4vrx5M)1L&t z7>|zRkr9N{K_b0|7QDNje*;W{q41HuJ?R^uVbB_2%F!V6jnP@p({IT3+y@GVefVG1U*53+QJ7ZIN zbOLf+*Wk+f1G&p_I2J5SIZnkU0gWR~kuy(sP*;Sroi8DN$m^6-LxITDLFc+WmHvE} zzo<~q*TsxDJX(?E@_n%&cT;5}YnT&J5+n&aq;*2^?(>&=@B1yAbU1uGAIY+8xyKv> zprIYyT>mfxl3DKYIrvP!!GA;+DT*|OM2_|)K>P8iRFwUET$q)yJBCVMe11m2Ik;{&*?QmD-`-ZyIJ90>{{UACQ>Q>M28lmKTcaia^L*` z0do$oDi8i};B`nw!?Q&v8dgm0E@~@Tb>!%R0#8A)QnkLu%@`rmoNDi;yep9WI63tOv}ddT8NJ*rumLSK$$oo0w)gM6DM(ScOCM_H)V-!x-Wz5DM! z?VZgk&00BiRv{V<3fx@{N5z%L&KykR9b`5rad*#nl%9@+AipYP5s=p?u)WUotemP_ z^~|wBcl3ancUf{E$sCWCmX!yR488M1JR1zShmw3ot8#)o>uW-|4T{*%HIm1EDOsNm zaYd>ub|@fY6e@@dYj84%j1>vpM0BR^cIQJ1A&tvrtc_xxmk~K6Bh}?vWg_3w>WQGt z`YR!^4U4!(XZ%acTsb6@;C-Idm9fVUCBL!%gR^r1%1t~Gfdz^-Y1xN>T=|GnyTWR4`3+~Z|0B-F}uxf)Qx3pmex4r?7>E;r| zhk5h*%?cOTP`u05tt6=`h|k%g5N>lr7`G`Yw5)I?$s|ns)(!UopWz`HNtJxyFZu8+*7@4O!gF4Xe4WN#Wck$52a_ z6c5rsLDwKIutF^xkCjn^Ncx_;N@RAuXlhu#C+Ogj5WDHK;eGy5(XCvf%8V z7cxAb`8VYd_RGVTc$tHyH4;>k&?&k|3cw zpdtovNku!^DE%GN04{O}Ej9uj5fT$Pcy(0d^ji0N!%3UAV-ZaYw|8+A+b97(=9N~Q z6)*?EOjBu2Fu?9X>~>#o$8MtbGMmFMLUV+CPiClhjY;Ud#-h=i4Qsx%$wusJ@(o?k zh{u49E~fB+r>hR-za5C;burCWpi_X!CXi_jMKJh)N6V&g&OS zA_nIU7y$Y_RHsxye@=@P=`iJ(ekO8KCNdrw!WM6jjOc7y70O@Kc$9m0W?kvIi3n*L zEgk*^A|4@=1vi2rj)6#+6C{Fg%Xxzmay!uAW!=<;G`JDy72qbte}!#D_MrO%|3xVZ zX^Vz??RiSYQ=gjt2xT``a-+Z_(M7miR!e<=t3s(B;E1ANd_^^b&H@AHyD}Od?hrtQECXs zfHVf|)$a{H83lxJR*5S(vX9x7oTSD5$?8uF;CR zekV~-A@cgB%$LwsabN3}_Ofs2o?FqcCn0T;^P&7JNXhK-jcRV52;I=wJv!NtmU&(i z7~~vqq638r)_V={ZujfFgzixZJ_UgSf$4{IIw<3mTA2X#4V~v_qJB27Xg;E2h#wzL zyrFs~Wp`+|0aNz7KwD(~%+MP5%@%VyM7E@Q@o7(Z*(ix4Kw)`}eWTCJHgn5cx`08PjLKXIBu1n}YS0}u+JI1;)+ zLPe-k=)fVY9aK#Km~^+qg`I1h7@alS(s^;>cgi4T698#bTBO0=qz~fc5f}mpkz^NV z;X9dCG6d>39L(@y#tAR56b3D(8MHsAQQ!l8NlT5~I<@!I;rws0BSNcI{T*Rvw=2N= zZ|L;crApZIFhA@@;|uP`q^+Zua#nestqB`#Jb?dQvq_--lRh;b;xdG3i3yV+RZ)O9 zZf~84g26Zs_^T3BhpYnL<;WG^z!q)1ahChf%r@04nyX9C-V1xvIEqfP?JL(82X||f z;P6OXyvzGPCJuAwo4O#`T-*U{KE@X5S)+8SHBk%&k5*wPJ|mqHPAMVjlB82d=txG? z6M>IjvY*&MbV6QwRV;QoWh892@gMHLNq=y!_N<;d`!(z*9Nf_fzN$!*r`j3>4-K!D z<$441t!&gy)I}HbEJTV-f{11f&_B#2!#S13CmKY_Ow0r#mJgf#sy z!GwYu^fUzwiB7(*KB<|wpH+p$E#?`us)Z{wQ9_Byx!hhextLZdZy^A_-ASC$O6=EB zS2ad*SQ6_#6BgYXRgs1u^Cc(ejrPv*3VK=L22Fg%ST+U&D){Mi2dYCz5pfC1L({?x zF-yuk`AjU8QDmp-b2!c2ivIKCh-WD}0k_xm`NlT4hR(BSnm4v%{~eZ**r{-zkmjq& z^kLupRJ<`Swv*pq`CRL^+NRvkm46k-j<%+SFKyBZReZZk^}1%9Y8xI$1lFpLKqD3; zn+S*s;KsimLYa;z0~koAg$rcqc2FU&!@Y0a)%xr+EeBQRiF;45w5;Q}K*o5EBMIcu z?#}DSAZ_iQmqD&1&w-6m5N2rIb~1crlWC~x+dZW>CgL*Nu7vCSmO~ZU-85TsqAg85 zvB@q}s}YHBN?Rfh@ZbNyC@FCzTV)X4l)IU?_gTc3kb*UL+akTHtk#g0x+OK}VYiTq z3TnmKAtvj-c%{(E+LvcDLRL9=LI9c}%zQz?VN|;}zOvBX%`OgAo#I z#sT${#-gjh-nqr~I}RA=nXIljo;Tx`>0^`T?;kNxrCI~y6yww&JJYk#T zU>1rsg9siNMC#GLPrd6U`VO}8TKo#UPSNfBm8X{pa3WlH#9vM6V-AfKnfH9xH^Y_m zchhebp9mEbnFMRN>0se8C|?j7%z7U2sVQg7#r#y~{h9S7#E`R*_+wCth@oOjK!pnu z3{9w^cqUW5Sgl;8Ta5u10$DUA!ZB0Qp?=$hRIq$j4ga*&Ai-MhCGA%eHpXfcW)Au$ zSaxVeDmE8}Qq)!%6#lQIprISRONB`20MDqVMp%qli)cbUAuM8%tPP`fzGNd}0>p!U zSEOoZJQ`1DKDeEb+Tj>EzqxqK`z;ak7Ac7cJb3VGf;9Hx!~`ieTf`^QKvL~4Mqz=8nk7h0Wz-{*5)6!?Li4;t>_`w;;g4gb;jL_e!iJNS1l_yrqu8kri>FPT@jDH3WsKoL1;qi=Ab2t(&gQX1NdF28uv#L)ixR$j zMPn`h%dl*cLg${y<;_)NL5=m?Y_zP~v5K88tAPwzI2PiCgu{1t;9rC4+)1d1ky-&< zC?r1EdnR`|`|gJTU&V4-9c}4>JH1m(nRLjmm^fo9MzTX1LP~m)XXi0xFS+ITk8VV! zjD%)_sv^0~jiI5*jiaM;Nd=uZ`H^dzX^3%kG0jn35(|JP3B)u{h+oWqx zGVwl=o`<>IJ|lKsLA75vJ8)!FhyHJ}!zHSao`dK2nd=G7*yWu^=GlT(-H4z{xL)X+ zPF0slXzmP+dfTk}@L2L_=X)?&xg1Kt^!Mp|Xrpk<5Gf+XKB5U<#~bEDykVs2`RhZD zgJ(j>jz>fhI1LkR zD|FIyrwS;nwWrC}iV|C%M|m?I6#M7w{IYO$o5~MeSL`p5&3(?(5)#uj;~gdFOaUm# zM1Nt6)$NK}bPd*C`t+>xb@a!Sf-bM9>gM6lq~y-giJa6MU7FB>V@j`3n$dh3M;~e8 z__XZ?@P8?E$SAj9GB`SuZz+cDDmUQd~y@g@t1hic|NsB}ScZo*YYS zJpbjfY}yVL=z21UhDNTEwNyAnpdJ^bB6pUSh~PjNREd{6x*rL?dp`6yu(Y%w>P9m+ zm*U}`KB;Lba6^jP)Fz_awf7>$2Xu+Cx@raeV?m7H0%KO3lCp_ef~rXG<=Cdi3tuMp zqy?OBhemjUpsnWsR$V{&7})%iF4FPh>aD>Zg>At|IC2&mPKdyp;LW zcSG~}iKxGuzm08gyfO+%tqFi1hX9jtl3K0v$m8cfM*V31HO4m=mC8%oGq%W!ltlQe zcUq5COd0|So(a{qKtlw|1|b+;S&;E9eEdU!d2gpUDcz-8KU%p(HjLIcPab}Bw$Xo* zL@6^CiBMVAYLYgd_pGdBHOb8FTIaKw^c~%9(FQGyhr7*hbUvSeb1J2g;%L{@X#1IZ z|49M|@J=W$uT2kjDU}?r4B2C@rMLNhea12#(W4Bgg@qRnFmkewx5o5SUBi@y?%P?4 z8R9VQP+hb*HwpW?XUgy!B446nEnc}_-J~W-3gz^QOnz>Q+rvup2c3{YyY%SC9B%Oq z>s)RkEsnsbK%~Qz(fdFfS@79~3fv9B{zUF#jiuU^%+rcthZp<(LXiiZ#JFzi>3Pce zxvbFBBP;^X!Vm|nQ$a-TNUwmkVi5Nd(RBU7YLbUX-^^tc^mxTow*-eZG?tsLWxV!{ z=R4?USvnjTyVZf~;bgjOAbQYsWAW^rmioG$FC7gdVoVjoZ#SBc*}ZMZeA3g^+}#or zcD6C4?v%ul9UpHRDYH5(ia1!1Z4=~O7tQ*L)lm*e3H$;SFw4H!i-4k@^h0I`lO2@7r6z77c1N zzAZW@LZVk}y=k5W>{Mk$5D}kgifQ9yb+`uKV>j5Bgnxmt%RHVz~?w z=(hdyzAmk{`7Y4mWnfkh7%Hn2&h84kp8TBqp(lIoCHqx6XQljT9q~#Iz|YdoyVP@( zE%dWVC=W8B{6*l`{^6yfAA{+RLqn?$=bNj^B4auniUZYoJ{~C%@giU<7cW3M9Ks%G zbz~sA_=7Be>%L3As}`Isd3d{V>dVJHTQh%`KTt`CbcB!y)RCp-j|PJ41+4T*Ebyl9 z(=mm3#NaKmR>(HGM3_^MmK|{UNC@drWq^qn{zKlLwYi9DP3uPFds|$|dd2B7Z zyvD*5LMvh+c#$G7R1pzMNSlxX(HXiZFrT=Nu1(BFG{FP&H=Uo8a$GK-UKM<{;o+$H z+b=klX*$IjZAUb08EhZvm`y;!BG0xweAwtt{L0tdR(kn27fQOj#85jS#Kf&T+wpLs zarVpCJ=-$9UarbK3(*ccD8jK6IQUkE2`o7Y(|?9*1!2n9RXfgJ4HG9zxZfPN8(kqI zBDxXw;_V03?=$cbrI=f*6@hh%NkFY&y^c3zet{fp)y-5 zRtI^sI{2b5@5S?Q)&}7h2OM*juW3p=F`MvH^$ofOw#|5@J}XO)A72`ai_@>}QKHW0 zE2vm_D0r-u{LQWrS?pZk!63*`4UT^Nqu}aID0@GJ%_aXF{guPNaa9%_L6HJ7oJH7= zCP+nd04^bU^jn)?B8Om4u@IHzB(fMJ7A{P1FlOSY4{qnw>Tlv^GcnqB5ah5#{5TPX zM;|vH!I>Z`j@LIgHTc2K0diwa^gZn7+h3*P8~hzaDc?c^;aNB_FyKVcDQW`L2QMOG zP)pU3MTB;lOu^^gPq^WgIG#}jvqR?RZe1)3qomWzVOZ!4az%gKtivD~7$+m#1ZWeS z**YwlbVq9fzX=Sjeun+`_CHmmg{g{YJegKfI3a~Ct#JNlnF4At*px^@Xw|MF!B7QK zsSHEc!8}DR3?{KU&j~jzK8%zK>C-ZkIPZef9`etzVJ`=zBHfpA zu6c3pAOgLJtrgkxbXpa|sr(dTDE=`j2a`SXR<&_C3vwvDwSM6FgV6*!huKMO>%fVQ z)FmTA1uS(Q5>mhQdej#w@N#wBsAn=aamDWPK3zlY>Qmb7Y*)0!w>339m#{N6phhqy6B#LhGIIF2Hs{{lm1 zB84TeHhit5=dd<=eYD&|%z|Ul8+q`fM(-h>U#s!BvW2WYsWCUEx1Bd1-Jo~mf%=&a zae)r<3m?RkreP8YkrqU4ydB9EHz~*;&UHDYogUr#pln{s9QL`@iPN=R;VI6O1-uYV z-m?to+^A39L+S^Y=hO5oCA4CQbG+6?;TrGckC3DCI(wh;HnuJem+8NF<~!YlUOAms zLz~MzL{aq1LmzYMGCWV}IF@J>lh=6F80¬4Ye4vdcgkwA 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/!_VD_C4k(X=^uYVWfL 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⁣aC)w9%`$4da4;I^U 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

SZE5C6SI# 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

`N1uI340dD6`coXTOIw}ffOb!^ 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%0D>nzWr+xEotUVB=b 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 fiLyL=ZIXs19kgenoCCX$hoG!Vc7CT*O9_JgD}~ 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 *HinC#n&jO<- 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

HOdfNQwTOP$m~#6LwE=}jNZ|ga;&1So1!)p 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

#2})j0rDo7PV~4j&b`G@&|*jR~yz0 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 Answer: return answer +def _search_place_twice(s: Session, ctx: Context) -> None: + """One entity_ambiguous part asking "Congo" for each end of the flow: two + groups with one text, each option and slot token naming its group.""" + answer = s.search(PLACE_TWICE) + require(len(answer.parts) == 1, "one part") + (part,) = answer.parts + no_data = part.get("no_data", {}) + require(no_data.get("reason") == "entity_ambiguous", "an entity_ambiguous part") + require( + [group["text"] for group in no_data.get("ambiguous_entities", [])] + == ["Congo", "Congo"], + 'two ambiguous groups, each "Congo"', + ) + require( + [(o["entity_choice"], o["label"]) for o in no_data.get("options", [])] + == [(choice, label) for choice in (0, 1) for label in PLACE_LABELS], + f"each group offers {PLACE_LABELS} under its own entity_choice", + ) + require( + [ + token["entity_choice"] + for token in part.get("sentence_plan") or [] + if token.get("entity_choice") is not None + ] + == [0, 1], + "one slot token per group", + ) + + def _search_place(question: str, parts: int) -> Callable[[Session, Context], None]: def run(s: Session, ctx: Context) -> None: _place_answer(s, question, parts) @@ -1770,6 +1800,13 @@ def _resubmit_placeholder(s: Session, ctx: Context) -> None: "parts, each an entity_ambiguous choice gap with one option per country.", _search_place(TWO_PLACES, 2), ), + Recorded( + "search-place-ambiguous-twice", + "A flow naming one ambiguous place at both ends answers one no_data part with two " + "entity_ambiguous groups of the same text: each option and slot token names its group " + "by entity_choice, so a menu groups options by entity_choice, never by mentions.", + _search_place_twice, + ), Recorded( "choose-place-one-part", 'Choosing "Congo [DRC]" by label in a one-part answer posts that option\'s data_query ' @@ -2399,15 +2436,16 @@ def _accepted_running(exchanges: list[dict[str, Any]], build: dict[str, Any]) -> exchanges[0]["response"]["json"]["operation"]["status"] = "running" -# The retry_after_ms each poll that finds the build running reads in -# fetch-spec-poll-pacing-changes. The values go up, up again, then down. +# The retry_after_ms the polls that find the build running read in +# fetch-spec-poll-pacing-changes, in turn. The values go up, up again, then down. _CHANGING_PACING_MS = (2500, 4000, 1000) 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 - from _CHANGING_PACING_MS, and the wait before the next poll is that - poll's value.""" + """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) :] @@ -2415,12 +2453,16 @@ def _pacing_changes(exchanges: list[dict[str, Any]], build: dict[str, Any]) -> N and e["response"]["json"]["operation"]["status"] == "running" ] require( - len(running) == len(_CHANGING_PACING_MS), - f"{len(_CHANGING_PACING_MS)} polls find the build running", + len(running) >= len(_CHANGING_PACING_MS), + f"at least {len(_CHANGING_PACING_MS)} polls find the build running", ) - for operation, ms in zip(running, _CHANGING_PACING_MS, strict=True): + pacing = [ + _CHANGING_PACING_MS[index % len(_CHANGING_PACING_MS)] + for index in range(len(running)) + ] + for operation, ms in zip(running, pacing, strict=True): operation["retry_after_ms"] = ms - build["poll_waits"][1:] = [ms / 1000 for ms in _CHANGING_PACING_MS] + build["poll_waits"][1:] = [ms / 1000 for ms in pacing] def _operation_failed(exchanges: list[dict[str, Any]], build: dict[str, Any]) -> None: From c903517b365b2b6668bb15d649fac1f7b06b964b Mon Sep 17 00:00:00 2001 From: Jorge Rivera Date: Mon, 26 Oct 2026 08:52:53 +0100 Subject: [PATCH 02/12] fix(registry): map Presentation write refusals at the write routes' statuses (#13) * fix(registry): map Presentation write refusals at the write routes' statuses On presentation.write, binding_invalid, constraint_violation and resource_exhausted map at 400, frame_unavailable at 404 and release_mismatch at 503, the statuses the Presentation write routes serve. presentation.render keeps 422 and 409. frame_unavailable's definition names the causes it covers: a frame never stored, expired, revoked, or whose stored artifact is missing, quarantined, or fails its digest check. A frame store that fails to answer is service_unavailable, which presentation.write and presentation.render already map at 503. * fix(registry): map edit_conflict on presentation.render The render routes read the stored revision they draw, and that read refuses edit_conflict (409) when the component has no current revision. edit_conflict maps to presentation.render at 409, and its definition names that case beside a revise of a revision that is no longer current. * docs(registry): name every case frame_unavailable covers frame_unavailable's definition names each case Presentation refuses with it: a frame never stored or published, expired, or revoked, a spec in quarantine, and a stored artifact that is missing, fails its digest check, does not decode, or holds more rows than Presentation loads. --- python/spec-kit/CHANGELOG.md | 10 ++++++++++ .../src/dfo_spec_kit/registry/codes.json | 19 ++++++++++++------- registries/codes.json | 19 ++++++++++++------- 3 files changed, 34 insertions(+), 14 deletions(-) diff --git a/python/spec-kit/CHANGELOG.md b/python/spec-kit/CHANGELOG.md index c7a8ec0..4594047 100644 --- a/python/spec-kit/CHANGELOG.md +++ b/python/spec-kit/CHANGELOG.md @@ -74,6 +74,16 @@ and this package adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 `https://raw.githubusercontent.com/DevelopmentFinanceObservatory/spec-kit/main/`, with each file's path unchanged. The previous prefix named a private repository and did not resolve. +- On `presentation.write`, codes `binding_invalid`, `constraint_violation` + and `resource_exhausted` map at 400, `frame_unavailable` at 404 and + `release_mismatch` at 503, the statuses the Presentation write routes + serve. `presentation.render` keeps 422 for the first two and 409 for the + rest. `frame_unavailable` covers a frame that is not held in a state + Presentation can load, and its definition names each case. A frame store + that fails to answer is `service_unavailable`. +- Code `edit_conflict` maps to `presentation.render` at 409, for a render + of a component that has no current revision, and its definition names + that case. - Codes `identity_quarantined` (500), `service_unavailable` (503) and `internal_error` (500) map to `datasets.description` at the statuses they have on `datasets.snapshot`. diff --git a/python/spec-kit/src/dfo_spec_kit/registry/codes.json b/python/spec-kit/src/dfo_spec_kit/registry/codes.json index 0a351ae..a158e84 100644 --- a/python/spec-kit/src/dfo_spec_kit/registry/codes.json +++ b/python/spec-kit/src/dfo_spec_kit/registry/codes.json @@ -180,7 +180,7 @@ { "endpoint": "presentation.write", "channel": "problem_details", - "http_status": 422 + "http_status": 400 }, { "endpoint": "presentation.render", @@ -562,7 +562,7 @@ { "endpoint": "presentation.write", "channel": "problem_details", - "http_status": 422 + "http_status": 400 }, { "endpoint": "presentation.render", @@ -910,7 +910,7 @@ { "code": "edit_conflict", "classification": "refusal", - "definition": "A revise_component request targets a revision that is no longer the component's current one.", + "definition": "The component's current revision is not the one the request reads or targets: a revise_component request names a revision that is no longer current, or the component has no current revision.", "owning_contract": "presentation", "owner": "platform", "introduced_in": "v1", @@ -919,6 +919,11 @@ "endpoint": "presentation.write", "channel": "problem_details", "http_status": 409 + }, + { + "endpoint": "presentation.render", + "channel": "problem_details", + "http_status": 409 } ], "lifecycle": "active" @@ -1462,7 +1467,7 @@ { "code": "frame_unavailable", "classification": "refusal", - "definition": "The frame the intent's frame_ref names cannot be read at request time.", + "definition": "The frame a request names is not held in a state Presentation can load: it was never stored or published, it has expired or been revoked, its spec is quarantined, or its stored artifact is missing, fails its digest check, does not decode, or holds more rows than Presentation loads.", "owning_contract": "presentation", "owner": "platform", "introduced_in": "v1", @@ -1470,7 +1475,7 @@ { "endpoint": "presentation.write", "channel": "problem_details", - "http_status": 409 + "http_status": 404 }, { "endpoint": "presentation.render", @@ -3132,7 +3137,7 @@ { "endpoint": "presentation.write", "channel": "problem_details", - "http_status": 409 + "http_status": 503 }, { "endpoint": "presentation.render", @@ -3353,7 +3358,7 @@ { "endpoint": "presentation.write", "channel": "problem_details", - "http_status": 409 + "http_status": 400 }, { "endpoint": "presentation.render", diff --git a/registries/codes.json b/registries/codes.json index 0a351ae..a158e84 100644 --- a/registries/codes.json +++ b/registries/codes.json @@ -180,7 +180,7 @@ { "endpoint": "presentation.write", "channel": "problem_details", - "http_status": 422 + "http_status": 400 }, { "endpoint": "presentation.render", @@ -562,7 +562,7 @@ { "endpoint": "presentation.write", "channel": "problem_details", - "http_status": 422 + "http_status": 400 }, { "endpoint": "presentation.render", @@ -910,7 +910,7 @@ { "code": "edit_conflict", "classification": "refusal", - "definition": "A revise_component request targets a revision that is no longer the component's current one.", + "definition": "The component's current revision is not the one the request reads or targets: a revise_component request names a revision that is no longer current, or the component has no current revision.", "owning_contract": "presentation", "owner": "platform", "introduced_in": "v1", @@ -919,6 +919,11 @@ "endpoint": "presentation.write", "channel": "problem_details", "http_status": 409 + }, + { + "endpoint": "presentation.render", + "channel": "problem_details", + "http_status": 409 } ], "lifecycle": "active" @@ -1462,7 +1467,7 @@ { "code": "frame_unavailable", "classification": "refusal", - "definition": "The frame the intent's frame_ref names cannot be read at request time.", + "definition": "The frame a request names is not held in a state Presentation can load: it was never stored or published, it has expired or been revoked, its spec is quarantined, or its stored artifact is missing, fails its digest check, does not decode, or holds more rows than Presentation loads.", "owning_contract": "presentation", "owner": "platform", "introduced_in": "v1", @@ -1470,7 +1475,7 @@ { "endpoint": "presentation.write", "channel": "problem_details", - "http_status": 409 + "http_status": 404 }, { "endpoint": "presentation.render", @@ -3132,7 +3137,7 @@ { "endpoint": "presentation.write", "channel": "problem_details", - "http_status": 409 + "http_status": 503 }, { "endpoint": "presentation.render", @@ -3353,7 +3358,7 @@ { "endpoint": "presentation.write", "channel": "problem_details", - "http_status": 409 + "http_status": 400 }, { "endpoint": "presentation.render", From 2628d489c06f4009bb7dc4e0ce7a11c85e98df1a Mon Sep 17 00:00:00 2001 From: Jorge Rivera Date: Mon, 26 Oct 2026 08:53:38 +0100 Subject: [PATCH 03/12] fix(client-contract): read a no_data part's gap kind from its own reason (#21) A no_data part becomes a gap of its reason's gap_kind whatever diagnostics.timed_out says. Search marks every part it left unresolved at its time limit with the reason timed_out, so a part it answered before the limit keeps its reason, its message and its choices. answer-timed-out now carries reason timed_out on the unfinished part, and answer-timed-out-keeps-reasons pins a resolved part that keeps variable_not_resolved under a timed-out answer. The validator's answer_gaps reads the part's reason alone, and a new validator test pins that a diagnostics that is not an object holds no warnings. --- python/client-contract/CHANGELOG.md | 3 +- python/client-contract/README.md | 4 +- .../answer-timed-out-keeps-reasons.json | 3659 +++++++++++++++++ .../scenarios/answer-timed-out.json | 35 +- tools/capture_client_contract.py | 71 +- tools/tests/test_capture_client_contract.py | 14 +- tools/tests/test_validate_client_contract.py | 42 +- tools/validate_client_contract.py | 13 +- 8 files changed, 3782 insertions(+), 59 deletions(-) create mode 100644 python/client-contract/src/dfo_client_contract/scenarios/answer-timed-out-keeps-reasons.json diff --git a/python/client-contract/CHANGELOG.md b/python/client-contract/CHANGELOG.md index 16dc069..9e1dfce 100644 --- a/python/client-contract/CHANGELOG.md +++ b/python/client-contract/CHANGELOG.md @@ -11,11 +11,12 @@ All notable changes to the `dfo-spec-kit-client-contract` Python package will be - `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 121 scenarios: 32 recorded against the deployed dfo-apis dev app at `99e62038c`, and 89 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,186,279 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 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. - `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. - `timed_out` in `actions.json` and `registries/codes.json`, the no_data reason Search gives a part it left unresolved at the request's time limit, with action `ask_data_question` and gap kind `timed_out`, which `actions.schema.json` now admits. The client-side `timeout` code, a transport timeout, is unchanged. +- 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. diff --git a/python/client-contract/README.md b/python/client-contract/README.md index 6b00aa1..46b29ef 100644 --- a/python/client-contract/README.md +++ b/python/client-contract/README.md @@ -73,7 +73,7 @@ uv run ty check src/dfo_client_contract ## Strict fields -`strict-fields.json` lists the members a client cannot act without. Each pointer names one property of one component schema, `/components/schemas//properties/`. A `required` entry stays in its schema's `required` list and admits no null, so a client raises `ContractError` when one is missing or null. Every entry is a member some client rule acts on, and a client checks a body only along them: from the body's root it goes down through strict members alone, so a member no client reads goes unchecked, however deep. A `Spec` where no rule reads it, in `resolved.equivalent_readings`, `no_data.flagged_match` or `no_data.alternate_match`, may lack `resolved` or its definition's `identity` and raises nothing, which `answer-nested-specs-unchecked` pins at all three. A strict member that holds a JSON type its schema does not admit raises `ContractError` `contract_violation` at its pointer, as a missing one does, which `answer-candidate-specs-not-a-list` pins with `candidates.specs` as an object. An integer is a JSON number with no fractional part that is not a boolean, as JSON Schema's `integer` reads it, since a JavaScript client cannot tell `1.0` from `1`: a strict member such as a manifest definition's `schema_version`, and a ref's `definition.schema_version`, admit `1.0` and refuse `1.5` and `true`. Each item of a strict list, `parts`, `candidates.specs` or `artifacts`, must be an object, and an item of another type raises `contract_violation` at its index pointer, such as `/parts/0/candidates/specs/0`. A member a client reads that no strict pointer names, and that holds a JSON type other than the list, object or string its rule reads, reads as absent, and so does every member of a holder that is not an object; an item of another type in such a list reads as absent too. So `no_data.options` as an object or null offers no option, `mentions` as a string mentions nothing, and a `diagnostics` that is not an object holds no `timed_out` and no warnings. `answer-operations-not-a-list` pins a definite part's `operations` as an object. An item of an `assumptions` or `reading_assumptions` list reads only when it is an object whose `kind`, `binding_ref` and `text` are strings, and an item of an `operations` list only when it is an object whose `verb` and `phrase` are strings; any other item reads as absent. A read item holds its schema's members alone: an assumption's `refs` as its string items when it is a list, and an operation's `over` when it is a string or null and its `target_year` when it is null or a number other than a boolean with no fractional part, read as that integer, so `2020.0` reads and echoes as `2020` and `2020.5` reads as absent. An optional member of another type reads as absent, and a client reads no member the schema does not name. An `enums` entry keeps every listed value, the values a client branches on: the answer kinds, the part statuses and the operation statuses. A client still accepts a value no entry lists. +`strict-fields.json` lists the members a client cannot act without. Each pointer names one property of one component schema, `/components/schemas//properties/`. A `required` entry stays in its schema's `required` list and admits no null, so a client raises `ContractError` when one is missing or null. Every entry is a member some client rule acts on, and a client checks a body only along them: from the body's root it goes down through strict members alone, so a member no client reads goes unchecked, however deep. A `Spec` where no rule reads it, in `resolved.equivalent_readings`, `no_data.flagged_match` or `no_data.alternate_match`, may lack `resolved` or its definition's `identity` and raises nothing, which `answer-nested-specs-unchecked` pins at all three. A strict member that holds a JSON type its schema does not admit raises `ContractError` `contract_violation` at its pointer, as a missing one does, which `answer-candidate-specs-not-a-list` pins with `candidates.specs` as an object. An integer is a JSON number with no fractional part that is not a boolean, as JSON Schema's `integer` reads it, since a JavaScript client cannot tell `1.0` from `1`: a strict member such as a manifest definition's `schema_version`, and a ref's `definition.schema_version`, admit `1.0` and refuse `1.5` and `true`. Each item of a strict list, `parts`, `candidates.specs` or `artifacts`, must be an object, and an item of another type raises `contract_violation` at its index pointer, such as `/parts/0/candidates/specs/0`. A member a client reads that no strict pointer names, and that holds a JSON type other than the list, object or string its rule reads, reads as absent, and so does every member of a holder that is not an object; an item of another type in such a list reads as absent too. So `no_data.options` as an object or null offers no option, `mentions` as a string mentions nothing, and a `diagnostics` that is not an object holds no warnings. `answer-operations-not-a-list` pins a definite part's `operations` as an object. An item of an `assumptions` or `reading_assumptions` list reads only when it is an object whose `kind`, `binding_ref` and `text` are strings, and an item of an `operations` list only when it is an object whose `verb` and `phrase` are strings; any other item reads as absent. A read item holds its schema's members alone: an assumption's `refs` as its string items when it is a list, and an operation's `over` when it is a string or null and its `target_year` when it is null or a number other than a boolean with no fractional part, read as that integer, so `2020.0` reads and echoes as `2020` and `2020.5` reads as absent. An optional member of another type reads as absent, and a client reads no member the schema does not name. An `enums` entry keeps every listed value, the values a client branches on: the answer kinds, the part statuses and the operation statuses. A client still accepts a value no entry lists. The answer's `kind` and each part's `status` are the discriminators of their unions in the served document. A search response with no `kind` raises `ContractError`, as a part with no `status` does, although the served document gives `kind` a default and leaves it out of `required`. A part `status` a client does not know raises nothing and makes the part an `unknown` gap. An answer `kind` a client does not know raises `ContractError`, because the client cannot read the answer. A Search response body that is not an object, a `resolution` answer whose `parts` is empty, at pointer `/parts`, since the served schema gives it at least one item, a part whose `status` is not a string, at pointer `/parts//status`, and a definite or candidate spec whose `definition.spec_id` differs from its `spec_id` raise `ContractError` `contract_violation`, in a Search response as in a ref; `search-body-not-an-object`, `answer-empty-parts`, `answer-part-status-not-a-string` and `answer-definition-spec-id-mismatch` pin the four. @@ -114,7 +114,7 @@ A client maps a refusal whose code has no row, or that carries no code, on its H A 408 is a timeout the caller retries, and a 410 names a resource that is gone, so the caller stops as it does on a 404. A client reads a refusal's body as a problem document when its content type is `application/problem+json` or `application/json`; a body of any other type reads as no body, so the refusal carries no code. A no_data reason with no row becomes a `no_data` gap. -An answer's gaps follow from its parts. A candidates part is a `choice` gap, its options the candidates. A no_data part is a gap of its reason's `gap_kind`, its options the no_data `options`, and of kind `timed_out` instead when the answer's `diagnostics.timed_out` is true. An unsupported part is an `unsupported` gap. A part whose status a client does not know is an `unknown` gap. +An answer's gaps follow from its parts. A candidates part is a `choice` gap, its options the candidates. A no_data part is a gap of its reason's `gap_kind`, its options the no_data `options`, whatever `diagnostics.timed_out` says. Search marks a part it left unresolved at its time limit with the reason `timed_out`. An unsupported part is an `unsupported` gap. A part whose status a client does not know is an `unknown` gap. ## Client codes 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 new file mode 100644 index 0000000..c6897d5 --- /dev/null +++ b/python/client-contract/src/dfo_client_contract/scenarios/answer-timed-out-keeps-reasons.json @@ -0,0 +1,3659 @@ +{ + "format_version": 1, + "name": "answer-timed-out-keeps-reasons", + "description": "A no_data part's gap kind comes from its own reason, whatever diagnostics.timed_out says. A part Search resolved before its time limit keeps its reason's gap kind, and fetching the answer raises IncompleteAnswerError.", + "origin": { + "kind": "synthetic", + "derived_from": "answer-mixed-fetch-raises", + "edit": "The answer's diagnostics.timed_out becomes true, part 1 keeps its reason variable_not_resolved, and its response carries x-dfo-trace-id 55555555555555555555555555555555." + }, + "call": [ + { + "op": "search", + "question": "debt service of Kenya and the price of tea in Kenya" + }, + { + "op": "fetch" + } + ], + "exchanges": [ + { + "request": { + "method": "POST", + "path": "/search/resolve", + "json": { + "schema_version": 1, + "input": { + "kind": "raw_text", + "query": "debt service of Kenya and the price of tea in Kenya" + } + } + }, + "response": { + "status": 200, + "headers": { + "content-type": "application/json", + "x-dfo-trace-id": "55555555555555555555555555555555" + }, + "json": { + "schema_version": 1, + "query_echo": { + "entry_path": "raw_text", + "raw_query": "debt service of Kenya and the price of tea in Kenya", + "normalized_query": "debt service of Kenya and the price of tea in Kenya", + "extract_skipped": false + }, + "diagnostics": { + "engine_build": "99e62038ceb4b459c2ac699549076ff123c166aa", + "trace_id": "38ca03326c514418af8164d5740ec677", + "warnings": [], + "timing_ms": { + "total": 492, + "by_step": { + "coverage": 0, + "extract": 1, + "cache_lookup": 0 + } + }, + "llm_usage": { + "input_tokens": 0, + "output_tokens": 0, + "cached_tokens": 0, + "jev_input_tokens": 5250, + "jev_output_tokens": 1104 + }, + "timed_out": true + }, + "kind": "resolution", + "parts": [ + { + "variable_text": "debt service", + "warnings": [], + "timing_ms": { + "total": 486, + "by_step": { + "recall": 0, + "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_admission": 0, + "phase_derive_shapes": 0, + "shape": 219, + "phase_prune_and_rank": 0, + "bind": 112, + "phase_bind": 14, + "phase_settle": 5, + "phase_place_bindings": 12, + "phase_facet_requests": 0, + "materialise": 11, + "phase_materialise": 23, + "answer": 2, + "options": 8, + "phase_outcome": 80 + } + }, + "restatement": { + "variable_text": "debt service", + "entities": [ + { + "text": "Kenya" + } + ], + "sources": [], + "operations": [] + }, + "entity_refs": [ + { + "text": "Kenya", + "refs": [ + "country/KEN" + ] + } + ], + "operations": [], + "departures": [], + "assumptions": [ + { + "kind": "open_role", + "binding_ref": "origin:", + "text": "every creditor", + "refs": [] + } + ], + "status": "definite", + "spec": { + "spec_id": "spec_78d04fefc3b3f1ef71acd622957e4995", + "definition": { + "schema_version": 1, + "spec_id": "spec_78d04fefc3b3f1ef71acd622957e4995", + "identity": { + "identity_version": "spec1", + "shape": { + "kind": "statvar_schema", + "population_type": "FinancialFlow", + "measured_property": "amount", + "stat_type": "measuredValue", + "measurement_qualifier": "Nominal" + }, + "slots": [ + { + "property": "financialFlowType", + "binding": { + "state": "value", + "ref": "ServicingPayment" + } + }, + { + "property": "financingResource", + "binding": { + "state": "unbound" + } + }, + { + "property": "guaranteeStatus", + "binding": { + "state": "unbound" + } + }, + { + "property": "idsConcessionality", + "binding": { + "state": "unbound" + } + }, + { + "property": "idsCreditorType", + "binding": { + "state": "unbound" + } + }, + { + "property": "idsDebtorType", + "binding": { + "state": "unbound" + } + }, + { + "property": "includesIMFCredit", + "binding": { + "state": "unbound" + } + }, + { + "property": "maturityBand", + "binding": { + "state": "unbound" + } + } + ], + "entities": { + "destination": [ + "country/KEN" + ] + }, + "requested_window": { + "kind": "all" + } + } + }, + "resolved": { + "shape": { + "shape_id": "financialflow_amount_measuredvalue_nominal_by_role", + "label": "Debt service on external debt", + "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": "financialFlowType", + "label": "financial flow type" + }, + "label": "financial flow type" + }, + { + "axis": "how", + "property": { + "ref": "financingResource", + "label": "financing resource" + }, + "label": "financing resource" + }, + { + "axis": "how", + "property": { + "ref": "guaranteeStatus", + "label": "guarantee status" + }, + "label": "guarantee status" + }, + { + "axis": "how", + "property": { + "ref": "idsDebtorType", + "label": "IDS debtor type" + }, + "label": "IDS debtor type" + }, + { + "axis": "how", + "property": { + "ref": "idsCreditorType", + "label": "IDS creditor type" + }, + "label": "IDS creditor type" + }, + { + "axis": "how", + "property": { + "ref": "idsConcessionality", + "label": "IDS concessionality" + }, + "label": "IDS concessionality" + }, + { + "axis": "how", + "property": { + "ref": "includesIMFCredit", + "label": "includes IMF credit" + }, + "label": "includes IMF credit" + }, + { + "axis": "how", + "property": { + "ref": "maturityBand", + "label": "maturity band" + }, + "label": "maturity band" + }, + { + "axis": "where", + "label": "place" + }, + { + "axis": "when", + "label": "time window" + }, + { + "axis": "source", + "label": "data source" + } + ], + "member_count": 65, + "member_digest": "b66541c53125ee32113e51b4f52a3a428043b5506e15f96277f37b89547fc1c4", + "refine_supported": true, + "data_commons": [ + { + "id": "dfo", + "label": "Development Finance Observatory" + } + ] + }, + "slots": [ + { + "key": { + "axis": "how", + "property": { + "ref": "financialFlowType", + "label": "financial flow type" + }, + "label": "financial flow type" + }, + "binding": { + "kind": "value", + "value": { + "ref": { + "ref": "ServicingPayment", + "label": "servicing payment" + }, + "value_kind": "enum_value" + } + }, + "summable": false + }, + { + "key": { + "axis": "how", + "property": { + "ref": "financingResource", + "label": "financing resource" + }, + "label": "financing resource" + }, + "binding": { + "kind": "unbound" + }, + "summable": false + }, + { + "key": { + "axis": "how", + "property": { + "ref": "guaranteeStatus", + "label": "guarantee status" + }, + "label": "guarantee status" + }, + "binding": { + "kind": "unbound" + }, + "summable": false + }, + { + "key": { + "axis": "how", + "property": { + "ref": "idsDebtorType", + "label": "IDS debtor type" + }, + "label": "IDS debtor type" + }, + "binding": { + "kind": "unbound" + }, + "summable": false + }, + { + "key": { + "axis": "how", + "property": { + "ref": "idsCreditorType", + "label": "IDS creditor type" + }, + "label": "IDS creditor type" + }, + "binding": { + "kind": "unbound" + }, + "summable": false + }, + { + "key": { + "axis": "how", + "property": { + "ref": "idsConcessionality", + "label": "IDS concessionality" + }, + "label": "IDS concessionality" + }, + "binding": { + "kind": "unbound" + }, + "summable": false + }, + { + "key": { + "axis": "how", + "property": { + "ref": "includesIMFCredit", + "label": "includes IMF credit" + }, + "label": "includes IMF credit" + }, + "binding": { + "kind": "unbound" + }, + "summable": false + }, + { + "key": { + "axis": "how", + "property": { + "ref": "maturityBand", + "label": "maturity band" + }, + "label": "maturity band" + }, + "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": "unbound" + }, + "summable": false + }, + { + "key": { + "axis": "source", + "label": "data source" + }, + "binding": { + "kind": "unbound" + }, + "summable": false + } + ], + "inapplicable_slots": [ + "financingResource", + "guaranteeStatus", + "idsDebtorType", + "idsCreditorType", + "idsConcessionality", + "includesIMFCredit", + "maturityBand" + ], + "unresolved_slots": [], + "stat_vars": { + "member_count": 1, + "member_count_exact": false, + "served_count": 1, + "data_date_range": { + "start": "1970", + "end": "2024" + }, + "source_codes": [ + { + "provenance": "provenance/WorldBankInternationalDebtStatistics", + "code": "DT.TDS.DECT.CD", + "exact": true + } + ] + }, + "entities": [ + { + "ref": "country/KEN", + "label": "Kenya", + "entity_type": "Country", + "role": "destination" + } + ], + "coverage": { + "kind": "exact", + "has_data": true, + "observation_count": 55, + "evidence": "facet_metadata", + "dimensions": [ + { + "label": "sources", + "count": 1 + }, + { + "label": "observations", + "count": 55 + }, + { + "label": "variables", + "count": 1 + } + ] + }, + "headline": { + "year": 2024, + "year_named": false, + "observations": 1, + "series": 1, + "role_counts": { + "financingRecipient": 1 + }, + "recent_years": [ + { + "year": 2024, + "observations": 1, + "series": 1, + "role_counts": { + "financingRecipient": 1 + } + }, + { + "year": 2023, + "observations": 1, + "series": 1, + "role_counts": { + "financingRecipient": 1 + } + }, + { + "year": 2022, + "observations": 1, + "series": 1, + "role_counts": { + "financingRecipient": 1 + } + } + ] + }, + "download": { + "rows": 55, + "rows_exact": true, + "series": 1, + "window": { + "start_year": 1970, + "end_year": 2024 + }, + "licence": { + "label": "Creative Commons Attribution License" + } + }, + "coverage_stamp": "e6e717ab8c77e84d010915893ede5809e9ecec67929a07cfafbcc2210edfa1eb", + "facets": { + "provenance": { + "basis": "fallback", + "ref": "provenance/WorldBankInternationalDebtStatistics", + "label": "World Bank International Debt Statistics (IDS)", + "source": { + "ref": "dc/s/WorldBank", + "label": "World Bank" + }, + "data_commons": { + "id": "dfo", + "label": "Development Finance Observatory" + }, + "documentation": "/api/graph/documentation/provenance/WorldBankInternationalDebtStatistics" + }, + "unit": { + "basis": "fallback", + "ref": "CurrencyUSD", + "label": "US Dollar", + "currency": "USD" + } + }, + "slot_options": [ + { + "key": { + "axis": "how", + "property": { + "ref": "financialFlowType", + "label": "financial flow type" + }, + "label": "financial flow type" + }, + "options": [ + { + "value": { + "ref": { + "ref": "ServicingPayment", + "label": "servicing payment" + }, + "value_kind": "enum_value" + } + } + ], + "truncated": true, + "source": "observed" + }, + { + "key": { + "axis": "how", + "property": { + "ref": "guaranteeStatus", + "label": "guarantee status" + }, + "label": "guarantee status" + }, + "options": [ + { + "value": { + "ref": { + "ref": "PublicOrPubliclyGuaranteed", + "label": "public or publicly guaranteed" + }, + "value_kind": "enum_value" + }, + "served_rows": 63, + "served_rows_exact": false + }, + { + "value": { + "ref": { + "ref": "NotPubliclyGuaranteed", + "label": "not publicly guaranteed" + }, + "value_kind": "enum_value" + }, + "served_rows": 56, + "served_rows_exact": false + } + ], + "truncated": true, + "source": "observed" + }, + { + "key": { + "axis": "how", + "property": { + "ref": "idsDebtorType", + "label": "IDS debtor type" + }, + "label": "IDS debtor type" + }, + "options": [ + { + "value": { + "ref": { + "ref": "IDSDebtorTypePS", + "label": "public sector (IDS debtor type)" + }, + "value_kind": "enum_value" + }, + "served_rows": 63, + "served_rows_exact": false + }, + { + "value": { + "ref": { + "ref": "IDSDebtorTypeGG", + "label": "general government (IDS debtor type)" + }, + "value_kind": "enum_value" + }, + "served_rows": 63, + "served_rows_exact": false + }, + { + "value": { + "ref": { + "ref": "IDSDebtorTypeOPS", + "label": "other public sector (IDS debtor type)" + }, + "value_kind": "enum_value" + }, + "served_rows": 63, + "served_rows_exact": false + }, + { + "value": { + "ref": { + "ref": "IDSDebtorTypePrivateSector", + "label": "private sector (IDS debtor type)" + }, + "value_kind": "enum_value" + }, + "served_rows": 56, + "served_rows_exact": false + } + ], + "truncated": true, + "source": "observed" + }, + { + "key": { + "axis": "how", + "property": { + "ref": "idsCreditorType", + "label": "IDS creditor type" + }, + "label": "IDS creditor type" + }, + "options": [ + { + "value": { + "ref": { + "ref": "IDSCreditorTypePROP", + "label": "other private creditors (IDS creditor type)" + }, + "value_kind": "enum_value" + }, + "served_rows": 46, + "served_rows_exact": true + }, + { + "value": { + "ref": { + "ref": "IDSCreditorTypePBND", + "label": "bondholders (IDS creditor type)" + }, + "value_kind": "enum_value" + }, + "served_rows": 31, + "served_rows_exact": false + }, + { + "value": { + "ref": { + "ref": "IDSCreditorTypePRVT", + "label": "private creditors (IDS creditor type)" + }, + "value_kind": "enum_value" + }, + "served_rows": 63, + "served_rows_exact": false + }, + { + "value": { + "ref": { + "ref": "IDSCreditorTypeOFFT", + "label": "official creditors (IDS creditor type)" + }, + "value_kind": "enum_value" + }, + "served_rows": 55, + "served_rows_exact": true + }, + { + "value": { + "ref": { + "ref": "IDSCreditorTypeMLAT", + "label": "multilateral (IDS creditor type)" + }, + "value_kind": "enum_value" + }, + "served_rows": 63, + "served_rows_exact": false + } + ], + "truncated": true, + "source": "observed" + }, + { + "key": { + "axis": "how", + "property": { + "ref": "idsConcessionality", + "label": "IDS concessionality" + }, + "label": "IDS concessionality" + }, + "options": [ + { + "value": { + "ref": { + "ref": "IDSConcessional", + "label": "concessional (IDS concessionality)" + }, + "value_kind": "enum_value" + }, + "served_rows": 118, + "served_rows_exact": false + } + ], + "truncated": true, + "source": "observed" + }, + { + "key": { + "axis": "how", + "property": { + "ref": "includesIMFCredit", + "label": "includes IMF credit" + }, + "label": "includes IMF credit" + }, + "options": [ + { + "value": { + "ref": { + "ref": "WithoutIMFCredit", + "label": "without IMF credit" + }, + "value_kind": "enum_value" + }, + "served_rows": 63, + "served_rows_exact": false + } + ], + "truncated": true, + "source": "observed" + }, + { + "key": { + "axis": "how", + "property": { + "ref": "maturityBand", + "label": "maturity band" + }, + "label": "maturity band" + }, + "options": [ + { + "value": { + "ref": { + "ref": "LongTermMaturity", + "label": "long-term maturity" + }, + "value_kind": "enum_value" + }, + "served_rows": 63, + "served_rows_exact": false + } + ], + "truncated": true, + "source": "observed" + } + ], + "entity_options": [], + "facet_options": [ + { + "axis": "provenance", + "options": [ + { + "value": { + "ref": { + "ref": "provenance/WorldBankInternationalDebtStatistics", + "label": "World Bank International Debt Statistics (IDS)" + }, + "value_kind": "source" + } + } + ], + "truncated": false, + "source": "observed" + }, + { + "axis": "measurementMethod", + "options": [ + { + "value": { + "value_kind": "enum_value" + } + }, + { + "value": { + "ref": { + "ref": "Estimated", + "label": "estimated" + }, + "value_kind": "enum_value" + } + } + ], + "truncated": false, + "source": "observed" + }, + { + "axis": "unit", + "options": [ + { + "value": { + "ref": { + "ref": "CurrencyUSD", + "label": "US Dollar" + }, + "value_kind": "enum_value" + } + } + ], + "truncated": false, + "source": "observed" + } + ], + "rendered_sentence": "Kenya's external debt service owed to all creditors, 1970 to 2024. Current US dollars · World Bank International Debt Statistics (IDS).", + "sentence_plan": [ + { + "kind": "slot", + "text": "Kenya", + "axis": "where", + "segment": "heading", + "role": "destination", + "binding_ref": "where:", + "entity_refs": [ + "country/KEN" + ], + "states": [ + "where:" + ] + }, + { + "kind": "text", + "text": "'s", + "segment": "heading", + "entity_refs": [], + "states": [] + }, + { + "kind": "text", + "text": " ", + "segment": "heading", + "entity_refs": [], + "states": [] + }, + { + "kind": "slot", + "text": "external debt service", + "axis": "what", + "segment": "heading", + "entity_refs": [], + "states": [ + "how:financialFlowType", + "axis:populationType", + "axis:measuredProperty", + "axis:statType" + ] + }, + { + "kind": "text", + "text": " owed to ", + "segment": "heading", + "entity_refs": [], + "states": [] + }, + { + "kind": "slot", + "text": "all creditors", + "segment": "heading", + "role": "origin", + "binding_ref": "origin:", + "entity_refs": [], + "states": [ + "origin:" + ] + }, + { + "kind": "slot", + "text": "", + "axis": "how", + "segment": "heading", + "property_dcid": "financingResource", + "binding_ref": "how:financingResource", + "entity_refs": [], + "states": [] + }, + { + "kind": "slot", + "text": "", + "axis": "how", + "segment": "heading", + "property_dcid": "guaranteeStatus", + "binding_ref": "how:guaranteeStatus", + "entity_refs": [], + "states": [] + }, + { + "kind": "slot", + "text": "", + "axis": "how", + "segment": "heading", + "property_dcid": "idsConcessionality", + "binding_ref": "how:idsConcessionality", + "entity_refs": [], + "states": [] + }, + { + "kind": "slot", + "text": "", + "axis": "how", + "segment": "heading", + "property_dcid": "idsCreditorType", + "binding_ref": "how:idsCreditorType", + "entity_refs": [], + "states": [] + }, + { + "kind": "slot", + "text": "", + "axis": "how", + "segment": "heading", + "property_dcid": "idsDebtorType", + "binding_ref": "how:idsDebtorType", + "entity_refs": [], + "states": [] + }, + { + "kind": "slot", + "text": "", + "axis": "how", + "segment": "heading", + "property_dcid": "includesIMFCredit", + "binding_ref": "how:includesIMFCredit", + "entity_refs": [], + "states": [] + }, + { + "kind": "slot", + "text": "", + "axis": "how", + "segment": "heading", + "property_dcid": "maturityBand", + "binding_ref": "how:maturityBand", + "entity_refs": [], + "states": [] + }, + { + "kind": "slot", + "text": "", + "axis": "how", + "segment": "heading", + "property_dcid": "financialFlowType", + "binding_ref": "how:financialFlowType", + "entity_refs": [], + "states": [] + }, + { + "kind": "text", + "text": ", ", + "segment": "heading", + "entity_refs": [], + "states": [] + }, + { + "kind": "slot", + "text": "1970 to 2024", + "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": "World Bank International Debt Statistics (IDS)", + "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/WorldBankInternationalDebtStatistics", + "label": "World Bank International Debt Statistics (IDS)", + "source": { + "ref": "dc/s/WorldBank", + "label": "World Bank" + }, + "data_commons": { + "id": "dfo", + "label": "Development Finance Observatory" + }, + "documentation": "/api/graph/documentation/provenance/WorldBankInternationalDebtStatistics" + } + ], + "slot_filters": [ + { + "key": { + "axis": "how", + "property": { + "ref": "financialFlowType", + "label": "financial flow type" + }, + "label": "financial flow type" + }, + "binding_kind": "value", + "refs": [ + { + "ref": "ServicingPayment", + "label": "servicing payment" + } + ], + "provenance": "binder" + }, + { + "key": { + "axis": "how", + "property": { + "ref": "financingResource", + "label": "financing resource" + }, + "label": "financing resource" + }, + "binding_kind": "unbound", + "refs": [], + "provenance": "binder" + }, + { + "key": { + "axis": "how", + "property": { + "ref": "guaranteeStatus", + "label": "guarantee status" + }, + "label": "guarantee status" + }, + "binding_kind": "unbound", + "refs": [], + "provenance": "binder" + }, + { + "key": { + "axis": "how", + "property": { + "ref": "idsDebtorType", + "label": "IDS debtor type" + }, + "label": "IDS debtor type" + }, + "binding_kind": "unbound", + "refs": [], + "provenance": "binder" + }, + { + "key": { + "axis": "how", + "property": { + "ref": "idsCreditorType", + "label": "IDS creditor type" + }, + "label": "IDS creditor type" + }, + "binding_kind": "unbound", + "refs": [], + "provenance": "binder" + }, + { + "key": { + "axis": "how", + "property": { + "ref": "idsConcessionality", + "label": "IDS concessionality" + }, + "label": "IDS concessionality" + }, + "binding_kind": "unbound", + "refs": [], + "provenance": "binder" + }, + { + "key": { + "axis": "how", + "property": { + "ref": "includesIMFCredit", + "label": "includes IMF credit" + }, + "label": "includes IMF credit" + }, + "binding_kind": "unbound", + "refs": [], + "provenance": "binder" + }, + { + "key": { + "axis": "how", + "property": { + "ref": "maturityBand", + "label": "maturity band" + }, + "label": "maturity band" + }, + "binding_kind": "unbound", + "refs": [], + "provenance": "binder" + }, + { + "key": { + "axis": "where", + "label": "place" + }, + "binding_kind": "value", + "refs": [ + { + "ref": "country/KEN", + "label": "Kenya" + } + ], + "provenance": "binder" + }, + { + "key": { + "axis": "when", + "label": "time window" + }, + "binding_kind": "unbound", + "refs": [], + "provenance": "binder" + }, + { + "key": { + "axis": "source", + "label": "data source" + }, + "binding_kind": "unbound", + "refs": [], + "provenance": "binder" + } + ], + "query_qualifiers": [], + "capability_version": "cap_88defe77cc79e0c0", + "default_reading": { + "applied": true, + "removed_stat_vars": [] + } + }, + "confidence": "high", + "available_at_place": true, + "measure_label_axes": [], + "measure_axis_values": [], + "unit_conversion": { + "currencies": [ + { + "code": "AED", + "noun": "UAE dirhams", + "current_years": { + "start_year": 1980, + "end_year": 2024 + }, + "constant_years": { + "start_year": 1980, + "end_year": 2024 + }, + "base_year_min": 1980, + "base_year_max": 2025 + }, + { + "code": "AFN", + "noun": "Afghan afghanis", + "current_years": { + "start_year": 2002, + "end_year": 2024 + }, + "constant_years": { + "start_year": 1980, + "end_year": 2024 + }, + "base_year_min": 2002, + "base_year_max": 2025 + }, + { + "code": "ALL", + "noun": "Albanian leks", + "current_years": { + "start_year": 1980, + "end_year": 2024 + }, + "constant_years": { + "start_year": 1980, + "end_year": 2024 + }, + "base_year_min": 1980, + "base_year_max": 2025 + }, + { + "code": "AMD", + "noun": "Armenian drams", + "current_years": { + "start_year": 1992, + "end_year": 2024 + }, + "constant_years": { + "start_year": 1980, + "end_year": 2024 + }, + "base_year_min": 1992, + "base_year_max": 2025 + }, + { + "code": "AOA", + "noun": "Angolan kwanzas", + "current_years": { + "start_year": 1991, + "end_year": 2024 + }, + "constant_years": { + "start_year": 1980, + "end_year": 2024 + }, + "base_year_min": 1991, + "base_year_max": 2025 + }, + { + "code": "ARS", + "noun": "Argentine pesos", + "current_years": { + "start_year": 1980, + "end_year": 2024 + }, + "constant_years": { + "start_year": 1980, + "end_year": 2024 + }, + "base_year_min": 1980, + "base_year_max": 2025 + }, + { + "code": "AUD", + "noun": "Australian dollars", + "current_years": { + "start_year": 1980, + "end_year": 2024 + }, + "constant_years": { + "start_year": 1980, + "end_year": 2024 + }, + "base_year_min": 1980, + "base_year_max": 2025 + }, + { + "code": "AWG", + "noun": "Aruban florins", + "current_years": { + "start_year": 1995, + "end_year": 2024 + }, + "constant_years": { + "start_year": 1980, + "end_year": 2024 + }, + "base_year_min": 1995, + "base_year_max": 2025 + }, + { + "code": "AZN", + "noun": "Azerbaijani manats", + "current_years": { + "start_year": 1992, + "end_year": 2024 + }, + "constant_years": { + "start_year": 1980, + "end_year": 2024 + }, + "base_year_min": 1992, + "base_year_max": 2025 + }, + { + "code": "BAM", + "noun": "Bosnia-Herzegovina convertible marks", + "current_years": { + "start_year": 1996, + "end_year": 2024 + }, + "constant_years": { + "start_year": 1980, + "end_year": 2024 + }, + "base_year_min": 1996, + "base_year_max": 2025 + }, + { + "code": "BBD", + "noun": "Barbadian dollars", + "current_years": { + "start_year": 1980, + "end_year": 2024 + }, + "constant_years": { + "start_year": 1980, + "end_year": 2024 + }, + "base_year_min": 1980, + "base_year_max": 2025 + }, + { + "code": "BDT", + "noun": "Bangladeshi taka", + "current_years": { + "start_year": 1980, + "end_year": 2024 + }, + "constant_years": { + "start_year": 1980, + "end_year": 2024 + }, + "base_year_min": 1980, + "base_year_max": 2025 + }, + { + "code": "BHD", + "noun": "Bahraini dinars", + "current_years": { + "start_year": 1980, + "end_year": 2024 + }, + "constant_years": { + "start_year": 1980, + "end_year": 2024 + }, + "base_year_min": 1980, + "base_year_max": 2025 + }, + { + "code": "BIF", + "noun": "Burundian francs", + "current_years": { + "start_year": 1980, + "end_year": 2024 + }, + "constant_years": { + "start_year": 1980, + "end_year": 2024 + }, + "base_year_min": 1980, + "base_year_max": 2025 + }, + { + "code": "BND", + "noun": "Brunei dollars", + "current_years": { + "start_year": 1985, + "end_year": 2024 + }, + "constant_years": { + "start_year": 1980, + "end_year": 2024 + }, + "base_year_min": 1985, + "base_year_max": 2025 + }, + { + "code": "BOB", + "noun": "Bolivian bolivianos", + "current_years": { + "start_year": 1980, + "end_year": 2024 + }, + "constant_years": { + "start_year": 1980, + "end_year": 2024 + }, + "base_year_min": 1980, + "base_year_max": 2025 + }, + { + "code": "BRL", + "noun": "Brazilian reais", + "current_years": { + "start_year": 1986, + "end_year": 2024 + }, + "constant_years": { + "start_year": 1980, + "end_year": 2024 + }, + "base_year_min": 1986, + "base_year_max": 2025 + }, + { + "code": "BSD", + "noun": "Bahamian dollars", + "current_years": { + "start_year": 1980, + "end_year": 2024 + }, + "constant_years": { + "start_year": 1980, + "end_year": 2024 + }, + "base_year_min": 1980, + "base_year_max": 2025 + }, + { + "code": "BTN", + "noun": "Bhutanese ngultrums", + "current_years": { + "start_year": 1980, + "end_year": 2024 + }, + "constant_years": { + "start_year": 1980, + "end_year": 2024 + }, + "base_year_min": 1980, + "base_year_max": 2025 + }, + { + "code": "BWP", + "noun": "Botswana pula", + "current_years": { + "start_year": 1980, + "end_year": 2024 + }, + "constant_years": { + "start_year": 1980, + "end_year": 2024 + }, + "base_year_min": 1980, + "base_year_max": 2025 + }, + { + "code": "BYN", + "noun": "Belarusian rubles", + "current_years": { + "start_year": 1992, + "end_year": 2024 + }, + "constant_years": { + "start_year": 1980, + "end_year": 2024 + }, + "base_year_min": 1992, + "base_year_max": 2025 + }, + { + "code": "BZD", + "noun": "Belize dollars", + "current_years": { + "start_year": 1980, + "end_year": 2024 + }, + "constant_years": { + "start_year": 1980, + "end_year": 2024 + }, + "base_year_min": 1980, + "base_year_max": 2025 + }, + { + "code": "CAD", + "noun": "Canadian dollars", + "current_years": { + "start_year": 1980, + "end_year": 2024 + }, + "constant_years": { + "start_year": 1980, + "end_year": 2024 + }, + "base_year_min": 1980, + "base_year_max": 2025 + }, + { + "code": "CDF", + "noun": "Congolese francs", + "current_years": { + "start_year": 1991, + "end_year": 2024 + }, + "constant_years": { + "start_year": 1980, + "end_year": 2024 + }, + "base_year_min": 1991, + "base_year_max": 2025 + }, + { + "code": "CHF", + "noun": "Swiss francs", + "current_years": { + "start_year": 1980, + "end_year": 2024 + }, + "constant_years": { + "start_year": 1980, + "end_year": 2024 + }, + "base_year_min": 1980, + "base_year_max": 2025 + }, + { + "code": "CLP", + "noun": "Chilean pesos", + "current_years": { + "start_year": 1980, + "end_year": 2024 + }, + "constant_years": { + "start_year": 1980, + "end_year": 2024 + }, + "base_year_min": 1980, + "base_year_max": 2025 + }, + { + "code": "CNY", + "noun": "Chinese yuan", + "current_years": { + "start_year": 1980, + "end_year": 2024 + }, + "constant_years": { + "start_year": 1980, + "end_year": 2024 + }, + "base_year_min": 1980, + "base_year_max": 2025 + }, + { + "code": "COP", + "noun": "Colombian pesos", + "current_years": { + "start_year": 1980, + "end_year": 2024 + }, + "constant_years": { + "start_year": 1980, + "end_year": 2024 + }, + "base_year_min": 1980, + "base_year_max": 2025 + }, + { + "code": "CRC", + "noun": "Costa Rican colones", + "current_years": { + "start_year": 1980, + "end_year": 2024 + }, + "constant_years": { + "start_year": 1980, + "end_year": 2024 + }, + "base_year_min": 1980, + "base_year_max": 2025 + }, + { + "code": "CVE", + "noun": "Cape Verdean escudos", + "current_years": { + "start_year": 1980, + "end_year": 2024 + }, + "constant_years": { + "start_year": 1980, + "end_year": 2024 + }, + "base_year_min": 1980, + "base_year_max": 2025 + }, + { + "code": "CZK", + "noun": "Czech korunas", + "current_years": { + "start_year": 1995, + "end_year": 2024 + }, + "constant_years": { + "start_year": 1980, + "end_year": 2024 + }, + "base_year_min": 1995, + "base_year_max": 2025 + }, + { + "code": "DJF", + "noun": "Djiboutian francs", + "current_years": { + "start_year": 1990, + "end_year": 2024 + }, + "constant_years": { + "start_year": 1980, + "end_year": 2024 + }, + "base_year_min": 1990, + "base_year_max": 2025 + }, + { + "code": "DKK", + "noun": "Danish kroner", + "current_years": { + "start_year": 1980, + "end_year": 2024 + }, + "constant_years": { + "start_year": 1980, + "end_year": 2024 + }, + "base_year_min": 1980, + "base_year_max": 2025 + }, + { + "code": "DOP", + "noun": "Dominican pesos", + "current_years": { + "start_year": 1980, + "end_year": 2024 + }, + "constant_years": { + "start_year": 1980, + "end_year": 2024 + }, + "base_year_min": 1980, + "base_year_max": 2025 + }, + { + "code": "DZD", + "noun": "Algerian dinars", + "current_years": { + "start_year": 1980, + "end_year": 2024 + }, + "constant_years": { + "start_year": 1980, + "end_year": 2024 + }, + "base_year_min": 1980, + "base_year_max": 2025 + }, + { + "code": "EGP", + "noun": "Egyptian pounds", + "current_years": { + "start_year": 1980, + "end_year": 2024 + }, + "constant_years": { + "start_year": 1980, + "end_year": 2024 + }, + "base_year_min": 1980, + "base_year_max": 2025 + }, + { + "code": "ERN", + "noun": "Eritrean nakfas", + "current_years": { + "start_year": 1992, + "end_year": 2019 + }, + "constant_years": { + "start_year": 1980, + "end_year": 2024 + }, + "base_year_min": 1992, + "base_year_max": 2019 + }, + { + "code": "ETB", + "noun": "Ethiopian birr", + "current_years": { + "start_year": 1980, + "end_year": 2024 + }, + "constant_years": { + "start_year": 1980, + "end_year": 2024 + }, + "base_year_min": 1980, + "base_year_max": 2025 + }, + { + "code": "EUR", + "noun": "euros", + "current_years": { + "start_year": 1980, + "end_year": 2024 + }, + "constant_years": { + "start_year": 1980, + "end_year": 2024 + }, + "base_year_min": 1980, + "base_year_max": 2025 + }, + { + "code": "FJD", + "noun": "Fijian dollars", + "current_years": { + "start_year": 1980, + "end_year": 2024 + }, + "constant_years": { + "start_year": 1980, + "end_year": 2024 + }, + "base_year_min": 1980, + "base_year_max": 2025 + }, + { + "code": "GBP", + "noun": "British pounds", + "current_years": { + "start_year": 1980, + "end_year": 2024 + }, + "constant_years": { + "start_year": 1980, + "end_year": 2024 + }, + "base_year_min": 1980, + "base_year_max": 2025 + }, + { + "code": "GEL", + "noun": "Georgian lari", + "current_years": { + "start_year": 1994, + "end_year": 2024 + }, + "constant_years": { + "start_year": 1980, + "end_year": 2024 + }, + "base_year_min": 1994, + "base_year_max": 2025 + }, + { + "code": "GHS", + "noun": "Ghanaian cedis", + "current_years": { + "start_year": 1980, + "end_year": 2024 + }, + "constant_years": { + "start_year": 1980, + "end_year": 2024 + }, + "base_year_min": 1980, + "base_year_max": 2025 + }, + { + "code": "GMD", + "noun": "Gambian dalasis", + "current_years": { + "start_year": 1980, + "end_year": 2024 + }, + "constant_years": { + "start_year": 1980, + "end_year": 2024 + }, + "base_year_min": 1980, + "base_year_max": 2025 + }, + { + "code": "GNF", + "noun": "Guinean francs", + "current_years": { + "start_year": 1980, + "end_year": 2024 + }, + "constant_years": { + "start_year": 1980, + "end_year": 2024 + }, + "base_year_min": 1980, + "base_year_max": 2025 + }, + { + "code": "GTQ", + "noun": "Guatemalan quetzales", + "current_years": { + "start_year": 1980, + "end_year": 2024 + }, + "constant_years": { + "start_year": 1980, + "end_year": 2024 + }, + "base_year_min": 1980, + "base_year_max": 2025 + }, + { + "code": "GYD", + "noun": "Guyanese dollars", + "current_years": { + "start_year": 1980, + "end_year": 2024 + }, + "constant_years": { + "start_year": 1980, + "end_year": 2024 + }, + "base_year_min": 1980, + "base_year_max": 2025 + }, + { + "code": "HKD", + "noun": "Hong Kong dollars", + "current_years": { + "start_year": 1980, + "end_year": 2024 + }, + "constant_years": { + "start_year": 1980, + "end_year": 2024 + }, + "base_year_min": 1980, + "base_year_max": 2025 + }, + { + "code": "HNL", + "noun": "Honduran lempiras", + "current_years": { + "start_year": 1980, + "end_year": 2024 + }, + "constant_years": { + "start_year": 1980, + "end_year": 2024 + }, + "base_year_min": 1980, + "base_year_max": 2025 + }, + { + "code": "HTG", + "noun": "Haitian gourdes", + "current_years": { + "start_year": 1980, + "end_year": 2024 + }, + "constant_years": { + "start_year": 1980, + "end_year": 2024 + }, + "base_year_min": 1980, + "base_year_max": 2025 + }, + { + "code": "HUF", + "noun": "Hungarian forints", + "current_years": { + "start_year": 1980, + "end_year": 2024 + }, + "constant_years": { + "start_year": 1980, + "end_year": 2024 + }, + "base_year_min": 1980, + "base_year_max": 2025 + }, + { + "code": "IDR", + "noun": "Indonesian rupiahs", + "current_years": { + "start_year": 1980, + "end_year": 2024 + }, + "constant_years": { + "start_year": 1980, + "end_year": 2024 + }, + "base_year_min": 1980, + "base_year_max": 2025 + }, + { + "code": "ILS", + "noun": "Israeli new shekels", + "current_years": { + "start_year": 1980, + "end_year": 2024 + }, + "constant_years": { + "start_year": 1980, + "end_year": 2024 + }, + "base_year_min": 1980, + "base_year_max": 2025 + }, + { + "code": "INR", + "noun": "Indian rupees", + "current_years": { + "start_year": 1980, + "end_year": 2024 + }, + "constant_years": { + "start_year": 1980, + "end_year": 2024 + }, + "base_year_min": 1980, + "base_year_max": 2025 + }, + { + "code": "IQD", + "noun": "Iraqi dinars", + "current_years": { + "start_year": 2000, + "end_year": 2024 + }, + "constant_years": { + "start_year": 1980, + "end_year": 2024 + }, + "base_year_min": 2000, + "base_year_max": 2025 + }, + { + "code": "IRR", + "noun": "Iranian rials", + "current_years": { + "start_year": 1980, + "end_year": 2024 + }, + "constant_years": { + "start_year": 1980, + "end_year": 2024 + }, + "base_year_min": 1980, + "base_year_max": 2025 + }, + { + "code": "ISK", + "noun": "Icelandic krónur", + "current_years": { + "start_year": 1980, + "end_year": 2024 + }, + "constant_years": { + "start_year": 1980, + "end_year": 2024 + }, + "base_year_min": 1980, + "base_year_max": 2025 + }, + { + "code": "JMD", + "noun": "Jamaican dollars", + "current_years": { + "start_year": 1980, + "end_year": 2024 + }, + "constant_years": { + "start_year": 1980, + "end_year": 2024 + }, + "base_year_min": 1980, + "base_year_max": 2025 + }, + { + "code": "JOD", + "noun": "Jordanian dinars", + "current_years": { + "start_year": 1980, + "end_year": 2024 + }, + "constant_years": { + "start_year": 1980, + "end_year": 2024 + }, + "base_year_min": 1980, + "base_year_max": 2025 + }, + { + "code": "JPY", + "noun": "Japanese yen", + "current_years": { + "start_year": 1980, + "end_year": 2024 + }, + "constant_years": { + "start_year": 1980, + "end_year": 2024 + }, + "base_year_min": 1980, + "base_year_max": 2025 + }, + { + "code": "KES", + "noun": "Kenyan shillings", + "current_years": { + "start_year": 1980, + "end_year": 2024 + }, + "constant_years": { + "start_year": 1980, + "end_year": 2024 + }, + "base_year_min": 1980, + "base_year_max": 2025 + }, + { + "code": "KGS", + "noun": "Kyrgyz soms", + "current_years": { + "start_year": 1992, + "end_year": 2024 + }, + "constant_years": { + "start_year": 1980, + "end_year": 2024 + }, + "base_year_min": 1992, + "base_year_max": 2025 + }, + { + "code": "KHR", + "noun": "Cambodian riels", + "current_years": { + "start_year": 1986, + "end_year": 2024 + }, + "constant_years": { + "start_year": 1980, + "end_year": 2024 + }, + "base_year_min": 1986, + "base_year_max": 2025 + }, + { + "code": "KMF", + "noun": "Comorian francs", + "current_years": { + "start_year": 1980, + "end_year": 2024 + }, + "constant_years": { + "start_year": 1980, + "end_year": 2024 + }, + "base_year_min": 1980, + "base_year_max": 2025 + }, + { + "code": "KRW", + "noun": "South Korean won", + "current_years": { + "start_year": 1980, + "end_year": 2024 + }, + "constant_years": { + "start_year": 1980, + "end_year": 2024 + }, + "base_year_min": 1980, + "base_year_max": 2025 + }, + { + "code": "KWD", + "noun": "Kuwaiti dinars", + "current_years": { + "start_year": 1981, + "end_year": 2024 + }, + "constant_years": { + "start_year": 1980, + "end_year": 2024 + }, + "base_year_min": 1981, + "base_year_max": 2025 + }, + { + "code": "KZT", + "noun": "Kazakh tenge", + "current_years": { + "start_year": 1992, + "end_year": 2024 + }, + "constant_years": { + "start_year": 1980, + "end_year": 2024 + }, + "base_year_min": 1992, + "base_year_max": 2025 + }, + { + "code": "LAK", + "noun": "Lao kip", + "current_years": { + "start_year": 1980, + "end_year": 2024 + }, + "constant_years": { + "start_year": 1980, + "end_year": 2024 + }, + "base_year_min": 1980, + "base_year_max": 2025 + }, + { + "code": "LBP", + "noun": "Lebanese pounds", + "current_years": { + "start_year": 1980, + "end_year": 2024 + }, + "constant_years": { + "start_year": 1980, + "end_year": 2024 + }, + "base_year_min": 1980, + "base_year_max": 2025 + }, + { + "code": "LKR", + "noun": "Sri Lankan rupees", + "current_years": { + "start_year": 1980, + "end_year": 2024 + }, + "constant_years": { + "start_year": 1980, + "end_year": 2024 + }, + "base_year_min": 1980, + "base_year_max": 2025 + }, + { + "code": "LSL", + "noun": "Lesotho maloti", + "current_years": { + "start_year": 1980, + "end_year": 2024 + }, + "constant_years": { + "start_year": 1980, + "end_year": 2024 + }, + "base_year_min": 1980, + "base_year_max": 2025 + }, + { + "code": "LYD", + "noun": "Libyan dinars", + "current_years": { + "start_year": 1980, + "end_year": 2024 + }, + "constant_years": { + "start_year": 1980, + "end_year": 2024 + }, + "base_year_min": 1980, + "base_year_max": 2025 + }, + { + "code": "MAD", + "noun": "Moroccan dirhams", + "current_years": { + "start_year": 1980, + "end_year": 2024 + }, + "constant_years": { + "start_year": 1980, + "end_year": 2024 + }, + "base_year_min": 1980, + "base_year_max": 2025 + }, + { + "code": "MDL", + "noun": "Moldovan lei", + "current_years": { + "start_year": 1992, + "end_year": 2024 + }, + "constant_years": { + "start_year": 1980, + "end_year": 2024 + }, + "base_year_min": 1992, + "base_year_max": 2025 + }, + { + "code": "MGA", + "noun": "Malagasy ariary", + "current_years": { + "start_year": 1980, + "end_year": 2024 + }, + "constant_years": { + "start_year": 1980, + "end_year": 2024 + }, + "base_year_min": 1980, + "base_year_max": 2025 + }, + { + "code": "MKD", + "noun": "Macedonian denars", + "current_years": { + "start_year": 1992, + "end_year": 2024 + }, + "constant_years": { + "start_year": 1980, + "end_year": 2024 + }, + "base_year_min": 1992, + "base_year_max": 2025 + }, + { + "code": "MMK", + "noun": "Myanmar kyats", + "current_years": { + "start_year": 1998, + "end_year": 2024 + }, + "constant_years": { + "start_year": 1980, + "end_year": 2024 + }, + "base_year_min": 1998, + "base_year_max": 2025 + }, + { + "code": "MNT", + "noun": "Mongolian tugriks", + "current_years": { + "start_year": 1980, + "end_year": 2024 + }, + "constant_years": { + "start_year": 1980, + "end_year": 2024 + }, + "base_year_min": 1980, + "base_year_max": 2025 + }, + { + "code": "MOP", + "noun": "Macanese patacas", + "current_years": { + "start_year": 2001, + "end_year": 2024 + }, + "constant_years": { + "start_year": 1980, + "end_year": 2024 + }, + "base_year_min": 2001, + "base_year_max": 2025 + }, + { + "code": "MRU", + "noun": "Mauritanian ouguiyas", + "current_years": { + "start_year": 1990, + "end_year": 2024 + }, + "constant_years": { + "start_year": 1980, + "end_year": 2024 + }, + "base_year_min": 1990, + "base_year_max": 2025 + }, + { + "code": "MUR", + "noun": "Mauritian rupees", + "current_years": { + "start_year": 1980, + "end_year": 2024 + }, + "constant_years": { + "start_year": 1980, + "end_year": 2024 + }, + "base_year_min": 1980, + "base_year_max": 2025 + }, + { + "code": "MVR", + "noun": "Maldivian rufiyaa", + "current_years": { + "start_year": 1980, + "end_year": 2024 + }, + "constant_years": { + "start_year": 1980, + "end_year": 2024 + }, + "base_year_min": 1980, + "base_year_max": 2025 + }, + { + "code": "MWK", + "noun": "Malawian kwachas", + "current_years": { + "start_year": 1980, + "end_year": 2024 + }, + "constant_years": { + "start_year": 1980, + "end_year": 2024 + }, + "base_year_min": 1980, + "base_year_max": 2025 + }, + { + "code": "MXN", + "noun": "Mexican pesos", + "current_years": { + "start_year": 1980, + "end_year": 2024 + }, + "constant_years": { + "start_year": 1980, + "end_year": 2024 + }, + "base_year_min": 1980, + "base_year_max": 2025 + }, + { + "code": "MYR", + "noun": "Malaysian ringgits", + "current_years": { + "start_year": 1980, + "end_year": 2024 + }, + "constant_years": { + "start_year": 1980, + "end_year": 2024 + }, + "base_year_min": 1980, + "base_year_max": 2025 + }, + { + "code": "MZN", + "noun": "Mozambican meticais", + "current_years": { + "start_year": 1980, + "end_year": 2024 + }, + "constant_years": { + "start_year": 1980, + "end_year": 2024 + }, + "base_year_min": 1980, + "base_year_max": 2025 + }, + { + "code": "NAD", + "noun": "Namibian dollars", + "current_years": { + "start_year": 1989, + "end_year": 2024 + }, + "constant_years": { + "start_year": 1980, + "end_year": 2024 + }, + "base_year_min": 1989, + "base_year_max": 2025 + }, + { + "code": "NGN", + "noun": "Nigerian naira", + "current_years": { + "start_year": 1990, + "end_year": 2024 + }, + "constant_years": { + "start_year": 1980, + "end_year": 2024 + }, + "base_year_min": 1990, + "base_year_max": 2025 + }, + { + "code": "NIO", + "noun": "Nicaraguan córdobas", + "current_years": { + "start_year": 1987, + "end_year": 2024 + }, + "constant_years": { + "start_year": 1980, + "end_year": 2024 + }, + "base_year_min": 1987, + "base_year_max": 2025 + }, + { + "code": "NOK", + "noun": "Norwegian kroner", + "current_years": { + "start_year": 1980, + "end_year": 2024 + }, + "constant_years": { + "start_year": 1980, + "end_year": 2024 + }, + "base_year_min": 1980, + "base_year_max": 2025 + }, + { + "code": "NPR", + "noun": "Nepalese rupees", + "current_years": { + "start_year": 1980, + "end_year": 2024 + }, + "constant_years": { + "start_year": 1980, + "end_year": 2024 + }, + "base_year_min": 1980, + "base_year_max": 2025 + }, + { + "code": "NZD", + "noun": "New Zealand dollars", + "current_years": { + "start_year": 1980, + "end_year": 2024 + }, + "constant_years": { + "start_year": 1980, + "end_year": 2024 + }, + "base_year_min": 1980, + "base_year_max": 2025 + }, + { + "code": "OMR", + "noun": "Omani rials", + "current_years": { + "start_year": 1980, + "end_year": 2024 + }, + "constant_years": { + "start_year": 1980, + "end_year": 2024 + }, + "base_year_min": 1980, + "base_year_max": 2025 + }, + { + "code": "PEN", + "noun": "Peruvian soles", + "current_years": { + "start_year": 1980, + "end_year": 2024 + }, + "constant_years": { + "start_year": 1980, + "end_year": 2024 + }, + "base_year_min": 1980, + "base_year_max": 2025 + }, + { + "code": "PGK", + "noun": "Papua New Guinean kina", + "current_years": { + "start_year": 1980, + "end_year": 2024 + }, + "constant_years": { + "start_year": 1980, + "end_year": 2024 + }, + "base_year_min": 1980, + "base_year_max": 2025 + }, + { + "code": "PHP", + "noun": "Philippine pesos", + "current_years": { + "start_year": 1980, + "end_year": 2024 + }, + "constant_years": { + "start_year": 1980, + "end_year": 2024 + }, + "base_year_min": 1980, + "base_year_max": 2025 + }, + { + "code": "PKR", + "noun": "Pakistani rupees", + "current_years": { + "start_year": 1980, + "end_year": 2024 + }, + "constant_years": { + "start_year": 1980, + "end_year": 2024 + }, + "base_year_min": 1980, + "base_year_max": 2025 + }, + { + "code": "PLN", + "noun": "Polish zlotys", + "current_years": { + "start_year": 1980, + "end_year": 2024 + }, + "constant_years": { + "start_year": 1980, + "end_year": 2024 + }, + "base_year_min": 1980, + "base_year_max": 2025 + }, + { + "code": "PYG", + "noun": "Paraguayan guaranís", + "current_years": { + "start_year": 1980, + "end_year": 2024 + }, + "constant_years": { + "start_year": 1980, + "end_year": 2024 + }, + "base_year_min": 1980, + "base_year_max": 2025 + }, + { + "code": "QAR", + "noun": "Qatari riyals", + "current_years": { + "start_year": 1980, + "end_year": 2024 + }, + "constant_years": { + "start_year": 1980, + "end_year": 2024 + }, + "base_year_min": 1980, + "base_year_max": 2025 + }, + { + "code": "RON", + "noun": "Romanian lei", + "current_years": { + "start_year": 1980, + "end_year": 2024 + }, + "constant_years": { + "start_year": 1980, + "end_year": 2024 + }, + "base_year_min": 1980, + "base_year_max": 2025 + }, + { + "code": "RSD", + "noun": "Serbian dinars", + "current_years": { + "start_year": 1997, + "end_year": 2024 + }, + "constant_years": { + "start_year": 1980, + "end_year": 2024 + }, + "base_year_min": 1997, + "base_year_max": 2025 + }, + { + "code": "RUB", + "noun": "Russian rubles", + "current_years": { + "start_year": 1992, + "end_year": 2024 + }, + "constant_years": { + "start_year": 1980, + "end_year": 2024 + }, + "base_year_min": 1992, + "base_year_max": 2025 + }, + { + "code": "RWF", + "noun": "Rwandan francs", + "current_years": { + "start_year": 1980, + "end_year": 2024 + }, + "constant_years": { + "start_year": 1980, + "end_year": 2024 + }, + "base_year_min": 1980, + "base_year_max": 2025 + }, + { + "code": "SAR", + "noun": "Saudi riyals", + "current_years": { + "start_year": 1980, + "end_year": 2024 + }, + "constant_years": { + "start_year": 1980, + "end_year": 2024 + }, + "base_year_min": 1980, + "base_year_max": 2025 + }, + { + "code": "SBD", + "noun": "Solomon Islands dollars", + "current_years": { + "start_year": 1980, + "end_year": 2024 + }, + "constant_years": { + "start_year": 1980, + "end_year": 2024 + }, + "base_year_min": 1980, + "base_year_max": 2025 + }, + { + "code": "SCR", + "noun": "Seychellois rupees", + "current_years": { + "start_year": 1980, + "end_year": 2024 + }, + "constant_years": { + "start_year": 1980, + "end_year": 2024 + }, + "base_year_min": 1980, + "base_year_max": 2025 + }, + { + "code": "SDG", + "noun": "Sudanese pounds", + "current_years": { + "start_year": 1980, + "end_year": 2024 + }, + "constant_years": { + "start_year": 1980, + "end_year": 2024 + }, + "base_year_min": 1980, + "base_year_max": 2025 + }, + { + "code": "SEK", + "noun": "Swedish kronor", + "current_years": { + "start_year": 1980, + "end_year": 2024 + }, + "constant_years": { + "start_year": 1980, + "end_year": 2024 + }, + "base_year_min": 1980, + "base_year_max": 2025 + }, + { + "code": "SGD", + "noun": "Singapore dollars", + "current_years": { + "start_year": 1980, + "end_year": 2024 + }, + "constant_years": { + "start_year": 1980, + "end_year": 2024 + }, + "base_year_min": 1980, + "base_year_max": 2025 + }, + { + "code": "SLE", + "noun": "Sierra Leonean leones", + "current_years": { + "start_year": 1980, + "end_year": 2024 + }, + "constant_years": { + "start_year": 1980, + "end_year": 2024 + }, + "base_year_min": 1980, + "base_year_max": 2025 + }, + { + "code": "SRD", + "noun": "Surinamese dollars", + "current_years": { + "start_year": 1980, + "end_year": 2024 + }, + "constant_years": { + "start_year": 1980, + "end_year": 2024 + }, + "base_year_min": 1980, + "base_year_max": 2025 + }, + { + "code": "SSP", + "noun": "South Sudanese pounds", + "current_years": { + "start_year": 2011, + "end_year": 2024 + }, + "constant_years": { + "start_year": 1980, + "end_year": 2024 + }, + "base_year_min": 2011, + "base_year_max": 2025 + }, + { + "code": "STN", + "noun": "São Tomé and Príncipe dobras", + "current_years": { + "start_year": 1980, + "end_year": 2024 + }, + "constant_years": { + "start_year": 1980, + "end_year": 2024 + }, + "base_year_min": 1980, + "base_year_max": 2025 + }, + { + "code": "SYP", + "noun": "Syrian pounds", + "current_years": { + "start_year": 1980, + "end_year": 2010 + }, + "constant_years": { + "start_year": 1980, + "end_year": 2024 + }, + "base_year_min": 1980, + "base_year_max": 2010 + }, + { + "code": "SZL", + "noun": "Swazi emalangeni", + "current_years": { + "start_year": 1980, + "end_year": 2024 + }, + "constant_years": { + "start_year": 1980, + "end_year": 2024 + }, + "base_year_min": 1980, + "base_year_max": 2025 + }, + { + "code": "THB", + "noun": "Thai baht", + "current_years": { + "start_year": 1980, + "end_year": 2024 + }, + "constant_years": { + "start_year": 1980, + "end_year": 2024 + }, + "base_year_min": 1980, + "base_year_max": 2025 + }, + { + "code": "TJS", + "noun": "Tajikistani somonis", + "current_years": { + "start_year": 1992, + "end_year": 2024 + }, + "constant_years": { + "start_year": 1980, + "end_year": 2024 + }, + "base_year_min": 1992, + "base_year_max": 2025 + }, + { + "code": "TMT", + "noun": "Turkmenistani manat", + "current_years": { + "start_year": 1992, + "end_year": 2024 + }, + "constant_years": { + "start_year": 1980, + "end_year": 2024 + }, + "base_year_min": 1992, + "base_year_max": 2025 + }, + { + "code": "TND", + "noun": "Tunisian dinars", + "current_years": { + "start_year": 1980, + "end_year": 2024 + }, + "constant_years": { + "start_year": 1980, + "end_year": 2024 + }, + "base_year_min": 1980, + "base_year_max": 2025 + }, + { + "code": "TOP", + "noun": "Tongan paʻanga", + "current_years": { + "start_year": 1980, + "end_year": 2024 + }, + "constant_years": { + "start_year": 1980, + "end_year": 2024 + }, + "base_year_min": 1980, + "base_year_max": 2025 + }, + { + "code": "TRY", + "noun": "Turkish lira", + "current_years": { + "start_year": 1980, + "end_year": 2024 + }, + "constant_years": { + "start_year": 1980, + "end_year": 2024 + }, + "base_year_min": 1980, + "base_year_max": 2025 + }, + { + "code": "TTD", + "noun": "Trinidad and Tobago dollars", + "current_years": { + "start_year": 1980, + "end_year": 2024 + }, + "constant_years": { + "start_year": 1980, + "end_year": 2024 + }, + "base_year_min": 1980, + "base_year_max": 2025 + }, + { + "code": "TWD", + "noun": "New Taiwan dollars", + "current_years": { + "start_year": 1980, + "end_year": 2024 + }, + "constant_years": { + "start_year": 1980, + "end_year": 2024 + }, + "base_year_min": 1980, + "base_year_max": 2025 + }, + { + "code": "TZS", + "noun": "Tanzanian shillings", + "current_years": { + "start_year": 1980, + "end_year": 2024 + }, + "constant_years": { + "start_year": 1980, + "end_year": 2024 + }, + "base_year_min": 1980, + "base_year_max": 2025 + }, + { + "code": "UAH", + "noun": "Ukrainian hryvnias", + "current_years": { + "start_year": 1991, + "end_year": 2024 + }, + "constant_years": { + "start_year": 1980, + "end_year": 2024 + }, + "base_year_min": 1991, + "base_year_max": 2025 + }, + { + "code": "UGX", + "noun": "Ugandan shillings", + "current_years": { + "start_year": 1980, + "end_year": 2024 + }, + "constant_years": { + "start_year": 1980, + "end_year": 2024 + }, + "base_year_min": 1980, + "base_year_max": 2025 + }, + { + "code": "USD", + "noun": "US dollars", + "current_years": { + "start_year": 1980, + "end_year": 2024 + }, + "constant_years": { + "start_year": 1980, + "end_year": 2024 + }, + "base_year_min": 1980, + "base_year_max": 2025 + }, + { + "code": "UYU", + "noun": "Uruguayan pesos", + "current_years": { + "start_year": 1980, + "end_year": 2024 + }, + "constant_years": { + "start_year": 1980, + "end_year": 2024 + }, + "base_year_min": 1980, + "base_year_max": 2025 + }, + { + "code": "UZS", + "noun": "Uzbekistani soms", + "current_years": { + "start_year": 1992, + "end_year": 2024 + }, + "constant_years": { + "start_year": 1980, + "end_year": 2024 + }, + "base_year_min": 1992, + "base_year_max": 2025 + }, + { + "code": "VES", + "noun": "Venezuelan bolívares", + "current_years": { + "start_year": 2017, + "end_year": 2024 + }, + "constant_years": { + "start_year": 1980, + "end_year": 2024 + }, + "base_year_min": 2017, + "base_year_max": 2025 + }, + { + "code": "VND", + "noun": "Vietnamese dong", + "current_years": { + "start_year": 1980, + "end_year": 2024 + }, + "constant_years": { + "start_year": 1980, + "end_year": 2024 + }, + "base_year_min": 1980, + "base_year_max": 2025 + }, + { + "code": "VUV", + "noun": "Vanuatu vatu", + "current_years": { + "start_year": 1980, + "end_year": 2024 + }, + "constant_years": { + "start_year": 1980, + "end_year": 2024 + }, + "base_year_min": 1980, + "base_year_max": 2025 + }, + { + "code": "WST", + "noun": "Samoan tala", + "current_years": { + "start_year": 1980, + "end_year": 2024 + }, + "constant_years": { + "start_year": 1980, + "end_year": 2024 + }, + "base_year_min": 1980, + "base_year_max": 2025 + }, + { + "code": "XAF", + "noun": "Central African CFA francs", + "current_years": { + "start_year": 1980, + "end_year": 2024 + }, + "constant_years": { + "start_year": 1980, + "end_year": 2024 + }, + "base_year_min": 1980, + "base_year_max": 2025 + }, + { + "code": "XCD", + "noun": "East Caribbean dollars", + "current_years": { + "start_year": 1980, + "end_year": 2024 + }, + "constant_years": { + "start_year": 1980, + "end_year": 2024 + }, + "base_year_min": 1980, + "base_year_max": 2025 + }, + { + "code": "XOF", + "noun": "West African CFA francs", + "current_years": { + "start_year": 1980, + "end_year": 2024 + }, + "constant_years": { + "start_year": 1980, + "end_year": 2024 + }, + "base_year_min": 1980, + "base_year_max": 2025 + }, + { + "code": "YER", + "noun": "Yemeni rials", + "current_years": { + "start_year": 2014, + "end_year": 2024 + }, + "constant_years": { + "start_year": 1980, + "end_year": 2024 + }, + "base_year_min": 2014, + "base_year_max": 2025 + }, + { + "code": "ZAR", + "noun": "South African rand", + "current_years": { + "start_year": 1980, + "end_year": 2024 + }, + "constant_years": { + "start_year": 1980, + "end_year": 2024 + }, + "base_year_min": 1980, + "base_year_max": 2025 + }, + { + "code": "ZMW", + "noun": "Zambian kwachas", + "current_years": { + "start_year": 1980, + "end_year": 2024 + }, + "constant_years": { + "start_year": 1980, + "end_year": 2024 + }, + "base_year_min": 1980, + "base_year_max": 2025 + } + ], + "default_base_year": 2024, + "role_currencies": { + "destination": "KES" + } + } + } + } + }, + { + "variable_text": "price of tea", + "warnings": [], + "timing_ms": { + "total": 100, + "by_step": { + "recall": 0, + "phase_resolve_places": 0, + "phase_check_entities": 0, + "shape_arcs": 2, + "shape_probe": 91, + "shape_groups": 1, + "shape_labels": 0, + "shape_admission": 1, + "phase_derive_shapes": 0, + "shape": 100, + "phase_prune_and_rank": 0 + } + }, + "rendered_sentence": "Could not match \"price of tea\" to a supported indicator. Try a different wording or a related indicator.", + "sentence_plan": [ + { + "kind": "text", + "text": "Could not match \"price of tea\" to a supported indicator. Try a different wording or a related indicator.", + "segment": "heading", + "entity_refs": [], + "states": [] + } + ], + "entity_refs": [], + "operations": [], + "departures": [], + "assumptions": [], + "status": "no_data", + "no_data": { + "reason": "variable_not_resolved", + "category": "unresolved", + "message": "Could not match \"price of tea\" to a supported indicator. Try a different wording or a related indicator.", + "entity_terms": [], + "ambiguous_entities": [], + "source_terms": [], + "ambiguous_sources": [], + "unbound_qualifiers": [], + "options": [] + } + } + ], + "rendered_sentence": "Answered 1 of 2 parts. Kenya's external debt service owed to all creditors, 1970 to 2024. Current US dollars · World Bank International Debt Statistics (IDS). Assumed: every creditor. No match for price of tea. Try a different wording or a related indicator.", + "sentence_plan": [ + { + "kind": "text", + "text": "Answered 1 of 2 parts.", + "segment": "coverage", + "entity_refs": [], + "states": [] + }, + { + "kind": "text", + "text": " ", + "segment": "coverage", + "entity_refs": [], + "states": [] + }, + { + "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": "'s", + "segment": "heading", + "entity_refs": [], + "states": [], + "part_index": 0 + }, + { + "kind": "text", + "text": " ", + "segment": "heading", + "entity_refs": [], + "states": [], + "part_index": 0 + }, + { + "kind": "slot", + "text": "external debt service", + "axis": "what", + "segment": "heading", + "entity_refs": [], + "states": [ + "how:financialFlowType", + "axis:populationType", + "axis:measuredProperty", + "axis:statType" + ], + "part_index": 0 + }, + { + "kind": "text", + "text": " owed to ", + "segment": "heading", + "entity_refs": [], + "states": [], + "part_index": 0 + }, + { + "kind": "slot", + "text": "all creditors", + "segment": "heading", + "role": "origin", + "binding_ref": "origin:", + "entity_refs": [], + "states": [ + "origin:" + ], + "part_index": 0 + }, + { + "kind": "slot", + "text": "", + "axis": "how", + "segment": "heading", + "property_dcid": "financingResource", + "binding_ref": "how:financingResource", + "entity_refs": [], + "states": [], + "part_index": 0 + }, + { + "kind": "slot", + "text": "", + "axis": "how", + "segment": "heading", + "property_dcid": "guaranteeStatus", + "binding_ref": "how:guaranteeStatus", + "entity_refs": [], + "states": [], + "part_index": 0 + }, + { + "kind": "slot", + "text": "", + "axis": "how", + "segment": "heading", + "property_dcid": "idsConcessionality", + "binding_ref": "how:idsConcessionality", + "entity_refs": [], + "states": [], + "part_index": 0 + }, + { + "kind": "slot", + "text": "", + "axis": "how", + "segment": "heading", + "property_dcid": "idsCreditorType", + "binding_ref": "how:idsCreditorType", + "entity_refs": [], + "states": [], + "part_index": 0 + }, + { + "kind": "slot", + "text": "", + "axis": "how", + "segment": "heading", + "property_dcid": "idsDebtorType", + "binding_ref": "how:idsDebtorType", + "entity_refs": [], + "states": [], + "part_index": 0 + }, + { + "kind": "slot", + "text": "", + "axis": "how", + "segment": "heading", + "property_dcid": "includesIMFCredit", + "binding_ref": "how:includesIMFCredit", + "entity_refs": [], + "states": [], + "part_index": 0 + }, + { + "kind": "slot", + "text": "", + "axis": "how", + "segment": "heading", + "property_dcid": "maturityBand", + "binding_ref": "how:maturityBand", + "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": "text", + "text": ", ", + "segment": "heading", + "entity_refs": [], + "states": [], + "part_index": 0 + }, + { + "kind": "slot", + "text": "1970 to 2024", + "axis": "when", + "segment": "heading", + "binding_ref": "when:", + "entity_refs": [], + "states": [ + "when:" + ], + "part_index": 0 + }, + { + "kind": "text", + "text": ".", + "segment": "heading", + "entity_refs": [], + "states": [], + "part_index": 0 + }, + { + "kind": "text", + "text": " ", + "segment": "byline", + "entity_refs": [], + "states": [], + "part_index": 0 + }, + { + "kind": "slot", + "text": "Current US dollars", + "axis": "unit", + "segment": "byline", + "binding_ref": "unit:", + "entity_refs": [], + "states": [ + "unit:", + "axis:measurementQualifier" + ], + "part_index": 0 + }, + { + "kind": "text", + "text": " · ", + "segment": "byline", + "entity_refs": [], + "states": [], + "part_index": 0 + }, + { + "kind": "slot", + "text": "World Bank International Debt Statistics (IDS)", + "axis": "source", + "segment": "byline", + "entity_refs": [], + "states": [ + "source:" + ], + "part_index": 0 + }, + { + "kind": "text", + "text": ".", + "segment": "byline", + "entity_refs": [], + "states": [], + "part_index": 0 + }, + { + "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 creditor", + "segment": "assumption", + "entity_refs": [], + "states": [], + "part_index": 0 + }, + { + "kind": "text", + "text": ".", + "segment": "assumption", + "entity_refs": [], + "states": [], + "part_index": 0 + }, + { + "kind": "text", + "text": " ", + "segment": "heading", + "entity_refs": [], + "states": [] + }, + { + "kind": "text", + "text": "No match for ", + "segment": "heading", + "entity_refs": [], + "states": [], + "part_index": 1 + }, + { + "kind": "slot", + "text": "price of tea", + "axis": "what", + "segment": "heading", + "entity_refs": [], + "states": [], + "part_index": 1 + }, + { + "kind": "text", + "text": ". Try a different wording or a related indicator.", + "segment": "heading", + "entity_refs": [], + "states": [], + "part_index": 1 + } + ], + "status": "mixed" + } + } + } + ], + "expect": [ + { + "answer": { + "kind": "resolution", + "status": "mixed", + "sentence": "Answered 1 of 2 parts. Kenya's external debt service owed to all creditors, 1970 to 2024. Current US dollars · World Bank International Debt Statistics (IDS). Assumed: every creditor. No match for price of tea. Try a different wording or a related indicator.", + "complete": false, + "specs": [ + "spec_78d04fefc3b3f1ef71acd622957e4995" + ], + "gaps": [ + { + "part": 1, + "kind": "not_understood", + "options": 0 + } + ] + } + }, + { + "error": { + "class": "IncompleteAnswerError", + "code": "answer_incomplete", + "trace_id": "55555555555555555555555555555555" + } + } + ] +} 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 051cdf2..8c0eb3c 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 @@ -1,11 +1,11 @@ { "format_version": 1, "name": "answer-timed-out", - "description": "A no_data part of an answer whose diagnostics say Search timed out is a timed_out gap, whatever its reason, and fetching the answer raises IncompleteAnswerError, which describes the answer and carries its response's trace id.", + "description": "A no_data part with reason timed_out, the reason Search gives a part it left unresolved at its time limit, is a timed_out gap, and fetching the answer raises IncompleteAnswerError, which describes the answer and carries its response's trace id.", "origin": { "kind": "synthetic", "derived_from": "answer-mixed-fetch-raises", - "edit": "The answer's diagnostics.timed_out becomes true, and its response carries x-dfo-trace-id 55555555555555555555555555555555." + "edit": "The answer's diagnostics.timed_out becomes true, part 1's no_data reason becomes timed_out with the message that reason renders, and its response carries x-dfo-trace-id 55555555555555555555555555555555." }, "call": [ { @@ -3286,11 +3286,11 @@ "phase_prune_and_rank": 0 } }, - "rendered_sentence": "Could not match \"price of tea\" to a supported indicator. Try a different wording or a related indicator.", + "rendered_sentence": "Search reached its time limit before answering this part. Try again, or ask a narrower question.", "sentence_plan": [ { "kind": "text", - "text": "Could not match \"price of tea\" to a supported indicator. Try a different wording or a related indicator.", + "text": "Search reached its time limit before answering this part. Try again, or ask a narrower question.", "segment": "heading", "entity_refs": [], "states": [] @@ -3302,9 +3302,9 @@ "assumptions": [], "status": "no_data", "no_data": { - "reason": "variable_not_resolved", + "reason": "timed_out", "category": "unresolved", - "message": "Could not match \"price of tea\" to a supported indicator. Try a different wording or a related indicator.", + "message": "Search reached its time limit before answering this part. Try again, or ask a narrower question.", "entity_terms": [], "ambiguous_entities": [], "source_terms": [], @@ -3314,7 +3314,7 @@ } } ], - "rendered_sentence": "Answered 1 of 2 parts. Kenya's external debt service owed to all creditors, 1970 to 2024. Current US dollars · World Bank International Debt Statistics (IDS). Assumed: every creditor. No match for price of tea. Try a different wording or a related indicator.", + "rendered_sentence": "Answered 1 of 2 parts. Kenya's external debt service owed to all creditors, 1970 to 2024. Current US dollars · World Bank International Debt Statistics (IDS). Assumed: every creditor. Search reached its time limit before answering this part. Try again, or ask a narrower question.", "sentence_plan": [ { "kind": "text", @@ -3600,24 +3600,7 @@ }, { "kind": "text", - "text": "No match for ", - "segment": "heading", - "entity_refs": [], - "states": [], - "part_index": 1 - }, - { - "kind": "slot", - "text": "price of tea", - "axis": "what", - "segment": "heading", - "entity_refs": [], - "states": [], - "part_index": 1 - }, - { - "kind": "text", - "text": ". Try a different wording or a related indicator.", + "text": "Search reached its time limit before answering this part. Try again, or ask a narrower question.", "segment": "heading", "entity_refs": [], "states": [], @@ -3634,7 +3617,7 @@ "answer": { "kind": "resolution", "status": "mixed", - "sentence": "Answered 1 of 2 parts. Kenya's external debt service owed to all creditors, 1970 to 2024. Current US dollars · World Bank International Debt Statistics (IDS). Assumed: every creditor. No match for price of tea. Try a different wording or a related indicator.", + "sentence": "Answered 1 of 2 parts. Kenya's external debt service owed to all creditors, 1970 to 2024. Current US dollars · World Bank International Debt Statistics (IDS). Assumed: every creditor. Search reached its time limit before answering this part. Try again, or ask a narrower question.", "complete": false, "specs": [ "spec_78d04fefc3b3f1ef71acd622957e4995" diff --git a/tools/capture_client_contract.py b/tools/capture_client_contract.py index b94d4c2..5b160cb 100644 --- a/tools/capture_client_contract.py +++ b/tools/capture_client_contract.py @@ -2832,10 +2832,10 @@ def derive(parent: dict[str, Any], ctx: Context) -> Derived: return derive -# The x-dfo-trace-id header the Search responses of `answer-timed-out` and -# `choose-refused-shared-label` carry. The first's answer_incomplete carries -# it, and the second's choice_invalid, which describes the caller's choice, -# does not. +# The x-dfo-trace-id header the Search responses of `answer-timed-out`, +# `answer-timed-out-keeps-reasons` and `choose-refused-shared-label` carry. The +# first two's answer_incomplete carries it, and the third's choice_invalid, +# which describes the caller's choice, does not. ANSWER_TRACE_ID = "5" * 32 @@ -2843,6 +2843,49 @@ def _timed_out(body: dict[str, Any]) -> None: body["diagnostics"]["timed_out"] = True +# The no_data message dfo-apis renders for the reason `timed_out`. +TIMED_OUT_MESSAGE = ( + "Search reached its time limit before answering this part. " + "Try again, or ask a narrower question." +) + + +def _part_timed_out(body: dict[str, Any]) -> None: + """Part 1 is the part Search left unresolved at its time limit: reason + timed_out and the message that reason renders, which is also its sentence + and its whole heading in the answer's composed sentence.""" + part = body["parts"][1] + part["no_data"]["reason"] = "timed_out" + part["no_data"]["message"] = TIMED_OUT_MESSAGE + part["rendered_sentence"] = TIMED_OUT_MESSAGE + (token,) = part["sentence_plan"] + token["text"] = TIMED_OUT_MESSAGE + plan = body["sentence_plan"] + indexes = [i for i, tok in enumerate(plan) if tok.get("part_index") == 1] + first, last = indexes[0], indexes[-1] + require(indexes == list(range(first, last + 1)), "part 1's tokens are adjacent") + heading = "".join(tok["text"] for tok in plan[first : last + 1]) + require(body["rendered_sentence"].endswith(heading), "part 1's tokens end it") + plan[first : last + 1] = [ + { + "kind": "text", + "text": TIMED_OUT_MESSAGE, + "segment": "heading", + "entity_refs": [], + "states": [], + "part_index": 1, + } + ] + body["rendered_sentence"] = ( + body["rendered_sentence"][: -len(heading)] + TIMED_OUT_MESSAGE + ) + + +def _timed_out_part(body: dict[str, Any]) -> None: + _timed_out(body) + _part_timed_out(body) + + def _unsupported(body: dict[str, Any]) -> None: part = body["parts"][1] del part["no_data"] @@ -4160,11 +4203,23 @@ def _empty_narrowing(parent: dict[str, Any], ctx: Context) -> Derived: Synthetic( "answer-timed-out", "answer-mixed-fetch-raises", - "The answer's diagnostics.timed_out becomes true, and its response carries " + "The answer's diagnostics.timed_out becomes true, part 1's no_data reason becomes " + "timed_out with the message that reason renders, and its response carries " f"x-dfo-trace-id {ANSWER_TRACE_ID}.", - "A no_data part of an answer whose diagnostics say Search timed out is a timed_out gap, " - "whatever its reason, and fetching the answer raises IncompleteAnswerError, which " - "describes the answer and carries its response's trace id.", + "A no_data part with reason timed_out, the reason Search gives a part it left " + "unresolved at its time limit, is a timed_out gap, and fetching the answer raises " + "IncompleteAnswerError, which describes the answer and carries its response's trace " + "id.", + _answer_edit(_timed_out_part, {"x-dfo-trace-id": ANSWER_TRACE_ID}), + ), + Synthetic( + "answer-timed-out-keeps-reasons", + "answer-mixed-fetch-raises", + "The answer's diagnostics.timed_out becomes true, part 1 keeps its reason " + f"variable_not_resolved, and its response carries x-dfo-trace-id {ANSWER_TRACE_ID}.", + "A no_data part's gap kind comes from its own reason, whatever diagnostics.timed_out " + "says. A part Search resolved before its time limit keeps its reason's gap kind, and " + "fetching the answer raises IncompleteAnswerError.", _answer_edit(_timed_out, {"x-dfo-trace-id": ANSWER_TRACE_ID}), ), Synthetic( diff --git a/tools/tests/test_capture_client_contract.py b/tools/tests/test_capture_client_contract.py index f51bc5d..9bad07f 100644 --- a/tools/tests/test_capture_client_contract.py +++ b/tools/tests/test_capture_client_contract.py @@ -379,22 +379,24 @@ def test_a_renamed_strict_field_ends_the_call_at_the_build() -> None: @pytest.mark.parametrize( - ("timed_out", "status", "expected"), + ("timed_out", "status", "reason", "expected"), [ - (False, "no_data", "not_understood"), - (True, "no_data", "timed_out"), - (False, "unsupported", "unsupported"), - (False, "deferred", "unknown"), + (False, "no_data", "variable_not_resolved", "not_understood"), + (True, "no_data", "variable_not_resolved", "not_understood"), + (False, "no_data", "timed_out", "timed_out"), + (False, "unsupported", "variable_not_resolved", "unsupported"), + (False, "deferred", "variable_not_resolved", "unknown"), ], ) def test_a_part_without_a_reading_is_a_gap_of_its_kind( - timed_out: bool, status: str, expected: str + timed_out: bool, status: str, reason: str, expected: str ) -> None: body = copy.deepcopy( _load("answer-mixed-fetch-raises")["exchanges"][0]["response"]["json"] ) body["diagnostics"]["timed_out"] = timed_out body["parts"][1]["status"] = status + body["parts"][1]["no_data"]["reason"] = reason gaps = capture.answer_gaps( capture.answer_from_body(body), capture.gap_kinds(ACTIONS) ) diff --git a/tools/tests/test_validate_client_contract.py b/tools/tests/test_validate_client_contract.py index 89a9859..d6418af 100644 --- a/tools/tests/test_validate_client_contract.py +++ b/tools/tests/test_validate_client_contract.py @@ -715,6 +715,11 @@ def change(doc: Any) -> None: _first_gap(kind="not_understood"), "step 0 expects", ), + ( + "scenarios/answer-timed-out-keeps-reasons.json", + _first_gap(kind="timed_out"), + "step 0 expects", + ), ( "scenarios/answer-unsupported-part.json", _first_gap(kind="unknown"), @@ -1648,11 +1653,6 @@ def change(doc: Any) -> None: _mentions_a_string, "the steps never make exchanges 1 to 1", ), - ( - "scenarios/answer-timed-out.json", - _set_body(0, lambda body: body.update(diagnostics="timed out")), - "step 0 expects", - ), ( "scenarios/answer-candidates-choose-fetch.json", _set_body( @@ -1703,6 +1703,7 @@ def change(doc: Any) -> None: "strict-fetch-made-lenient", "warn-notice-raises-on-strict", "expect-wrong-timed-out-gap", + "expect-timed-out-gap-over-the-reason", "expect-wrong-unsupported-gap", "known-kind-raises-nothing", "partial-fetch-nothing-answered", @@ -1900,7 +1901,6 @@ def change(doc: Any) -> None: "no-data-options-null-counted", "bound-entities-as-objects-compared", "mentions-as-a-string-matched", - "diagnostics-not-an-object-read", "candidate-spec-not-an-object-read", ], ) @@ -1949,6 +1949,36 @@ def change(doc: Any) -> None: assert not [p for p in problems if _CODELESS in p], problems +_DEGRADED = {"code": "engine_degraded", "severity": "degraded", "message": "slow"} + + +@pytest.mark.parametrize( + ("diagnostics", "warns"), + [ + ("timed out", False), + ([_DEGRADED], False), + ({"warnings": [_DEGRADED]}, True), + ], + ids=["a-string", "a-list-of-warnings", "an-object-as-control"], +) +def test_diagnostics_that_is_not_an_object_holds_no_warnings( + package_dir: Path, diagnostics: Any, warns: bool +) -> None: + """The served schema rejects the body, which is a separate problem. The + replay reads the answer, and a fetch that expects no SearchWarning holds + when diagnostics is a string or a list, even a list of warnings, and + differs from the expectation when it is an object whose warnings read.""" + target = "scenarios/answer-definite-fetch.json" + _edit( + package_dir / target, + _set_body(0, lambda body: body.update(diagnostics=diagnostics)), + ) + replayed = [ + p for p in validator.validate() if target in p and "response body:" not in p + ] + assert bool(replayed) is warns, replayed + + def test_one_record_that_crashes_its_derivation_is_its_own_problem( package_dir: Path, monkeypatch: pytest.MonkeyPatch ) -> None: diff --git a/tools/validate_client_contract.py b/tools/validate_client_contract.py index 604ba3b..296b5a3 100644 --- a/tools/validate_client_contract.py +++ b/tools/validate_client_contract.py @@ -1530,11 +1530,8 @@ def search_warning_code(answer: Answer) -> str | None: def answer_gaps(answer: Answer, kinds: Mapping[str, str]) -> list[dict[str, Any]]: """Each part without a reading. A candidates part is a choice among its - specs, a no_data part takes its reason's gap kind, or `timed_out` when the - answer timed out, an unsupported part is an `unsupported` gap, and a part - of unknown status is an `unknown` gap.""" - diagnostics = read_object(answer.body, "diagnostics") - timed_out = diagnostics is not None and diagnostics.get("timed_out") is True + specs, a no_data part takes its reason's gap kind, an unsupported part is + an `unsupported` gap, and a part of unknown status is an `unknown` gap.""" gaps = [] for index, part in enumerate(answer.parts): match part.get("status"): @@ -1544,11 +1541,7 @@ def answer_gaps(answer: Answer, kinds: Mapping[str, str]) -> list[dict[str, Any] kind, options = "choice", len(part["candidates"]["specs"]) case "no_data": no_data = part["no_data"] - kind = ( - "timed_out" - if timed_out - else kinds.get(no_data["reason"], "no_data") - ) + kind = kinds.get(no_data["reason"], "no_data") options = len(read_objects(no_data, "options")) case "unsupported": kind, options = "unsupported", 0 From 706f3e2679e502da7147e3248f7942114c889bda Mon Sep 17 00:00:00 2001 From: Jorge Rivera Date: Mon, 26 Oct 2026 09:04:44 +0100 Subject: [PATCH 04/12] docs: add MIT licence and rewrite docs for public readers (#7) --- CONTRIBUTING.md | 62 ++++++++++++++++++++++++++++ LICENSE | 22 ++++++++++ README.md | 98 +++++++++++++++++++++++++++------------------ docs/development.md | 31 ++++++++++++++ 4 files changed, 173 insertions(+), 40 deletions(-) create mode 100644 CONTRIBUTING.md create mode 100644 LICENSE create mode 100644 docs/development.md diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 0000000..576963f --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,62 @@ +# Contributing + +Issues and pull requests are welcome. The ONE Data team maintains this repository. For a large change, such as a new contract, a schema change, or a new package, open an issue first so the design can be discussed before you write it. + +Please follow the [Code of Conduct](https://github.com/DevelopmentFinanceObservatory/.github/blob/main/CODE_OF_CONDUCT.md). Report security problems through GitHub private vulnerability reporting (the "Report a vulnerability" button under the Security tab, see the [security policy](https://github.com/DevelopmentFinanceObservatory/.github/blob/main/SECURITY.md)), and keep them out of public issues. For questions, see [SUPPORT.md](https://github.com/DevelopmentFinanceObservatory/.github/blob/main/SUPPORT.md). + +## Setup + +Everything runs locally and needs no access to ONE's Google Cloud project. Install [uv](https://docs.astral.sh/uv/) and clone the repository. Each package under `python/` is its own uv project with a committed `uv.lock`, so work from inside the package directory: + +```bash +cd python/spec-kit +uv sync +``` + +The six packages are `spec-kit`, `frame-grammar`, `dfo-spec-kit-components`, `provenance-docs`, `descriptions`, and `client-contract`. Python 3.12 or later is required, and CI also runs 3.13. + +## Checks before a pull request + +Run these in each package you changed. They are the commands CI runs. + +```bash +uv run pytest +uv run ruff check . +uv run ruff format --check . +uv run ty check src/ +``` + +`` is `dfo_spec_kit`, `dfo_frame_grammar`, `dfo_spec_kit_components`, `dfo_provenance_docs`, `dfo_descriptions`, or `dfo_client_contract`. `uv run ruff format .` rewrites files to the formatter's style. Each package also has a `.pre-commit-config.yaml`. `pre-commit install` runs the same linters, plus codespell, actionlint, and mdformat, on each commit. + +### Conformance vectors and registries + +The validators under `tools/` check the registries and vector suites without importing the packages, so they test the fixtures independently of the implementations. Run them from the repository root. Each is a self-contained script and uv installs its dependencies. + +```bash +uv run tools/validate_registry.py +uv run tools/validate_unit_registry.py +uv run tools/validate_vectors.py +uv run tools/validate_frame_vectors.py +uv run tools/validate_unit_vectors.py +uv run tools/validate_provenance_docs_vectors.py +uv run tools/validate_descriptions_vectors.py +uv run tools/validate_client_contract.py +uv run --with jsonschema --with pytest pytest tools/tests -q +``` + +The last command tests the validators themselves. [tools/README.md](tools/README.md) says what each validator checks. Each package's tests drive its implementation against the same vectors or fixtures, and `uv run pytest` runs them. + +A change to `registries/codes.json` or `registries/units.json` also needs the packaged mirror under `python/spec-kit/src/dfo_spec_kit/` to match byte for byte. The validators fail if the two differ. Edit the file under `registries/` and copy it to the mirror. [registries/README.md](registries/README.md) has the format. + +## Branches and commits + +Open pull requests against `dev`, the default branch. CI runs on pull requests and pushes to `dev` and `main`, and skips draft pull requests until they are marked ready for review. Commit messages follow Conventional Commits, for example `ci: run spec-kit CI on dev and main`. + +## What a pull request needs + +- Passing CI, meaning the lint, test, and validator jobs in `.github/workflows/ci.yml`. +- Tests for new behaviour. A change to a contract updates its vectors in the same pull request. +- Updated docs. A change to a package's public behaviour adds an entry under `Unreleased` in that package's `CHANGELOG.md`. +- Compliance with [policies/](policies/README.md), which says which change to which artifact needs which version bump. + +Maintainer notes, such as how the packages depend on one another and how releases are checked, are in [docs/development.md](docs/development.md). diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..4b7a716 --- /dev/null +++ b/LICENSE @@ -0,0 +1,22 @@ + +MIT License + +Copyright (c) 2026 ONE Campaign + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/README.md b/README.md index d290c0e..670e102 100644 --- a/README.md +++ b/README.md @@ -1,26 +1,54 @@ -# dfo-spec-kit +# DFO spec kit -The executable form of the platform's shared contracts. It exists so the consumers of these contracts, the Search API in `apis`, the harness and Analysis MCP in `ai`, the website, and the docs, share one source of truth instead of hand-maintained mirrors. This repo is not the spec registry nor the op-spec schema. +The spec kit holds the shared data contracts of the Development Finance Observatory as JSON schemas, registries, conformance vectors, and Python packages that implement them. Services that must agree on the same bytes, ids, and document formats import them from here instead of keeping their own copies. -The target design (repository shape, artifact families, versioning, governance, and delivery sequence) lives in the kit design, maintained outside this repo. This README only orients. That document is authoritative. +It is part of the [Development Finance Observatory](https://github.com/DevelopmentFinanceObservatory), an initiative of [ONE Data](https://data.one.org) built on [Google Data Commons](https://datacommons.org). The org profile has the map of all repositories. The services that consume the kit are `apis` (the Search API), `ai` (the harness and Analysis MCP), `website`, and `docs`. -## Two schema families +This repository is under active development. Interfaces, schemas, and data may change without notice. -The kit carries two schema families. +## What the kit is for -The **dataset-spec family** (spec models, identity projection, JCS canonicalisation, SHA-256 hashing) is Python-first. The behaviour lives in Python, and JSON Schema is exported from the pydantic models. +Each contract answers one question that two or more services must answer identically. -The **component-spec family** (the presentation catalogue, composition schema, operation union) is TypeScript-first. Zod v4 is the author and validator, and generated artifacts (TS prop types, Pydantic models, tool metadata) are frozen and checked for drift. Each family is authored in the language where its behaviour lives. Committed JSON Schema is the neutral frozen centre between them, held together by cross-language conformance fixtures. +- Which dataset is this request asking for? A dataset spec is reduced to a canonical form and hashed into a `spec_id`, so every service mints the same id for the same request. +- Has this table of observations changed? A materialised frame is serialised to canonical bytes and hashed into a `content_version`. +- How do units compare? A unit ref reads as a typed value (money with a currency and price basis, a percent, a count), and refuses comparisons that would mix price bases. +- What does a card or chart look like on the wire? A catalogue of JSON schemas describes each presentation component. +- How is a result documented? Step records and descriptions say what was done to a result, and provenance documents carry transformations, changelogs, and methodology. +- What do the DFO clients expect from the API? The client contract holds the served OpenAPI document, the response members the clients act on, the next step for each refusal code, and recorded scenarios the clients replay. The API's CI checks its app against the same files. -## Status +Every contract ships with conformance vectors, language-neutral fixtures that any implementation, in any language, can run against. Where prose and vectors disagree, the vectors win. -Six Python distributions exist so far. `python/spec-kit/` (`dfo-spec-kit`, import `dfo_spec_kit`): `identity/` implements the spec1 identity scheme (role-slot projection, JCS canonicalisation, SHA-256 `spec_id` minting), conformance-tested against the vector suite. `units/` reads a unit ref into a typed value (`Money`, `UnpricedMoney`, `Percent`, `Count` or `Other`) from `registries/units.json`, conformance-tested against `vectors/units/`. Money whose ref leaves prices unstated cannot be compared until `complete_prices` applies the StatVar's measurement qualifier, and constant-price money with no base year cannot be compared at all. `models/` has no code yet; model extraction comes next. `python/frame-grammar/` (`dfo-spec-kit-frame-grammar`, import `dfo_frame_grammar`): the frame grammar's executable form -- canonical frame bytes and `content_version` minting for a materialised observation table -- conformance-tested against its own vector suite, and depending on `dfo-spec-kit` for the identity canonicalisation primitives it reuses. `python/dfo-spec-kit-components/` (`dfo-spec-kit-components`, import `dfo_spec_kit_components`): the presentation contract bundle as package data, holding the envelope schema, the per-member component schemas, the write-side intent grammar, and their conformance fixtures. Generated Pydantic models for the catalogue land in this same package once the catalogue freezes. `python/provenance-docs/` (`dfo-spec-kit-provenance-docs`, import `dfo_provenance_docs`): the provenance documentation grammar, which decodes the escaped Markdown documents a Provenance node carries and parses the transformations, changelog, methodology and notes templates, conformance-tested against its own vector suite. `python/descriptions/` (`dfo-spec-kit-descriptions`, import `dfo_descriptions`): the step records and descriptions contract, holding the step schema, the operation list, the description schema and a check of the structure rules a step list must meet beyond its schema, conformance-tested against its own vector suite. `python/client-contract/` (`dfo-spec-kit-client-contract`, import `dfo_client_contract`): the contract the DFO Python and TypeScript clients are built to, as package data: the served OpenAPI document of the composed dfo-apis app, the response members the clients act on, the caller's next step for each refusal code, the code of each error a client raises itself, the scenario and `DatasetRef` formats with their records, and the client rules with their vectors. dfo-apis CI checks its app against the same files. +## Packages -The Python distributions live at `python/spec-kit/`, `python/frame-grammar/`, `python/dfo-spec-kit-components/`, `python/provenance-docs/`, `python/descriptions/`, and `python/client-contract/`, each its own installable unit with its own version and dependency surface. A TypeScript package (`ts/`) opens only when the component catalogue freeze lands. +Six Python distributions live under `python/`. Each has its own version, dependencies, tests, and README. All need Python 3.12 or later. -`dfo-spec-kit-frame-grammar` depends on `dfo-spec-kit` as an intra-repo path source rather than a git dependency, so the two packages develop together in this repo: a change to identity canonicalisation and a change here that depends on it land in the same commit. `dfo-spec-kit-components` depends on `dfo-spec-kit-descriptions` as an intra-repo path source, because the envelope's `description` references `description.schema.json` by its `$id`. A consumer pins both distributions at one revision. Its catalogue bundle is static data plus one accessor function, `bundle_dir()`. `dfo-spec-kit-provenance-docs` also stands alone, depending on `markdown-it-py` only. `dfo-spec-kit-descriptions` depends on `rfc8785` only. `dfo-spec-kit-client-contract` depends on the standard library only. +| Distribution | Import name | What it does | +| ------------------------------ | ------------------------- | ------------------------------------------------------------------------------------------------------------------------- | +| `dfo-spec-kit` | `dfo_spec_kit` | Dataset-spec identity (canonical form, `spec_id`) and typed units read from `registries/units.json`. | +| `dfo-spec-kit-frame-grammar` | `dfo_frame_grammar` | Canonical frame bytes and `content_version` for a materialised observation table. | +| `dfo-spec-kit-components` | `dfo_spec_kit_components` | The presentation catalogue: envelope and component schemas, the write-side intent grammar, and fixtures, as package data. | +| `dfo-spec-kit-provenance-docs` | `dfo_provenance_docs` | Decoder and parsers for the Markdown documents a Provenance node carries. | +| `dfo-spec-kit-descriptions` | `dfo_descriptions` | Step and description schemas, the operation list, and a check of the rules a step list must meet. | +| `dfo-spec-kit-client-contract` | `dfo_client_contract` | The contract the DFO clients are built to: served OpenAPI document, strict fields, refusal actions, scenarios, rules. | -Publishing is undecided: no registry workflow exists for any package. Until that's resolved, install a Python package as a git dependency pinned to one commit, e.g. +`dfo-spec-kit-frame-grammar` depends on `dfo-spec-kit`. `dfo-spec-kit-components` depends on `dfo-spec-kit-descriptions`. The other four have no dependency inside the kit. + +## What's inside + +```text +docs/ normative specifications: identity-v1.md, frame-grammar-v1.md, and maintainer notes +policies/ compatibility policy per artifact family +python/ the six packages +registries/ codes.json (warning and refusal codes) and units.json (unit refs) +schemas/ JSON Schema for the registries and the vector suites +tools/ validators for the registries, vector suites, and client contract +vectors/ cross-language conformance vectors for identity and units +``` + +## Getting started + +No package is published to PyPI. Install from git, pinned to one commit. Replace `` with a commit SHA from this repository. ```bash uv add "git+https://github.com/DevelopmentFinanceObservatory/spec-kit@#subdirectory=python/spec-kit" @@ -31,7 +59,7 @@ uv add "git+https://github.com/DevelopmentFinanceObservatory/spec-kit@#subd uv add "git+https://github.com/DevelopmentFinanceObservatory/spec-kit@#subdirectory=python/client-contract" ``` -A package's metadata names its intra-repo dependency by distribution name alone, and no index serves these distributions. uv reads the path source in `[tool.uv.sources]` and resolves the dependency from the same checkout, so `uv add` of `frame-grammar` or `dfo-spec-kit-components` alone installs `dfo-spec-kit` or `dfo-spec-kit-descriptions` at that commit. Every other installer reads the bare name and fails, so name both distributions at the same commit: +A package declares its kit dependency by name only. uv resolves it from the same commit through a path source in the package's `[tool.uv.sources]`, so `uv add` of `frame-grammar` also installs `dfo-spec-kit`. Other installers read the bare name and fail, so with pip name both distributions at the same commit: ```bash pip install \ @@ -39,7 +67,7 @@ pip install \ "dfo-spec-kit-descriptions @ git+https://github.com/DevelopmentFinanceObservatory/spec-kit@#subdirectory=python/descriptions" ``` -A uv project pins each kit distribution it imports in its own `[tool.uv.sources]`, every entry at the same `rev`, as `apis` pins `dfo-spec-kit-components` and `dfo-spec-kit-frame-grammar`: +A uv project that imports more than one kit distribution pins each in its own `[tool.uv.sources]`, every entry at the same `rev`: ```toml [tool.uv.sources] @@ -47,30 +75,20 @@ dfo-spec-kit-components = { git = "https://github.com/DevelopmentFinanceObservat dfo-spec-kit-descriptions = { git = "https://github.com/DevelopmentFinanceObservatory/spec-kit.git", rev = "", subdirectory = "python/descriptions" } ``` -## Layout +The kit needs no access to ONE's Google Cloud project. Everything here installs, runs, and tests locally. -``` -dfo-spec-kit/ -├── docs/frame-grammar-v1.md # the normative frame grammar / content_version specification -├── docs/identity-v1.md # the normative identity binding-state denotation specification -├── schemas/registry/ # JSON Schema for the code registry -├── schemas/spec/ # frozen JSON Schema exported from the pydantic models -├── schemas/vectors/ # record schemas + docs for the identity and unit vector suites -├── registries/codes.json # the seeded warning/refusal code registry -├── registries/units.json # the unit refs dfo_spec_kit.units types, its currency prefixes and codes -├── vectors/identity/ # cross-language identity conformance fixtures -├── vectors/units/ # cross-language typed-unit conformance fixtures -├── python/spec-kit/ # the dfo-spec-kit package (import dfo_spec_kit) -├── python/frame-grammar/ # the dfo-spec-kit-frame-grammar package (import dfo_frame_grammar), -│ # its own frame grammar vector suite shipped as package data -├── python/dfo-spec-kit-components/ # the dfo-spec-kit-components package (import dfo_spec_kit_components), -│ # the presentation catalogue bundle shipped as package data -├── python/provenance-docs/ # the dfo-spec-kit-provenance-docs package (import dfo_provenance_docs), -│ # the provenance documentation grammar and its vector suite as package data -├── python/descriptions/ # the dfo-spec-kit-descriptions package (import dfo_descriptions), -│ # the step and description schemas, the operation list and their vector suite as package data -├── python/client-contract/ # the dfo-spec-kit-client-contract package (import dfo_client_contract), -│ # the served OpenAPI document, strict fields, caller actions, scenarios, ref format and client rules as package data -├── policies/ # compatibility policy per artifact family -└── tools/ # codegen + drift-check scripts, including the registry and vector validators -``` +## Documentation + +- [docs/identity-v1.md](docs/identity-v1.md) specifies what a spec identity's bindings denote. +- [docs/frame-grammar-v1.md](docs/frame-grammar-v1.md) specifies the frame byte grammar and `content_version`. +- Each package README under `python/` documents that package's API and vector suite. +- [policies/](policies/README.md) states which change to which artifact needs which version bump. +- [docs/development.md](docs/development.md) holds maintainer notes. + +## Contributing + +Issues and pull requests are welcome. See [CONTRIBUTING.md](CONTRIBUTING.md). + +## Licence + +MIT. See [LICENSE](LICENSE). diff --git a/docs/development.md b/docs/development.md new file mode 100644 index 0000000..5f2ba4c --- /dev/null +++ b/docs/development.md @@ -0,0 +1,31 @@ +# Maintainer notes + +Background on how the repository fits together. Contributors do not need it to open a pull request (see [CONTRIBUTING.md](../CONTRIBUTING.md)). + +## Two schema families + +The kit carries two schema families, each authored in the language where its behaviour lives. Committed JSON Schema is the neutral centre between them, held together by cross-language conformance vectors. + +The dataset-spec family (spec models, identity projection, JCS canonicalisation, SHA-256 hashing) is Python-first. The behaviour lives in `python/spec-kit`, and `schemas/spec/` is the place for JSON Schema exported from its pydantic models. It holds only a README today, because `dfo_spec_kit.models` has no code yet. + +The component-spec family (the presentation catalogue, composition schema, operation union) is TypeScript-first: Zod v4 authors and validates, and generated artifacts (TypeScript prop types, Pydantic models, tool metadata) are checked for drift. The family's artifact in this repository is the catalogue bundle in `python/dfo-spec-kit-components/`. The repository has no TypeScript package. + +[policies/dataset-spec.toml](../policies/dataset-spec.toml) and [policies/component-spec.toml](../policies/component-spec.toml) state the compatibility rules for each family. + +## Dependencies between packages + +`dfo-spec-kit-frame-grammar` depends on `dfo-spec-kit` through a path source (`../spec-kit`, editable) in its `[tool.uv.sources]`. The two packages develop together here, so a change to identity canonicalisation and a change in the frame grammar that depends on it land in the same commit. + +`dfo-spec-kit-components` depends on `dfo-spec-kit-descriptions` the same way, because the envelope's `description` references `description.schema.json` by its `$id`. The catalogue bundle is static data plus one accessor function, `bundle_dir()`. + +`dfo-spec-kit-provenance-docs` depends on `markdown-it-py` only. `dfo-spec-kit-descriptions` depends on `rfc8785` only. `dfo-spec-kit-client-contract` depends on the standard library only. + +A package's published metadata names its kit dependency by distribution name alone, and no index serves these distributions. uv reads the path source and resolves the dependency from the same checkout. Every other installer reads the bare name and fails, which is why the README shows pip installs that name both distributions at one commit. A consumer pins both at one revision. + +## Releases + +No registry workflow exists for any package, so releases are git revisions. The compatibility policies define "released" as reachable from the most recent git tag matching `v*`. `tools/validate_registry.py` diffs the working registry against that tag to enforce that published code entries do not change, apart from the deletion exception named in the script and growth of a published entry's `mappings`. This repository has no tag reachable from `dev`, so the check is skipped and the `registry` CI job fetches full history so that it can run once one exists. + +## Ownership + +`CODEOWNERS` lists a maintainer for `/schemas/`, `/registries/`, `/vectors/`, and `/python/`. From 3091b712c2a48f7ddfbc4c438b79cae74b5934be Mon Sep 17 00:00:00 2001 From: Jorge Rivera Date: Mon, 26 Oct 2026 09:08:25 +0100 Subject: [PATCH 05/12] docs(client-contract): state build joining, the fetch wait and the base URL rule (#23) A POST for a build identical to one pending or running returns that operation, so a client that stops waiting can post again to join it. fetch waits with no whole-call deadline by default, and a download that delivers no byte for 30 s is a retryable network_error. The new base-url rule orders the argument, DFO_BASE_URL and the public default, with 14 vectors replayed by a reference resolver in tests/test_rules.py. --- python/client-contract/CHANGELOG.md | 3 +- python/client-contract/README.md | 6 +- .../src/dfo_client_contract/contract.py | 1 + .../src/dfo_client_contract/rules/README.md | 12 +- .../dfo_client_contract/rules/base-url.json | 122 ++++++++++++++++++ .../rules/rules.schema.json | 71 ++++++++++ python/client-contract/tests/test_rules.py | 33 +++++ 7 files changed, 243 insertions(+), 5 deletions(-) create mode 100644 python/client-contract/src/dfo_client_contract/rules/base-url.json diff --git a/python/client-contract/CHANGELOG.md b/python/client-contract/CHANGELOG.md index 9e1dfce..ae0b8e0 100644 --- a/python/client-contract/CHANGELOG.md +++ b/python/client-contract/CHANGELOG.md @@ -22,6 +22,7 @@ All notable changes to the `dfo-spec-kit-client-contract` Python package will be - `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. - `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 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, and the cache directory and layout. +- 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`. +- 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 46b29ef..af3d9e1 100644 --- a/python/client-contract/README.md +++ b/python/client-contract/README.md @@ -176,7 +176,7 @@ The records also fix these client rules: - 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 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 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 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. - Each retry waits the refusal's `Retry-After` when it carries one, and otherwise the client's backoff for that attempt: 0.5 seconds before the first retry, doubling to at most 8. The build's 504 cut-off retry follows the same rule. `retry_waits` pins these waits, and `fetch-spec-504-retry-after` pins a cut-off that carries `Retry-After`. @@ -184,7 +184,7 @@ The records also fix these client rules: - A `request(method, path)` whose `path` is not a path on the base URL, because it starts with `//` or names a scheme, raises `InvalidRequestError` `invalid_argument` before any request. No scenario step makes such a request. - A 2xx response of a JSON route with no JSON body raises `ContractError` `unexpected_response`. `search-no-json-body` pins it for Search. - A `Deprecation` or `Sunset` header on an API response, either alone, issues `route_deprecated` once per process per distinct pair of their values, and an `x-dfo-warning` header issues `server_warning` once per process per message. A signed fetch's headers issue nothing. `search-sunset-warning` pins a Sunset header alone, issued once over two responses that carry the same value, and `search-server-warning` pins a repeated `x-dfo-warning` message issued once, a new message issued again, and a Deprecation beside the same Sunset issued as a new pair. -- Python synchronous platform name resolution can exceed the following timeout and deadline limits. Asynchronous name resolution is cancellable. Timeouts follow the clients' design and are not replayed, since the replay advances the clock only by the waits the client asks for: the client's `timeout`, 30 s by default, bounds one request attempt; `search(timeout=60)` bounds the whole search, each attempt reading until that deadline, and None means no limit; `fetch(timeout=1800)` bounds the whole fetch, each download getting the time left on the fetch's deadline; a synchronous build POST, and mint's POST, read for up to 150 s within any outer deadline; `result(timeout=1800)` bounds the wait, and None means no limit. A poll attempt that hangs past the per-attempt timeout spends a retry, and a deadline that passes during a body read raises `DfoTimeoutError` `deadline_exceeded`. In TypeScript an infinite remaining time arms no timer, and a finite one above 2^31-1 ms is clamped. No scenario step takes a timeout. +- Python synchronous platform name resolution can exceed the following timeout and deadline limits. Asynchronous name resolution is cancellable. Timeouts follow the clients' design and are not replayed, since the replay advances the clock only by the waits the client asks for: the client's `timeout`, 30 s by default, bounds one request attempt; `search(timeout=60)` bounds the whole search, each attempt reading until that deadline, and None means no limit; `fetch` waits for a build with no whole-call deadline by default, and `fetch(timeout=60)` bounds the whole fetch, each download getting the time left on the fetch's deadline; a download that delivers no byte for 30 s raises the retryable `network_error`; a synchronous build POST, and mint's POST, read for up to 150 s within any outer deadline; `result(timeout=1800)` bounds the wait, and None means no limit. A poll attempt that hangs past the per-attempt timeout spends a retry, and a deadline that passes during a body read raises `DfoTimeoutError` `deadline_exceeded`. In TypeScript an infinite remaining time arms no timer, and a finite one above 2^31-1 ms is clamped. No scenario step takes a timeout. ## Recording @@ -215,7 +215,7 @@ A record's `origin.base_url` is the base URL the run was given, a local app's in ## Rules -`rules/README.md` states the shared rules for credentials, key lookup and format, 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, 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`. ## Validation diff --git a/python/client-contract/src/dfo_client_contract/contract.py b/python/client-contract/src/dfo_client_contract/contract.py index 9503495..d0cbc9a 100644 --- a/python/client-contract/src/dfo_client_contract/contract.py +++ b/python/client-contract/src/dfo_client_contract/contract.py @@ -13,6 +13,7 @@ "credentials-path", "credentials-file", "key-lookup", + "base-url", "cache-dir", "cache-layout", ) 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 fdd4a5e..41cae91 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 and credentials 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; 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`) @@ -34,6 +34,16 @@ A client resolves its key when it is built, and again after a 401. The first sou A missing file goes on to the next source, and so does a missing `default` profile. A file that fails to parse raises `credentials_file_invalid`, a profile named by `DFO_PROFILE` that the file lacks raises `profile_not_found`, and a chosen profile with no `key`, or an empty one, raises `profile_without_key`. The file is read only when no earlier source wins. The argument may also be a callable or a key object, called or unwrapped when the client resolves the key. The vectors pass strings, and the Colab source has no vectors. +## Base URL (`base-url`) + +A client resolves its base URL when it is built. The first source found wins: + +1. the `base_url` argument of the call or constructor, as given; +1. `DFO_BASE_URL`; +1. the public default, `https://developmentfinance.org/api/v1`. + +Only the chosen source is checked. A base URL is valid when it is an absolute `http` or `https` URL with a host and no userinfo. An invalid one raises `base_url_invalid`, so an empty `base_url` argument raises it where an empty `DFO_BASE_URL` counts as unset. A valid value is used as given; the rule fixes the source and the validity, and leaves the URL's form to the client. A key sent over plain `http` to a host that is not loopback is refused by `insecure_transport`, which this rule does not decide. + ## Key format (`key-format`) A secret key is `dfo_k_`, then a base62 body, then a 6-character checksum; `dfo_p_` marks a browser-safe key. Base62 is `0-9A-Za-z` in that order. The checksum is the CRC32 (ISO-HDLC, as zlib computes it) of the body's ASCII bytes, written in base62 and left-padded with `0` to six characters. Issued keys have a 32-character body, 44 characters in all, but the check ignores length. The last six characters after the prefix are the checksum and the rest is the body. diff --git a/python/client-contract/src/dfo_client_contract/rules/base-url.json b/python/client-contract/src/dfo_client_contract/rules/base-url.json new file mode 100644 index 0000000..4fde759 --- /dev/null +++ b/python/client-contract/src/dfo_client_contract/rules/base-url.json @@ -0,0 +1,122 @@ +{ + "format_version": 1, + "rule": "base-url", + "vectors": [ + { + "name": "argument-wins", + "base_url": "https://arg.example.org/api/v1", + "env": { + "DFO_BASE_URL": "https://env.example.org/api/v1" + }, + "source": "argument", + "url": "https://arg.example.org/api/v1" + }, + { + "name": "environment-beats-default", + "env": { + "DFO_BASE_URL": "https://env.example.org/api/v1" + }, + "source": "environment", + "url": "https://env.example.org/api/v1" + }, + { + "name": "default", + "env": {}, + "source": "default", + "url": "https://developmentfinance.org/api/v1" + }, + { + "name": "empty-environment-counts-as-unset", + "env": { + "DFO_BASE_URL": "" + }, + "source": "default", + "url": "https://developmentfinance.org/api/v1" + }, + { + "name": "loopback-http-is-valid", + "base_url": "http://127.0.0.1:8083/api", + "env": {}, + "source": "argument", + "url": "http://127.0.0.1:8083/api" + }, + { + "name": "empty-argument-raises", + "base_url": "", + "env": { + "DFO_BASE_URL": "https://env.example.org/api/v1" + }, + "error": { + "reason": "base_url_invalid" + } + }, + { + "name": "invalid-argument-raises-despite-valid-environment", + "base_url": "not a url", + "env": { + "DFO_BASE_URL": "https://env.example.org/api/v1" + }, + "error": { + "reason": "base_url_invalid" + } + }, + { + "name": "relative-argument-raises", + "base_url": "/api/v1", + "env": {}, + "error": { + "reason": "base_url_invalid" + } + }, + { + "name": "schemeless-argument-raises", + "base_url": "developmentfinance.org/api/v1", + "env": {}, + "error": { + "reason": "base_url_invalid" + } + }, + { + "name": "other-scheme-raises", + "base_url": "ftp://developmentfinance.org/api/v1", + "env": {}, + "error": { + "reason": "base_url_invalid" + } + }, + { + "name": "hostless-argument-raises", + "base_url": "https:///api/v1", + "env": {}, + "error": { + "reason": "base_url_invalid" + } + }, + { + "name": "userinfo-raises", + "base_url": "https://ana:secret@developmentfinance.org/api/v1", + "env": {}, + "error": { + "reason": "base_url_invalid" + } + }, + { + "name": "invalid-environment-raises", + "env": { + "DFO_BASE_URL": "developmentfinance.org" + }, + "error": { + "reason": "base_url_invalid" + } + }, + { + "name": "invalid-environment-is-not-read-when-the-argument-wins", + "base_url": "https://arg.example.org/api/v1", + "env": { + "DFO_BASE_URL": "developmentfinance.org" + }, + "source": "argument", + "url": "https://arg.example.org/api/v1" + } + ] +} 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 9a33072..82b5da2 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 @@ -17,6 +17,9 @@ { "$ref": "#/$defs/key_lookup" }, + { + "$ref": "#/$defs/base_url" + }, { "$ref": "#/$defs/cache_dir" }, @@ -365,6 +368,74 @@ } } }, + "base_url": { + "$ref": "#/$defs/suite", + "additionalProperties": false, + "properties": { + "format_version": true, + "rule": { + "const": "base-url" + }, + "vectors": { + "items": { + "type": "object", + "additionalProperties": false, + "required": [ + "name", + "env" + ], + "oneOf": [ + { + "required": [ + "source", + "url" + ] + }, + { + "required": [ + "error" + ] + } + ], + "properties": { + "name": { + "$ref": "#/$defs/name" + }, + "base_url": { + "description": "The base URL argument of the call or constructor, which may be the empty string a client refuses. Absent when the caller passes none.", + "type": "string" + }, + "env": { + "$ref": "#/$defs/env" + }, + "source": { + "enum": [ + "argument", + "environment", + "default" + ] + }, + "url": { + "type": "string", + "minLength": 1 + }, + "error": { + "type": "object", + "additionalProperties": false, + "required": [ + "reason" + ], + "properties": { + "reason": { + "const": "base_url_invalid" + } + } + } + } + } + } + } + }, "cache_dir": { "$ref": "#/$defs/suite", "additionalProperties": false, diff --git a/python/client-contract/tests/test_rules.py b/python/client-contract/tests/test_rules.py index 79e438d..0564749 100644 --- a/python/client-contract/tests/test_rules.py +++ b/python/client-contract/tests/test_rules.py @@ -13,6 +13,7 @@ import tomllib import zlib from typing import Any +from urllib.parse import urlsplit import pytest @@ -20,6 +21,7 @@ _BASE62 = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz" _KEY_PREFIXES = ("dfo_k_", "dfo_p_") +_DEFAULT_BASE_URL = "https://developmentfinance.org/api/v1" _TABLE = re.compile(r"\[([A-Za-z0-9_-]+)\]") _ENTRY = re.compile(r'([A-Za-z0-9_-]+)[ \t]*=[ \t]*"([^"\\\x00-\x1f\x7f]*)"') @@ -123,6 +125,27 @@ def look_up_key(vector: dict[str, Any]) -> tuple[str, str | None]: return "credentials_file", profile["key"] +def is_valid_base_url(url: str) -> bool: + parts = urlsplit(url) + return ( + parts.scheme in ("http", "https") + and bool(parts.hostname) + and "@" not in parts.netloc + ) + + +def resolve_base_url(vector: dict[str, Any]) -> tuple[str, str]: + if (argument := vector.get("base_url")) is not None: + source, url = "argument", argument + elif from_env := _set(vector["env"], "DFO_BASE_URL"): + source, url = "environment", from_env + else: + source, url = "default", _DEFAULT_BASE_URL + if not is_valid_base_url(url): + raise RuleError("base_url_invalid") + return source, url + + def cache_root(vector: dict[str, Any]) -> str: platform, home, env = vector["platform"], vector["home"], vector["env"] path = ntpath if platform == "windows" else posixpath @@ -202,6 +225,16 @@ def test_key_lookup(vector: dict[str, Any]) -> None: assert look_up_key(vector) == (vector["source"], vector["key"]) +@pytest.mark.parametrize("vector", _vectors("base-url"), ids=_ids("base-url")) +def test_base_url(vector: dict[str, Any]) -> None: + if "error" in vector: + with pytest.raises(RuleError) as excinfo: + resolve_base_url(vector) + assert excinfo.value.reason == vector["error"]["reason"] + return + assert resolve_base_url(vector) == (vector["source"], vector["url"]) + + @pytest.mark.parametrize("vector", _vectors("cache-dir"), ids=_ids("cache-dir")) def test_cache_dir(vector: dict[str, Any]) -> None: path = ntpath if vector["platform"] == "windows" else posixpath From a1d723bf424e37cd499aece8ae2c1b62c2956cc8 Mon Sep 17 00:00:00 2001 From: Jorge Rivera Date: Mon, 26 Oct 2026 11:24:55 +0100 Subject: [PATCH 06/12] feat(client-contract): leave out party totals by default and order columns for reading (#24) A fetch now posts "without_party_totals": true unless the caller passes party_totals (Python) or partyTotals (TypeScript). A role the caller binds keeps what it binds. The wire flag is unchanged; only the client default moves. The new column-order rule (rules/column-order.json, nine slots with vectors) puts time period, provider, recipient, subject, purpose, value, unit, flow type and provenance first, then the served order, with stat_var last. A client hashes the downloaded file before it orders the columns, so digests and refs keep the server's file. Every scenario is re-recorded against apis dev at c9a1b905, and served/openapi.json is recaptured. Two new recorded scenarios, fetch-spec-party-totals-left-out and fetch-spec-party-totals-kept, pin the default and the option. Every accepted ref example now carries the rendering, parts, content version and sentence of a member its scenario served, so ref-one-member pins the plain rendering from fetch-spec-party-totals-kept and ref-answer-member comes from answer-definite-fetch. The validator checks both, with a fault row each. Every scenario is re-recorded against the deployed dfo-apis dev app at d80df9f5f, with the served document captured from that commit. The long-build scenarios start at 1967 and 1968, years dev had not built. --- .github/workflows/ci.yml | 2 +- python/client-contract/CHANGELOG.md | 8 +- python/client-contract/README.md | 19 +- .../src/dfo_client_contract/contract.py | 1 + .../refs/ref-answer-member.json | 71 +- .../refs/ref-bare-definition-rejected.json | 3 +- .../ref-definition-extra-member-rejected.json | 3 +- ...-definition-spec-id-mismatch-rejected.json | 3 +- ...-definition-without-identity-rejected.json | 3 +- ...ition-without-schema-version-rejected.json | 3 +- .../refs/ref-frame-layout.json | 3 +- .../refs/ref-one-member.json | 68 +- .../refs/ref-repeated-spec-id-rejected.json | 10 +- .../refs/ref-without-party-totals.json | 2 +- .../src/dfo_client_contract/rules/README.md | 22 +- .../rules/column-order.json | 529 ++ .../rules/rules.schema.json | 92 + .../dfo_client_contract/scenario.schema.json | 8 + .../answer-candidate-specs-not-a-list.json | 62 +- .../answer-candidates-choose-fetch.json | 106 +- .../scenarios/answer-catalogue.json | 16 +- .../scenarios/answer-declined.json | 18 +- .../scenarios/answer-definite-fetch.json | 76 +- .../answer-definition-spec-id-mismatch.json | 44 +- .../scenarios/answer-empty-parts.json | 12 +- .../answer-folded-parts-unnamed.json | 162 +- .../scenarios/answer-mixed-fetch-partial.json | 74 +- .../scenarios/answer-mixed-fetch-raises.json | 52 +- .../answer-nested-specs-unchecked.json | 48 +- .../answer-operations-not-a-list.json | 72 +- .../answer-part-status-not-a-string.json | 48 +- .../answer-several-readings-folded.json | 166 +- .../answer-spec-without-identity.json | 44 +- .../answer-spec-without-resolved.json | 42 +- .../answer-timed-out-keeps-reasons.json | 44 +- .../scenarios/answer-timed-out.json | 44 +- .../scenarios/answer-unknown-enum-value.json | 14 +- .../scenarios/answer-unknown-kind.json | 16 +- .../scenarios/answer-unknown-part-status.json | 48 +- .../scenarios/answer-unsupported-part.json | 48 +- .../choose-candidate-assumed-reading.json | 78 +- .../scenarios/choose-candidate-by-label.json | 78 +- .../choose-candidate-echoes-assumptions.json | 136 +- .../choose-candidate-two-parts-2.parquet | Bin 10233 -> 10255 bytes .../scenarios/choose-candidate-two-parts.json | 211 +- .../choose-candidate-two-parts.parquet | Bin 9259 -> 9281 bytes .../choose-echo-drops-malformed-items.json | 132 +- ...choose-echoes-separate-and-operations.json | 114 +- .../choose-option-beside-definite.json | 118 +- .../choose-option-two-part-query.json | 12 +- .../choose-option-without-data-query.json | 12 +- .../scenarios/choose-part-by-mention.json | 50 +- .../scenarios/choose-place-one-part.json | 52 +- .../scenarios/choose-place-two-parts.json | 70 +- .../choose-posts-unsupported-placeholder.json | 110 +- .../choose-refused-answered-part.json | 46 +- ...hoose-refused-mention-names-two-parts.json | 18 +- .../scenarios/choose-refused-no-choice.json | 42 +- .../scenarios/choose-refused-no-options.json | 14 +- .../choose-refused-option-out-of-range.json | 60 +- ...se-refused-part-without-variable-text.json | 64 +- ...choose-refused-shared-candidate-label.json | 60 +- .../choose-refused-shared-label.json | 8 +- .../scenarios/choose-refused-two-choices.json | 18 +- ...hoose-refused-unknown-candidate-label.json | 60 +- .../choose-refused-unknown-label.json | 14 +- .../choose-refused-unknown-part.json | 46 +- .../choose-refused-unknown-status.json | 64 +- .../fetch-frame-several-readings.json | 118 +- .../scenarios/fetch-null-member.json | 72 +- .../fetch-partial-nothing-answered.json | 16 +- .../fetch-ref-artifact-unlisted.json | 27 +- .../fetch-ref-expired-file-selector.json | 27 +- .../fetch-ref-expired-newer-version.json | 13 +- .../fetch-ref-expired-not-reproducible.json | 8 +- .../fetch-ref-expired-rebuild-other-spec.json | 15 +- ...etch-ref-expired-rebuild-same-version.json | 33 +- .../scenarios/fetch-ref-newest-version.json | 6 +- .../fetch-ref-signed-url-refused-twice.json | 9 +- .../fetch-ref-signed-url-refused.json | 27 +- .../scenarios/fetch-ref-unknown-version.json | 13 +- .../scenarios/fetch-ref.json | 29 +- .../scenarios/fetch-renamed-strict-field.json | 54 +- .../scenarios/fetch-retry-after-504.json | 75 +- .../scenarios/fetch-spec-503-then-504.json | 36 +- .../scenarios/fetch-spec-504-retry-after.json | 33 +- .../scenarios/fetch-spec-504-then-503.json | 6 +- .../scenarios/fetch-spec-504-twice.json | 6 +- .../fetch-spec-accepted-running.json | 197 +- .../scenarios/fetch-spec-async-build.json | 199 +- .../fetch-spec-capability-unavailable.json | 3 +- .../scenarios/fetch-spec-digest-mismatch.json | 14 +- .../scenarios/fetch-spec-empty-narrowing.json | 30 +- .../scenarios/fetch-spec-entity-dropped.json | 58 +- .../fetch-spec-entity-dropped.parquet | Bin 13398 -> 13418 bytes .../scenarios/fetch-spec-entity-rebound.json | 48 +- .../fetch-spec-files-route-no-content.json | 14 +- .../fetch-spec-files-route-serves-file.json | 30 +- ...h-spec-files-route-temporary-redirect.json | 14 +- .../fetch-spec-foreign-artifact-url.json | 12 +- .../scenarios/fetch-spec-frame-layout.json | 26 +- .../scenarios/fetch-spec-group-narrowed.json | 56 +- .../fetch-spec-group-narrowed.parquet | Bin 8777 -> 8810 bytes .../fetch-spec-group-origin-rebound.json | 54 +- .../fetch-spec-group-origin-rebound.parquet | Bin 21088 -> 21121 bytes .../scenarios/fetch-spec-known-sentence.json | 34 +- .../fetch-spec-manifest-without-identity.json | 12 +- ...-spec-manifest-without-schema-version.json | 12 +- .../fetch-spec-member-not-resolvable.json | 3 +- .../scenarios/fetch-spec-narrowed.json | 44 +- ...tch-spec-operation-failed-resubmitted.json | 219 +- .../fetch-spec-party-totals-kept.json | 4460 ++++++++++++++++ .../fetch-spec-party-totals-kept.parquet | Bin 0 -> 10932 bytes .../fetch-spec-party-totals-left-out.json | 4484 +++++++++++++++++ .../fetch-spec-party-totals-left-out.parquet | Bin 0 -> 10346 bytes .../scenarios/fetch-spec-poll-not-found.json | 29 +- .../fetch-spec-poll-pacing-changes.json | 230 +- ...-spec-poll-rate-limited-not-retryable.json | 29 +- .../fetch-spec-poll-rate-limited.json | 199 +- .../fetch-spec-poll-refused-backoff.json | 187 +- .../fetch-spec-poll-refused-retry-after.json | 199 +- .../scenarios/fetch-spec-poll-refused.json | 203 +- .../fetch-spec-relative-location.json | 30 +- .../scenarios/fetch-spec-request-invalid.json | 38 +- .../fetch-spec-resubmit-other-spec.json | 22 +- .../fetch-spec-same-origin-artifact-url.json | 30 +- .../fetch-spec-signed-fetch-partial.json | 32 +- .../fetch-spec-storage-artifact-url.json | 12 +- .../scenarios/fetch-spec-strict-warning.json | 8 +- .../scenarios/fetch-strict-info-notice.json | 72 +- .../scenarios/mint-async-build.json | 200 +- .../scenarios/mint-async-build.parquet | Bin 472796 -> 466531 bytes .../newest-version-unreadable-page.json | 4 +- .../operation-failed-without-error.json | 26 +- .../scenarios/operation-resume.json | 573 +-- .../scenarios/operation-resume.parquet | Bin 490836 -> 486086 bytes .../resubmit-candidates-sibling.json | 134 +- ...ubmit-placeholder-without-restatement.json | 100 +- .../scenarios/search-body-not-an-object.json | 16 +- .../search-place-ambiguous-twice.json | 27 +- .../scenarios/search-place-ambiguous.json | 18 +- .../scenarios/search-proxy-rate-limited.json | 14 +- .../scenarios/search-retry-after-503.json | 14 +- .../scenarios/search-server-warning.json | 42 +- .../scenarios/search-sunset-warning.json | 28 +- .../search-two-parts-place-ambiguous.json | 22 +- .../scenarios/search-warning-top5.json | 207 +- .../scenarios/search-warning-top5.parquet | Bin 10927 -> 10329 bytes .../dfo_client_contract/served/SOURCE.json | 2 +- .../dfo_client_contract/served/openapi.json | 83 +- python/client-contract/tests/test_rules.py | 20 + tools/README.md | 2 +- tools/capture_client_contract.py | 177 +- tools/tests/test_capture_client_contract.py | 33 +- tools/tests/test_validate_client_contract.py | 97 +- .../test_validate_descriptions_vectors.py | 2 +- .../test_validate_provenance_docs_vectors.py | 2 +- tools/tests/test_validate_registry.py | 2 +- tools/tests/test_validate_unit_registry.py | 2 +- tools/validate_client_contract.py | 280 +- 160 files changed, 14118 insertions(+), 3768 deletions(-) create mode 100644 python/client-contract/src/dfo_client_contract/rules/column-order.json create mode 100644 python/client-contract/src/dfo_client_contract/scenarios/fetch-spec-party-totals-kept.json create mode 100644 python/client-contract/src/dfo_client_contract/scenarios/fetch-spec-party-totals-kept.parquet create mode 100644 python/client-contract/src/dfo_client_contract/scenarios/fetch-spec-party-totals-left-out.json create mode 100644 python/client-contract/src/dfo_client_contract/scenarios/fetch-spec-party-totals-left-out.parquet 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 81ccb11de8cf7d11da0fb6c7b6de3510afa783cc..957b87319787e7081ecb95a60d7a48d6ce3c42ac 100644 GIT binary patch delta 577 zcmY+8Pe>F|9LMM7K6fWqS#|%6Hmz^hdIZ)|AyGF|mqj#-{nH^Ld$ap?=gICoot<@A zFC8MfL}ouQ0`U|=&>^(E*ddTYI#>s>a|%(HNC+wL&>ZXf{e1X-zkjaIU3*z;YWt~% zR(xZjTOp-GQGUbSrgLZ$UN`mLX;BnqWJcNzG9+2m@u9vft8iONi@0Q%S7hF1j>wbt z^8-W{iDPotv`RAM;&hjSp6NrfB5hecinIC@C)c@M;OMD7JShxWa|H71Nyij&N-*>x zkYa|ku*oQa~FJ#Uc$RM`u-SHLJ3IsT*O-wbYTL%M7rU5&t?38(YLo@Kuf@JGJv-Yx@>?! z()e4RuH@l|rh!d5V2_+ue--FXLBFu%g=x|WA7c?1jOpq&r)&JbbUqeWUlr*>@t-u| h*)7onK=CJ@#Yy@G7UOw!c_zH%rM~das;_t7^A~qBx|aX| delta 489 zcmW;EPe@Z?008jsYwv4&bIzB&tvSZ_=GvDLJQTXhv=z>OB%0rR-`+mlzAxUk z%&x%*K`g$AD3A~$@f57=4?%|xi3jr*M29YU@DSA@$U0OWf0y6V#a|bm)I7l#YN+lT z3{8bVD*&J54Nn)`md`w?fgk|Ddi%6W4g1)+tAe={_81l^Q&$My1baFJcZ4xwBriBp14Y6K{HXQS7^kW~M#_0c zngM9mC08P`PG|)ND4$Os)(2Uhx=d}-X+>0v0^XJ@%1Ps%ex8)b9D`r9EGe_R`bNt# zhq_3IDq!fj{HdJK#yWDMRxKL2noW4};kfKVM|#s|Bbmw^sWOgU9?jADnIbKfXa&9x zSVdw(pKn+==^ue%!mq=3@RdH|5N;DxN3+NGU=&<}zZ;9_L&SSG5Z>|Q1vwix5A2+h z58@`;Zo``qxpdH!f8yQB`Ut)+yAuvtxr}$G8{3aVdg;bkxOh1VMK)OY1CU!9)+ 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 088e609a3acf32561affbf0cfcc8b0e20dd2d0f8..bcfd0670cee6f13074c2ceb98ee2ce4876b4ab59 100644 GIT binary patch delta 512 zcmWNJO=uHA7(jQL9h$$|v?ghjZrUxaL!lUo6hWja#+VkHlyuWtLJ%j(xVx~~(cMi- zdJ+{yPu5SwKRifJYC$OlK@r6tdQj`d(t|fWd9f$)5Y)Xrc#rpZ^3CMae{G$Y{gHRx z>B#Ab&@BiTG3@e;p$$0f8CnPkf-u$KR#Q%KYCB#uTA(#%ac;`4ImT+dVo^u0$X)x6 z$o!1#Xv{55l}B7X8xzoql;SmRaodjz(pe_YGpowb9a#0qrLUn3Eprq5f*Lg`YK1d( z-DDJH#|rKyLu+N7b_ha8ueA55Zrilpg)+nE>eS(uP7T>Njxxa$%xvyC5T4e{%+h^< zFtfR%aiqYII6iPcl%)n;#G9cUt?6ao+fYtdnT5V%pP=LS&=5yM_eK<6cQje4SE)Jp zp#;ywo-{+tva(2*bc32z^ki6J&5FhhgW2dyFs0Ed@_GwgO~---YA&G-^ddZ`x+%q1 zurW1=;zAL%*8DgTY5yFI-UyIykc=nWULJ>2@g%<9ORn|6a$FVvrpQNVxo|f}wm|LE z@Xr~tG6TPMk3g$$LcEnHe_%pN|FbE-E8s0+1|J$@ugq^v=c4)iD?l#4s zmmY$^Ao@Z1U?9{>S|AvdK3K6JsHlj7o~nm5kcj9Zgy@g-`h^eQ$KA`_D}QU6UMlLm ztxrv>l1Gxh$k15ZhF-(5+Wozak|Y_`du66)5A;k6ZZXuM8??wQAxsDAXccBo=;Ox| z#)K=-=d=(1*rqOe5Cj+%8k#q?2TWf|&*^;&&&!_`GI!o-R*Pfdz8U0oG!GR3aZ zVusTONow$FhdOzwL@RD&w4ANbvamQU=t>(hoW0DPjYhnEJi{!mIJ~SR%6Wknpj|%F zJn!nK1v-PDy9Q{HXOxGo0iI(P`iK>YKG;*0o94@N<04E?a+fgC_~`APF57bnp}%!X$PQG4K!)^->ZYqCf2Tg)g6`zOS#{CP#id ze2b28-=I(E5QH~aCR0K06*kL^K&NE$oW(4yDp#iEWLYzLp5Zo`P;MIB(h72h(F<|; zqRvYNQ!^q}SyYHBq!htEkE66d%Pd|oT!J7ZYgNl+CC);_LQ*_TI1}w-xmm^y(d$fe zsJC+60Q4#$BUbu0KQg7>FxkL9l&^d z{J-CUm%^vX)*$@Ex$qo$cM1;bFhiaXK@$zAx)z3Ed*gJ0!*?C; z#}Y_mL27f@;;ovDDP(g7UgEu2nm#H){SN-^x`k5T7~M6%F5{|{#YUg(o?jIG`vjc+ K#`<2L>HG&9WU^-f delta 490 zcmW-bPe@a79Ke6Ce!uo7mt}4yZ|%?9+xI=U)G3*TkZG`)#riYK2qAvubMGyEj<*dK zbO`BE2Zen*d9dgZVIsmr41#u$7$MRnPZ1p|WQchv@R)i0d@i3)P2bQL@6sc`4!O73 z6?dnbG!Rn8aXNh5JIJ%#bP;k)+_{;`^SqYBpY)pOD$*opy=vg1Zj6msnyKWNMC7o;3%oqA%EgVCNEk01p;}A^Ki~C-@>b!nVAy z;Ke((0IJee_RzBCIioKDiU{mdjPe}eyvwj@Vpqs_UHgx cF`+t+74ZhHM+44n6g)Kwc2B9i8@25J0A+5Va{vGU 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 b7ceb83d2be49671c06c49ec81a90390ebeb429d..001b8f4a1edb74659cafa903e860e70f4d68adf6 100644 GIT binary patch delta 608 zcmXAlO-NKx7>4i3dvqp8z1GZ~J3l#B(Szkr5fK{Z$jp#hcU&}631M(_jxz`5-jnwS zNdgf}B5HMrY#S97q=C^Qs-8oHfCd&jzz-lY+QFsL{BrT$bijf;-I@*w)XcJlmYcBXFvEk`U;6o_8Tu`)B6 zr4Kq~;Wz=&mZQYBv2GA%kt(1BnJL!5jcg(hnRrZMAWuzZ zcZfS&;uA2Bt*QE3@~L9|+|o<e>$EQ1H}Di0b?CB4MugNwyi|uggvSnH5Fs5RB05By#~;rFzvo-xZDRfJA>Wb| zT=f{ib3vhA5N<+^7(>foh;1^m+T+}|xPCD)8J|Yeuq<{gK9ENW%r?DM8qLizS}O>( z0kvz0xh^fBr}8Led4^7?@iOIUhKKvdnZssjo{54W7?iun3>a+IbQs=K4b$cM3`g%< zlQc~&>RzG_>Xec+i|?t)d1~jVgQFr}K-Z+J1rz(!MOtuJp4#3uxopw7whnoMS*C;T z$`j@lnniB{lXKKgQ`8`*3TbMi8<~`8n-AHEVma%oygY^}wL70gs(4@3_ixE-^Ydu0c$Q~8^9u2N5ar|2& z&o#(-+Tpu0=G|{5OU(xk4e2lwx-8y_l1+FQ%HW^J$mVuN68+saJ;?_yB0`rY2akrm5f}O_m`11hS9)O*2H(Us7cx#Y689Z3e z!Y$(C7%9Ss@GyRHitNQ;Ts{g$WCY(IBD<$yQ*MTrk;C4Vr1G(XNJ??zQ{;B#KdC3Q A<^TWy 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 accd075e300499a72131aad1cebd91e3e42cce16..6c76c4ade11ca1847346c1b9b2b4c638e2521786 100644 GIT binary patch delta 619 zcmWlVT}V@57{|{$&)JTj&7AWn%N;{s47G+tH;EIcZtg>{tq?-tbvtb@Z0EIec9NvX zR(TOIgog<1>n5cSqk*?2T_%JGdKFUERTm*$N~ZR9`8>ZL&;QS}^8(#oM5WELny+&G zFGsX~tX?=S2=Cx~nICI@N@r>Iv6aLQ6t3im{)K_~fDkw-)cGZA$~ z>7-^*=|G8UCd+3SnrMxY6iE{^Net9E79&}DjO(%MM9&dJz1(jZIYP#zQzDx|_vEXV zCeq?naZT6K9MKzb zmSs7ntHWlNJ7yJ6i^Hho?pt@onU&9|QpoeaaUerdNUlmS{swP*g65df#arh!G;=m# zT_agb=2n8}Gqua&#dPib%A$1Wm!DL+OBHyz0p1My%6>ez!Dz${y#p0+IM^gEHQ^2L z4BZqLJa`M94w>b}X8iJm=bX?Ej~yy3I9g#m7?6ssc-sqm@@d!%o|j8&2yb_I6d>Jo zFwxz}mtLqIl!1n7?b~|@Kih-ZP*Pg@gYXyl8Je>1?j!thA0~$5j=}-LpZ_B8`4!k0 z_S=hx2>(8S58*Q~5cWvBeB6NdVIMpUpR}(ZAzV7*aLBPUYs2%iHt_a!Lr)~+SS{Fa ep>l^Z1357dx?UX z(n(CKFG1`O2ze=~KMLA6MtPUrYK*^d(oeQ0g>Xtr4vpUN#OpKZ~sP33Pq*^++uEbQ^%%)8E zP~S_FRHODVwV+w-rD^WA(mO_t47IpA)*Ock@rt8zdz60aSbCNk(t=#7=x9Te+^1`* z1@m&BIzrR%(mgOrjU0n@3tYN#4b?=20)&9s>@4S$cFE=BfksBXp)&T}^8 zj+;(4<>$iQozFmuCP5SvrpCRg4^lhpPv{xbg0c35bCsqYvD74}F<$wIJ+D>HFTdrA z9pY-ary!B<9?S=ixi+TJ7u<)Jy2{ZP+Rv`nk~usRnqXHCkURJ)WJ~#jwIyU53Fz|PJ#9E^sA%_$dInR4Ni&O`V<>fiNx&E>gKM?_Cy KdiiH`mj4GlDaa%M 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 0000000000000000000000000000000000000000..e39f858b5658b9f7f4f705a42de73e39f3307846 GIT binary patch literal 10932 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 literal 0 HcmV?d00001 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 a555723f302c748e8f2392f2de23b35f9c790870..a4320367b0f13b033c724b7fd79e010863969470 100644 GIT binary patch delta 329596 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%0D#)*0l&`p#m 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ⅈe??Fe*TBm>V!|s$u248TO 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

52%{aLt<=?^5ytBR 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%0D;r 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⁣33+g&7@8GxsT*YiwwoHYxWt>S>%c;XTVV8fpAh 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 delta 350992 zcmeFZeOMFc_AdNPW@5h6rD2tkDrs&+$* zt)$XIt1a#=Ra)7VR%~f?x3=19xB63CZMABtRjbz4)>e15y3Y#j-uu0N?|a_s{Bh1d z=jwAsOC_1itXcQH?scyxIsB>LC-?ncyNc86IpTGArZ`rNga{pU{)E5nPUaV7h>=(; z);nMIk?IyEWJ`I~E8A?XEgj(rh54SI2qAF}0e`>yCJSQ?CZjLXvA%592WH$!v6Y6L z|2!RDJM(nkx_>>L_zA}ca*2;*?3e1?24Xnxs!8Wx*$U@swns?L%yU)i{{7tTJn|sH zeKOYlfSGryl6uFR|E`Gsfbf8~Q5Z88=l$o6((*F@+Z(a}q4jvjO)xymb5oA+xmvHk z>qSnCD|Wu^!(9v)_@9@;ab{i`{M^6Zm;D_j>LbOs10@$(-gmR4e@XHAQZJiQ_>PO^ z&$0c)g!m)2_*ddzQTzJ!7PmmGw3LL1$_|3WC? z{%`e-b;2m%p;DwN9C_vZc1t>Bp5S{{I8@EZOK5_-tC88{hdZ_lwsn z+;egEmtNwdLddHy{%vmRzXDD+IdAi|91|_^a0qNp6&=FZ)$zf&M#E;k7Ge*PYl}l= zI!TyD9~*8qM9dB}I_5YciX!7o#Zd*(j=A<2`#ec3K0hvw&5~Q=Di#FB;|W~s_FocX z6CDd3Ny=nXihWUhsyfY)o|I9ZDbH%nb}V+}TU9sj;6q7yam=O zScX;hR!y7I?r3*7NTxv?Va{69TUIK(QWCmp$bg!SRD&@EmgW9mZ)OqxV3O9 zNSw?cvk{LM<6 zsxF{umOjuLBvIqRLGhUyjZjk;lCG@?&D0sggnCCfZosgn*|TR?%}z2lK>S)G8%&u| z4bk?wr7`SSSo7IfP}WCr5pfL*n3#BTf-KRpFfpkvxhlo5s46WrJvE~yGbt-O+p@SW zCpEVwuPNVBP*aFQ(AccHs^Y|w7PD<>d1*?SrMzxgQbki`LzTK3uc_r?y7bx_OEH8@ zU5{Ha>~_kE6)V&$)D70g09(~cdsBR~p(S9Iq|I(`ZLe{pbjVn%t(yL2x2`OgjO%J$S!V`IJ{e>cAo-SxvxcD<7ZH4 z{jJJYl|7(!R$yRjkV0Lqv4*s0^Fs4<$}n87*N3~7HC$SMOK(%YACanJC>zAsjIB4tg39S5<+llLh@=-Yi*YD z<iCbsuF79bSMOZn@jK>fyY=@hjVLoLwp=5#fxOA4gg#%#KxXwZ`@z($aCb^ z6|@$LiX6qoB{qPVxiqG%T(7~tF0FJ_nX2P!T54M@Rgfo{^*L6@ip4GPagN1YDp>@2FZ`w5DdQs1q3MppW>j#6>F1G}ZcVQqgrLbrsLxt+mIBny^+t z8^Oh*4TJ+ivS(R_A zyvi?5q4qCOIv`Fhv*H8oK~l9SI91ac(yEOMwJib^w_@GSd_h)dF#9 zh{5N@#?7pXxYh+Z@c{`<5Gp%_O0-Cj+LUGmfVDsxMQ7J6wgJEz0AM!YCcJ27Em`6y zHbEveEX@IkH9;of6_7}-Jx~8UvsfATkTV-j27%Bj3Gi$|)h!qilHCH5ESQEC$ zA){I$pI}AI1hmOf3@NpG&CE(%<5;Wc6m(f3c=qmw9wX9V1{YNkgepZ8NZ@R?8yk}f z-IN>yi3cr`Qxv74)O=jUN+@=2jq?VW=mfrMxz>-ZP$>MBTnwo&OfFX$19Y?SK!|ow zP>?4Vh$&JfxitfuUsfd(k0_5i!dxYElr!INjGK4 zG9_7@?8QD9$`NDHxw*Prd7dF(U!Z|l6?3sbWpQ9hgxRnZFU7Ekva&KsnYLW9Ojl{B z!h`G@2$7)HV3988)WM0>1B|Q<4UJr^*qI~t2E@sg_JDT1gWUnYT^-gdUn5^*T8now zTr5@1DAq-Et9u-%71KWEU`62ZS;ub=TS)^~;%)}YcJT9PnMakN1z=_c(*6x*4ynT@ zPiFCT$m{&76nXv*$R9_518`;!s#6CBI{;>Ots~T`%VEOuAb(m64#*!@k#j^k0B4Sw zA{R4H9&4QMh;uA(#M=^zW=fk2X;q8lGe}F#uw^>3ntm^BF0?rc9Lf995@6iCct{@y zq>p2%r8K9^QLb6&)wN)P60u_cQ_H7+Cd}BiL+qCcDP11~>>+gmNQlnm&UzB;+uFF=9&`}-#kRH&6YRce5JmM+lFK>cb8F=|so({*^5K4D!! zczA5M$WSy}ZfpU1&WwyP;Zaf1Z0w^v2ueYWDK2F}al9tMwy+?nCOI}GW>HaEQMx{( zE;BGok!@RCnxlnMWy>!ws4K)(z6sTVO;F$)pi;3RJ5U)PGnAK?3(Jd_HB^>Yu_LPC zA8W*zp|-p>)=~!{DO!OyWYroBjj^`GmA0mUW=_j0KMWE8Lv6`c6dSZi<9yG%KyC2# z^-c0kmuLEk;JUb2k}_49uF4EZpA`|98icEZgM%xtMmx79W@A4%ZzTqVDvOIFic?E6 z&FPI_7L=Bj3CdE-Q~m?$*h*OyaNC(#;&loaw=KWv8S!s!gG`>OtH#=Ni($E}E~%aa zbyWambwz^@7TX9bzA+I_II&3qs)UUNu3DvD#cqYw29UAaQ|;;Psg4*I=vS`+Y{svN zT`TOwySSK>Ss1yrMym~lWi-y269FqS(qxjFMA4GD-U|Q~psl0}lha_OLtV(6-zYLvRo)m&_y2^g!P+uT!%%$VY_a#kRoNVLw7y_Ga_+3xQ8wb(a2s)}mj z$Iw!bRDpR0r%cWaQ0?9hX_Jp#R^w|1U1e98L036crgd3#g{vkis|_{g+EPm?gr=(AY&EYa zXegh7W<^tCb8L%oRcdP-K-1iAc4T(stS$v;wsgjJm4h5GLm(We98*44$|}a=ArPf* zHUOuR8|Uue*@3IfbgV}vNP>cyTIb>_yLUNom7b9mK(R~mGlD3vD(hzSQ+%K!s78&e z{1SR@$LoNx%)nShpvucZ7}yQ1v&&})%cY-wBdpe#ig|IdO>uUhtB8cE8M?A1+d+xL z^+)TC+>%+I<@lYnT7a|~3LMK^MK45g`!7krTJ{;%GJ|}wmNzYv{?1u7z*$X} zR)~uNWVmC6wV|rfYO{h=h=;gDtSSeo&@>|z$~!7n*Fl!lbQW|uX7qr=xzjIuZvESY zubhtw{QT5@lG^u?62mB+3J(~;qG!#TrJp4Yj1FR})c{;o8VccJ0$~WQ)$XE{&KN~G zL&EJFF#{Mf;ZK$irpy*)D;INea&kr-lnV=x{rUNU`FH^wwy>~J9`aWA978~{pd`>N zhsp$i$1tU!O!ixUF|w1=R!XY6V-JmMM71)gP6737t5rYh7SY&fYE;;SD`ic>W;Q^X zShecCt&)*RsopMck8sF`A_a;y%C&fRM0dE;;Gf41dqB$N&d2=&S<{4bw|_ad)=4Rq z#I3C94Cid+Y+M#kI%|}HVqG3P+AWDwLn?SQ1yu92Li~|zMn?U~W9PrACYmbZiv;nW zMxo9tPoxo>CGp-;X{rxL1`9Y(F2`8NkB=##)C&|Ge}API$~_xH0c{0gov&p`@f?ihw5eWjr=&hUGL^Z`*VoyUc|({ms4>V5egcKw->AfsH`b|~wygV% z1z9lsF*YV(v07L-@Dwx=gqCPvx41Px55aa1dy?SsLY`9oru=AHfMIW{q2031RBpT2 z4rr)@WT8pGy8{nggvMk>KZPV{FBB4FmaXk#Cp6ttUEk275c6gfQn^hQl4;(0Ki(avVWcbz*QGaE2A`y;+wNR;+Icw-}m!=M0y~u|%~(J#UJs znHLSwaX`ye8efr646IR+)C%pEZBb%s4e&)y22+t~$*Rh3fCfG#*9rk~iR6N!RG^BM z8LDV1b(HJY+m;moRWyOTsjI00dE;s;ia^~otjGp+lL^=F018cPiC$F)>c%od6;&Mt zGwPq!6BiLWg3BiP7|G-D zLEAzv5-9W%DMdbFu~-5O;|)s+%f}N7l*{FQAfA-U8Ki+0nFU1_lr;+CVuU&bRBSl3 z`m>>c!;>SV5rRmii4zqq#sqU=#b8*$0$8F2czk>Ulduq$XrVBfpRx$pEDgY$4*$*Y z#E7iL@IN_hOp}|NpPw(xXBQL{iZPHb#l`Yso_VP!rYtK10kv$|vP$R)YHKa9mh&-b zU8AHCUkRl=P}0nAX|cmDr z;bJ5-_n__d&`&_qH(NJ5#b}z75+MZF2#*R|A1jQGnHwJy6PL6=5-)<@UbQw8q7b+c zPlA;UOATrgUlg`JJ|@kS?tCgFQ=qZO+oRiK9Lf&%>Yy4=%y~0JS1u0;37HW~C2M0N zOeRxQboAW05ZeS0NXd(^zoCMJU}T0ab7_K{v@CDrWAbKLl4foToMfxr9`dV{Vb-nd z?(Pn`6$lY1Mm4U4t8W0QQS4l&6?@zHiFCXm#}j0#S2h?y1rnQgk+jwMs#dLP3Q5%# zg(m6(!vgh|aFd~Qwt2?KD2}v%yJL&CJ2MMS5q7X@fHhne7p&senf|+BX(F&jcDZet zq@uObRuxdKuc@dlw^#uwy82dUS*SPOVz)W}tI*q{6qUM8ip5eXP;`gbIT9*Puz>qg zB(Qp#gqfi4Ys7UkBv9j1E7Cw+fcsS>FZEM5iX2L%GErFt4wZdYG!SQ?S_yO+t1WQm z6oJnbQ4yI9r)rLNIGc+kRKmlEg$u01Qe#D zu2={TLd(*;(rCDXg5QehZ@qAXbDd6;;?e<9&_~ed&UCt8<+ z_!6aPD*i1x|OplC|f)Q>RxMB19siNGLW+BE0p|2%qF1 zG_HCp^c8|I!$TSj{{A9moXQXoJ4+OpIPxgg*{OerQLbu>u$!QL#ee9@RIVvl8^P$- znYwj7I+TeSSzP>j0||97`5xs4OZFW(-6G)gBKzvv9>HB&i6(N1mFtNrhS*8U-CRABnnvFn|2|iimK7XtvU* zfzBZ?Qfm6Sij>Y}(_fO(n3x#n`S95(Ntx`hHX=J)_5(>ub4r}dUW)2?%2Rmxi69k*SRBk zcQbgOFQ5QV?D}mI)Ss}!UEsWAFocrHDJk@NcOor~X559V-AQ={N980lGc)O5Ndq)I z`2`^EpzA3veto0S$tGL|x6>~=^bddg4}bd)fBO%A`+uLmt%%nC;cx%pZ~x(M|2De) z!{7eD$lnHT`@`S~90M{_wZ|@VEc) zxBu|B|M0i}uk*Jrl^$iQ-sOnz!v_W&GanfE5+`?a5X|z%`6T)){CSN}IuBIcW}S<7 zzE&;8b~{gwiQ(@{)rm~wC4oL`OIzj8Wb@X0TSliQc0V}$W5XrtnWf%?ofXmB>io0? zZyw0^FBuCxKNT+jcuxPWP~OMR4fSF6_n3gL`66@9mt^e(nzv6__##&Mc{9$>azY%)NxRhE?m}y6zqPW^+W@g_p+*8NWc`VEs}KgzP|* zstqmVo0O&J_u*F@Z{(M-e-J?!-{^cL%Uce?xE!0aX%Sy5&%Asxsjzr-X#Ny6t9Qbn z-;bf8gw@jSk?4UP9ozkaQMHd0y@gd1KV@y)gCT~0I%Hz7g@vNbeJr#up#fbqF2aou zvGjDDU_RLyGM7Aim!Dq262L83x{Iq4ocL+$*sEDb!sZfpFC?5mwPANer}ysv=0Q@W zn)KHU>PZ&SZAf>+(6ZT&tGbBoNtGhL=hGu2&z#bMmLohTJx&j+FArwCH694gX9!`d4 z5*;$lz6i*^^Su)h$DO+}iCSj1mVkFP}&VTf4tTuH7xeC{~22$JN*6g7Kz39Gyn zrw-(Q`fUGG zjZH22Ds>w(QGf{Nj@@z!!oiklNl||BXq$g=(YH8aHZ3M6WkgJ`8{%d4bw{FY33Jgh z({Td5MXx0ZEFt9`f|ip+=a(@lr07`0+^$ab!wn42BSt<#hqIem+KoK)A$^fY@X3uVD)1Pf<|eZl(7!1U2`=>hrT0MjO+Mvj66(*8NSo6Z@tKvNAlAR(o9EjP3_4 z7LeY3e>QrNBqy7L!bLEFaImt7@FNF4!-!k4)2oWw+>yWbE>B;_(tpY&qL{pCTpBz!zEXGMC)L*X zz9qg&RbT?@g|X0it10)yS`QKL$yK|$Us@fFr`_#-KsYbc8c)%V#?ouuR~4-^^%I{+ z9AptFp3ysnmX~qv%8{!?vvQywgA-&8b|cZc*Wfz8$KIFR^dy2e3Eyxhp`={jJC{U^ z)!;?MD@R2%F{^(=Ykfvrx-prGXxqLkzVOVB$m32xP&3U4kwfpsBJu902j0L1?c1a8 zmusgfa%k*k?UuxP7TV1IiI~{UB!4E~+qqz_ZD^;Krre2juUTr?J_h75-zh42E_gWf z=G;Ar4JiE_n@p@U*k2}uX#${HBR zB&c!QL4sgdvO9E~pSK`h2{m#c7DMk1^Eo0v((O+CTZ%gpV))4Px70~})+gm3Amo>l zM5KR)6Vx-)_pRr#l2T&p;{oe=a(&tPsB=@{uVT~j|Hv+UwqyL&2L}NM$MNZtdYQpp z;9tk;Zo*VO5pMD|wY67!M^`X6>D?0I-sZm9gs_uOGKV*Z9ksm1p(Dtuy+XpfFU?mN zFT}LuJY=UXj^DB++8t)~4w zNDv_=H!hWV_U`VML=5ppmQkk)N|p>CAZd+{D9X2Fc)6ASfE>Mpjor>``46N zaM+kPSfYI&X?{s!k71tUH9qovv$D=?sQ2C1eStFX(mlDkQzqnIi5NbO(4E>h`uJ{W zK~F8tJZizpTd=N$9*EH+ceHP;N;;j?8xE#ym#8sN3us1a_@UrL4C(#K1|A9Dc5@Put0i*H%{WR zQ5nkUyG9X_vy5jj;#5H#;z_QM)&{K5fWn0om)Q4ScQ2X}1`FwjUS#mV4uwfhwRH0E zp74ZUopb=1aET=GFc<-q7M4^*A-7b=w* zys9z6?K{~LMH7q%-ydx;<_AP70R z{Izhs7gg^YyshOvxn~)DhNQhI3W!apuzQML?3fB)8`W4U8Q@D(2CoCub#Z-|Tryby z!oBX1I@QjAj38?STOsgJ?Lm7d`p85T$2KKW4lf!E?i+n>vYB=S2M&QmRDo_iHYaz< zBy);I2sUh=;BH?y3wacMiYb}|f*VIC!(ZLDlMAOcv4V*APo0SUu3K{qzv5L}IW(%v zO#W3=G}>4iyosJ2q6qS+-(uw9^pAXj2dH~yz|2DYu9X_&G-b>4v?3mQ4SU8_1nKmU ztXDuG=-trPm>)e*V`KxhlbM>h)jfc!wOaQp4}}ff(MrxlCy{c3Wz7}p?Mj02YTl7> zUbxHam&>B3FW=u#D>GeW*(W)}5L~qVfpX*L2&%?GCH;et@L6wcWv8UE52X0m^Ktz{ zj*nTmSE_!EFH9tV&W>qkrGLxzN$YEIe-wu9h9SiXG2$_!!I?=CA&yQ;UZw<5_1o%>?vC12fD~4p zk=f1mDKEN-4u_#l3Am(Mo;QwXwV77AA%&tXoDT60N?tu*_8tdXgwB+8lyRD+$d%I_ zv$p@h+2(Di_e}fV_APtD<_4NtzHjr*{Mz~#qD?z-Vtgs>%LQeY{3_XJt?(!~rA4gC7sL)cyX|8^q z8``P9?hDlWyL(}Nu4{~ zwoDerCC0x!l1KU78rVCu!gCMlk%Y}XW$sc>AWV=|SQM>&bOg^nf=lMOYdv_LZxV-k zC67@IYLL~;sw9W=sj+1&Vz811zE>Z8hXP9K_ z#?E}gAvp)*tI`4q!?>0SN(om@e1<_RH4mkes}2cmZF9=YY_QQ-Wjxb!GDa<1Z* z`VJ4dPcQ8=;)s=!$3{z1#v_SS<=h0v_9wV#p>-t{r*bzP;a%T^+PmH%el8^Xy)4I- z@_s;U7If~g3wq!tCVu1pVGS_g9?Yzn549g@d+A>rqum(k+1?t+wXq3ctskMDLM$uf zq~g};PiMM(wr^>e&ea5hJpb+R#enH+ofVo*?74#RhMNbP*s5|V(t*H-5}&$Vmw7q1 zCmHd>n*PL3UTpbpPhNa*N2m+Xvl83HqA#qX{0E|+ETn`z+X zY9OHn_}x0NYEcFLTU*Kfe|ZurUaZTK_?N2z0e!(NMM{CoH(*>YMprUI43@H8j}Acm z_ig(LDQ9utkD#};EhD$Ri4OK5a*6a$16>&9MV|gzbw_m@T?k1;i}kIn^z)b;fA2S6 zVs*Gn0k*S%wfD1z_hJVgLf(%5%0llB97DA)Bfqh6OnUEN1pUnA`?c?o+dse9GsLi5 zjpx2vaxfAnd^xI%#Ml2|SCkV3I@Ww##0;M4tSD~GAXhdn2pQIWdZ_K9_kpGh(R0VY zk7>hE-PWppzrl23^c05fjXE&YU;ZR)EoBYf#pQ6+d(OsE4#rjP18(mf3ti)}!yg%j zM$ncm?;zgjVYDUFCzUaIfkM@b*aUlGch!!QMBDDPC1jS=y=xzVy%%zfe5T&_2uA}= z`uS6tmy^~kAD`HcsgB4W1Hb0Top{k;18eulAT;EhgQL)E@QG7lXrsnWzVF9)VQm>x zT=cvf&zjhaNI%N$aqMSg~Qj*ZF`k&Bq#ZbOTAxF=an(z>8%1#-B@++CoMazU*cc8G%T$CR(M9hDPd{e|&5yMr? zXX!BL=|57wPX?Bt_ojW{N1ocKQMQkCSY2l9KbmIO%C zH3E~IBY^1r%ojgF9c;hWeJhFtTJkhep*Ig0xMjq-!{Us#cLh=MP1nzb?LhYw@ok%Z+1GwHHL;I`Ej*ByPm#FVFzf0PFb;-#EHDF&IhD-@9>O zPw9Cq+jNuTBb2-?5cQ6}!uzlVdmnAOo-E<>$=AN^irgs*lYh*-KA-P{TCZ41IIiR` z0;2s|3g1)pqRHPgU5F%BPf~l+ZbU3e0Les_Dcn6#yJwqfhmb2o%YV6<#p1rnRdCA$ zE0%7%aa8h>C;F?;Jz0iO`Z!Qz@Nkz{ioQ$kNB3xOY3z~?^2%52T$E)J3qk73*=Qdv z6ta_1Bi3hlHS>HsNZA{QT@;frNgQZNhmVFjA#Shu3Tb!D!EIr(!m0LaoiAYp#C9fN zlTiFB`vbvQ%e8KmUxdr3F~$qgt=*A&DP~GUbc+|Y-2JqDZdu_i8hN>XKl?CwYHz2? z(2;~nlTRpWJkof?J}!R&Wqok)=iFN)@Htn3+7liZOh7cF*k7R$y55VL_=?;Z^CBzo zB_?_xczE&$zrM?!+2Vit?F<@3Vc65u*n@3#?02=(T=YaFN$!a~TX?uKoQ~sRN64{{ zC;3wH=;U`n-KgF408d*)FfXSIgyiF2J=d+HUW0pO4Scn~YM@fbIPe?|5NmpaUV*jLRZ!{sN+dpHwaE@|f%2F;+9HT(q^`l#5P>y?TE zF{&26=_LZEw|C;})hor17LwM5q&iWQxE_()>iPnHmXP9&Uv2!G1Yz6XCeNILdICNQ z`gY@=(IYOaj2lC;9+?q5_-5pmxLmqpH!&8vAq$L{k#k>Ch{-d#_x2<9AjwCp(K0Vt zoyVc$M920K-gRc;ao0(~gCB;rT0iiREfrXw?3y7#&`MCe|agNVbnR+o9OTf8;=24m7a?zA*rzZ`zBfr9+)c%Sv~|dUO|uN7r3E z-JeFmT_H-)`pD024;Vkr@X>zlr+!3RrPZBA%+bvxQa@Tv99&Hx+O)`$mOZ+#}|_Uyh)_TTw3@g!gIp(hc0DVax21OM70C1~I10(Ww&CZpv=cVu`pjvXAw z>~noB=Wy*Tv0|4;z+O+8L1WshS9DjSs{;fY zg~>q%Cy{xZ_$97PNuhGn)SRF;u zTS8{fk%I^fcxyuct2vuD_XO#Ecv`=k)-{(qw(pvn+}r8Je}-P*ht3E~D8gSV$rch5 zb7)4T-wEQ(_pIy-AM|SSe&xZ<8XkVdMY~O^-uNBI$t$N?O@#K-t>i6DrV#7_W_n|g zK|1}Xz@tBY{SVo4#0dDG-u*Qa6$rA2V*dO9bx}&7NUaI zd%htUT0VCCC*c;ckV9)HW~scl@!2*Bj=&ekNIC#KTnu-UwyKWJo!d*w%OftNz4Q9)|e8SNn(;-Y%fpy#f|A}jkbXJ#=>v*jHF>XldW%hx%?sEiBsSCvHa^q~l>i2R z9?uLUY2FiD9N_10AMIsObLMbIL3PjxU}$vZt#L{@0jtFu|u zJWvqyXO#Y4ed{m|UPZL+-6+_~HYA^a(uF&B(BltUB?m8nN&qXsHLK%;IDx%kT z#goVqNv?-T7jIeyl2KlpAcBKK&otYB8gsW?ZyXqOmw%sm2~bi~pPVIHdVb$j(^lav zo=E*feqnu#=_wJphI!HF!wDH1y7`FkC&Bq`o4$Xj<5K3Oh4g9eF+Iw){KZIpk?F;| zGD@)rG*1|5MvU4H@s0gh)juioH-V;3wyfR@{aq3krqARIb<+Jj^4Y^3DIZE>5?C;d zQgm~(|Kuir7JAqNhTY9!Un!>jiGtecV)|*yXRUD3gUl+Fn7;0PWC8D#%v}G zg&7~Q#Xm{b%ZbwE^aZ8#$8UG-esJ_Bs~cwfFZ2Vk_oS9Duni&8J~h(P%v}*WZzUz9 zQrd?p^a^g|KdpW6bpm0=m|qYHy+GW6lJu%AD=K4wolI7ryNEp-vxsg!B86sEJMZ+* zRx@UM8(At?R$oMxm3)>r3n#Kl;=ZLlcc5oXcV>5nTie3O{7<)pnWsOPe}~w2HNDDD zUN>ew-#hu;Qa+Q5nC!<1QU0fg+Z37@wl}p5Y&OM{K8iGe+Jh8Owx32$pYvE6s|Jikr^53k5 z+e`oBEr3Zd<1NhC1T!u|Fj#|=&3?acANWtNe$V-Fs}D^1vkK2_*bL)w@BnUcg_-;R z?F6{CB>a934dl1JA7iys+fAag%5)dT*no;e)_a-E+K~z*>$+4BJd0)19=A0-Vh9~&QE`)nOZ)EDZ{yNnI&bM$RU7wR{sVrUCn zIy($~#|sAujhIeT$*4$n$n)10?7$`8JO_3%A;S!u8y#NhzSKYO>)Wj!sne27*rMmo4kuUq-GWm~;B z)wKOn0EHaCK7T3E9v2{)nf#I+D`` zS6`S)%}=a!3z;K@DDqCn=8edS!QhieiQcaoqovQZ!H8tTS20K3h{oEvFK&K7{j@dW zc_EslChap(zf|7<=P@NydGn>Sp{tA_s^sQgmV*rB>E2uX14M41!MAl z*v=E1b6`o;MMRaAygVg-S2Qm)<81Fl-x5T1f@LUvKf3t>1C#~(YktiELy#FNx`m5w zzMTYok$n^s@TXT3eY>JXp|5;--&VF~U4K${d)N*V0GgLhL^{8EQtE)A)+lYebi4pw8xe=rz{f&n~p4@`ge&`0EQJMZp~Q}d*)+f#j`27;19h`$cB zxN`)6%wIP}V8E3X!XV#33H=G~oB<|}&%JOco zh%0ZhKSxUx)$SYa5COfLj^JP=pCW^FTXrlH96Wk3`aTG<#<+Oc+XW8QR$owUIgq`F zJHS9{qtR2>D~X>si04q>=QsNackr+UNDh-_aNe)t46(A5Mr7c&x~U0U?CHA?d;(Noc~S4mVzlT=V__ZaMV%IAX{tA?F43+$_L z*AAPbJ#r3uxcB+EPNMDV=M3RS^vnTCceh(ZTz!kX04)o612!1Md`y$z$!0KV=~&v!}{h3vw9Kpqb*aQV_Z{!{msiXn|^#j zm@5*#Bt+LbTL_t8s~=jwdaaOptXY%!XeTRSCk4*>hkol_gB3;03f!bX>4!XSyvm7* z#KTetJ6WS(Z-RR<{~P3%((6qO8}(~2{Z$S+n_l7#O@yv*4JJI}S^f{fqqo>GZ?U&A zw|RYk$LIv!MiwS~jS5I~w;qOjVecW0LzuaZw{b7pn2ixnTs9wOjUsN3%W{15IcMT? z4*C75B>GcP_Cmq2t%#{wDA3b5F<3u#o0nIQq3auK*`u%EF)tv&1DHcxrJs}#FHZ?G zctq*>p2sn*MOYrqhdqN#GE!%Iq41+eIf&VHLHMNyO-tzaMdognWS{tu92x9i2~ozz z@7deDDR?>Df0z_+>_X~%I>wVgpXZ7A=$86T5A6~zm?68phur0(uKpK*nEPqmCoJS1 z*8}#0ZKWjdU6yIC*N?9eh@$^0i|a;cD0zx;?Ps{~Cl{LY8xA{iEdWkt4LAG7i3<}DRe87qI|_73e_23_ctG= zh~ePoUrQcWSIfIcT!z61!*|_1oyPC^Xp}A>sU0vfpc{n5B{bZ_c(lAL2lr*YNajnS zc!iQ3lDftt<%!mGjMqA^AEEpD|<%-QS+x8OE8}RgnTof7bsR%iZu_EH7 zXw#oiXI*D$krqSo;sT~e2eVKA^g8~eH)}uU2fd@d8WS{L0!c)F;DNA{Z%Vgp055D0 zRTPUVl|pX?3^GR<^_wJ&MDkz`v~$m*sq-Qfx=SbV@)3bv1-r%gXO46?Y@KbCm)ZU- zK;I}FVzN74B+H_af*zBaN(t@v-j-{4!XVS#D-P>Y;`(e7JQmpvFKYeGw zlH8Ql+PXY(;~JMm$nXpMZsFY*C4W~?1+XbMYl!?y$9C9bN*v6QJuRx*O`9`VdJmQ{ z7meOvO`4JCiP6oTacKgyMZ3kDINzI|uONG`9yP9V6E?`zizs!M+RP;KEbEk$H&Jaj zs@(Kf(zrl@BFB!fva++3U0EzEIDTK6mT==HI6KD7ikOJq|iFUTNDZ zL+Xy5QED@GeZbaDnpRM4Fl1tX$(c!Wd3P+$sryQoJ;Fv}6FWm4%<=uAvB8?BJA zLeh3H!(1K#-|PC8kGhF_GG|M|1Va+_OA`{&p=@wq6?NNE{OGvn`NDLC?9aX%``te! zih{8iHMS|)J+a)4INxsCPD(!T)bAr;5Z*ZLg+}yGkg&mPebrpKeu6}}@TMmP+nHn4 za}~5FO-mJ~yDY_WUsP?R*-`dyO2A~;p8dV<-g$82o4%i1iNQ%AnTvXhC$!! zrraRY-+B6G7IIiFgy@4&*^2%e#ME=kX*LDsq3*DnE*G=RPaxS&_n2f65E;6lFJ|0` zd8-tuJo1d`to|J>`dD0z45n{<1be=KSunqw*v%6fWOCQegh~C`&gLWm=&5H%55=QW zlOQx=NBzLd_qw6stB0X*Fh7|N6eP06q_Oc*z$gu^tMGd*v3I}eDVhj9p$|Yu@=>cP z3SnZA4p^^aL{ZG>1#rBpB{HKo+KY*av76krs2E$08Hg`7ci#;>H`Q9d4VuG{v+Cml zDKJUX+Eo|0hM23N)c)p+QAaeU9Vq&@dCvSnb;+=ztbLkmlDdCrZ2a?$a|$mld48%a zZ5%yNb?cye`?h%4ueWc<=N$=$!SKna1S{*T|!xQBbp!Fcc({ zMo0)*t6^gil1e(zsK^v09Z+dTo0c|KOUi-2dGtb=5eP8!=zpwZ8zOLtdFt%lnH2cU1(F}>8CUW&07Z;(R z{dM%RkZc8Lwm!CdCw-HqS>;*CLq35zt&sp$Pq5+)ZeQl~yBsx8A7okXpb1oc?^~km zL>b)eXt_(UkKk*U9Su~d=qHKb2T0|mESJ_;TK2SjJpDSFXAC=kkb9LZJ9L1uQrvh4 z`EmY*qxqx0qIZmnd@AsFzv3_2;A3~jC$qNUUVd%N`2O<_BkVEaXqoR-S~7)j)keg*jc zensKyQ^!*Vd1`LA^qGzL*N7diw>;AD@N0*MrYOL>7IKarL!t?mbg2~WOnkU7kC*t*|;J_G|3|cDOb)jrprxbX*$afxiB99QuL!lBYFRWcD5o>V>Gy zC;tbzgw4|aG!*^A=mYN2dis7o9CR&5<5@zH@1EYGh9HGBIYuVD z21Kg((4?($uMmP)Y@VDTGWLf=Hs&u&nTtnfM3NA9rwR7KCygN;^Oix=9hY=&8bb^2 zgCfNtQLdIdpx%^;_|s|0tpsh0w-kuid}6kB4&85h>Ot|Z$}6(r1DU`;ENHvyc~y`w z-h#=pP3jawj`^L?WuEE5pUm4d{Iv}N(PW|4vfr9n+$w<9Cx1L|B~kjy<}`r5X2j`E4bOHjc4ZkZ%GTQ{`oD`3klUEGikfu zeq=6juLRG*-u(&R*wo+*By_I&>wDO7En77Q@|W}#AM(k60tGzsp0>ln8=wPxe6wxH zqv6>opeeLL-1YANr;Mm!aFnCF-Kt|yp#&kMjRcSC5w@TfKRp@~tQf@yD(KimErg!Q zfymb%xWha)RRuxnAfMVy;Ksu}DB&p}-fjXf!it5InuLoKShfF+?N)~cInB%Z9KS?& z11D1Et(KpS^NiWrtaUsjm>b!fD1Q_F2?vz}S1p)mU7i`TC~PDiIPdX9kOM-dF+BuW z$K_?Jj_hm$G5v4|H);umhkbaV&f8rBVfi1yD5w?4HTVuk04#)dm4pg; zIQKd*4H>2q1jl4UE;P%_pFLCXBy;Fzi6RS!1%P79Oe z=`zs`t~pAmz+BxSqb9IWw1IfXF`HzIU(^RI#TI1ouMxb?VT6Z&EC z2=3ZOBk^CVKRjbX+^Jo_^8qAiYuYP!3<5kJM8Ts{Qobkf=K3l-plZRZnr$rzUi>M> z*8<|5AtrR)p&b{R8kTaA%JOXBN-nLq`(^FZ=pDeFy!1Q-Pjf)G3jP!y&Hv;F-?#opW}xV9D+D>N}Aj0e_NbzImtJmw*VKLOQ1KDmNXGy-KSI)U@RMst>;<#nA0f{9W$0FX8-;dniQ%HSwSRIVGvupJ^@VKDvcKTF zswJo4vfqx&%Z2B1^5@vx$Xhg@~fXQG!f+QbbVT~g$*Ybax?6nPK51x((C-G52rj2rU*-*Zfj|5386~f zZneyq2yXEl?~MBSz}@=u*R{?0M;E(a83Wq4hP!a5b#2Y^FCl;Lb@0#u{<-D(hYv>g z94iqnU|A)_vw{%uJK?P{N!mwWJ$ku4AK8h%CAj`6<*YiMzo#Eyo!yP4ck{r_>Rer#X)`^$QjCdF0Fv9&U}q$yQz2&=!V8p!znvG?YIK}8+lHSZy+HvZY}

#cx!1hA0#-xR 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�)L=VN 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 $kU9=)%U?u9X2M4eE=n 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 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 7f04cba913c887e70dd44deddcff05227bacc325..91ee4ccd9504fc0bbbc390e72b261114c4904bae 100644 GIT binary patch delta 3462 zcmai0Yj7LY6~0%I?6oc1vaDUNY{}lW?6q(lITo>!m^g|2knQ*-$95dtkg%3+tgYo; zv0B+ULu)$?Q|P3GaNB9xh7O@A11Tkh1g3SVCkdo26qvNrQXU?rokF1*Ab|l&8PoKx z9!Yq#)gS5TJCD2PeBZfyeE8+y-Q#faVC2ZqB7|@e0@_F~Rnn(yJ@g`^ffay9iaHAb z0RFHT(?m^DrgNEX4=XPL&t_Sf?4b|)AxF%@{-sy;!6Fi_OaHP#YPEseLT0%wr>bNLN zd#VfhK4U=fNPu5s?hrN9yar!3xQ44)hZvHgk~WhIeI_U04oc~Qx(*c~xkFW^wMbX~ zDS+Ssb60n}-&Y20U9yH$+4SfJG3wWpNh#DWBXxYnKh7Ve)&byif$DR3--_CuH?`RO z@wgI_Ow(ZH#u@;BM+Fph{Wc(angD;^`#7-mh+|4Z^~^xPZrlniL#h}?ISc+awksYL zNowbTo)%G_s3Om`MUiA}Se7&t?laxn8OP9AT-IssY47M?-{~$Q9z9~KDBUXBX&^xQ zZtO8uuk_Edy<(i4H{|`E!C!3dQ`E5c7%=Mt;BPed2iserSwEGx0N-YGHgNH3k|?N3 zQ)tw&TP2}tBIG~s?6;6!Bx3M8?yX8_0_{f8C{pdMVj+Ic$OhkZ47UvS$24iu<1@Om zNrvIR5rxbXzU=)vw6uybN%LNY@B{x_z8Y|_36_Ie81y^^olhHE6+YN?(bm6vw-iG2 zGdn$?aTzz5s#ZF>qTGYv_=$;I@tmow zB<`2PC%$41Mn&15&5n>0hLp*!7(QVt6^;zJM-(+0Zj;0@qo9leM@%BnNpbZN&5@-&3k*>+r1I5+?aw;!#hKVh$M`z32n zA#u6NZBFkk3ya%Q_%3BwJxg)BK z@$)u$N>Ua1x*ZwO<-w+$3X9$|r@e4ZQg&QQcU)KgI{-28cv5-IhpH+`skHe1fc?3) z9R5SFu|)vwEWSC{K6`9+i==2M6p@vvLiBi@F9JM2GGsKk7u2^*0Qjm&T7TFmMm?JV z;9IWGNYHx*^80-AX$j^(BW9a*3Bpf2-v_I83D%P0NeMQ63WvC$s*J1RT>C19%LkE$^k3iJmaM=YNYO%H(=UZ2udEFw)Vpu%#xO;F~()J*gEQ&CEcTMXaLK$u=iY3OPQV9A$$2ki=kS{Q{ zfU1)i4&JsW5JS5$sK8u6&5vPJu&(0Y1YBmp& zOA^KPq4_6~enZlL&a5R!Tj(r0%i#m=;;6_a7k+A&BrjHcv4Hu)){5v`%R_s6$d`T{ zmu#oVp%s1ON@7%B*D*ptQj^qi({*I|T~j4Hjj>cFph&-KY(4442=g93NnLu|0#-Qt z@Z~}`T*Pimy(#%BfOl8~Dw7O5%S%bK^4yugMSQ~2NZjAFbfn#{FIq)xv1o1DzPG5E z*sm6ir0uoVN@9;%n@g|0X3g3Tj%`*n>%nJXFIO2eE_#(8|{H^+)8(Ke|}OdX?C)NU;jluBryZr zU-ECVv7f(kAiT$7!@W$g-Wev-*zYo{iT!J)Io%nmgeP`wNk!W3E2$>7R#KC;?<=vh znL#*w#t6Cr^|~EvsAj?L#+EMwB#!P?BGut?H)tj zBD6c~%QgWxXtTW$WLfMi6(`i+H6^OFffQx#GBSsZ!Xgx?gUUVlQkj+dIBd_d3t$oF zI;!)C#{<>Oz7pXh7B@N8QLj7F;6QmP9<>)-m&&r=%`BA(r`HHa%l@luUUCT3&nwd5 zSaG$e+I-8gFO*n-D;(H1*PeS3Y^}_jexZc9yXPj2* zm?iD=H)oyhb3bH`LE-5pVSf|RLLGG}lVhNKrH(H{W}iXWzd?B72K=sN9X?xbrS7Rr z=U6J|bf4!S^G7JmZ4?%oac)Hubw88Fdn%IWc-X+4G6)}R67JfB=PE`U_j*#eK5)I! z#&o0e$h#Wa6(ie438%Vr7BbI5;eEew){jN22RCy}XObs+SZ+GZG$lq8C>3zNfO*X< zJkTrbZ*}}1j^iJ4RfLYGIreI=9t;W>`f-Hea29_}uQtgwZ~^<$yqtFEZbUnWlQ$TKh}!lY>X0%#QA~OwqzS*Tf}ip91?pijqOdO zU3Ilea0<0U-IpKq6~g58JW6|rAT0?GLU>7N$w?sr0_8WfC8s%3dB=X$u@U z?W`pSH|6v_|KZu0xp(Hy%=dm~bT0gO-#w#ndhb|ToQ4oiLqHqpd%X0%k`O%&X;1{f zE_;U+03bxggeGc|A_r4)vb;?Oi(o&u}W71~!EbU6gG$|%(NEKtrBD0<9R%Ct%deT)KO8Ek~OOfqfEG4m9~-*%*#Cwc!|*(G)h(`#+n|2g-e(|S<+Cn z+uWW%ZR=OmSk&_qPyrwA5VuNE5>O}=kzyz;Mz)CRs`bDQtM0*KnQVe=I<-=a37Qg@A^{nx zqvOJ;aGY8OfWHa^&f+tMx`|b9*o9#s4B+es7LPTTqkt4 z^?H752?g4FmUoCoCM33s(ru!Xev>0kFoeIFQ?tNMKD)#ui8%bOP5~&zk3f~mA+SZA32*J^}_Ko2;jb;7mi*HR?!ZA@6 zDqQ^};0T#MunVwoWt$X>Nn)G`D;QH$u>)<3`5uG9=f}6ye0uturXqWrBn~5u{~zON zpQ$Xptg(^4&fbBfdhcA+x)rD9Ni?vLavvbm%)$^R4NpxnQ z62R5K23^&9qO+My?}rV)Xo)FGe3*!l4Ub7NykuToX)maORVzs?sv@~I$#%+HQBpHu zSdLTkDkm<{54Gi!7)Um_g<@RJTaf;7H z0;^~Af)dg!EAk>=6qw7}Xi`(MbYP=89`c=lgHD@H2bRAXOt@Gj3y6XII+rfh1YrdH zgl_@WEUBq8h=3bby=oaI8<4-U-c4FFs9?ME*D{2Fk|v>ikLRZuYIGV*Z-6R~#iDbg zCZ{384K@P~elG+LSQ}1hkuf%`Bqy|p5=CrC(MWoXd+zoIQmT?bqRjTm!tHzzGS`#o z2wTj94RhGS_Lx2=bUDPZ$_Pu=0&j3X4GK&vd^-Vrb_O*3J_B1yT-!+$^`_R9>%>Sz zk`XKDs*@wg^SHeosqqO>UULFi+GEPFaKtWel~hIUylWOt^WiP#3X84@&!+r>r89KW zB|z}Rc6KcRNEkzX@O7IGC>frfA=Jim!dGVr^+|^qV>5_iGmK(|QPEGW2B3)pXuTIr zup^4fwj&v7CLcRWB1EbrkJg-QXps~RMaE<$ri_k@oBd;ehsIf)-3b=AYyt3pP15qi zMlr_U0Dz}u$t=%&KZBlc`*&n{mj4o9U@Jv{20!KR0}Z;4>&VW`AT6hK!@4ZdWSdC2nDL_wqSRLYv*PxgG`^<}is3 z9$)2o2iN9tiz;$KFnFiY9?(@XUSq5$ON|og1-_CJW6++~#J@0sctY8RRCEWP%(MIV z7;1)2Uu^oT@!hBg13uUVcstZ-^s=7@ zjbP1{$1~XaE|bMpybx5w79gcJfOyR_)icmyb!z#m4C#aKZvKAB3gCn*&wMQlF5el` z>5t9sGm9EUXJZyzJ~M=kixMtD6^GeCT!QC}Nwf6?4EL{Yzrq7Mt z$a;{1;~)tYJGrd3iQ{l1(~Y*V14x9W&}j@SFb_~Ww&E8p%O*PWOt;wArqnHH96r;K zMME!nHK8O8=vhib+D7Nnxh_BOvKgq5+=zbhjAC`XBr_0W3a&wNq5f=|i}%UNp=K{* z-8D6Q8b4ax@g=0+L=T5(YUVAs_(v3RpXH#5d~5ovOTQ3x*pWczlh18qN(`|xJtXWV zdNsLP<^(-|PCrA<4mJ~*JK@USJBH$^%5|y!ygkhZaPZE5%LD9pKnT}by->fU7Mo^X zn|R8~k@|mG7i8<_tc|2zP|%*OZzxzq>bncB&(_Zrtg_4v1&7@%?r~R>dt<&gJ2P<@ zv{mL^HDhqvR*c_pJ1hUeXy&DRB%eMuKct_G{?h$LEFrMcA1~~$`E??IVDGOj9D>6~kZ*6|EjOQPI=gRh{A22d@ z>+Zm>3-4RY-`Dlq;?n=&SN|GBu99H!eotCpMX z4gYxhX?ro=Z?DLT<9WM>m|whF&!cNdy@9UH_TNf7nX9Vslb<>OP+7SGypd-9WvAoI zJ@FstC1jEchmf5FIdp}8%dsd^KYGf+8%VUZ~(MH*x#R|6k<5J4-q0)#~g( z$4l$V$sqR{9N#f;@2}=AuF?mYo5}c-(hBObC2P-?ae8papyMRuo^IwQn{mID#adYr z^-)pQ=38a;y3K>o@d)HT61bBB{z+Lqbs_(1@C%Dc|7XxKW#CS>au-|lIZN;*YYFxh zxNzK6L_J@dHQwoB^}$|+j-NyBNPzpG4c}AX#qScE_nldrzq+_0V)LlMam>ISXy={| z>H}sO;HM5WX6^pnU11}3&qBw`kbAI``>?|`3xUPt6#nLR^7=3~$CFm>-gVr`8(sfL zBH&I_n>)h$*6Jkfu z;INpKl9?#J3mpd_cXlJUec}e;NjuD;Jxt*`ztbUX>Udn4T0VZ77R!2D<77pr%CMD}JHa+G5#dh~VA P*K?^fxedd@n(O`!QU3vo 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") From 26f733c29ce269407371662a8bca6d6b20c58244 Mon Sep 17 00:00:00 2001 From: Jorge Rivera Date: Mon, 26 Oct 2026 11:37:44 +0100 Subject: [PATCH 07/12] feat(client-contract): identify clients, order for reading, and pin the base URL and role keys (#25) The client-identity rule (rules/client-identity.json, 18 vectors) has every API request carry X-DFO-Client: / (), such as dfo-python/0.1.0 (CPython 3.14) or dfo-ts/0.1.0 (browser). A caller's headers or header provider naming it raise header_invalid, and no request to another origin, a signed storage URL included, carries it. Scenario records keep no request headers, so a client's replay checks that each path and origin_path request carries the header and each url request does not. The column-order rule becomes reading-order (rules/reading-order.json, 10 vectors with rows). Columns run: the filled reading slots, then the other columns whose values differ between rows, then the constant columns, with stat_var last. A stack puts part first and judges the groups over the stacked table. Each member's rows are sorted by the filled slots without value and the time period, then by the varying columns (stat_var among them when it varies), then by the time period, so each series' years read together. Keys sort ascending with nulls last, ties keep served order, and members keep member order. The validator reads served Parquet once per file through served_table and checks every scenario's columns and every vector's rows. 28 scenarios change their columns only; no body file changes, so digests stay the server's. A base URL is valid when it is an absolute http or https URL with a host and no userinfo (an empty one included), query, fragment, dot segment, character outside visible ASCII, or IPv4 host in a form other than four decimal numbers. A relative URL is valid only in a TypeScript client inside a browser page, which resolves it against the page's address, and a valid value is used less its trailing slashes. Seven new vectors in rules/base-url.json pin these cases. The User-Agent sentence now says TypeScript sends dfo-ts/ outside a browser page or browser worker, in Node, Deno, Bun or a server runtime such as Cloudflare Workers. The role-keys rule (rules/role-keys.json, 13 vectors) names the keys of entities=: place for the subject, posted as observationAbout, and origin and destination for flows, posted as themselves. Spec.roles and specRoles(spec) list a spec's roles under those keys, a flow spec takes both directions, and a key outside the spec's roles raises invalid_argument naming the typed key and the spec's roles, so observationAbout and column names such as financingRecipient are refused. A spec that names no role posts place as observationAbout and leaves the rest to the server. --- python/client-contract/CHANGELOG.md | 5 +- python/client-contract/README.md | 11 +- .../src/dfo_client_contract/client-codes.json | 2 +- .../src/dfo_client_contract/contract.py | 4 +- .../src/dfo_client_contract/rules/README.md | 39 +- .../dfo_client_contract/rules/base-url.json | 55 + .../rules/client-identity.json | 174 ++ .../rules/column-order.json | 529 ------- .../rules/reading-order.json | 1399 +++++++++++++++++ .../dfo_client_contract/rules/role-keys.json | 355 +++++ .../rules/rules.schema.json | 500 +++++- .../scenarios/answer-definite-fetch.json | 4 +- .../answer-folded-parts-unnamed.json | 6 +- .../answer-operations-not-a-list.json | 4 +- .../answer-several-readings-folded.json | 6 +- .../scenarios/choose-candidate-two-parts.json | 2 +- .../scenarios/fetch-null-member.json | 4 +- .../fetch-ref-artifact-unlisted.json | 4 +- .../fetch-ref-expired-file-selector.json | 4 +- ...etch-ref-expired-rebuild-same-version.json | 4 +- .../fetch-ref-signed-url-refused.json | 4 +- .../scenarios/fetch-ref.json | 4 +- .../scenarios/fetch-retry-after-504.json | 4 +- .../fetch-spec-accepted-running.json | 2 +- .../scenarios/fetch-spec-async-build.json | 2 +- .../scenarios/fetch-spec-entity-dropped.json | 8 +- .../scenarios/fetch-spec-entity-rebound.json | 4 +- .../scenarios/fetch-spec-frame-layout.json | 2 +- .../scenarios/fetch-spec-group-narrowed.json | 2 +- .../fetch-spec-group-origin-rebound.json | 2 +- ...tch-spec-operation-failed-resubmitted.json | 2 +- .../fetch-spec-poll-pacing-changes.json | 2 +- .../fetch-spec-poll-rate-limited.json | 2 +- .../fetch-spec-poll-refused-backoff.json | 2 +- .../fetch-spec-poll-refused-retry-after.json | 2 +- .../scenarios/fetch-spec-poll-refused.json | 2 +- .../scenarios/fetch-strict-info-notice.json | 4 +- .../scenarios/mint-async-build.json | 2 +- .../scenarios/operation-resume.json | 2 +- python/client-contract/tests/test_rules.py | 153 +- tools/README.md | 2 +- tools/capture_client_contract.py | 43 +- tools/tests/test_capture_client_contract.py | 6 +- tools/tests/test_validate_client_contract.py | 83 +- tools/validate_client_contract.py | 248 ++- 45 files changed, 2963 insertions(+), 737 deletions(-) create mode 100644 python/client-contract/src/dfo_client_contract/rules/client-identity.json delete mode 100644 python/client-contract/src/dfo_client_contract/rules/column-order.json create mode 100644 python/client-contract/src/dfo_client_contract/rules/reading-order.json create mode 100644 python/client-contract/src/dfo_client_contract/rules/role-keys.json diff --git a/python/client-contract/CHANGELOG.md b/python/client-contract/CHANGELOG.md index 2bafe50..3b161a4 100644 --- a/python/client-contract/CHANGELOG.md +++ b/python/client-contract/CHANGELOG.md @@ -24,7 +24,10 @@ All notable changes to the `dfo-spec-kit-client-contract` Python package will be - `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 `reading-order` rule and its vectors, which carry rows: 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 columns whose values differ between rows, then those that hold one value, each group in the server's order, with `stat_var` last. It sorts each member's rows by the filled slots without `value` and the time period, then the varying columns, then the time period, ascending with nulls last and ties in served order, so each series' years read together. Scenario outcomes give `columns` in that order, and the validator checks it against the served files. +- The `client-identity` rule and its vectors: every request a client sends to the API carries `X-DFO-Client: / ()`, such as `dfo-python/0.1.0 (CPython 3.14)` or `dfo-ts/0.1.0 (Node 22.18)`, and `browser` as the runtime in a browser, with `pattern` matching every well-formed value. A request to another origin, a signed storage URL included, carries none. A caller's headers or header provider naming `X-DFO-Client` in any letter case raises `InvalidRequestError` `header_invalid`, whose condition now says so, and `User-Agent` stays as each client sends it. A scenario replay checks the header on each `path` and `origin_path` request and its absence on each `url` request. +- The `role-keys` rule and its vectors: a caller narrows a spec with `entities=` keyed by `place`, `origin` and `destination`, and a client posts `place` as the wire role `observationAbout`. `Spec.roles`, `specRoles(spec)` and the clients' errors name the caller keys, and a flow spec takes both directions. A key outside the spec's roles raises `InvalidRequestError` `invalid_argument` naming the key and the spec's roles, so `observationAbout` on GDP is refused naming `place` and `financingRecipient` on a flow spec naming `origin` and `destination`. A spec that names no role posts `place` as `observationAbout` and other keys as typed, and refuses `observationAbout` naming `place`. - 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. +- The `base-url` rule states the whole validity rule, and seven new vectors pin it: no query, fragment, `.` or `..` segment, character outside visible ASCII, empty userinfo or non-decimal IPv4 host; trailing slashes dropped; a relative URL valid only in a TypeScript client inside a browser page. [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 1a1734a..74a5ee3 100644 --- a/python/client-contract/README.md +++ b/python/client-contract/README.md @@ -118,7 +118,7 @@ An answer's gaps follow from its parts. A candidates part is a `choice` gap, its ## Client codes -`client-codes.json` lists, sorted by code, each code a client sets on an error it raises when no problem document carries one: the `code`, the error `class` it raises, `retryable`, and a one-line `condition`. `retryable` is the flag both clients generate onto the error: `deadline_exceeded`, `download_failed` and `network_error` are retryable, `digest_mismatch` and the rest are not, and `refusal_without_code` is retryable as its status is, which its row gives as `by_status`. Both clients set an error's `code` from this list, so every error a client raises carries a code. A refusal keeps its problem document's `code`, the website proxy's included. A refusal whose body carries no code raises `refusal_without_code` with the class its HTTP status maps to, which its row gives as `by_status`. No other row does. A problem document without a code still gives the error its `retryable` and `trace_id`, so a 503 whose body says `retryable: false` raises at once, which `search-refused-without-code` pins. Every refusal's trace id is the response's trace id, as the trace-id rule under Scenarios gives it. `search-refused-without-code` pins the body's winning over the header, and `search-unauthorized` the header's for a refusal with no body. No client code is a code in `actions.json` or `registries/codes.json`, and each class is one the scenario schema names. Each reason the key-lookup rule raises, `key_empty`, `profile_not_found`, `profile_without_key` and `credentials_file_invalid`, is a row of class `AuthenticationError`, as are `key_invalid`, a key outside visible ASCII, and `credentials_file_unreadable`, a credentials file that exists but cannot be read. `header_invalid`, a header value with a control character, `insecure_transport`, a key over plain http to a non-loopback host, and `base_url_invalid`, a base URL that is empty, not absolute http or https, or carries userinfo, are `InvalidRequestError` rows. `response_too_large`, a decoded body past its cap, is a `ServerError` row. None of these six is retryable. The list holds no warning. `warning-codes.json` lists, sorted by code, each code a client sets on a warning it issues itself, with its class and condition: `ref_digest_changed`, 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, where the client returns the data; `route_deprecated`, a `DfoDeprecationWarning`, for a `Deprecation` or `Sunset` header; `server_warning`, a `DfoWarning`, for an `x-dfo-warning` header; and `key_checksum_mismatch`, `key_not_base62` and `key_unknown_prefix`, each a `DfoWarning`, for a key that fails the key-format rule with that reason. Both clients generate their warning codes from it and issue no other. No warning code is a code in another table or in `registries/codes.json`. A `SearchWarning` carries the code of the one way the readings differ from the question, a departure's or a warning's code or the verb of an operation Search did not run, and a null code when they differ in several ways. A `DataWarning` carries the manifest warning's code. +`client-codes.json` lists, sorted by code, each code a client sets on an error it raises when no problem document carries one: the `code`, the error `class` it raises, `retryable`, and a one-line `condition`. `retryable` is the flag both clients generate onto the error: `deadline_exceeded`, `download_failed` and `network_error` are retryable, `digest_mismatch` and the rest are not, and `refusal_without_code` is retryable as its status is, which its row gives as `by_status`. Both clients set an error's `code` from this list, so every error a client raises carries a code. A refusal keeps its problem document's `code`, the website proxy's included. A refusal whose body carries no code raises `refusal_without_code` with the class its HTTP status maps to, which its row gives as `by_status`. No other row does. A problem document without a code still gives the error its `retryable` and `trace_id`, so a 503 whose body says `retryable: false` raises at once, which `search-refused-without-code` pins. Every refusal's trace id is the response's trace id, as the trace-id rule under Scenarios gives it. `search-refused-without-code` pins the body's winning over the header, and `search-unauthorized` the header's for a refusal with no body. No client code is a code in `actions.json` or `registries/codes.json`, and each class is one the scenario schema names. Each reason the key-lookup rule raises, `key_empty`, `profile_not_found`, `profile_without_key` and `credentials_file_invalid`, is a row of class `AuthenticationError`, as are `key_invalid`, a key outside visible ASCII, and `credentials_file_unreadable`, a credentials file that exists but cannot be read. `header_invalid`, a header value with a control character or a caller's header named `X-DFO-Client`, `insecure_transport`, a key over plain http to a non-loopback host, and `base_url_invalid`, a base URL that is empty, not absolute http or https, or carries userinfo, are `InvalidRequestError` rows. `response_too_large`, a decoded body past its cap, is a `ServerError` row. None of these six is retryable. The list holds no warning. `warning-codes.json` lists, sorted by code, each code a client sets on a warning it issues itself, with its class and condition: `ref_digest_changed`, 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, where the client returns the data; `route_deprecated`, a `DfoDeprecationWarning`, for a `Deprecation` or `Sunset` header; `server_warning`, a `DfoWarning`, for an `x-dfo-warning` header; and `key_checksum_mismatch`, `key_not_base62` and `key_unknown_prefix`, each a `DfoWarning`, for a key that fails the key-format rule with that reason. Both clients generate their warning codes from it and issue no other. No warning code is a code in another table or in `registries/codes.json`. A `SearchWarning` carries the code of the one way the readings differ from the question, a departure's or a warning's code or the verb of an operation Search did not run, and a null code when they differ in several ways. A `DataWarning` carries the manifest warning's code. ## Scenarios @@ -138,15 +138,16 @@ A step that acts on an earlier result follows one: `choose` follows `search` or 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 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. +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 reading-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 `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`. +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 with pyarrow, its columns in the order the server wrote them and which of them vary between rows, and orders them as the reading-order rule gives. The outcome holds no rows, so the rule's vectors pin the row order. 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. A client replays a scenario by serving the exchanges in order: - A request matches the next exchange on its method and target, and on each listed `json` member, compared as parsed JSON values. +- Each `path` and `origin_path` request carries the `X-DFO-Client` header the client-identity rule gives, and each `url` request carries none. Records keep no request headers, so the replay checks the header on every request it serves. - A request with no exchange left, or one that matches none, fails the scenario, and so does an exchange the call never makes. - `path` resolves against the base URL the replay gives the client, and `origin_path` against that base URL's origin, so a replay can run under any base URL form. - A replay substitutes its own base URL's origin for the origin of the record's `origin.base_url`, a synthetic record's parent's, wherever a response names it, in its JSON body and its headers. `fetch-spec-same-origin-artifact-url` names the recorded origin in its manifest's artifact `url`s, and the validator replays every scenario under its recorded base URL and again under `https://replay.example.org` with the same path, so a record that holds only under its recorded host fails. @@ -159,7 +160,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 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 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 reading-order rule, which also sorts each member's rows. 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. @@ -216,7 +217,7 @@ A record's `origin.base_url` is the base URL the run was given, a local app's in ## Rules -`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`. +`rules/README.md` states the shared rules for credentials, key lookup and format, the base URL, disk caching, the order a client presents a dataset's columns and rows in, the keys a caller narrows a spec's roles by, and the `X-DFO-Client` header that identifies the client to the API. 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/client-codes.json b/python/client-contract/src/dfo_client_contract/client-codes.json index 025fdf5..a0e8c9f 100644 --- a/python/client-contract/src/dfo_client_contract/client-codes.json +++ b/python/client-contract/src/dfo_client_contract/client-codes.json @@ -65,7 +65,7 @@ "code": "header_invalid", "class": "InvalidRequestError", "retryable": false, - "condition": "A header value holds a control character." + "condition": "A header value holds a control character, or a caller's header names X-DFO-Client." }, { "code": "insecure_transport", diff --git a/python/client-contract/src/dfo_client_contract/contract.py b/python/client-contract/src/dfo_client_contract/contract.py index 57b5484..944da09 100644 --- a/python/client-contract/src/dfo_client_contract/contract.py +++ b/python/client-contract/src/dfo_client_contract/contract.py @@ -16,7 +16,9 @@ "base-url", "cache-dir", "cache-layout", - "column-order", + "reading-order", + "client-identity", + "role-keys", ) 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 1ecfdf9..3c52496 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, 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. +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 reading-order, client-identity and role-keys rules 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`) @@ -42,7 +42,7 @@ A client resolves its base URL when it is built. The first source found wins: 1. `DFO_BASE_URL`; 1. the public default, `https://developmentfinance.org/api/v1`. -Only the chosen source is checked. A base URL is valid when it is an absolute `http` or `https` URL with a host and no userinfo. An invalid one raises `base_url_invalid`, so an empty `base_url` argument raises it where an empty `DFO_BASE_URL` counts as unset. A valid value is used as given; the rule fixes the source and the validity, and leaves the URL's form to the client. A key sent over plain `http` to a host that is not loopback is refused by `insecure_transport`, which this rule does not decide. +Only the chosen source is checked. A base URL is valid when it is an absolute `http` or `https` URL with a host and none of these: userinfo, an empty one as in `https://@host/api` included; a query; a fragment; a `.` or `..` path segment; a character outside visible ASCII, a control character, a space or a non-ASCII character; or a host written as an IPv4 address in any form but four decimal numbers, such as `127.1`, `0x7f.1` or `2130706433`. An invalid one raises `base_url_invalid`, so an empty `base_url` argument raises it where an empty `DFO_BASE_URL` counts as unset. A relative URL is invalid, except in a TypeScript client inside a browser page, which resolves a relative base URL against the page's address. A valid value is used as given, less its trailing slashes, so the client's base URL reads `https://developmentfinance.org/api/v1` for `https://developmentfinance.org/api/v1/`; the rule fixes the source and the validity, and leaves the rest of the URL's form to the client. A key sent over plain `http` to a host that is not loopback is refused by `insecure_transport`, which this rule does not decide. ## Key format (`key-format`) @@ -70,9 +70,9 @@ Inside the cache directory: 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`) +## Reading order (`reading-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. +A client presents a dataset's columns and rows in reading order, in every table it returns. `reading_columns` in `reading-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. | Slot | Long layout | Frame layout | | ----------- | ------------------------------------------------ | ------------------------------------------------------ | @@ -86,4 +86,33 @@ A client presents a dataset's columns in reading order, in every table it return | 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. +The columns come in four groups: + +1. the filled slots, in slot order; +1. the other columns whose values differ between rows, in the order the server wrote them; +1. the other columns that hold one value in every row, null included, in the order the server wrote them; +1. `stat_var`, last whether or not it varies. + +A table with no row or one row has no column that varies. A dataset of several members puts `part` first and judges the groups over the stacked table, where a member's rows hold null in a column that member lacks. So a CRS series of Germany's basic health ODA to Nigeria, split by co-operation modality, reads `time_period`, `financingProvider_label`, `financingRecipient_label`, `crsPurpose_label`, `value`, `unit_label`, `crsTypeOfFlow_label` and `provenance_label`, then `crsCooperationModality` and `crsCooperationModality_label`, which tell its rows apart, then its 15 constant columns, `stat_var` last. + +The rows of each member are sorted by the filled slots in slot order, leaving out `value`, a measure, and the time period, then by the varying columns in presented order, `stat_var` after them when it varies, then by the time period, so each series' years read together. The keys of that series are the provider, recipient, purpose, unit, flow type and provenance labels, then `crsCooperationModality` and `crsCooperationModality_label`, then the time period, so it reads every A02 year, then every C01 year. Each key sorts ascending, numbers by value and strings by Unicode code point, with nulls last. Rows whose keys tie keep the order the server wrote them. The members follow one another in member order. + +A vector gives the dataset's `members`, each with its `part` when there are several, its `columns` and its `rows` as the server wrote them, and the `columns` and `rows` a client presents. The order moves columns and rows and changes no value. A client hashes a downloaded file before it orders anything, so the digest and the ref keep the server's file. + +## Client identity (`client-identity`) + +Every request a client sends to the API carries `X-DFO-Client: / ()`. `` is `dfo-python` or `dfo-ts`, and `` is the package version as the package states it. `` names the runtime and its major and minor version. In Python it is the implementation as `platform.python_implementation()` names it, then the interpreter's major and minor version, such as `CPython 3.14`. In TypeScript it is `Node`, `Deno` or `Bun` with the major and minor of that runtime's version, such as `Node 22.18`, and `browser` in any other runtime, a page or a worker. `pattern` in `client-identity.json` matches every well-formed value. A vector gives the `client`, the `version`, the `runtime` as its `name` and full `version`, or `browser` with no version, and the `value` the client sends. + +An API request is one to the base URL's origin, a `path` or `origin_path` request in a scenario. A request to any other origin, a signed storage URL included, carries no `X-DFO-Client`. In a browser, the files-route request the TypeScript client sends with `redirect: "follow"` carries the API key alone, because the browser forwards every other header to the storage host it is redirected to. + +A caller cannot replace or remove the header. A client checks the caller's `headers` argument before any request, and the headers a header provider returns each time the client calls it. A name equal to `X-DFO-Client` in any letter case raises `InvalidRequestError` `header_invalid`, whatever its value, the empty string included. A vector gives `via`, `argument` or `provider`, the caller's `headers`, and the `verdict`, `accept` or `refuse` with the `reason`. Every other header is the caller's to set, `User-Agent` included. Python sends `dfo-python/`, TypeScript sends `dfo-ts/` whenever it runs outside a browser page or browser worker (Node, Deno, Bun, or a server runtime such as Cloudflare Workers) and none inside one, where the browser forbids setting it, and a caller's `User-Agent` replaces the client's. + +## Role keys (`role-keys`) + +A caller narrows a spec by its entity roles with `entities=`, keyed by the caller keys `keys` in `role-keys.json` lists: `place`, the place a measure is about, and the flow directions `origin` and `destination`. A client posts `place` as the wire role `observationAbout` and each direction as itself. `Spec.roles` in Python, `specRoles(spec)` in TypeScript, and every error a client raises name the caller key. Each role has one caller spelling, so `observationAbout` is a wire role and no caller key. + +The roles a spec takes are those its `definition.identity` binds in `entities` or lists in `open_roles`, in that order, each under its caller key with the dcids the spec binds it to, or null when it binds none. A flow spec, one that names `origin` or `destination`, takes both, since a direction it neither binds nor opens reads as the total over it. The direction it leaves unnamed comes last. A spec that names no role takes `{}`. + +A client checks each key the caller types before any request. A key outside the spec's roles raises `InvalidRequestError` `invalid_argument`, and the message names the key and the spec's roles. So GDP for Kenya refuses `origin` and `observationAbout` naming `place`, and a flow spec refuses `place` and a column name such as `financingRecipient` naming `origin` and `destination`. A spec that names no role leaves the check to the server, since the client cannot tell which roles it takes. Such a spec posts `place` as `observationAbout` and any other key as typed, and still refuses `observationAbout` naming `place`. + +The server replaces a spec's whole binding with the posted one, so a client posts the spec's own `identity.entities` with each role the caller names replaced by its dcids and each role the caller binds to null dropped. A vector gives the spec's `identity` and its `roles`. A vector that narrows adds the caller's `entities`, then either `posted`, the wire entities the build posts, or the `error` with its `reason` and the keys its message `names`, the typed key first. diff --git a/python/client-contract/src/dfo_client_contract/rules/base-url.json b/python/client-contract/src/dfo_client_contract/rules/base-url.json index 4fde759..c53ffa5 100644 --- a/python/client-contract/src/dfo_client_contract/rules/base-url.json +++ b/python/client-contract/src/dfo_client_contract/rules/base-url.json @@ -117,6 +117,61 @@ }, "source": "argument", "url": "https://arg.example.org/api/v1" + }, + { + "name": "query-raises", + "base_url": "https://developmentfinance.org/api/v1?key=1", + "env": {}, + "error": { + "reason": "base_url_invalid" + } + }, + { + "name": "fragment-raises", + "base_url": "https://developmentfinance.org/api/v1#top", + "env": {}, + "error": { + "reason": "base_url_invalid" + } + }, + { + "name": "dot-segment-raises", + "base_url": "https://developmentfinance.org/api/../v1", + "env": {}, + "error": { + "reason": "base_url_invalid" + } + }, + { + "name": "control-character-raises", + "base_url": "https://developmentfinance.org/api\n/v1", + "env": {}, + "error": { + "reason": "base_url_invalid" + } + }, + { + "name": "non-decimal-ipv4-raises", + "base_url": "http://0x7f.1:8083/api", + "env": {}, + "error": { + "reason": "base_url_invalid" + } + }, + { + "name": "empty-userinfo-raises", + "base_url": "https://@developmentfinance.org/api/v1", + "env": {}, + "error": { + "reason": "base_url_invalid" + } + }, + { + "name": "trailing-slash-is-dropped", + "base_url": "https://developmentfinance.org/api/v1/", + "env": {}, + "source": "argument", + "url": "https://developmentfinance.org/api/v1" } ] } diff --git a/python/client-contract/src/dfo_client_contract/rules/client-identity.json b/python/client-contract/src/dfo_client_contract/rules/client-identity.json new file mode 100644 index 0000000..1d7756c --- /dev/null +++ b/python/client-contract/src/dfo_client_contract/rules/client-identity.json @@ -0,0 +1,174 @@ +{ + "format_version": 1, + "rule": "client-identity", + "header": "X-DFO-Client", + "pattern": "^(dfo-python|dfo-ts)/[0-9A-Za-z.+-]+ \\(([A-Za-z]+ [0-9]+\\.[0-9]+|browser)\\)$", + "vectors": [ + { + "name": "python-cpython", + "client": "dfo-python", + "version": "0.1.0", + "runtime": { + "name": "CPython", + "version": "3.14.0" + }, + "value": "dfo-python/0.1.0 (CPython 3.14)" + }, + { + "name": "python-pre-release-interpreter", + "client": "dfo-python", + "version": "0.1.0", + "runtime": { + "name": "CPython", + "version": "3.15.0a1" + }, + "value": "dfo-python/0.1.0 (CPython 3.15)" + }, + { + "name": "python-pypy", + "client": "dfo-python", + "version": "0.1.0", + "runtime": { + "name": "PyPy", + "version": "3.11.13" + }, + "value": "dfo-python/0.1.0 (PyPy 3.11)" + }, + { + "name": "python-pre-release-package", + "client": "dfo-python", + "version": "0.2.0rc1", + "runtime": { + "name": "CPython", + "version": "3.12.11" + }, + "value": "dfo-python/0.2.0rc1 (CPython 3.12)" + }, + { + "name": "python-local-version", + "client": "dfo-python", + "version": "0.2.0.dev3+g41c47f8", + "runtime": { + "name": "CPython", + "version": "3.13.5" + }, + "value": "dfo-python/0.2.0.dev3+g41c47f8 (CPython 3.13)" + }, + { + "name": "ts-node", + "client": "dfo-ts", + "version": "0.1.0", + "runtime": { + "name": "Node", + "version": "22.18.0" + }, + "value": "dfo-ts/0.1.0 (Node 22.18)" + }, + { + "name": "ts-deno", + "client": "dfo-ts", + "version": "0.1.0", + "runtime": { + "name": "Deno", + "version": "2.1.4" + }, + "value": "dfo-ts/0.1.0 (Deno 2.1)" + }, + { + "name": "ts-bun", + "client": "dfo-ts", + "version": "0.1.0", + "runtime": { + "name": "Bun", + "version": "1.2.19" + }, + "value": "dfo-ts/0.1.0 (Bun 1.2)" + }, + { + "name": "ts-browser", + "client": "dfo-ts", + "version": "0.1.0", + "runtime": { + "name": "browser" + }, + "value": "dfo-ts/0.1.0 (browser)" + }, + { + "name": "ts-pre-release-package", + "client": "dfo-ts", + "version": "0.2.0-rc.1", + "runtime": { + "name": "Node", + "version": "24.4.1" + }, + "value": "dfo-ts/0.2.0-rc.1 (Node 24.4)" + }, + { + "name": "header-argument-naming-it-refused", + "via": "argument", + "headers": { + "X-DFO-Client": "my-app/1.0" + }, + "verdict": "refuse", + "reason": "header_invalid" + }, + { + "name": "lower-case-name-refused", + "via": "argument", + "headers": { + "x-dfo-client": "my-app/1.0" + }, + "verdict": "refuse", + "reason": "header_invalid" + }, + { + "name": "empty-value-refused", + "via": "argument", + "headers": { + "X-DFO-CLIENT": "" + }, + "verdict": "refuse", + "reason": "header_invalid" + }, + { + "name": "provider-naming-it-refused", + "via": "provider", + "headers": { + "Accept-Language": "en", + "X-Dfo-Client": "dfo-python/0.1.0 (CPython 3.14)" + }, + "verdict": "refuse", + "reason": "header_invalid" + }, + { + "name": "other-headers-accepted", + "via": "argument", + "headers": { + "X-Request-Id": "f3a9" + }, + "verdict": "accept" + }, + { + "name": "user-agent-accepted", + "via": "argument", + "headers": { + "User-Agent": "my-app/2.0" + }, + "verdict": "accept" + }, + { + "name": "longer-name-accepted", + "via": "provider", + "headers": { + "X-DFO-Client-Id": "notebook-7" + }, + "verdict": "accept" + }, + { + "name": "no-headers-accepted", + "via": "argument", + "headers": {}, + "verdict": "accept" + } + ] +} 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 deleted file mode 100644 index 47f3542..0000000 --- a/python/client-contract/src/dfo_client_contract/rules/column-order.json +++ /dev/null @@ -1,529 +0,0 @@ -{ - "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/reading-order.json b/python/client-contract/src/dfo_client_contract/rules/reading-order.json new file mode 100644 index 0000000..d4bb978 --- /dev/null +++ b/python/client-contract/src/dfo_client_contract/rules/reading-order.json @@ -0,0 +1,1399 @@ +{ + "format_version": 1, + "rule": "reading-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": "varying-column-follows-reading-columns", + "members": [ + { + "columns": [ + "stat_var", + "financingProvider", + "financingProvider_label", + "financingRecipient", + "financingRecipient_label", + "crsCooperationModality", + "crsCooperationModality_label", + "crsPurpose", + "crsPurpose_label", + "crsTypeOfFlow", + "crsTypeOfFlow_label", + "time_period", + "value", + "unit", + "unit_label", + "currency", + "provenance", + "provenance_label" + ], + "rows": [ + [ + "dc/sv/oda_health_grant", + "country/DEU", + "Germany", + "country/NGA", + "Nigeria", + "A02", + "Sector budget support", + "CRSPurposeCode12220", + "Basic health care", + "CRSTypeOfFlow10", + "ODA", + 2021, + 5.0, + "USDollar", + "US dollars", + "USD", + "provenance/CRS", + "OECD CRS" + ], + [ + "dc/sv/oda_health_loan", + "country/DEU", + "Germany", + "country/NGA", + "Nigeria", + "C01", + "Project-type interventions", + "CRSPurposeCode12220", + "Basic health care", + "CRSTypeOfFlow10", + "ODA", + 2020, + 7.0, + "USDollar", + "US dollars", + "USD", + "provenance/CRS", + "OECD CRS" + ], + [ + "dc/sv/oda_health_grant", + "country/DEU", + "Germany", + "country/NGA", + "Nigeria", + "A02", + "Sector budget support", + "CRSPurposeCode12220", + "Basic health care", + "CRSTypeOfFlow10", + "ODA", + 2020, + 4.0, + "USDollar", + "US dollars", + "USD", + "provenance/CRS", + "OECD CRS" + ], + [ + "dc/sv/oda_health_loan", + "country/DEU", + "Germany", + "country/NGA", + "Nigeria", + "C01", + "Project-type interventions", + "CRSPurposeCode12220", + "Basic health care", + "CRSTypeOfFlow10", + "ODA", + 2021, + 8.0, + "USDollar", + "US dollars", + "USD", + "provenance/CRS", + "OECD CRS" + ] + ] + } + ], + "columns": [ + "time_period", + "financingProvider_label", + "financingRecipient_label", + "crsPurpose_label", + "value", + "unit_label", + "crsTypeOfFlow_label", + "provenance_label", + "crsCooperationModality", + "crsCooperationModality_label", + "financingProvider", + "financingRecipient", + "crsPurpose", + "crsTypeOfFlow", + "unit", + "currency", + "provenance", + "stat_var" + ], + "rows": [ + [ + 2020, + "Germany", + "Nigeria", + "Basic health care", + 4.0, + "US dollars", + "ODA", + "OECD CRS", + "A02", + "Sector budget support", + "country/DEU", + "country/NGA", + "CRSPurposeCode12220", + "CRSTypeOfFlow10", + "USDollar", + "USD", + "provenance/CRS", + "dc/sv/oda_health_grant" + ], + [ + 2021, + "Germany", + "Nigeria", + "Basic health care", + 5.0, + "US dollars", + "ODA", + "OECD CRS", + "A02", + "Sector budget support", + "country/DEU", + "country/NGA", + "CRSPurposeCode12220", + "CRSTypeOfFlow10", + "USDollar", + "USD", + "provenance/CRS", + "dc/sv/oda_health_grant" + ], + [ + 2020, + "Germany", + "Nigeria", + "Basic health care", + 7.0, + "US dollars", + "ODA", + "OECD CRS", + "C01", + "Project-type interventions", + "country/DEU", + "country/NGA", + "CRSPurposeCode12220", + "CRSTypeOfFlow10", + "USDollar", + "USD", + "provenance/CRS", + "dc/sv/oda_health_loan" + ], + [ + 2021, + "Germany", + "Nigeria", + "Basic health care", + 8.0, + "US dollars", + "ODA", + "OECD CRS", + "C01", + "Project-type interventions", + "country/DEU", + "country/NGA", + "CRSPurposeCode12220", + "CRSTypeOfFlow10", + "USDollar", + "USD", + "provenance/CRS", + "dc/sv/oda_health_loan" + ] + ] + }, + { + "name": "all-constant-table", + "members": [ + { + "columns": [ + "stat_var", + "stat_var_label", + "observationAbout", + "observationAbout_label", + "time_period", + "value", + "unit", + "unit_label", + "currency", + "base_year", + "provenance", + "provenance_label" + ], + "rows": [ + [ + "dc/sv/gdp", + "GDP", + "country/KEN", + "Kenya", + 2023, + 108.0, + "USDollar", + "US dollars", + "USD", + null, + "provenance/WDI", + "World Bank WDI" + ], + [ + "dc/sv/gdp", + "GDP", + "country/KEN", + "Kenya", + 2022, + 113.4, + "USDollar", + "US dollars", + "USD", + null, + "provenance/WDI", + "World Bank WDI" + ] + ] + } + ], + "columns": [ + "time_period", + "observationAbout_label", + "value", + "unit_label", + "provenance_label", + "stat_var_label", + "observationAbout", + "unit", + "currency", + "base_year", + "provenance", + "stat_var" + ], + "rows": [ + [ + 2022, + "Kenya", + 113.4, + "US dollars", + "World Bank WDI", + "GDP", + "country/KEN", + "USDollar", + "USD", + null, + "provenance/WDI", + "dc/sv/gdp" + ], + [ + 2023, + "Kenya", + 108.0, + "US dollars", + "World Bank WDI", + "GDP", + "country/KEN", + "USDollar", + "USD", + null, + "provenance/WDI", + "dc/sv/gdp" + ] + ] + }, + { + "name": "one-row-table-is-constant", + "members": [ + { + "columns": [ + "stat_var", + "financingProvider", + "financingProvider_label", + "financingRecipient", + "financingRecipient_label", + "crsCooperationModality", + "crsCooperationModality_label", + "crsPurpose", + "crsPurpose_label", + "crsTypeOfFlow", + "crsTypeOfFlow_label", + "time_period", + "value", + "unit", + "unit_label", + "currency", + "provenance", + "provenance_label" + ], + "rows": [ + [ + "dc/sv/oda_health_grant", + "country/DEU", + "Germany", + "country/NGA", + "Nigeria", + "A02", + "Sector budget support", + "CRSPurposeCode12220", + "Basic health care", + "CRSTypeOfFlow10", + "ODA", + 2021, + 5.0, + "USDollar", + "US dollars", + "USD", + "provenance/CRS", + "OECD CRS" + ] + ] + } + ], + "columns": [ + "time_period", + "financingProvider_label", + "financingRecipient_label", + "crsPurpose_label", + "value", + "unit_label", + "crsTypeOfFlow_label", + "provenance_label", + "financingProvider", + "financingRecipient", + "crsCooperationModality", + "crsCooperationModality_label", + "crsPurpose", + "crsTypeOfFlow", + "unit", + "currency", + "provenance", + "stat_var" + ], + "rows": [ + [ + 2021, + "Germany", + "Nigeria", + "Basic health care", + 5.0, + "US dollars", + "ODA", + "OECD CRS", + "country/DEU", + "country/NGA", + "A02", + "Sector budget support", + "CRSPurposeCode12220", + "CRSTypeOfFlow10", + "USDollar", + "USD", + "provenance/CRS", + "dc/sv/oda_health_grant" + ] + ] + }, + { + "name": "empty-table", + "members": [ + { + "columns": [ + "stat_var", + "financingProvider", + "financingProvider_label", + "financingRecipient", + "financingRecipient_label", + "crsCooperationModality", + "crsCooperationModality_label", + "crsPurpose", + "crsPurpose_label", + "crsTypeOfFlow", + "crsTypeOfFlow_label", + "time_period", + "value", + "unit", + "unit_label", + "currency", + "provenance", + "provenance_label" + ], + "rows": [] + } + ], + "columns": [ + "time_period", + "financingProvider_label", + "financingRecipient_label", + "crsPurpose_label", + "value", + "unit_label", + "crsTypeOfFlow_label", + "provenance_label", + "financingProvider", + "financingRecipient", + "crsCooperationModality", + "crsCooperationModality_label", + "crsPurpose", + "crsTypeOfFlow", + "unit", + "currency", + "provenance", + "stat_var" + ], + "rows": [] + }, + { + "name": "frame-layout-codes", + "members": [ + { + "columns": [ + "stat_var", + "financingProvider", + "financingRecipient", + "time_period", + "value", + "unit", + "measurementMethod", + "provenance", + "status", + "stat_var_crsCooperationModality", + "stat_var_crsPurpose", + "stat_var_crsTypeOfFinance", + "stat_var_crsTypeOfFlow" + ], + "rows": [ + [ + "dc/sv/oda_health_grant", + "country/DEU", + "country/NGA", + 2021, + 5.0, + "USDollar", + "Gross", + "provenance/CRS", + null, + "A02", + "CRSPurposeCode12220", + "CRSTypeOfFinance110", + "CRSTypeOfFlow10" + ], + [ + "dc/sv/oda_health_grant", + "country/DEU", + "country/NGA", + 2020, + 4.0, + "USDollar", + "Gross", + "provenance/CRS", + "provisional", + "A02", + "CRSPurposeCode12220", + "CRSTypeOfFinance110", + "CRSTypeOfFlow10" + ] + ] + } + ], + "columns": [ + "time_period", + "financingProvider", + "financingRecipient", + "stat_var_crsPurpose", + "value", + "unit", + "stat_var_crsTypeOfFlow", + "provenance", + "status", + "measurementMethod", + "stat_var_crsCooperationModality", + "stat_var_crsTypeOfFinance", + "stat_var" + ], + "rows": [ + [ + 2020, + "country/DEU", + "country/NGA", + "CRSPurposeCode12220", + 4.0, + "USDollar", + "CRSTypeOfFlow10", + "provenance/CRS", + "provisional", + "Gross", + "A02", + "CRSTypeOfFinance110", + "dc/sv/oda_health_grant" + ], + [ + 2021, + "country/DEU", + "country/NGA", + "CRSPurposeCode12220", + 5.0, + "USDollar", + "CRSTypeOfFlow10", + "provenance/CRS", + null, + "Gross", + "A02", + "CRSTypeOfFinance110", + "dc/sv/oda_health_grant" + ] + ] + }, + { + "name": "null-sorts-last", + "members": [ + { + "columns": [ + "stat_var", + "financingProvider", + "financingProvider_label", + "financingProvider_kind", + "financingRecipient", + "financingRecipient_label", + "dac2aAidType", + "dac2aAidType_label", + "time_period", + "value", + "unit", + "unit_label", + "provenance", + "provenance_label" + ], + "rows": [ + [ + "dc/sv/oda_dac2a", + null, + null, + "unallocated", + "country/KEN", + "Kenya", + "DAC2aAidType206", + "ODA: Total Net", + 2022, + 1.0, + "USDollar", + "US dollars", + "provenance/DAC2a", + "OECD DAC2a" + ], + [ + "dc/sv/oda_dac2a", + "country/FRA", + "France", + "official", + "country/KEN", + "Kenya", + "DAC2aAidType206", + "ODA: Total Net", + 2022, + 2.0, + "USDollar", + "US dollars", + "provenance/DAC2a", + "OECD DAC2a" + ], + [ + "dc/sv/oda_dac2a", + "country/DEU", + "Germany", + "official", + "country/KEN", + "Kenya", + "DAC2aAidType206", + "ODA: Total Net", + 2022, + 3.0, + "USDollar", + "US dollars", + "provenance/DAC2a", + "OECD DAC2a" + ], + [ + "dc/sv/oda_dac2a", + "country/DEU", + "Germany", + "official", + "country/KEN", + "Kenya", + "DAC2aAidType206", + "ODA: Total Net", + 2021, + 4.0, + "USDollar", + "US dollars", + "provenance/DAC2a", + "OECD DAC2a" + ] + ] + } + ], + "columns": [ + "time_period", + "financingProvider_label", + "financingRecipient_label", + "value", + "unit_label", + "dac2aAidType_label", + "provenance_label", + "financingProvider", + "financingProvider_kind", + "financingRecipient", + "dac2aAidType", + "unit", + "provenance", + "stat_var" + ], + "rows": [ + [ + 2022, + "France", + "Kenya", + 2.0, + "US dollars", + "ODA: Total Net", + "OECD DAC2a", + "country/FRA", + "official", + "country/KEN", + "DAC2aAidType206", + "USDollar", + "provenance/DAC2a", + "dc/sv/oda_dac2a" + ], + [ + 2021, + "Germany", + "Kenya", + 4.0, + "US dollars", + "ODA: Total Net", + "OECD DAC2a", + "country/DEU", + "official", + "country/KEN", + "DAC2aAidType206", + "USDollar", + "provenance/DAC2a", + "dc/sv/oda_dac2a" + ], + [ + 2022, + "Germany", + "Kenya", + 3.0, + "US dollars", + "ODA: Total Net", + "OECD DAC2a", + "country/DEU", + "official", + "country/KEN", + "DAC2aAidType206", + "USDollar", + "provenance/DAC2a", + "dc/sv/oda_dac2a" + ], + [ + 2022, + null, + "Kenya", + 1.0, + "US dollars", + "ODA: Total Net", + "OECD DAC2a", + null, + "unallocated", + "country/KEN", + "DAC2aAidType206", + "USDollar", + "provenance/DAC2a", + "dc/sv/oda_dac2a" + ] + ] + }, + { + "name": "stat-var-varying-keys-series", + "members": [ + { + "columns": [ + "stat_var", + "stat_var_label", + "observationAbout", + "observationAbout_label", + "time_period", + "value", + "unit", + "unit_label", + "currency", + "base_year", + "provenance", + "provenance_label" + ], + "rows": [ + [ + "dc/sv/gdp_ppp", + "GDP", + "country/KEN", + "Kenya", + 2022, + 120.0, + "USDollar", + "US dollars", + "USD", + null, + "provenance/WDI", + "World Bank WDI" + ], + [ + "dc/sv/gdp", + "GDP", + "country/KEN", + "Kenya", + 2021, + 110.0, + "USDollar", + "US dollars", + "USD", + null, + "provenance/WDI", + "World Bank WDI" + ], + [ + "dc/sv/gdp_ppp", + "GDP", + "country/KEN", + "Kenya", + 2021, + 118.0, + "USDollar", + "US dollars", + "USD", + null, + "provenance/WDI", + "World Bank WDI" + ], + [ + "dc/sv/gdp", + "GDP", + "country/KEN", + "Kenya", + 2022, + 113.4, + "USDollar", + "US dollars", + "USD", + null, + "provenance/WDI", + "World Bank WDI" + ] + ] + } + ], + "columns": [ + "time_period", + "observationAbout_label", + "value", + "unit_label", + "provenance_label", + "stat_var_label", + "observationAbout", + "unit", + "currency", + "base_year", + "provenance", + "stat_var" + ], + "rows": [ + [ + 2021, + "Kenya", + 110.0, + "US dollars", + "World Bank WDI", + "GDP", + "country/KEN", + "USDollar", + "USD", + null, + "provenance/WDI", + "dc/sv/gdp" + ], + [ + 2022, + "Kenya", + 113.4, + "US dollars", + "World Bank WDI", + "GDP", + "country/KEN", + "USDollar", + "USD", + null, + "provenance/WDI", + "dc/sv/gdp" + ], + [ + 2021, + "Kenya", + 118.0, + "US dollars", + "World Bank WDI", + "GDP", + "country/KEN", + "USDollar", + "USD", + null, + "provenance/WDI", + "dc/sv/gdp_ppp" + ], + [ + 2022, + "Kenya", + 120.0, + "US dollars", + "World Bank WDI", + "GDP", + "country/KEN", + "USDollar", + "USD", + null, + "provenance/WDI", + "dc/sv/gdp_ppp" + ] + ] + }, + { + "name": "ties-keep-served-order", + "members": [ + { + "columns": [ + "stat_var", + "stat_var_label", + "observationAbout", + "observationAbout_label", + "time_period", + "value", + "unit", + "unit_label", + "currency", + "base_year", + "provenance", + "provenance_label" + ], + "rows": [ + [ + "dc/sv/gdp", + "GDP", + "country/KEN", + "Kenya", + 2022, + 2.0, + "USDollar", + "US dollars", + "USD", + null, + "provenance/WDI", + "World Bank WDI" + ], + [ + "dc/sv/gdp", + "GDP", + "country/KEN", + "Kenya", + 2022, + 1.0, + "USDollar", + "US dollars", + "USD", + null, + "provenance/WDI", + "World Bank WDI" + ], + [ + "dc/sv/gdp", + "GDP", + "country/KEN", + "Kenya", + 2021, + 3.0, + "USDollar", + "US dollars", + "USD", + null, + "provenance/WDI", + "World Bank WDI" + ] + ] + } + ], + "columns": [ + "time_period", + "observationAbout_label", + "value", + "unit_label", + "provenance_label", + "stat_var_label", + "observationAbout", + "unit", + "currency", + "base_year", + "provenance", + "stat_var" + ], + "rows": [ + [ + 2021, + "Kenya", + 3.0, + "US dollars", + "World Bank WDI", + "GDP", + "country/KEN", + "USDollar", + "USD", + null, + "provenance/WDI", + "dc/sv/gdp" + ], + [ + 2022, + "Kenya", + 2.0, + "US dollars", + "World Bank WDI", + "GDP", + "country/KEN", + "USDollar", + "USD", + null, + "provenance/WDI", + "dc/sv/gdp" + ], + [ + 2022, + "Kenya", + 1.0, + "US dollars", + "World Bank WDI", + "GDP", + "country/KEN", + "USDollar", + "USD", + null, + "provenance/WDI", + "dc/sv/gdp" + ] + ] + }, + { + "name": "stack-crs-and-dac2a", + "members": [ + { + "part": "health ODA", + "columns": [ + "stat_var", + "financingProvider", + "financingProvider_label", + "financingRecipient", + "financingRecipient_label", + "crsCooperationModality", + "crsCooperationModality_label", + "crsPurpose", + "crsPurpose_label", + "crsTypeOfFlow", + "crsTypeOfFlow_label", + "time_period", + "value", + "unit", + "unit_label", + "currency", + "provenance", + "provenance_label" + ], + "rows": [ + [ + "dc/sv/oda_health_grant", + "country/DEU", + "Germany", + "country/NGA", + "Nigeria", + "A02", + "Sector budget support", + "CRSPurposeCode12220", + "Basic health care", + "CRSTypeOfFlow10", + "ODA", + 2021, + 5.0, + "USDollar", + "US dollars", + "USD", + "provenance/CRS", + "OECD CRS" + ], + [ + "dc/sv/oda_health_grant", + "country/DEU", + "Germany", + "country/NGA", + "Nigeria", + "A02", + "Sector budget support", + "CRSPurposeCode12220", + "Basic health care", + "CRSTypeOfFlow10", + "ODA", + 2020, + 4.0, + "USDollar", + "US dollars", + "USD", + "provenance/CRS", + "OECD CRS" + ] + ] + }, + { + "part": "total ODA", + "columns": [ + "stat_var", + "financingProvider", + "financingProvider_label", + "financingProvider_kind", + "financingRecipient", + "financingRecipient_label", + "dac2aAidType", + "dac2aAidType_label", + "time_period", + "value", + "unit", + "unit_label", + "provenance", + "provenance_label" + ], + "rows": [ + [ + "dc/sv/oda_dac2a", + "country/DEU", + "Germany", + "official", + "country/KEN", + "Kenya", + "DAC2aAidType206", + "ODA: Total Net", + 2021, + 40.0, + "USDollar", + "US dollars", + "provenance/DAC2a", + "OECD DAC2a" + ], + [ + "dc/sv/oda_dac2a", + "country/DEU", + "Germany", + "official", + "country/KEN", + "Kenya", + "DAC2aAidType206", + "ODA: Total Net", + 2020, + 30.0, + "USDollar", + "US dollars", + "provenance/DAC2a", + "OECD DAC2a" + ] + ] + } + ], + "columns": [ + "part", + "time_period", + "financingProvider_label", + "financingRecipient_label", + "crsPurpose_label", + "value", + "unit_label", + "crsTypeOfFlow_label", + "provenance_label", + "financingRecipient", + "crsCooperationModality", + "crsCooperationModality_label", + "crsPurpose", + "crsTypeOfFlow", + "currency", + "provenance", + "financingProvider_kind", + "dac2aAidType", + "dac2aAidType_label", + "financingProvider", + "unit", + "stat_var" + ], + "rows": [ + [ + "health ODA", + 2020, + "Germany", + "Nigeria", + "Basic health care", + 4.0, + "US dollars", + "ODA", + "OECD CRS", + "country/NGA", + "A02", + "Sector budget support", + "CRSPurposeCode12220", + "CRSTypeOfFlow10", + "USD", + "provenance/CRS", + null, + null, + null, + "country/DEU", + "USDollar", + "dc/sv/oda_health_grant" + ], + [ + "health ODA", + 2021, + "Germany", + "Nigeria", + "Basic health care", + 5.0, + "US dollars", + "ODA", + "OECD CRS", + "country/NGA", + "A02", + "Sector budget support", + "CRSPurposeCode12220", + "CRSTypeOfFlow10", + "USD", + "provenance/CRS", + null, + null, + null, + "country/DEU", + "USDollar", + "dc/sv/oda_health_grant" + ], + [ + "total ODA", + 2020, + "Germany", + "Kenya", + null, + 30.0, + "US dollars", + null, + "OECD DAC2a", + "country/KEN", + null, + null, + null, + null, + null, + "provenance/DAC2a", + "official", + "DAC2aAidType206", + "ODA: Total Net", + "country/DEU", + "USDollar", + "dc/sv/oda_dac2a" + ], + [ + "total ODA", + 2021, + "Germany", + "Kenya", + null, + 40.0, + "US dollars", + null, + "OECD DAC2a", + "country/KEN", + null, + null, + null, + null, + null, + "provenance/DAC2a", + "official", + "DAC2aAidType206", + "ODA: Total Net", + "country/DEU", + "USDollar", + "dc/sv/oda_dac2a" + ] + ] + }, + { + "name": "stack-constant-per-member-varies-in-stack", + "members": [ + { + "part": "GDP in dollars", + "columns": [ + "stat_var", + "stat_var_label", + "observationAbout", + "observationAbout_label", + "time_period", + "value", + "unit", + "unit_label", + "currency", + "base_year", + "provenance", + "provenance_label" + ], + "rows": [ + [ + "dc/sv/gdp", + "GDP", + "country/KEN", + "Kenya", + 2022, + 113.4, + "USDollar", + "US dollars", + "USD", + null, + "provenance/WDI", + "World Bank WDI" + ] + ] + }, + { + "part": "GDP in shillings", + "columns": [ + "stat_var", + "stat_var_label", + "observationAbout", + "observationAbout_label", + "time_period", + "value", + "unit", + "unit_label", + "currency", + "base_year", + "provenance", + "provenance_label" + ], + "rows": [ + [ + "dc/sv/gdp", + "GDP", + "country/KEN", + "Kenya", + 2022, + 15.1, + "USDollar", + "US dollars", + "KES", + null, + "provenance/WDI", + "World Bank WDI" + ] + ] + } + ], + "columns": [ + "part", + "time_period", + "observationAbout_label", + "value", + "unit_label", + "provenance_label", + "currency", + "stat_var_label", + "observationAbout", + "unit", + "base_year", + "provenance", + "stat_var" + ], + "rows": [ + [ + "GDP in dollars", + 2022, + "Kenya", + 113.4, + "US dollars", + "World Bank WDI", + "USD", + "GDP", + "country/KEN", + "USDollar", + null, + "provenance/WDI", + "dc/sv/gdp" + ], + [ + "GDP in shillings", + 2022, + "Kenya", + 15.1, + "US dollars", + "World Bank WDI", + "KES", + "GDP", + "country/KEN", + "USDollar", + null, + "provenance/WDI", + "dc/sv/gdp" + ] + ] + } + ] +} diff --git a/python/client-contract/src/dfo_client_contract/rules/role-keys.json b/python/client-contract/src/dfo_client_contract/rules/role-keys.json new file mode 100644 index 0000000..1ac9f25 --- /dev/null +++ b/python/client-contract/src/dfo_client_contract/rules/role-keys.json @@ -0,0 +1,355 @@ +{ + "format_version": 1, + "rule": "role-keys", + "keys": { + "place": "observationAbout", + "origin": "origin", + "destination": "destination" + }, + "flow_keys": [ + "origin", + "destination" + ], + "vectors": [ + { + "name": "subject-place", + "identity": { + "entities": { + "observationAbout": [ + "country/KEN" + ] + } + }, + "roles": { + "place": [ + "country/KEN" + ] + }, + "entities": { + "place": [ + "country/NGA", + "country/GHA" + ] + }, + "posted": { + "observationAbout": [ + "country/NGA", + "country/GHA" + ] + } + }, + { + "name": "subject-wire-role-refused", + "identity": { + "entities": { + "observationAbout": [ + "country/KEN" + ] + } + }, + "roles": { + "place": [ + "country/KEN" + ] + }, + "entities": { + "observationAbout": [ + "country/NGA" + ] + }, + "error": { + "reason": "invalid_argument", + "names": [ + "observationAbout", + "place" + ] + } + }, + { + "name": "subject-flow-key-refused", + "identity": { + "entities": { + "observationAbout": [ + "country/KEN" + ] + } + }, + "roles": { + "place": [ + "country/KEN" + ] + }, + "entities": { + "origin": [ + "country/DEU" + ] + }, + "error": { + "reason": "invalid_argument", + "names": [ + "origin", + "place" + ] + } + }, + { + "name": "flow-origin-rebound", + "identity": { + "entities": { + "origin": [ + "country/DEU" + ], + "destination": [ + "country/NGA" + ] + } + }, + "roles": { + "origin": [ + "country/DEU" + ], + "destination": [ + "country/NGA" + ] + }, + "entities": { + "origin": [ + "country/FRA" + ] + }, + "posted": { + "origin": [ + "country/FRA" + ], + "destination": [ + "country/NGA" + ] + } + }, + { + "name": "flow-open-origin-bound", + "identity": { + "entities": { + "destination": [ + "country/KEN" + ] + }, + "open_roles": [ + "origin" + ] + }, + "roles": { + "destination": [ + "country/KEN" + ], + "origin": null + }, + "entities": { + "origin": [ + "country/GBR" + ], + "destination": [ + "country/ETH" + ] + }, + "posted": { + "destination": [ + "country/ETH" + ], + "origin": [ + "country/GBR" + ] + } + }, + { + "name": "flow-total-direction-bound", + "identity": { + "entities": { + "destination": [ + "country/ETH" + ] + } + }, + "roles": { + "destination": [ + "country/ETH" + ], + "origin": null + }, + "entities": { + "origin": [ + "country/USA" + ] + }, + "posted": { + "destination": [ + "country/ETH" + ], + "origin": [ + "country/USA" + ] + } + }, + { + "name": "flow-direction-dropped", + "identity": { + "entities": { + "origin": [ + "country/DEU" + ], + "destination": [ + "country/NGA" + ] + } + }, + "roles": { + "origin": [ + "country/DEU" + ], + "destination": [ + "country/NGA" + ] + }, + "entities": { + "destination": null + }, + "posted": { + "origin": [ + "country/DEU" + ] + } + }, + { + "name": "flow-column-name-refused", + "identity": { + "entities": { + "origin": [ + "country/DEU" + ], + "destination": [ + "country/NGA" + ] + } + }, + "roles": { + "origin": [ + "country/DEU" + ], + "destination": [ + "country/NGA" + ] + }, + "entities": { + "financingRecipient": [ + "country/GHA" + ] + }, + "error": { + "reason": "invalid_argument", + "names": [ + "financingRecipient", + "origin", + "destination" + ] + } + }, + { + "name": "flow-place-refused", + "identity": { + "entities": { + "origin": [ + "country/DEU" + ], + "destination": [ + "country/NGA" + ] + } + }, + "roles": { + "origin": [ + "country/DEU" + ], + "destination": [ + "country/NGA" + ] + }, + "entities": { + "place": [ + "country/GHA" + ] + }, + "error": { + "reason": "invalid_argument", + "names": [ + "place", + "origin", + "destination" + ] + } + }, + { + "name": "flow-open-destination-roles", + "identity": { + "entities": {}, + "open_roles": [ + "destination" + ] + }, + "roles": { + "destination": null, + "origin": null + } + }, + { + "name": "no-roles-place", + "identity": { + "entities": {} + }, + "roles": {}, + "entities": { + "place": [ + "country/KEN" + ] + }, + "posted": { + "observationAbout": [ + "country/KEN" + ] + } + }, + { + "name": "no-roles-other-key-posted", + "identity": { + "entities": {} + }, + "roles": {}, + "entities": { + "financingRecipient": [ + "country/KEN" + ] + }, + "posted": { + "financingRecipient": [ + "country/KEN" + ] + } + }, + { + "name": "no-roles-wire-role-refused", + "identity": {}, + "roles": {}, + "entities": { + "observationAbout": [ + "country/KEN" + ] + }, + "error": { + "reason": "invalid_argument", + "names": [ + "observationAbout", + "place" + ] + } + } + ] +} 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 78eb56e..978a167 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 @@ -27,7 +27,13 @@ "$ref": "#/$defs/cache_layout" }, { - "$ref": "#/$defs/column_order" + "$ref": "#/$defs/reading_order" + }, + { + "$ref": "#/$defs/client_identity" + }, + { + "$ref": "#/$defs/role_keys" } ], "$defs": { @@ -589,7 +595,203 @@ } } }, - "column_order": { + "client_identity": { + "$ref": "#/$defs/suite", + "additionalProperties": false, + "required": [ + "header", + "pattern" + ], + "properties": { + "format_version": true, + "rule": { + "const": "client-identity" + }, + "header": { + "const": "X-DFO-Client" + }, + "pattern": { + "description": "A regular expression every well-formed header value matches in full.", + "type": "string", + "minLength": 1 + }, + "vectors": { + "items": { + "type": "object", + "additionalProperties": false, + "required": [ + "name" + ], + "oneOf": [ + { + "required": [ + "client", + "version", + "runtime", + "value" + ], + "not": { + "anyOf": [ + { + "required": [ + "via" + ] + }, + { + "required": [ + "headers" + ] + }, + { + "required": [ + "verdict" + ] + } + ] + } + }, + { + "required": [ + "via", + "headers", + "verdict" + ], + "not": { + "anyOf": [ + { + "required": [ + "client" + ] + }, + { + "required": [ + "version" + ] + }, + { + "required": [ + "runtime" + ] + }, + { + "required": [ + "value" + ] + } + ] + } + } + ], + "if": { + "properties": { + "verdict": { + "const": "refuse" + } + }, + "required": [ + "verdict" + ] + }, + "then": { + "required": [ + "reason" + ] + }, + "else": { + "not": { + "required": [ + "reason" + ] + } + }, + "properties": { + "name": { + "$ref": "#/$defs/name" + }, + "client": { + "enum": [ + "dfo-python", + "dfo-ts" + ] + }, + "version": { + "description": "The package version as the package states it.", + "type": "string", + "pattern": "^[0-9A-Za-z.+-]+$", + "$ref": "#/$defs/one_line" + }, + "runtime": { + "description": "The runtime's name and its full version, or `browser` with no version.", + "type": "object", + "additionalProperties": false, + "required": [ + "name" + ], + "properties": { + "name": { + "type": "string", + "pattern": "^[A-Za-z]+$", + "$ref": "#/$defs/one_line" + }, + "version": { + "type": "string", + "pattern": "^[0-9]+\\.[0-9]+" + } + }, + "if": { + "properties": { + "name": { + "const": "browser" + } + } + }, + "then": { + "not": { + "required": [ + "version" + ] + } + }, + "else": { + "required": [ + "version" + ] + } + }, + "value": { + "description": "The X-DFO-Client value the client sends.", + "type": "string", + "minLength": 1 + }, + "via": { + "description": "Where the caller's headers come from: the client's headers argument, or the header provider it calls before each request.", + "enum": [ + "argument", + "provider" + ] + }, + "headers": { + "description": "The caller's headers, by name as the caller writes it.", + "type": "object", + "additionalProperties": { + "type": "string" + } + }, + "verdict": { + "enum": [ + "accept", + "refuse" + ] + }, + "reason": { + "const": "header_invalid" + } + } + } + } + } + }, + "reading_order": { "$ref": "#/$defs/suite", "additionalProperties": false, "required": [ @@ -598,7 +800,7 @@ "properties": { "format_version": true, "rule": { - "const": "column-order" + "const": "reading-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.", @@ -621,12 +823,56 @@ "additionalProperties": false, "required": [ "name", - "ordered" + "members", + "columns", + "rows" ], "properties": { "name": { "$ref": "#/$defs/name" }, + "members": { + "description": "The members a dataset stacks, in member order, each its served table: its `part` value when the dataset has several members, its columns and its rows in the order the server wrote them.", + "type": "array", + "minItems": 1, + "items": { + "type": "object", + "additionalProperties": false, + "required": [ + "columns", + "rows" + ], + "properties": { + "part": { + "type": "string", + "minLength": 1 + }, + "columns": { + "type": "array", + "items": { + "type": "string", + "minLength": 1, + "$ref": "#/$defs/one_line" + }, + "uniqueItems": true + }, + "rows": { + "type": "array", + "items": { + "type": "array", + "items": { + "type": [ + "string", + "number", + "boolean", + "null" + ] + } + } + } + } + } + }, "columns": { "type": "array", "items": { @@ -635,45 +881,243 @@ "$ref": "#/$defs/one_line" }, "uniqueItems": true, - "description": "One dataset's columns in the order the server wrote them." + "description": "The columns a client presents, in its order." }, - "members": { - "description": "The columns of each member of a stacked dataset, in member order, each in the order the server wrote them.", + "rows": { "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" + "type": [ + "string", + "number", + "boolean", + "null" + ] + } }, - "uniqueItems": true, - "description": "The same columns in the order a client presents them, after `part` for a stacked dataset." + "description": "The rows a client presents, in its order, each in the presented column order." } + } + } + } + } + }, + "role_keys": { + "$ref": "#/$defs/suite", + "additionalProperties": false, + "required": [ + "keys", + "flow_keys" + ], + "properties": { + "format_version": true, + "rule": { + "const": "role-keys" + }, + "keys": { + "description": "Each key a caller types in entities=, to the wire role it posts as.", + "type": "object", + "additionalProperties": false, + "required": [ + "place", + "origin", + "destination" + ], + "properties": { + "place": { + "const": "observationAbout" + }, + "origin": { + "const": "origin" }, + "destination": { + "const": "destination" + } + } + }, + "flow_keys": { + "description": "The flow directions. A spec that names one takes both.", + "const": [ + "origin", + "destination" + ] + }, + "vectors": { + "items": { + "type": "object", + "additionalProperties": false, + "required": [ + "name", + "identity", + "roles" + ], "oneOf": [ + { + "not": { + "anyOf": [ + { + "required": [ + "entities" + ] + }, + { + "required": [ + "posted" + ] + }, + { + "required": [ + "error" + ] + } + ] + } + }, { "required": [ - "columns" - ] + "entities", + "posted" + ], + "not": { + "required": [ + "error" + ] + } }, { "required": [ - "members" - ] + "entities", + "error" + ], + "not": { + "required": [ + "posted" + ] + } + } + ], + "properties": { + "name": { + "$ref": "#/$defs/name" + }, + "identity": { + "description": "The spec's definition.identity members that name roles, by wire role.", + "type": "object", + "additionalProperties": false, + "properties": { + "entities": { + "type": "object", + "propertyNames": { + "enum": [ + "observationAbout", + "origin", + "destination" + ] + }, + "additionalProperties": { + "type": "array", + "minItems": 1, + "items": { + "type": "string", + "minLength": 1 + } + } + }, + "open_roles": { + "type": "array", + "items": { + "enum": [ + "observationAbout", + "origin", + "destination" + ] + }, + "uniqueItems": true + } + } + }, + "roles": { + "description": "The caller keys the spec takes, in order, each to the dcids it binds or null: Spec.roles in Python, specRoles(spec) in TypeScript.", + "type": "object", + "propertyNames": { + "enum": [ + "place", + "origin", + "destination" + ] + }, + "additionalProperties": { + "oneOf": [ + { + "type": "array", + "minItems": 1, + "items": { + "type": "string", + "minLength": 1 + } + }, + { + "type": "null" + } + ] + } + }, + "entities": { + "description": "The caller's entities=, each key to dcids or to null, which drops the role.", + "type": "object", + "minProperties": 1, + "additionalProperties": { + "oneOf": [ + { + "type": "array", + "minItems": 1, + "items": { + "type": "string", + "minLength": 1 + } + }, + { + "type": "null" + } + ] + } + }, + "posted": { + "description": "The build's scope.entities, by wire role.", + "type": "object", + "additionalProperties": { + "type": "array", + "minItems": 1, + "items": { + "type": "string", + "minLength": 1 + } + } + }, + "error": { + "type": "object", + "additionalProperties": false, + "required": [ + "reason", + "names" + ], + "properties": { + "reason": { + "const": "invalid_argument" + }, + "names": { + "description": "The keys the message names: the key typed, then the spec's caller keys, or place for observationAbout on a spec that names no role.", + "type": "array", + "minItems": 2, + "items": { + "type": "string", + "minLength": 1 + } + } + } } - ] + } } } } 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 e471bed..7d66613 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 @@ -4580,12 +4580,12 @@ "unit_label", "crsTypeOfFlow_label", "provenance_label", + "crsCooperationModality", + "crsCooperationModality_label", "financingProvider", "financingProvider_kind", "financingRecipient", "financingRecipient_kind", - "crsCooperationModality", - "crsCooperationModality_label", "crsPurpose", "crsTypeOfFinance", "crsTypeOfFinance_label", 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 371544b..9a7302c 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 @@ -15516,14 +15516,14 @@ "crsTypeOfFinance_label", "crsTypeOfFlow", "unit", + "provenance", + "stat_var_label", + "observationAbout", "currency", "price_basis", "base_year", "measurementMethod", "measurementMethod_label", - "provenance", - "stat_var_label", - "observationAbout", "stat_var" ], "part_rows": [ 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 788a784..8ca97a3 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 @@ -4583,12 +4583,12 @@ "unit_label", "crsTypeOfFlow_label", "provenance_label", + "crsCooperationModality", + "crsCooperationModality_label", "financingProvider", "financingProvider_kind", "financingRecipient", "financingRecipient_kind", - "crsCooperationModality", - "crsCooperationModality_label", "crsPurpose", "crsTypeOfFinance", "crsTypeOfFinance_label", 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 e2c9390..66e1e7f 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 @@ -15518,14 +15518,14 @@ "crsTypeOfFinance_label", "crsTypeOfFlow", "unit", + "provenance", + "stat_var_label", + "observationAbout", "currency", "price_basis", "base_year", "measurementMethod", "measurementMethod_label", - "provenance", - "stat_var_label", - "observationAbout", "stat_var" ], "part_rows": [ 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 4f9ca97..2b3c0e5 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 @@ -16378,9 +16378,9 @@ "unit", "currency", "price_basis", - "base_year", "measurementMethod", "measurementMethod_label", + "base_year", "provenance", "stat_var" ], 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 ef3ebcf..d8795d5 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 @@ -4580,12 +4580,12 @@ "unit_label", "crsTypeOfFlow_label", "provenance_label", + "crsCooperationModality", + "crsCooperationModality_label", "financingProvider", "financingProvider_kind", "financingRecipient", "financingRecipient_kind", - "crsCooperationModality", - "crsCooperationModality_label", "crsPurpose", "crsTypeOfFinance", "crsTypeOfFinance_label", 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 8b08a06..2906e4f 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 @@ -989,12 +989,12 @@ "unit_label", "crsTypeOfFlow_label", "provenance_label", + "crsCooperationModality", + "crsCooperationModality_label", "financingProvider", "financingProvider_kind", "financingRecipient", "financingRecipient_kind", - "crsCooperationModality", - "crsCooperationModality_label", "crsPurpose", "crsTypeOfFinance", "crsTypeOfFinance_label", 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 27976b3..85ed981 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 @@ -1040,12 +1040,12 @@ "unit_label", "crsTypeOfFlow_label", "provenance_label", + "crsCooperationModality", + "crsCooperationModality_label", "financingProvider", "financingProvider_kind", "financingRecipient", "financingRecipient_kind", - "crsCooperationModality", - "crsCooperationModality_label", "crsPurpose", "crsTypeOfFinance", "crsTypeOfFinance_label", 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 40f7b18..680ad6d 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 @@ -991,12 +991,12 @@ "unit_label", "crsTypeOfFlow_label", "provenance_label", + "crsCooperationModality", + "crsCooperationModality_label", "financingProvider", "financingProvider_kind", "financingRecipient", "financingRecipient_kind", - "crsCooperationModality", - "crsCooperationModality_label", "crsPurpose", "crsTypeOfFinance", "crsTypeOfFinance_label", 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 e0de697..a379515 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 @@ -1044,12 +1044,12 @@ "unit_label", "crsTypeOfFlow_label", "provenance_label", + "crsCooperationModality", + "crsCooperationModality_label", "financingProvider", "financingProvider_kind", "financingRecipient", "financingRecipient_kind", - "crsCooperationModality", - "crsCooperationModality_label", "crsPurpose", "crsTypeOfFinance", "crsTypeOfFinance_label", 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 e716ee8..5c43080 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 @@ -1019,12 +1019,12 @@ "unit_label", "crsTypeOfFlow_label", "provenance_label", + "crsCooperationModality", + "crsCooperationModality_label", "financingProvider", "financingProvider_kind", "financingRecipient", "financingRecipient_kind", - "crsCooperationModality", - "crsCooperationModality_label", "crsPurpose", "crsTypeOfFinance", "crsTypeOfFinance_label", 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 bfe6e68..cd3d71e 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 @@ -4680,12 +4680,12 @@ "unit_label", "crsTypeOfFlow_label", "provenance_label", + "crsCooperationModality", + "crsCooperationModality_label", "financingProvider", "financingProvider_kind", "financingRecipient", "financingRecipient_kind", - "crsCooperationModality", - "crsCooperationModality_label", "crsPurpose", "crsTypeOfFinance", "crsTypeOfFinance_label", 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 3956bb1..ab81f2c 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 @@ -1512,8 +1512,8 @@ "dac2aAidType_label", "provenance_label", "financingProvider", - "financingProvider_kind", "financingRecipient", + "financingProvider_kind", "financingRecipient_kind", "dac2aAidType", "unit", 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 e8a44cc..bcc6706 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 @@ -1512,8 +1512,8 @@ "dac2aAidType_label", "provenance_label", "financingProvider", - "financingProvider_kind", "financingRecipient", + "financingProvider_kind", "financingRecipient_kind", "dac2aAidType", "unit", 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 b247574..166b104 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 @@ -4894,14 +4894,14 @@ "crsTypeOfFlow_label", "provenance_label", "financingProvider", - "financingProvider_kind", - "financingRecipient", - "financingRecipient_kind", "crsCooperationModality", "crsCooperationModality_label", - "crsPurpose", "crsTypeOfFinance", "crsTypeOfFinance_label", + "financingProvider_kind", + "financingRecipient", + "financingRecipient_kind", + "crsPurpose", "crsTypeOfFlow", "unit", "currency", 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 d1761e5..d246838 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 @@ -4581,12 +4581,12 @@ "unit_label", "crsTypeOfFlow_label", "provenance_label", + "crsCooperationModality", + "crsCooperationModality_label", "financingProvider", "financingProvider_kind", "financingRecipient", "financingRecipient_kind", - "crsCooperationModality", - "crsCooperationModality_label", "crsPurpose", "crsTypeOfFinance", "crsTypeOfFinance_label", 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 4ca9780..bd68531 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 @@ -952,9 +952,9 @@ "unit", "stat_var_crsTypeOfFlow", "provenance", + "stat_var_crsCooperationModality", "measurementMethod", "status", - "stat_var_crsCooperationModality", "stat_var_crsTypeOfFinance", "stat_var" ], 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 79b670b..136dde5 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 @@ -5334,9 +5334,9 @@ "unit_label", "dac2aAidType_label", "provenance_label", + "financingRecipient", "financingProvider", "financingProvider_kind", - "financingRecipient", "financingRecipient_kind", "dac2aAidType", "unit", 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 603a911..f5318d4 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 @@ -5333,9 +5333,9 @@ "unit_label", "dac2aAidType_label", "provenance_label", + "financingRecipient", "financingProvider", "financingProvider_kind", - "financingRecipient", "financingRecipient_kind", "dac2aAidType", "unit", 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 7468358..919f817 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 @@ -1797,8 +1797,8 @@ "dac2aAidType_label", "provenance_label", "financingProvider", - "financingProvider_kind", "financingRecipient", + "financingProvider_kind", "financingRecipient_kind", "dac2aAidType", "unit", 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 c3f0abc..636e329 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 @@ -1434,8 +1434,8 @@ "dac2aAidType_label", "provenance_label", "financingProvider", - "financingProvider_kind", "financingRecipient", + "financingProvider_kind", "financingRecipient_kind", "dac2aAidType", "unit", 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 2bf0145..ea02336 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 @@ -1524,8 +1524,8 @@ "dac2aAidType_label", "provenance_label", "financingProvider", - "financingProvider_kind", "financingRecipient", + "financingProvider_kind", "financingRecipient_kind", "dac2aAidType", "unit", 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 2535033..a6ede46 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 @@ -1520,8 +1520,8 @@ "dac2aAidType_label", "provenance_label", "financingProvider", - "financingProvider_kind", "financingRecipient", + "financingProvider_kind", "financingRecipient_kind", "dac2aAidType", "unit", 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 42b9254..322e6f8 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 @@ -1535,8 +1535,8 @@ "dac2aAidType_label", "provenance_label", "financingProvider", - "financingProvider_kind", "financingRecipient", + "financingProvider_kind", "financingRecipient_kind", "dac2aAidType", "unit", 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 5222a2e..a629db0 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 @@ -1578,8 +1578,8 @@ "dac2aAidType_label", "provenance_label", "financingProvider", - "financingProvider_kind", "financingRecipient", + "financingProvider_kind", "financingRecipient_kind", "dac2aAidType", "unit", 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 fee7446..5652a17 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 @@ -4586,12 +4586,12 @@ "unit_label", "crsTypeOfFlow_label", "provenance_label", + "crsCooperationModality", + "crsCooperationModality_label", "financingProvider", "financingProvider_kind", "financingRecipient", "financingRecipient_kind", - "crsCooperationModality", - "crsCooperationModality_label", "crsPurpose", "crsTypeOfFinance", "crsTypeOfFinance_label", 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 a65adda..9c27c02 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 @@ -1521,8 +1521,8 @@ "dac2aAidType_label", "provenance_label", "financingProvider", - "financingProvider_kind", "financingRecipient", + "financingProvider_kind", "financingRecipient_kind", "dac2aAidType", "unit", 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 6141b6f..3c31a70 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 @@ -8307,8 +8307,8 @@ "dac2aAidType_label", "provenance_label", "financingProvider", - "financingProvider_kind", "financingRecipient", + "financingProvider_kind", "financingRecipient_kind", "dac2aAidType", "unit", diff --git a/python/client-contract/tests/test_rules.py b/python/client-contract/tests/test_rules.py index d51cbf0..fe7224f 100644 --- a/python/client-contract/tests/test_rules.py +++ b/python/client-contract/tests/test_rules.py @@ -7,6 +7,7 @@ from __future__ import annotations +import ipaddress import ntpath import posixpath import re @@ -24,13 +25,17 @@ _DEFAULT_BASE_URL = "https://developmentfinance.org/api/v1" _TABLE = re.compile(r"\[([A-Za-z0-9_-]+)\]") _ENTRY = re.compile(r'([A-Za-z0-9_-]+)[ \t]*=[ \t]*"([^"\\\x00-\x1f\x7f]*)"') +_MAJOR_MINOR = re.compile(r"([0-9]+)\.([0-9]+)") class RuleError(Exception): - def __init__(self, reason: str, line: int | None = None) -> None: + def __init__( + self, reason: str, line: int | None = None, names: tuple[str, ...] = () + ) -> None: super().__init__(reason) self.reason = reason self.line = line + self.names = names def _vectors(name: str) -> list[dict[str, Any]]: @@ -125,13 +130,24 @@ def look_up_key(vector: dict[str, Any]) -> tuple[str, str | None]: return "credentials_file", profile["key"] +_NON_DECIMAL_IPV4 = re.compile(r"(?:[^:]*\.)?(?:0x[0-9a-f]*|[0-9]+)") + + def is_valid_base_url(url: str) -> bool: + if re.search(r"[^\x21-\x7e]", url) or "?" in url or "#" in url: + return False parts = urlsplit(url) - return ( - parts.scheme in ("http", "https") - and bool(parts.hostname) - and "@" not in parts.netloc - ) + if parts.scheme not in ("http", "https") or "@" in parts.netloc: + return False + if not parts.hostname or {".", ".."} & set(parts.path.split("/")): + return False + host = parts.hostname.removesuffix(".") + if _NON_DECIMAL_IPV4.fullmatch(host): + try: + ipaddress.IPv4Address(host) + except ValueError: + return False + return True def resolve_base_url(vector: dict[str, Any]) -> tuple[str, str]: @@ -143,7 +159,7 @@ def resolve_base_url(vector: dict[str, Any]) -> tuple[str, str]: source, url = "default", _DEFAULT_BASE_URL if not is_valid_base_url(url): raise RuleError("base_url_invalid") - return source, url + return source, url.rstrip("/") def cache_root(vector: dict[str, Any]) -> str: @@ -179,14 +195,89 @@ 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]: +def reading_order( + members: list[dict[str, Any]], reading: list[list[str]] +) -> tuple[list[str], list[list[Any]]]: + """Stacks the members, a row holding null in a column its member lacks, + then orders the columns and each member's rows.""" + stacked = [ + {**dict(zip(member["columns"], row, strict=True)), "part": member.get("part")} + for member in members + for row in member["rows"] + ] + served = list(dict.fromkeys(c for member in members for c in member["columns"])) first = [ name for names in reading - if (name := next((n for n in names if n in columns), None)) is not None + if (name := next((n for n in names if n in served), None)) is not None + ] + rest = [c for c in served if c not in first and c != "stat_var"] + varies = {c for c in rest if len({repr(row.get(c)) for row in stacked}) > 1} + columns = [ + *(["part"] if len(members) > 1 else []), + *first, + *[c for c in rest if c in varies], + *[c for c in rest if c not in varies], + *(["stat_var"] if "stat_var" in served else []), ] - rest = [c for c in columns if c not in first and c != "stat_var"] - return first + rest + ["stat_var"] * ("stat_var" in columns) + keys = [c for c in first if c not in ("value", "time_period")] + keys += [c for c in columns if c in varies] + if "stat_var" in served and len({repr(row.get("stat_var")) for row in stacked}) > 1: + keys.append("stat_var") + keys += ["time_period"] if "time_period" in first else [] + rows: list[list[Any]] = [] + for part in dict.fromkeys(row["part"] for row in stacked): + block = [row for row in stacked if row["part"] == part] + block.sort(key=lambda row: [(row.get(k) is None, row.get(k)) for k in keys]) + rows.extend([row.get(c) for c in columns] for row in block) + return columns, rows + + +def client_identity(client: str, version: str, runtime: dict[str, str]) -> str: + label = runtime["name"] + if label != "browser": + match = _MAJOR_MINOR.match(runtime["version"]) + assert match, runtime + label += f" {match[1]}.{match[2]}" + return f"{client}/{version} ({label})" + + +def check_caller_headers(headers: dict[str, str]) -> str | None: + if any(name.lower() == "x-dfo-client" for name in headers): + return "header_invalid" + return None + + +def spec_roles(identity: dict[str, Any]) -> dict[str, list[str] | None]: + caller = {wire: key for key, wire in rule("role-keys")["keys"].items()} + flow = rule("role-keys")["flow_keys"] + bound = { + caller[role]: dcids for role, dcids in identity.get("entities", {}).items() + } + named = [*bound, *(caller[role] for role in identity.get("open_roles", []))] + if any(key in flow for key in named): + named.extend(flow) + return {key: bound.get(key) for key in dict.fromkeys(named)} + + +def posted_entities( + identity: dict[str, Any], entities: dict[str, list[str] | None] +) -> dict[str, list[str]]: + keys = rule("role-keys")["keys"] + roles = spec_roles(identity) + for key in entities: + if roles and key not in roles: + raise RuleError("invalid_argument", names=(key, *roles)) + if not roles and key in keys.values() and key not in keys: + caller = next(name for name, wire in keys.items() if wire == key) + raise RuleError("invalid_argument", names=(key, caller)) + posted = dict(identity.get("entities", {})) + for key, dcids in entities.items(): + if dcids is None: + posted.pop(keys.get(key, key), None) + else: + posted[keys.get(key, key)] = dcids + return posted @pytest.mark.parametrize("name", RULES) @@ -258,11 +349,37 @@ 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"] +@pytest.mark.parametrize("vector", _vectors("reading-order"), ids=_ids("reading-order")) +def test_reading_order(vector: dict[str, Any]) -> None: + reading = rule("reading-order")["reading_columns"] + columns, rows = reading_order(vector["members"], reading) + assert (columns, rows) == (vector["columns"], vector["rows"]) + + +@pytest.mark.parametrize( + "vector", _vectors("client-identity"), ids=_ids("client-identity") +) +def test_client_identity(vector: dict[str, Any]) -> None: + if "headers" in vector: + assert check_caller_headers(vector["headers"]) == vector.get("reason") return - gathered = list(dict.fromkeys(c for member in vector["members"] for c in member)) - assert ["part", *column_order(gathered, reading)] == vector["ordered"] + value = client_identity(vector["client"], vector["version"], vector["runtime"]) + assert value == vector["value"] + assert re.fullmatch(rule("client-identity")["pattern"], value) + + +@pytest.mark.parametrize("vector", _vectors("role-keys"), ids=_ids("role-keys")) +def test_role_keys(vector: dict[str, Any]) -> None: + roles = spec_roles(vector["identity"]) + assert list(roles.items()) == list(vector["roles"].items()) + if "error" in vector: + with pytest.raises(RuleError) as excinfo: + posted_entities(vector["identity"], vector["entities"]) + error = excinfo.value + assert (error.reason, list(error.names)) == ( + vector["error"]["reason"], + vector["error"]["names"], + ) + elif "entities" in vector: + posted = posted_entities(vector["identity"], vector["entities"]) + assert posted == vector["posted"] diff --git a/tools/README.md b/tools/README.md index dfc1122..d52b523 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, 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: +`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 reading-order rule's order of the downloaded Parquet files' columns, 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 reading-order vector orders its columns and rows 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 e85a3cb..0b7d221 100644 --- a/tools/capture_client_contract.py +++ b/tools/capture_client_contract.py @@ -54,7 +54,6 @@ import argparse import copy -import io import json import os import re @@ -71,7 +70,6 @@ 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, @@ -89,6 +87,7 @@ Answer, ClientError, LongBuild, + ServedTable, absolute_url_problems, answer_from_body, answer_gaps, @@ -129,6 +128,7 @@ search_warns, selector_path, sentence_entry, + served_table, shared_cacheable, stored_version, surface_problems, @@ -149,7 +149,7 @@ # 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 +# The reading slots of the reading-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 @@ -568,6 +568,12 @@ class Member: rows: int columns: list[str] rendering: dict[str, Any] = field(default_factory=lambda: dict(RENDERING)) + # The value of each column that holds one value in every row. + same: Mapping[str, Any] = field(default_factory=dict) + + @property + def table(self) -> ServedTable: + return ServedTable(tuple(self.columns), self.rows, self.same) @property def spec_id(self) -> str: @@ -591,8 +597,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. The columns after `part` are in the - order the column-order rule gives.""" + member's columns in member order. The columns are in the order the + reading-order rule gives.""" summaries = [ { "parts": member.parts, @@ -605,11 +611,11 @@ def dataset_outcome( dataset: dict[str, Any] = {"rows": sum(member.rows for member in members)} if READING_COLUMNS is None: raise SystemExit( - "rules/column-order.json is missing or holds no reading_columns, so " + "rules/reading-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 + [member.table for member in members], READING_COLUMNS ) if len(members) > 1: dataset["part_rows"] = [ @@ -620,9 +626,8 @@ def dataset_outcome( return {"dataset": {**dataset, **summary}} -def parquet_shape(data: bytes) -> tuple[int, list[str]]: - parquet = pq.ParquetFile(io.BytesIO(data)) - return parquet.metadata.num_rows, list(parquet.schema_arrow.names) +def parquet_shape(data: bytes) -> ServedTable: + return served_table(data) def _reached[T](results: list[T], step: str) -> T: @@ -678,7 +683,7 @@ class Session: recorder: Recorder actions: Mapping[str, Mapping[str, Any]] client_codes: Mapping[str, Mapping[str, Any]] - read_shape: Callable[[bytes], tuple[int, list[str]]] = parquet_shape + read_shape: Callable[[bytes], ServedTable] = parquet_shape sleep: Callable[[float], None] = time.sleep call: list[dict[str, Any]] = field(default_factory=list) expect: list[dict[str, Any]] = field(default_factory=list) @@ -972,16 +977,17 @@ def _member( held = None if spec is None else spec.step() sentence = self._identity_sentence(parts, definition, held) digest = artifact["artifact_digest"] - rows, columns = self.read_shape(self._download(route, digest)) + table = self.read_shape(self._download(route, digest)) return Member( parts, definition, manifest["content_version"], sentence, digest, - rows, - columns, + table.rows, + list(table.columns), dict(rendering), + table.same, ) def _identity_sentence( @@ -1081,16 +1087,17 @@ def stored_file( data, refusal = self._stored_file(member, manifest) if data is None: return None, refusal - rows, columns = self.read_shape(data) + table = self.read_shape(data) stored = Member( member["parts"], spec["definition"], version, member["sentence"], member["artifact"]["digest"], - rows, - columns, + table.rows, + list(table.columns), dict(rendering), + table.same, ) return stored, None @@ -1261,7 +1268,7 @@ class Context: transport: Transport actions: Mapping[str, Mapping[str, Any]] client_codes: Mapping[str, Mapping[str, Any]] - read_shape: Callable[[bytes], tuple[int, list[str]]] = parquet_shape + read_shape: Callable[[bytes], ServedTable] = parquet_shape _cache: dict[str, Any] = field(default_factory=dict) def session(self, name: str, **recorder: Any) -> Session: diff --git a/tools/tests/test_capture_client_contract.py b/tools/tests/test_capture_client_contract.py index ab90b8e..61dbb91 100644 --- a/tools/tests/test_capture_client_contract.py +++ b/tools/tests/test_capture_client_contract.py @@ -46,8 +46,8 @@ def _records(kind: str) -> list[str]: ) -def _shape(data: bytes) -> tuple[int, list[str]]: - return len(data), ["column"] +def _shape(data: bytes) -> capture.ServedTable: + return capture.ServedTable(("column",), len(data), {}) def _without_shapes(expect: list[dict[str, Any]]) -> list[dict[str, Any]]: @@ -404,7 +404,7 @@ 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 stacked columns follow `part` in the reading-order rule's order, the reading columns first and `stat_var` last.""" member = capture.Member( [], diff --git a/tools/tests/test_validate_client_contract.py b/tools/tests/test_validate_client_contract.py index 5dee37a..9dffff3 100644 --- a/tools/tests/test_validate_client_contract.py +++ b/tools/tests/test_validate_client_contract.py @@ -165,6 +165,22 @@ def change(outcome: Any) -> None: return change +def _vector(name: str, change: Callable[[Any], None]) -> Callable[[Any], None]: + return lambda doc: change(next(v for v in doc["vectors"] if v["name"] == name)) + + +def _served_order_after_reading_columns(holder: Any) -> None: + """Moves the varying co-operation modality pair back to its served place, + just before `crsPurpose`, as the rule placed it before it put varying + columns ahead of constant ones.""" + columns = holder["dataset"]["columns"] if "dataset" in holder else holder["columns"] + varying = ["crsCooperationModality", "crsCooperationModality_label"] + for name in varying: + columns.remove(name) + at = columns.index("crsPurpose") + columns[at:at] = varying + + def _set_step(index: int, **fields: Any) -> Callable[[Any], None]: return lambda doc: doc["call"][index].update(fields) @@ -1720,20 +1736,55 @@ def change(doc: Any) -> None: "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", + "scenarios/answer-definite-fetch.json", + _set_outcome(1, _served_order_after_reading_columns), + "scenarios/answer-definite-fetch.json: step 1: columns", + ), + ( + "rules/reading-order.json", + _vector( + "varying-column-follows-reading-columns", + _served_order_after_reading_columns, + ), + ( + "vector 'varying-column-follows-reading-columns' orders its " + "columns or rows otherwise" + ), + ), + ( + "rules/reading-order.json", + _vector("stack-crs-and-dac2a", lambda v: v["columns"].remove("part")), + "vector 'stack-crs-and-dac2a' orders its columns or rows otherwise", + ), + ( + "rules/reading-order.json", + _vector( + "ties-keep-served-order", + lambda v: v["rows"].insert(1, v["rows"].pop(2)), + ), + "vector 'ties-keep-served-order' orders its columns or rows otherwise", + ), + ( + "rules/reading-order.json", + _vector( + "varying-column-follows-reading-columns", + lambda v: v["rows"].insert(1, v["rows"].pop(2)), + ), + ( + "vector 'varying-column-follows-reading-columns' orders its " + "columns or rows otherwise" + ), ), ( - "rules/column-order.json", - lambda doc: doc["vectors"][-1]["ordered"].remove("part"), - "vector 'stack-crs-and-dac2a' orders its columns otherwise", + "rules/reading-order.json", + _vector("null-sorts-last", lambda v: v["rows"].insert(0, v["rows"].pop())), + "vector 'null-sorts-last' orders its columns or rows otherwise", ), ( - "rules/column-order.json", + "rules/reading-order.json", lambda doc: doc.pop("reading_columns"), ( - "rules/column-order.json: missing or unreadable, or holds no " + "rules/reading-order.json: missing or unreadable, or holds no " "reading_columns" ), ), @@ -1984,9 +2035,13 @@ def change(doc: Any) -> None: "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", + "constant-columns-before-varying-ones", + "reading-order-vector-in-served-order", + "reading-order-stacked-vector-without-part", + "reading-order-ties-reordered", + "reading-order-series-interleaved-by-year", + "reading-order-null-sorted-first", + "reading-order-without-reading-columns", ], ) def test_a_broken_contract_is_reported( @@ -2000,10 +2055,10 @@ 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() +def test_a_missing_reading_order_rule_is_reported(package_dir: Path) -> None: + (package_dir / "rules" / "reading-order.json").unlink() assert any( - problem.startswith("rules/column-order.json: missing") + problem.startswith("rules/reading-order.json: missing") for problem in validator.validate() ) diff --git a/tools/validate_client_contract.py b/tools/validate_client_contract.py index ff7db6e..c84959f 100644 --- a/tools/validate_client_contract.py +++ b/tools/validate_client_contract.py @@ -61,9 +61,10 @@ `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 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 + dataset's columns are the downloaded files' columns, read with pyarrow + by `served_table` and ordered by `presented_columns`, which puts the + columns whose values vary before those that hold one value, 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 @@ -93,8 +94,8 @@ 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, and each - column-order vector's `ordered` is what `presented_columns` gives. A - missing or unreadable `rules/column-order.json` is a problem. + reading-order vector's `columns` and `rows` are what `presented_rows` + gives. A missing or unreadable `rules/reading-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 @@ -107,9 +108,9 @@ import json import re import sys -from collections.abc import Callable, Iterator, Mapping, Sequence +from collections.abc import Callable, Collection, Iterator, Mapping, Sequence from dataclasses import dataclass, field, replace -from functools import partial +from functools import lru_cache, partial from pathlib import Path from typing import Any from urllib.parse import quote, urljoin, urlsplit, urlunsplit @@ -1777,8 +1778,12 @@ class _UnfitError(Exception): # 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. +# The column a client presents last, the column a stacked dataset puts +# first, the measure no row sorts by, and the sort key that comes last. STAT_VAR = "stat_var" +PART = "part" +VALUE = "value" +TIME_PERIOD = "time_period" # 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" @@ -1811,35 +1816,168 @@ def fetch_rendering( 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 = [ +@dataclass(frozen=True, slots=True) +class ServedTable: + """A served table as the reading-order rule reads it: its columns in the + order the server wrote them, its row count, and the value of each column + that holds one value in every row. A column `same` leaves out varies.""" + + columns: tuple[str, ...] + rows: int + same: Mapping[str, Any] + + +def table_from_rows( + columns: Sequence[str], rows: Sequence[Sequence[Any]] +) -> ServedTable: + """The `ServedTable` of a table given as rows, as a vector gives one.""" + same = { + name: rows[0][index] + for index, name in enumerate(columns) + if rows and all(row[index] == rows[0][index] for row in rows) + } + return ServedTable(tuple(columns), len(rows), same) + + +@lru_cache(maxsize=64) +def served_table(data: bytes) -> ServedTable: + """The `ServedTable` of a downloaded Parquet file. Each scenario is + replayed twice and each test validates the whole contract, so the + tables are read once per file content. + + Raises: + _UnfitError: The file is not a Parquet file. + """ + try: + table = pq.read_table(pa.BufferReader(data)) + except (pa.ArrowException, OSError) as exc: + raise _UnfitError( + f"a downloaded file is unreadable: not Parquet: {exc}" + ) from exc + same = {} + for name in table.column_names if table.num_rows else (): + values = table.column(name).unique() + if len(values) == 1: + same[name] = values[0].as_py() + return ServedTable(tuple(table.column_names), table.num_rows, same) + + +def filled_slots( + columns: Collection[str], reading: Sequence[Sequence[str]] +) -> list[str]: + """The reading slots `columns` fill, in slot order: each slot's first name + the columns hold.""" + return [ 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 _varies(name: str, tables: Sequence[ServedTable]) -> bool: + """Whether column `name` holds more than one value over the rows of + `tables` stacked, a table without the column holding null in it.""" + values = [] + for table in tables: + if not table.rows: + continue + if name in table.columns and name not in table.same: + return True + values.append(table.same.get(name)) + return any(value != values[0] for value in values[1:]) + + +@dataclass(frozen=True, slots=True) +class ColumnGroups: + """A dataset's columns in the reading-order rule's groups: `part` when + there are several members, the filled reading slots in slot order, the + other columns whose values differ between the stacked rows and those + that hold one value in every row, each in served order, and `stat_var` + with whether it varies.""" + + part: tuple[str, ...] + first: tuple[str, ...] + varying: tuple[str, ...] + same: tuple[str, ...] + last: tuple[str, ...] + last_varies: bool + + @property + def columns(self) -> list[str]: + return [*self.part, *self.first, *self.varying, *self.same, *self.last] + + @property + def sort_keys(self) -> list[str]: + """The columns a client sorts each member's rows by: the filled + reading slots in slot order without `value`, a measure, and without + the time period, then the varying columns in presented order, + `stat_var` among them when it varies, then the time period, so each + series' years read together.""" + keys = [c for c in self.first if c not in (VALUE, TIME_PERIOD)] + keys += [*self.varying, *(self.last if self.last_varies else ())] + return keys + [TIME_PERIOD] * (TIME_PERIOD in self.first) + + +def column_groups( + tables: Sequence[ServedTable], reading: Sequence[Sequence[str]] +) -> ColumnGroups: + """The reading-order rule's column groups for a dataset whose members + serve `tables`. The served order gathers the members' columns in member + order, each once.""" + gathered = list(dict.fromkeys(c for table in tables for c in table.columns)) + first = filled_slots(gathered, reading) + rest = [c for c in gathered if c not in first and c != STAT_VAR] + varying = [c for c in rest if _varies(c, tables)] + return ColumnGroups( + part=(PART,) if len(tables) > 1 else (), + first=tuple(first), + varying=tuple(varying), + same=tuple(c for c in rest if c not in varying), + last=(STAT_VAR,) if STAT_VAR in gathered else (), + last_varies=STAT_VAR in gathered and _varies(STAT_VAR, tables), + ) def presented_columns( - members: Sequence[Sequence[str]], reading: Sequence[Sequence[str]] + tables: Sequence[ServedTable], 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)] + """The columns a client presents for a dataset whose members serve + `tables`, as `column_groups` orders them.""" + return column_groups(tables, reading).columns + + +def presented_rows( + members: Sequence[tuple[str | None, Sequence[str], Sequence[Sequence[Any]]]], + reading: Sequence[Sequence[str]], +) -> tuple[list[str], list[list[Any]]]: + """The columns and rows a client presents for members given as their + `part` value, served columns and served rows. Each member's rows are + sorted by `ColumnGroups.sort_keys`, ascending with nulls last and ties in served + order, and the members follow in member order. A row of a stacked + dataset holds null in a column its member lacks.""" + tables = [table_from_rows(columns, rows) for _, columns, rows in members] + groups = column_groups(tables, reading) + columns, keys = groups.columns, groups.sort_keys + presented = [] + for part, served, rows in members: + at = {name: index for index, name in enumerate(served)} + cells = [ + {**{name: row[index] for name, index in at.items()}, PART: part} + for row in rows + ] + ordered = sorted( + cells, + key=lambda cell: [(cell.get(key) is None, cell.get(key)) for key in keys], + ) + presented.extend([cell.get(name) for name in columns] for cell in ordered) + return columns, presented 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.""" + """The reading slots `rules/reading-order.json` lists, or None when the + file does not hold them, which the validator reports.""" try: - reading = _load(package_dir / "rules" / "column-order.json")["reading_columns"] + reading = _load(package_dir / "rules" / "reading-order.json")["reading_columns"] except (OSError, ValueError, KeyError, TypeError): return None if isinstance(reading, list) and all( @@ -1850,31 +1988,6 @@ def load_reading_columns(package_dir: Path) -> list[list[str]] | None: 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 @@ -2598,7 +2711,7 @@ def member( "spec_id": built, "content_version": manifest["content_version"], "sentence": sentence, - "served_columns": served_columns(data), + "served": served_table(data), } def sentence( @@ -2636,7 +2749,7 @@ def stored_file( data, refusal = self.stored_file(member, manifest) if data is None: return None, refusal - return {**stored, "served_columns": served_columns(data)}, None + return {**stored, "served": served_table(data)}, None def rebuilt(manifest: dict[str, Any]) -> dict[str, Any]: held = {**spec, "sentence": member["sentence"]} @@ -2842,16 +2955,14 @@ def dataset( 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.""" + client presents: the members' served columns ordered by the + reading-order rule, as `presented_columns` gives them. Without the + rule's reading slots, which the validator 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 - ) + columns = presented_columns([m["served"] for m in members], self.reading) return {"dataset": {"columns": columns, **summary}} @@ -3112,7 +3223,7 @@ def _check_expect( 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"{json.dumps(dataset['columns'])[:300]} are not the reading-order " f"rule's order of the served columns, {json.dumps(columns)[:300]}" ) if compared != wanted: @@ -3561,16 +3672,19 @@ 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": + if document["rule"] == "reading-order": problems.extend( - f"{label}: vector {vector['name']!r} orders its columns " - f"otherwise than presented_columns" + f"{label}: vector {vector['name']!r} orders its columns or rows " + f"otherwise than presented_rows" for vector in document["vectors"] - if presented_columns( - vector.get("members", [vector.get("columns")]), + if presented_rows( + [ + (member.get("part"), member["columns"], member["rows"]) + for member in vector["members"] + ], document["reading_columns"], ) - != vector["ordered"] + != (vector["columns"], vector["rows"]) ) return problems @@ -3653,7 +3767,7 @@ 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 " + "rules/reading-order.json: missing or unreadable, or holds no " "reading_columns list of column-name lists, so no dataset's columns " "are checked" ) From b2987de7963b4f7044e5079a7afaf6d0204e3345 Mon Sep 17 00:00:00 2001 From: Jorge Rivera Date: Mon, 26 Oct 2026 15:17:14 +0100 Subject: [PATCH 08/12] feat(capture): pick the long-build specs the server has not built (#28) mint-async-build and operation-resume need a 202, which only an unbuilt spec gives, and each live record builds its two specs for good. The tool named their start years as constants, so every record needed new years by hand. Context.async_spec now walks start years 1960 to 2000 for the DAC and OECD donor questions and takes the first spec that is one definite part, sits just above the sync budget, repeats no earlier pick, and has no version on the versions route. It refuses when the range is used up. The party-totals scenarios narrow a built DAC spec and need no unbuilt one, so they keep their own question, PARTY_TOTALS_FLOW. Co-authored-by: Claude --- python/client-contract/README.md | 2 +- tools/capture_client_contract.py | 95 ++++++++++++++------- tools/tests/test_capture_client_contract.py | 72 ++++++++++++++++ 3 files changed, 136 insertions(+), 33 deletions(-) diff --git a/python/client-contract/README.md b/python/client-contract/README.md index 74a5ee3..c57dfb6 100644 --- a/python/client-contract/README.md +++ b/python/client-contract/README.md @@ -209,7 +209,7 @@ 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 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. +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 to 2024 for the mint, and from the 38 OECD countries to the G77 countries to 2024 for the resumed operation, each one variable over some 3,700 donor and recipient pairs, so the done manifest stays small. The tool chooses each start year, the earliest whose spec is in that row band and has no version on the versions route. Each record builds both specs, so the next record takes later start years, and the run fails when no year in the tool's range is left. A local recording runs with `DATASETS_SYNC_BUDGET_ROWS=100000`. `--scenarios-dir` writes records outside the package, unvalidated. ## DatasetRef diff --git a/tools/capture_client_contract.py b/tools/capture_client_contract.py index 0b7d221..1f71bca 100644 --- a/tools/capture_client_contract.py +++ b/tools/capture_client_contract.py @@ -38,9 +38,10 @@ replaced by `X-Goog-Signature=redacted`. A local app's blob URL becomes the storage URL a deployment signs. A record holding any other absolute URL, outside a `location` under the base URL, is refused. The long builds need -two specs the server has not built, so a local recording starts on a fresh -datasets database. `--scenarios-dir` writes outside the package, -unvalidated. The run ends by validating the whole contract with +two specs the server has not built, and the run picks each from the first +start year whose spec the server has not built, so each record moves both +start years up. `--scenarios-dir` writes outside the package, unvalidated. +The run ends by validating the whole contract with `tools/validate_client_contract.py`, and fails when it reports a problem, when the binary bodies pass 5 MB, or when the records and bodies together pass `SCENARIOS_BUDGET`, 16 MB. @@ -1237,24 +1238,29 @@ def _build_body( CANDIDATES_BESIDE_ASSUMED = ( "mortality in Kenya and aid flows to Kenya from 2013 to 2022" ) -# Two specs just above the 100,000-row sync budget, one for the mint and one -# for the operation another process started: a version the server has built -# answers inline, so each long build needs a spec the server has not built. -# A flow side the question leaves unnamed reads as its source's whole total, so -# both sides name groups read as their members: about 3,700 donor and -# 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 1967 to 2024" -) -ASYNC_RESUMED = ( - "ODA disbursements from the OECD countries to the G77 countries from 1968 to 2024" +# Two specs just above the 100,000-row sync budget, the DAC donors' for the +# mint and the OECD donors' for the operation another process started: a +# version the server has built answers inline, so each long build needs a spec +# the server has not built, and the run takes the first start year in +# LONG_BUILD_YEARS whose spec it has not. Each record builds both for good, so +# the next record takes later start years. A flow side the question leaves unnamed +# reads as its source's whole total, so both sides name groups read as their +# members: about 3,700 donor and recipient pairs of one variable over some 60 +# years. A variable broken down by sector would list thousands of variables in +# the done manifest. +LONG_BUILD = ( + "ODA disbursements from the {donors} countries to the G77 countries" + " from {year} to 2024" ) +LONG_BUILD_YEARS = range(1960, 2001) 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. +# The DAC donors' flow to the G77, 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_FLOW = ( + "ODA disbursements from the DAC countries to the G77 countries from 1967 to 2024" +) PARTY_TOTALS_WINDOW = (2022, 2022) PARTY_TOTALS_ENTITIES = {"origin": None, "destination": ["country/KEN"]} SYNC_ROWS = 100_000 @@ -1322,22 +1328,47 @@ def definite_ref(self) -> dict[str, Any]: self._cache["ref"] = {"format_version": 1, "members": [member.ref()]} return self._cache["ref"] - def async_spec(self, question: str = ASYNC) -> Spec: - """The spec `question` answers, whose estimate is just above the sync - budget.""" - (part,) = self.definite_answer(question).parts - rows = part["spec"]["resolved"].get("download", {}).get("rows") or 0 - require( - SYNC_ROWS < rows < 2 * SYNC_ROWS, - f"{rows} rows is just above the sync budget", - ) - return _part_spec(part["spec"]) + def async_spec(self, donors: str) -> Spec: + """The spec the LONG_BUILD question for `donors` answers at the first + start year in LONG_BUILD_YEARS whose answer is one definite part, whose + estimate is just above the sync budget, and whose spec no earlier year + or other donors answered and the server has not built. No such year + raises ShapeError.""" + picks: dict[str, Spec] = self._cache.setdefault("long builds", {}) + if donors not in picks: + session = self.session("prerequisite") + seen = {spec.spec_id for spec in picks.values()} + for year in LONG_BUILD_YEARS: + answer = session.search(LONG_BUILD.format(donors=donors, year=year)) + if answer.status != "definite" or len(answer.parts) != 1: + continue + (part,) = answer.parts + rows = part["spec"]["resolved"].get("download", {}).get("rows") or 0 + spec = _part_spec(part["spec"]) + # A start year before the source's first year clips to the same + # spec as the years after it, so a spec already seen is built or + # is the other donors' pick. + if not SYNC_ROWS < rows < 2 * SYNC_ROWS or spec.spec_id in seen: + continue + seen.add(spec.spec_id) + # `_newest` and not `newest_version`, which reads a refused + # versions request as no version. + if session._newest(spec.spec_id) is None: + picks[donors] = spec + break + else: + raise ShapeError( + f"no start year from {LONG_BUILD_YEARS[0]} to" + f" {LONG_BUILD_YEARS[-1]} gives the {donors} donors a spec" + " just above the sync budget that the server has not built" + ) + return picks[donors] def running_operation(self) -> str: """The id of a long build another process started.""" if "operation" not in self._cache: self._cache["operation"] = self.session("prerequisite").mint( - self.async_spec(ASYNC_RESUMED) + self.async_spec("OECD") ) return self._cache["operation"] @@ -1428,13 +1459,13 @@ def run(s: Session, ctx: Context) -> None: def _fetch_spec_party_totals(*, keep: bool) -> Callable[[Session, Context], None]: - """Fetches the ASYNC spec narrowed to PARTY_TOTALS_ENTITIES in + """Fetches the PARTY_TOTALS_FLOW 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) + spec = ctx.definite_spec(PARTY_TOTALS_FLOW) def fetched(session: Session, party_totals: bool) -> Member: (member,) = session.fetch_spec( @@ -1509,7 +1540,7 @@ def _fetch_ref_unknown_version(s: Session, ctx: Context) -> None: def _mint_async(s: Session, ctx: Context) -> None: - s.mint(ctx.async_spec(ASYNC)) + s.mint(ctx.async_spec("DAC")) s.result() diff --git a/tools/tests/test_capture_client_contract.py b/tools/tests/test_capture_client_contract.py index 61dbb91..9954ced 100644 --- a/tools/tests/test_capture_client_contract.py +++ b/tools/tests/test_capture_client_contract.py @@ -551,3 +551,75 @@ def fake_run(args: list[str], **kwargs: Any) -> Any: assert {a for a in command if a.startswith("--extra=")} == { f"--extra={e}" for e in ("eval", "api", "engine", "datasets", "graph") } + + +def _long_build_ctx( + monkeypatch: pytest.MonkeyPatch, + answers: Mapping[tuple[str, int], tuple[str, int]], + built: set[str], +) -> tuple[Any, list[str], list[str]]: + """A context whose searches answer `answers`, (donors, year) to spec id + and row estimate, and whose versions route lists a version of each spec + in `built`, with the questions searched and the spec ids probed.""" + questions: list[str] = [] + probed: list[str] = [] + + def search(self: Any, question: str) -> Any: + questions.append(question) + for (donors, year), (spec_id, rows) in answers.items(): + if question == capture.LONG_BUILD.format(donors=donors, year=year): + spec = { + "spec_id": spec_id, + "definition": {"spec_id": spec_id}, + "resolved": {"download": {"rows": rows}}, + } + return capture.Answer({}, [{"spec": spec}], None, "definite") + return capture.Answer({}, [], None, "declined") + + def newest(self: Any, spec_id: str) -> str | None: + probed.append(spec_id) + return "cv_built" if spec_id in built else None + + monkeypatch.setattr(capture.Session, "search", search) + monkeypatch.setattr(capture.Session, "_newest", newest) + ctx = capture.Context(capture.DEV_BASE_URL, capture._offline, ACTIONS, CLIENT_CODES) + return ctx, questions, probed + + +def test_a_long_build_takes_the_first_unbuilt_spec_in_the_band( + monkeypatch: pytest.MonkeyPatch, +) -> None: + """A year outside the row band, a built spec and a spec an earlier year + answered are passed over, and each pick is searched for once.""" + in_band = capture.SYNC_ROWS + 1 + ctx, questions, probed = _long_build_ctx( + monkeypatch, + { + ("DAC", 1960): ("spec_small", capture.SYNC_ROWS), + ("DAC", 1961): ("spec_built", in_band), + ("DAC", 1962): ("spec_built", in_band), + ("DAC", 1963): ("spec_dac", in_band), + ("OECD", 1960): ("spec_dac", in_band), + ("OECD", 1961): ("spec_oecd", in_band), + }, + {"spec_built"}, + ) + assert ctx.async_spec("DAC").spec_id == "spec_dac" + assert ctx.async_spec("OECD").spec_id == "spec_oecd" + assert ctx.async_spec("DAC").spec_id == "spec_dac" + assert probed == ["spec_built", "spec_dac", "spec_oecd"] + assert len(questions) == 6 + + +def test_a_long_build_with_no_unbuilt_year_is_refused( + monkeypatch: pytest.MonkeyPatch, +) -> None: + monkeypatch.setattr(capture, "LONG_BUILD_YEARS", range(1960, 1962)) + in_band = capture.SYNC_ROWS + 1 + ctx, _, _ = _long_build_ctx( + monkeypatch, + {("DAC", 1960): ("spec_a", in_band), ("DAC", 1961): ("spec_b", in_band)}, + {"spec_a", "spec_b"}, + ) + with pytest.raises(capture.ShapeError, match="from 1960 to 1961"): + ctx.async_spec("DAC") From 455e958ca865c43e2fa1e774e4799a92d5f3da3d Mon Sep 17 00:00:00 2001 From: Jorge Rivera Date: Tue, 27 Oct 2026 12:27:11 +0100 Subject: [PATCH 09/12] feat(registry): register the two scope-choice refusal codes (#29) * feat(registry): register the two scope-choice refusal codes Add requested_option_unavailable and conflicting_requested_options as search refusals on the dataset_resubmit door (problem details, 422), in the registry and its packaged mirror. * fix(registry): define the scope-choice refusals as Search raises them Each definition covers every case dfo-apis refuses with it: an axis the part does not offer, an option the axis does not list or an unavailable one, and entries that conflict or rule out every option of an axis. The client contract gives both a fix_request row. --- python/client-contract/CHANGELOG.md | 2 +- .../src/dfo_client_contract/actions.json | 8 ++++ python/spec-kit/CHANGELOG.md | 8 ++++ .../src/dfo_spec_kit/registry/codes.json | 38 +++++++++++++++++++ registries/codes.json | 38 +++++++++++++++++++ 5 files changed, 93 insertions(+), 1 deletion(-) diff --git a/python/client-contract/CHANGELOG.md b/python/client-contract/CHANGELOG.md index 3b161a4..63f5868 100644 --- a/python/client-contract/CHANGELOG.md +++ b/python/client-contract/CHANGELOG.md @@ -9,7 +9,7 @@ All notable changes to the `dfo-spec-kit-client-contract` Python package will be - Package scaffolding (uv, ruff, ty, pytest). - `served/openapi.json`, the composed dfo-apis app's OpenAPI document, and `served/SOURCE.json`, naming dfo-apis commit `d80df9f5fd598b7345255470932d202ee5d49942`. The document admits `timed_out` as a no_data reason and the optional `entity_refs` on each answer part, a list of `EntityRefs` with one entry per restatement entity row, the graph nodes that row binds, and a stored manifest warning states its counts and the refs it names (`CountedRefsModel`, `CountedEntityYearsModel`, `EntityYearsModel`). `NoDataOption` and `SentenceToken` carry `entity_choice`, the index into `NoData.ambiguous_entities` of the group an entity_ambiguous option settles or a slot token asks, so a client groups a place menu by it when two wordings share one text. - `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. +- `actions.json` and its schema: the caller's next step for each of the 104 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 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. diff --git a/python/client-contract/src/dfo_client_contract/actions.json b/python/client-contract/src/dfo_client_contract/actions.json index 34b2b09..8474193 100644 --- a/python/client-contract/src/dfo_client_contract/actions.json +++ b/python/client-contract/src/dfo_client_contract/actions.json @@ -46,6 +46,10 @@ "code": "column_unknown", "action": "fix_request" }, + { + "code": "conflicting_requested_options", + "action": "fix_request" + }, { "code": "constraint_violation", "action": "fix_request" @@ -292,6 +296,10 @@ "code": "request_invalid", "action": "fix_request" }, + { + "code": "requested_option_unavailable", + "action": "fix_request" + }, { "code": "resolution_ambiguous", "action": "fix_request" diff --git a/python/spec-kit/CHANGELOG.md b/python/spec-kit/CHANGELOG.md index 4594047..66d1003 100644 --- a/python/spec-kit/CHANGELOG.md +++ b/python/spec-kit/CHANGELOG.md @@ -220,6 +220,14 @@ and this package adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 mirror: a 422 refusal on `search.resolve` for a `dataset_resubmit` whose identity names an open role, when the StatVars the definition elects declare no role on that axis, so the definition cannot give one series per member. +- Codes `requested_option_unavailable` and `conflicting_requested_options` in + `registries/codes.json` and its bundled mirror: 422 refusals on + `search.resolve` for a `dataset_resubmit` that posts `scope_entries`. + `requested_option_unavailable` covers an entry that names an axis the part + does not offer, an option the axis does not list, or an unavailable option. + `conflicting_requested_options` covers entries that cannot all apply: two + options on one axis, an option that conflicts with an entry on another + axis, or entries that rule out every option of an axis. - Optional top-level identity member `open_roles` in `dfo_spec_kit.identity`: a list of flow roles, from `origin` and `destination`, whose every member the request asks for, as distinct from an diff --git a/python/spec-kit/src/dfo_spec_kit/registry/codes.json b/python/spec-kit/src/dfo_spec_kit/registry/codes.json index a158e84..faf341b 100644 --- a/python/spec-kit/src/dfo_spec_kit/registry/codes.json +++ b/python/spec-kit/src/dfo_spec_kit/registry/codes.json @@ -475,6 +475,25 @@ ], "lifecycle": "active" }, + { + "code": "conflicting_requested_options", + "classification": "refusal", + "definition": "The scope_entries posted for a part cannot all apply: two entries name different options on one axis, an option conflicts with an entry on another axis, or the entries rule out every option of an axis.", + "owning_contract": "search", + "owner": "platform", + "introduced_in": "v1", + "mappings": [ + { + "endpoint": "search.resolve", + "doors": [ + "dataset_resubmit" + ], + "channel": "problem_details", + "http_status": 422 + } + ], + "lifecycle": "active" + }, { "code": "conjunction_cross_shape", "classification": "warning", @@ -3313,6 +3332,25 @@ ], "lifecycle": "active" }, + { + "code": "requested_option_unavailable", + "classification": "refusal", + "definition": "A scope_entries entry names an axis the part does not offer, an option the axis does not list, or an option that is unavailable for this part.", + "owning_contract": "search", + "owner": "platform", + "introduced_in": "v1", + "mappings": [ + { + "endpoint": "search.resolve", + "doors": [ + "dataset_resubmit" + ], + "channel": "problem_details", + "http_status": 422 + } + ], + "lifecycle": "active" + }, { "code": "resolution_ambiguous", "classification": "refusal", diff --git a/registries/codes.json b/registries/codes.json index a158e84..faf341b 100644 --- a/registries/codes.json +++ b/registries/codes.json @@ -475,6 +475,25 @@ ], "lifecycle": "active" }, + { + "code": "conflicting_requested_options", + "classification": "refusal", + "definition": "The scope_entries posted for a part cannot all apply: two entries name different options on one axis, an option conflicts with an entry on another axis, or the entries rule out every option of an axis.", + "owning_contract": "search", + "owner": "platform", + "introduced_in": "v1", + "mappings": [ + { + "endpoint": "search.resolve", + "doors": [ + "dataset_resubmit" + ], + "channel": "problem_details", + "http_status": 422 + } + ], + "lifecycle": "active" + }, { "code": "conjunction_cross_shape", "classification": "warning", @@ -3313,6 +3332,25 @@ ], "lifecycle": "active" }, + { + "code": "requested_option_unavailable", + "classification": "refusal", + "definition": "A scope_entries entry names an axis the part does not offer, an option the axis does not list, or an option that is unavailable for this part.", + "owning_contract": "search", + "owner": "platform", + "introduced_in": "v1", + "mappings": [ + { + "endpoint": "search.resolve", + "doors": [ + "dataset_resubmit" + ], + "channel": "problem_details", + "http_status": 422 + } + ], + "lifecycle": "active" + }, { "code": "resolution_ambiguous", "classification": "refusal", From c7a556918189cbc2d29cb4f855de9df15c803357 Mon Sep 17 00:00:00 2001 From: Jorge Rivera Date: Thu, 29 Oct 2026 17:05:59 +0100 Subject: [PATCH 10/12] fix(client-contract): ask the file selector only for the keys it reads (#33) * fix(client-contract): ask the file selector only for the keys it reads A file-selector rule names format, bundle and layout; the validator, capture tool and selector scenarios derive the query from it. The validator compares values by one rule and reports malformed vectors, and the base-URL and client-identity rules close the cases where Python and WHATWG clients disagreed. * fix(client-contract): read a resumed build's rendering and keep nested columns out of sort keys A resumed operation's result takes the rendering its build posted, and refs are checked against the build that served their file. List and struct columns never sort, the reference same_value is the validator's, selector queries lowercase booleans only, and the capture's OECD prerequisite keeps party totals. --- CONTRIBUTING.md | 2 +- python/client-contract/CHANGELOG.md | 14 +- python/client-contract/README.md | 12 +- .../src/dfo_client_contract/contract.py | 1 + .../src/dfo_client_contract/rules/README.md | 16 +- .../dfo_client_contract/rules/base-url.json | 78 ++++ .../rules/client-identity.json | 11 +- .../rules/file-selector.json | 47 +++ .../rules/reading-order.json | 128 ++++++ .../rules/rules.schema.json | 70 +++- .../dfo_client_contract/scenario.schema.json | 6 +- .../choose-refused-label-in-two-groups.json | 395 ++++++++++++++++++ .../fetch-ref-artifact-unlisted.json | 2 +- .../fetch-ref-expired-file-selector.json | 2 +- .../scenarios/mint-async-build.json | 3 +- python/client-contract/tests/test_rules.py | 85 +++- python/spec-kit/CHANGELOG.md | 7 +- tools/README.md | 4 +- tools/capture_client_contract.py | 190 +++++++-- tools/tests/test_capture_client_contract.py | 140 ++++++- tools/tests/test_validate_client_contract.py | 183 +++++++- tools/validate_client_contract.py | 276 +++++++++--- 22 files changed, 1517 insertions(+), 155 deletions(-) create mode 100644 python/client-contract/src/dfo_client_contract/rules/file-selector.json create mode 100644 python/client-contract/src/dfo_client_contract/scenarios/choose-refused-label-in-two-groups.json diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 576963f..5468804 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -41,7 +41,7 @@ uv run tools/validate_unit_vectors.py uv run tools/validate_provenance_docs_vectors.py uv run tools/validate_descriptions_vectors.py uv run tools/validate_client_contract.py -uv run --with jsonschema --with pytest pytest tools/tests -q +uv run --with jsonschema --with pyarrow --with pytest pytest tools/tests -q ``` The last command tests the validators themselves. [tools/README.md](tools/README.md) says what each validator checks. Each package's tests drive its implementation against the same vectors or fixtures, and `uv run pytest` runs them. diff --git a/python/client-contract/CHANGELOG.md b/python/client-contract/CHANGELOG.md index 63f5868..540c799 100644 --- a/python/client-contract/CHANGELOG.md +++ b/python/client-contract/CHANGELOG.md @@ -11,7 +11,7 @@ All notable changes to the `dfo-spec-kit-client-contract` Python package will be - `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 104 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 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. +- `scenario.schema.json`, the scenario record, and 125 scenarios: 34 recorded against the deployed dfo-apis dev app at `d80df9f5f`, and 91 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,693,847 bytes. `search-place-ambiguous-twice` pins two entity_ambiguous groups of one text, each option and slot token naming its group by `entity_choice`, and `choose-refused-label-in-two-groups` pins that a label both groups offer matches two options, so a choice there names its option by index. The scenarios cover the several-part choice entries and the assumptions each identity entry echoes, a picked reading whose assumption Search states in its answer, the place choice through a no_data part's options, the choice refusals, a part without variable_text, an unknown status without a restatement, a shared label, a one-part option whose data_query holds two parts, the separate and operations echo, an unsupported part's placeholder, the timed_out, unsupported and unknown gaps, an unknown answer kind, the `SearchWarning` rule, the stacked dataset's `part` column, the frame layout, a strict fetch's `DataWarning`, a spec fetch that rebinds one of two entity roles and keeps the other, one that drops a role bound to null, a spec whose destination is a named group fetched with a window or with its origin rebound, whose sentence lookup posts the groups of the roles the build left bound, a twice cut-off build, a cut-off build retried after its Retry-After, a 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,15 +19,17 @@ 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 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. +- `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 the build that answered its file 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. `record` reads the rule tables from `--package-dir` before any request, and looks for each long build's spec from the year after the one its record built, stopping at the first start year whose estimate is within the sync budget. - `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 `reading-order` rule and its vectors, which carry rows: 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 columns whose values differ between rows, then those that hold one value, each group in the server's order, with `stat_var` last. It sorts each member's rows by the filled slots without `value` and the time period, then the varying columns, then the time period, ascending with nulls last and ties in served order, so each series' years read together. Scenario outcomes give `columns` in that order, and the validator checks it against the served files. -- The `client-identity` rule and its vectors: every request a client sends to the API carries `X-DFO-Client: / ()`, such as `dfo-python/0.1.0 (CPython 3.14)` or `dfo-ts/0.1.0 (Node 22.18)`, and `browser` as the runtime in a browser, with `pattern` matching every well-formed value. A request to another origin, a signed storage URL included, carries none. A caller's headers or header provider naming `X-DFO-Client` in any letter case raises `InvalidRequestError` `header_invalid`, whose condition now says so, and `User-Agent` stays as each client sends it. A scenario replay checks the header on each `path` and `origin_path` request and its absence on each `url` request. +- 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 leaves them out by default too, and its step takes `party_totals`, so its `result` answers the table a fetch of the spec answers; `mint-async-build` keeps them. A resumed operation's `result` takes the rendering its build posted from the done manifest's artifact. +- The `reading-order` rule and its vectors, which carry rows: 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 columns whose values differ between rows, then those that hold one value, each group in the server's order, with `stat_var` last. It sorts each member's rows by the filled slots without `value` and the time period, then the varying columns, then the time period, ascending with nulls last and ties in served order, so each series' years read together. Two cells hold the same value when they are equal as JSON values: numbers by value, so `1` and `1.0` are one value, booleans apart from numbers, NaN the same as NaN, lists item by item in order and structs field by field in any order. A column of lists or structs is no sort key. A vector's rows hold one cell per column and each column one JSON type, and `integer-and-float-are-one-value` and `nested-cells-compare-by-value` pin the comparison. Scenario outcomes give `columns` in that order, and the validator checks it against the served files, list and struct columns included, and reports a malformed vector. +- The `client-identity` rule and its vectors: every request a client sends to the API carries `X-DFO-Client: / ()`, such as `dfo-python/0.1.0 (CPython 3.14)` or `dfo-ts/0.1.0 (Node 22.18)`, `browser` as the runtime in a browser page or browser worker, and `other` in any other runtime, such as Cloudflare Workers, with `pattern` matching every well-formed value. A request to another origin, a signed storage URL included, carries none. A caller's headers or header provider naming `X-DFO-Client` in any letter case raises `InvalidRequestError` `header_invalid`, whose condition in `client-codes.json` names that case, and `User-Agent` stays as each client sends it. A scenario replay checks the header on each `path` and `origin_path` request and its absence on each `url` request. - The `role-keys` rule and its vectors: a caller narrows a spec with `entities=` keyed by `place`, `origin` and `destination`, and a client posts `place` as the wire role `observationAbout`. `Spec.roles`, `specRoles(spec)` and the clients' errors name the caller keys, and a flow spec takes both directions. A key outside the spec's roles raises `InvalidRequestError` `invalid_argument` naming the key and the spec's roles, so `observationAbout` on GDP is refused naming `place` and `financingRecipient` on a flow spec naming `origin` and `destination`. A spec that names no role posts `place` as `observationAbout` and other keys as typed, and refuses `observationAbout` naming `place`. - 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. - The `base-url` rule states the whole validity rule, and seven new vectors pin it: no query, fragment, `.` or `..` segment, character outside visible ASCII, empty userinfo or non-decimal IPv4 host; trailing slashes dropped; a relative URL valid only in a TypeScript client inside a browser page. +- The `base-url` rule also refuses a `.` or `..` segment written with `%2e`, a backslash, and a port outside 1 to 65535 or written other than in decimal digits, an empty one included, so a client on Python's `urlsplit` and one on the WHATWG URL parser accept the same values. Ten vectors pin them. +- The `file-selector` rule and its vectors: the file selector's query holds the `format`, `bundle` and `layout` of a ref member's rendering, the keys `query_keys` lists, in that order, and leaves out `without_party_totals`, which the selector refuses with 400 `request_invalid` because the version records its own cut. `fetch-ref-expired-file-selector` and `fetch-ref-artifact-unlisted` ask that query, and the validator and the capture build it from `query_keys`. [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 c57dfb6..312af1a 100644 --- a/python/client-contract/README.md +++ b/python/client-contract/README.md @@ -134,7 +134,7 @@ 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` 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. +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`, a `fetch` of an answer or a spec takes `strict`, and that `fetch` and `mint` take `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. @@ -161,15 +161,15 @@ The records also fix these client rules: - 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 the members' columns, gathered in member order with each column once and ordered by the reading-order rule, which also sorts each member's rows. 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 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. An `entity_ambiguous` option carries `entity_choice`, the index into `no_data.ambiguous_entities` of the group it settles, and a menu groups the options by it. When one place name is ambiguous at two positions, as in "aid from Congo to Congo", each group offers the same labels, so a label matches an option in each group and the choice names its option by index, which `choose-refused-label-in-two-groups` pins. 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. - In a several-part answer a choice posts `dataset_resubmit`, without `raw_query`, with one entry per part in part order. The chosen candidate posts an identity entry with its identity and `entity_groups`, and the chosen option its `data_query`'s one part as a parsed entry. A definite part posts an identity entry with its spec's identity and `entity_groups`. A candidates part left alone posts a `candidates` entry: its candidate set in the server's order, each with its identity and `entity_groups`, and its `ordering` and `truncated` echoed. The server cannot recompute that order, because it rests on the first answer's bind election and availability reads, and a parsed entry would cost an LLM bind. Any other part posts its `restatement` as a parsed entry, or a placeholder entry with its no_data `reason` or unsupported `code` when it has none. Every entry but a parsed one carries the part's `variable_text`, `separate` when true and `operations` when any of the part's operations reads. `entity_groups` is left out when the spec has none. `choose-echoes-separate-and-operations` pins the echo on a definite part's entry, and `choose-posts-unsupported-placeholder` an unsupported part's placeholder. - 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 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. +- 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, and a mint, add `"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, and a mint, leave out party totals by default. The 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 or mint 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 posts the options a fetch of its spec posts, so its `result` answers the table that fetch answers, which `mint-async-build` pins with `party_totals: true`. A resumed operation posts no build, and its `result` answers the rendering the operation's build posted: the layout's rendering, with `without_party_totals: true` when the done manifest's artifact for that layout carries it. `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. @@ -177,7 +177,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`. 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 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 query the file-selector rule in `rules/README.md` builds from the ref's rendering, which leaves out `without_party_totals`; 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 for 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. @@ -217,7 +217,7 @@ A record's `origin.base_url` is the base URL the run was given, a local app's in ## Rules -`rules/README.md` states the shared rules for credentials, key lookup and format, the base URL, disk caching, the order a client presents a dataset's columns and rows in, the keys a caller narrows a spec's roles by, and the `X-DFO-Client` header that identifies the client to the API. 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, the order a client presents a dataset's columns and rows in, the keys a caller narrows a spec's roles by, the file selector's query, and the `X-DFO-Client` header that identifies the client to the API. 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 944da09..e21412b 100644 --- a/python/client-contract/src/dfo_client_contract/contract.py +++ b/python/client-contract/src/dfo_client_contract/contract.py @@ -19,6 +19,7 @@ "reading-order", "client-identity", "role-keys", + "file-selector", ) 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 3c52496..7eb40e4 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, and the reading-order, client-identity and role-keys rules 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. +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 reading-order, client-identity, role-keys and file-selector rules 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`) @@ -42,7 +42,7 @@ A client resolves its base URL when it is built. The first source found wins: 1. `DFO_BASE_URL`; 1. the public default, `https://developmentfinance.org/api/v1`. -Only the chosen source is checked. A base URL is valid when it is an absolute `http` or `https` URL with a host and none of these: userinfo, an empty one as in `https://@host/api` included; a query; a fragment; a `.` or `..` path segment; a character outside visible ASCII, a control character, a space or a non-ASCII character; or a host written as an IPv4 address in any form but four decimal numbers, such as `127.1`, `0x7f.1` or `2130706433`. An invalid one raises `base_url_invalid`, so an empty `base_url` argument raises it where an empty `DFO_BASE_URL` counts as unset. A relative URL is invalid, except in a TypeScript client inside a browser page, which resolves a relative base URL against the page's address. A valid value is used as given, less its trailing slashes, so the client's base URL reads `https://developmentfinance.org/api/v1` for `https://developmentfinance.org/api/v1/`; the rule fixes the source and the validity, and leaves the rest of the URL's form to the client. A key sent over plain `http` to a host that is not loopback is refused by `insecure_transport`, which this rule does not decide. +Only the chosen source is checked. A base URL is valid when it is an absolute `http` or `https` URL with a host and none of these: userinfo, an empty one as in `https://@host/api` included; a query; a fragment; a `.` or `..` path segment, with any of its dots written `%2e` or `%2E` included; a backslash; a port that is not 1 to 65535 in decimal digits, an empty port after a `:` included; a character outside visible ASCII, a control character, a space or a non-ASCII character; or a host written as an IPv4 address in any form but four decimal numbers, such as `127.1`, `0x7f.1` or `2130706433`. An invalid one raises `base_url_invalid`, so an empty `base_url` argument raises it where an empty `DFO_BASE_URL` counts as unset. A relative URL is invalid, except in a TypeScript client inside a browser page, which resolves a relative base URL against the page's address. A valid value is used as given, less its trailing slashes, so the client's base URL reads `https://developmentfinance.org/api/v1` for `https://developmentfinance.org/api/v1/`; the rule fixes the source and the validity, and leaves the rest of the URL's form to the client. A key sent over plain `http` to a host that is not loopback is refused by `insecure_transport`, which this rule does not decide. ## Key format (`key-format`) @@ -93,15 +93,15 @@ The columns come in four groups: 1. the other columns that hold one value in every row, null included, in the order the server wrote them; 1. `stat_var`, last whether or not it varies. -A table with no row or one row has no column that varies. A dataset of several members puts `part` first and judges the groups over the stacked table, where a member's rows hold null in a column that member lacks. So a CRS series of Germany's basic health ODA to Nigeria, split by co-operation modality, reads `time_period`, `financingProvider_label`, `financingRecipient_label`, `crsPurpose_label`, `value`, `unit_label`, `crsTypeOfFlow_label` and `provenance_label`, then `crsCooperationModality` and `crsCooperationModality_label`, which tell its rows apart, then its 15 constant columns, `stat_var` last. +A table with no row or one row has no column that varies. Two cells hold the same value when they are equal as JSON values: numbers by value, so `1` and `1.0` are one value, booleans apart from numbers, so `true` and `1` differ, and null the same as null. NaN, which a Parquet double column can hold, is the same as NaN. A list cell is the same as another when their items are the same, in order, and a struct cell when it has the same fields with the same values, in any field order. A dataset of several members puts `part` first and judges the groups over the stacked table, where a member's rows hold null in a column that member lacks. So a CRS series of Germany's basic health ODA to Nigeria, split by co-operation modality, reads `time_period`, `financingProvider_label`, `financingRecipient_label`, `crsPurpose_label`, `value`, `unit_label`, `crsTypeOfFlow_label` and `provenance_label`, then `crsCooperationModality` and `crsCooperationModality_label`, which tell its rows apart, then its 15 constant columns, `stat_var` last. -The rows of each member are sorted by the filled slots in slot order, leaving out `value`, a measure, and the time period, then by the varying columns in presented order, `stat_var` after them when it varies, then by the time period, so each series' years read together. The keys of that series are the provider, recipient, purpose, unit, flow type and provenance labels, then `crsCooperationModality` and `crsCooperationModality_label`, then the time period, so it reads every A02 year, then every C01 year. Each key sorts ascending, numbers by value and strings by Unicode code point, with nulls last. Rows whose keys tie keep the order the server wrote them. The members follow one another in member order. +The rows of each member are sorted by the filled slots in slot order, leaving out `value`, a measure, and the time period, then by the varying columns in presented order, `stat_var` after them when it varies, then by the time period, so each series' years read together. A column that holds lists or structs is no sort key, since the rule gives them no order. The keys of that series are the provider, recipient, purpose, unit, flow type and provenance labels, then `crsCooperationModality` and `crsCooperationModality_label`, then the time period, so it reads every A02 year, then every C01 year. Each key sorts ascending, numbers by value and strings by Unicode code point, with nulls last. Rows whose keys tie keep the order the server wrote them. The members follow one another in member order. -A vector gives the dataset's `members`, each with its `part` when there are several, its `columns` and its `rows` as the server wrote them, and the `columns` and `rows` a client presents. The order moves columns and rows and changes no value. A client hashes a downloaded file before it orders anything, so the digest and the ref keep the server's file. +A vector gives the dataset's `members`, each with its `part` when there are several, its `columns` and its `rows` as the server wrote them, and the `columns` and `rows` a client presents. Each row holds one cell per column, and the cells of a column, nulls aside, are all strings, all numbers, all booleans, all lists or all structs, since the rule orders no value against one of another type. The order moves columns and rows and changes no value. A client hashes a downloaded file before it orders anything, so the digest and the ref keep the server's file. ## Client identity (`client-identity`) -Every request a client sends to the API carries `X-DFO-Client: / ()`. `` is `dfo-python` or `dfo-ts`, and `` is the package version as the package states it. `` names the runtime and its major and minor version. In Python it is the implementation as `platform.python_implementation()` names it, then the interpreter's major and minor version, such as `CPython 3.14`. In TypeScript it is `Node`, `Deno` or `Bun` with the major and minor of that runtime's version, such as `Node 22.18`, and `browser` in any other runtime, a page or a worker. `pattern` in `client-identity.json` matches every well-formed value. A vector gives the `client`, the `version`, the `runtime` as its `name` and full `version`, or `browser` with no version, and the `value` the client sends. +Every request a client sends to the API carries `X-DFO-Client: / ()`. `` is `dfo-python` or `dfo-ts`, and `` is the package version as the package states it. `` names the runtime and its major and minor version. In Python it is the implementation as `platform.python_implementation()` names it, then the interpreter's major and minor version, such as `CPython 3.14`. In TypeScript it is `Node`, `Deno` or `Bun` with the major and minor of that runtime's version, such as `Node 22.18`, `browser` in a browser page or browser worker, and `other` in any other runtime, such as Cloudflare Workers. `pattern` in `client-identity.json` matches every well-formed value. A vector gives the `client`, the `version`, the `runtime` as its `name` and full `version`, or `browser` or `other` with no version, and the `value` the client sends. An API request is one to the base URL's origin, a `path` or `origin_path` request in a scenario. A request to any other origin, a signed storage URL included, carries no `X-DFO-Client`. In a browser, the files-route request the TypeScript client sends with `redirect: "follow"` carries the API key alone, because the browser forwards every other header to the storage host it is redirected to. @@ -116,3 +116,7 @@ The roles a spec takes are those its `definition.identity` binds in `entities` o A client checks each key the caller types before any request. A key outside the spec's roles raises `InvalidRequestError` `invalid_argument`, and the message names the key and the spec's roles. So GDP for Kenya refuses `origin` and `observationAbout` naming `place`, and a flow spec refuses `place` and a column name such as `financingRecipient` naming `origin` and `destination`. A spec that names no role leaves the check to the server, since the client cannot tell which roles it takes. Such a spec posts `place` as `observationAbout` and any other key as typed, and still refuses `observationAbout` naming `place`. The server replaces a spec's whole binding with the posted one, so a client posts the spec's own `identity.entities` with each role the caller names replaced by its dcids and each role the caller binds to null dropped. A vector gives the spec's `identity` and its `roles`. A vector that narrows adds the caller's `entities`, then either `posted`, the wire entities the build posts, or the `error` with its `reason` and the keys its message `names`, the typed key first. + +## File selector (`file-selector`) + +The file selector, `GET /datasets/{spec_id}/{content_version}/file`, redirects to a stored version's file in a rendering. A client asks it for a ref member's version when the files route at the stored digest refuses, or when the snapshot manifest lists no artifact of that digest. Its query holds the keys `query_keys` in `file-selector.json` lists, `format`, `bundle` and `layout`, in that order, each one the member's rendering holds, as `key=value` pairs joined by `&`, with booleans written `true` and `false`. The query leaves out `without_party_totals`: the version records the cut it was minted with, and the server lays that over the query. The server refuses any other key with 400 `request_invalid`, so a selector query that carried the cut would end the lookup. A vector gives the `rendering` and the `query` a client sends, without the leading `?`. diff --git a/python/client-contract/src/dfo_client_contract/rules/base-url.json b/python/client-contract/src/dfo_client_contract/rules/base-url.json index c53ffa5..b778e4e 100644 --- a/python/client-contract/src/dfo_client_contract/rules/base-url.json +++ b/python/client-contract/src/dfo_client_contract/rules/base-url.json @@ -172,6 +172,84 @@ "env": {}, "source": "argument", "url": "https://developmentfinance.org/api/v1" + }, + { + "name": "encoded-dot-segment-raises", + "base_url": "https://developmentfinance.org/api/%2e%2e/v1", + "env": {}, + "error": { + "reason": "base_url_invalid" + } + }, + { + "name": "mixed-encoded-dot-segment-raises", + "base_url": "https://developmentfinance.org/api/.%2E/v1", + "env": {}, + "error": { + "reason": "base_url_invalid" + } + }, + { + "name": "encoded-single-dot-segment-raises", + "base_url": "https://developmentfinance.org/api/%2E/v1", + "env": {}, + "error": { + "reason": "base_url_invalid" + } + }, + { + "name": "backslash-raises", + "base_url": "https://developmentfinance.org\\api\\v1", + "env": {}, + "error": { + "reason": "base_url_invalid" + } + }, + { + "name": "port-out-of-range-raises", + "base_url": "https://developmentfinance.org:99999/api/v1", + "env": {}, + "error": { + "reason": "base_url_invalid" + } + }, + { + "name": "port-zero-raises", + "base_url": "https://developmentfinance.org:0/api/v1", + "env": {}, + "error": { + "reason": "base_url_invalid" + } + }, + { + "name": "port-not-decimal-raises", + "base_url": "https://developmentfinance.org:abc/api/v1", + "env": {}, + "error": { + "reason": "base_url_invalid" + } + }, + { + "name": "empty-port-raises", + "base_url": "https://developmentfinance.org:/api/v1", + "env": {}, + "error": { + "reason": "base_url_invalid" + } + }, + { + "name": "highest-port-is-valid", + "base_url": "https://developmentfinance.org:65535/api/v1", + "env": {}, + "source": "argument", + "url": "https://developmentfinance.org:65535/api/v1" + }, + { + "name": "dot-inside-a-segment-is-valid", + "base_url": "https://developmentfinance.org/api/v1.%2e", + "env": {}, + "source": "argument", + "url": "https://developmentfinance.org/api/v1.%2e" } ] } diff --git a/python/client-contract/src/dfo_client_contract/rules/client-identity.json b/python/client-contract/src/dfo_client_contract/rules/client-identity.json index 1d7756c..480fb20 100644 --- a/python/client-contract/src/dfo_client_contract/rules/client-identity.json +++ b/python/client-contract/src/dfo_client_contract/rules/client-identity.json @@ -2,7 +2,7 @@ "format_version": 1, "rule": "client-identity", "header": "X-DFO-Client", - "pattern": "^(dfo-python|dfo-ts)/[0-9A-Za-z.+-]+ \\(([A-Za-z]+ [0-9]+\\.[0-9]+|browser)\\)$", + "pattern": "^(dfo-python|dfo-ts)/[0-9A-Za-z.+-]+ \\(([A-Za-z]+ [0-9]+\\.[0-9]+|browser|other)\\)$", "vectors": [ { "name": "python-cpython", @@ -93,6 +93,15 @@ }, "value": "dfo-ts/0.1.0 (browser)" }, + { + "name": "ts-other-runtime", + "client": "dfo-ts", + "version": "0.1.0", + "runtime": { + "name": "other" + }, + "value": "dfo-ts/0.1.0 (other)" + }, { "name": "ts-pre-release-package", "client": "dfo-ts", diff --git a/python/client-contract/src/dfo_client_contract/rules/file-selector.json b/python/client-contract/src/dfo_client_contract/rules/file-selector.json new file mode 100644 index 0000000..de7d35e --- /dev/null +++ b/python/client-contract/src/dfo_client_contract/rules/file-selector.json @@ -0,0 +1,47 @@ +{ + "format_version": 1, + "rule": "file-selector", + "query_keys": [ + "format", + "bundle", + "layout" + ], + "vectors": [ + { + "name": "long-cut", + "rendering": { + "format": "parquet", + "bundle": false, + "without_party_totals": true + }, + "query": "format=parquet&bundle=false" + }, + { + "name": "long-plain", + "rendering": { + "format": "parquet", + "bundle": false + }, + "query": "format=parquet&bundle=false" + }, + { + "name": "frame-cut", + "rendering": { + "format": "parquet", + "bundle": false, + "layout": "frame", + "without_party_totals": true + }, + "query": "format=parquet&bundle=false&layout=frame" + }, + { + "name": "keys-in-listed-order", + "rendering": { + "layout": "frame", + "bundle": true, + "format": "csv" + }, + "query": "format=csv&bundle=true&layout=frame" + } + ] +} diff --git a/python/client-contract/src/dfo_client_contract/rules/reading-order.json b/python/client-contract/src/dfo_client_contract/rules/reading-order.json index d4bb978..bd1db59 100644 --- a/python/client-contract/src/dfo_client_contract/rules/reading-order.json +++ b/python/client-contract/src/dfo_client_contract/rules/reading-order.json @@ -1394,6 +1394,134 @@ "dc/sv/gdp" ] ] + }, + { + "name": "integer-and-float-are-one-value", + "members": [ + { + "columns": [ + "time_period", + "value", + "currency", + "base_year" + ], + "rows": [ + [ + 2021, + 5, + "USD", + 2020 + ], + [ + 2020, + 4, + "USD", + 2020.0 + ] + ] + } + ], + "columns": [ + "time_period", + "value", + "currency", + "base_year" + ], + "rows": [ + [ + 2020, + 4, + "USD", + 2020.0 + ], + [ + 2021, + 5, + "USD", + 2020 + ] + ] + }, + { + "name": "nested-cells-compare-by-value", + "members": [ + { + "columns": [ + "time_period", + "value", + "meta", + "tags", + "flags" + ], + "rows": [ + [ + 2021, + 5, + { + "a": 1, + "b": 2 + }, + [ + 1 + ], + [ + true + ] + ], + [ + 2020, + 4, + { + "b": 2, + "a": 1 + }, + [ + 1.0 + ], + [ + 1 + ] + ] + ] + } + ], + "columns": [ + "time_period", + "value", + "flags", + "meta", + "tags" + ], + "rows": [ + [ + 2020, + 4, + [ + 1 + ], + { + "b": 2, + "a": 1 + }, + [ + 1.0 + ] + ], + [ + 2021, + 5, + [ + true + ], + { + "a": 1, + "b": 2 + }, + [ + 1 + ] + ] + ] } ] } 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 978a167..8ccf5b4 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 @@ -34,6 +34,9 @@ }, { "$ref": "#/$defs/role_keys" + }, + { + "$ref": "#/$defs/file_selector" } ], "$defs": { @@ -90,6 +93,10 @@ }, "layout": { "const": "frame" + }, + "without_party_totals": { + "description": "Present, and true, for a rendering with party totals left out.", + "const": true } } }, @@ -721,7 +728,7 @@ "$ref": "#/$defs/one_line" }, "runtime": { - "description": "The runtime's name and its full version, or `browser` with no version.", + "description": "The runtime's name and its full version, or `browser` or `other` with no version.", "type": "object", "additionalProperties": false, "required": [ @@ -741,7 +748,10 @@ "if": { "properties": { "name": { - "const": "browser" + "enum": [ + "browser", + "other" + ] } } }, @@ -865,7 +875,9 @@ "string", "number", "boolean", - "null" + "null", + "array", + "object" ] } } @@ -892,7 +904,9 @@ "string", "number", "boolean", - "null" + "null", + "array", + "object" ] } }, @@ -1121,6 +1135,54 @@ } } } + }, + "file_selector": { + "$ref": "#/$defs/suite", + "additionalProperties": false, + "required": [ + "query_keys" + ], + "properties": { + "format_version": true, + "rule": { + "const": "file-selector" + }, + "query_keys": { + "description": "The rendering keys the file selector reads, in the order a client writes them into its query.", + "type": "array", + "minItems": 1, + "uniqueItems": true, + "items": { + "type": "string", + "minLength": 1, + "$ref": "#/$defs/one_line" + } + }, + "vectors": { + "items": { + "type": "object", + "additionalProperties": false, + "required": [ + "name", + "rendering", + "query" + ], + "properties": { + "name": { + "$ref": "#/$defs/name" + }, + "rendering": { + "$ref": "#/$defs/rendering" + }, + "query": { + "description": "The selector's query a client sends for the rendering, without the leading `?`.", + "type": "string", + "minLength": 1 + } + } + } + } + } } } } 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 b44a8c5..c6e5752 100644 --- a/python/client-contract/src/dfo_client_contract/scenario.schema.json +++ b/python/client-contract/src/dfo_client_contract/scenario.schema.json @@ -398,7 +398,7 @@ } }, "mint_step": { - "description": "A mint of a spec, which starts its build and answers the operation; it takes a layout and no narrowing.", + "description": "A mint of a spec, which starts its build and answers the operation; it takes a layout and party totals as a fetch of a spec does, and no narrowing.", "type": "object", "additionalProperties": false, "required": [ @@ -414,6 +414,10 @@ }, "layout": { "$ref": "#/$defs/layout" + }, + "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" } } }, diff --git a/python/client-contract/src/dfo_client_contract/scenarios/choose-refused-label-in-two-groups.json b/python/client-contract/src/dfo_client_contract/scenarios/choose-refused-label-in-two-groups.json new file mode 100644 index 0000000..fb234df --- /dev/null +++ b/python/client-contract/src/dfo_client_contract/scenarios/choose-refused-label-in-two-groups.json @@ -0,0 +1,395 @@ +{ + "format_version": 1, + "name": "choose-refused-label-in-two-groups", + "description": "Both entity_choice groups offer an option labelled Congo [DRC], so the label matches two options and the choice raises InvalidRequestError with no request. A choice in such a part names its option by index.", + "origin": { + "kind": "synthetic", + "derived_from": "search-place-ambiguous-twice", + "edit": "A choice of \"Congo [DRC]\" follows the search." + }, + "call": [ + { + "op": "search", + "question": "aid from Congo to Congo" + }, + { + "op": "choose", + "option": "Congo [DRC]" + } + ], + "exchanges": [ + { + "request": { + "method": "POST", + "path": "/search/resolve", + "json": { + "schema_version": 1, + "input": { + "kind": "raw_text", + "query": "aid from Congo to Congo" + } + } + }, + "response": { + "status": 200, + "headers": { + "content-type": "application/json", + "x-dfo-trace-id": "14c23c7a7a01430eb3f485e658ae7e51" + }, + "json": { + "schema_version": 1, + "query_echo": { + "entry_path": "raw_text", + "raw_query": "aid from Congo to Congo", + "normalized_query": "aid from Congo to Congo", + "extract_skipped": false + }, + "diagnostics": { + "engine_build": "d80df9f5fd598b7345255470932d202ee5d49942", + "trace_id": "14c23c7a7a01430eb3f485e658ae7e51", + "warnings": [], + "timing_ms": { + "total": 1535, + "by_step": { + "coverage": 0, + "extract": 1020, + "cache_lookup": 0 + } + }, + "llm_usage": { + "input_tokens": 2226, + "output_tokens": 106, + "cached_tokens": 840 + }, + "timed_out": false + }, + "kind": "resolution", + "parts": [ + { + "variable_text": "aid", + "warnings": [], + "timing_ms": { + "total": 377, + "by_step": { + "recall": 377, + "phase_resolve_places": 0, + "phase_check_entities": 0 + } + }, + "rendered_sentence": "\"Congo\" (from) and \"Congo\" (to) each match more than one entity: \"Congo [DRC]\" and \"Congo [Republic]\". Be more specific.", + "sentence_plan": [ + { + "kind": "text", + "text": "\"", + "segment": "heading", + "entity_refs": [], + "states": [] + }, + { + "kind": "slot", + "text": "Congo", + "segment": "heading", + "role": "origin", + "entity_choice": 0, + "entity_refs": [], + "states": [] + }, + { + "kind": "text", + "text": "\" (from) and \"", + "segment": "heading", + "entity_refs": [], + "states": [] + }, + { + "kind": "slot", + "text": "Congo", + "axis": "where", + "segment": "heading", + "role": "destination", + "entity_choice": 1, + "entity_refs": [], + "states": [] + }, + { + "kind": "text", + "text": "\" (to) each match more than one entity: \"Congo [DRC]\" and \"Congo [Republic]\". Be more specific.", + "segment": "heading", + "entity_refs": [], + "states": [] + } + ], + "restatement": { + "variable_text": "aid", + "entities": [ + { + "text": "Congo", + "name": "Democratic Republic of the Congo", + "role_text": "from" + }, + { + "text": "Congo", + "name": "Republic of the Congo", + "role_text": "to" + } + ], + "sources": [], + "operations": [] + }, + "entity_refs": [ + { + "text": "Congo", + "refs": [] + }, + { + "text": "Congo", + "refs": [] + } + ], + "operations": [], + "departures": [], + "assumptions": [], + "status": "no_data", + "no_data": { + "reason": "entity_ambiguous", + "category": "unresolved", + "message": "\"Congo\" (from) and \"Congo\" (to) each match more than one entity: \"Congo [DRC]\" and \"Congo [Republic]\". Be more specific.", + "entity_terms": [ + "Congo", + "Congo" + ], + "ambiguous_entities": [ + { + "text": "Congo", + "candidates": [ + { + "ref": "country/COD", + "label": "Congo [DRC]", + "kind": "country" + }, + { + "ref": "country/COG", + "label": "Congo [Republic]", + "kind": "country" + } + ] + }, + { + "text": "Congo", + "candidates": [ + { + "ref": "country/COD", + "label": "Congo [DRC]", + "kind": "country" + }, + { + "ref": "country/COG", + "label": "Congo [Republic]", + "kind": "country" + } + ] + } + ], + "source_terms": [], + "ambiguous_sources": [], + "unbound_qualifiers": [], + "options": [ + { + "mentions": [ + "Congo" + ], + "label": "Congo [DRC]", + "data_query": { + "kind": "parsed", + "parts": [ + { + "variable_text": "aid", + "entities": [ + { + "text": "Congo", + "role_text": "from", + "dcid": "country/COD" + }, + { + "text": "Congo", + "name": "Republic of the Congo", + "role_text": "to" + } + ], + "sources": [], + "operations": [] + } + ] + }, + "entity_choice": 0 + }, + { + "mentions": [ + "Congo" + ], + "label": "Congo [Republic]", + "data_query": { + "kind": "parsed", + "parts": [ + { + "variable_text": "aid", + "entities": [ + { + "text": "Congo", + "role_text": "from", + "dcid": "country/COG" + }, + { + "text": "Congo", + "name": "Republic of the Congo", + "role_text": "to" + } + ], + "sources": [], + "operations": [] + } + ] + }, + "entity_choice": 0 + }, + { + "mentions": [ + "Congo" + ], + "label": "Congo [DRC]", + "data_query": { + "kind": "parsed", + "parts": [ + { + "variable_text": "aid", + "entities": [ + { + "text": "Congo", + "name": "Democratic Republic of the Congo", + "role_text": "from" + }, + { + "text": "Congo", + "role_text": "to", + "dcid": "country/COD" + } + ], + "sources": [], + "operations": [] + } + ] + }, + "entity_choice": 1 + }, + { + "mentions": [ + "Congo" + ], + "label": "Congo [Republic]", + "data_query": { + "kind": "parsed", + "parts": [ + { + "variable_text": "aid", + "entities": [ + { + "text": "Congo", + "name": "Democratic Republic of the Congo", + "role_text": "from" + }, + { + "text": "Congo", + "role_text": "to", + "dcid": "country/COG" + } + ], + "sources": [], + "operations": [] + } + ] + }, + "entity_choice": 1 + } + ] + } + } + ], + "rendered_sentence": "\"Congo\" (from) and \"Congo\" (to) each match more than one entity: \"Congo [DRC]\" and \"Congo [Republic]\". Be more specific.", + "sentence_plan": [ + { + "kind": "text", + "text": "\"", + "segment": "heading", + "entity_refs": [], + "states": [], + "part_index": 0 + }, + { + "kind": "slot", + "text": "Congo", + "segment": "heading", + "role": "origin", + "entity_choice": 0, + "entity_refs": [], + "states": [], + "part_index": 0 + }, + { + "kind": "text", + "text": "\" (from) and \"", + "segment": "heading", + "entity_refs": [], + "states": [], + "part_index": 0 + }, + { + "kind": "slot", + "text": "Congo", + "axis": "where", + "segment": "heading", + "role": "destination", + "entity_choice": 1, + "entity_refs": [], + "states": [], + "part_index": 0 + }, + { + "kind": "text", + "text": "\" (to) each match more than one entity: \"Congo [DRC]\" and \"Congo [Republic]\". Be more specific.", + "segment": "heading", + "entity_refs": [], + "states": [], + "part_index": 0 + } + ], + "status": "no_data" + } + } + } + ], + "expect": [ + { + "answer": { + "kind": "resolution", + "status": "no_data", + "sentence": "\"Congo\" (from) and \"Congo\" (to) each match more than one entity: \"Congo [DRC]\" and \"Congo [Republic]\". Be more specific.", + "complete": false, + "specs": [], + "gaps": [ + { + "part": 0, + "kind": "choice", + "options": 4 + } + ] + } + }, + { + "error": { + "class": "InvalidRequestError", + "code": "choice_invalid", + "trace_id": null + } + } + ] +} 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 2906e4f..f77ae51 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 @@ -951,7 +951,7 @@ { "request": { "method": "GET", - "path": "/datasets/spec_774d6c001a6250aa67ca676ab067895e/cv_b92d94774702c7f05f2075d0b03dd756/file?format=parquet&bundle=false&without_party_totals=true" + "path": "/datasets/spec_774d6c001a6250aa67ca676ab067895e/cv_b92d94774702c7f05f2075d0b03dd756/file?format=parquet&bundle=false" }, "response": { "status": 302, 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 85ed981..d5debee 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 @@ -1002,7 +1002,7 @@ { "request": { "method": "GET", - "path": "/datasets/spec_774d6c001a6250aa67ca676ab067895e/cv_b92d94774702c7f05f2075d0b03dd756/file?format=parquet&bundle=false&without_party_totals=true" + "path": "/datasets/spec_774d6c001a6250aa67ca676ab067895e/cv_b92d94774702c7f05f2075d0b03dd756/file?format=parquet&bundle=false" }, "response": { "status": 302, 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 9c27c02..4a1c656 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 @@ -243,7 +243,8 @@ "group_id": "groups/OECD.DAC" } } - } + }, + "party_totals": true }, { "op": "result" diff --git a/python/client-contract/tests/test_rules.py b/python/client-contract/tests/test_rules.py index fe7224f..4dc86d9 100644 --- a/python/client-contract/tests/test_rules.py +++ b/python/client-contract/tests/test_rules.py @@ -8,6 +8,7 @@ from __future__ import annotations import ipaddress +import math import ntpath import posixpath import re @@ -133,13 +134,20 @@ def look_up_key(vector: dict[str, Any]) -> tuple[str, str | None]: _NON_DECIMAL_IPV4 = re.compile(r"(?:[^:]*\.)?(?:0x[0-9a-f]*|[0-9]+)") +_PORT = re.compile(r"(?:\[[^\]]*\]|[^:]*)(?::([0-9]*))?") + + def is_valid_base_url(url: str) -> bool: - if re.search(r"[^\x21-\x7e]", url) or "?" in url or "#" in url: + if re.search(r"[^\x21-\x7e]|[?#\\]", url): return False parts = urlsplit(url) if parts.scheme not in ("http", "https") or "@" in parts.netloc: return False - if not parts.hostname or {".", ".."} & set(parts.path.split("/")): + segments = {s.lower().replace("%2e", ".") for s in parts.path.split("/")} + if not parts.hostname or {".", ".."} & segments: + return False + port = _PORT.fullmatch(parts.netloc) + if port is None or (port[1] is not None and not 1 <= int(port[1] or 0) <= 65535): return False host = parts.hostname.removesuffix(".") if _NON_DECIMAL_IPV4.fullmatch(host): @@ -195,6 +203,26 @@ def cache_entry(vector: dict[str, Any]) -> str: return f"manifests/{vector['spec_id']}/{vector['content_version']}/{key}.json" +def same_value(left: Any, right: Any) -> bool: + """Numbers by value, booleans apart from numbers, NaN as NaN, lists item + by item in order, structs field by field in any order.""" + if isinstance(left, bool) or isinstance(right, bool): + return type(left) is type(right) and left == right + if isinstance(left, float) and isinstance(right, float): + return left == right or (math.isnan(left) and math.isnan(right)) + if isinstance(left, list) and isinstance(right, list): + return len(left) == len(right) and all(map(same_value, left, right)) + if isinstance(left, dict) and isinstance(right, dict): + return left.keys() == right.keys() and all( + same_value(value, right[key]) for key, value in left.items() + ) + return left == right + + +def varies(column: str, rows: list[dict[str, Any]]) -> bool: + return any(not same_value(row.get(column), rows[0].get(column)) for row in rows) + + def reading_order( members: list[dict[str, Any]], reading: list[list[str]] ) -> tuple[list[str], list[list[Any]]]: @@ -212,19 +240,23 @@ def reading_order( if (name := next((n for n in names if n in served), None)) is not None ] rest = [c for c in served if c not in first and c != "stat_var"] - varies = {c for c in rest if len({repr(row.get(c)) for row in stacked}) > 1} + varying = {c for c in rest if varies(c, stacked)} columns = [ *(["part"] if len(members) > 1 else []), *first, - *[c for c in rest if c in varies], - *[c for c in rest if c not in varies], + *[c for c in rest if c in varying], + *[c for c in rest if c not in varying], *(["stat_var"] if "stat_var" in served else []), ] keys = [c for c in first if c not in ("value", "time_period")] - keys += [c for c in columns if c in varies] - if "stat_var" in served and len({repr(row.get("stat_var")) for row in stacked}) > 1: + keys += [c for c in columns if c in varying] + if "stat_var" in served and varies("stat_var", stacked): keys.append("stat_var") keys += ["time_period"] if "time_period" in first else [] + nested = { + c for row in stacked for c, v in row.items() if isinstance(v, list | dict) + } + keys = [k for k in keys if k not in nested] rows: list[list[Any]] = [] for part in dict.fromkeys(row["part"] for row in stacked): block = [row for row in stacked if row["part"] == part] @@ -235,7 +267,7 @@ def reading_order( def client_identity(client: str, version: str, runtime: dict[str, str]) -> str: label = runtime["name"] - if label != "browser": + if label not in ("browser", "other"): match = _MAJOR_MINOR.match(runtime["version"]) assert match, runtime label += f" {match[1]}.{match[2]}" @@ -280,6 +312,38 @@ def posted_entities( return posted +def selector_query(rendering: dict[str, Any]) -> str: + def written(value: Any) -> str: + return ("true" if value else "false") if isinstance(value, bool) else value + + return "&".join( + f"{key}={written(rendering[key])}" + for key in rule("file-selector")["query_keys"] + if key in rendering + ) + + +# The cells `same_value` judges, the same cases as the validator's tests; +# NaN has no JSON form, so no vector can carry it. +SAME_VALUE_CASES = [ + (1, 1.0, True), + (True, 1, False), + (float("nan"), float("nan"), True), + (None, None, True), + ("1", 1, False), + ([True], [1], False), + ([float("nan")], [float("nan")], True), + ([1], [1.0], True), + ({"a": 1, "b": 2}, {"b": 2, "a": 1.0}, True), + ({"a": True}, {"a": 1}, False), +] + + +@pytest.mark.parametrize(("left", "right", "same"), SAME_VALUE_CASES) +def test_same_value(left: Any, right: Any, same: bool) -> None: + assert same_value(left, right) is same + + @pytest.mark.parametrize("name", RULES) def test_every_rule_has_vectors(name: str) -> None: assert rule(name)["rule"] == name @@ -383,3 +447,8 @@ def test_role_keys(vector: dict[str, Any]) -> None: elif "entities" in vector: posted = posted_entities(vector["identity"], vector["entities"]) assert posted == vector["posted"] + + +@pytest.mark.parametrize("vector", _vectors("file-selector"), ids=_ids("file-selector")) +def test_file_selector(vector: dict[str, Any]) -> None: + assert selector_query(vector["rendering"]) == vector["query"] diff --git a/python/spec-kit/CHANGELOG.md b/python/spec-kit/CHANGELOG.md index 66d1003..d2b6879 100644 --- a/python/spec-kit/CHANGELOG.md +++ b/python/spec-kit/CHANGELOG.md @@ -79,8 +79,11 @@ and this package adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 `release_mismatch` at 503, the statuses the Presentation write routes serve. `presentation.render` keeps 422 for the first two and 409 for the rest. `frame_unavailable` covers a frame that is not held in a state - Presentation can load, and its definition names each case. A frame store - that fails to answer is `service_unavailable`. + Presentation can load, and its definition names each case. A frame whose + stored artifact the store fails to read is also `frame_unavailable`, served + at 503 and retryable; the registry holds one status for each endpoint and + channel, so it records the 404 the write routes serve for every other + case. - Code `edit_conflict` maps to `presentation.render` at 409, for a render of a component that has no current revision, and its definition names that case. diff --git a/tools/README.md b/tools/README.md index d52b523..b2d73e8 100644 --- a/tools/README.md +++ b/tools/README.md @@ -38,13 +38,13 @@ 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, layout and, for a fetch, party totals give, each dataset's columns are the reading-order rule's order of the downloaded Parquet files' columns, 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 reading-order vector orders its columns and rows 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: +`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 or a mint, party totals give, each dataset's columns are the reading-order rule's order of the downloaded Parquet files' columns, 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, each reading-order vector orders its columns and rows as the rule does, and each file-selector vector's query is the one the rule builds. 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 ``` -`capture_client_contract.py` refreshes the client contract from dfo-apis. `openapi --dfo-apis PATH` builds the composed app in that checkout's environment, in process, and writes `served/openapi.json` and `served/SOURCE.json`, refusing a checkout with uncommitted changes or untracked files and an environment out of step with its `uv.lock`; `record` runs the contract's scenarios against a base URL, dev by default, writes the records with every absolute URL's query redacted and a local app's signed URLs written as storage URLs, refusing a record that still names any other host, derives the synthetic ones and validates the result, and `record --offline` derives the outcomes again from the records with no request. A recorded scenario holds only exchanges the server made. `record` refuses a recorded scenario that a canned exchange answered, and a synthetic derivation makes no request. Nothing in a record marks an exchange as canned, so `validate_client_contract.py` cannot check this rule and the capture enforces it. It reads and writes a binary body only through a bare file name beside its record, and refuses a name that is absolute or leaves that directory, or a symlink, before it reads or writes anything. It imports its outcome rules from `validate_client_contract.py`. `python/client-contract/README.md` has the recipe. A PEP 723 script whose tests run without network or pyarrow: +`capture_client_contract.py` refreshes the client contract from dfo-apis. `openapi --dfo-apis PATH` builds the composed app in that checkout's environment, in process, and writes `served/openapi.json` and `served/SOURCE.json`, refusing a checkout with uncommitted changes or untracked files and an environment out of step with its `uv.lock`; `record` runs the contract's scenarios against a base URL, dev by default, writes the records with every absolute URL's query redacted and a local app's signed URLs written as storage URLs, refusing a record that still names any other host, derives the synthetic ones and validates the result, and `record --offline` derives the outcomes again from the records with no request. A recorded scenario holds only exchanges the server made. `record` refuses a recorded scenario that a canned exchange answered, and a synthetic derivation makes no request. Nothing in a record marks an exchange as canned, so `validate_client_contract.py` cannot check this rule and the capture enforces it. It reads and writes a binary body only through a bare file name beside its record, and refuses a name that is absolute or leaves that directory, or a symlink, before it reads or writes anything. It imports its outcome rules from `validate_client_contract.py`. `python/client-contract/README.md` has the recipe. A PEP 723 script whose tests run without network: ```bash uv run tools/capture_client_contract.py record diff --git a/tools/capture_client_contract.py b/tools/capture_client_contract.py index 1f71bca..d2f108d 100644 --- a/tools/capture_client_contract.py +++ b/tools/capture_client_contract.py @@ -110,6 +110,7 @@ header_warnings, held_spec, load_reading_columns, + load_selector_keys, may_retry, newest_plain, owns_body_file, @@ -120,7 +121,7 @@ problem_body, read_from, refusal_error, - rendering_for, + resumed_rendering, resubmitted_sentence, retry_wait, scenarios_size, @@ -150,9 +151,6 @@ # 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 reading-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`. @@ -592,6 +590,7 @@ def ref(self) -> dict[str, Any]: def dataset_outcome( members: Sequence[Member], + reading: Sequence[Sequence[str]], *, missing: Sequence[Mapping[str, Any]] = (), search_warning: bool | None = None, @@ -610,13 +609,8 @@ def dataset_outcome( for member in members ] dataset: dict[str, Any] = {"rows": sum(member.rows for member in members)} - if READING_COLUMNS is None: - raise SystemExit( - "rules/reading-order.json is missing or holds no reading_columns, so " - "no dataset's columns can be ordered" - ) dataset["columns"] = presented_columns( - [member.table for member in members], READING_COLUMNS + [member.table for member in members], reading ) if len(members) > 1: dataset["part_rows"] = [ @@ -627,10 +621,6 @@ def dataset_outcome( return {"dataset": {**dataset, **summary}} -def parquet_shape(data: bytes) -> ServedTable: - return served_table(data) - - def _reached[T](results: list[T], step: str) -> T: """The result a step produced. A step that refused cannot be acted on.""" if not results: @@ -652,13 +642,16 @@ class Minted: """The operation a mint started or a resume read: its resource, the headers that came with it, the build request a failed operation posts again (None for a resumed one), the spec the client holds, and the - rendering it downloads.""" + rendering the build posted, or for a resumed operation None and the + layout whose rendering `resumed_rendering` reads from the done + manifest.""" resource: dict[str, Any] headers: dict[str, str] request: dict[str, Any] | None spec: Spec | None - rendering: dict[str, Any] + rendering: dict[str, Any] | None + layout: str | None = None def _step_options( @@ -677,6 +670,36 @@ def _step_options( return step +@dataclass(frozen=True, slots=True) +class ClientRules: + """The rule tables a client reads from `rules/`: the reading-order rule's + reading slots and the file-selector rule's query keys.""" + + reading: Sequence[Sequence[str]] + selector_keys: Sequence[str] + + +def load_client_rules(package_dir: Path) -> ClientRules: + """The rule tables under `package_dir`, read before any request. + + Raises: + SystemExit: A rule file is missing or does not hold its table. + """ + reading = load_reading_columns(package_dir) + if reading is None: + raise SystemExit( + f"{package_dir / 'rules' / 'reading-order.json'} is missing or holds no " + "reading_columns, so no dataset's columns can be ordered" + ) + selector_keys = load_selector_keys(package_dir) + if selector_keys is None: + raise SystemExit( + f"{package_dir / 'rules' / 'file-selector.json'} is missing or holds no " + "query_keys, so no file selector query can be built" + ) + return ClientRules(reading, selector_keys) + + @dataclass class Session: """A client over a recorder: each step appends to `call` and `expect`.""" @@ -684,7 +707,8 @@ class Session: recorder: Recorder actions: Mapping[str, Mapping[str, Any]] client_codes: Mapping[str, Mapping[str, Any]] - read_shape: Callable[[bytes], ServedTable] = parquet_shape + rules: ClientRules + read_shape: Callable[[bytes], ServedTable] = served_table sleep: Callable[[float], None] = time.sleep call: list[dict[str, Any]] = field(default_factory=list) expect: list[dict[str, Any]] = field(default_factory=list) @@ -819,7 +843,9 @@ def run() -> dict[str, Any]: self.build(parts, spec, None, rendering, strict=strict) for parts, spec in readings ] - return dataset_outcome(members, missing=gaps, search_warning=warns) + return dataset_outcome( + members, self.rules.reading, missing=gaps, search_warning=warns + ) options = _step_options( step, layout=layout, strict=strict, party_totals=party_totals @@ -856,7 +882,7 @@ def fetch_spec( def run() -> dict[str, Any]: rendering = fetch_rendering(layout, party_totals=party_totals) built.append(self.build([], spec, scope, rendering, strict=strict)) - return dataset_outcome(built) + return dataset_outcome(built, self.rules.reading) options = _step_options( step, layout=layout, strict=strict, party_totals=party_totals @@ -868,7 +894,9 @@ def fetch_ref(self, ref: dict[str, Any]) -> None: """The exact versions a ref names, through the lookup order.""" def run() -> dict[str, Any]: - return dataset_outcome([self._stored(member) for member in ref["members"]]) + return dataset_outcome( + [self._stored(member) for member in ref["members"]], self.rules.reading + ) self._step({"op": "fetch", "ref": ref}, run) @@ -883,11 +911,13 @@ def run() -> dict[str, Any]: self._step({"op": "newest_version", "spec": spec.step()}, run) return found[0] if found else None - def mint(self, spec: Spec, *, layout: str | None = None) -> str: + def mint( + self, spec: Spec, *, layout: str | None = None, party_totals: bool = False + ) -> str: operation: list[str] = [] def run() -> dict[str, Any]: - rendering = rendering_for(layout) + rendering = fetch_rendering(layout, party_totals=party_totals) body = _build_body(spec, None, rendering) response = self._api("POST", "/datasets", body) resource = self._acted(response) @@ -900,7 +930,10 @@ def run() -> dict[str, Any]: self._step( _step_options( - {"op": "mint", "spec": spec.step()}, layout=layout, strict=False + {"op": "mint", "spec": spec.step()}, + layout=layout, + strict=False, + party_totals=party_totals, ), run, ) @@ -913,9 +946,7 @@ def run() -> dict[str, Any]: path = POLL_PATH.format(operation_id=operation_id) response = self._api("GET", path) resource = self._acted(response) - self.minted = Minted( - resource, response.headers, None, None, rendering_for(layout) - ) + self.minted = Minted(resource, response.headers, None, None, None, layout) return _operation_outcome(resource) step = {"op": "operation", "operation_id": operation_id} @@ -929,8 +960,9 @@ def result(self) -> None: def run() -> dict[str, Any]: manifest = self._wait(minted.resource, minted.headers, minted.request) - member = self._member([], minted.spec, manifest, minted.rendering, False) - return dataset_outcome([member]) + rendering = minted.rendering or resumed_rendering(minted.layout, manifest) + member = self._member([], minted.spec, manifest, rendering, False) + return dataset_outcome([member], self.rules.reading) self._step({"op": "result"}, run) @@ -1136,6 +1168,7 @@ def _stored_file( member["spec"]["spec_id"], member["content_version"], member["artifact"]["rendering"], + self.rules.selector_keys, ) try: return self._download(path, digest, origin=False), None @@ -1243,7 +1276,9 @@ def _build_body( # version the server has built answers inline, so each long build needs a spec # the server has not built, and the run takes the first start year in # LONG_BUILD_YEARS whose spec it has not. Each record builds both for good, so -# the next record takes later start years. A flow side the question leaves unnamed +# the next record starts the scan at the year after the one LONG_BUILD_RECORDS +# holds, and a later start year estimates fewer rows, so the scan stops at the +# first year below the band. A flow side the question leaves unnamed # reads as its source's whole total, so both sides name groups read as their # members: about 3,700 donor and recipient pairs of one variable over some 60 # years. A variable broken down by sector would list thousands of variables in @@ -1253,6 +1288,8 @@ def _build_body( " from {year} to 2024" ) LONG_BUILD_YEARS = range(1960, 2001) +# The record holding each donor group's last long build. +LONG_BUILD_RECORDS = {"DAC": "mint-async-build", "OECD": "operation-resume"} NARROW_WINDOW = (2020, 2023) REBOUND_ORIGIN = "country/FRA" # The DAC donors' flow to the G77, narrowed to one recipient and year with its @@ -1274,7 +1311,10 @@ class Context: transport: Transport actions: Mapping[str, Mapping[str, Any]] client_codes: Mapping[str, Mapping[str, Any]] - read_shape: Callable[[bytes], ServedTable] = parquet_shape + rules: ClientRules + read_shape: Callable[[bytes], ServedTable] = served_table + # The first start year `async_spec` tries for each donor group. + long_build_starts: Mapping[str, int] = field(default_factory=dict) _cache: dict[str, Any] = field(default_factory=dict) def session(self, name: str, **recorder: Any) -> Session: @@ -1282,6 +1322,7 @@ def session(self, name: str, **recorder: Any) -> Session: Recorder(name, self.base_url, self.transport, **recorder), self.actions, self.client_codes, + self.rules, read_shape=self.read_shape, ) @@ -1330,25 +1371,39 @@ def definite_ref(self) -> dict[str, Any]: def async_spec(self, donors: str) -> Spec: """The spec the LONG_BUILD question for `donors` answers at the first - start year in LONG_BUILD_YEARS whose answer is one definite part, whose - estimate is just above the sync budget, and whose spec no earlier year - or other donors answered and the server has not built. No such year - raises ShapeError.""" + start year in LONG_BUILD_YEARS, from `long_build_starts`, whose answer + is one definite part, whose estimate is just above the sync budget, + and whose spec no earlier year or other donors answered and the server + has not built. A year whose estimate is at or below the budget ends + the scan, since later years estimate fewer rows. + + Raises: + ShapeError: No year gives such a spec. + """ picks: dict[str, Spec] = self._cache.setdefault("long builds", {}) if donors not in picks: session = self.session("prerequisite") seen = {spec.spec_id for spec in picks.values()} - for year in LONG_BUILD_YEARS: + first = max(self.long_build_starts.get(donors, 0), LONG_BUILD_YEARS[0]) + for year in range(first, LONG_BUILD_YEARS[-1] + 1): answer = session.search(LONG_BUILD.format(donors=donors, year=year)) if answer.status != "definite" or len(answer.parts) != 1: continue (part,) = answer.parts - rows = part["spec"]["resolved"].get("download", {}).get("rows") or 0 + rows = part["spec"]["resolved"].get("download", {}).get("rows") + if rows is None: + continue spec = _part_spec(part["spec"]) + if rows <= SYNC_ROWS: + raise ShapeError( + f"the {donors} donors have no long build left: from {year} " + f"the estimate, {rows:,} rows, is within the {SYNC_ROWS:,}-row " + "sync budget; change LONG_BUILD to a question with more rows" + ) # A start year before the source's first year clips to the same # spec as the years after it, so a spec already seen is built or # is the other donors' pick. - if not SYNC_ROWS < rows < 2 * SYNC_ROWS or spec.spec_id in seen: + if rows >= 2 * SYNC_ROWS or spec.spec_id in seen: continue seen.add(spec.spec_id) # `_newest` and not `newest_version`, which reads a refused @@ -1358,7 +1413,7 @@ def async_spec(self, donors: str) -> Spec: break else: raise ShapeError( - f"no start year from {LONG_BUILD_YEARS[0]} to" + f"no start year from {first} to" f" {LONG_BUILD_YEARS[-1]} gives the {donors} donors a spec" " just above the sync budget that the server has not built" ) @@ -1368,7 +1423,7 @@ def running_operation(self) -> str: """The id of a long build another process started.""" if "operation" not in self._cache: self._cache["operation"] = self.session("prerequisite").mint( - self.async_spec("OECD") + self.async_spec("OECD"), party_totals=True ) return self._cache["operation"] @@ -1540,7 +1595,7 @@ def _fetch_ref_unknown_version(s: Session, ctx: Context) -> None: def _mint_async(s: Session, ctx: Context) -> None: - s.mint(ctx.async_spec("DAC")) + s.mint(ctx.async_spec("DAC"), party_totals=True) s.result() @@ -2490,6 +2545,7 @@ def _expired_file_selector(parent: dict[str, Any], ctx: Context) -> Derived: member["spec"]["spec_id"], member["content_version"], member["artifact"]["rendering"], + ctx.rules.selector_keys, ) selector = { "request": {"method": "GET", "path": path}, @@ -2823,6 +2879,7 @@ def _artifact_unlisted(parent: dict[str, Any], ctx: Context) -> Derived: member["spec"]["spec_id"], member["content_version"], member["artifact"]["rendering"], + ctx.rules.selector_keys, ) exchanges[index]["request"] = {"method": "GET", "path": path} return _same(parent, exchanges) @@ -4425,6 +4482,15 @@ def _empty_narrowing(parent: dict[str, Any], ctx: Context) -> Derived: "request.", _choice_refused("Congo [Nowhere]"), ), + Synthetic( + "choose-refused-label-in-two-groups", + "search-place-ambiguous-twice", + 'A choice of "Congo [DRC]" follows the search.', + "Both entity_choice groups offer an option labelled Congo [DRC], so the label " + "matches two options and the choice raises InvalidRequestError with no request. " + "A choice in such a part names its option by index.", + _choice_refused("Congo [DRC]"), + ), Synthetic( "choose-candidate-by-label", "answer-candidates-choose-fetch", @@ -4690,6 +4756,7 @@ def drive(session: Session, call: Sequence[dict[str, Any]]) -> None: session.mint( _step_spec(spec), layout=step.get("layout"), + party_totals=step.get("party_totals", False), ) case {"op": "operation", "operation_id": operation_id}: session.resume(operation_id, layout=step.get("layout")) @@ -4709,6 +4776,7 @@ def rederive_recorded(name: str, ctx: Context, directory: Path) -> None: Recorder(name, served.base_url, served), ctx.actions, ctx.client_codes, + ctx.rules, read_shape=ctx.read_shape, sleep=lambda _: None, ) @@ -4728,6 +4796,37 @@ def rederive_recorded(name: str, ctx: Context, directory: Path) -> None: ) +def recorded_start_year(record: Mapping[str, Any]) -> int | None: + """The start year of the first window a record's spec definitions + request: a step's spec, then a manifest an exchange answers.""" + definitions = [ + step["spec"]["definition"] for step in record["call"] if "spec" in step + ] + for exchange in record["exchanges"]: + body = exchange["response"].get("json") + manifest = body.get("manifest", body) if isinstance(body, dict) else None + if isinstance(manifest, dict) and "definition" in manifest: + definitions.append(manifest["definition"]) + for definition in definitions: + window = definition.get("identity", {}).get("requested_window") or {} + if "start_year" in window: + return window["start_year"] + return None + + +def long_build_starts(directory: Path) -> dict[str, int]: + """The first start year to try for each donor group: the year after the + one its LONG_BUILD_RECORDS record built, which the server has built.""" + starts = {} + for donors, name in LONG_BUILD_RECORDS.items(): + path = directory / f"{name}.json" + if path.exists(): + year = recorded_start_year(json.loads(path.read_text(encoding="utf-8"))) + if year is not None: + starts[donors] = year + 1 + return starts + + def run_record(args: argparse.Namespace) -> int: package_dir: Path = args.package_dir directory: Path = args.scenarios_dir or package_dir / "scenarios" @@ -4741,7 +4840,18 @@ def run_record(args: argparse.Namespace) -> int: _offline if args.offline else urllib_transport, load_actions(package_dir), load_client_codes(package_dir), + load_client_rules(package_dir), + long_build_starts=long_build_starts(directory), ) + if not args.offline: + # A long build's spec is the scan most likely to fail, so it runs + # before any scenario is recorded. + for donors, name in LONG_BUILD_RECORDS.items(): + if name in chosen: + try: + ctx.async_spec(donors) + except ShapeError as exc: + raise SystemExit(f"{name}: {exc}") from exc count = 0 for definition in RECORDED: if definition.name not in chosen: diff --git a/tools/tests/test_capture_client_contract.py b/tools/tests/test_capture_client_contract.py index 9954ced..ba71bdf 100644 --- a/tools/tests/test_capture_client_contract.py +++ b/tools/tests/test_capture_client_contract.py @@ -32,6 +32,7 @@ SCENARIOS = capture.PACKAGE_DIR / "scenarios" ACTIONS = capture.load_actions(capture.PACKAGE_DIR) CLIENT_CODES = capture.load_client_codes(capture.PACKAGE_DIR) +RULES = capture.load_client_rules(capture.PACKAGE_DIR) def _load(name: str) -> dict[str, Any]: @@ -75,7 +76,7 @@ def test_the_recorder_reproduces_each_record_from_its_steps(name: str) -> None: served = capture.Served(record, SCENARIOS) recorder = capture.Recorder(name, served.base_url, served) session = capture.Session( - recorder, ACTIONS, CLIENT_CODES, read_shape=_shape, sleep=lambda _: None + recorder, ACTIONS, CLIENT_CODES, RULES, read_shape=_shape, sleep=lambda _: None ) capture.drive(session, record["call"]) assert served.pending == [], "the client skipped a recorded exchange" @@ -236,7 +237,11 @@ def test_each_derived_record_follows_from_its_parent(name: str) -> None: definition = next(d for d in capture.SYNTHETIC if d.name == name) parent = _load(record["origin"]["derived_from"]) ctx = capture.Context( - capture.DEV_BASE_URL, capture.Served(parent, SCENARIOS), ACTIONS, CLIENT_CODES + capture.DEV_BASE_URL, + capture.Served(parent, SCENARIOS), + ACTIONS, + CLIENT_CODES, + RULES, ) derived = definition.derive(copy.deepcopy(parent), ctx) assert record["origin"]["edit"] == definition.edit @@ -253,7 +258,12 @@ def test_an_offline_rederivation_rewrites_only_the_expect(tmp_path: Path) -> Non stale["expect"][1]["error"]["code"] = None capture.write_record(tmp_path, stale, {}) ctx = capture.Context( - capture.DEV_BASE_URL, capture._offline, ACTIONS, CLIENT_CODES, read_shape=_shape + capture.DEV_BASE_URL, + capture._offline, + ACTIONS, + CLIENT_CODES, + RULES, + read_shape=_shape, ) capture.rederive_recorded(name, ctx, tmp_path) fresh = (tmp_path / f"{name}.json").read_text(encoding="utf-8") @@ -287,7 +297,12 @@ def test_an_offline_rederivation_refuses_a_body_file_outside_its_directory( exchange["response"]["body_file"] = body_file record.write_text(json.dumps(stale), encoding="utf-8") ctx = capture.Context( - capture.DEV_BASE_URL, capture._offline, ACTIONS, CLIENT_CODES, read_shape=_shape + capture.DEV_BASE_URL, + capture._offline, + ACTIONS, + CLIENT_CODES, + RULES, + read_shape=_shape, ) with pytest.raises(SystemExit) as refused: capture.rederive_recorded(name, ctx, scenarios) @@ -342,7 +357,7 @@ def transport(method: str, url: str, **kwargs: Any) -> Any: raise AssertionError(f"{method} {url} reached the network") definition = capture.Recorded("s", "None.", run) - ctx = capture.Context(capture.DEV_BASE_URL, transport, ACTIONS, CLIENT_CODES) + ctx = capture.Context(capture.DEV_BASE_URL, transport, ACTIONS, CLIENT_CODES, RULES) with pytest.raises(SystemExit, match="1 were canned"): capture.record_recorded(definition, ctx, tmp_path) assert list(tmp_path.iterdir()) == [] @@ -358,7 +373,7 @@ def transport(method: str, url: str, **kwargs: Any) -> Any: raise AssertionError(f"{method} {url} reached the network") definition = capture.Synthetic("s", "parent", "None.", "None.", derive) - ctx = capture.Context(capture.DEV_BASE_URL, transport, ACTIONS, CLIENT_CODES) + ctx = capture.Context(capture.DEV_BASE_URL, transport, ACTIONS, CLIENT_CODES, RULES) with pytest.raises(SystemExit, match="makes no request"): capture.record_synthetic(definition, ctx, tmp_path) @@ -427,15 +442,15 @@ def test_several_members_stack_with_a_part_column_first() -> None: 3, ["value", "time_period"], ) - dataset = capture.dataset_outcome([member, unnamed])["dataset"] + dataset = capture.dataset_outcome([member, unnamed], RULES.reading)["dataset"] 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"] - columns = capture.dataset_outcome([member])["dataset"]["columns"] + assert "part_rows" not in capture.dataset_outcome([other], RULES.reading)["dataset"] + columns = capture.dataset_outcome([member], RULES.reading)["dataset"]["columns"] assert columns == ["value", "x", "stat_var"] @@ -553,10 +568,34 @@ def fake_run(args: list[str], **kwargs: Any) -> Any: } +@pytest.mark.parametrize("rule", ["reading-order", "file-selector"]) +def test_a_record_run_without_a_rule_table_stops_before_any_request( + tmp_path: Path, monkeypatch: pytest.MonkeyPatch, rule: str +) -> None: + """The rule tables load from --package-dir when the run starts, so a + broken one costs no live call.""" + for name in ("actions.json", "client-codes.json"): + (tmp_path / name).write_bytes((capture.PACKAGE_DIR / name).read_bytes()) + (tmp_path / "rules").mkdir() + for path in (capture.PACKAGE_DIR / "rules").glob("*.json"): + if path.stem != rule: + (tmp_path / "rules" / path.name).write_bytes(path.read_bytes()) + + def transport(method: str, url: str, **kwargs: Any) -> Any: + raise AssertionError(f"{method} {url} reached the network") + + monkeypatch.setattr(capture, "urllib_transport", transport) + with pytest.raises(SystemExit, match=f"{rule}.json is missing"): + capture.main( + ["--package-dir", str(tmp_path), "record", "--only", "answer-declined"] + ) + + def _long_build_ctx( monkeypatch: pytest.MonkeyPatch, - answers: Mapping[tuple[str, int], tuple[str, int]], + answers: Mapping[tuple[str, int], tuple[str, int | None]], built: set[str], + starts: Mapping[str, int] | None = None, ) -> tuple[Any, list[str], list[str]]: """A context whose searches answer `answers`, (donors, year) to spec id and row estimate, and whose versions route lists a version of each spec @@ -582,7 +621,14 @@ def newest(self: Any, spec_id: str) -> str | None: monkeypatch.setattr(capture.Session, "search", search) monkeypatch.setattr(capture.Session, "_newest", newest) - ctx = capture.Context(capture.DEV_BASE_URL, capture._offline, ACTIONS, CLIENT_CODES) + ctx = capture.Context( + capture.DEV_BASE_URL, + capture._offline, + ACTIONS, + CLIENT_CODES, + RULES, + long_build_starts=starts or {}, + ) return ctx, questions, probed @@ -595,7 +641,7 @@ def test_a_long_build_takes_the_first_unbuilt_spec_in_the_band( ctx, questions, probed = _long_build_ctx( monkeypatch, { - ("DAC", 1960): ("spec_small", capture.SYNC_ROWS), + ("DAC", 1960): ("spec_large", 2 * capture.SYNC_ROWS), ("DAC", 1961): ("spec_built", in_band), ("DAC", 1962): ("spec_built", in_band), ("DAC", 1963): ("spec_dac", in_band), @@ -623,3 +669,73 @@ def test_a_long_build_with_no_unbuilt_year_is_refused( ) with pytest.raises(capture.ShapeError, match="from 1960 to 1961"): ctx.async_spec("DAC") + + +def test_a_long_build_scan_stops_at_the_first_year_within_the_budget( + monkeypatch: pytest.MonkeyPatch, +) -> None: + """A later start year estimates fewer rows, so none after it can be in + the band, and the scan stops without searching them.""" + ctx, questions, _ = _long_build_ctx( + monkeypatch, + { + ("DAC", 1960): ("spec_a", capture.SYNC_ROWS), + ("DAC", 1961): ("spec_b", capture.SYNC_ROWS + 1), + }, + set(), + ) + with pytest.raises(capture.ShapeError, match="no long build left: from 1960"): + ctx.async_spec("DAC") + assert len(questions) == 1 + + +def test_a_long_build_scan_starts_after_the_recorded_year( + monkeypatch: pytest.MonkeyPatch, +) -> None: + in_band = capture.SYNC_ROWS + 1 + ctx, questions, _ = _long_build_ctx( + monkeypatch, + {("DAC", 1960): ("spec_a", in_band), ("DAC", 1968): ("spec_b", in_band)}, + set(), + starts={"DAC": 1968}, + ) + assert ctx.async_spec("DAC").spec_id == "spec_b" + assert questions == [capture.LONG_BUILD.format(donors="DAC", year=1968)] + + +def test_the_long_build_scans_start_after_the_recorded_picks() -> None: + """The records hold the DAC pick at 1967 and the OECD pick at 1968.""" + assert capture.long_build_starts(SCENARIOS) == {"DAC": 1968, "OECD": 1969} + + +def test_a_long_build_scan_skips_a_year_without_an_estimate( + monkeypatch: pytest.MonkeyPatch, +) -> None: + ctx, _, _ = _long_build_ctx( + monkeypatch, + { + ("DAC", 1960): ("spec_a", None), + ("DAC", 1961): ("spec_b", capture.SYNC_ROWS + 1), + }, + set(), + ) + assert ctx.async_spec("DAC").spec_id == "spec_b" + + +def test_the_running_operation_keeps_party_totals( + monkeypatch: pytest.MonkeyPatch, +) -> None: + """The operation another process starts posts the plain rendering, which + the recorded resume and result read.""" + ctx, _, _ = _long_build_ctx( + monkeypatch, {("OECD", 1960): ("spec_oecd", capture.SYNC_ROWS + 1)}, set() + ) + minted: list[dict[str, Any]] = [] + + def mint(self: Any, spec: Any, **options: Any) -> str: + minted.append(options) + return "op_x" + + monkeypatch.setattr(capture.Session, "mint", mint) + assert ctx.running_operation() == "op_x" + assert minted == [{"party_totals": True}] diff --git a/tools/tests/test_validate_client_contract.py b/tools/tests/test_validate_client_contract.py index 9dffff3..ee02a33 100644 --- a/tools/tests/test_validate_client_contract.py +++ b/tools/tests/test_validate_client_contract.py @@ -27,6 +27,8 @@ from typing import Any from urllib.parse import urlsplit +import pyarrow as pa +import pyarrow.parquet as pq import pytest _MODULE_PATH = Path(__file__).resolve().parent.parent / "validate_client_contract.py" @@ -165,14 +167,23 @@ def change(outcome: Any) -> None: return change +def _selector_query_with_cut(doc: Any) -> None: + """The file selector request asks for the ref member's whole rendering, + `without_party_totals` included, which the server refuses.""" + exchange = next( + e for e in doc["exchanges"] if "/file?" in e["request"].get("path", "") + ) + exchange["request"]["path"] += "&without_party_totals=true" + + def _vector(name: str, change: Callable[[Any], None]) -> Callable[[Any], None]: return lambda doc: change(next(v for v in doc["vectors"] if v["name"] == name)) def _served_order_after_reading_columns(holder: Any) -> None: """Moves the varying co-operation modality pair back to its served place, - just before `crsPurpose`, as the rule placed it before it put varying - columns ahead of constant ones.""" + just before `crsPurpose`, an order that ignores whether a column + varies.""" columns = holder["dataset"]["columns"] if "dataset" in holder else holder["columns"] varying = ["crsCooperationModality", "crsCooperationModality_label"] for name in varying: @@ -1715,6 +1726,14 @@ def change(doc: Any) -> None: "the steps: _UnfitError('exchange 0 posts" ), ), + ( + "scenarios/mint-async-build.json", + lambda doc: doc["call"][0].pop("party_totals"), + ( + "scenarios/mint-async-build.json: the exchanges do not fit the " + "steps: _UnfitError('exchange 0 posts" + ), + ), ( _FETCH, _set_outcome(0, lambda o: o["dataset"]["columns"].reverse()), @@ -1788,6 +1807,60 @@ def change(doc: Any) -> None: "reading_columns" ), ), + ( + "rules/reading-order.json", + _vector( + "ties-keep-served-order", lambda v: v["members"][0]["rows"][0].pop() + ), + "vector 'ties-keep-served-order' member 0 has a row of", + ), + ( + "rules/reading-order.json", + _vector( + "ties-keep-served-order", + lambda v: v["members"][0]["rows"][0].__setitem__(4, "2022"), + ), + "vector 'ties-keep-served-order' mixes JSON types in column", + ), + ( + "scenarios/fetch-ref-expired-file-selector.json", + _selector_query_with_cut, + ( + "scenarios/fetch-ref-expired-file-selector.json: the exchanges do " + "not fit the steps" + ), + ), + ( + "scenarios/fetch-ref-artifact-unlisted.json", + _selector_query_with_cut, + ( + "scenarios/fetch-ref-artifact-unlisted.json: the exchanges do not " + "fit the steps" + ), + ), + ( + "rules/file-selector.json", + _vector( + "long-cut", + lambda v: v.update( + query="format=parquet&bundle=false&without_party_totals=true" + ), + ), + "vector 'long-cut' gives a query other than selector_query's", + ), + ( + "rules/file-selector.json", + _vector( + "keys-in-listed-order", + lambda v: v.update(query="layout=frame&bundle=true&format=csv"), + ), + "vector 'keys-in-listed-order' gives a query other than selector_query's", + ), + ( + "rules/file-selector.json", + lambda doc: doc.pop("query_keys"), + "rules/file-selector.json: missing or unreadable, or holds no query_keys", + ), ], ids=[ "strict-pointer-unresolved", @@ -2031,6 +2104,7 @@ def change(doc: Any) -> None: "candidate-spec-not-an-object-read", "party-totals-left-in-by-default", "party-totals-kept-without-the-option", + "mint-party-totals-left-in-by-default", "columns-out-of-reading-order", "stacked-columns-out-of-reading-order", "served-order-of-other-columns-swapped", @@ -2042,6 +2116,13 @@ def change(doc: Any) -> None: "reading-order-series-interleaved-by-year", "reading-order-null-sorted-first", "reading-order-without-reading-columns", + "reading-order-vector-row-ragged", + "reading-order-vector-column-mixes-types", + "selector-query-carries-the-cut", + "unlisted-artifact-selector-query-carries-the-cut", + "file-selector-vector-carries-the-cut", + "file-selector-vector-out-of-key-order", + "file-selector-without-query-keys", ], ) def test_a_broken_contract_is_reported( @@ -2055,10 +2136,102 @@ def test_a_broken_contract_is_reported( assert any(expected in problem for problem in problems), problems -def test_a_missing_reading_order_rule_is_reported(package_dir: Path) -> None: - (package_dir / "rules" / "reading-order.json").unlink() +@pytest.mark.parametrize( + ("left", "right", "same"), + # The same cases as python/client-contract/tests/test_rules.py. + [ + (1, 1.0, True), + (True, 1, False), + (float("nan"), float("nan"), True), + (None, None, True), + ("1", 1, False), + ([True], [1], False), + ([float("nan")], [float("nan")], True), + ([1], [1.0], True), + ({"a": 1, "b": 2}, {"b": 2, "a": 1.0}, True), + ({"a": True}, {"a": 1}, False), + ], +) +def test_cells_are_the_same_value_as_json_values( + left: Any, right: Any, same: bool +) -> None: + assert validator.same_value(left, right) is same + table = validator.table_from_rows(["c"], [[left], [right]]) + assert ("c" in table.same) is same + + +def _parquet(table: pa.Table) -> bytes: + sink = pa.BufferOutputStream() + pq.write_table(table, sink) + return sink.getvalue().to_pybytes() + + +def test_a_served_table_reads_list_struct_and_nan_columns() -> None: + """Columns `unique` cannot hash are judged cell by cell, and a NaN column + holds one value, in one table and over stacked ones.""" + data = _parquet( + pa.table( + { + "listed": [[1, 2], [1, 2]], + "struct": [{"a": 1}, {"a": 2}], + "nan": [float("nan"), float("nan")], + } + ) + ) + table = validator.served_table(data) + assert set(table.same) == {"listed", "nan"} + assert table.nested == {"listed", "struct"} + groups = validator.column_groups([table], []) + assert groups.varying == ("struct",) and groups.sort_keys == [] + assert not validator._varies("nan", [table, table]) + assert validator._varies("struct", [table]) + + +def test_a_spec_built_in_two_renderings_keys_each_by_its_file() -> None: + """A ref member's rendering is checked against the build that answered + its file, so each of a spec's two builds keeps its own rendering.""" + cut = {"format": "parquet", "bundle": False, "without_party_totals": True} + plain = {"format": "parquet", "bundle": False} + + def build(options: dict[str, Any], digest: str) -> dict[str, Any]: + artifact = {"artifact_digest": digest, "rendering": options} + return { + "request": { + "method": "POST", + "path": "/datasets", + "json": {"options": options}, + }, + "response": { + "status": 200, + "json": {"definition": {"spec_id": "spec_a"}, "artifacts": [artifact]}, + }, + } + + scenario = {"exchanges": [build(cut, "sha256:a"), build(plain, "sha256:b")]} + posted = validator.posted_renderings(scenario) + assert posted == {"sha256:a": [cut], "sha256:b": [plain]} + + +def test_a_selector_query_writes_only_booleans_in_lower_case() -> None: + query = validator.selector_query( + {"format": "CSV", "bundle": True}, ["format", "bundle"] + ) + assert query == "format=CSV&bundle=true" + + +def test_a_resumed_result_takes_the_rendering_its_build_posted() -> None: + cut = {"format": "parquet", "bundle": False, "without_party_totals": True} + manifest = {"artifacts": [{"artifact_digest": "sha256:a", "rendering": cut}]} + assert validator.resumed_rendering(None, manifest) == cut + manifest["artifacts"][0]["rendering"] = {"format": "parquet", "bundle": False} + assert validator.resumed_rendering(None, manifest) == validator.rendering_for(None) + + +@pytest.mark.parametrize("rule", ["reading-order", "file-selector"]) +def test_a_missing_rule_table_is_reported(package_dir: Path, rule: str) -> None: + (package_dir / "rules" / f"{rule}.json").unlink() assert any( - problem.startswith("rules/reading-order.json: missing") + problem.startswith(f"rules/{rule}.json: missing") for problem in validator.validate() ) diff --git a/tools/validate_client_contract.py b/tools/validate_client_contract.py index c84959f..debb55d 100644 --- a/tools/validate_client_contract.py +++ b/tools/validate_client_contract.py @@ -63,14 +63,15 @@ REPLAY_ORIGIN with the recorded origin a response names moved there. A dataset's columns are the downloaded files' columns, read with pyarrow by `served_table` and ordered by `presented_columns`, which puts the - columns whose values vary before those that hold one value, its rows and + columns whose values vary, as `same_value` judges cells, before those + that hold one value, 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, its layout and, for a fetch, its party totals, and each Search request the whole body + narrowing, its layout and, for a fetch or a mint, 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 @@ -95,7 +96,9 @@ - Each rule file under `rules/` validates against `rules.schema.json`, names the rule its file name names, and names each vector once, and each reading-order vector's `columns` and `rows` are what `presented_rows` - gives. A missing or unreadable `rules/reading-order.json` is a problem. + gives, and each file-selector vector's `query` is what `selector_query` + gives. A missing or unreadable `rules/reading-order.json` or + `rules/file-selector.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 @@ -106,6 +109,7 @@ import hashlib import json +import math import re import sys from collections.abc import Callable, Collection, Iterator, Mapping, Sequence @@ -1799,32 +1803,72 @@ class _UnfitError(Exception): def rendering_for(layout: str | None) -> dict[str, Any]: - """The build request's `options` for a mint's or an operation's - `layout`, long by default.""" + """The rendering for `layout`, long by default, with party totals + kept.""" 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.""" + """The build request's `options` for a fetch of an answer or a spec, or + a mint: 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 resumed_rendering( + layout: str | None, manifest: Mapping[str, Any] +) -> dict[str, Any]: + """The rendering a resumed operation's build posted, as its done + manifest records it: the layout's rendering, with `without_party_totals` + when the artifact for that rendering carries the cut.""" + rendering = rendering_for(layout) + artifact = pick_artifact(manifest, rendering) + found = artifact.get("rendering") if artifact is not None else None + if isinstance(found, dict) and found.get(WITHOUT_PARTY_TOTALS) is True: + rendering[WITHOUT_PARTY_TOTALS] = True + return rendering + + @dataclass(frozen=True, slots=True) class ServedTable: """A served table as the reading-order rule reads it: its columns in the order the server wrote them, its row count, and the value of each column - that holds one value in every row. A column `same` leaves out varies.""" + that holds one value in every row. A column `same` leaves out varies. + `nested` names the columns holding lists or structs, which no row is + sorted by.""" columns: tuple[str, ...] rows: int same: Mapping[str, Any] + nested: frozenset[str] = frozenset() + + +def same_value(left: Any, right: Any) -> bool: + """Whether two cells hold the same value, as the reading-order rule + judges it: numbers by value, so 1 and 1.0 are the same, booleans apart + from numbers, NaN the same as NaN, null the same as null, lists item by + item in order, and structs field by field in any order.""" + if isinstance(left, bool) or isinstance(right, bool): + return type(left) is type(right) and left == right + if isinstance(left, float) and isinstance(right, float): + return left == right or (math.isnan(left) and math.isnan(right)) + if isinstance(left, list) and isinstance(right, list): + return len(left) == len(right) and all(map(same_value, left, right)) + if isinstance(left, dict) and isinstance(right, dict): + return left.keys() == right.keys() and all( + same_value(value, right[key]) for key, value in left.items() + ) + return left == right + + +def _one_value(values: Sequence[Any]) -> bool: + """Whether `values` hold one value as `same_value` judges it.""" + return all(same_value(value, values[0]) for value in values[1:]) def table_from_rows( @@ -1834,9 +1878,14 @@ def table_from_rows( same = { name: rows[0][index] for index, name in enumerate(columns) - if rows and all(row[index] == rows[0][index] for row in rows) + if rows and _one_value([row[index] for row in rows]) } - return ServedTable(tuple(columns), len(rows), same) + nested = frozenset( + name + for index, name in enumerate(columns) + if any(isinstance(row[index], list | dict) for row in rows) + ) + return ServedTable(tuple(columns), len(rows), same, nested) @lru_cache(maxsize=64) @@ -1854,12 +1903,21 @@ def served_table(data: bytes) -> ServedTable: raise _UnfitError( f"a downloaded file is unreadable: not Parquet: {exc}" ) from exc + nested = frozenset( + field.name for field in table.schema if pa.types.is_nested(field.type) + ) same = {} for name in table.column_names if table.num_rows else (): - values = table.column(name).unique() - if len(values) == 1: - same[name] = values[0].as_py() - return ServedTable(tuple(table.column_names), table.num_rows, same) + column = table.column(name) + # Arrow's `unique` counts NaN once and cannot hash a nested type, + # whose cells `same_value` compares. + if name in nested: + values = column.to_pylist() + if _one_value(values): + same[name] = values[0] + elif len(distinct := column.unique()) == 1: + same[name] = distinct[0].as_py() + return ServedTable(tuple(table.column_names), table.num_rows, same, nested) def filled_slots( @@ -1884,7 +1942,7 @@ def _varies(name: str, tables: Sequence[ServedTable]) -> bool: if name in table.columns and name not in table.same: return True values.append(table.same.get(name)) - return any(value != values[0] for value in values[1:]) + return not _one_value(values) @dataclass(frozen=True, slots=True) @@ -1901,6 +1959,7 @@ class ColumnGroups: same: tuple[str, ...] last: tuple[str, ...] last_varies: bool + nested: frozenset[str] = frozenset() @property def columns(self) -> list[str]: @@ -1912,10 +1971,12 @@ def sort_keys(self) -> list[str]: reading slots in slot order without `value`, a measure, and without the time period, then the varying columns in presented order, `stat_var` among them when it varies, then the time period, so each - series' years read together.""" + series' years read together. A column of lists or structs is no + key.""" keys = [c for c in self.first if c not in (VALUE, TIME_PERIOD)] keys += [*self.varying, *(self.last if self.last_varies else ())] - return keys + [TIME_PERIOD] * (TIME_PERIOD in self.first) + keys += [TIME_PERIOD] * (TIME_PERIOD in self.first) + return [key for key in keys if key not in self.nested] def column_groups( @@ -1935,6 +1996,7 @@ def column_groups( same=tuple(c for c in rest if c not in varying), last=(STAT_VAR,) if STAT_VAR in gathered else (), last_varies=STAT_VAR in gathered and _varies(STAT_VAR, tables), + nested=frozenset().union(*(table.nested for table in tables)), ) @@ -1988,6 +2050,18 @@ def load_reading_columns(package_dir: Path) -> list[list[str]] | None: return None +def load_selector_keys(package_dir: Path) -> list[str] | None: + """The query keys `rules/file-selector.json` lists, or None when the file + does not hold them, which the validator reports.""" + try: + keys = _load(package_dir / "rules" / "file-selector.json")["query_keys"] + except (OSError, ValueError, KeyError, TypeError): + return None + if isinstance(keys, list) and keys and all(isinstance(k, str) for k in keys): + return keys + return None + + 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 @@ -2172,16 +2246,32 @@ def digest_of(data: bytes) -> str: return "sha256:" + hashlib.sha256(data).hexdigest() +def selector_query(rendering: Mapping[str, Any], keys: Sequence[str]) -> str: + """The file selector's query for `rendering`, as the file-selector rule + builds it: each of `keys` the rendering holds, in that order.""" + return "&".join( + f"{key}={_query_value(rendering[key])}" for key in keys if key in rendering + ) + + +def _query_value(value: Any) -> str: + """A query value, a boolean written `true` or `false`.""" + if isinstance(value, bool): + return "true" if value else "false" + return str(value) + + def selector_path( - spec_id: str, content_version: str, rendering: Mapping[str, Any] + spec_id: str, + content_version: str, + rendering: Mapping[str, Any], + keys: Sequence[str], ) -> str: - """The file selector's path for a stored version, its rendering as the - query.""" - query = "&".join( - f"{name}={str(value).lower() if isinstance(value, bool) else value}" - for name, value in rendering.items() + """The file selector's path for a stored version in `rendering`, its + query from `selector_query`.""" + return ( + f"/datasets/{spec_id}/{content_version}/file?{selector_query(rendering, keys)}" ) - return f"/datasets/{spec_id}/{content_version}/file?{query}" # The storage host a signed download names, the only host outside the API a @@ -2413,13 +2503,16 @@ class _Minted: """An operation a mint started or a resume read, for the result step: its resource, the headers that came with it, the build request a failed operation resubmits (None for a resumed one), the spec the client holds, - and the rendering it downloads.""" + and the rendering the build posted, or for a resumed operation None and + the layout whose rendering `resumed_rendering` reads from the done + manifest.""" resource: dict[str, Any] headers: dict[str, str] request: dict[str, Any] | None spec: dict[str, Any] | None - rendering: dict[str, Any] + rendering: dict[str, Any] | None + layout: str | None = None @dataclass @@ -2435,6 +2528,7 @@ class _Replay: client_codes: Mapping[str, Mapping[str, Any]] body_dir: Path reading: Sequence[Sequence[str]] | None + selector_keys: Sequence[str] | None cursor: int = 0 answer: Answer | None = None minted: _Minted | None = None @@ -2787,10 +2881,13 @@ def stored_file( if error.code not in FILE_GONE: raise refusal = error + if self.selector_keys is None: + raise _UnfitError("rules/file-selector.json lists no query_keys") path = selector_path( member["spec"]["spec_id"], member["content_version"], member["artifact"]["rendering"], + self.selector_keys, ) try: return self.download(path, digest, origin=False), None @@ -2913,7 +3010,9 @@ def _fetch_ref(self, step: dict[str, Any]) -> dict[str, Any]: return self.dataset(members, []) def _mint(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) + ) exchange = self.posted_build(step["spec"], rendering, None) if exchange["response"]["status"] == 200: raise _UnfitError( @@ -2930,8 +3029,7 @@ def _operation(self, step: dict[str, Any]) -> dict[str, Any]: exchange = self.call("GET", POLL_PATH.format(operation_id=step["operation_id"])) resource = self.acted_on(exchange, _OPERATION) headers = exchange["response"].get("headers", {}) - rendering = rendering_for(step.get("layout")) - self.minted = _Minted(resource, headers, None, None, rendering) + self.minted = _Minted(resource, headers, None, None, None, step.get("layout")) return _operation_outcome(resource) def _newest_version(self, step: dict[str, Any]) -> dict[str, Any]: @@ -2944,7 +3042,8 @@ def _result(self, step: dict[str, Any]) -> dict[str, Any]: raise _UnfitError("result follows no mint or operation") minted = self.minted manifest = self.long_build(minted.resource, minted.headers, minted.request) - member = self.member([], minted.spec, manifest, minted.rendering, False) + rendering = minted.rendering or resumed_rendering(minted.layout, manifest) + member = self.member([], minted.spec, manifest, rendering, False) return self.dataset([member], []) def dataset( @@ -3001,6 +3100,7 @@ def expected_outcomes( client_codes: Mapping[str, Mapping[str, Any]], body_dir: Path, reading: Sequence[Sequence[str]] | None, + selector_keys: 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 @@ -3023,6 +3123,7 @@ def expected_outcomes( client_codes, body_dir, reading, + selector_keys, ) try: outcomes = [replay.step(step) for step in record["call"]] @@ -3278,6 +3379,7 @@ def _check_scenarios( proxy_codes: Mapping[str, Mapping[str, Any]], served_commit: str | None, reading: Sequence[Sequence[str]] | None, + selector_keys: Sequence[str] | None, ) -> list[str]: directory = PACKAGE_DIR / "scenarios" paths = sorted(directory.glob("*.json")) @@ -3375,6 +3477,7 @@ def _check_scenarios( client_codes=client_codes, body_dir=directory, reading=reading, + selector_keys=selector_keys, ) try: derived = replay(record, base_url=base_url) @@ -3556,11 +3659,13 @@ 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] = {} +def posted_renderings(scenario: Mapping[str, Any]) -> dict[str, list[Any]]: + """The renderings the builds in `scenario` posted as their `options`, by + the digest of the artifact each build's manifest lists for them: a + manifest's own, or for a 202 the manifest the poll of its operation + answered done. Builds that answered the same file list each rendering in + build order.""" + renderings: dict[str, list[Any]] = {} by_operation: dict[str, Any] = {} for exchange in read_objects(scenario, "exchanges"): request = read_object(exchange, "request") or {} @@ -3571,20 +3676,30 @@ def posted_renderings(scenario: Mapping[str, Any]) -> dict[str, Any]: 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] + options = by_operation[operation_id] + else: + continue + digest = _artifact_digest(manifest, options) + if digest is not None: + renderings.setdefault(digest, []).append(options) return renderings +def _artifact_digest(manifest: Any, options: Any) -> str | None: + """The digest of the artifact `manifest` lists for the posted `options`, + or None when either does not read.""" + if not isinstance(options, dict) or not {"format", "bundle"} <= options.keys(): + return None + artifacts = read_objects(manifest, "artifacts") + artifact = pick_artifact({"artifacts": artifacts}, options) + return read_string(artifact, "artifact_digest") + + 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.""" + the build that answered its file 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") @@ -3594,17 +3709,17 @@ def _posted_by(label: str, record: dict[str, Any]) -> list[str]: 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: + artifact = read_object(member, "artifact") + digest = read_string(artifact, "digest") + rendering = read_object(artifact, "rendering") + if digest not in posted: problems.append( - f"{label}: member {index}'s spec is built by no {name} build" + f"{label}: member {index}'s file is answered by no {name} build" ) - elif rendering != posted[spec_id]: + elif rendering not in posted[digest]: problems.append( f"{label}: member {index} records rendering {json.dumps(rendering)}, " - f"but {name} posted {json.dumps(posted[spec_id])}" + f"but {name} posted {' and '.join(map(json.dumps, posted[digest]))}" ) return problems @@ -3651,6 +3766,34 @@ def _check_refs(validator: jsonschema.Draft202012Validator) -> list[str]: # --- rules ------------------------------------------------------------------ +def _json_type(value: Any) -> str: + if isinstance(value, bool): + return "boolean" + return "number" if isinstance(value, int | float) else type(value).__name__ + + +def _unorderable(members: Sequence[Mapping[str, Any]]) -> str | None: + """Why a reading-order vector's members cannot be ordered, or None: a + row whose cells do not match its member's columns, or a column whose + cells, nulls aside, mix JSON types, which the rule gives no order.""" + types: dict[str, set[str]] = {} + for index, member in enumerate(members): + columns = member["columns"] + for row in member["rows"]: + if len(row) != len(columns): + return ( + f"member {index} has a row of {len(row)} cells for " + f"{len(columns)} columns" + ) + for name, cell in zip(columns, row, strict=True): + if cell is not None: + types.setdefault(name, set()).add(_json_type(cell)) + mixed = sorted(name for name, found in types.items() if len(found) > 1) + if mixed: + return f"mixes JSON types in column {mixed[0]!r}" + return None + + def _check_rules(validator: jsonschema.Draft202012Validator) -> list[str]: paths = sorted( p @@ -3673,18 +3816,28 @@ def _check_rules(validator: jsonschema.Draft202012Validator) -> list[str]: for name in sorted({n for n in names if names.count(n) > 1}) ) if document["rule"] == "reading-order": - problems.extend( - f"{label}: vector {vector['name']!r} orders its columns or rows " - f"otherwise than presented_rows" - for vector in document["vectors"] - if presented_rows( + for vector in document["vectors"]: + unfit = _unorderable(vector["members"]) + if unfit is not None: + problems.append(f"{label}: vector {vector['name']!r} {unfit}") + elif presented_rows( [ (member.get("part"), member["columns"], member["rows"]) for member in vector["members"] ], document["reading_columns"], - ) - != (vector["columns"], vector["rows"]) + ) != (vector["columns"], vector["rows"]): + problems.append( + f"{label}: vector {vector['name']!r} orders its columns or " + f"rows otherwise than presented_rows" + ) + if document["rule"] == "file-selector": + problems.extend( + f"{label}: vector {vector['name']!r} gives a query other than " + f"selector_query's" + for vector in document["vectors"] + if selector_query(vector["rendering"], document["query_keys"]) + != vector["query"] ) return problems @@ -3771,6 +3924,12 @@ def validate() -> list[str]: "reading_columns list of column-name lists, so no dataset's columns " "are checked" ) + selector_keys = load_selector_keys(PACKAGE_DIR) + if selector_keys is None: + problems.append( + "rules/file-selector.json: missing or unreadable, or holds no " + "query_keys list of names, so no file selector request is checked" + ) problems.extend( _check_scenarios( validators["scenario.schema.json"], @@ -3782,6 +3941,7 @@ def validate() -> list[str]: proxy_codes={row["code"]: row for row in proxy_rows}, served_commit=source.get("commit") if isinstance(source, dict) else None, reading=reading, + selector_keys=selector_keys, ) ) size = scenarios_size(PACKAGE_DIR / "scenarios") From ae602f583ae2388871bd0480b432350397c8d1cb Mon Sep 17 00:00:00 2001 From: Jorge Rivera Date: Thu, 29 Oct 2026 17:51:43 +0100 Subject: [PATCH 11/12] fix(client-contract): keep vectors servable and judge every column by same_value (#34) The nested-cells vector's flags column holds one item type, the validator reports a vector column Arrow cannot build, and served_table judges flat columns by same_value as it does nested ones. --- .../rules/reading-order.json | 4 +- tools/tests/test_validate_client_contract.py | 59 ++++++++++++++++++- tools/validate_client_contract.py | 25 ++++---- 3 files changed, 72 insertions(+), 16 deletions(-) diff --git a/python/client-contract/src/dfo_client_contract/rules/reading-order.json b/python/client-contract/src/dfo_client_contract/rules/reading-order.json index bd1db59..a2a318f 100644 --- a/python/client-contract/src/dfo_client_contract/rules/reading-order.json +++ b/python/client-contract/src/dfo_client_contract/rules/reading-order.json @@ -1479,7 +1479,7 @@ 1.0 ], [ - 1 + false ] ] ] @@ -1497,7 +1497,7 @@ 2020, 4, [ - 1 + false ], { "b": 2, diff --git a/tools/tests/test_validate_client_contract.py b/tools/tests/test_validate_client_contract.py index ee02a33..3982480 100644 --- a/tools/tests/test_validate_client_contract.py +++ b/tools/tests/test_validate_client_contract.py @@ -21,6 +21,7 @@ import json import os import shutil +import struct import sys from collections.abc import Callable from pathlib import Path @@ -176,6 +177,15 @@ def _selector_query_with_cut(doc: Any) -> None: exchange["request"]["path"] += "&without_party_totals=true" +def _time_period_written_as_text(vector: Any) -> None: + """The second member serves its years as text, a valid Arrow column of + its own that mixes types with the first member's in the stacked table.""" + member = vector["members"][1] + at = member["columns"].index("time_period") + for row in member["rows"]: + row[at] = str(row[at]) + + def _vector(name: str, change: Callable[[Any], None]) -> Callable[[Any], None]: return lambda doc: change(next(v for v in doc["vectors"] if v["name"] == name)) @@ -1817,10 +1827,25 @@ def change(doc: Any) -> None: ( "rules/reading-order.json", _vector( - "ties-keep-served-order", - lambda v: v["members"][0]["rows"][0].__setitem__(4, "2022"), + "nested-cells-compare-by-value", + lambda v: v["members"][0]["rows"][1].__setitem__(4, [1]), + ), + "vector 'nested-cells-compare-by-value' member 0 column 'flags' is no " + "Arrow column", + ), + ( + "rules/reading-order.json", + _vector( + "nested-cells-compare-by-value", + lambda v: v["members"][0]["rows"][1].__setitem__(2, {"a": "x", "b": 2}), ), - "vector 'ties-keep-served-order' mixes JSON types in column", + "vector 'nested-cells-compare-by-value' member 0 column 'meta' is no " + "Arrow column", + ), + ( + "rules/reading-order.json", + _vector("stack-crs-and-dac2a", _time_period_written_as_text), + "vector 'stack-crs-and-dac2a' mixes JSON types in column", ), ( "scenarios/fetch-ref-expired-file-selector.json", @@ -2117,6 +2142,8 @@ def change(doc: Any) -> None: "reading-order-null-sorted-first", "reading-order-without-reading-columns", "reading-order-vector-row-ragged", + "reading-order-vector-list-items-mix-types", + "reading-order-vector-struct-field-mixes-types", "reading-order-vector-column-mixes-types", "selector-query-carries-the-cut", "unlisted-artifact-selector-query-carries-the-cut", @@ -2166,6 +2193,32 @@ def _parquet(table: pa.Table) -> bytes: return sink.getvalue().to_pybytes() +def _nan(payload: int) -> float: + return struct.unpack(" None: + """Cells `same_value` holds the same, which Arrow's `unique` tells apart, + are one value on both paths.""" + rows = [[2021 - i, "x", cell] for i, cell in enumerate(cells)] + columns = ["time_period", "label", "amount"] + vector = validator.table_from_rows(columns, rows) + served = validator.served_table( + _parquet( + pa.table({name: [row[i] for row in rows] for i, name in enumerate(columns)}) + ) + ) + assert "amount" in served.same + assert validator.column_groups([served], []) == validator.column_groups( + [vector], [] + ) + + def test_a_served_table_reads_list_struct_and_nan_columns() -> None: """Columns `unique` cannot hash are judged cell by cell, and a NaN column holds one value, in one table and over stacked ones.""" diff --git a/tools/validate_client_contract.py b/tools/validate_client_contract.py index debb55d..d9c1937 100644 --- a/tools/validate_client_contract.py +++ b/tools/validate_client_contract.py @@ -1906,17 +1906,13 @@ def served_table(data: bytes) -> ServedTable: nested = frozenset( field.name for field in table.schema if pa.types.is_nested(field.type) ) + # Every column is judged by `same_value`, as `table_from_rows` judges a + # vector's, so a vector and its Parquet file group their columns alike. same = {} for name in table.column_names if table.num_rows else (): - column = table.column(name) - # Arrow's `unique` counts NaN once and cannot hash a nested type, - # whose cells `same_value` compares. - if name in nested: - values = column.to_pylist() - if _one_value(values): - same[name] = values[0] - elif len(distinct := column.unique()) == 1: - same[name] = distinct[0].as_py() + values = table.column(name).to_pylist() + if _one_value(values): + same[name] = values[0] return ServedTable(tuple(table.column_names), table.num_rows, same, nested) @@ -3774,8 +3770,10 @@ def _json_type(value: Any) -> str: def _unorderable(members: Sequence[Mapping[str, Any]]) -> str | None: """Why a reading-order vector's members cannot be ordered, or None: a - row whose cells do not match its member's columns, or a column whose - cells, nulls aside, mix JSON types, which the rule gives no order.""" + row whose cells do not match its member's columns, a member's column + whose cells cannot form one Arrow column, as a served Parquet file holds + them, or a column whose cells, nulls aside, mix JSON types across the + stacked members, which the rule gives no order.""" types: dict[str, set[str]] = {} for index, member in enumerate(members): columns = member["columns"] @@ -3788,6 +3786,11 @@ def _unorderable(members: Sequence[Mapping[str, Any]]) -> str | None: for name, cell in zip(columns, row, strict=True): if cell is not None: types.setdefault(name, set()).add(_json_type(cell)) + for position, name in enumerate(columns): + try: + pa.array([row[position] for row in member["rows"]]) + except pa.ArrowException as exc: + return f"member {index} column {name!r} is no Arrow column: {exc}" mixed = sorted(name for name, found in types.items() if len(found) > 1) if mixed: return f"mixes JSON types in column {mixed[0]!r}" From 6b606ec02d67def6851aae913a733da31e0183be Mon Sep 17 00:00:00 2001 From: Jorge Rivera Date: Thu, 29 Oct 2026 21:53:00 +0100 Subject: [PATCH 12/12] feat(contract): derived refs, output digests and the dashboard routes' codes (#30) * feat(contract): add derived refs, an output digest and analysis rules DatasetRef format 2 names derived members: an ops_ spec with its recipe hashes, the ocv_ version, an output digest (out_), the root versions with their renderings, the execution identity and resolved periods. Format 1 refs validate unchanged. New rule vector sets pin the output digest (JCS over roles, period, value and unit, leaving out stat_var and provenance), output comparison (== against same_data), operation outputs (share_of in percent, join in long format, compare as data minus other, growth as a fraction), rolling composition (rolling_populations_differ) and share publication (slot URLs survive a live replace; a snapshot cannot be replaced). The registry gains the datasets.analysis and presentation.shares endpoints and the codes allowance_exhausted, rolling_populations_differ, several_members, share_not_replaceable, write_token_required and write_token_invalid. operations.json states each verb's output shape and pairs sum and compare by role. * feat(registry): register the analysis engine's refusal codes The datasets.analysis endpoint gains a row for each of the 34 refusal codes the analysis engine raises, including compare_no_key_matched and sum_of_no_key_matched for paired calls, each 422 with the fix_request action. operations.json lists unmatched_key under sum's and compare's left-out reasons and describes their paired form: `on` pairs data's members with other's by role, and compare returns data minus other. * feat(registry): map the Datasets codes the analysis route serves datasets.analysis also answers 27 existing Datasets codes, for roots it cannot read or build (snapshot_not_found, artifact_expired, recipe_not_found, rendering_not_recorded and others) and for platform faults. Each maps at the status it has on the Datasets endpoints. * feat(registry): map timeout on analysis and the platform codes on shares datasets.analysis answers timeout at 504 when a run passes its deadline. presentation.shares maps not_found, request_invalid, frame_unavailable, edit_conflict, service_unavailable, internal_error and timeout at the statuses the presentation write endpoint uses. * feat(registry): map the share routes' refusals and add the SDKs' left-out warning presentation.shares maps binding_invalid, schema_invalid, constraint_violation and resource_exhausted at 400 and release_mismatch at 503, the statuses the components routes use, and a new payload_too_large at 413 for a share body over the routes' limit. pin_not_permitted is retired: the pin route admits any caller under its allowance. The client contract gains the payload_too_large action row and the series_left_out warning, which a client issues when a derived frame left series out for missing data. * feat(registry): map the card allowance on presentation writes allowance_exhausted answers 429 on presentation.write, where creating or revising a card spends the caller's daily card allowance. * fix(contract): name each value's variable in the output digest The output digest (out2) holds each row's stat_var, so frames that pin the same numbers to different variables differ; every derived identity in refs/ and output-comparison.json is computed by the dfo-apis runner, and the validator checks that equal identities agree across fixtures. allowance_exhausted is never retried and a Retry-After above 60 s raises at once. write_token_invalid takes a new action, stop. The series-left-out rule fires on a derived manifest's left_out, growth's left-out reasons are stated with vectors, a derived member's parts are empty, a growth window starts before it ends, and a scenario fetches dataset refs only. share lists unmatched_key among its left-out reasons. * fix(contract): name a computed variable by what was computed The output digest names a variable that compare, sum_of, share_of or quotient_of writes by its verb and its inputs' variables, so equal computations over equal variables share a digest across recipes, engine releases and rebuilds that move no number, and swapped sides differ. Output-digest vectors carry a variables map; three new vectors pin the naming. * fix: name minted variables by a fixed-size digest and admit grouped roots A minted variable is named mv_ plus the first 32 hex of SHA-256 over the RFC 8785 JSON of {verb, slot: sorted input names}, 35 characters at any depth. rules/README.md states the form, three output-digest vectors are regenerated, and rules.schema.json requires the mv_ form in vectors. A derived ref's root takes its own root_rendering, which admits the groupby (by, op sum, levels) DFO read a summed root with. The artifact rendering selector still refuses groupby. Three ref vectors cover a grouped root, a groupby with another op, and groupby on an artifact. The client contract validator compares a root's groupby with the one its scenario posted, and leaves it to the schema when none was posted. * fix: pin nested minted names and record grouped-root ids from a real run Output-digest vectors carry name_documents, the document each mv_ name hashes, and a new quotient-of-a-sum-of vector names a minted variable whose input is another minted variable. The validator checks that each name hashes from its document and that every nested mv_ name has one. The grouped-root ref vectors record by sorted, as DFO writes it, with ids from a dfo-apis run_analysis. rendering and root_rendering share one selector definition, and root_rendering adds only groupby. The validator's derived-identity check includes each root's rendering. --- python/client-contract/CHANGELOG.md | 12 +- python/client-contract/README.md | 20 +- python/client-contract/pyproject.toml | 1 + .../src/dfo_client_contract/actions.json | 164 +- .../dfo_client_contract/actions.schema.json | 1 + .../src/dfo_client_contract/contract.py | 9 +- .../dataset-ref.schema.json | 311 +++- .../refs/ref-artifact-groupby-rejected.json | 82 + ...f-dataset-member-in-format-2-rejected.json | 99 + .../refs/ref-derived-grouped-root.json | 70 + .../ref-derived-in-format-1-rejected.json | 62 + .../refs/ref-derived-member-fixed-window.json | 47 + .../refs/ref-derived-member.json | 60 + .../refs/ref-derived-parts-rejected.json | 64 + ...-derived-period-after-latest-rejected.json | 56 + ...ref-derived-repeated-spec-id-rejected.json | 111 ++ .../ref-derived-root-groupby-op-rejected.json | 72 + ...rived-root-without-rendering-rejected.json | 56 + ...erived-without-output-digest-rejected.json | 61 + .../src/dfo_client_contract/rules/README.md | 32 +- .../rules/operation-outputs.json | 684 +++++++ .../rules/output-comparison.json | 1618 +++++++++++++++++ .../rules/output-digest.json | 900 +++++++++ .../rules/publication.json | 444 +++++ .../rules/rolling-composition.json | 530 ++++++ .../rules/rules.schema.json | 908 ++++++++- .../rules/series-left-out.json | 199 ++ .../dfo_client_contract/scenario.schema.json | 81 +- .../search-retry-after-past-cap.json | 57 + .../dfo_client_contract/warning-codes.json | 5 + .../warning-codes.schema.json | 3 +- .../tests/test_analysis_rules.py | 361 ++++ python/client-contract/tests/test_rules.py | 20 + python/client-contract/uv.lock | 11 + python/descriptions/CHANGELOG.md | 13 + python/descriptions/README.md | 40 +- .../dfo_descriptions/schemas/operations.json | 225 ++- .../schemas/operations.schema.json | 207 ++- python/spec-kit/CHANGELOG.md | 29 + .../src/dfo_spec_kit/registry/codes.json | 870 ++++++++- registries/codes.json | 870 ++++++++- schemas/registry/README.md | 4 +- schemas/registry/code-registry.schema.json | 4 + tools/capture_client_contract.py | 23 +- tools/tests/test_validate_client_contract.py | 186 ++ .../test_validate_descriptions_vectors.py | 20 +- tools/validate_client_contract.py | 440 ++++- tools/validate_descriptions_vectors.py | 18 +- 48 files changed, 9966 insertions(+), 194 deletions(-) create mode 100644 python/client-contract/src/dfo_client_contract/refs/ref-artifact-groupby-rejected.json create mode 100644 python/client-contract/src/dfo_client_contract/refs/ref-dataset-member-in-format-2-rejected.json create mode 100644 python/client-contract/src/dfo_client_contract/refs/ref-derived-grouped-root.json create mode 100644 python/client-contract/src/dfo_client_contract/refs/ref-derived-in-format-1-rejected.json create mode 100644 python/client-contract/src/dfo_client_contract/refs/ref-derived-member-fixed-window.json create mode 100644 python/client-contract/src/dfo_client_contract/refs/ref-derived-member.json create mode 100644 python/client-contract/src/dfo_client_contract/refs/ref-derived-parts-rejected.json create mode 100644 python/client-contract/src/dfo_client_contract/refs/ref-derived-period-after-latest-rejected.json create mode 100644 python/client-contract/src/dfo_client_contract/refs/ref-derived-repeated-spec-id-rejected.json create mode 100644 python/client-contract/src/dfo_client_contract/refs/ref-derived-root-groupby-op-rejected.json create mode 100644 python/client-contract/src/dfo_client_contract/refs/ref-derived-root-without-rendering-rejected.json create mode 100644 python/client-contract/src/dfo_client_contract/refs/ref-derived-without-output-digest-rejected.json create mode 100644 python/client-contract/src/dfo_client_contract/rules/operation-outputs.json create mode 100644 python/client-contract/src/dfo_client_contract/rules/output-comparison.json create mode 100644 python/client-contract/src/dfo_client_contract/rules/output-digest.json create mode 100644 python/client-contract/src/dfo_client_contract/rules/publication.json create mode 100644 python/client-contract/src/dfo_client_contract/rules/rolling-composition.json create mode 100644 python/client-contract/src/dfo_client_contract/rules/series-left-out.json create mode 100644 python/client-contract/src/dfo_client_contract/scenarios/search-retry-after-past-cap.json create mode 100644 python/client-contract/tests/test_analysis_rules.py diff --git a/python/client-contract/CHANGELOG.md b/python/client-contract/CHANGELOG.md index 540c799..ea1159e 100644 --- a/python/client-contract/CHANGELOG.md +++ b/python/client-contract/CHANGELOG.md @@ -11,9 +11,9 @@ All notable changes to the `dfo-spec-kit-client-contract` Python package will be - `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 104 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 125 scenarios: 34 recorded against the deployed dfo-apis dev app at `d80df9f5f`, and 91 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,693,847 bytes. `search-place-ambiguous-twice` pins two entity_ambiguous groups of one text, each option and slot token naming its group by `entity_choice`, and `choose-refused-label-in-two-groups` pins that a label both groups offer matches two options, so a choice there names its option by index. The scenarios cover the several-part choice entries and the assumptions each identity entry echoes, a picked reading whose assumption Search states in its answer, the place choice through a no_data part's options, the choice refusals, a part without variable_text, an unknown status without a restatement, a shared label, a one-part option whose data_query holds two parts, the separate and operations echo, an unsupported part's placeholder, the timed_out, unsupported and unknown gaps, an unknown answer kind, the `SearchWarning` rule, the stacked dataset's `part` column, the frame layout, a strict fetch's `DataWarning`, a spec fetch that rebinds one of two entity roles and keeps the other, one that drops a role bound to null, a spec whose destination is a named group fetched with a window or with its origin rebound, whose sentence lookup posts the groups of the roles the build left bound, a twice cut-off build, a cut-off build retried after its Retry-After, a build refused 504 then 503 and one refused 503 then 504, a refused build, a build refused 501 `capability_unavailable`, a digest mismatch, a signed URL refused on both rounds, a relative files-route Location, an artifact url on a foreign origin, on the storage host and absolute on the API's origin, a manifest definition without identity or schema_version, a Search spec without identity or resolved, nested specs no rule reads, an empty parts list, a Search body that is not an object, a codeless 503 problem document that is not retryable, a 401, an identity resubmit answering another spec, a part whose status is not a string, a Search spec whose definition names another spec_id, a Search response with no JSON body, an option with no data_query, empty entities and facets, a Sunset header issued once, `x-dfo-warning` messages and a Deprecation and Sunset pair, an unreadable versions page, a mint and a spec fetch whose build answers 202 and is polled to done, a resumed operation, a rate-limited poll, 503 polls retried within the budget an answered poll restores, a 202 that reads running, polls whose `retry_after_ms` changes from one to the next, a 404 poll that raises, a failed operation posted again, a failed operation with no error, and a ref whose stored file expired, read through the file selector, rebuilt at the same version, at a newer one, or refused with the newest version read from the versions route: the first version it lists with no `base_content_version`, the newest plain build, so a derived version listed before it is skipped. +- `scenario.schema.json`, the scenario record, and 126 scenarios: 34 recorded against the deployed dfo-apis dev app at `d80df9f5f`, and 92 synthetic, each derived from a recorded one by a one-line edit, with 21 binary bodies totalling 1,134,603 bytes and records and bodies together 13,695,441 bytes. `search-place-ambiguous-twice` pins two entity_ambiguous groups of one text, each option and slot token naming its group by `entity_choice`, and `choose-refused-label-in-two-groups` pins that a label both groups offer matches two options, so a choice there names its option by index. The scenarios cover the several-part choice entries and the assumptions each identity entry echoes, a picked reading whose assumption Search states in its answer, the place choice through a no_data part's options, the choice refusals, a part without variable_text, an unknown status without a restatement, a shared label, a one-part option whose data_query holds two parts, the separate and operations echo, an unsupported part's placeholder, the timed_out, unsupported and unknown gaps, an unknown answer kind, the `SearchWarning` rule, the stacked dataset's `part` column, the frame layout, a strict fetch's `DataWarning`, a spec fetch that rebinds one of two entity roles and keeps the other, one that drops a role bound to null, a spec whose destination is a named group fetched with a window or with its origin rebound, whose sentence lookup posts the groups of the roles the build left bound, a twice cut-off build, a cut-off build retried after its Retry-After, a retryable refusal whose Retry-After passes the 60-second cap, a build refused 504 then 503 and one refused 503 then 504, a refused build, a build refused 501 `capability_unavailable`, a digest mismatch, a signed URL refused on both rounds, a relative files-route Location, an artifact url on a foreign origin, on the storage host and absolute on the API's origin, a manifest definition without identity or schema_version, a Search spec without identity or resolved, nested specs no rule reads, an empty parts list, a Search body that is not an object, a codeless 503 problem document that is not retryable, a 401, an identity resubmit answering another spec, a part whose status is not a string, a Search spec whose definition names another spec_id, a Search response with no JSON body, an option with no data_query, empty entities and facets, a Sunset header issued once, `x-dfo-warning` messages and a Deprecation and Sunset pair, an unreadable versions page, a mint and a spec fetch whose build answers 202 and is polled to done, a resumed operation, a rate-limited poll, 503 polls retried within the budget an answered poll restores, a 202 that reads running, polls whose `retry_after_ms` changes from one to the next, a 404 poll that raises, a failed operation posted again, a failed operation with no error, and a ref whose stored file expired, read through the file selector, rebuilt at the same version, at a newer one, or refused with the newest version read from the versions route: the first version it lists with no `base_content_version`, the newest plain build, so a derived version listed before it is skipped. - `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. +- `proxy-codes.json` and its schema, the website proxy's `rate_limited` and `transient_unavailable` codes with their statuses, which the proxy sends in problem documents of the shape every refusal has, both retryable, with `Retry-After` on the 429, so a client reads one refusal shape, and `warning-codes.json` and its schema, the 7 codes a client sets on the warnings it issues itself, with the `proxy_codes()` and `warning_codes()` accessors. - `ref_digest_changed` in `warning-codes.json`, a `DfoWarning` for a ref member whose `content_version` serves a file with another digest than the ref's, because the server rendered the same data again. The client returns the data, with no error under strict. - `timed_out` in `actions.json` and `registries/codes.json`, the no_data reason Search gives a part it left unresolved at the request's time limit, with action `ask_data_question` and gap kind `timed_out`, which `actions.schema.json` now admits. The client-side `timeout` code, a transport timeout, is unchanged. - 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. @@ -31,5 +31,13 @@ All notable changes to the `dfo-spec-kit-client-contract` Python package will be - The `base-url` rule states the whole validity rule, and seven new vectors pin it: no query, fragment, `.` or `..` segment, character outside visible ASCII, empty userinfo or non-decimal IPv4 host; trailing slashes dropped; a relative URL valid only in a TypeScript client inside a browser page. - The `base-url` rule also refuses a `.` or `..` segment written with `%2e`, a backslash, and a port outside 1 to 65535 or written other than in decimal digits, an empty one included, so a client on Python's `urlsplit` and one on the WHATWG URL parser accept the same values. Ten vectors pin them. - The `file-selector` rule and its vectors: the file selector's query holds the `format`, `bundle` and `layout` of a ref member's rendering, the keys `query_keys` lists, in that order, and leaves out `without_party_totals`, which the selector refuses with 400 `request_invalid` because the version records its own cut. `fetch-ref-expired-file-selector` and `fetch-ref-artifact-unlisted` ask that query, and the validator and the capture build it from `query_keys`. +- Ref format 2 in `dataset-ref.schema.json`: `format_version: 2` and one or more derived members, each `{parts, sentence, spec: {spec_id, recipe: {normal_form_hash, replay_key}}, content_version, output_digest, roots, execution_identity, resolved_periods, artifact}`, with an `ops_` id, an `ocv_` version, `rnf_` and `rpk_` recipe hashes, an `out_` output digest, the root dataset versions with the renderings they were read with, and each period stated relative to the latest with the year it resolved to. Format 1 is unchanged and holds dataset members only, and format 2 holds no dataset member. A derived member's `parts` is empty. A scenario's fetch-by-ref step admits a format 1 ref only, and a format 2 ref fails there on its `format_version`. Nine new ref examples, two accepted and seven rejected, each derived identity computed by the dfo-apis analysis runner. The validator checks a derived member's roots against the scenario it names, each root's rendering as the posted one in the frame layout, and that the derived members of the ref examples and the `output-comparison` vectors agree wherever one identity fixes another. +- A derived member's root records its rendering in `root_rendering`, the artifact selector's members and `groupby`, the sum DFO read the root with as `options.groupby` states it: `by`, one or more distinct column names, `op` `sum`, and `levels`, a depth from 0 to 99 for each kept hierarchical axis, absent when none is set. A breakdown or a sum over StatVars reads a root that way. The artifact's `rendering` admits no `groupby`. `ref-derived-grouped-root` is accepted, its `by` sorted as DFO records it and its identities computed by the dfo-apis analysis runner over the scenario's rows summed to their purpose's sector code, and `ref-derived-root-groupby-op-rejected` and `ref-artifact-groupby-rejected` are rejected. The validator checks a summed root's rendering against its scenario's build without its `groupby`, which no recorded build posts. +- The analysis and publication rules DFO applies, each with vectors and a reference implementation in `tests/test_analysis_rules.py`: `output-digest`, the `out2` digest of a derived frame's values with the `stat_var`, members, period and unit each belongs to, without `measurementMethod`, `provenance`, `status` or a unit's `recipe`, reading the variable `compare`, `sum_of`, `share_of` or `quotient_of` writes under an `mv_` name hashed from its verb and its inputs' variables, 35 characters at any depth, so an engine release or upstream rebuild that moves no number keeps the digest, with 22 canonicalisation vectors, each minted name given with its name document and one naming a `quotient_of` over a `sum_of` by the inner step's name; `output-comparison`, how `==` and `same_data` compare two refs, with 12 vectors; `operation-outputs`, `share_of` in per cent under `Percent`, `join` in long format by `stat_var`, `compare` as data minus other, `sum_of` as data plus other, and `growth` as a fraction in `value` with no unit, leaving out a member with no value at an end of its window, a relative change over a zero or sign-crossing base and a change that is not finite, and refusing two rows of one member in one period with `role_ambiguous`, with 10 vectors; `rolling-composition`, one latest period per recipe tree, refusing rolling steps over different populations with `rolling_populations_differ` even when they settle on one year, with 6 vectors; and `publication`, a share's numbered slots that keep their URLs across a live replace, a snapshot that refuses `share_not_replaceable`, and the write token checks, with 8 vectors. +- `actions.json` rows for `allowance_exhausted` (`wait_for_reset`), `rolling_populations_differ`, `several_members`, `share_not_replaceable` and `write_token_required` (`fix_request`), and `write_token_invalid` (`stop`). +- The `stop` action, class `PermissionDeniedError`, for a refusal no permission or credential the caller can obtain clears: `write_token_invalid`, since a share takes only the write token issued when it was created and a share created without one takes none. +- The retry rules: a refusal whose code's action is `wait_for_reset` is never retried and raises `QuotaExceededError` at once, whatever its document and status say, and a refusal whose `Retry-After` is longer than 60 seconds (`RETRY_AFTER_MAX_S`) raises at once with that wait, a refused poll included. `search-retry-after-past-cap` pins the cap. +- `series_left_out` in `warning-codes.json`, class `SeriesLeftOutWarning`, and the `series-left-out` rule with 8 vectors: a fetch of derived members issues it once when any member's derived manifest lists left-out series in `left_out` or says `left_out_complete` false, a null `left_out` issues nothing, and a strict fetch raises it in place of its data. `tools/validate_client_contract.py` takes the code from the rule. +- `actions.json` rows (`fix_request`) for the 34 refusal codes the analysis engine serves on `datasets.analysis`, including `compare_no_key_matched` and `sum_of_no_key_matched`. [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 312af1a..0a0aa87 100644 --- a/python/client-contract/README.md +++ b/python/client-contract/README.md @@ -48,9 +48,9 @@ uv run ty check src/dfo_client_contract | `warning-codes.schema.json` | The shape of `warning-codes.json` | | `scenario.schema.json` | One scenario record | | `scenarios/` | The scenario records, and the binary response bodies they name | -| `dataset-ref.schema.json` | The frozen `DatasetRef` format | +| `dataset-ref.schema.json` | The frozen `DatasetRef` formats, 1 and 2 | | `refs/` | Accepted and rejected `DatasetRef` examples | -| `rules/` | The client rules, one vector file each, with `rules.schema.json` and the rules' text | +| `rules/` | The client, analysis and publication rules, a vector file each, with schema and text | | Function | Returns | | ----------------- | ----------------------------------------------------------- | @@ -92,12 +92,13 @@ The required members are each part's `status` and its payload (`spec`, `candidat | `take_newest_version` | `VersionUnavailableError` | Takes the newest version | | `log_in` | `AuthenticationError` | Logs in | | `request_scope` | `PermissionDeniedError` | Asks for the permission the call needs | +| `stop` | `PermissionDeniedError` | Stops, as nothing it can obtain allows the call | | `wait` | `RateLimitError` | Waits, then retries | | `wait_for_reset` | `QuotaExceededError` | Waits for the quota to reset | | `report` | `ServerError` | Reports the trace id, after the client's retries | | `upgrade` | `ContractError` | Upgrades the client | -A code that maps to `no_data_reason` also carries `gap_kind`, the kind of gap a no_data part with that reason becomes: `choice`, `no_data`, `not_understood`, `unsupported` or `timed_out`. `timed_out` is a part Search left unresolved at its time limit. Sending the question again, or a narrower one, may answer it. `choose` goes with `choice` and only with it. `choose` and `ask_data_question` name a next step inside an answer, so a code that also reaches a problem document takes another action. The website proxy answers its own refusals with problem documents of the same shape, with `type`, `title`, `status`, `detail`, `code`, `retryable` and `trace_id`, the trace id repeated in the `x-dfo-trace-id` header. `proxy-codes.json` lists their codes with their status, `rate_limited` at 429, which also sends `Retry-After`, and `transient_unavailable` at 502, both retryable. The validator refuses a problem document whose code is neither an active registry code nor a proxy code at that status. No proxy code has a row here, so a client raises a proxy refusal with the class its status maps to: `RateLimitError` for `rate_limited`, which `search-proxy-rate-limited` pins, and `ServerError` for `transient_unavailable`, which `search-proxy-unavailable` pins. `capability_unavailable` is a well-formed request for a format, reshape or conversion class the deployment does not enable, answered 501. Its action is `fix_request`, since the caller asks for another one, and `fetch-spec-capability-unavailable` pins it. +A code that maps to `no_data_reason` also carries `gap_kind`, the kind of gap a no_data part with that reason becomes: `choice`, `no_data`, `not_understood`, `unsupported` or `timed_out`. `timed_out` is a part Search left unresolved at its time limit. Sending the question again, or a narrower one, may answer it. `choose` goes with `choice` and only with it. `choose` and `ask_data_question` name a next step inside an answer, so a code that also reaches a problem document takes another action. The website proxy answers its own refusals with problem documents of the same shape, with `type`, `title`, `status`, `detail`, `code`, `retryable` and `trace_id`, the trace id repeated in the `x-dfo-trace-id` header. `proxy-codes.json` lists their codes with their status, `rate_limited` at 429, which also sends `Retry-After`, and `transient_unavailable` at 502, both retryable. The validator refuses a problem document whose code is neither an active registry code nor a proxy code at that status. No proxy code has a row here, so a client raises a proxy refusal with the class its status maps to: `RateLimitError` for `rate_limited`, which `search-proxy-rate-limited` pins, and `ServerError` for `transient_unavailable`, which `search-proxy-unavailable` pins. `capability_unavailable` is a well-formed request for a format, reshape or conversion class the deployment does not enable, answered 501. Its action is `fix_request`, since the caller asks for another one, and `fetch-spec-capability-unavailable` pins it. `write_token_invalid` takes `stop`: a share takes only the write token issued when it was created, and a share created without one takes none, so no scope or new token lets the caller replace or delete it. `allowance_exhausted` takes `wait_for_reset`, and a client raises it at once as `QuotaExceededError` with its `Retry-After`, the time until the allowance resets, as the retry rules below state. A client maps a refusal whose code has no row, or that carries no code, on its HTTP status: @@ -118,7 +119,7 @@ An answer's gaps follow from its parts. A candidates part is a `choice` gap, its ## Client codes -`client-codes.json` lists, sorted by code, each code a client sets on an error it raises when no problem document carries one: the `code`, the error `class` it raises, `retryable`, and a one-line `condition`. `retryable` is the flag both clients generate onto the error: `deadline_exceeded`, `download_failed` and `network_error` are retryable, `digest_mismatch` and the rest are not, and `refusal_without_code` is retryable as its status is, which its row gives as `by_status`. Both clients set an error's `code` from this list, so every error a client raises carries a code. A refusal keeps its problem document's `code`, the website proxy's included. A refusal whose body carries no code raises `refusal_without_code` with the class its HTTP status maps to, which its row gives as `by_status`. No other row does. A problem document without a code still gives the error its `retryable` and `trace_id`, so a 503 whose body says `retryable: false` raises at once, which `search-refused-without-code` pins. Every refusal's trace id is the response's trace id, as the trace-id rule under Scenarios gives it. `search-refused-without-code` pins the body's winning over the header, and `search-unauthorized` the header's for a refusal with no body. No client code is a code in `actions.json` or `registries/codes.json`, and each class is one the scenario schema names. Each reason the key-lookup rule raises, `key_empty`, `profile_not_found`, `profile_without_key` and `credentials_file_invalid`, is a row of class `AuthenticationError`, as are `key_invalid`, a key outside visible ASCII, and `credentials_file_unreadable`, a credentials file that exists but cannot be read. `header_invalid`, a header value with a control character or a caller's header named `X-DFO-Client`, `insecure_transport`, a key over plain http to a non-loopback host, and `base_url_invalid`, a base URL that is empty, not absolute http or https, or carries userinfo, are `InvalidRequestError` rows. `response_too_large`, a decoded body past its cap, is a `ServerError` row. None of these six is retryable. The list holds no warning. `warning-codes.json` lists, sorted by code, each code a client sets on a warning it issues itself, with its class and condition: `ref_digest_changed`, 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, where the client returns the data; `route_deprecated`, a `DfoDeprecationWarning`, for a `Deprecation` or `Sunset` header; `server_warning`, a `DfoWarning`, for an `x-dfo-warning` header; and `key_checksum_mismatch`, `key_not_base62` and `key_unknown_prefix`, each a `DfoWarning`, for a key that fails the key-format rule with that reason. Both clients generate their warning codes from it and issue no other. No warning code is a code in another table or in `registries/codes.json`. A `SearchWarning` carries the code of the one way the readings differ from the question, a departure's or a warning's code or the verb of an operation Search did not run, and a null code when they differ in several ways. A `DataWarning` carries the manifest warning's code. +`client-codes.json` lists, sorted by code, each code a client sets on an error it raises when no problem document carries one: the `code`, the error `class` it raises, `retryable`, and a one-line `condition`. `retryable` is the flag both clients generate onto the error: `deadline_exceeded`, `download_failed` and `network_error` are retryable, `digest_mismatch` and the rest are not, and `refusal_without_code` is retryable as its status is, which its row gives as `by_status`. Both clients set an error's `code` from this list, so every error a client raises carries a code. A refusal keeps its problem document's `code`, the website proxy's included. A refusal whose body carries no code raises `refusal_without_code` with the class its HTTP status maps to, which its row gives as `by_status`. No other row does. A problem document without a code still gives the error its `retryable` and `trace_id`, so a 503 whose body says `retryable: false` raises at once, which `search-refused-without-code` pins. Every refusal's trace id is the response's trace id, as the trace-id rule under Scenarios gives it. `search-refused-without-code` pins the body's winning over the header, and `search-unauthorized` the header's for a refusal with no body. No client code is a code in `actions.json` or `registries/codes.json`, and each class is one the scenario schema names. Each reason the key-lookup rule raises, `key_empty`, `profile_not_found`, `profile_without_key` and `credentials_file_invalid`, is a row of class `AuthenticationError`, as are `key_invalid`, a key outside visible ASCII, and `credentials_file_unreadable`, a credentials file that exists but cannot be read. `header_invalid`, a header value with a control character or a caller's header named `X-DFO-Client`, `insecure_transport`, a key over plain http to a non-loopback host, and `base_url_invalid`, a base URL that is empty, not absolute http or https, or carries userinfo, are `InvalidRequestError` rows. `response_too_large`, a decoded body past its cap, is a `ServerError` row. None of these six is retryable. The list holds no warning. `warning-codes.json` lists, sorted by code, each code a client sets on a warning it issues itself, with its class and condition: `ref_digest_changed`, 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, where the client returns the data; `route_deprecated`, a `DfoDeprecationWarning`, for a `Deprecation` or `Sunset` header; `server_warning`, a `DfoWarning`, for an `x-dfo-warning` header; `series_left_out`, a `SeriesLeftOutWarning`, for a derived frame that left series out for missing data, where the client returns the frame; and `key_checksum_mismatch`, `key_not_base62` and `key_unknown_prefix`, each a `DfoWarning`, for a key that fails the key-format rule with that reason. Both clients generate their warning codes from it and issue no other. No warning code is a code in another table or in `registries/codes.json`. A `SearchWarning` carries the code of the one way the readings differ from the question, a departure's or a warning's code or the verb of an operation Search did not run, and a null code when they differ in several ways. A `DataWarning` carries the manifest warning's code. ## Scenarios @@ -180,12 +181,13 @@ The records also fix these client rules: - 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 query the file-selector rule in `rules/README.md` builds from the ref's rendering, which leaves out `without_party_totals`; 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 for 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. -- Each retry waits the refusal's `Retry-After` when it carries one, and otherwise the client's backoff for that attempt: 0.5 seconds before the first retry, doubling to at most 8. The build's 504 cut-off retry follows the same rule. `retry_waits` pins these waits, and `fetch-spec-504-retry-after` pins a cut-off that carries `Retry-After`. +- Any other refusal is retried when it is retryable: never when its code's action is `wait_for_reset`, whatever its document and status say, else 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. +- Each retry waits the refusal's `Retry-After` when it carries one, and otherwise the client's backoff for that attempt: 0.5 seconds before the first retry, doubling to at most 8. The build's 504 cut-off retry follows the same rule. A client waits a `Retry-After` of at most 60 seconds (`RETRY_AFTER_MAX_S`). A refusal whose `Retry-After` is longer raises at once with that wait on the error, a refused poll included, so no call sleeps for minutes unasked. `retry_waits` pins these waits, `fetch-spec-504-retry-after` pins a cut-off that carries `Retry-After`, and `search-retry-after-past-cap` a retryable 503 whose `Retry-After` of 61 raises with no retry. - A 401 resolves the key again by the key-lookup rule. When the key changed, the client sends the request once more at once, with no wait and spending no retry. When it did not, or the second answer is a 401 too, the 401 raises `AuthenticationError`. A replay's key never changes, so `search-unauthorized` pins the second case and no scenario the first. - A `request(method, path)` whose `path` is not a path on the base URL, because it starts with `//` or names a scheme, raises `InvalidRequestError` `invalid_argument` before any request. No scenario step makes such a request. - A 2xx response of a JSON route with no JSON body raises `ContractError` `unexpected_response`. `search-no-json-body` pins it for Search. - A `Deprecation` or `Sunset` header on an API response, either alone, issues `route_deprecated` once per process per distinct pair of their values, and an `x-dfo-warning` header issues `server_warning` once per process per message. A signed fetch's headers issue nothing. `search-sunset-warning` pins a Sunset header alone, issued once over two responses that carry the same value, and `search-server-warning` pins a repeated `x-dfo-warning` message issued once, a new message issued again, and a Deprecation beside the same Sunset issued as a new pair. +- A fetch of derived members issues `series_left_out`, a `SeriesLeftOutWarning`, once when the recipe anchor of any member lists left-out series (`Recipe.anchor.left_out` non-empty in the served document): series the rolling anchor dropped because they hold no row at the anchor period. The client returns the frame. A strict fetch raises the warning in place of its data. A recipe with no rolling period has a null anchor and issues nothing. No scenario serves a derived member yet, so the `series-left-out` rule's vectors in `rules/` pin it. - Python synchronous platform name resolution can exceed the following timeout and deadline limits. Asynchronous name resolution is cancellable. Timeouts follow the clients' design and are not replayed, since the replay advances the clock only by the waits the client asks for: the client's `timeout`, 30 s by default, bounds one request attempt; `search(timeout=60)` bounds the whole search, each attempt reading until that deadline, and None means no limit; `fetch` waits for a build with no whole-call deadline by default, and `fetch(timeout=60)` bounds the whole fetch, each download getting the time left on the fetch's deadline; a download that delivers no byte for 30 s raises the retryable `network_error`; a synchronous build POST, and mint's POST, read for up to 150 s within any outer deadline; `result(timeout=1800)` bounds the wait, and None means no limit. A poll attempt that hangs past the per-attempt timeout spends a retry, and a deadline that passes during a body read raises `DfoTimeoutError` `deadline_exceeded`. In TypeScript an infinite remaining time arms no timer, and a finite one above 2^31-1 ms is clamped. No scenario step takes a timeout. ## Recording @@ -213,11 +215,11 @@ A record's `origin.base_url` is the base URL the run was given, a local app's in ## 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 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`. +`dataset-ref.schema.json` is the frozen format a client writes for `data.ref` and reads back in any language. Format 1 is `format_version: 1` and one or more dataset `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`. Format 2 is `format_version: 2` and one or more derived `members`, each the frame an analysis recipe computed, and holds no dataset member, so a ref of dataset members has one spelling, format 1. A derived member is `{parts, sentence, spec: {spec_id, recipe: {normal_form_hash, replay_key}}, content_version, output_digest, roots, execution_identity, resolved_periods, artifact: {digest, rendering}}`. `spec_id` is the recipe's `ops_` id and `content_version` its `ocv_` version. `normal_form_hash` (`rnf_`) names the computation whatever data it ran on, and `replay_key` (`rpk_`) names it on these roots under this execution identity. `output_digest` (`out_`) is the digest of the frame's output that `rules/README.md` defines. `roots` lists each dataset version the recipe ran on, `{spec_id, content_version, rendering}` with the rendering the recipe read, a `spec_` id with a `cv_` version and never a derived frame, since a recipe's normal form replaces each derived input by its own recipe. A root's rendering holds the selector's members and, for a root read summed, such as by a breakdown or a sum over StatVars, `groupby`, the `options.groupby` DFO read it with: `{by, op: "sum"}`, `by` one or more distinct column names, with `levels` mapping each kept hierarchical axis it rolls up to a depth from 0 to 99. An artifact's `rendering` admits no `groupby`. `execution_identity` names the engine, frame grammar and reduction policy versions that ran it, joined by `|`, such as `0.9.0|1.1.0|0.2.0`. `resolved_periods` lists each period the recipe states relative to the latest period, `{anchor: "latest", offset, rule: "half1", period}`, with the year it resolved to, and is empty for a recipe that states none. DFO computes every one of these members, and a client copies them from the server's answer and computes none. `parts` is empty for a derived member, which no answer part names. A client that reads format 1 refuses format 2, so clients that read format 2 ship before any service writes it. `==` and `same_data` compare refs as `rules/README.md` states under output comparison. `ref-derived-member`, `ref-derived-member-fixed-window` and `ref-derived-grouped-root` are accepted derived refs, the first with two resolved periods, the second with none, and the third with a root read summed, and `ref-derived-in-format-1-rejected`, `ref-dataset-member-in-format-2-rejected`, `ref-derived-without-output-digest-rejected`, `ref-derived-root-without-rendering-rejected`, `ref-derived-root-groupby-op-rejected`, `ref-artifact-groupby-rejected` and `ref-derived-period-after-latest-rejected` pin what the schema refuses. `repeated_spec_id` holds across derived members too, which `ref-derived-repeated-spec-id-rejected` pins, and `definition_spec_id_mismatch` concerns dataset members alone. A derived example's `scenario` serves its roots: each root's `spec_id` and `content_version` are a dataset member's of that scenario, and its rendering the one the scenario's build posted, apart from a summed root's `groupby`, which no recorded build posts. No scenario serves a derived member itself, so its own identifiers and artifact digest are checked by the schema alone. ## Rules -`rules/README.md` states the shared rules for credentials, key lookup and format, the base URL, disk caching, the order a client presents a dataset's columns and rows in, the keys a caller narrows a spec's roles by, the file selector's query, and the `X-DFO-Client` header that identifies the client to the API. 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, the order a client presents a dataset's columns and rows in, the keys a caller narrows a spec's roles by, the file selector's query, the `X-DFO-Client` header that identifies the client to the API, and when a fetch of derived members warns that series were left out. It also states the rules DFO applies and a client reads the results of: the output digest of a derived frame, how `==` and `same_data` compare refs, the units and shapes of the operations' outputs, how the rolling steps of one recipe share one latest period, and how a share's cards are published, replaced and taken down. 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 @@ -227,5 +229,5 @@ A record's `origin.base_url` is the base URL the run was given, a local app's in uv run ../../tools/validate_client_contract.py # Replay the rule vectors through a reference implementation of each rule -uv run pytest tests/test_rules.py +uv run pytest tests/test_rules.py tests/test_analysis_rules.py ``` diff --git a/python/client-contract/pyproject.toml b/python/client-contract/pyproject.toml index d613df2..a301906 100644 --- a/python/client-contract/pyproject.toml +++ b/python/client-contract/pyproject.toml @@ -45,6 +45,7 @@ dev = [ "pre-commit>=4.6.0", "jsonschema>=4.23", "referencing>=0.36", + "rfc8785>=0.1.4", ] [tool.ruff] diff --git a/python/client-contract/src/dfo_client_contract/actions.json b/python/client-contract/src/dfo_client_contract/actions.json index 8474193..cb28717 100644 --- a/python/client-contract/src/dfo_client_contract/actions.json +++ b/python/client-contract/src/dfo_client_contract/actions.json @@ -1,6 +1,10 @@ { "format_version": 1, "codes": [ + { + "code": "allowance_exhausted", + "action": "wait_for_reset" + }, { "code": "artifact_expired", "action": "take_newest_version" @@ -46,6 +50,18 @@ "code": "column_unknown", "action": "fix_request" }, + { + "code": "compare_no_key_matched", + "action": "fix_request" + }, + { + "code": "comparison_periods_disjoint", + "action": "fix_request" + }, + { + "code": "composed_unit_sum_unsupported", + "action": "fix_request" + }, { "code": "conflicting_requested_options", "action": "fix_request" @@ -54,6 +70,22 @@ "code": "constraint_violation", "action": "fix_request" }, + { + "code": "coverage_insufficient", + "action": "fix_request" + }, + { + "code": "cross_frame_facet_mismatch", + "action": "fix_request" + }, + { + "code": "cross_frame_unit_mismatch", + "action": "fix_request" + }, + { + "code": "cross_frame_unit_unbound", + "action": "fix_request" + }, { "code": "default_facet_undefined", "action": "fix_request" @@ -67,6 +99,14 @@ "action": "ask_data_question", "gap_kind": "no_data" }, + { + "code": "derived_input_ordinal", + "action": "fix_request" + }, + { + "code": "derived_input_unusable", + "action": "fix_request" + }, { "code": "directional_children_unsupported", "action": "fix_request" @@ -123,6 +163,10 @@ "code": "facet_binding_unsupported", "action": "fix_request" }, + { + "code": "facet_heterogeneous", + "action": "fix_request" + }, { "code": "facet_not_available", "action": "fix_request", @@ -132,14 +176,30 @@ "code": "facet_probe_ceiling", "action": "fix_request" }, + { + "code": "filter_predicate_type_mismatch", + "action": "fix_request" + }, + { + "code": "filter_unit_conversion_unsupported", + "action": "fix_request" + }, { "code": "frame_not_refreshable", "action": "fix_request" }, + { + "code": "frame_too_large", + "action": "fix_request" + }, { "code": "frame_unavailable", "action": "check_id" }, + { + "code": "growth_gap_year", + "action": "fix_request" + }, { "code": "identity_collision", "action": "report" @@ -156,6 +216,14 @@ "code": "invalid_role_ref", "action": "fix_request" }, + { + "code": "join_no_common_key_columns", + "action": "fix_request" + }, + { + "code": "join_output_collision", + "action": "fix_request" + }, { "code": "member_not_resolvable", "action": "fix_request" @@ -172,6 +240,10 @@ "code": "mixed_peers_anchor_types", "action": "fix_request" }, + { + "code": "mixed_time_grain", + "action": "fix_request" + }, { "code": "no_matching_slice", "action": "ask_data_question", @@ -186,6 +258,10 @@ "code": "node_not_held", "action": "check_id" }, + { + "code": "non_finite_result", + "action": "fix_request" + }, { "code": "not_found", "action": "check_id" @@ -194,6 +270,10 @@ "code": "observations_unavailable", "action": "fix_request" }, + { + "code": "op_spec_invalid", + "action": "fix_request" + }, { "code": "open_role_unavailable", "action": "fix_request" @@ -206,6 +286,10 @@ "code": "operation_not_found", "action": "check_id" }, + { + "code": "operation_uncovered", + "action": "fix_request" + }, { "code": "option_target_invalid", "action": "fix_request" @@ -219,8 +303,8 @@ "action": "fix_request" }, { - "code": "pin_not_permitted", - "action": "request_scope" + "code": "payload_too_large", + "action": "fix_request" }, { "code": "pivot_not_homogeneous", @@ -238,6 +322,10 @@ "code": "pivot_over_column_cap", "action": "fix_request" }, + { + "code": "place_levels_mixed", + "action": "fix_request" + }, { "code": "population_empty", "action": "fix_request" @@ -263,6 +351,18 @@ "code": "query_too_long", "action": "fix_request" }, + { + "code": "quotient_of_no_key_matched", + "action": "fix_request" + }, + { + "code": "quotient_of_side_unit_unsupported", + "action": "fix_request" + }, + { + "code": "quotient_of_zero_denominator", + "action": "fix_request" + }, { "code": "rate_coverage_gap", "action": "fix_request", @@ -308,6 +408,10 @@ "code": "resource_exhausted", "action": "fix_request" }, + { + "code": "role_ambiguous", + "action": "fix_request" + }, { "code": "role_incompatible", "action": "fix_request", @@ -323,6 +427,18 @@ "action": "fix_request", "gap_kind": "unsupported" }, + { + "code": "rolling_anchor_unresolved", + "action": "fix_request" + }, + { + "code": "rolling_grain_unsupported", + "action": "fix_request" + }, + { + "code": "rolling_populations_differ", + "action": "fix_request" + }, { "code": "rollup_not_summable", "action": "fix_request" @@ -339,10 +455,34 @@ "code": "service_unavailable", "action": "report" }, + { + "code": "several_members", + "action": "fix_request" + }, { "code": "shape_mismatch", "action": "fix_request" }, + { + "code": "share_not_replaceable", + "action": "fix_request" + }, + { + "code": "share_of_grain_mismatch", + "action": "fix_request" + }, + { + "code": "share_of_key_unknown", + "action": "fix_request" + }, + { + "code": "share_of_key_unmatched", + "action": "fix_request" + }, + { + "code": "share_of_zero_denominator", + "action": "fix_request" + }, { "code": "skill_not_found", "action": "check_id" @@ -396,6 +536,14 @@ "code": "spec_not_found", "action": "check_id" }, + { + "code": "stat_var_unresolved", + "action": "fix_request" + }, + { + "code": "sum_of_no_key_matched", + "action": "fix_request" + }, { "code": "timed_out", "action": "ask_data_question", @@ -405,6 +553,10 @@ "code": "timeout", "action": "report" }, + { + "code": "unit_heterogeneous", + "action": "fix_request" + }, { "code": "unit_not_resolved", "action": "ask_data_question", @@ -438,6 +590,14 @@ { "code": "write_refused", "action": "request_scope" + }, + { + "code": "write_token_invalid", + "action": "stop" + }, + { + "code": "write_token_required", + "action": "fix_request" } ] } diff --git a/python/client-contract/src/dfo_client_contract/actions.schema.json b/python/client-contract/src/dfo_client_contract/actions.schema.json index a102481..884937d 100644 --- a/python/client-contract/src/dfo_client_contract/actions.schema.json +++ b/python/client-contract/src/dfo_client_contract/actions.schema.json @@ -37,6 +37,7 @@ "take_newest_version", "log_in", "request_scope", + "stop", "wait", "wait_for_reset", "report", diff --git a/python/client-contract/src/dfo_client_contract/contract.py b/python/client-contract/src/dfo_client_contract/contract.py index e21412b..a8df709 100644 --- a/python/client-contract/src/dfo_client_contract/contract.py +++ b/python/client-contract/src/dfo_client_contract/contract.py @@ -7,7 +7,8 @@ from pathlib import Path from typing import Any -# The rules under `rules/`, each a file of vectors named after the rule. +# The rules under `rules/`, each a file of vectors named after the rule: the +# client rules, then the analysis and publication rules DFO applies. RULES = ( "key-format", "credentials-path", @@ -20,6 +21,12 @@ "client-identity", "role-keys", "file-selector", + "series-left-out", + "output-digest", + "output-comparison", + "operation-outputs", + "rolling-composition", + "publication", ) diff --git a/python/client-contract/src/dfo_client_contract/dataset-ref.schema.json b/python/client-contract/src/dfo_client_contract/dataset-ref.schema.json index 4e59f21..dbf129d 100644 --- a/python/client-contract/src/dfo_client_contract/dataset-ref.schema.json +++ b/python/client-contract/src/dfo_client_contract/dataset-ref.schema.json @@ -2,26 +2,65 @@ "$schema": "https://json-schema.org/draft/2020-12/schema", "$id": "https://raw.githubusercontent.com/DevelopmentFinanceObservatory/spec-kit/main/python/client-contract/src/dfo_client_contract/dataset-ref.schema.json", "title": "DatasetRef", - "description": "The frozen reference to the exact versions a dataset holds. Every DFO client writes and reads this format, so a ref saved by one language loads in another.", - "type": "object", - "additionalProperties": false, - "required": [ - "format_version", - "members" - ], - "properties": { - "format_version": { - "const": 1 - }, - "members": { - "type": "array", - "minItems": 1, - "items": { - "$ref": "#/$defs/member" + "description": "The frozen reference to the exact versions a dataset holds. Every DFO client writes and reads this format, so a ref saved by one language loads in another. Format 1 holds dataset members, format 2 derived members, each the result of an analysis recipe.", + "if": { + "type": "object", + "required": [ + "format_version" + ], + "properties": { + "format_version": { + "const": 2 } } }, + "then": { + "$ref": "#/$defs/format_2" + }, + "else": { + "$ref": "#/$defs/format_1" + }, "$defs": { + "format_1": { + "type": "object", + "additionalProperties": false, + "required": [ + "format_version", + "members" + ], + "properties": { + "format_version": { + "const": 1 + }, + "members": { + "type": "array", + "minItems": 1, + "items": { + "$ref": "#/$defs/member" + } + } + } + }, + "format_2": { + "type": "object", + "additionalProperties": false, + "required": [ + "format_version", + "members" + ], + "properties": { + "format_version": { + "const": 2 + }, + "members": { + "type": "array", + "minItems": 1, + "items": { + "$ref": "#/$defs/derived_member" + } + } + } + }, "member": { "type": "object", "additionalProperties": false, @@ -97,40 +136,244 @@ "pattern": "^sha256:[0-9a-f]{64}$" }, "rendering": { - "description": "The selector a client matches an artifact's rendering on. Never the server's rendering object.", + "$ref": "#/$defs/rendering" + } + } + } + } + }, + "derived_member": { + "description": "The frame an analysis recipe computed. DFO computes every member below; a client copies them from the server's answer and computes none of them.", + "type": "object", + "additionalProperties": false, + "required": [ + "parts", + "sentence", + "spec", + "content_version", + "output_digest", + "roots", + "execution_identity", + "resolved_periods", + "artifact" + ], + "properties": { + "parts": { + "description": "Empty, since no answer part names a derived frame.", + "type": "array", + "maxItems": 0 + }, + "sentence": { + "description": "The server's sentence for the derived frame.", + "type": "string", + "minLength": 1 + }, + "spec": { + "type": "object", + "additionalProperties": false, + "required": [ + "spec_id", + "recipe" + ], + "properties": { + "spec_id": { + "$ref": "#/$defs/ops_id" + }, + "recipe": { + "description": "The recipe's two hashes. `normal_form_hash` names the computation whatever data it ran on; `replay_key` names it on these roots under this execution identity.", "type": "object", "additionalProperties": false, "required": [ - "format", - "bundle" + "normal_form_hash", + "replay_key" ], "properties": { - "format": { - "enum": [ - "csv", - "xlsx", - "parquet" - ] - }, - "bundle": { - "type": "boolean" + "normal_form_hash": { + "type": "string", + "pattern": "^rnf_[0-9a-f]{32}$" }, - "layout": { - "const": "frame" - }, - "without_party_totals": { - "description": "Selects the artifact rendered with party totals left out. The key is absent for a plain rendering, so `false` is not a valid value.", - "const": true + "replay_key": { + "type": "string", + "pattern": "^rpk_[0-9a-f]{32}$" } } } } + }, + "content_version": { + "type": "string", + "pattern": "^ocv_[0-9a-f]{32}$" + }, + "output_digest": { + "description": "The digest of the frame's output alone, as rules/README.md defines it. `same_data` compares it.", + "type": "string", + "pattern": "^out_[0-9a-f]{32}$" + }, + "roots": { + "description": "The dataset versions the recipe ran on, each with the rendering it read.", + "type": "array", + "minItems": 1, + "uniqueItems": true, + "items": { + "$ref": "#/$defs/root" + } + }, + "execution_identity": { + "description": "The engine, frame grammar and reduction policy versions that ran the recipe, joined by `|`.", + "type": "string", + "pattern": "^[0-9A-Za-z.+-]+\\|[0-9A-Za-z.+-]+\\|[0-9A-Za-z.+-]+$" + }, + "resolved_periods": { + "description": "Each period the recipe states relative to the latest period, with the period it resolved to. Empty for a recipe that states none.", + "type": "array", + "uniqueItems": true, + "items": { + "type": "object", + "additionalProperties": false, + "required": [ + "anchor", + "offset", + "rule", + "period" + ], + "properties": { + "anchor": { + "const": "latest" + }, + "offset": { + "type": "integer", + "maximum": 0 + }, + "rule": { + "const": "half1" + }, + "period": { + "type": "string", + "pattern": "^[0-9]{4}$" + } + } + } + }, + "artifact": { + "type": "object", + "additionalProperties": false, + "required": [ + "digest", + "rendering" + ], + "properties": { + "digest": { + "type": "string", + "pattern": "^sha256:[0-9a-f]{64}$" + }, + "rendering": { + "$ref": "#/$defs/rendering" + } + } } } }, + "root": { + "type": "object", + "additionalProperties": false, + "required": [ + "spec_id", + "content_version", + "rendering" + ], + "properties": { + "spec_id": { + "$ref": "#/$defs/spec_id" + }, + "content_version": { + "$ref": "#/$defs/member/properties/content_version" + }, + "rendering": { + "$ref": "#/$defs/root_rendering" + } + } + }, + "root_rendering": { + "description": "The rendering an analysis read a root in: the members of the artifact selector, and `groupby` when the analysis read the root summed. `rendering`, the artifact selector, has no `groupby`.", + "$ref": "#/$defs/selector", + "properties": { + "groupby": { + "$ref": "#/$defs/groupby" + } + }, + "unevaluatedProperties": false + }, + "groupby": { + "description": "The sum the root was read with, the mint option `options.groupby` as DFO records it: one row per distinct combination of the columns `by` keeps, every other summable axis summed away. `levels` rolls each kept hierarchical axis it names up to the ancestor at that depth before the sum, 0 being the root codes. The key is absent when no level is set.", + "type": "object", + "additionalProperties": false, + "required": [ + "by", + "op" + ], + "properties": { + "by": { + "type": "array", + "minItems": 1, + "uniqueItems": true, + "items": { + "type": "string", + "minLength": 1 + } + }, + "op": { + "const": "sum" + }, + "levels": { + "type": "object", + "minProperties": 1, + "additionalProperties": { + "type": "integer", + "minimum": 0, + "maximum": 99 + } + } + } + }, + "selector": { + "description": "The members of the selector a client matches an artifact's rendering on, shared by an artifact's rendering and a derived member's root rendering.", + "type": "object", + "required": [ + "format", + "bundle" + ], + "properties": { + "format": { + "enum": [ + "csv", + "xlsx", + "parquet" + ] + }, + "bundle": { + "type": "boolean" + }, + "layout": { + "const": "frame" + }, + "without_party_totals": { + "description": "Selects the artifact rendered with party totals left out. The key is absent for a plain rendering, so `false` is not a valid value.", + "const": true + } + } + }, + "rendering": { + "description": "The selector a client matches an artifact's rendering on. Never the server's rendering object.", + "$ref": "#/$defs/selector", + "unevaluatedProperties": false + }, "spec_id": { "type": "string", "pattern": "^spec_[0-9a-f]{32}$" + }, + "ops_id": { + "type": "string", + "pattern": "^ops_[0-9a-f]{32}$" } } } diff --git a/python/client-contract/src/dfo_client_contract/refs/ref-artifact-groupby-rejected.json b/python/client-contract/src/dfo_client_contract/refs/ref-artifact-groupby-rejected.json new file mode 100644 index 0000000..c280c1a --- /dev/null +++ b/python/client-contract/src/dfo_client_contract/refs/ref-artifact-groupby-rejected.json @@ -0,0 +1,82 @@ +{ + "format_version": 1, + "name": "ref-artifact-groupby-rejected", + "description": "An artifact's rendering selects a file and names no groupby: only a derived member's root records the sum it was read with.", + "scenario": "fetch-spec-known-sentence", + "ref": { + "format_version": 2, + "members": [ + { + "parts": [], + "sentence": "Change in Germany's gross ODA disbursements to Nigeria by top-level purpose, 2020 to 2023. Computed by DFO from OECD Creditor Reporting System (CRS).", + "spec": { + "spec_id": "ops_40511987433085c4f2dadc6b7aae2755", + "recipe": { + "normal_form_hash": "rnf_920ac02001d7529fd9c17ebadb452c99", + "replay_key": "rpk_a0a019687e913a1204cbcb089a58492f" + } + }, + "content_version": "ocv_6b4b9814c24f8d0c94624826c0c7773e", + "output_digest": "out_6927b7d353696180a34110d8dde723d6", + "roots": [ + { + "spec_id": "spec_cb5baa4161de718f18583060674dbca6", + "content_version": "cv_bf242138f8d0a892c97da9373d1626f4", + "rendering": { + "format": "parquet", + "bundle": false, + "layout": "frame", + "without_party_totals": true, + "groupby": { + "by": [ + "crsPurpose", + "time_period" + ], + "op": "sum", + "levels": { + "crsPurpose": 0 + } + } + } + } + ], + "execution_identity": "0.9.0|1.1.0|0.2.0", + "resolved_periods": [ + { + "anchor": "latest", + "offset": -3, + "rule": "half1", + "period": "2020" + }, + { + "anchor": "latest", + "offset": 0, + "rule": "half1", + "period": "2023" + } + ], + "artifact": { + "digest": "sha256:2f052058736db19e262bb8496f0da6c90f9deef851cb0224cff42dfb04bd0bd1", + "rendering": { + "format": "parquet", + "bundle": false, + "layout": "frame", + "groupby": { + "by": [ + "crsPurpose", + "time_period" + ], + "op": "sum", + "levels": { + "crsPurpose": 0 + } + } + } + } + } + ] + }, + "error": { + "by": "schema" + } +} diff --git a/python/client-contract/src/dfo_client_contract/refs/ref-dataset-member-in-format-2-rejected.json b/python/client-contract/src/dfo_client_contract/refs/ref-dataset-member-in-format-2-rejected.json new file mode 100644 index 0000000..bda6c56 --- /dev/null +++ b/python/client-contract/src/dfo_client_contract/refs/ref-dataset-member-in-format-2-rejected.json @@ -0,0 +1,99 @@ +{ + "format_version": 1, + "name": "ref-dataset-member-in-format-2-rejected", + "description": "Format 2 holds derived members only. A ref of dataset members is written as format 1.", + "scenario": "fetch-spec-known-sentence", + "ref": { + "format_version": 2, + "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).", + "spec": { + "spec_id": "spec_cb5baa4161de718f18583060674dbca6", + "definition": { + "schema_version": 1, + "spec_id": "spec_cb5baa4161de718f18583060674dbca6", + "identity": { + "identity_version": "spec1", + "shape": { + "kind": "statvar_schema", + "population_type": "FinancialFlow", + "measured_property": "amount", + "stat_type": "measuredValue", + "measurement_qualifier": "Nominal" + }, + "slots": [ + { + "property": "crsCooperationModality", + "binding": { + "state": "unbound" + } + }, + { + "property": "crsPurpose", + "binding": { + "state": "value", + "ref": "CRSPurposeCode12220" + } + }, + { + "property": "crsTypeOfFinance", + "binding": { + "state": "unbound" + } + }, + { + "property": "crsTypeOfFlow", + "binding": { + "state": "value", + "ref": "CRSTypeOfFlow10" + } + }, + { + "property": "financialFlowType", + "binding": { + "state": "value", + "ref": "Disbursement" + } + }, + { + "property": "nettingBasis", + "binding": { + "state": "value", + "ref": "Gross" + } + } + ], + "entities": { + "destination": [ + "country/NGA" + ], + "origin": [ + "country/DEU" + ] + }, + "requested_window": { + "kind": "range", + "start_year": 2020, + "end_year": 2023 + } + } + } + }, + "content_version": "cv_bf242138f8d0a892c97da9373d1626f4", + "artifact": { + "digest": "sha256:c44200969f19d73104d1bc24ebca905e59f749c2939234cdde10ba6f5a131170", + "rendering": { + "format": "parquet", + "bundle": false, + "without_party_totals": true + } + } + } + ] + }, + "error": { + "by": "schema" + } +} diff --git a/python/client-contract/src/dfo_client_contract/refs/ref-derived-grouped-root.json b/python/client-contract/src/dfo_client_contract/refs/ref-derived-grouped-root.json new file mode 100644 index 0000000..8b27887 --- /dev/null +++ b/python/client-contract/src/dfo_client_contract/refs/ref-derived-grouped-root.json @@ -0,0 +1,70 @@ +{ + "format_version": 1, + "name": "ref-derived-grouped-root", + "description": "A format 2 ref naming a growth over a root of fetch-spec-known-sentence read summed, as a breakdown by purpose reads it: the root's rendering carries the groupby the analysis read it with, which keeps the time period and the purpose rolled up to its root codes and sums every other axis away.", + "scenario": "fetch-spec-known-sentence", + "ref": { + "format_version": 2, + "members": [ + { + "parts": [], + "sentence": "Change in Germany's gross ODA disbursements to Nigeria by top-level purpose, 2020 to 2023. Computed by DFO from OECD Creditor Reporting System (CRS).", + "spec": { + "spec_id": "ops_40511987433085c4f2dadc6b7aae2755", + "recipe": { + "normal_form_hash": "rnf_920ac02001d7529fd9c17ebadb452c99", + "replay_key": "rpk_a0a019687e913a1204cbcb089a58492f" + } + }, + "content_version": "ocv_6b4b9814c24f8d0c94624826c0c7773e", + "output_digest": "out_6927b7d353696180a34110d8dde723d6", + "roots": [ + { + "spec_id": "spec_cb5baa4161de718f18583060674dbca6", + "content_version": "cv_bf242138f8d0a892c97da9373d1626f4", + "rendering": { + "format": "parquet", + "bundle": false, + "layout": "frame", + "without_party_totals": true, + "groupby": { + "by": [ + "crsPurpose", + "time_period" + ], + "op": "sum", + "levels": { + "crsPurpose": 0 + } + } + } + } + ], + "execution_identity": "0.9.0|1.1.0|0.2.0", + "resolved_periods": [ + { + "anchor": "latest", + "offset": -3, + "rule": "half1", + "period": "2020" + }, + { + "anchor": "latest", + "offset": 0, + "rule": "half1", + "period": "2023" + } + ], + "artifact": { + "digest": "sha256:2f052058736db19e262bb8496f0da6c90f9deef851cb0224cff42dfb04bd0bd1", + "rendering": { + "format": "parquet", + "bundle": false, + "layout": "frame" + } + } + } + ] + }, + "expect": "accept" +} diff --git a/python/client-contract/src/dfo_client_contract/refs/ref-derived-in-format-1-rejected.json b/python/client-contract/src/dfo_client_contract/refs/ref-derived-in-format-1-rejected.json new file mode 100644 index 0000000..82dc189 --- /dev/null +++ b/python/client-contract/src/dfo_client_contract/refs/ref-derived-in-format-1-rejected.json @@ -0,0 +1,62 @@ +{ + "format_version": 1, + "name": "ref-derived-in-format-1-rejected", + "description": "Format 1 holds dataset members only, so a derived member needs format 2.", + "scenario": "fetch-spec-known-sentence", + "ref": { + "format_version": 1, + "members": [ + { + "parts": [], + "sentence": "Change in Germany's gross ODA disbursements to Nigeria for basic health care, 2020 to 2023. Computed by DFO from OECD Creditor Reporting System (CRS).", + "spec": { + "spec_id": "ops_e1edc6acb97615bdd9e813730378ce19", + "recipe": { + "normal_form_hash": "rnf_4e2298354b4323699033912586859aa7", + "replay_key": "rpk_1185a76368dca1b0301c899170c7dff3" + } + }, + "content_version": "ocv_3187efa2294f182bfe7cab296659b74f", + "output_digest": "out_82b81c6278499b468aa3d6a9c5a6aa6b", + "roots": [ + { + "spec_id": "spec_cb5baa4161de718f18583060674dbca6", + "content_version": "cv_bf242138f8d0a892c97da9373d1626f4", + "rendering": { + "format": "parquet", + "bundle": false, + "layout": "frame", + "without_party_totals": true + } + } + ], + "execution_identity": "0.9.0|1.1.0|0.2.0", + "resolved_periods": [ + { + "anchor": "latest", + "offset": -3, + "rule": "half1", + "period": "2020" + }, + { + "anchor": "latest", + "offset": 0, + "rule": "half1", + "period": "2023" + } + ], + "artifact": { + "digest": "sha256:4c8fec27543c7bedbe9d2c436f42c5a65f721106c128d0a55d2962c2c67de033", + "rendering": { + "format": "parquet", + "bundle": false, + "layout": "frame" + } + } + } + ] + }, + "error": { + "by": "schema" + } +} diff --git a/python/client-contract/src/dfo_client_contract/refs/ref-derived-member-fixed-window.json b/python/client-contract/src/dfo_client_contract/refs/ref-derived-member-fixed-window.json new file mode 100644 index 0000000..808c33f --- /dev/null +++ b/python/client-contract/src/dfo_client_contract/refs/ref-derived-member-fixed-window.json @@ -0,0 +1,47 @@ +{ + "format_version": 1, + "name": "ref-derived-member-fixed-window", + "description": "A format 2 ref naming a growth over a fixed window, which states no period relative to the latest and so resolves none.", + "scenario": "fetch-spec-known-sentence", + "ref": { + "format_version": 2, + "members": [ + { + "parts": [], + "sentence": "Change in Germany's gross ODA disbursements to Nigeria for basic health care, 2020 to 2023. Computed by DFO from OECD Creditor Reporting System (CRS).", + "spec": { + "spec_id": "ops_a41f297b3f33f2a7c2ac6b3cedd4d3ad", + "recipe": { + "normal_form_hash": "rnf_5f5a142beef739694b06899a7f0426a7", + "replay_key": "rpk_4f697e3235da4b9ae1404f112c2c78b6" + } + }, + "content_version": "ocv_62a72043403b8a2497cc184623df87df", + "output_digest": "out_82b81c6278499b468aa3d6a9c5a6aa6b", + "roots": [ + { + "spec_id": "spec_cb5baa4161de718f18583060674dbca6", + "content_version": "cv_bf242138f8d0a892c97da9373d1626f4", + "rendering": { + "format": "parquet", + "bundle": false, + "layout": "frame", + "without_party_totals": true + } + } + ], + "execution_identity": "0.9.0|1.1.0|0.2.0", + "resolved_periods": [], + "artifact": { + "digest": "sha256:4c8fec27543c7bedbe9d2c436f42c5a65f721106c128d0a55d2962c2c67de033", + "rendering": { + "format": "parquet", + "bundle": false, + "layout": "frame" + } + } + } + ] + }, + "expect": "accept" +} diff --git a/python/client-contract/src/dfo_client_contract/refs/ref-derived-member.json b/python/client-contract/src/dfo_client_contract/refs/ref-derived-member.json new file mode 100644 index 0000000..87a84f3 --- /dev/null +++ b/python/client-contract/src/dfo_client_contract/refs/ref-derived-member.json @@ -0,0 +1,60 @@ +{ + "format_version": 1, + "name": "ref-derived-member", + "description": "A format 2 ref naming a growth over the latest four years of the member of fetch-spec-known-sentence: its ops_ id and recipe hashes, its ocv_ version and output digest, its root with the rendering it read, the execution identity, and the two periods the recipe states relative to the latest, resolved.", + "scenario": "fetch-spec-known-sentence", + "ref": { + "format_version": 2, + "members": [ + { + "parts": [], + "sentence": "Change in Germany's gross ODA disbursements to Nigeria for basic health care, 2020 to 2023. Computed by DFO from OECD Creditor Reporting System (CRS).", + "spec": { + "spec_id": "ops_e1edc6acb97615bdd9e813730378ce19", + "recipe": { + "normal_form_hash": "rnf_4e2298354b4323699033912586859aa7", + "replay_key": "rpk_1185a76368dca1b0301c899170c7dff3" + } + }, + "content_version": "ocv_3187efa2294f182bfe7cab296659b74f", + "output_digest": "out_82b81c6278499b468aa3d6a9c5a6aa6b", + "roots": [ + { + "spec_id": "spec_cb5baa4161de718f18583060674dbca6", + "content_version": "cv_bf242138f8d0a892c97da9373d1626f4", + "rendering": { + "format": "parquet", + "bundle": false, + "layout": "frame", + "without_party_totals": true + } + } + ], + "execution_identity": "0.9.0|1.1.0|0.2.0", + "resolved_periods": [ + { + "anchor": "latest", + "offset": -3, + "rule": "half1", + "period": "2020" + }, + { + "anchor": "latest", + "offset": 0, + "rule": "half1", + "period": "2023" + } + ], + "artifact": { + "digest": "sha256:4c8fec27543c7bedbe9d2c436f42c5a65f721106c128d0a55d2962c2c67de033", + "rendering": { + "format": "parquet", + "bundle": false, + "layout": "frame" + } + } + } + ] + }, + "expect": "accept" +} diff --git a/python/client-contract/src/dfo_client_contract/refs/ref-derived-parts-rejected.json b/python/client-contract/src/dfo_client_contract/refs/ref-derived-parts-rejected.json new file mode 100644 index 0000000..830d6ea --- /dev/null +++ b/python/client-contract/src/dfo_client_contract/refs/ref-derived-parts-rejected.json @@ -0,0 +1,64 @@ +{ + "format_version": 1, + "name": "ref-derived-parts-rejected", + "description": "A derived member answers no answer part, so its parts are empty.", + "scenario": "fetch-spec-known-sentence", + "ref": { + "format_version": 2, + "members": [ + { + "parts": [ + "ODA from Germany to Nigeria for basic health care" + ], + "sentence": "Change in Germany's gross ODA disbursements to Nigeria for basic health care, 2020 to 2023. Computed by DFO from OECD Creditor Reporting System (CRS).", + "spec": { + "spec_id": "ops_e1edc6acb97615bdd9e813730378ce19", + "recipe": { + "normal_form_hash": "rnf_4e2298354b4323699033912586859aa7", + "replay_key": "rpk_1185a76368dca1b0301c899170c7dff3" + } + }, + "content_version": "ocv_3187efa2294f182bfe7cab296659b74f", + "output_digest": "out_82b81c6278499b468aa3d6a9c5a6aa6b", + "roots": [ + { + "spec_id": "spec_cb5baa4161de718f18583060674dbca6", + "content_version": "cv_bf242138f8d0a892c97da9373d1626f4", + "rendering": { + "format": "parquet", + "bundle": false, + "layout": "frame", + "without_party_totals": true + } + } + ], + "execution_identity": "0.9.0|1.1.0|0.2.0", + "resolved_periods": [ + { + "anchor": "latest", + "offset": -3, + "rule": "half1", + "period": "2020" + }, + { + "anchor": "latest", + "offset": 0, + "rule": "half1", + "period": "2023" + } + ], + "artifact": { + "digest": "sha256:4c8fec27543c7bedbe9d2c436f42c5a65f721106c128d0a55d2962c2c67de033", + "rendering": { + "format": "parquet", + "bundle": false, + "layout": "frame" + } + } + } + ] + }, + "error": { + "by": "schema" + } +} diff --git a/python/client-contract/src/dfo_client_contract/refs/ref-derived-period-after-latest-rejected.json b/python/client-contract/src/dfo_client_contract/refs/ref-derived-period-after-latest-rejected.json new file mode 100644 index 0000000..f02467c --- /dev/null +++ b/python/client-contract/src/dfo_client_contract/refs/ref-derived-period-after-latest-rejected.json @@ -0,0 +1,56 @@ +{ + "format_version": 1, + "name": "ref-derived-period-after-latest-rejected", + "description": "A resolved period counts back from the latest period, so its offset is 0 or below.", + "scenario": "fetch-spec-known-sentence", + "ref": { + "format_version": 2, + "members": [ + { + "parts": [], + "sentence": "Change in Germany's gross ODA disbursements to Nigeria for basic health care, 2020 to 2023. Computed by DFO from OECD Creditor Reporting System (CRS).", + "spec": { + "spec_id": "ops_e1edc6acb97615bdd9e813730378ce19", + "recipe": { + "normal_form_hash": "rnf_4e2298354b4323699033912586859aa7", + "replay_key": "rpk_1185a76368dca1b0301c899170c7dff3" + } + }, + "content_version": "ocv_3187efa2294f182bfe7cab296659b74f", + "output_digest": "out_82b81c6278499b468aa3d6a9c5a6aa6b", + "roots": [ + { + "spec_id": "spec_cb5baa4161de718f18583060674dbca6", + "content_version": "cv_bf242138f8d0a892c97da9373d1626f4", + "rendering": { + "format": "parquet", + "bundle": false, + "layout": "frame", + "without_party_totals": true + } + } + ], + "execution_identity": "0.9.0|1.1.0|0.2.0", + "resolved_periods": [ + { + "anchor": "latest", + "offset": 1, + "rule": "half1", + "period": "2024" + } + ], + "artifact": { + "digest": "sha256:4c8fec27543c7bedbe9d2c436f42c5a65f721106c128d0a55d2962c2c67de033", + "rendering": { + "format": "parquet", + "bundle": false, + "layout": "frame" + } + } + } + ] + }, + "error": { + "by": "schema" + } +} diff --git a/python/client-contract/src/dfo_client_contract/refs/ref-derived-repeated-spec-id-rejected.json b/python/client-contract/src/dfo_client_contract/refs/ref-derived-repeated-spec-id-rejected.json new file mode 100644 index 0000000..e42fff8 --- /dev/null +++ b/python/client-contract/src/dfo_client_contract/refs/ref-derived-repeated-spec-id-rejected.json @@ -0,0 +1,111 @@ +{ + "format_version": 1, + "name": "ref-derived-repeated-spec-id-rejected", + "description": "Each member holds a distinct spec_id, an ops_ id included.", + "scenario": "fetch-spec-known-sentence", + "ref": { + "format_version": 2, + "members": [ + { + "parts": [], + "sentence": "Change in Germany's gross ODA disbursements to Nigeria for basic health care, 2020 to 2023. Computed by DFO from OECD Creditor Reporting System (CRS).", + "spec": { + "spec_id": "ops_e1edc6acb97615bdd9e813730378ce19", + "recipe": { + "normal_form_hash": "rnf_4e2298354b4323699033912586859aa7", + "replay_key": "rpk_1185a76368dca1b0301c899170c7dff3" + } + }, + "content_version": "ocv_3187efa2294f182bfe7cab296659b74f", + "output_digest": "out_82b81c6278499b468aa3d6a9c5a6aa6b", + "roots": [ + { + "spec_id": "spec_cb5baa4161de718f18583060674dbca6", + "content_version": "cv_bf242138f8d0a892c97da9373d1626f4", + "rendering": { + "format": "parquet", + "bundle": false, + "layout": "frame", + "without_party_totals": true + } + } + ], + "execution_identity": "0.9.0|1.1.0|0.2.0", + "resolved_periods": [ + { + "anchor": "latest", + "offset": -3, + "rule": "half1", + "period": "2020" + }, + { + "anchor": "latest", + "offset": 0, + "rule": "half1", + "period": "2023" + } + ], + "artifact": { + "digest": "sha256:4c8fec27543c7bedbe9d2c436f42c5a65f721106c128d0a55d2962c2c67de033", + "rendering": { + "format": "parquet", + "bundle": false, + "layout": "frame" + } + } + }, + { + "parts": [], + "sentence": "Change in Germany's gross ODA disbursements to Nigeria for basic health care, 2020 to 2023. Computed by DFO from OECD Creditor Reporting System (CRS).", + "spec": { + "spec_id": "ops_e1edc6acb97615bdd9e813730378ce19", + "recipe": { + "normal_form_hash": "rnf_4e2298354b4323699033912586859aa7", + "replay_key": "rpk_1185a76368dca1b0301c899170c7dff3" + } + }, + "content_version": "ocv_3187efa2294f182bfe7cab296659b74f", + "output_digest": "out_82b81c6278499b468aa3d6a9c5a6aa6b", + "roots": [ + { + "spec_id": "spec_cb5baa4161de718f18583060674dbca6", + "content_version": "cv_bf242138f8d0a892c97da9373d1626f4", + "rendering": { + "format": "parquet", + "bundle": false, + "layout": "frame", + "without_party_totals": true + } + } + ], + "execution_identity": "0.9.0|1.1.0|0.2.0", + "resolved_periods": [ + { + "anchor": "latest", + "offset": -3, + "rule": "half1", + "period": "2020" + }, + { + "anchor": "latest", + "offset": 0, + "rule": "half1", + "period": "2023" + } + ], + "artifact": { + "digest": "sha256:4c8fec27543c7bedbe9d2c436f42c5a65f721106c128d0a55d2962c2c67de033", + "rendering": { + "format": "parquet", + "bundle": false, + "layout": "frame" + } + } + } + ] + }, + "error": { + "by": "rule", + "reason": "repeated_spec_id" + } +} diff --git a/python/client-contract/src/dfo_client_contract/refs/ref-derived-root-groupby-op-rejected.json b/python/client-contract/src/dfo_client_contract/refs/ref-derived-root-groupby-op-rejected.json new file mode 100644 index 0000000..1ed2bb3 --- /dev/null +++ b/python/client-contract/src/dfo_client_contract/refs/ref-derived-root-groupby-op-rejected.json @@ -0,0 +1,72 @@ +{ + "format_version": 1, + "name": "ref-derived-root-groupby-op-rejected", + "description": "A root's groupby sums, so any other op is not a ref.", + "scenario": "fetch-spec-known-sentence", + "ref": { + "format_version": 2, + "members": [ + { + "parts": [], + "sentence": "Change in Germany's gross ODA disbursements to Nigeria by top-level purpose, 2020 to 2023. Computed by DFO from OECD Creditor Reporting System (CRS).", + "spec": { + "spec_id": "ops_40511987433085c4f2dadc6b7aae2755", + "recipe": { + "normal_form_hash": "rnf_920ac02001d7529fd9c17ebadb452c99", + "replay_key": "rpk_a0a019687e913a1204cbcb089a58492f" + } + }, + "content_version": "ocv_6b4b9814c24f8d0c94624826c0c7773e", + "output_digest": "out_6927b7d353696180a34110d8dde723d6", + "roots": [ + { + "spec_id": "spec_cb5baa4161de718f18583060674dbca6", + "content_version": "cv_bf242138f8d0a892c97da9373d1626f4", + "rendering": { + "format": "parquet", + "bundle": false, + "layout": "frame", + "without_party_totals": true, + "groupby": { + "by": [ + "crsPurpose", + "time_period" + ], + "op": "mean", + "levels": { + "crsPurpose": 0 + } + } + } + } + ], + "execution_identity": "0.9.0|1.1.0|0.2.0", + "resolved_periods": [ + { + "anchor": "latest", + "offset": -3, + "rule": "half1", + "period": "2020" + }, + { + "anchor": "latest", + "offset": 0, + "rule": "half1", + "period": "2023" + } + ], + "artifact": { + "digest": "sha256:2f052058736db19e262bb8496f0da6c90f9deef851cb0224cff42dfb04bd0bd1", + "rendering": { + "format": "parquet", + "bundle": false, + "layout": "frame" + } + } + } + ] + }, + "error": { + "by": "schema" + } +} diff --git a/python/client-contract/src/dfo_client_contract/refs/ref-derived-root-without-rendering-rejected.json b/python/client-contract/src/dfo_client_contract/refs/ref-derived-root-without-rendering-rejected.json new file mode 100644 index 0000000..b038de9 --- /dev/null +++ b/python/client-contract/src/dfo_client_contract/refs/ref-derived-root-without-rendering-rejected.json @@ -0,0 +1,56 @@ +{ + "format_version": 1, + "name": "ref-derived-root-without-rendering-rejected", + "description": "Each root records the rendering the recipe read, since a cut with party totals left out and a plain one are two inputs.", + "scenario": "fetch-spec-known-sentence", + "ref": { + "format_version": 2, + "members": [ + { + "parts": [], + "sentence": "Change in Germany's gross ODA disbursements to Nigeria for basic health care, 2020 to 2023. Computed by DFO from OECD Creditor Reporting System (CRS).", + "spec": { + "spec_id": "ops_e1edc6acb97615bdd9e813730378ce19", + "recipe": { + "normal_form_hash": "rnf_4e2298354b4323699033912586859aa7", + "replay_key": "rpk_1185a76368dca1b0301c899170c7dff3" + } + }, + "content_version": "ocv_3187efa2294f182bfe7cab296659b74f", + "output_digest": "out_82b81c6278499b468aa3d6a9c5a6aa6b", + "roots": [ + { + "spec_id": "spec_cb5baa4161de718f18583060674dbca6", + "content_version": "cv_bf242138f8d0a892c97da9373d1626f4" + } + ], + "execution_identity": "0.9.0|1.1.0|0.2.0", + "resolved_periods": [ + { + "anchor": "latest", + "offset": -3, + "rule": "half1", + "period": "2020" + }, + { + "anchor": "latest", + "offset": 0, + "rule": "half1", + "period": "2023" + } + ], + "artifact": { + "digest": "sha256:4c8fec27543c7bedbe9d2c436f42c5a65f721106c128d0a55d2962c2c67de033", + "rendering": { + "format": "parquet", + "bundle": false, + "layout": "frame" + } + } + } + ] + }, + "error": { + "by": "schema" + } +} diff --git a/python/client-contract/src/dfo_client_contract/refs/ref-derived-without-output-digest-rejected.json b/python/client-contract/src/dfo_client_contract/refs/ref-derived-without-output-digest-rejected.json new file mode 100644 index 0000000..6947fcf --- /dev/null +++ b/python/client-contract/src/dfo_client_contract/refs/ref-derived-without-output-digest-rejected.json @@ -0,0 +1,61 @@ +{ + "format_version": 1, + "name": "ref-derived-without-output-digest-rejected", + "description": "A derived member carries the output digest same_data compares.", + "scenario": "fetch-spec-known-sentence", + "ref": { + "format_version": 2, + "members": [ + { + "parts": [], + "sentence": "Change in Germany's gross ODA disbursements to Nigeria for basic health care, 2020 to 2023. Computed by DFO from OECD Creditor Reporting System (CRS).", + "spec": { + "spec_id": "ops_e1edc6acb97615bdd9e813730378ce19", + "recipe": { + "normal_form_hash": "rnf_4e2298354b4323699033912586859aa7", + "replay_key": "rpk_1185a76368dca1b0301c899170c7dff3" + } + }, + "content_version": "ocv_3187efa2294f182bfe7cab296659b74f", + "roots": [ + { + "spec_id": "spec_cb5baa4161de718f18583060674dbca6", + "content_version": "cv_bf242138f8d0a892c97da9373d1626f4", + "rendering": { + "format": "parquet", + "bundle": false, + "layout": "frame", + "without_party_totals": true + } + } + ], + "execution_identity": "0.9.0|1.1.0|0.2.0", + "resolved_periods": [ + { + "anchor": "latest", + "offset": -3, + "rule": "half1", + "period": "2020" + }, + { + "anchor": "latest", + "offset": 0, + "rule": "half1", + "period": "2023" + } + ], + "artifact": { + "digest": "sha256:4c8fec27543c7bedbe9d2c436f42c5a65f721106c128d0a55d2962c2c67de033", + "rendering": { + "format": "parquet", + "bundle": false, + "layout": "frame" + } + } + } + ] + }, + "error": { + "by": "schema" + } +} 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 7eb40e4..48d3a49 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, and the reading-order, client-identity, role-keys and file-selector rules 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. +Clients implement these rules for the capabilities available in their runtime. The first twelve rules, from credentials path to series left out, are client rules, and Python implements all twelve. TypeScript implements the key, credentials and base-URL rules in Node, and the reading-order, client-identity, role-keys, file-selector and series-left-out rules 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. The last five rules, from output digest to publication, are DFO's: dfo-apis applies them where it computes, stores and publishes, and a client reads their results. Of these, a client implements only the output comparison, over the digests DFO gives it, as `==` and `same_data` in Python and `equals` and `sameData` in TypeScript. 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`) @@ -120,3 +120,33 @@ The server replaces a spec's whole binding with the posted one, so a client post ## File selector (`file-selector`) The file selector, `GET /datasets/{spec_id}/{content_version}/file`, redirects to a stored version's file in a rendering. A client asks it for a ref member's version when the files route at the stored digest refuses, or when the snapshot manifest lists no artifact of that digest. Its query holds the keys `query_keys` in `file-selector.json` lists, `format`, `bundle` and `layout`, in that order, each one the member's rendering holds, as `key=value` pairs joined by `&`, with booleans written `true` and `false`. The query leaves out `without_party_totals`: the version records the cut it was minted with, and the server lays that over the query. The server refuses any other key with 400 `request_invalid`, so a selector query that carried the cut would end the lookup. A vector gives the `rendering` and the `query` a client sends, without the leading `?`. + +## Series left out (`series-left-out`) + +A derived member's manifest, from `GET /datasets/derived/{ops_id}/{ocv_version}`, lists in `left_out` every series a step of its recipe dropped for a data gap, such as a growth endpoint the series lacks or a key the other side holds no partner for. Each entry names the series' `coordinates`, its `step` as the verb and node index, the `side` it came from, the engine's `reason` and its `rows`. `left_out_complete` is false when the steps dropped more series than `left_out` lists. Both are null for a recipe stored without them. + +A fetch of derived members issues `series_left_out`, as `SeriesLeftOutWarning`, once when any member's manifest lists a left-out series or says `left_out_complete` false, and returns the frame. A strict fetch raises the warning in place of the data. A null `left_out` issues nothing. A vector gives each member's `left_out` and `left_out_complete` in member order, and `strict`, then the `warnings` the fetch issues or the warning it `raises`. + +## Output digest (`output-digest`) + +A derived member's `output_digest` names the output of its frame: its values, with the variable, members, period and unit each belongs to, and nothing about how they were computed. DFO computes it when it stores a derived frame, and a client copies it from the server's answer. + +The digest is taken over a frame as `docs/frame-grammar-v1.md` defines it. Its document is the RFC 8785 (JCS) serialisation of `{"digest_version": "out2", "columns": [...], "rows": [...]}`. `columns` lists `stat_var`, then the frame's role columns in the frame's order, then `time_period`, `value` and `unit`. Each row holds the frame row's cells in those columns, with `recipe` dropped from every unit-request object, in a `unit` cell and in either part of a composed unit. The rows are sorted by the UTF-8 bytes of each row's own JCS serialisation, ascending, and a row that repeats another stays. The digest is `out_` followed by the first 32 lowercase hexadecimal characters of the SHA-256 of the document's UTF-8 bytes. + +The document leaves out `measurementMethod`, `provenance` and `status`, and a unit's `recipe`. These name the source an output came from and how its unit was converted, so they move when a source is imported again or a conversion recipe is revised while no number moves. `stat_var` stays in, so two frames that hold the same values under different variables hold different outputs. A join writes each side's rows under that side's variable, so a join with its sides swapped holds the same rows and the same output, while a frame holding each side's values under the other side's variable holds another. `compare`, `sum_of`, `share_of` and `quotient_of` write rows under a variable of their own (`operation-outputs`), which a frame spells `dcid:` and the step's `ops_` id. That id hashes the versions the step read and, through their `ocv_` versions, the engine that computed them, so the document reads that variable under a name built from what was computed. The name is `mv_` and the first 32 hex digits of the SHA-256 of a name document, the JCS serialisation of an object holding `verb`, the step's verb, and one member per frame slot the step fills, keyed by the slot's name in the recipe tree (`frame_ref`, `right_frame_ref`, `denominator_frame_ref`), each the names of the variables that slot's input carries, sorted by their UTF-8 bytes. A root dataset carries its frame's `stat_var` values, `filter`, `aggregate`, `rank` and `growth` carry their input's variables, `join` the union of its inputs', and a step that writes its own variable carries that variable's `mv_` name. A name document thus holds the names of its inputs and not their documents, so every name is 35 characters however deep the recipe, and a name document grows only with the variables the roots under it hold. The prefix marks the name as computed, apart from a dataset's `dcid:` variable and an operation's `ops_` id, in the style of the `out_` digest. A one-step `quotient_of` of ODA by population has the name document `{"denominator_frame_ref":["dcid:Count_Person"],"frame_ref":["dcid:Amount_ODA"],"verb":"quotient_of"}` and names its variable `mv_d355e59c50ff8cf07e86a4da12b64297`. Equal computations over equal variables thus share a digest across recipes, engine releases and upstream rebuilds that move no number, and a step with its sides swapped holds another. A `filter` that narrows a root holding several variables leaves the name listing all of them, which errs towards two outputs differing. A vector gives the `frame`, the `variables` its operations wrote where it holds any, each name keyed by its `ops_` id, the `name_documents` of those names and of every `mv_` name their documents hold, each keyed by its name, the `document` as text and the `digest`. `quotient-of-a-sum-of` divides a `sum_of` by population, so its name document lists the `sum_of` step's `mv_` name. Vectors whose frames differ only in what the document leaves out, in row order, or in the `ops_` id of a variable named alike, share a digest. + +## Output comparison (`output-comparison`) + +Two refs answer two questions. `==` in Python and `equals` in TypeScript say whether two refs name the same versions, recipes and renderings: they hold as many members, and each member matches the other ref's member at its position on its `spec_id`, its `content_version`, its artifact's `rendering` and, for a derived member, its `recipe`. A rolling recipe and a fixed one therefore stay apart in a cache even when their rows match. `same_data` in Python and `sameData` in TypeScript say whether two refs hold the same output: they hold as many members, and at each position both members are derived members with the same `output_digest`, or both are dataset members with the same `content_version` and the same `without_party_totals`. A dataset version's `content_version` already hashes its frame alone, so a dataset member needs no digest of its own, and its layout and file format hold the same rows and do not enter. A dataset member and a derived member never hold the same output. Both comparisons ignore `format_version`, `parts`, `sentence`, artifact digests, roots, execution identities and resolved periods. So an engine release or an upstream rebuild that moves no number keeps `same_data` true, and a pipeline that rebuilds on `not same_data` rebuilds only when an output moved. This holds for an output under a variable its operation wrote, since the digest names that variable by its verb and its inputs' variables (`output-digest`), so a one-step `quotient_of` and a `filter` that keeps every row followed by the same `quotient_of` hold the same data. A vector gives two refs, `left` and `right`, and the two verdicts, which hold either way round. + +## Operation outputs (`operation-outputs`) + +DFO's operations keep the units and shapes Studio's have. `share_of` gives a share in per cent, 100 times the ratio, under the unit `Percent`. With a second reading, each row of `data` is divided by the row of `other` that `on` pairs it with in the same period. With none, each member of `by` is divided by the total across every member in the same period, after its own rows add up. `join` returns the rows of both readings that `on` pairs, in long format: one row per side for each key and period both hold, told apart by `stat_var`, each keeping its own unit. `compare` gives `data` minus `other`, and `sum_of` gives `data` plus `other`, for each paired member and period both hold, in the unit both share. A relative `growth` is a fraction in the `value` column, 0.25 for 25 per cent, with no unit, and an absolute one is the change in the input's unit. A growth row's period is the window as a span, such as `2018/2022`, and a member without a value at both ends has no row. A relative growth also leaves out a member whose start or end value is zero or whose values change sign (`zero_or_sign_crossing_base`), and either growth leaves out a change that is not finite (`non_finite`). Two rows of one member in one period of the window refuse the step with `role_ambiguous`. An output keeps `data`'s names for the roles `on` pairs. `share_of`, `compare` and `sum_of` write rows under a variable of their own, whose spelling is the operation's; `join` and `growth` keep their inputs' variables. A vector gives the `verb`, its `arguments`, the rows of `data` and of `other`, and either the output `rows`, in any order and leaving `stat_var` out of a row an operation writes under its own variable, or the `error`. + +## Rolling composition (`rolling-composition`) + +A recipe tree has one latest period. Each rolling step of the tree states the populations it counts the latest period over, one for each root dataset it reads with the columns it narrows that dataset's series by. Every rolling step of one tree states the same populations, compared in their one spelling, whatever order they are listed in. A tree whose rolling steps state different populations is refused with `rolling_populations_differ` before anything runs, whether they would settle on different years or on the same one. The latest period is then the newest period at least half of the series of every population hold, the `half1` rule of `dfo_frame_grammar.latest_anchor`. A population no series falls in, or populations no period satisfies, refuse `rolling_anchor_unresolved`. A vector gives every `series` of the roots with the periods it holds, the rolling `steps` with their populations, and the `period` or the `error`. + +## Publication (`publication`) + +A share publishes cards under a stable URL, live with `latest` true or as a snapshot with it false. It holds numbered slots, the first card in slot 1, and each slot's embed and data URLs are named by its number. Creating a share returns a write token. Replacing a share's cards and taking it down each need that token: without one they are refused with `write_token_required`, and with another token, or on a share created without one, with `write_token_invalid`. The token is checked first. Only a live share can be replaced, and a snapshot refuses `share_not_replaceable`, so a cited snapshot URL draws the same figure for good. A replacement puts its cards in slots 1 onwards, so every URL a share has published keeps working: a slot past the replacement's last card holds no card until a later replacement fills it again. A refused step changes nothing. A snapshot is taken down like a live share. A vector gives the `steps`, each naming a share, and one outcome per step: the share's `latest` and slots, `removed`, or the `error`. A step's `write_token` is `held` for the token the share's creation returned and `other` for another one. diff --git a/python/client-contract/src/dfo_client_contract/rules/operation-outputs.json b/python/client-contract/src/dfo_client_contract/rules/operation-outputs.json new file mode 100644 index 0000000..556fc17 --- /dev/null +++ b/python/client-contract/src/dfo_client_contract/rules/operation-outputs.json @@ -0,0 +1,684 @@ +{ + "format_version": 1, + "rule": "operation-outputs", + "vectors": [ + { + "name": "share-of-in-percent", + "description": "ODA as a share of GNI comes back in per cent, 100 times the ratio, under the Percent unit, keyed by data's role. Ghana has no GNI row and Nigeria no ODA row, so neither has a share.", + "verb": "share_of", + "arguments": { + "on": { + "destination": "observationAbout" + } + }, + "data": [ + { + "stat_var": "dcid:Amount_FinancialFlow_ODA_Disbursement", + "destination": "country/KEN", + "time_period": "2022", + "value": 300.0, + "unit": "USDollar" + }, + { + "stat_var": "dcid:Amount_FinancialFlow_ODA_Disbursement", + "destination": "country/KEN", + "time_period": "2023", + "value": 250.0, + "unit": "USDollar" + }, + { + "stat_var": "dcid:Amount_FinancialFlow_ODA_Disbursement", + "destination": "country/GHA", + "time_period": "2022", + "value": 90.0, + "unit": "USDollar" + } + ], + "other": [ + { + "stat_var": "dcid:Amount_EconomicActivity_GrossNationalIncome", + "observationAbout": "country/KEN", + "time_period": "2022", + "value": 120000.0, + "unit": "USDollar" + }, + { + "stat_var": "dcid:Amount_EconomicActivity_GrossNationalIncome", + "observationAbout": "country/KEN", + "time_period": "2023", + "value": 125000.0, + "unit": "USDollar" + }, + { + "stat_var": "dcid:Amount_EconomicActivity_GrossNationalIncome", + "observationAbout": "country/NGA", + "time_period": "2022", + "value": 400000.0, + "unit": "USDollar" + } + ], + "rows": [ + { + "destination": "country/KEN", + "time_period": "2022", + "value": 0.25, + "unit": "Percent" + }, + { + "destination": "country/KEN", + "time_period": "2023", + "value": 0.2, + "unit": "Percent" + } + ] + }, + { + "name": "share-of-across-members", + "description": "With no second reading, each member of by gets its share of the total across every member in the same year: donors giving 40 and 60 get 40 and 60 per cent. A donor's rows to several recipients add up first.", + "verb": "share_of", + "arguments": { + "by": [ + "origin" + ] + }, + "data": [ + { + "stat_var": "dcid:Amount_FinancialFlow_ODA_Disbursement", + "origin": "country/DEU", + "destination": "country/ETH", + "time_period": "2024", + "value": 40.0, + "unit": "USDollar" + }, + { + "stat_var": "dcid:Amount_FinancialFlow_ODA_Disbursement", + "origin": "country/FRA", + "destination": "country/ETH", + "time_period": "2024", + "value": 60.0, + "unit": "USDollar" + }, + { + "stat_var": "dcid:Amount_FinancialFlow_ODA_Disbursement", + "origin": "country/DEU", + "destination": "country/ETH", + "time_period": "2023", + "value": 30.0, + "unit": "USDollar" + }, + { + "stat_var": "dcid:Amount_FinancialFlow_ODA_Disbursement", + "origin": "country/FRA", + "destination": "country/ETH", + "time_period": "2023", + "value": 10.0, + "unit": "USDollar" + }, + { + "stat_var": "dcid:Amount_FinancialFlow_ODA_Disbursement", + "origin": "country/FRA", + "destination": "country/SOM", + "time_period": "2023", + "value": 10.0, + "unit": "USDollar" + } + ], + "rows": [ + { + "origin": "country/DEU", + "time_period": "2024", + "value": 40.0, + "unit": "Percent" + }, + { + "origin": "country/FRA", + "time_period": "2024", + "value": 60.0, + "unit": "Percent" + }, + { + "origin": "country/DEU", + "time_period": "2023", + "value": 60.0, + "unit": "Percent" + }, + { + "origin": "country/FRA", + "time_period": "2023", + "value": 40.0, + "unit": "Percent" + } + ] + }, + { + "name": "join-long-format", + "description": "join returns both readings' matched rows in long format, one row per side, told apart by stat_var, each side keeping its own unit, the key named as data names it.", + "verb": "join", + "arguments": { + "on": { + "destination": "observationAbout" + } + }, + "data": [ + { + "stat_var": "dcid:Amount_FinancialFlow_ODA_Disbursement", + "destination": "country/KEN", + "time_period": "2022", + "value": 300.0, + "unit": "USDollar" + }, + { + "stat_var": "dcid:Amount_FinancialFlow_ODA_Disbursement", + "destination": "country/KEN", + "time_period": "2023", + "value": 250.0, + "unit": "USDollar" + }, + { + "stat_var": "dcid:Amount_FinancialFlow_ODA_Disbursement", + "destination": "country/GHA", + "time_period": "2022", + "value": 90.0, + "unit": "USDollar" + } + ], + "other": [ + { + "stat_var": "dcid:Amount_EconomicActivity_GrossNationalIncome", + "observationAbout": "country/KEN", + "time_period": "2022", + "value": 120000.0, + "unit": "USDollar" + }, + { + "stat_var": "dcid:Amount_EconomicActivity_GrossNationalIncome", + "observationAbout": "country/KEN", + "time_period": "2023", + "value": 125000.0, + "unit": "USDollar" + }, + { + "stat_var": "dcid:Amount_EconomicActivity_GrossNationalIncome", + "observationAbout": "country/NGA", + "time_period": "2022", + "value": 400000.0, + "unit": "USDollar" + } + ], + "rows": [ + { + "stat_var": "dcid:Amount_FinancialFlow_ODA_Disbursement", + "destination": "country/KEN", + "time_period": "2022", + "value": 300.0, + "unit": "USDollar" + }, + { + "stat_var": "dcid:Amount_EconomicActivity_GrossNationalIncome", + "destination": "country/KEN", + "time_period": "2022", + "value": 120000.0, + "unit": "USDollar" + }, + { + "stat_var": "dcid:Amount_FinancialFlow_ODA_Disbursement", + "destination": "country/KEN", + "time_period": "2023", + "value": 250.0, + "unit": "USDollar" + }, + { + "stat_var": "dcid:Amount_EconomicActivity_GrossNationalIncome", + "destination": "country/KEN", + "time_period": "2023", + "value": 125000.0, + "unit": "USDollar" + } + ] + }, + { + "name": "compare-data-minus-other", + "description": "compare gives data minus other for each paired member and period both hold, in the unit both share.", + "verb": "compare", + "arguments": { + "on": { + "destination": "observationAbout" + } + }, + "data": [ + { + "stat_var": "dcid:Amount_FinancialFlow_ODA_Disbursement", + "destination": "country/KEN", + "time_period": "2022", + "value": 300.0, + "unit": "USDollar" + }, + { + "stat_var": "dcid:Amount_FinancialFlow_ODA_Disbursement", + "destination": "country/KEN", + "time_period": "2023", + "value": 250.0, + "unit": "USDollar" + } + ], + "other": [ + { + "stat_var": "dcid:Amount_FinancialFlow_ODA_NetDisbursement", + "observationAbout": "country/KEN", + "time_period": "2022", + "value": 280.0, + "unit": "USDollar" + }, + { + "stat_var": "dcid:Amount_FinancialFlow_ODA_NetDisbursement", + "observationAbout": "country/KEN", + "time_period": "2023", + "value": 265.5, + "unit": "USDollar" + } + ], + "rows": [ + { + "destination": "country/KEN", + "time_period": "2022", + "value": 20.0, + "unit": "USDollar" + }, + { + "destination": "country/KEN", + "time_period": "2023", + "value": -15.5, + "unit": "USDollar" + } + ] + }, + { + "name": "sum-of-paired", + "description": "sum_of adds the paired rows of two readings over the periods both hold, in the unit both share.", + "verb": "sum_of", + "arguments": { + "on": { + "destination": "observationAbout" + } + }, + "data": [ + { + "stat_var": "dcid:Amount_FinancialFlow_ODA_Disbursement", + "destination": "country/KEN", + "time_period": "2022", + "value": 300.0, + "unit": "USDollar" + }, + { + "stat_var": "dcid:Amount_FinancialFlow_ODA_Disbursement", + "destination": "country/KEN", + "time_period": "2023", + "value": 250.0, + "unit": "USDollar" + } + ], + "other": [ + { + "stat_var": "dcid:Amount_FinancialFlow_ODA_NetDisbursement", + "observationAbout": "country/KEN", + "time_period": "2022", + "value": 280.0, + "unit": "USDollar" + }, + { + "stat_var": "dcid:Amount_FinancialFlow_ODA_NetDisbursement", + "observationAbout": "country/KEN", + "time_period": "2023", + "value": 265.5, + "unit": "USDollar" + } + ], + "rows": [ + { + "destination": "country/KEN", + "time_period": "2022", + "value": 580.0, + "unit": "USDollar" + }, + { + "destination": "country/KEN", + "time_period": "2023", + "value": 515.5, + "unit": "USDollar" + } + ] + }, + { + "name": "growth-as-a-fraction", + "description": "A relative growth is a fraction in the value column, 0.25 for 25 per cent, with no unit, its period the window as a span. Nigeria has no 2018 value, so it has no growth.", + "verb": "growth", + "arguments": { + "by": [ + "destination" + ], + "window": [ + "2018", + "2022" + ] + }, + "data": [ + { + "stat_var": "dcid:Amount_FinancialFlow_ODA_Disbursement", + "destination": "country/KEN", + "time_period": "2018", + "value": 200.0, + "unit": "USDollar" + }, + { + "stat_var": "dcid:Amount_FinancialFlow_ODA_Disbursement", + "destination": "country/KEN", + "time_period": "2022", + "value": 250.0, + "unit": "USDollar" + }, + { + "stat_var": "dcid:Amount_FinancialFlow_ODA_Disbursement", + "destination": "country/GHA", + "time_period": "2018", + "value": 80.0, + "unit": "USDollar" + }, + { + "stat_var": "dcid:Amount_FinancialFlow_ODA_Disbursement", + "destination": "country/GHA", + "time_period": "2022", + "value": 70.0, + "unit": "USDollar" + }, + { + "stat_var": "dcid:Amount_FinancialFlow_ODA_Disbursement", + "destination": "country/NGA", + "time_period": "2022", + "value": 50.0, + "unit": "USDollar" + } + ], + "rows": [ + { + "stat_var": "dcid:Amount_FinancialFlow_ODA_Disbursement", + "destination": "country/KEN", + "time_period": "2018/2022", + "value": 0.25, + "unit": null + }, + { + "stat_var": "dcid:Amount_FinancialFlow_ODA_Disbursement", + "destination": "country/GHA", + "time_period": "2018/2022", + "value": -0.125, + "unit": null + } + ] + }, + { + "name": "growth-as-an-amount", + "description": "An absolute growth is the change in the input's own unit.", + "verb": "growth", + "arguments": { + "by": [ + "destination" + ], + "window": [ + "2018", + "2022" + ], + "change": "absolute" + }, + "data": [ + { + "stat_var": "dcid:Amount_FinancialFlow_ODA_Disbursement", + "destination": "country/KEN", + "time_period": "2018", + "value": 200.0, + "unit": "USDollar" + }, + { + "stat_var": "dcid:Amount_FinancialFlow_ODA_Disbursement", + "destination": "country/KEN", + "time_period": "2022", + "value": 250.0, + "unit": "USDollar" + }, + { + "stat_var": "dcid:Amount_FinancialFlow_ODA_Disbursement", + "destination": "country/GHA", + "time_period": "2018", + "value": 80.0, + "unit": "USDollar" + }, + { + "stat_var": "dcid:Amount_FinancialFlow_ODA_Disbursement", + "destination": "country/GHA", + "time_period": "2022", + "value": 70.0, + "unit": "USDollar" + }, + { + "stat_var": "dcid:Amount_FinancialFlow_ODA_Disbursement", + "destination": "country/NGA", + "time_period": "2022", + "value": 50.0, + "unit": "USDollar" + } + ], + "rows": [ + { + "stat_var": "dcid:Amount_FinancialFlow_ODA_Disbursement", + "destination": "country/KEN", + "time_period": "2018/2022", + "value": 50.0, + "unit": "USDollar" + }, + { + "stat_var": "dcid:Amount_FinancialFlow_ODA_Disbursement", + "destination": "country/GHA", + "time_period": "2018/2022", + "value": -10.0, + "unit": "USDollar" + } + ] + }, + { + "name": "growth-leaves-out-undefined-bases", + "description": "A relative growth leaves out a member whose start or end value is zero or whose values change sign, as zero_or_sign_crossing_base. Kenya grows by half; Ghana starts at zero, Nigeria ends at zero and Senegal crosses from positive to negative, so none of the three has a row.", + "verb": "growth", + "arguments": { + "by": [ + "destination" + ], + "window": [ + "2018", + "2022" + ] + }, + "data": [ + { + "stat_var": "dcid:Amount_FinancialFlow_ODA_Disbursement", + "destination": "country/KEN", + "time_period": "2018", + "value": 200.0, + "unit": "USDollar" + }, + { + "stat_var": "dcid:Amount_FinancialFlow_ODA_Disbursement", + "destination": "country/KEN", + "time_period": "2022", + "value": 300.0, + "unit": "USDollar" + }, + { + "stat_var": "dcid:Amount_FinancialFlow_ODA_Disbursement", + "destination": "country/GHA", + "time_period": "2018", + "value": 0.0, + "unit": "USDollar" + }, + { + "stat_var": "dcid:Amount_FinancialFlow_ODA_Disbursement", + "destination": "country/GHA", + "time_period": "2022", + "value": 70.0, + "unit": "USDollar" + }, + { + "stat_var": "dcid:Amount_FinancialFlow_ODA_Disbursement", + "destination": "country/NGA", + "time_period": "2018", + "value": 50.0, + "unit": "USDollar" + }, + { + "stat_var": "dcid:Amount_FinancialFlow_ODA_Disbursement", + "destination": "country/NGA", + "time_period": "2022", + "value": 0.0, + "unit": "USDollar" + }, + { + "stat_var": "dcid:Amount_FinancialFlow_ODA_Disbursement", + "destination": "country/SEN", + "time_period": "2018", + "value": 40.0, + "unit": "USDollar" + }, + { + "stat_var": "dcid:Amount_FinancialFlow_ODA_Disbursement", + "destination": "country/SEN", + "time_period": "2022", + "value": -10.0, + "unit": "USDollar" + } + ], + "rows": [ + { + "stat_var": "dcid:Amount_FinancialFlow_ODA_Disbursement", + "destination": "country/KEN", + "time_period": "2018/2022", + "value": 0.5, + "unit": null + } + ] + }, + { + "name": "growth-amount-keeps-zero-bases", + "description": "An absolute growth is defined over a zero or sign-crossing base, so Ghana and Senegal keep their rows; a change that overflows to a non-finite value is left out as non_finite, so Nigeria has none.", + "verb": "growth", + "arguments": { + "by": [ + "destination" + ], + "window": [ + "2018", + "2022" + ], + "change": "absolute" + }, + "data": [ + { + "stat_var": "dcid:Amount_FinancialFlow_ODA_Disbursement", + "destination": "country/GHA", + "time_period": "2018", + "value": 0.0, + "unit": "USDollar" + }, + { + "stat_var": "dcid:Amount_FinancialFlow_ODA_Disbursement", + "destination": "country/GHA", + "time_period": "2022", + "value": 70.0, + "unit": "USDollar" + }, + { + "stat_var": "dcid:Amount_FinancialFlow_ODA_Disbursement", + "destination": "country/SEN", + "time_period": "2018", + "value": 40.0, + "unit": "USDollar" + }, + { + "stat_var": "dcid:Amount_FinancialFlow_ODA_Disbursement", + "destination": "country/SEN", + "time_period": "2022", + "value": -10.0, + "unit": "USDollar" + }, + { + "stat_var": "dcid:Amount_FinancialFlow_ODA_Disbursement", + "destination": "country/NGA", + "time_period": "2018", + "value": -1e+308, + "unit": "USDollar" + }, + { + "stat_var": "dcid:Amount_FinancialFlow_ODA_Disbursement", + "destination": "country/NGA", + "time_period": "2022", + "value": 1e+308, + "unit": "USDollar" + } + ], + "rows": [ + { + "stat_var": "dcid:Amount_FinancialFlow_ODA_Disbursement", + "destination": "country/GHA", + "time_period": "2018/2022", + "value": 70.0, + "unit": "USDollar" + }, + { + "stat_var": "dcid:Amount_FinancialFlow_ODA_Disbursement", + "destination": "country/SEN", + "time_period": "2018/2022", + "value": -50.0, + "unit": "USDollar" + } + ] + }, + { + "name": "growth-refuses-two-rows-of-one-member", + "description": "Two rows of Kenya in 2018, one per provider, leave its start value ambiguous under by destination alone, so growth refuses with role_ambiguous.", + "verb": "growth", + "arguments": { + "by": [ + "destination" + ], + "window": [ + "2018", + "2022" + ] + }, + "data": [ + { + "stat_var": "dcid:Amount_FinancialFlow_ODA_Disbursement", + "destination": "country/KEN", + "time_period": "2018", + "value": 120.0, + "unit": "USDollar", + "provider": "country/GBR" + }, + { + "stat_var": "dcid:Amount_FinancialFlow_ODA_Disbursement", + "destination": "country/KEN", + "time_period": "2018", + "value": 80.0, + "unit": "USDollar", + "provider": "country/FRA" + }, + { + "stat_var": "dcid:Amount_FinancialFlow_ODA_Disbursement", + "destination": "country/KEN", + "time_period": "2022", + "value": 250.0, + "unit": "USDollar", + "provider": "country/GBR" + } + ], + "error": "role_ambiguous" + } + ] +} diff --git a/python/client-contract/src/dfo_client_contract/rules/output-comparison.json b/python/client-contract/src/dfo_client_contract/rules/output-comparison.json new file mode 100644 index 0000000..93b12b1 --- /dev/null +++ b/python/client-contract/src/dfo_client_contract/rules/output-comparison.json @@ -0,0 +1,1618 @@ +{ + "format_version": 1, + "rule": "output-comparison", + "vectors": [ + { + "name": "same-derived-ref", + "left": { + "format_version": 2, + "members": [ + { + "parts": [], + "sentence": "Change in Germany's gross ODA disbursements to Nigeria for basic health care, 2020 to 2023. Computed by DFO from OECD Creditor Reporting System (CRS).", + "spec": { + "spec_id": "ops_e1edc6acb97615bdd9e813730378ce19", + "recipe": { + "normal_form_hash": "rnf_4e2298354b4323699033912586859aa7", + "replay_key": "rpk_1185a76368dca1b0301c899170c7dff3" + } + }, + "content_version": "ocv_3187efa2294f182bfe7cab296659b74f", + "output_digest": "out_82b81c6278499b468aa3d6a9c5a6aa6b", + "roots": [ + { + "spec_id": "spec_cb5baa4161de718f18583060674dbca6", + "content_version": "cv_bf242138f8d0a892c97da9373d1626f4", + "rendering": { + "format": "parquet", + "bundle": false, + "layout": "frame", + "without_party_totals": true + } + } + ], + "execution_identity": "0.9.0|1.1.0|0.2.0", + "resolved_periods": [ + { + "anchor": "latest", + "offset": -3, + "rule": "half1", + "period": "2020" + }, + { + "anchor": "latest", + "offset": 0, + "rule": "half1", + "period": "2023" + } + ], + "artifact": { + "digest": "sha256:4c8fec27543c7bedbe9d2c436f42c5a65f721106c128d0a55d2962c2c67de033", + "rendering": { + "format": "parquet", + "bundle": false, + "layout": "frame" + } + } + } + ] + }, + "right": { + "format_version": 2, + "members": [ + { + "parts": [], + "sentence": "Change in Germany's gross ODA disbursements to Nigeria for basic health care, 2020 to 2023. Computed by DFO from OECD Creditor Reporting System (CRS).", + "spec": { + "spec_id": "ops_e1edc6acb97615bdd9e813730378ce19", + "recipe": { + "normal_form_hash": "rnf_4e2298354b4323699033912586859aa7", + "replay_key": "rpk_1185a76368dca1b0301c899170c7dff3" + } + }, + "content_version": "ocv_3187efa2294f182bfe7cab296659b74f", + "output_digest": "out_82b81c6278499b468aa3d6a9c5a6aa6b", + "roots": [ + { + "spec_id": "spec_cb5baa4161de718f18583060674dbca6", + "content_version": "cv_bf242138f8d0a892c97da9373d1626f4", + "rendering": { + "format": "parquet", + "bundle": false, + "layout": "frame", + "without_party_totals": true + } + } + ], + "execution_identity": "0.9.0|1.1.0|0.2.0", + "resolved_periods": [ + { + "anchor": "latest", + "offset": -3, + "rule": "half1", + "period": "2020" + }, + { + "anchor": "latest", + "offset": 0, + "rule": "half1", + "period": "2023" + } + ], + "artifact": { + "digest": "sha256:4c8fec27543c7bedbe9d2c436f42c5a65f721106c128d0a55d2962c2c67de033", + "rendering": { + "format": "parquet", + "bundle": false, + "layout": "frame" + } + } + } + ] + }, + "equal": true, + "same_data": true + }, + { + "name": "sentence-and-file-differ", + "left": { + "format_version": 2, + "members": [ + { + "parts": [], + "sentence": "Change in Germany's gross ODA disbursements to Nigeria for basic health care, 2020 to 2023. Computed by DFO from OECD Creditor Reporting System (CRS).", + "spec": { + "spec_id": "ops_e1edc6acb97615bdd9e813730378ce19", + "recipe": { + "normal_form_hash": "rnf_4e2298354b4323699033912586859aa7", + "replay_key": "rpk_1185a76368dca1b0301c899170c7dff3" + } + }, + "content_version": "ocv_3187efa2294f182bfe7cab296659b74f", + "output_digest": "out_82b81c6278499b468aa3d6a9c5a6aa6b", + "roots": [ + { + "spec_id": "spec_cb5baa4161de718f18583060674dbca6", + "content_version": "cv_bf242138f8d0a892c97da9373d1626f4", + "rendering": { + "format": "parquet", + "bundle": false, + "layout": "frame", + "without_party_totals": true + } + } + ], + "execution_identity": "0.9.0|1.1.0|0.2.0", + "resolved_periods": [ + { + "anchor": "latest", + "offset": -3, + "rule": "half1", + "period": "2020" + }, + { + "anchor": "latest", + "offset": 0, + "rule": "half1", + "period": "2023" + } + ], + "artifact": { + "digest": "sha256:4c8fec27543c7bedbe9d2c436f42c5a65f721106c128d0a55d2962c2c67de033", + "rendering": { + "format": "parquet", + "bundle": false, + "layout": "frame" + } + } + } + ] + }, + "right": { + "format_version": 2, + "members": [ + { + "parts": [], + "sentence": "Another sentence for the same frame.", + "spec": { + "spec_id": "ops_e1edc6acb97615bdd9e813730378ce19", + "recipe": { + "normal_form_hash": "rnf_4e2298354b4323699033912586859aa7", + "replay_key": "rpk_1185a76368dca1b0301c899170c7dff3" + } + }, + "content_version": "ocv_3187efa2294f182bfe7cab296659b74f", + "output_digest": "out_82b81c6278499b468aa3d6a9c5a6aa6b", + "roots": [ + { + "spec_id": "spec_cb5baa4161de718f18583060674dbca6", + "content_version": "cv_bf242138f8d0a892c97da9373d1626f4", + "rendering": { + "format": "parquet", + "bundle": false, + "layout": "frame", + "without_party_totals": true + } + } + ], + "execution_identity": "0.9.0|1.1.0|0.2.0", + "resolved_periods": [ + { + "anchor": "latest", + "offset": -3, + "rule": "half1", + "period": "2020" + }, + { + "anchor": "latest", + "offset": 0, + "rule": "half1", + "period": "2023" + } + ], + "artifact": { + "digest": "sha256:fe0f5e3c97d3d02c67422f55b887768edee4670f82971fce48579e3cb326e509", + "rendering": { + "format": "parquet", + "bundle": false, + "layout": "frame" + } + } + } + ] + }, + "equal": true, + "same_data": true + }, + { + "name": "rolling-and-fixed-recipe-same-output", + "left": { + "format_version": 2, + "members": [ + { + "parts": [], + "sentence": "Change in Germany's gross ODA disbursements to Nigeria for basic health care, 2020 to 2023. Computed by DFO from OECD Creditor Reporting System (CRS).", + "spec": { + "spec_id": "ops_e1edc6acb97615bdd9e813730378ce19", + "recipe": { + "normal_form_hash": "rnf_4e2298354b4323699033912586859aa7", + "replay_key": "rpk_1185a76368dca1b0301c899170c7dff3" + } + }, + "content_version": "ocv_3187efa2294f182bfe7cab296659b74f", + "output_digest": "out_82b81c6278499b468aa3d6a9c5a6aa6b", + "roots": [ + { + "spec_id": "spec_cb5baa4161de718f18583060674dbca6", + "content_version": "cv_bf242138f8d0a892c97da9373d1626f4", + "rendering": { + "format": "parquet", + "bundle": false, + "layout": "frame", + "without_party_totals": true + } + } + ], + "execution_identity": "0.9.0|1.1.0|0.2.0", + "resolved_periods": [ + { + "anchor": "latest", + "offset": -3, + "rule": "half1", + "period": "2020" + }, + { + "anchor": "latest", + "offset": 0, + "rule": "half1", + "period": "2023" + } + ], + "artifact": { + "digest": "sha256:4c8fec27543c7bedbe9d2c436f42c5a65f721106c128d0a55d2962c2c67de033", + "rendering": { + "format": "parquet", + "bundle": false, + "layout": "frame" + } + } + } + ] + }, + "right": { + "format_version": 2, + "members": [ + { + "parts": [], + "sentence": "Change in Germany's gross ODA disbursements to Nigeria for basic health care, 2020 to 2023. Computed by DFO from OECD Creditor Reporting System (CRS).", + "spec": { + "spec_id": "ops_a41f297b3f33f2a7c2ac6b3cedd4d3ad", + "recipe": { + "normal_form_hash": "rnf_5f5a142beef739694b06899a7f0426a7", + "replay_key": "rpk_4f697e3235da4b9ae1404f112c2c78b6" + } + }, + "content_version": "ocv_62a72043403b8a2497cc184623df87df", + "output_digest": "out_82b81c6278499b468aa3d6a9c5a6aa6b", + "roots": [ + { + "spec_id": "spec_cb5baa4161de718f18583060674dbca6", + "content_version": "cv_bf242138f8d0a892c97da9373d1626f4", + "rendering": { + "format": "parquet", + "bundle": false, + "layout": "frame", + "without_party_totals": true + } + } + ], + "execution_identity": "0.9.0|1.1.0|0.2.0", + "resolved_periods": [], + "artifact": { + "digest": "sha256:4c8fec27543c7bedbe9d2c436f42c5a65f721106c128d0a55d2962c2c67de033", + "rendering": { + "format": "parquet", + "bundle": false, + "layout": "frame" + } + } + } + ] + }, + "equal": false, + "same_data": true + }, + { + "name": "engine-release-moves-no-number", + "left": { + "format_version": 2, + "members": [ + { + "parts": [], + "sentence": "Change in Germany's gross ODA disbursements to Nigeria for basic health care, 2020 to 2023. Computed by DFO from OECD Creditor Reporting System (CRS).", + "spec": { + "spec_id": "ops_e1edc6acb97615bdd9e813730378ce19", + "recipe": { + "normal_form_hash": "rnf_4e2298354b4323699033912586859aa7", + "replay_key": "rpk_1185a76368dca1b0301c899170c7dff3" + } + }, + "content_version": "ocv_3187efa2294f182bfe7cab296659b74f", + "output_digest": "out_82b81c6278499b468aa3d6a9c5a6aa6b", + "roots": [ + { + "spec_id": "spec_cb5baa4161de718f18583060674dbca6", + "content_version": "cv_bf242138f8d0a892c97da9373d1626f4", + "rendering": { + "format": "parquet", + "bundle": false, + "layout": "frame", + "without_party_totals": true + } + } + ], + "execution_identity": "0.9.0|1.1.0|0.2.0", + "resolved_periods": [ + { + "anchor": "latest", + "offset": -3, + "rule": "half1", + "period": "2020" + }, + { + "anchor": "latest", + "offset": 0, + "rule": "half1", + "period": "2023" + } + ], + "artifact": { + "digest": "sha256:4c8fec27543c7bedbe9d2c436f42c5a65f721106c128d0a55d2962c2c67de033", + "rendering": { + "format": "parquet", + "bundle": false, + "layout": "frame" + } + } + } + ] + }, + "right": { + "format_version": 2, + "members": [ + { + "parts": [], + "sentence": "Change in Germany's gross ODA disbursements to Nigeria for basic health care, 2020 to 2023. Computed by DFO from OECD Creditor Reporting System (CRS).", + "spec": { + "spec_id": "ops_e1edc6acb97615bdd9e813730378ce19", + "recipe": { + "normal_form_hash": "rnf_4e2298354b4323699033912586859aa7", + "replay_key": "rpk_f0b5865b2d90ff6a89f196b5d046bce6" + } + }, + "content_version": "ocv_8f0cd00ac4727431f3a3cbae4abc35e3", + "output_digest": "out_82b81c6278499b468aa3d6a9c5a6aa6b", + "roots": [ + { + "spec_id": "spec_cb5baa4161de718f18583060674dbca6", + "content_version": "cv_bf242138f8d0a892c97da9373d1626f4", + "rendering": { + "format": "parquet", + "bundle": false, + "layout": "frame", + "without_party_totals": true + } + } + ], + "execution_identity": "0.9.1|1.1.0|0.2.0", + "resolved_periods": [ + { + "anchor": "latest", + "offset": -3, + "rule": "half1", + "period": "2020" + }, + { + "anchor": "latest", + "offset": 0, + "rule": "half1", + "period": "2023" + } + ], + "artifact": { + "digest": "sha256:4c8fec27543c7bedbe9d2c436f42c5a65f721106c128d0a55d2962c2c67de033", + "rendering": { + "format": "parquet", + "bundle": false, + "layout": "frame" + } + } + } + ] + }, + "equal": false, + "same_data": true + }, + { + "name": "newer-data-moves-the-output", + "left": { + "format_version": 2, + "members": [ + { + "parts": [], + "sentence": "Change in Germany's gross ODA disbursements to Nigeria for basic health care, 2020 to 2023. Computed by DFO from OECD Creditor Reporting System (CRS).", + "spec": { + "spec_id": "ops_e1edc6acb97615bdd9e813730378ce19", + "recipe": { + "normal_form_hash": "rnf_4e2298354b4323699033912586859aa7", + "replay_key": "rpk_1185a76368dca1b0301c899170c7dff3" + } + }, + "content_version": "ocv_3187efa2294f182bfe7cab296659b74f", + "output_digest": "out_82b81c6278499b468aa3d6a9c5a6aa6b", + "roots": [ + { + "spec_id": "spec_cb5baa4161de718f18583060674dbca6", + "content_version": "cv_bf242138f8d0a892c97da9373d1626f4", + "rendering": { + "format": "parquet", + "bundle": false, + "layout": "frame", + "without_party_totals": true + } + } + ], + "execution_identity": "0.9.0|1.1.0|0.2.0", + "resolved_periods": [ + { + "anchor": "latest", + "offset": -3, + "rule": "half1", + "period": "2020" + }, + { + "anchor": "latest", + "offset": 0, + "rule": "half1", + "period": "2023" + } + ], + "artifact": { + "digest": "sha256:4c8fec27543c7bedbe9d2c436f42c5a65f721106c128d0a55d2962c2c67de033", + "rendering": { + "format": "parquet", + "bundle": false, + "layout": "frame" + } + } + } + ] + }, + "right": { + "format_version": 2, + "members": [ + { + "parts": [], + "sentence": "Change in Germany's gross ODA disbursements to Nigeria for basic health care, 2021 to 2024. Computed by DFO from OECD Creditor Reporting System (CRS).", + "spec": { + "spec_id": "ops_16602b92e22d0aaaf8f7e2cf41bcc925", + "recipe": { + "normal_form_hash": "rnf_4e2298354b4323699033912586859aa7", + "replay_key": "rpk_1ea0c543030b65a5680e7c653d6865a0" + } + }, + "content_version": "ocv_846c87c1b91ea260e927b34ab0f96775", + "output_digest": "out_a258ff67f0d7e61a18b8105da50821a0", + "roots": [ + { + "spec_id": "spec_cb5baa4161de718f18583060674dbca6", + "content_version": "cv_06fe2b28793f70d868d047201166c31d", + "rendering": { + "format": "parquet", + "bundle": false, + "layout": "frame", + "without_party_totals": true + } + } + ], + "execution_identity": "0.9.0|1.1.0|0.2.0", + "resolved_periods": [ + { + "anchor": "latest", + "offset": -3, + "rule": "half1", + "period": "2021" + }, + { + "anchor": "latest", + "offset": 0, + "rule": "half1", + "period": "2024" + } + ], + "artifact": { + "digest": "sha256:79fef3b30a845b187dfb0363282ffe64546fa77f72d75ca2dec2647da17f9304", + "rendering": { + "format": "parquet", + "bundle": false, + "layout": "frame" + } + } + } + ] + }, + "equal": false, + "same_data": false + }, + { + "name": "upstream-rebuild-moves-no-number", + "left": { + "format_version": 2, + "members": [ + { + "parts": [], + "sentence": "Change in Germany's gross ODA disbursements to Nigeria for basic health care, 2020 to 2023. Computed by DFO from OECD Creditor Reporting System (CRS).", + "spec": { + "spec_id": "ops_e1edc6acb97615bdd9e813730378ce19", + "recipe": { + "normal_form_hash": "rnf_4e2298354b4323699033912586859aa7", + "replay_key": "rpk_1185a76368dca1b0301c899170c7dff3" + } + }, + "content_version": "ocv_3187efa2294f182bfe7cab296659b74f", + "output_digest": "out_82b81c6278499b468aa3d6a9c5a6aa6b", + "roots": [ + { + "spec_id": "spec_cb5baa4161de718f18583060674dbca6", + "content_version": "cv_bf242138f8d0a892c97da9373d1626f4", + "rendering": { + "format": "parquet", + "bundle": false, + "layout": "frame", + "without_party_totals": true + } + } + ], + "execution_identity": "0.9.0|1.1.0|0.2.0", + "resolved_periods": [ + { + "anchor": "latest", + "offset": -3, + "rule": "half1", + "period": "2020" + }, + { + "anchor": "latest", + "offset": 0, + "rule": "half1", + "period": "2023" + } + ], + "artifact": { + "digest": "sha256:4c8fec27543c7bedbe9d2c436f42c5a65f721106c128d0a55d2962c2c67de033", + "rendering": { + "format": "parquet", + "bundle": false, + "layout": "frame" + } + } + } + ] + }, + "right": { + "format_version": 2, + "members": [ + { + "parts": [], + "sentence": "Change in Germany's gross ODA disbursements to Nigeria for basic health care, 2020 to 2023. Computed by DFO from OECD Creditor Reporting System (CRS).", + "spec": { + "spec_id": "ops_b4b38a6defb8a169442aada645297e5c", + "recipe": { + "normal_form_hash": "rnf_4e2298354b4323699033912586859aa7", + "replay_key": "rpk_7ff8c2c2aacbc373e07f60dc51d614bf" + } + }, + "content_version": "ocv_845384eedabdd3f0ff6c637694981faf", + "output_digest": "out_82b81c6278499b468aa3d6a9c5a6aa6b", + "roots": [ + { + "spec_id": "spec_cb5baa4161de718f18583060674dbca6", + "content_version": "cv_ddc47df6c1e8526631c61fbe12affc09", + "rendering": { + "format": "parquet", + "bundle": false, + "layout": "frame", + "without_party_totals": true + } + } + ], + "execution_identity": "0.9.0|1.1.0|0.2.0", + "resolved_periods": [ + { + "anchor": "latest", + "offset": -3, + "rule": "half1", + "period": "2020" + }, + { + "anchor": "latest", + "offset": 0, + "rule": "half1", + "period": "2023" + } + ], + "artifact": { + "digest": "sha256:4c8fec27543c7bedbe9d2c436f42c5a65f721106c128d0a55d2962c2c67de033", + "rendering": { + "format": "parquet", + "bundle": false, + "layout": "frame" + } + } + } + ] + }, + "equal": false, + "same_data": true + }, + { + "name": "derived-file-format-differs", + "left": { + "format_version": 2, + "members": [ + { + "parts": [], + "sentence": "Change in Germany's gross ODA disbursements to Nigeria for basic health care, 2020 to 2023. Computed by DFO from OECD Creditor Reporting System (CRS).", + "spec": { + "spec_id": "ops_e1edc6acb97615bdd9e813730378ce19", + "recipe": { + "normal_form_hash": "rnf_4e2298354b4323699033912586859aa7", + "replay_key": "rpk_1185a76368dca1b0301c899170c7dff3" + } + }, + "content_version": "ocv_3187efa2294f182bfe7cab296659b74f", + "output_digest": "out_82b81c6278499b468aa3d6a9c5a6aa6b", + "roots": [ + { + "spec_id": "spec_cb5baa4161de718f18583060674dbca6", + "content_version": "cv_bf242138f8d0a892c97da9373d1626f4", + "rendering": { + "format": "parquet", + "bundle": false, + "layout": "frame", + "without_party_totals": true + } + } + ], + "execution_identity": "0.9.0|1.1.0|0.2.0", + "resolved_periods": [ + { + "anchor": "latest", + "offset": -3, + "rule": "half1", + "period": "2020" + }, + { + "anchor": "latest", + "offset": 0, + "rule": "half1", + "period": "2023" + } + ], + "artifact": { + "digest": "sha256:4c8fec27543c7bedbe9d2c436f42c5a65f721106c128d0a55d2962c2c67de033", + "rendering": { + "format": "parquet", + "bundle": false, + "layout": "frame" + } + } + } + ] + }, + "right": { + "format_version": 2, + "members": [ + { + "parts": [], + "sentence": "Change in Germany's gross ODA disbursements to Nigeria for basic health care, 2020 to 2023. Computed by DFO from OECD Creditor Reporting System (CRS).", + "spec": { + "spec_id": "ops_e1edc6acb97615bdd9e813730378ce19", + "recipe": { + "normal_form_hash": "rnf_4e2298354b4323699033912586859aa7", + "replay_key": "rpk_1185a76368dca1b0301c899170c7dff3" + } + }, + "content_version": "ocv_3187efa2294f182bfe7cab296659b74f", + "output_digest": "out_82b81c6278499b468aa3d6a9c5a6aa6b", + "roots": [ + { + "spec_id": "spec_cb5baa4161de718f18583060674dbca6", + "content_version": "cv_bf242138f8d0a892c97da9373d1626f4", + "rendering": { + "format": "parquet", + "bundle": false, + "layout": "frame", + "without_party_totals": true + } + } + ], + "execution_identity": "0.9.0|1.1.0|0.2.0", + "resolved_periods": [ + { + "anchor": "latest", + "offset": -3, + "rule": "half1", + "period": "2020" + }, + { + "anchor": "latest", + "offset": 0, + "rule": "half1", + "period": "2023" + } + ], + "artifact": { + "digest": "sha256:78892fc7549d08ac2af6f4be5362f9b232db89a2482980df97204655ba6ef97a", + "rendering": { + "format": "csv", + "bundle": false + } + } + } + ] + }, + "equal": false, + "same_data": true + }, + { + "name": "same-dataset-ref", + "left": { + "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).", + "spec": { + "spec_id": "spec_cb5baa4161de718f18583060674dbca6", + "definition": { + "schema_version": 1, + "spec_id": "spec_cb5baa4161de718f18583060674dbca6", + "identity": { + "identity_version": "spec1", + "shape": { + "kind": "statvar_schema", + "population_type": "FinancialFlow", + "measured_property": "amount", + "stat_type": "measuredValue", + "measurement_qualifier": "Nominal" + }, + "slots": [ + { + "property": "crsCooperationModality", + "binding": { + "state": "unbound" + } + }, + { + "property": "crsPurpose", + "binding": { + "state": "value", + "ref": "CRSPurposeCode12220" + } + }, + { + "property": "crsTypeOfFinance", + "binding": { + "state": "unbound" + } + }, + { + "property": "crsTypeOfFlow", + "binding": { + "state": "value", + "ref": "CRSTypeOfFlow10" + } + }, + { + "property": "financialFlowType", + "binding": { + "state": "value", + "ref": "Disbursement" + } + }, + { + "property": "nettingBasis", + "binding": { + "state": "value", + "ref": "Gross" + } + } + ], + "entities": { + "destination": [ + "country/NGA" + ], + "origin": [ + "country/DEU" + ] + }, + "requested_window": { + "kind": "range", + "start_year": 2020, + "end_year": 2023 + } + } + } + }, + "content_version": "cv_bf242138f8d0a892c97da9373d1626f4", + "artifact": { + "digest": "sha256:c44200969f19d73104d1bc24ebca905e59f749c2939234cdde10ba6f5a131170", + "rendering": { + "format": "parquet", + "bundle": false, + "without_party_totals": true + } + } + } + ] + }, + "right": { + "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).", + "spec": { + "spec_id": "spec_cb5baa4161de718f18583060674dbca6", + "definition": { + "schema_version": 1, + "spec_id": "spec_cb5baa4161de718f18583060674dbca6", + "identity": { + "identity_version": "spec1", + "shape": { + "kind": "statvar_schema", + "population_type": "FinancialFlow", + "measured_property": "amount", + "stat_type": "measuredValue", + "measurement_qualifier": "Nominal" + }, + "slots": [ + { + "property": "crsCooperationModality", + "binding": { + "state": "unbound" + } + }, + { + "property": "crsPurpose", + "binding": { + "state": "value", + "ref": "CRSPurposeCode12220" + } + }, + { + "property": "crsTypeOfFinance", + "binding": { + "state": "unbound" + } + }, + { + "property": "crsTypeOfFlow", + "binding": { + "state": "value", + "ref": "CRSTypeOfFlow10" + } + }, + { + "property": "financialFlowType", + "binding": { + "state": "value", + "ref": "Disbursement" + } + }, + { + "property": "nettingBasis", + "binding": { + "state": "value", + "ref": "Gross" + } + } + ], + "entities": { + "destination": [ + "country/NGA" + ], + "origin": [ + "country/DEU" + ] + }, + "requested_window": { + "kind": "range", + "start_year": 2020, + "end_year": 2023 + } + } + } + }, + "content_version": "cv_bf242138f8d0a892c97da9373d1626f4", + "artifact": { + "digest": "sha256:c44200969f19d73104d1bc24ebca905e59f749c2939234cdde10ba6f5a131170", + "rendering": { + "format": "parquet", + "bundle": false, + "without_party_totals": true + } + } + } + ] + }, + "equal": true, + "same_data": true + }, + { + "name": "dataset-layout-differs", + "left": { + "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).", + "spec": { + "spec_id": "spec_cb5baa4161de718f18583060674dbca6", + "definition": { + "schema_version": 1, + "spec_id": "spec_cb5baa4161de718f18583060674dbca6", + "identity": { + "identity_version": "spec1", + "shape": { + "kind": "statvar_schema", + "population_type": "FinancialFlow", + "measured_property": "amount", + "stat_type": "measuredValue", + "measurement_qualifier": "Nominal" + }, + "slots": [ + { + "property": "crsCooperationModality", + "binding": { + "state": "unbound" + } + }, + { + "property": "crsPurpose", + "binding": { + "state": "value", + "ref": "CRSPurposeCode12220" + } + }, + { + "property": "crsTypeOfFinance", + "binding": { + "state": "unbound" + } + }, + { + "property": "crsTypeOfFlow", + "binding": { + "state": "value", + "ref": "CRSTypeOfFlow10" + } + }, + { + "property": "financialFlowType", + "binding": { + "state": "value", + "ref": "Disbursement" + } + }, + { + "property": "nettingBasis", + "binding": { + "state": "value", + "ref": "Gross" + } + } + ], + "entities": { + "destination": [ + "country/NGA" + ], + "origin": [ + "country/DEU" + ] + }, + "requested_window": { + "kind": "range", + "start_year": 2020, + "end_year": 2023 + } + } + } + }, + "content_version": "cv_bf242138f8d0a892c97da9373d1626f4", + "artifact": { + "digest": "sha256:c44200969f19d73104d1bc24ebca905e59f749c2939234cdde10ba6f5a131170", + "rendering": { + "format": "parquet", + "bundle": false, + "without_party_totals": true + } + } + } + ] + }, + "right": { + "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).", + "spec": { + "spec_id": "spec_cb5baa4161de718f18583060674dbca6", + "definition": { + "schema_version": 1, + "spec_id": "spec_cb5baa4161de718f18583060674dbca6", + "identity": { + "identity_version": "spec1", + "shape": { + "kind": "statvar_schema", + "population_type": "FinancialFlow", + "measured_property": "amount", + "stat_type": "measuredValue", + "measurement_qualifier": "Nominal" + }, + "slots": [ + { + "property": "crsCooperationModality", + "binding": { + "state": "unbound" + } + }, + { + "property": "crsPurpose", + "binding": { + "state": "value", + "ref": "CRSPurposeCode12220" + } + }, + { + "property": "crsTypeOfFinance", + "binding": { + "state": "unbound" + } + }, + { + "property": "crsTypeOfFlow", + "binding": { + "state": "value", + "ref": "CRSTypeOfFlow10" + } + }, + { + "property": "financialFlowType", + "binding": { + "state": "value", + "ref": "Disbursement" + } + }, + { + "property": "nettingBasis", + "binding": { + "state": "value", + "ref": "Gross" + } + } + ], + "entities": { + "destination": [ + "country/NGA" + ], + "origin": [ + "country/DEU" + ] + }, + "requested_window": { + "kind": "range", + "start_year": 2020, + "end_year": 2023 + } + } + } + }, + "content_version": "cv_bf242138f8d0a892c97da9373d1626f4", + "artifact": { + "digest": "sha256:c44200969f19d73104d1bc24ebca905e59f749c2939234cdde10ba6f5a131170", + "rendering": { + "format": "parquet", + "bundle": false, + "layout": "frame", + "without_party_totals": true + } + } + } + ] + }, + "equal": false, + "same_data": true + }, + { + "name": "dataset-party-totals-differ", + "left": { + "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).", + "spec": { + "spec_id": "spec_cb5baa4161de718f18583060674dbca6", + "definition": { + "schema_version": 1, + "spec_id": "spec_cb5baa4161de718f18583060674dbca6", + "identity": { + "identity_version": "spec1", + "shape": { + "kind": "statvar_schema", + "population_type": "FinancialFlow", + "measured_property": "amount", + "stat_type": "measuredValue", + "measurement_qualifier": "Nominal" + }, + "slots": [ + { + "property": "crsCooperationModality", + "binding": { + "state": "unbound" + } + }, + { + "property": "crsPurpose", + "binding": { + "state": "value", + "ref": "CRSPurposeCode12220" + } + }, + { + "property": "crsTypeOfFinance", + "binding": { + "state": "unbound" + } + }, + { + "property": "crsTypeOfFlow", + "binding": { + "state": "value", + "ref": "CRSTypeOfFlow10" + } + }, + { + "property": "financialFlowType", + "binding": { + "state": "value", + "ref": "Disbursement" + } + }, + { + "property": "nettingBasis", + "binding": { + "state": "value", + "ref": "Gross" + } + } + ], + "entities": { + "destination": [ + "country/NGA" + ], + "origin": [ + "country/DEU" + ] + }, + "requested_window": { + "kind": "range", + "start_year": 2020, + "end_year": 2023 + } + } + } + }, + "content_version": "cv_bf242138f8d0a892c97da9373d1626f4", + "artifact": { + "digest": "sha256:c44200969f19d73104d1bc24ebca905e59f749c2939234cdde10ba6f5a131170", + "rendering": { + "format": "parquet", + "bundle": false, + "without_party_totals": true + } + } + } + ] + }, + "right": { + "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).", + "spec": { + "spec_id": "spec_cb5baa4161de718f18583060674dbca6", + "definition": { + "schema_version": 1, + "spec_id": "spec_cb5baa4161de718f18583060674dbca6", + "identity": { + "identity_version": "spec1", + "shape": { + "kind": "statvar_schema", + "population_type": "FinancialFlow", + "measured_property": "amount", + "stat_type": "measuredValue", + "measurement_qualifier": "Nominal" + }, + "slots": [ + { + "property": "crsCooperationModality", + "binding": { + "state": "unbound" + } + }, + { + "property": "crsPurpose", + "binding": { + "state": "value", + "ref": "CRSPurposeCode12220" + } + }, + { + "property": "crsTypeOfFinance", + "binding": { + "state": "unbound" + } + }, + { + "property": "crsTypeOfFlow", + "binding": { + "state": "value", + "ref": "CRSTypeOfFlow10" + } + }, + { + "property": "financialFlowType", + "binding": { + "state": "value", + "ref": "Disbursement" + } + }, + { + "property": "nettingBasis", + "binding": { + "state": "value", + "ref": "Gross" + } + } + ], + "entities": { + "destination": [ + "country/NGA" + ], + "origin": [ + "country/DEU" + ] + }, + "requested_window": { + "kind": "range", + "start_year": 2020, + "end_year": 2023 + } + } + } + }, + "content_version": "cv_bf242138f8d0a892c97da9373d1626f4", + "artifact": { + "digest": "sha256:c44200969f19d73104d1bc24ebca905e59f749c2939234cdde10ba6f5a131170", + "rendering": { + "format": "parquet", + "bundle": false + } + } + } + ] + }, + "equal": false, + "same_data": false + }, + { + "name": "dataset-and-derived", + "left": { + "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).", + "spec": { + "spec_id": "spec_cb5baa4161de718f18583060674dbca6", + "definition": { + "schema_version": 1, + "spec_id": "spec_cb5baa4161de718f18583060674dbca6", + "identity": { + "identity_version": "spec1", + "shape": { + "kind": "statvar_schema", + "population_type": "FinancialFlow", + "measured_property": "amount", + "stat_type": "measuredValue", + "measurement_qualifier": "Nominal" + }, + "slots": [ + { + "property": "crsCooperationModality", + "binding": { + "state": "unbound" + } + }, + { + "property": "crsPurpose", + "binding": { + "state": "value", + "ref": "CRSPurposeCode12220" + } + }, + { + "property": "crsTypeOfFinance", + "binding": { + "state": "unbound" + } + }, + { + "property": "crsTypeOfFlow", + "binding": { + "state": "value", + "ref": "CRSTypeOfFlow10" + } + }, + { + "property": "financialFlowType", + "binding": { + "state": "value", + "ref": "Disbursement" + } + }, + { + "property": "nettingBasis", + "binding": { + "state": "value", + "ref": "Gross" + } + } + ], + "entities": { + "destination": [ + "country/NGA" + ], + "origin": [ + "country/DEU" + ] + }, + "requested_window": { + "kind": "range", + "start_year": 2020, + "end_year": 2023 + } + } + } + }, + "content_version": "cv_bf242138f8d0a892c97da9373d1626f4", + "artifact": { + "digest": "sha256:c44200969f19d73104d1bc24ebca905e59f749c2939234cdde10ba6f5a131170", + "rendering": { + "format": "parquet", + "bundle": false, + "without_party_totals": true + } + } + } + ] + }, + "right": { + "format_version": 2, + "members": [ + { + "parts": [], + "sentence": "Change in Germany's gross ODA disbursements to Nigeria for basic health care, 2020 to 2023. Computed by DFO from OECD Creditor Reporting System (CRS).", + "spec": { + "spec_id": "ops_e1edc6acb97615bdd9e813730378ce19", + "recipe": { + "normal_form_hash": "rnf_4e2298354b4323699033912586859aa7", + "replay_key": "rpk_1185a76368dca1b0301c899170c7dff3" + } + }, + "content_version": "ocv_3187efa2294f182bfe7cab296659b74f", + "output_digest": "out_82b81c6278499b468aa3d6a9c5a6aa6b", + "roots": [ + { + "spec_id": "spec_cb5baa4161de718f18583060674dbca6", + "content_version": "cv_bf242138f8d0a892c97da9373d1626f4", + "rendering": { + "format": "parquet", + "bundle": false, + "layout": "frame", + "without_party_totals": true + } + } + ], + "execution_identity": "0.9.0|1.1.0|0.2.0", + "resolved_periods": [ + { + "anchor": "latest", + "offset": -3, + "rule": "half1", + "period": "2020" + }, + { + "anchor": "latest", + "offset": 0, + "rule": "half1", + "period": "2023" + } + ], + "artifact": { + "digest": "sha256:4c8fec27543c7bedbe9d2c436f42c5a65f721106c128d0a55d2962c2c67de033", + "rendering": { + "format": "parquet", + "bundle": false, + "layout": "frame" + } + } + } + ] + }, + "equal": false, + "same_data": false + }, + { + "name": "member-count-differs", + "left": { + "format_version": 2, + "members": [ + { + "parts": [], + "sentence": "Change in Germany's gross ODA disbursements to Nigeria for basic health care, 2020 to 2023. Computed by DFO from OECD Creditor Reporting System (CRS).", + "spec": { + "spec_id": "ops_e1edc6acb97615bdd9e813730378ce19", + "recipe": { + "normal_form_hash": "rnf_4e2298354b4323699033912586859aa7", + "replay_key": "rpk_1185a76368dca1b0301c899170c7dff3" + } + }, + "content_version": "ocv_3187efa2294f182bfe7cab296659b74f", + "output_digest": "out_82b81c6278499b468aa3d6a9c5a6aa6b", + "roots": [ + { + "spec_id": "spec_cb5baa4161de718f18583060674dbca6", + "content_version": "cv_bf242138f8d0a892c97da9373d1626f4", + "rendering": { + "format": "parquet", + "bundle": false, + "layout": "frame", + "without_party_totals": true + } + } + ], + "execution_identity": "0.9.0|1.1.0|0.2.0", + "resolved_periods": [ + { + "anchor": "latest", + "offset": -3, + "rule": "half1", + "period": "2020" + }, + { + "anchor": "latest", + "offset": 0, + "rule": "half1", + "period": "2023" + } + ], + "artifact": { + "digest": "sha256:4c8fec27543c7bedbe9d2c436f42c5a65f721106c128d0a55d2962c2c67de033", + "rendering": { + "format": "parquet", + "bundle": false, + "layout": "frame" + } + } + } + ] + }, + "right": { + "format_version": 2, + "members": [ + { + "parts": [], + "sentence": "Change in Germany's gross ODA disbursements to Nigeria for basic health care, 2020 to 2023. Computed by DFO from OECD Creditor Reporting System (CRS).", + "spec": { + "spec_id": "ops_e1edc6acb97615bdd9e813730378ce19", + "recipe": { + "normal_form_hash": "rnf_4e2298354b4323699033912586859aa7", + "replay_key": "rpk_1185a76368dca1b0301c899170c7dff3" + } + }, + "content_version": "ocv_3187efa2294f182bfe7cab296659b74f", + "output_digest": "out_82b81c6278499b468aa3d6a9c5a6aa6b", + "roots": [ + { + "spec_id": "spec_cb5baa4161de718f18583060674dbca6", + "content_version": "cv_bf242138f8d0a892c97da9373d1626f4", + "rendering": { + "format": "parquet", + "bundle": false, + "layout": "frame", + "without_party_totals": true + } + } + ], + "execution_identity": "0.9.0|1.1.0|0.2.0", + "resolved_periods": [ + { + "anchor": "latest", + "offset": -3, + "rule": "half1", + "period": "2020" + }, + { + "anchor": "latest", + "offset": 0, + "rule": "half1", + "period": "2023" + } + ], + "artifact": { + "digest": "sha256:4c8fec27543c7bedbe9d2c436f42c5a65f721106c128d0a55d2962c2c67de033", + "rendering": { + "format": "parquet", + "bundle": false, + "layout": "frame" + } + } + }, + { + "parts": [], + "sentence": "Change in Germany's gross ODA disbursements to Nigeria for basic health care, 2020 to 2023. Computed by DFO from OECD Creditor Reporting System (CRS).", + "spec": { + "spec_id": "ops_a41f297b3f33f2a7c2ac6b3cedd4d3ad", + "recipe": { + "normal_form_hash": "rnf_5f5a142beef739694b06899a7f0426a7", + "replay_key": "rpk_4f697e3235da4b9ae1404f112c2c78b6" + } + }, + "content_version": "ocv_62a72043403b8a2497cc184623df87df", + "output_digest": "out_82b81c6278499b468aa3d6a9c5a6aa6b", + "roots": [ + { + "spec_id": "spec_cb5baa4161de718f18583060674dbca6", + "content_version": "cv_bf242138f8d0a892c97da9373d1626f4", + "rendering": { + "format": "parquet", + "bundle": false, + "layout": "frame", + "without_party_totals": true + } + } + ], + "execution_identity": "0.9.0|1.1.0|0.2.0", + "resolved_periods": [], + "artifact": { + "digest": "sha256:4c8fec27543c7bedbe9d2c436f42c5a65f721106c128d0a55d2962c2c67de033", + "rendering": { + "format": "parquet", + "bundle": false, + "layout": "frame" + } + } + } + ] + }, + "equal": false, + "same_data": false + } + ] +} diff --git a/python/client-contract/src/dfo_client_contract/rules/output-digest.json b/python/client-contract/src/dfo_client_contract/rules/output-digest.json new file mode 100644 index 0000000..fa57304 --- /dev/null +++ b/python/client-contract/src/dfo_client_contract/rules/output-digest.json @@ -0,0 +1,900 @@ +{ + "format_version": 1, + "rule": "output-digest", + "vectors": [ + { + "name": "two-rows", + "frame": { + "columns": [ + "stat_var", + "destination", + "origin", + "time_period", + "value", + "unit", + "status" + ], + "rows": [ + [ + "dcid:Amount_FinancialFlow_ODA_Disbursement", + "country/KEN", + "country/DEU", + "2022", + 120.5, + "USDollar", + null + ], + [ + "dcid:Amount_FinancialFlow_ODA_Disbursement", + "country/NGA", + "country/DEU", + "2022", + 98.25, + "USDollar", + null + ] + ] + }, + "document": "{\"columns\":[\"stat_var\",\"destination\",\"origin\",\"time_period\",\"value\",\"unit\"],\"digest_version\":\"out2\",\"rows\":[[\"dcid:Amount_FinancialFlow_ODA_Disbursement\",\"country/KEN\",\"country/DEU\",\"2022\",120.5,\"USDollar\"],[\"dcid:Amount_FinancialFlow_ODA_Disbursement\",\"country/NGA\",\"country/DEU\",\"2022\",98.25,\"USDollar\"]]}", + "digest": "out_fb35c1b4f4a67b6ca2ecd8f334220dfa" + }, + { + "name": "another-stat-var", + "frame": { + "columns": [ + "stat_var", + "destination", + "origin", + "time_period", + "value", + "unit", + "status" + ], + "rows": [ + [ + "dcid:ops_4b1e0c9a7d2f3e5b6a8c9d0e1f2a3b4c", + "country/KEN", + "country/DEU", + "2022", + 120.5, + "USDollar", + null + ], + [ + "dcid:ops_4b1e0c9a7d2f3e5b6a8c9d0e1f2a3b4c", + "country/NGA", + "country/DEU", + "2022", + 98.25, + "USDollar", + null + ] + ] + }, + "document": "{\"columns\":[\"stat_var\",\"destination\",\"origin\",\"time_period\",\"value\",\"unit\"],\"digest_version\":\"out2\",\"rows\":[[\"dcid:ops_4b1e0c9a7d2f3e5b6a8c9d0e1f2a3b4c\",\"country/KEN\",\"country/DEU\",\"2022\",120.5,\"USDollar\"],[\"dcid:ops_4b1e0c9a7d2f3e5b6a8c9d0e1f2a3b4c\",\"country/NGA\",\"country/DEU\",\"2022\",98.25,\"USDollar\"]]}", + "digest": "out_2753cf795f19e151b39cc9c6d14e698d" + }, + { + "name": "rows-in-another-order", + "frame": { + "columns": [ + "stat_var", + "destination", + "origin", + "time_period", + "value", + "unit", + "status" + ], + "rows": [ + [ + "dcid:Amount_FinancialFlow_ODA_Disbursement", + "country/NGA", + "country/DEU", + "2022", + 98.25, + "USDollar", + null + ], + [ + "dcid:Amount_FinancialFlow_ODA_Disbursement", + "country/KEN", + "country/DEU", + "2022", + 120.5, + "USDollar", + null + ] + ] + }, + "document": "{\"columns\":[\"stat_var\",\"destination\",\"origin\",\"time_period\",\"value\",\"unit\"],\"digest_version\":\"out2\",\"rows\":[[\"dcid:Amount_FinancialFlow_ODA_Disbursement\",\"country/KEN\",\"country/DEU\",\"2022\",120.5,\"USDollar\"],[\"dcid:Amount_FinancialFlow_ODA_Disbursement\",\"country/NGA\",\"country/DEU\",\"2022\",98.25,\"USDollar\"]]}", + "digest": "out_fb35c1b4f4a67b6ca2ecd8f334220dfa" + }, + { + "name": "facets-left-out", + "frame": { + "columns": [ + "stat_var", + "destination", + "origin", + "time_period", + "value", + "unit", + "measurementMethod", + "provenance", + "status" + ], + "rows": [ + [ + "dcid:Amount_FinancialFlow_ODA_Disbursement", + "country/KEN", + "country/DEU", + "2022", + 120.5, + "USDollar", + "dcid:OECDReported", + "dcid:OECD_DAC2a", + null + ], + [ + "dcid:Amount_FinancialFlow_ODA_Disbursement", + "country/NGA", + "country/DEU", + "2022", + 98.25, + "USDollar", + "dcid:OECDReported", + "dcid:OECD_DAC2a", + null + ] + ] + }, + "document": "{\"columns\":[\"stat_var\",\"destination\",\"origin\",\"time_period\",\"value\",\"unit\"],\"digest_version\":\"out2\",\"rows\":[[\"dcid:Amount_FinancialFlow_ODA_Disbursement\",\"country/KEN\",\"country/DEU\",\"2022\",120.5,\"USDollar\"],[\"dcid:Amount_FinancialFlow_ODA_Disbursement\",\"country/NGA\",\"country/DEU\",\"2022\",98.25,\"USDollar\"]]}", + "digest": "out_fb35c1b4f4a67b6ca2ecd8f334220dfa" + }, + { + "name": "another-value", + "frame": { + "columns": [ + "stat_var", + "destination", + "origin", + "time_period", + "value", + "unit", + "status" + ], + "rows": [ + [ + "dcid:Amount_FinancialFlow_ODA_Disbursement", + "country/KEN", + "country/DEU", + "2022", + 120.5, + "USDollar", + null + ], + [ + "dcid:Amount_FinancialFlow_ODA_Disbursement", + "country/NGA", + "country/DEU", + "2022", + 98.5, + "USDollar", + null + ] + ] + }, + "document": "{\"columns\":[\"stat_var\",\"destination\",\"origin\",\"time_period\",\"value\",\"unit\"],\"digest_version\":\"out2\",\"rows\":[[\"dcid:Amount_FinancialFlow_ODA_Disbursement\",\"country/KEN\",\"country/DEU\",\"2022\",120.5,\"USDollar\"],[\"dcid:Amount_FinancialFlow_ODA_Disbursement\",\"country/NGA\",\"country/DEU\",\"2022\",98.5,\"USDollar\"]]}", + "digest": "out_a2e2612bf1d8ec3e5e94ccb9d601e028" + }, + { + "name": "another-unit", + "frame": { + "columns": [ + "stat_var", + "destination", + "origin", + "time_period", + "value", + "unit", + "status" + ], + "rows": [ + [ + "dcid:Amount_FinancialFlow_ODA_Disbursement", + "country/KEN", + "country/DEU", + "2022", + 120.5, + "Euro", + null + ], + [ + "dcid:Amount_FinancialFlow_ODA_Disbursement", + "country/NGA", + "country/DEU", + "2022", + 98.25, + "Euro", + null + ] + ] + }, + "document": "{\"columns\":[\"stat_var\",\"destination\",\"origin\",\"time_period\",\"value\",\"unit\"],\"digest_version\":\"out2\",\"rows\":[[\"dcid:Amount_FinancialFlow_ODA_Disbursement\",\"country/KEN\",\"country/DEU\",\"2022\",120.5,\"Euro\"],[\"dcid:Amount_FinancialFlow_ODA_Disbursement\",\"country/NGA\",\"country/DEU\",\"2022\",98.25,\"Euro\"]]}", + "digest": "out_f79a304d277ad9a080a37d71f4e5af39" + }, + { + "name": "another-period", + "frame": { + "columns": [ + "stat_var", + "destination", + "origin", + "time_period", + "value", + "unit", + "status" + ], + "rows": [ + [ + "dcid:Amount_FinancialFlow_ODA_Disbursement", + "country/KEN", + "country/DEU", + "2023", + 120.5, + "USDollar", + null + ], + [ + "dcid:Amount_FinancialFlow_ODA_Disbursement", + "country/NGA", + "country/DEU", + "2022", + 98.25, + "USDollar", + null + ] + ] + }, + "document": "{\"columns\":[\"stat_var\",\"destination\",\"origin\",\"time_period\",\"value\",\"unit\"],\"digest_version\":\"out2\",\"rows\":[[\"dcid:Amount_FinancialFlow_ODA_Disbursement\",\"country/KEN\",\"country/DEU\",\"2023\",120.5,\"USDollar\"],[\"dcid:Amount_FinancialFlow_ODA_Disbursement\",\"country/NGA\",\"country/DEU\",\"2022\",98.25,\"USDollar\"]]}", + "digest": "out_51e11cc3d1e0228562e557a15a9ed8cf" + }, + { + "name": "another-role-name", + "frame": { + "columns": [ + "stat_var", + "observationAbout", + "time_period", + "value", + "unit", + "status" + ], + "rows": [ + [ + "dcid:Amount_FinancialFlow_ODA_Disbursement", + "country/KEN", + "2022", + 120.5, + "USDollar", + null + ] + ] + }, + "document": "{\"columns\":[\"stat_var\",\"observationAbout\",\"time_period\",\"value\",\"unit\"],\"digest_version\":\"out2\",\"rows\":[[\"dcid:Amount_FinancialFlow_ODA_Disbursement\",\"country/KEN\",\"2022\",120.5,\"USDollar\"]]}", + "digest": "out_1694c016b8cd08bb08e68151d4c2a9bc" + }, + { + "name": "converted-unit", + "frame": { + "columns": [ + "stat_var", + "destination", + "origin", + "time_period", + "value", + "unit", + "status" + ], + "rows": [ + [ + "dcid:Amount_FinancialFlow_ODA_Disbursement", + "country/KEN", + "country/DEU", + "2022", + 120.5, + { + "currency": "EUR", + "prices": "constant", + "base_year": 2021 + }, + null + ] + ] + }, + "document": "{\"columns\":[\"stat_var\",\"destination\",\"origin\",\"time_period\",\"value\",\"unit\"],\"digest_version\":\"out2\",\"rows\":[[\"dcid:Amount_FinancialFlow_ODA_Disbursement\",\"country/KEN\",\"country/DEU\",\"2022\",120.5,{\"base_year\":2021,\"currency\":\"EUR\",\"prices\":\"constant\"}]]}", + "digest": "out_e7f45286159d090b59d8c07efba3311c" + }, + { + "name": "converted-unit-recipe-left-out", + "frame": { + "columns": [ + "stat_var", + "destination", + "origin", + "time_period", + "value", + "unit", + "status" + ], + "rows": [ + [ + "dcid:Amount_FinancialFlow_ODA_Disbursement", + "country/KEN", + "country/DEU", + "2022", + 120.5, + { + "currency": "EUR", + "prices": "constant", + "base_year": 2021, + "recipe": "fx_oecd_2025_10" + }, + null + ] + ] + }, + "document": "{\"columns\":[\"stat_var\",\"destination\",\"origin\",\"time_period\",\"value\",\"unit\"],\"digest_version\":\"out2\",\"rows\":[[\"dcid:Amount_FinancialFlow_ODA_Disbursement\",\"country/KEN\",\"country/DEU\",\"2022\",120.5,{\"base_year\":2021,\"currency\":\"EUR\",\"prices\":\"constant\"}]]}", + "digest": "out_e7f45286159d090b59d8c07efba3311c" + }, + { + "name": "composed-unit-recipe-left-out", + "frame": { + "columns": [ + "stat_var", + "destination", + "time_period", + "value", + "unit", + "status" + ], + "rows": [ + [ + "dcid:ops_4b1e0c9a7d2f3e5b6a8c9d0e1f2a3b4c", + "country/KEN", + "2022", + 2.25, + { + "numerator": { + "currency": "EUR", + "prices": "constant", + "base_year": 2021, + "recipe": "fx_oecd_2025_10" + }, + "denominator": { + "stat_var": "dcid:Count_Person" + } + }, + null + ] + ] + }, + "document": "{\"columns\":[\"stat_var\",\"destination\",\"time_period\",\"value\",\"unit\"],\"digest_version\":\"out2\",\"rows\":[[\"dcid:ops_4b1e0c9a7d2f3e5b6a8c9d0e1f2a3b4c\",\"country/KEN\",\"2022\",2.25,{\"denominator\":{\"stat_var\":\"dcid:Count_Person\"},\"numerator\":{\"base_year\":2021,\"currency\":\"EUR\",\"prices\":\"constant\"}}]]}", + "digest": "out_9dcf831992537dbf2dd2cabe816ee483" + }, + { + "name": "composed-unit", + "frame": { + "columns": [ + "stat_var", + "destination", + "time_period", + "value", + "unit", + "status" + ], + "rows": [ + [ + "dcid:ops_4b1e0c9a7d2f3e5b6a8c9d0e1f2a3b4c", + "country/KEN", + "2022", + 2.25, + { + "numerator": { + "currency": "EUR", + "prices": "constant", + "base_year": 2021 + }, + "denominator": { + "stat_var": "dcid:Count_Person" + } + }, + null + ] + ] + }, + "document": "{\"columns\":[\"stat_var\",\"destination\",\"time_period\",\"value\",\"unit\"],\"digest_version\":\"out2\",\"rows\":[[\"dcid:ops_4b1e0c9a7d2f3e5b6a8c9d0e1f2a3b4c\",\"country/KEN\",\"2022\",2.25,{\"denominator\":{\"stat_var\":\"dcid:Count_Person\"},\"numerator\":{\"base_year\":2021,\"currency\":\"EUR\",\"prices\":\"constant\"}}]]}", + "digest": "out_9dcf831992537dbf2dd2cabe816ee483" + }, + { + "name": "join-of-two-variables", + "frame": { + "columns": [ + "stat_var", + "destination", + "time_period", + "value", + "unit", + "status" + ], + "rows": [ + [ + "dcid:Amount_FinancialFlow_ODA_Disbursement", + "country/KEN", + "2022", + 120.5, + "USDollar", + null + ], + [ + "dcid:Amount_EconomicActivity_GrossNationalIncome", + "country/KEN", + "2022", + 104000.0, + "USDollar", + null + ] + ] + }, + "document": "{\"columns\":[\"stat_var\",\"destination\",\"time_period\",\"value\",\"unit\"],\"digest_version\":\"out2\",\"rows\":[[\"dcid:Amount_EconomicActivity_GrossNationalIncome\",\"country/KEN\",\"2022\",104000,\"USDollar\"],[\"dcid:Amount_FinancialFlow_ODA_Disbursement\",\"country/KEN\",\"2022\",120.5,\"USDollar\"]]}", + "digest": "out_e010a9208379d7d1acec4994d4218d18" + }, + { + "name": "join-sides-swapped", + "frame": { + "columns": [ + "stat_var", + "destination", + "time_period", + "value", + "unit", + "status" + ], + "rows": [ + [ + "dcid:Amount_EconomicActivity_GrossNationalIncome", + "country/KEN", + "2022", + 104000.0, + "USDollar", + null + ], + [ + "dcid:Amount_FinancialFlow_ODA_Disbursement", + "country/KEN", + "2022", + 120.5, + "USDollar", + null + ] + ] + }, + "document": "{\"columns\":[\"stat_var\",\"destination\",\"time_period\",\"value\",\"unit\"],\"digest_version\":\"out2\",\"rows\":[[\"dcid:Amount_EconomicActivity_GrossNationalIncome\",\"country/KEN\",\"2022\",104000,\"USDollar\"],[\"dcid:Amount_FinancialFlow_ODA_Disbursement\",\"country/KEN\",\"2022\",120.5,\"USDollar\"]]}", + "digest": "out_e010a9208379d7d1acec4994d4218d18" + }, + { + "name": "join-values-under-swapped-variables", + "frame": { + "columns": [ + "stat_var", + "destination", + "time_period", + "value", + "unit", + "status" + ], + "rows": [ + [ + "dcid:Amount_EconomicActivity_GrossNationalIncome", + "country/KEN", + "2022", + 120.5, + "USDollar", + null + ], + [ + "dcid:Amount_FinancialFlow_ODA_Disbursement", + "country/KEN", + "2022", + 104000.0, + "USDollar", + null + ] + ] + }, + "document": "{\"columns\":[\"stat_var\",\"destination\",\"time_period\",\"value\",\"unit\"],\"digest_version\":\"out2\",\"rows\":[[\"dcid:Amount_EconomicActivity_GrossNationalIncome\",\"country/KEN\",\"2022\",120.5,\"USDollar\"],[\"dcid:Amount_FinancialFlow_ODA_Disbursement\",\"country/KEN\",\"2022\",104000,\"USDollar\"]]}", + "digest": "out_ef49e17ee52f27ccdccb6709fe12a404" + }, + { + "name": "quotient-of-variable-named", + "frame": { + "columns": [ + "stat_var", + "financingRecipient", + "financingRecipient_party_kind", + "time_period", + "value", + "unit", + "status" + ], + "rows": [ + [ + "dcid:ops_f72f69cb463d4fdbeb6751800ba2544a", + "country/KEN", + "party", + "2021", + 0.2, + { + "numerator": "USDollar", + "denominator": "Person" + }, + null + ], + [ + "dcid:ops_f72f69cb463d4fdbeb6751800ba2544a", + "country/KEN", + "party", + "2022", + 0.2, + { + "numerator": "USDollar", + "denominator": "Person" + }, + null + ], + [ + "dcid:ops_f72f69cb463d4fdbeb6751800ba2544a", + "country/NGA", + "party", + "2021", + 0.1, + { + "numerator": "USDollar", + "denominator": "Person" + }, + null + ], + [ + "dcid:ops_f72f69cb463d4fdbeb6751800ba2544a", + "country/NGA", + "party", + "2022", + 0.14285714285714285, + { + "numerator": "USDollar", + "denominator": "Person" + }, + null + ] + ] + }, + "variables": { + "ops_f72f69cb463d4fdbeb6751800ba2544a": "mv_d355e59c50ff8cf07e86a4da12b64297" + }, + "name_documents": { + "mv_d355e59c50ff8cf07e86a4da12b64297": "{\"denominator_frame_ref\":[\"dcid:Count_Person\"],\"frame_ref\":[\"dcid:Amount_ODA\"],\"verb\":\"quotient_of\"}" + }, + "document": "{\"columns\":[\"stat_var\",\"financingRecipient\",\"financingRecipient_party_kind\",\"time_period\",\"value\",\"unit\"],\"digest_version\":\"out2\",\"rows\":[[\"mv_d355e59c50ff8cf07e86a4da12b64297\",\"country/KEN\",\"party\",\"2021\",0.2,{\"denominator\":\"Person\",\"numerator\":\"USDollar\"}],[\"mv_d355e59c50ff8cf07e86a4da12b64297\",\"country/KEN\",\"party\",\"2022\",0.2,{\"denominator\":\"Person\",\"numerator\":\"USDollar\"}],[\"mv_d355e59c50ff8cf07e86a4da12b64297\",\"country/NGA\",\"party\",\"2021\",0.1,{\"denominator\":\"Person\",\"numerator\":\"USDollar\"}],[\"mv_d355e59c50ff8cf07e86a4da12b64297\",\"country/NGA\",\"party\",\"2022\",0.14285714285714285,{\"denominator\":\"Person\",\"numerator\":\"USDollar\"}]]}", + "digest": "out_e64e2b613cf8ceb4e3b0cd93a54cf5ce" + }, + { + "name": "filter-then-quotient-of", + "frame": { + "columns": [ + "stat_var", + "financingRecipient", + "financingRecipient_party_kind", + "time_period", + "value", + "unit", + "status" + ], + "rows": [ + [ + "dcid:ops_664db264b67e0ba2cec6b95c18ea4635", + "country/KEN", + "party", + "2021", + 0.2, + { + "numerator": "USDollar", + "denominator": "Person" + }, + null + ], + [ + "dcid:ops_664db264b67e0ba2cec6b95c18ea4635", + "country/KEN", + "party", + "2022", + 0.2, + { + "numerator": "USDollar", + "denominator": "Person" + }, + null + ], + [ + "dcid:ops_664db264b67e0ba2cec6b95c18ea4635", + "country/NGA", + "party", + "2021", + 0.1, + { + "numerator": "USDollar", + "denominator": "Person" + }, + null + ], + [ + "dcid:ops_664db264b67e0ba2cec6b95c18ea4635", + "country/NGA", + "party", + "2022", + 0.14285714285714285, + { + "numerator": "USDollar", + "denominator": "Person" + }, + null + ] + ] + }, + "variables": { + "ops_664db264b67e0ba2cec6b95c18ea4635": "mv_d355e59c50ff8cf07e86a4da12b64297" + }, + "name_documents": { + "mv_d355e59c50ff8cf07e86a4da12b64297": "{\"denominator_frame_ref\":[\"dcid:Count_Person\"],\"frame_ref\":[\"dcid:Amount_ODA\"],\"verb\":\"quotient_of\"}" + }, + "document": "{\"columns\":[\"stat_var\",\"financingRecipient\",\"financingRecipient_party_kind\",\"time_period\",\"value\",\"unit\"],\"digest_version\":\"out2\",\"rows\":[[\"mv_d355e59c50ff8cf07e86a4da12b64297\",\"country/KEN\",\"party\",\"2021\",0.2,{\"denominator\":\"Person\",\"numerator\":\"USDollar\"}],[\"mv_d355e59c50ff8cf07e86a4da12b64297\",\"country/KEN\",\"party\",\"2022\",0.2,{\"denominator\":\"Person\",\"numerator\":\"USDollar\"}],[\"mv_d355e59c50ff8cf07e86a4da12b64297\",\"country/NGA\",\"party\",\"2021\",0.1,{\"denominator\":\"Person\",\"numerator\":\"USDollar\"}],[\"mv_d355e59c50ff8cf07e86a4da12b64297\",\"country/NGA\",\"party\",\"2022\",0.14285714285714285,{\"denominator\":\"Person\",\"numerator\":\"USDollar\"}]]}", + "digest": "out_e64e2b613cf8ceb4e3b0cd93a54cf5ce" + }, + { + "name": "quotient-of-sides-swapped", + "frame": { + "columns": [ + "stat_var", + "financingRecipient", + "financingRecipient_party_kind", + "time_period", + "value", + "unit", + "status" + ], + "rows": [ + [ + "dcid:ops_f72f69cb463d4fdbeb6751800ba2544a", + "country/KEN", + "party", + "2021", + 0.2, + { + "numerator": "USDollar", + "denominator": "Person" + }, + null + ], + [ + "dcid:ops_f72f69cb463d4fdbeb6751800ba2544a", + "country/KEN", + "party", + "2022", + 0.2, + { + "numerator": "USDollar", + "denominator": "Person" + }, + null + ], + [ + "dcid:ops_f72f69cb463d4fdbeb6751800ba2544a", + "country/NGA", + "party", + "2021", + 0.1, + { + "numerator": "USDollar", + "denominator": "Person" + }, + null + ], + [ + "dcid:ops_f72f69cb463d4fdbeb6751800ba2544a", + "country/NGA", + "party", + "2022", + 0.14285714285714285, + { + "numerator": "USDollar", + "denominator": "Person" + }, + null + ] + ] + }, + "variables": { + "ops_f72f69cb463d4fdbeb6751800ba2544a": "mv_df0088e6b8552d16ee6000c8b7da3814" + }, + "name_documents": { + "mv_df0088e6b8552d16ee6000c8b7da3814": "{\"denominator_frame_ref\":[\"dcid:Amount_ODA\"],\"frame_ref\":[\"dcid:Count_Person\"],\"verb\":\"quotient_of\"}" + }, + "document": "{\"columns\":[\"stat_var\",\"financingRecipient\",\"financingRecipient_party_kind\",\"time_period\",\"value\",\"unit\"],\"digest_version\":\"out2\",\"rows\":[[\"mv_df0088e6b8552d16ee6000c8b7da3814\",\"country/KEN\",\"party\",\"2021\",0.2,{\"denominator\":\"Person\",\"numerator\":\"USDollar\"}],[\"mv_df0088e6b8552d16ee6000c8b7da3814\",\"country/KEN\",\"party\",\"2022\",0.2,{\"denominator\":\"Person\",\"numerator\":\"USDollar\"}],[\"mv_df0088e6b8552d16ee6000c8b7da3814\",\"country/NGA\",\"party\",\"2021\",0.1,{\"denominator\":\"Person\",\"numerator\":\"USDollar\"}],[\"mv_df0088e6b8552d16ee6000c8b7da3814\",\"country/NGA\",\"party\",\"2022\",0.14285714285714285,{\"denominator\":\"Person\",\"numerator\":\"USDollar\"}]]}", + "digest": "out_7b765553f4377c65a8c7799c070be936" + }, + { + "name": "quotient-of-a-sum-of", + "frame": { + "columns": [ + "stat_var", + "financingRecipient", + "financingRecipient_party_kind", + "time_period", + "value", + "unit", + "status" + ], + "rows": [ + [ + "dcid:ops_a3a85219d81e742e831d19c7966e562f", + "country/KEN", + "party", + "2021", + 0.6, + { + "numerator": "USDollar", + "denominator": "Person" + }, + null + ], + [ + "dcid:ops_a3a85219d81e742e831d19c7966e562f", + "country/KEN", + "party", + "2022", + 0.6, + { + "numerator": "USDollar", + "denominator": "Person" + }, + null + ], + [ + "dcid:ops_a3a85219d81e742e831d19c7966e562f", + "country/NGA", + "party", + "2021", + 0.3, + { + "numerator": "USDollar", + "denominator": "Person" + }, + null + ], + [ + "dcid:ops_a3a85219d81e742e831d19c7966e562f", + "country/NGA", + "party", + "2022", + 0.42857142857142855, + { + "numerator": "USDollar", + "denominator": "Person" + }, + null + ] + ] + }, + "variables": { + "ops_a3a85219d81e742e831d19c7966e562f": "mv_288cc4adaed3cc3195d7e8c6cc4f87aa" + }, + "name_documents": { + "mv_ae90cefe711d4addb439f873f2010dba": "{\"frame_ref\":[\"dcid:Amount_ODA\"],\"right_frame_ref\":[\"dcid:Amount_ODA\"],\"verb\":\"sum_of\"}", + "mv_288cc4adaed3cc3195d7e8c6cc4f87aa": "{\"denominator_frame_ref\":[\"dcid:Count_Person\"],\"frame_ref\":[\"mv_ae90cefe711d4addb439f873f2010dba\"],\"verb\":\"quotient_of\"}" + }, + "document": "{\"columns\":[\"stat_var\",\"financingRecipient\",\"financingRecipient_party_kind\",\"time_period\",\"value\",\"unit\"],\"digest_version\":\"out2\",\"rows\":[[\"mv_288cc4adaed3cc3195d7e8c6cc4f87aa\",\"country/KEN\",\"party\",\"2021\",0.6,{\"denominator\":\"Person\",\"numerator\":\"USDollar\"}],[\"mv_288cc4adaed3cc3195d7e8c6cc4f87aa\",\"country/KEN\",\"party\",\"2022\",0.6,{\"denominator\":\"Person\",\"numerator\":\"USDollar\"}],[\"mv_288cc4adaed3cc3195d7e8c6cc4f87aa\",\"country/NGA\",\"party\",\"2021\",0.3,{\"denominator\":\"Person\",\"numerator\":\"USDollar\"}],[\"mv_288cc4adaed3cc3195d7e8c6cc4f87aa\",\"country/NGA\",\"party\",\"2022\",0.42857142857142855,{\"denominator\":\"Person\",\"numerator\":\"USDollar\"}]]}", + "digest": "out_61999d3b24a82e4c28621d0fe434959a" + }, + { + "name": "relative-growth", + "frame": { + "columns": [ + "stat_var", + "destination", + "time_period", + "value", + "unit", + "status" + ], + "rows": [ + [ + "dcid:Amount_FinancialFlow_ODA_Disbursement", + "country/KEN", + "2018/2022", + 0.25, + null, + null + ], + [ + "dcid:Amount_FinancialFlow_ODA_Disbursement", + "country/NGA", + "2018/2022", + -0.125, + null, + null + ] + ] + }, + "document": "{\"columns\":[\"stat_var\",\"destination\",\"time_period\",\"value\",\"unit\"],\"digest_version\":\"out2\",\"rows\":[[\"dcid:Amount_FinancialFlow_ODA_Disbursement\",\"country/KEN\",\"2018/2022\",0.25,null],[\"dcid:Amount_FinancialFlow_ODA_Disbursement\",\"country/NGA\",\"2018/2022\",-0.125,null]]}", + "digest": "out_f648b4fa7a61f8a10daf34eb6b1e8e01" + }, + { + "name": "number-spellings", + "frame": { + "columns": [ + "stat_var", + "destination", + "time_period", + "value", + "unit", + "status" + ], + "rows": [ + [ + "dcid:Amount_FinancialFlow_ODA_Disbursement", + "country/KEN", + "2020", + 1e+21, + "USDollar", + null + ], + [ + "dcid:Amount_FinancialFlow_ODA_Disbursement", + "country/KEN", + "2021", + 1.5e-07, + "USDollar", + null + ], + [ + "dcid:Amount_FinancialFlow_ODA_Disbursement", + "country/KEN", + "2022", + 3.0, + "USDollar", + null + ] + ] + }, + "document": "{\"columns\":[\"stat_var\",\"destination\",\"time_period\",\"value\",\"unit\"],\"digest_version\":\"out2\",\"rows\":[[\"dcid:Amount_FinancialFlow_ODA_Disbursement\",\"country/KEN\",\"2020\",1e+21,\"USDollar\"],[\"dcid:Amount_FinancialFlow_ODA_Disbursement\",\"country/KEN\",\"2021\",1.5e-7,\"USDollar\"],[\"dcid:Amount_FinancialFlow_ODA_Disbursement\",\"country/KEN\",\"2022\",3,\"USDollar\"]]}", + "digest": "out_c02c263d6ff798a41efd17e1872382d5" + }, + { + "name": "empty-frame", + "frame": { + "columns": [ + "stat_var", + "destination", + "origin", + "time_period", + "value", + "unit", + "status" + ], + "rows": [] + }, + "document": "{\"columns\":[\"stat_var\",\"destination\",\"origin\",\"time_period\",\"value\",\"unit\"],\"digest_version\":\"out2\",\"rows\":[]}", + "digest": "out_a8fab64c203e3de84f95af840aa6257c" + } + ] +} diff --git a/python/client-contract/src/dfo_client_contract/rules/publication.json b/python/client-contract/src/dfo_client_contract/rules/publication.json new file mode 100644 index 0000000..55b36eb --- /dev/null +++ b/python/client-contract/src/dfo_client_contract/rules/publication.json @@ -0,0 +1,444 @@ +{ + "format_version": 1, + "rule": "publication", + "vectors": [ + { + "name": "live-replace-keeps-slots", + "description": "Replacing a live share's cards keeps its slots, so each slot's embed and data URLs draw the new card.", + "steps": [ + { + "op": "share", + "share": "tile", + "latest": true, + "cards": [ + "cmp_a", + "cmp_b" + ] + }, + { + "op": "replace", + "share": "tile", + "cards": [ + "cmp_c", + "cmp_d" + ], + "write_token": "held" + } + ], + "outcomes": [ + { + "share": { + "latest": true, + "slots": [ + { + "slot": 1, + "card": "cmp_a" + }, + { + "slot": 2, + "card": "cmp_b" + } + ] + } + }, + { + "share": { + "latest": true, + "slots": [ + { + "slot": 1, + "card": "cmp_c" + }, + { + "slot": 2, + "card": "cmp_d" + } + ] + } + } + ] + }, + { + "name": "live-replace-with-fewer-cards", + "description": "A replacement with fewer cards leaves the later slots empty, and a later one with more fills them again, under the same URLs.", + "steps": [ + { + "op": "share", + "share": "tile", + "latest": true, + "cards": [ + "cmp_a", + "cmp_b", + "cmp_c" + ] + }, + { + "op": "replace", + "share": "tile", + "cards": [ + "cmp_d" + ], + "write_token": "held" + }, + { + "op": "replace", + "share": "tile", + "cards": [ + "cmp_a", + "cmp_b", + "cmp_e" + ], + "write_token": "held" + } + ], + "outcomes": [ + { + "share": { + "latest": true, + "slots": [ + { + "slot": 1, + "card": "cmp_a" + }, + { + "slot": 2, + "card": "cmp_b" + }, + { + "slot": 3, + "card": "cmp_c" + } + ] + } + }, + { + "share": { + "latest": true, + "slots": [ + { + "slot": 1, + "card": "cmp_d" + }, + { + "slot": 2, + "card": null + }, + { + "slot": 3, + "card": null + } + ] + } + }, + { + "share": { + "latest": true, + "slots": [ + { + "slot": 1, + "card": "cmp_a" + }, + { + "slot": 2, + "card": "cmp_b" + }, + { + "slot": 3, + "card": "cmp_e" + } + ] + } + } + ] + }, + { + "name": "snapshot-replace-refused", + "description": "A snapshot cannot be replaced, even with its write token, so a cited URL draws the same figure for good.", + "steps": [ + { + "op": "share", + "share": "figure", + "latest": false, + "cards": [ + "cmp_a" + ] + }, + { + "op": "replace", + "share": "figure", + "cards": [ + "cmp_b" + ], + "write_token": "held" + }, + { + "op": "read", + "share": "figure" + } + ], + "outcomes": [ + { + "share": { + "latest": false, + "slots": [ + { + "slot": 1, + "card": "cmp_a" + } + ] + } + }, + { + "error": "share_not_replaceable" + }, + { + "share": { + "latest": false, + "slots": [ + { + "slot": 1, + "card": "cmp_a" + } + ] + } + } + ] + }, + { + "name": "replace-without-token-refused", + "description": "Replacing a share needs its write token.", + "steps": [ + { + "op": "share", + "share": "tile", + "latest": true, + "cards": [ + "cmp_a" + ] + }, + { + "op": "replace", + "share": "tile", + "cards": [ + "cmp_b" + ] + }, + { + "op": "read", + "share": "tile" + } + ], + "outcomes": [ + { + "share": { + "latest": true, + "slots": [ + { + "slot": 1, + "card": "cmp_a" + } + ] + } + }, + { + "error": "write_token_required" + }, + { + "share": { + "latest": true, + "slots": [ + { + "slot": 1, + "card": "cmp_a" + } + ] + } + } + ] + }, + { + "name": "replace-with-another-token-refused", + "description": "A write token other than the share's is refused, and the check comes before the share's mode, so a caller without the token learns nothing else.", + "steps": [ + { + "op": "share", + "share": "figure", + "latest": false, + "cards": [ + "cmp_a" + ] + }, + { + "op": "replace", + "share": "figure", + "cards": [ + "cmp_b" + ], + "write_token": "other" + } + ], + "outcomes": [ + { + "share": { + "latest": false, + "slots": [ + { + "slot": 1, + "card": "cmp_a" + } + ] + } + }, + { + "error": "write_token_invalid" + } + ] + }, + { + "name": "tokenless-share-stays-fixed", + "description": "A share created with no write token, as a guest's share migrates, refuses every token, so it stays as it is.", + "steps": [ + { + "op": "share", + "share": "guest", + "latest": true, + "cards": [ + "cmp_a" + ], + "tokenless": true + }, + { + "op": "replace", + "share": "guest", + "cards": [ + "cmp_b" + ], + "write_token": "held" + }, + { + "op": "unshare", + "share": "guest", + "write_token": "held" + }, + { + "op": "read", + "share": "guest" + } + ], + "outcomes": [ + { + "share": { + "latest": true, + "slots": [ + { + "slot": 1, + "card": "cmp_a" + } + ] + } + }, + { + "error": "write_token_invalid" + }, + { + "error": "write_token_invalid" + }, + { + "share": { + "latest": true, + "slots": [ + { + "slot": 1, + "card": "cmp_a" + } + ] + } + } + ] + }, + { + "name": "unshare-snapshot", + "description": "A snapshot can be taken down with its write token.", + "steps": [ + { + "op": "share", + "share": "figure", + "latest": false, + "cards": [ + "cmp_a" + ] + }, + { + "op": "unshare", + "share": "figure", + "write_token": "held" + } + ], + "outcomes": [ + { + "share": { + "latest": false, + "slots": [ + { + "slot": 1, + "card": "cmp_a" + } + ] + } + }, + { + "removed": true + } + ] + }, + { + "name": "unshare-without-token-refused", + "description": "Taking a share down needs its write token.", + "steps": [ + { + "op": "share", + "share": "tile", + "latest": true, + "cards": [ + "cmp_a" + ] + }, + { + "op": "unshare", + "share": "tile" + }, + { + "op": "read", + "share": "tile" + } + ], + "outcomes": [ + { + "share": { + "latest": true, + "slots": [ + { + "slot": 1, + "card": "cmp_a" + } + ] + } + }, + { + "error": "write_token_required" + }, + { + "share": { + "latest": true, + "slots": [ + { + "slot": 1, + "card": "cmp_a" + } + ] + } + } + ] + } + ] +} diff --git a/python/client-contract/src/dfo_client_contract/rules/rolling-composition.json b/python/client-contract/src/dfo_client_contract/rules/rolling-composition.json new file mode 100644 index 0000000..b7f555a --- /dev/null +++ b/python/client-contract/src/dfo_client_contract/rules/rolling-composition.json @@ -0,0 +1,530 @@ +{ + "format_version": 1, + "rule": "rolling-composition", + "vectors": [ + { + "name": "one-rolling-step", + "description": "One rolling step takes the newest period at least half of every population's series hold: Kenya alone holds 2024, so 2023.", + "series": [ + { + "spec_id": "spec_6f0c2a9d4b7e1f3a5c8d0b2e4f6a8c1d", + "coordinates": { + "destination": "country/KEN" + }, + "periods": [ + "2021", + "2022", + "2023", + "2024" + ] + }, + { + "spec_id": "spec_6f0c2a9d4b7e1f3a5c8d0b2e4f6a8c1d", + "coordinates": { + "destination": "country/GHA" + }, + "periods": [ + "2021", + "2022", + "2023" + ] + }, + { + "spec_id": "spec_6f0c2a9d4b7e1f3a5c8d0b2e4f6a8c1d", + "coordinates": { + "destination": "country/NGA" + }, + "periods": [ + "2021", + "2022", + "2023" + ] + }, + { + "spec_id": "spec_1a3c5e7f9b2d4f6a8c0e2b4d6f8a0c3e", + "coordinates": { + "observationAbout": "country/KEN" + }, + "periods": [ + "2021", + "2022", + "2023", + "2024" + ] + }, + { + "spec_id": "spec_1a3c5e7f9b2d4f6a8c0e2b4d6f8a0c3e", + "coordinates": { + "observationAbout": "country/GHA" + }, + "periods": [ + "2021", + "2022", + "2023", + "2024" + ] + } + ], + "steps": [ + { + "step": "growth", + "population": [ + { + "spec_id": "spec_6f0c2a9d4b7e1f3a5c8d0b2e4f6a8c1d", + "bindings": {} + } + ] + } + ], + "period": "2023" + }, + { + "name": "two-steps-one-population", + "description": "Two rolling steps that state the same populations, however they list them, share one latest period.", + "series": [ + { + "spec_id": "spec_6f0c2a9d4b7e1f3a5c8d0b2e4f6a8c1d", + "coordinates": { + "destination": "country/KEN" + }, + "periods": [ + "2021", + "2022", + "2023", + "2024" + ] + }, + { + "spec_id": "spec_6f0c2a9d4b7e1f3a5c8d0b2e4f6a8c1d", + "coordinates": { + "destination": "country/GHA" + }, + "periods": [ + "2021", + "2022", + "2023" + ] + }, + { + "spec_id": "spec_6f0c2a9d4b7e1f3a5c8d0b2e4f6a8c1d", + "coordinates": { + "destination": "country/NGA" + }, + "periods": [ + "2021", + "2022", + "2023" + ] + }, + { + "spec_id": "spec_1a3c5e7f9b2d4f6a8c0e2b4d6f8a0c3e", + "coordinates": { + "observationAbout": "country/KEN" + }, + "periods": [ + "2021", + "2022", + "2023", + "2024" + ] + }, + { + "spec_id": "spec_1a3c5e7f9b2d4f6a8c0e2b4d6f8a0c3e", + "coordinates": { + "observationAbout": "country/GHA" + }, + "periods": [ + "2021", + "2022", + "2023", + "2024" + ] + } + ], + "steps": [ + { + "step": "growth", + "population": [ + { + "spec_id": "spec_6f0c2a9d4b7e1f3a5c8d0b2e4f6a8c1d", + "bindings": { + "destination": [ + "country/KEN", + "country/GHA" + ] + } + } + ] + }, + { + "step": "rank", + "population": [ + { + "spec_id": "spec_6f0c2a9d4b7e1f3a5c8d0b2e4f6a8c1d", + "bindings": { + "destination": [ + "country/GHA", + "country/KEN" + ] + } + } + ] + } + ], + "period": "2024" + }, + { + "name": "one-population-per-root", + "description": "A tree over two roots counts the latest period over both: each population must hold it.", + "series": [ + { + "spec_id": "spec_6f0c2a9d4b7e1f3a5c8d0b2e4f6a8c1d", + "coordinates": { + "destination": "country/KEN" + }, + "periods": [ + "2021", + "2022", + "2023", + "2024" + ] + }, + { + "spec_id": "spec_6f0c2a9d4b7e1f3a5c8d0b2e4f6a8c1d", + "coordinates": { + "destination": "country/GHA" + }, + "periods": [ + "2021", + "2022", + "2023" + ] + }, + { + "spec_id": "spec_6f0c2a9d4b7e1f3a5c8d0b2e4f6a8c1d", + "coordinates": { + "destination": "country/NGA" + }, + "periods": [ + "2021", + "2022", + "2023" + ] + }, + { + "spec_id": "spec_1a3c5e7f9b2d4f6a8c0e2b4d6f8a0c3e", + "coordinates": { + "observationAbout": "country/KEN" + }, + "periods": [ + "2021", + "2022", + "2023", + "2024" + ] + }, + { + "spec_id": "spec_1a3c5e7f9b2d4f6a8c0e2b4d6f8a0c3e", + "coordinates": { + "observationAbout": "country/GHA" + }, + "periods": [ + "2021", + "2022", + "2023", + "2024" + ] + } + ], + "steps": [ + { + "step": "growth", + "population": [ + { + "spec_id": "spec_6f0c2a9d4b7e1f3a5c8d0b2e4f6a8c1d", + "bindings": {} + }, + { + "spec_id": "spec_1a3c5e7f9b2d4f6a8c0e2b4d6f8a0c3e", + "bindings": {} + } + ] + }, + { + "step": "growth", + "population": [ + { + "spec_id": "spec_1a3c5e7f9b2d4f6a8c0e2b4d6f8a0c3e", + "bindings": {} + }, + { + "spec_id": "spec_6f0c2a9d4b7e1f3a5c8d0b2e4f6a8c1d", + "bindings": {} + } + ] + } + ], + "period": "2023" + }, + { + "name": "same-year-other-series-refused", + "description": "Two rolling steps over different series are refused even when each would settle on the same year, 2024 here, so one latest period is never counted twice.", + "series": [ + { + "spec_id": "spec_6f0c2a9d4b7e1f3a5c8d0b2e4f6a8c1d", + "coordinates": { + "destination": "country/KEN" + }, + "periods": [ + "2021", + "2022", + "2023", + "2024" + ] + }, + { + "spec_id": "spec_6f0c2a9d4b7e1f3a5c8d0b2e4f6a8c1d", + "coordinates": { + "destination": "country/GHA" + }, + "periods": [ + "2021", + "2022", + "2023" + ] + }, + { + "spec_id": "spec_6f0c2a9d4b7e1f3a5c8d0b2e4f6a8c1d", + "coordinates": { + "destination": "country/NGA" + }, + "periods": [ + "2021", + "2022", + "2023" + ] + }, + { + "spec_id": "spec_1a3c5e7f9b2d4f6a8c0e2b4d6f8a0c3e", + "coordinates": { + "observationAbout": "country/KEN" + }, + "periods": [ + "2021", + "2022", + "2023", + "2024" + ] + }, + { + "spec_id": "spec_1a3c5e7f9b2d4f6a8c0e2b4d6f8a0c3e", + "coordinates": { + "observationAbout": "country/GHA" + }, + "periods": [ + "2021", + "2022", + "2023", + "2024" + ] + } + ], + "steps": [ + { + "step": "growth", + "population": [ + { + "spec_id": "spec_6f0c2a9d4b7e1f3a5c8d0b2e4f6a8c1d", + "bindings": { + "destination": [ + "country/KEN", + "country/GHA" + ] + } + } + ] + }, + { + "step": "rank", + "population": [ + { + "spec_id": "spec_6f0c2a9d4b7e1f3a5c8d0b2e4f6a8c1d", + "bindings": { + "destination": [ + "country/KEN", + "country/NGA" + ] + } + } + ] + } + ], + "error": "rolling_populations_differ" + }, + { + "name": "other-year-refused", + "description": "Two rolling steps over different populations that would settle on different years are refused.", + "series": [ + { + "spec_id": "spec_6f0c2a9d4b7e1f3a5c8d0b2e4f6a8c1d", + "coordinates": { + "destination": "country/KEN" + }, + "periods": [ + "2021", + "2022", + "2023", + "2024" + ] + }, + { + "spec_id": "spec_6f0c2a9d4b7e1f3a5c8d0b2e4f6a8c1d", + "coordinates": { + "destination": "country/GHA" + }, + "periods": [ + "2021", + "2022", + "2023" + ] + }, + { + "spec_id": "spec_6f0c2a9d4b7e1f3a5c8d0b2e4f6a8c1d", + "coordinates": { + "destination": "country/NGA" + }, + "periods": [ + "2021", + "2022", + "2023" + ] + }, + { + "spec_id": "spec_1a3c5e7f9b2d4f6a8c0e2b4d6f8a0c3e", + "coordinates": { + "observationAbout": "country/KEN" + }, + "periods": [ + "2021", + "2022", + "2023", + "2024" + ] + }, + { + "spec_id": "spec_1a3c5e7f9b2d4f6a8c0e2b4d6f8a0c3e", + "coordinates": { + "observationAbout": "country/GHA" + }, + "periods": [ + "2021", + "2022", + "2023", + "2024" + ] + } + ], + "steps": [ + { + "step": "growth", + "population": [ + { + "spec_id": "spec_6f0c2a9d4b7e1f3a5c8d0b2e4f6a8c1d", + "bindings": {} + } + ] + }, + { + "step": "growth", + "population": [ + { + "spec_id": "spec_1a3c5e7f9b2d4f6a8c0e2b4d6f8a0c3e", + "bindings": {} + } + ] + } + ], + "error": "rolling_populations_differ" + }, + { + "name": "empty-population-unresolved", + "description": "A population no series falls in names no latest period.", + "series": [ + { + "spec_id": "spec_6f0c2a9d4b7e1f3a5c8d0b2e4f6a8c1d", + "coordinates": { + "destination": "country/KEN" + }, + "periods": [ + "2021", + "2022", + "2023", + "2024" + ] + }, + { + "spec_id": "spec_6f0c2a9d4b7e1f3a5c8d0b2e4f6a8c1d", + "coordinates": { + "destination": "country/GHA" + }, + "periods": [ + "2021", + "2022", + "2023" + ] + }, + { + "spec_id": "spec_6f0c2a9d4b7e1f3a5c8d0b2e4f6a8c1d", + "coordinates": { + "destination": "country/NGA" + }, + "periods": [ + "2021", + "2022", + "2023" + ] + }, + { + "spec_id": "spec_1a3c5e7f9b2d4f6a8c0e2b4d6f8a0c3e", + "coordinates": { + "observationAbout": "country/KEN" + }, + "periods": [ + "2021", + "2022", + "2023", + "2024" + ] + }, + { + "spec_id": "spec_1a3c5e7f9b2d4f6a8c0e2b4d6f8a0c3e", + "coordinates": { + "observationAbout": "country/GHA" + }, + "periods": [ + "2021", + "2022", + "2023", + "2024" + ] + } + ], + "steps": [ + { + "step": "growth", + "population": [ + { + "spec_id": "spec_6f0c2a9d4b7e1f3a5c8d0b2e4f6a8c1d", + "bindings": { + "destination": [ + "country/SOM" + ] + } + } + ] + } + ], + "error": "rolling_anchor_unresolved" + } + ] +} 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 8ccf5b4..e8dd62a 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 @@ -2,7 +2,7 @@ "$schema": "https://json-schema.org/draft/2020-12/schema", "$id": "https://raw.githubusercontent.com/DevelopmentFinanceObservatory/spec-kit/main/python/client-contract/src/dfo_client_contract/rules/rules.schema.json", "title": "Client rule vectors", - "description": "One file per rule, each holding the vectors a client's implementation of that rule must reproduce. rules/README.md states each rule.", + "description": "One file per rule, each holding the vectors an implementation of that rule must reproduce: a client's for the client rules, DFO's for the analysis and publication rules. rules/README.md states each rule.", "type": "object", "oneOf": [ { @@ -35,6 +35,24 @@ { "$ref": "#/$defs/role_keys" }, + { + "$ref": "#/$defs/output_digest" + }, + { + "$ref": "#/$defs/output_comparison" + }, + { + "$ref": "#/$defs/operation_outputs" + }, + { + "$ref": "#/$defs/rolling_composition" + }, + { + "$ref": "#/$defs/publication" + }, + { + "$ref": "#/$defs/series_left_out" + }, { "$ref": "#/$defs/file_selector" } @@ -1136,6 +1154,894 @@ } } }, + "output_digest": { + "$ref": "#/$defs/suite", + "additionalProperties": false, + "properties": { + "format_version": true, + "rule": { + "const": "output-digest" + }, + "vectors": { + "items": { + "type": "object", + "additionalProperties": false, + "required": [ + "name", + "frame", + "document", + "digest" + ], + "dependentRequired": { + "variables": [ + "name_documents" + ] + }, + "properties": { + "name": { + "$ref": "#/$defs/name" + }, + "frame": { + "type": "object", + "additionalProperties": false, + "required": [ + "columns", + "rows" + ], + "properties": { + "columns": { + "description": "The frame's columns in the frame grammar's order.", + "type": "array", + "minItems": 1, + "uniqueItems": true, + "items": { + "type": "string", + "minLength": 1, + "$ref": "#/$defs/one_line" + } + }, + "rows": { + "type": "array", + "items": { + "type": "array", + "items": { + "type": [ + "string", + "number", + "null", + "object" + ] + } + } + } + }, + "description": "A frame as docs/frame-grammar-v1.md defines it, each row in its column order." + }, + "variables": { + "description": "The name of each variable an operation of the frame's recipe wrote, keyed by the operation's ops_ id, which the frame's stat_var cells spell after dcid:.", + "type": "object", + "propertyNames": { + "pattern": "^ops_[0-9a-f]{32}$" + }, + "additionalProperties": { + "type": "string", + "pattern": "^mv_[0-9a-f]{32}$" + } + }, + "name_documents": { + "description": "The name document of each name in variables and of each mv_ name those documents hold, as the UTF-8 text the name hashes, keyed by the name.", + "type": "object", + "minProperties": 1, + "propertyNames": { + "pattern": "^mv_[0-9a-f]{32}$" + }, + "additionalProperties": { + "type": "string", + "minLength": 1 + } + }, + "document": { + "description": "The output digest document, as the UTF-8 text the digest hashes.", + "type": "string", + "minLength": 1 + }, + "digest": { + "type": "string", + "pattern": "^out_[0-9a-f]{32}$" + } + } + } + } + } + }, + "output_comparison": { + "$ref": "#/$defs/suite", + "additionalProperties": false, + "properties": { + "format_version": true, + "rule": { + "const": "output-comparison" + }, + "vectors": { + "items": { + "type": "object", + "additionalProperties": false, + "required": [ + "name", + "left", + "right", + "equal", + "same_data" + ], + "properties": { + "name": { + "$ref": "#/$defs/name" + }, + "left": { + "$ref": "../dataset-ref.schema.json" + }, + "right": { + "$ref": "../dataset-ref.schema.json" + }, + "equal": { + "description": "Whether the refs name the same versions, recipes and renderings: `==` in Python, `equals` in TypeScript.", + "type": "boolean" + }, + "same_data": { + "description": "Whether the refs hold the same output: `same_data` in Python, `sameData` in TypeScript.", + "type": "boolean" + } + } + } + } + } + }, + "operation_outputs": { + "$ref": "#/$defs/suite", + "additionalProperties": false, + "properties": { + "format_version": true, + "rule": { + "const": "operation-outputs" + }, + "vectors": { + "items": { + "type": "object", + "additionalProperties": false, + "required": [ + "name", + "description", + "verb", + "arguments", + "data" + ], + "properties": { + "name": { + "$ref": "#/$defs/name" + }, + "description": { + "type": "string", + "minLength": 1 + }, + "verb": { + "enum": [ + "share_of", + "join", + "compare", + "sum_of", + "growth" + ] + }, + "arguments": { + "type": "object", + "additionalProperties": false, + "required": [], + "properties": { + "on": { + "description": "Each role of data, to the role of other it pairs with.", + "type": "object", + "minProperties": 1, + "additionalProperties": { + "type": "string", + "minLength": 1 + } + }, + "by": { + "type": "array", + "minItems": 1, + "uniqueItems": true, + "items": { + "type": "string", + "minLength": 1 + } + }, + "window": { + "type": "array", + "minItems": 2, + "maxItems": 2, + "items": { + "type": "string", + "pattern": "^[0-9]{4}$" + } + }, + "change": { + "enum": [ + "relative", + "absolute" + ] + } + } + }, + "data": { + "type": "array", + "items": { + "type": "object", + "required": [ + "time_period", + "value", + "unit" + ], + "properties": { + "stat_var": { + "type": "string", + "pattern": "^dcid:." + }, + "time_period": { + "type": "string", + "minLength": 1 + }, + "value": { + "type": "number" + }, + "unit": { + "type": [ + "string", + "number", + "null", + "object" + ] + } + }, + "additionalProperties": { + "type": "string", + "minLength": 1 + } + }, + "description": "The rows of the first reading, each its frame row by column name." + }, + "other": { + "type": "array", + "items": { + "type": "object", + "required": [ + "time_period", + "value", + "unit" + ], + "properties": { + "stat_var": { + "type": "string", + "pattern": "^dcid:." + }, + "time_period": { + "type": "string", + "minLength": 1 + }, + "value": { + "type": "number" + }, + "unit": { + "type": [ + "string", + "number", + "null", + "object" + ] + } + }, + "additionalProperties": { + "type": "string", + "minLength": 1 + } + }, + "description": "The rows of the second reading, for an operation that takes one." + }, + "rows": { + "type": "array", + "items": { + "type": "object", + "required": [ + "time_period", + "value", + "unit" + ], + "properties": { + "stat_var": { + "type": "string", + "pattern": "^dcid:." + }, + "time_period": { + "type": "string", + "minLength": 1 + }, + "value": { + "type": "number" + }, + "unit": { + "type": [ + "string", + "number", + "null", + "object" + ] + } + }, + "additionalProperties": { + "type": "string", + "minLength": 1 + } + }, + "description": "The output rows, in any order. A row leaves out stat_var when the operation writes a variable of its own." + }, + "error": { + "description": "The code the operation refuses with in place of rows.", + "enum": [ + "role_ambiguous" + ] + } + }, + "oneOf": [ + { + "required": [ + "rows" + ] + }, + { + "required": [ + "error" + ] + } + ] + } + } + } + }, + "rolling_composition": { + "$ref": "#/$defs/suite", + "additionalProperties": false, + "properties": { + "format_version": true, + "rule": { + "const": "rolling-composition" + }, + "vectors": { + "items": { + "type": "object", + "additionalProperties": false, + "required": [ + "name", + "description", + "series", + "steps" + ], + "properties": { + "name": { + "$ref": "#/$defs/name" + }, + "description": { + "type": "string", + "minLength": 1 + }, + "series": { + "description": "Every series of the roots, by its root's spec_id and coordinates, with the periods it holds a row at.", + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "required": [ + "spec_id", + "coordinates", + "periods" + ], + "properties": { + "spec_id": { + "type": "string", + "pattern": "^spec_[0-9a-f]{32}$" + }, + "coordinates": { + "type": "object", + "additionalProperties": { + "type": "string", + "minLength": 1 + } + }, + "periods": { + "type": "array", + "uniqueItems": true, + "items": { + "type": "string", + "pattern": "^[0-9]{4}$" + } + } + } + } + }, + "steps": { + "description": "The rolling steps of one recipe tree, each with the populations it counts the latest period over.", + "type": "array", + "minItems": 1, + "items": { + "type": "object", + "additionalProperties": false, + "required": [ + "step", + "population" + ], + "properties": { + "step": { + "type": "string", + "minLength": 1 + }, + "population": { + "type": "array", + "minItems": 1, + "items": { + "type": "object", + "additionalProperties": false, + "required": [ + "spec_id" + ], + "properties": { + "spec_id": { + "type": "string", + "pattern": "^spec_[0-9a-f]{32}$" + }, + "bindings": { + "type": "object", + "additionalProperties": { + "type": "array", + "minItems": 1, + "items": { + "type": "string", + "minLength": 1 + } + } + } + } + } + } + } + } + }, + "period": { + "type": "string", + "pattern": "^[0-9]{4}$" + }, + "error": { + "enum": [ + "rolling_populations_differ", + "rolling_anchor_unresolved" + ] + } + }, + "oneOf": [ + { + "required": [ + "period" + ] + }, + { + "required": [ + "error" + ] + } + ] + } + } + } + }, + "publication": { + "$ref": "#/$defs/suite", + "additionalProperties": false, + "properties": { + "format_version": true, + "rule": { + "const": "publication" + }, + "vectors": { + "items": { + "type": "object", + "additionalProperties": false, + "required": [ + "name", + "description", + "steps", + "outcomes" + ], + "properties": { + "name": { + "$ref": "#/$defs/name" + }, + "description": { + "type": "string", + "minLength": 1 + }, + "steps": { + "type": "array", + "minItems": 1, + "items": { + "oneOf": [ + { + "type": "object", + "additionalProperties": false, + "required": [ + "op", + "share", + "latest", + "cards" + ], + "properties": { + "op": { + "const": "share" + }, + "share": { + "type": "string", + "minLength": 1 + }, + "latest": { + "type": "boolean" + }, + "cards": { + "type": "array", + "minItems": 1, + "items": { + "type": "string", + "pattern": "^cmp_[0-9a-z]+$" + } + }, + "tokenless": { + "description": "The share holds no write token, as a guest's share migrates.", + "const": true + } + } + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "op", + "share", + "cards" + ], + "properties": { + "op": { + "const": "replace" + }, + "share": { + "type": "string", + "minLength": 1 + }, + "cards": { + "type": "array", + "minItems": 1, + "items": { + "type": "string", + "pattern": "^cmp_[0-9a-z]+$" + } + }, + "write_token": { + "description": "`held` for the token the share's creation returned, `other` for another; absent sends none.", + "enum": [ + "held", + "other" + ] + } + } + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "op", + "share" + ], + "properties": { + "op": { + "const": "unshare" + }, + "share": { + "type": "string", + "minLength": 1 + }, + "write_token": { + "description": "`held` for the token the share's creation returned, `other` for another; absent sends none.", + "enum": [ + "held", + "other" + ] + } + } + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "op", + "share" + ], + "properties": { + "op": { + "const": "read" + }, + "share": { + "type": "string", + "minLength": 1 + } + } + } + ] + } + }, + "outcomes": { + "description": "One outcome per step.", + "type": "array", + "minItems": 1, + "items": { + "oneOf": [ + { + "type": "object", + "additionalProperties": false, + "required": [ + "share" + ], + "properties": { + "share": { + "type": "object", + "additionalProperties": false, + "required": [ + "latest", + "slots" + ], + "properties": { + "latest": { + "type": "boolean" + }, + "slots": { + "type": "array", + "minItems": 1, + "items": { + "type": "object", + "additionalProperties": false, + "required": [ + "slot", + "card" + ], + "properties": { + "slot": { + "type": "integer", + "minimum": 1 + }, + "card": { + "oneOf": [ + { + "type": "string", + "pattern": "^cmp_[0-9a-z]+$" + }, + { + "type": "null" + } + ] + } + } + } + } + } + } + } + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "removed" + ], + "properties": { + "removed": { + "const": true + } + } + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "error" + ], + "properties": { + "error": { + "enum": [ + "write_token_required", + "write_token_invalid", + "share_not_replaceable" + ] + } + } + } + ] + } + } + } + } + } + } + }, + "series_left_out": { + "$ref": "#/$defs/suite", + "additionalProperties": false, + "properties": { + "format_version": true, + "rule": { + "const": "series-left-out" + }, + "vectors": { + "items": { + "type": "object", + "additionalProperties": false, + "required": [ + "name", + "description", + "members", + "strict" + ], + "oneOf": [ + { + "required": [ + "warnings" + ] + }, + { + "required": [ + "raises" + ] + } + ], + "properties": { + "name": { + "$ref": "#/$defs/name" + }, + "description": { + "type": "string", + "minLength": 1, + "$ref": "#/$defs/one_line" + }, + "members": { + "description": "The left-out series of each derived member one fetch returns, in member order, as its derived manifest serves them.", + "type": "array", + "minItems": 1, + "items": { + "type": "object", + "additionalProperties": false, + "required": [ + "left_out", + "left_out_complete" + ], + "oneOf": [ + { + "properties": { + "left_out": { + "type": "null" + }, + "left_out_complete": { + "type": "null" + } + } + }, + { + "properties": { + "left_out": { + "type": "array" + }, + "left_out_complete": { + "type": "boolean" + } + } + } + ], + "properties": { + "left_out": { + "description": "Every series a step of the recipe dropped for a data gap; null for a recipe stored without them.", + "type": [ + "array", + "null" + ], + "items": { + "type": "object", + "additionalProperties": false, + "required": [ + "coordinates", + "step", + "side", + "reason", + "rows" + ], + "properties": { + "coordinates": { + "type": "object", + "minProperties": 1, + "additionalProperties": { + "type": "string", + "minLength": 1 + } + }, + "step": { + "type": "object", + "additionalProperties": false, + "required": [ + "verb", + "node" + ], + "properties": { + "verb": { + "type": "string", + "minLength": 1 + }, + "node": { + "type": "integer", + "minimum": 0 + } + } + }, + "side": { + "enum": [ + "data", + "other" + ] + }, + "reason": { + "type": "string", + "minLength": 1 + }, + "rows": { + "type": "integer", + "minimum": 1 + } + } + } + }, + "left_out_complete": { + "description": "False when the steps dropped more series than `left_out` lists; null with a null `left_out`.", + "type": [ + "boolean", + "null" + ] + } + } + } + }, + "strict": { + "type": "boolean" + }, + "warnings": { + "description": "The warnings the fetch issues, each once.", + "type": "array", + "maxItems": 1, + "items": { + "enum": [ + "series_left_out" + ] + } + }, + "raises": { + "description": "The warning a strict fetch raises in place of its data.", + "enum": [ + "series_left_out" + ] + } + } + } + } + } + }, "file_selector": { "$ref": "#/$defs/suite", "additionalProperties": false, diff --git a/python/client-contract/src/dfo_client_contract/rules/series-left-out.json b/python/client-contract/src/dfo_client_contract/rules/series-left-out.json new file mode 100644 index 0000000..a0afe22 --- /dev/null +++ b/python/client-contract/src/dfo_client_contract/rules/series-left-out.json @@ -0,0 +1,199 @@ +{ + "format_version": 1, + "rule": "series-left-out", + "vectors": [ + { + "name": "growth-left-series-out", + "description": "A growth dropped Nigeria, which has no value at the window's end, so the fetch issues series_left_out and returns the frame.", + "members": [ + { + "left_out": [ + { + "coordinates": { + "financingRecipient": "country/NGA" + }, + "step": { + "verb": "growth", + "node": 0 + }, + "side": "data", + "reason": "endpoint_missing", + "rows": 1 + } + ], + "left_out_complete": true + } + ], + "strict": false, + "warnings": [ + "series_left_out" + ] + }, + { + "name": "nothing-left-out", + "description": "A manifest that lists no left-out series and says the list is complete issues nothing.", + "members": [ + { + "left_out": [], + "left_out_complete": true + } + ], + "strict": false, + "warnings": [] + }, + { + "name": "recipe-stored-without-left-out", + "description": "A recipe stored without its left-out series has a null left_out and left_out_complete and issues nothing.", + "members": [ + { + "left_out": null, + "left_out_complete": null + } + ], + "strict": false, + "warnings": [] + }, + { + "name": "list-incomplete", + "description": "A manifest whose list stops short of every left-out series, left_out_complete false, issues series_left_out.", + "members": [ + { + "left_out": [ + { + "coordinates": { + "financingRecipient": "country/GHA" + }, + "step": { + "verb": "quotient_of", + "node": 1 + }, + "side": "data", + "reason": "unmatched_key", + "rows": 2 + } + ], + "left_out_complete": false + } + ], + "strict": false, + "warnings": [ + "series_left_out" + ] + }, + { + "name": "incomplete-with-none-listed", + "description": "left_out_complete false issues series_left_out even when left_out lists no series.", + "members": [ + { + "left_out": [], + "left_out_complete": false + } + ], + "strict": false, + "warnings": [ + "series_left_out" + ] + }, + { + "name": "several-members-warn-once", + "description": "Two members whose manifests each list left-out series issue one series_left_out for the fetch.", + "members": [ + { + "left_out": [ + { + "coordinates": { + "financingRecipient": "country/NGA" + }, + "step": { + "verb": "growth", + "node": 0 + }, + "side": "data", + "reason": "endpoint_missing", + "rows": 1 + } + ], + "left_out_complete": true + }, + { + "left_out": null, + "left_out_complete": null + }, + { + "left_out": [ + { + "coordinates": { + "financingRecipient": "country/GHA" + }, + "step": { + "verb": "quotient_of", + "node": 1 + }, + "side": "data", + "reason": "unmatched_key", + "rows": 2 + }, + { + "coordinates": { + "financingRecipient": "country/NGA" + }, + "step": { + "verb": "quotient_of", + "node": 1 + }, + "side": "data", + "reason": "period_unmatched", + "rows": 1 + } + ], + "left_out_complete": true + } + ], + "strict": false, + "warnings": [ + "series_left_out" + ] + }, + { + "name": "strict-raises", + "description": "Under strict, a fetch whose member's manifest lists left-out series raises series_left_out in place of its data.", + "members": [ + { + "left_out": null, + "left_out_complete": null + }, + { + "left_out": [ + { + "coordinates": { + "financingRecipient": "country/GHA" + }, + "step": { + "verb": "growth", + "node": 0 + }, + "side": "data", + "reason": "zero_or_sign_crossing_base", + "rows": 2 + } + ], + "left_out_complete": true + } + ], + "strict": true, + "raises": "series_left_out" + }, + { + "name": "strict-without-left-out-series", + "description": "Under strict, a fetch whose manifests list no left-out series returns its data with no warning.", + "members": [ + { + "left_out": [], + "left_out_complete": true + } + ], + "strict": true, + "warnings": [] + } + ] +} 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 c6e5752..d730cd8 100644 --- a/python/client-contract/src/dfo_client_contract/scenario.schema.json +++ b/python/client-contract/src/dfo_client_contract/scenario.schema.json @@ -222,35 +222,44 @@ ] }, "step": { - "oneOf": [ - { - "$ref": "#/$defs/search_step" - }, - { - "$ref": "#/$defs/choose_step" - }, - { - "$ref": "#/$defs/fetch_answer_step" - }, - { - "$ref": "#/$defs/fetch_spec_step" - }, - { - "$ref": "#/$defs/fetch_ref_step" - }, - { - "$ref": "#/$defs/newest_version_step" - }, - { - "$ref": "#/$defs/mint_step" - }, - { - "$ref": "#/$defs/operation_step" - }, - { - "$ref": "#/$defs/result_step" - } - ] + "description": "A step with a `ref` is a fetch of that ref, so a broken ref is reported at the member that breaks it; any other step is one of the other kinds.", + "if": { + "type": "object", + "required": [ + "ref" + ] + }, + "then": { + "$ref": "#/$defs/fetch_ref_step" + }, + "else": { + "oneOf": [ + { + "$ref": "#/$defs/search_step" + }, + { + "$ref": "#/$defs/choose_step" + }, + { + "$ref": "#/$defs/fetch_answer_step" + }, + { + "$ref": "#/$defs/fetch_spec_step" + }, + { + "$ref": "#/$defs/newest_version_step" + }, + { + "$ref": "#/$defs/mint_step" + }, + { + "$ref": "#/$defs/operation_step" + }, + { + "$ref": "#/$defs/result_step" + } + ] + } }, "search_step": { "type": "object", @@ -376,7 +385,19 @@ "const": "fetch" }, "ref": { - "$ref": "dataset-ref.schema.json" + "allOf": [ + { + "$ref": "dataset-ref.schema.json" + }, + { + "properties": { + "format_version": { + "description": "Format 1, a ref of dataset members. No scenario serves a derived member yet, so a format 2 ref fails here.", + "const": 1 + } + } + } + ] } } }, diff --git a/python/client-contract/src/dfo_client_contract/scenarios/search-retry-after-past-cap.json b/python/client-contract/src/dfo_client_contract/scenarios/search-retry-after-past-cap.json new file mode 100644 index 0000000..c772459 --- /dev/null +++ b/python/client-contract/src/dfo_client_contract/scenarios/search-retry-after-past-cap.json @@ -0,0 +1,57 @@ +{ + "format_version": 1, + "name": "search-retry-after-past-cap", + "description": "A retryable refusal whose Retry-After is past the 60-second cap raises at once, with no wait and no retry: ServerError with its code, service_unavailable, and its trace id.", + "origin": { + "kind": "synthetic", + "derived_from": "search-place-ambiguous", + "edit": "A 503 service_unavailable with retryable true and Retry-After 61 answers the search." + }, + "call": [ + { + "op": "search", + "question": "ODA disbursements from Germany to Congo in 2018" + } + ], + "exchanges": [ + { + "request": { + "method": "POST", + "path": "/search/resolve", + "json": { + "schema_version": 1, + "input": { + "kind": "raw_text", + "query": "ODA disbursements from Germany to Congo in 2018" + } + } + }, + "response": { + "status": 503, + "headers": { + "content-type": "application/problem+json", + "retry-after": "61" + }, + "json": { + "type": "/codes/service_unavailable", + "title": "Service Unavailable", + "status": 503, + "detail": "The service is busy.", + "code": "service_unavailable", + "trace_id": "00000000000000000000000000000000", + "capability_version": "synthetic", + "retryable": true + } + } + } + ], + "expect": [ + { + "error": { + "class": "ServerError", + "code": "service_unavailable", + "trace_id": "00000000000000000000000000000000" + } + } + ] +} diff --git a/python/client-contract/src/dfo_client_contract/warning-codes.json b/python/client-contract/src/dfo_client_contract/warning-codes.json index 5d55edf..5b9ee2d 100644 --- a/python/client-contract/src/dfo_client_contract/warning-codes.json +++ b/python/client-contract/src/dfo_client_contract/warning-codes.json @@ -26,6 +26,11 @@ "class": "DfoDeprecationWarning", "condition": "An API response carries a Deprecation or Sunset header, once per process per distinct pair of their values." }, + { + "code": "series_left_out", + "class": "SeriesLeftOutWarning", + "condition": "A derived frame left series out for missing data; the client returns the frame." + }, { "code": "server_warning", "class": "DfoWarning", diff --git a/python/client-contract/src/dfo_client_contract/warning-codes.schema.json b/python/client-contract/src/dfo_client_contract/warning-codes.schema.json index 4427722..d639eea 100644 --- a/python/client-contract/src/dfo_client_contract/warning-codes.schema.json +++ b/python/client-contract/src/dfo_client_contract/warning-codes.schema.json @@ -32,7 +32,8 @@ "class": { "enum": [ "DfoWarning", - "DfoDeprecationWarning" + "DfoDeprecationWarning", + "SeriesLeftOutWarning" ] }, "condition": { diff --git a/python/client-contract/tests/test_analysis_rules.py b/python/client-contract/tests/test_analysis_rules.py new file mode 100644 index 0000000..2faae0c --- /dev/null +++ b/python/client-contract/tests/test_analysis_rules.py @@ -0,0 +1,361 @@ +"""Replay the analysis and publication rule vectors through a reference +implementation of each rule. + +The rules are stated in `dfo_client_contract/rules/README.md`. DFO applies +them on the server; a client reads their results and applies only the +output comparison. Each function here is the shortest faithful reading of one +rule, so a vector that disagrees with its rule fails here before the server +or a client replays it. +""" + +from __future__ import annotations + +import hashlib +import math +from typing import Any + +import pytest +import rfc8785 + +from dfo_client_contract import rule + +# The frame columns that name no role (docs/frame-grammar-v1.md). +_NOT_ROLES = frozenset( + { + "stat_var", + "time_period", + "value", + "unit", + "measurementMethod", + "provenance", + "status", + } +) +_PERCENT = "Percent" + + +class RuleError(Exception): + def __init__(self, code: str) -> None: + super().__init__(code) + self.code = code + + +def _vectors(name: str) -> list[dict[str, Any]]: + return rule(name)["vectors"] + + +def _ids(name: str) -> list[str]: + return [vector["name"] for vector in _vectors(name)] + + +def jcs(value: Any) -> str: + """The RFC 8785 serialisation of a JSON value.""" + return rfc8785.dumps(value).decode("utf-8") + + +def _without_recipe(unit: Any) -> Any: + if not isinstance(unit, dict): + return unit + if "numerator" in unit: + return {side: _without_recipe(part) for side, part in unit.items()} + return {name: item for name, item in unit.items() if name != "recipe"} + + +def output_digest(frame: dict[str, Any], variables: dict[str, str]) -> tuple[str, str]: + """The output digest document of a frame, and its token, with `variables` + naming each variable an operation wrote by its `ops_` id.""" + roles = [column for column in frame["columns"] if column not in _NOT_ROLES] + columns = ["stat_var", *roles, "time_period", "value", "unit"] + rows = [] + for row in frame["rows"]: + cells = dict(zip(frame["columns"], row, strict=True)) + cells["unit"] = _without_recipe(cells["unit"]) + stat_var = cells["stat_var"] + cells["stat_var"] = variables.get(stat_var.removeprefix("dcid:"), stat_var) + rows.append([cells[column] for column in columns]) + rows.sort(key=lambda cells: jcs(cells).encode("utf-8")) + document = jcs({"digest_version": "out2", "columns": columns, "rows": rows}) + digest = hashlib.sha256(document.encode("utf-8")).hexdigest() + return document, f"out_{digest[:32]}" + + +def _identity(member: dict[str, Any]) -> tuple[str, ...]: + spec = member["spec"] + return ( + spec["spec_id"], + member["content_version"], + jcs(member["artifact"]["rendering"]), + jcs(spec.get("recipe")), + ) + + +def _output(member: dict[str, Any]) -> tuple[Any, ...]: + if "output_digest" in member: + return ("derived", member["output_digest"]) + rendering = member["artifact"]["rendering"] + cut = rendering.get("without_party_totals", False) + return ("dataset", member["content_version"], cut) + + +def refs_equal(left: dict[str, Any], right: dict[str, Any]) -> bool: + return [_identity(m) for m in left["members"]] == [ + _identity(m) for m in right["members"] + ] + + +def same_data(left: dict[str, Any], right: dict[str, Any]) -> bool: + return [_output(m) for m in left["members"]] == [ + _output(m) for m in right["members"] + ] + + +def _paired( + data: list[dict[str, Any]], other: list[dict[str, Any]], on: dict[str, str] +) -> list[tuple[dict[str, Any], dict[str, Any]]]: + """Each data row with the other row at its paired keys and period.""" + pairs = [] + for row in data: + found = [ + match + for match in other + if match["time_period"] == row["time_period"] + and all(row[mine] == match[theirs] for mine, theirs in on.items()) + ] + assert len(found) <= 1, row + pairs.extend((row, match) for match in found) + return pairs + + +def _growth(vector: dict[str, Any]) -> list[dict[str, Any]]: + """Each member's change over the window. Two rows of one member in one + period of the window refuse with `role_ambiguous`. A member is left out + without a value at both ends (`endpoint_missing`), for a relative change + with a zero or sign-crossing base (`zero_or_sign_crossing_base`), and + for a change that is not finite (`non_finite`).""" + arguments = vector["arguments"] + start, end = arguments["window"] + by = arguments["by"] + relative = arguments.get("change", "relative") == "relative" + groups: dict[tuple[str, ...], dict[str, dict[str, Any]]] = {} + for row in vector["data"]: + period = row["time_period"] + if not start <= period <= end: + continue + periods = groups.setdefault(tuple(row[r] for r in by), {}) + if period in periods: + raise RuleError("role_ambiguous") + periods[period] = row + rows = [] + for key, periods in groups.items(): + if start not in periods or end not in periods: + continue + first, last = periods[start], periods[end] + base, final = first["value"], last["value"] + if relative and (base == 0 or final == 0 or (base < 0) != (final < 0)): + continue + change = (final - base) / base if relative else final - base + if not math.isfinite(change): + continue + rows.append( + { + "stat_var": first["stat_var"], + **dict(zip(by, key, strict=True)), + "time_period": f"{start}/{end}", + "value": change, + "unit": None if relative else first["unit"], + } + ) + return rows + + +def _share_across(vector: dict[str, Any]) -> list[dict[str, Any]]: + by = vector["arguments"]["by"] + totals: dict[str, list[float]] = {} + sums: dict[tuple[Any, ...], list[float]] = {} + for row in vector["data"]: + totals.setdefault(row["time_period"], []).append(row["value"]) + key = (*(row[r] for r in by), row["time_period"]) + sums.setdefault(key, []).append(row["value"]) + return [ + { + **dict(zip(by, key[:-1], strict=True)), + "time_period": key[-1], + "value": math.fsum(values) / math.fsum(totals[key[-1]]) * 100.0, + "unit": _PERCENT, + } + for key, values in sums.items() + ] + + +def operation_output(vector: dict[str, Any]) -> list[dict[str, Any]]: + verb, arguments = vector["verb"], vector["arguments"] + if verb == "growth": + return _growth(vector) + if verb == "share_of" and "other" not in vector: + return _share_across(vector) + on = arguments["on"] + rows = [] + for row, match in _paired(vector["data"], vector["other"], on): + keys = {mine: row[mine] for mine in on} + period = row["time_period"] + if verb == "join": + rows.extend( + { + "stat_var": side["stat_var"], + **keys, + "time_period": period, + "value": side["value"], + "unit": side["unit"], + } + for side in (row, match) + ) + continue + value, unit = { + "share_of": (row["value"] / match["value"] * 100.0, _PERCENT), + "compare": (row["value"] - match["value"], row["unit"]), + "sum_of": (row["value"] + match["value"], row["unit"]), + }[verb] + rows.append({**keys, "time_period": period, "value": value, "unit": unit}) + return rows + + +def _population(population: dict[str, Any]) -> str: + """A population in its one spelling: each binding's values sorted, once.""" + bindings = { + column: sorted(set(values)) + for column, values in population.get("bindings", {}).items() + } + return jcs({"spec_id": population["spec_id"], "bindings": bindings}) + + +def rolling_anchor(vector: dict[str, Any]) -> str: + stated = { + jcs(sorted({_population(p) for p in step["population"]})) + for step in vector["steps"] + } + if len(stated) > 1: + raise RuleError("rolling_populations_differ") + held = [] + for population in vector["steps"][0]["population"]: + bindings = population.get("bindings", {}) + series = [ + set(item["periods"]) + for item in vector["series"] + if item["spec_id"] == population["spec_id"] + and all(item["coordinates"].get(c) in v for c, v in bindings.items()) + ] + if not series: + raise RuleError("rolling_anchor_unresolved") + held.append(series) + periods = {period for series in held for periods in series for period in periods} + for period in sorted(periods, reverse=True): + if all(2 * sum(period in s for s in series) >= len(series) for series in held): + return period + raise RuleError("rolling_anchor_unresolved") + + +def _slots(cards: list[str], held: list[str | None]) -> list[str | None]: + count = max(len(cards), len(held)) + return [cards[i] if i < len(cards) else None for i in range(count)] + + +def _check_token(share: dict[str, Any], step: dict[str, Any]) -> None: + token = step.get("write_token") + if token is None: + raise RuleError("write_token_required") + if token != "held" or not share["has_token"]: + raise RuleError("write_token_invalid") + + +def _state(share: dict[str, Any]) -> dict[str, Any]: + return { + "latest": share["latest"], + "slots": [ + {"slot": number, "card": card} + for number, card in enumerate(share["slots"], start=1) + ], + } + + +def publish(steps: list[dict[str, Any]]) -> list[dict[str, Any]]: + shares: dict[str, dict[str, Any]] = {} + outcomes: list[dict[str, Any]] = [] + for step in steps: + op = step["op"] + if op == "share": + share = shares[step["share"]] = { + "latest": step["latest"], + "has_token": not step.get("tokenless", False), + "slots": _slots(step["cards"], []), + } + outcomes.append({"share": _state(share)}) + continue + share = shares[step["share"]] + try: + if op in ("replace", "unshare"): + _check_token(share, step) + if op == "replace": + if not share["latest"]: + raise RuleError("share_not_replaceable") + share["slots"] = _slots(step["cards"], share["slots"]) + if op == "unshare": + del shares[step["share"]] + outcomes.append({"removed": True}) + continue + except RuleError as error: + outcomes.append({"error": error.code}) + continue + outcomes.append({"share": _state(share)}) + return outcomes + + +def _rows(rows: list[dict[str, Any]]) -> list[str]: + return sorted(jcs(row) for row in rows) + + +@pytest.mark.parametrize("vector", _vectors("output-digest"), ids=_ids("output-digest")) +def test_output_digest(vector: dict[str, Any]) -> None: + assert output_digest(vector["frame"], vector.get("variables", {})) == ( + vector["document"], + vector["digest"], + ) + + +@pytest.mark.parametrize( + "vector", _vectors("output-comparison"), ids=_ids("output-comparison") +) +def test_output_comparison(vector: dict[str, Any]) -> None: + left, right = vector["left"], vector["right"] + assert refs_equal(left, right) is vector["equal"] + assert same_data(left, right) is vector["same_data"] + assert refs_equal(right, left) is vector["equal"] + assert same_data(right, left) is vector["same_data"] + + +@pytest.mark.parametrize( + "vector", _vectors("operation-outputs"), ids=_ids("operation-outputs") +) +def test_operation_outputs(vector: dict[str, Any]) -> None: + if "error" in vector: + with pytest.raises(RuleError) as excinfo: + operation_output(vector) + assert excinfo.value.code == vector["error"] + return + assert _rows(operation_output(vector)) == _rows(vector["rows"]) + + +@pytest.mark.parametrize( + "vector", _vectors("rolling-composition"), ids=_ids("rolling-composition") +) +def test_rolling_composition(vector: dict[str, Any]) -> None: + if "error" in vector: + with pytest.raises(RuleError) as excinfo: + rolling_anchor(vector) + assert excinfo.value.code == vector["error"] + return + assert rolling_anchor(vector) == vector["period"] + + +@pytest.mark.parametrize("vector", _vectors("publication"), ids=_ids("publication")) +def test_publication(vector: dict[str, Any]) -> None: + assert publish(vector["steps"]) == vector["outcomes"] diff --git a/python/client-contract/tests/test_rules.py b/python/client-contract/tests/test_rules.py index 4dc86d9..72345f2 100644 --- a/python/client-contract/tests/test_rules.py +++ b/python/client-contract/tests/test_rules.py @@ -312,6 +312,15 @@ def posted_entities( return posted +def series_left_out(members: list[dict[str, Any]]) -> bool: + """Whether a fetch of derived members with these derived manifests issues + `series_left_out`: once, when any manifest lists a left-out series or says + `left_out_complete` false. A null `left_out` issues nothing.""" + return any( + member["left_out"] or member["left_out_complete"] is False for member in members + ) + + def selector_query(rendering: dict[str, Any]) -> str: def written(value: Any) -> str: return ("true" if value else "false") if isinstance(value, bool) else value @@ -449,6 +458,17 @@ def test_role_keys(vector: dict[str, Any]) -> None: assert posted == vector["posted"] +@pytest.mark.parametrize( + "vector", _vectors("series-left-out"), ids=_ids("series-left-out") +) +def test_series_left_out(vector: dict[str, Any]) -> None: + issued = ["series_left_out"] if series_left_out(vector["members"]) else [] + if vector["strict"] and issued: + assert vector.get("raises") == issued[0] + else: + assert vector.get("warnings") == issued + + @pytest.mark.parametrize("vector", _vectors("file-selector"), ids=_ids("file-selector")) def test_file_selector(vector: dict[str, Any]) -> None: assert selector_query(vector["rendering"]) == vector["query"] diff --git a/python/client-contract/uv.lock b/python/client-contract/uv.lock index bee0e2a..3bcd032 100644 --- a/python/client-contract/uv.lock +++ b/python/client-contract/uv.lock @@ -140,6 +140,7 @@ dev = [ { name = "pytest" }, { name = "pytest-cov" }, { name = "referencing" }, + { name = "rfc8785" }, { name = "ruff" }, { name = "ty" }, ] @@ -153,6 +154,7 @@ dev = [ { name = "pytest", specifier = ">=9.1.0" }, { name = "pytest-cov", specifier = ">=7.1.0" }, { name = "referencing", specifier = ">=0.36" }, + { name = "rfc8785", specifier = ">=0.1.4" }, { name = "ruff", specifier = ">=0.15.0" }, { name = "ty", specifier = ">=0.0.59" }, ] @@ -383,6 +385,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/2c/58/ca301544e1fa93ed4f80d724bf5b194f6e4b945841c5bfd555878eea9fcb/referencing-0.37.0-py3-none-any.whl", hash = "sha256:381329a9f99628c9069361716891d34ad94af76e461dcb0335825aecc7692231", size = 26766, upload-time = "2025-10-13T15:30:47.625Z" }, ] +[[package]] +name = "rfc8785" +version = "0.1.4" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/ef/2f/fa1d2e740c490191b572d33dbca5daa180cb423c24396b856f5886371d8b/rfc8785-0.1.4.tar.gz", hash = "sha256:e545841329fe0eee4f6a3b44e7034343100c12b4ec566dc06ca9735681deb4da", size = 14321, upload-time = "2024-09-27T16:33:31.206Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/4d/78/119878110660b2ad709888c8a1614fce7e2fab39080ab960656dc8605bf6/rfc8785-0.1.4-py3-none-any.whl", hash = "sha256:520d690b448ecf0703691c76e1a34a24ddcd4fc5bc41d589cb7c58ec651bcd48", size = 9240, upload-time = "2024-09-27T16:33:29.683Z" }, +] + [[package]] name = "rpds-py" version = "2026.9.1" diff --git a/python/descriptions/CHANGELOG.md b/python/descriptions/CHANGELOG.md index 3c6e776..6a59d01 100644 --- a/python/descriptions/CHANGELOG.md +++ b/python/descriptions/CHANGELOG.md @@ -136,5 +136,18 @@ and this package adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 repeated drawn `ref` and a card drawn from a computed version carrying a measure. The card-revision and live-rendering vectors carry the measure, fixed values and drawn values with graph definitions. +- `operations.json` names each analysis operation's `verb`, the function a + client calls, and its `output`, the shape of the rows it writes; an + operation that takes inputs by role carries `arguments`, the roles a + client's `data` and `other` fill and how `on` pairs them, so `sum` and + `compare` pair by role as `quotient`, `share` and `join` do. `compare` gives + `data` minus `other`, with `data` in the `right` role. The `percent` unit + rule names its unit, `Percent`, in `ref`, and a relative growth has no unit. + `tools/validate_descriptions_vectors.py` checks each verb is listed once and + the arguments fill the op's two roles. +- `sum`, `share` and `compare` list `unmatched_key` under `left_out`, the + members of one side with no partner on the other. The `sum` and `compare` + descriptions cover the paired form: members of `data` and `other` pair by + role through `on`, and a call to `compare` returns `data` minus `other`. [unreleased]: https://github.com/DevelopmentFinanceObservatory/spec-kit/commits/main/python diff --git a/python/descriptions/README.md b/python/descriptions/README.md index 201231d..8bd92d1 100644 --- a/python/descriptions/README.md +++ b/python/descriptions/README.md @@ -118,25 +118,27 @@ The size bound is on the stored list and `check_steps` checks it where the list `operations.json` lists, for each operation, its kind, whether it takes one input, inputs by role or none, its one fixed policy, the rule for the unit it produces, the coverage it records, and the data gaps it can leave out with what each counts. The analysis operations carry the policy names and exclusion reasons the `ai` repo's analysis engine already uses. -| `op` | Kind | Inputs | Policy | Unit | Coverage | Known `left_out` reasons | -| ----------------- | --------------- | -------------------------- | ----------------------------------- | ------------------------------------- | ---------- | -------------------------------------------------------------------------------------- | -| `retrieve` | retrieval | one version | `retrieve_minted_version` | as recorded | | | -| `sum` | analysis | `left`, `right` | `sum_of_intersect_periods` | the inputs' shared unit | | `period_unmatched`, `unit_unbound` | -| `quotient` | analysis | `numerator`, `denominator` | `quotient_of_intersect_periods` | composed | per period | `unmatched_key`, `period_unmatched`, `zero_denominator`, `unit_unbound`, `party_total` | -| `share` | analysis | `numerator`, `denominator` | `share_of_intersect_periods` | per cent | per period | `period_unmatched`, `unit_unbound`, `party_total` | -| `growth` | analysis | one | `growth_endpoint_years` | the input's, or a dimensionless ratio | | `endpoint_missing`, `zero_or_sign_crossing_base`, `non_finite`, `unit_unbound` | -| `rank` | analysis | one | `rank_what_is_present` | the input's, or none for an ordinal | per entity | `party_total`, `unit_unbound` | -| `aggregate` | analysis | one | `aggregate_skip_absent_grain_cells` | the input's | per period | `party_total`, `unit_unbound` | -| `filter` | analysis | one | `filter_row_value_predicates` | the input's | | | -| `compare` | analysis | `left`, `right` | `compare_intersect_periods` | the inputs' shared unit | | `period_unmatched`, `unit_unbound` | -| `join` | analysis | `left`, `right` | `join_inner` | each side its own | | `unmatched_key`, `unit_unbound` | -| `source_step` | source pipeline | none | `source_pipeline_as_recorded` | as recorded | | | -| `choose_source` | mint choice | none | `facet_default_by_coverage` | as recorded | | | -| `sum_variables` | mint choice | none | `sum_family_members` | the summed variables' shared unit | | | -| `convert` | mint choice | none | `convert_by_rate_and_deflator` | converted | | `currency_unmapped`, `deflator_missing` | -| `continue_series` | mint choice | none | `continue_with_source_estimates` | as recorded | | | -| `select` | card selection | one version | `card_selection` | the version's | | | -| `change` | card derivation | one | `change_between_basis_periods` | the input's, or per cent | | | +Each analysis operation also names its `verb`, the function a client calls, and its `output`, the shape of the rows it writes with a sentence on their values. `share` writes per cent, 100 times the ratio, under the unit `Percent`, which its unit's `ref` names. `join` writes long format, one row per side at each key and period, told apart by `stat_var`. `growth` writes one row per member with the window as its period, and a relative change as a fraction with no unit. An operation that takes inputs by role carries `arguments`: the role a client's first reading, `data`, fills, the role its second, `other`, fills, and how `on` pairs their roles. `sum` and `compare` pair by `on` as `quotient`, `share` and `join` do, and each side is one series when `on` is left out. `compare` subtracts the left series from the right, so `data` fills `right` and the client's call gives `data` minus `other`. The client contract's `operation-outputs` rule pins these units and shapes with vectors. + +| `op` | Kind | Inputs | Policy | Unit | Coverage | Known `left_out` reasons | +| ----------------- | --------------- | -------------------------- | ----------------------------------- | ----------------------------------- | ---------- | -------------------------------------------------------------------------------------- | +| `retrieve` | retrieval | one version | `retrieve_minted_version` | as recorded | | | +| `sum` | analysis | `left`, `right` | `sum_of_intersect_periods` | the inputs' shared unit | | `unmatched_key`, `period_unmatched`, `unit_unbound` | +| `quotient` | analysis | `numerator`, `denominator` | `quotient_of_intersect_periods` | composed | per period | `unmatched_key`, `period_unmatched`, `zero_denominator`, `unit_unbound`, `party_total` | +| `share` | analysis | `numerator`, `denominator` | `share_of_intersect_periods` | per cent | per period | `unmatched_key`, `period_unmatched`, `unit_unbound`, `party_total` | +| `growth` | analysis | one | `growth_endpoint_years` | the input's, or none for a fraction | | `endpoint_missing`, `zero_or_sign_crossing_base`, `non_finite`, `unit_unbound` | +| `rank` | analysis | one | `rank_what_is_present` | the input's, or none for an ordinal | per entity | `party_total`, `unit_unbound` | +| `aggregate` | analysis | one | `aggregate_skip_absent_grain_cells` | the input's | per period | `party_total`, `unit_unbound` | +| `filter` | analysis | one | `filter_row_value_predicates` | the input's | | | +| `compare` | analysis | `left`, `right` | `compare_intersect_periods` | the inputs' shared unit | | `unmatched_key`, `period_unmatched`, `unit_unbound` | +| `join` | analysis | `left`, `right` | `join_inner` | each side its own | | `unmatched_key`, `unit_unbound` | +| `source_step` | source pipeline | none | `source_pipeline_as_recorded` | as recorded | | | +| `choose_source` | mint choice | none | `facet_default_by_coverage` | as recorded | | | +| `sum_variables` | mint choice | none | `sum_family_members` | the summed variables' shared unit | | | +| `convert` | mint choice | none | `convert_by_rate_and_deflator` | converted | | `currency_unmapped`, `deflator_missing` | +| `continue_series` | mint choice | none | `continue_with_source_estimates` | as recorded | | | +| `select` | card selection | one version | `card_selection` | the version's | | | +| `change` | card derivation | one | `change_between_basis_periods` | the input's, or per cent | | | ## Descriptions diff --git a/python/descriptions/src/dfo_descriptions/schemas/operations.json b/python/descriptions/src/dfo_descriptions/schemas/operations.json index 4e31ff1..06fb175 100644 --- a/python/descriptions/src/dfo_descriptions/schemas/operations.json +++ b/python/descriptions/src/dfo_descriptions/schemas/operations.json @@ -17,66 +17,115 @@ }, { "op": "sum", + "verb": "sum_of", "kind": "analysis", "input": "roles", - "roles": ["left", "right"], + "roles": [ + "left", + "right" + ], + "arguments": { + "data": "left", + "other": "right", + "on": "Pairs each role of `data` with the role of `other` that holds the same entities, a role to a role, or names the same role on both sides as a list. Left out, each side is one series." + }, "policy": "sum_of_intersect_periods", "new_variable": true, "unit": { "rule": "same_as_input", "text": "The unit both sides share." }, + "output": { + "shape": "per_key_and_period", + "text": "One row for each paired key and period both sides hold, its value `data` plus `other`, its keys named as `data` names them." + }, "coverage": null, "left_out": [ + { + "reason": "unmatched_key", + "of": [ + "entities" + ], + "text": "Members of one side with no partner on the other, so their total is unknown." + }, { "reason": "period_unmatched", - "of": ["periods"], + "of": [ + "periods" + ], "text": "Periods one side reports and the other does not, so their total is unknown." }, { "reason": "unit_unbound", - "of": ["entity_periods"], + "of": [ + "entity_periods" + ], "text": "Values that declare no unit." } ], - "description": "Adds two single-entity series period by period, over the periods both report." + "description": "Adds two series period by period, over the periods both report. Given `on`, it pairs the members of `data` and `other` by role and adds each pair, leaving out a member with no partner." }, { "op": "quotient", + "verb": "quotient_of", "kind": "analysis", "input": "roles", - "roles": ["numerator", "denominator"], + "roles": [ + "numerator", + "denominator" + ], + "arguments": { + "data": "numerator", + "other": "denominator", + "on": "Pairs each role of `data` with the role of `other` that holds the same entities, a role to a role, or names the same role on both sides as a list." + }, "policy": "quotient_of_intersect_periods", "new_variable": true, "unit": { "rule": "composed", "text": "The numerator's unit per the denominator's." }, + "output": { + "shape": "per_key_and_period", + "text": "One row for each numerator key and period the denominator also holds, its value `data` divided by `other`." + }, "coverage": "period_coverage", "left_out": [ { "reason": "unmatched_key", - "of": ["entities"], + "of": [ + "entities" + ], "text": "Numerator entities with no denominator." }, { "reason": "period_unmatched", - "of": ["entities", "entity_periods"], + "of": [ + "entities", + "entity_periods" + ], "text": "Entities that share no period with their denominator, or values in periods the other side lacks." }, { "reason": "zero_denominator", - "of": ["entities", "entity_periods"], + "of": [ + "entities", + "entity_periods" + ], "text": "Entities, or values, whose denominator sums to zero." }, { "reason": "unit_unbound", - "of": ["entity_periods"], + "of": [ + "entity_periods" + ], "text": "Values that declare no unit." }, { "reason": "party_total", - "of": ["pooled_entities"], + "of": [ + "pooled_entities" + ], "text": "Flow parties of a pooled role that total other parties of it, left out so nothing counts twice; one entry per pooled role, counting its distinct parties across the step's inputs." } ], @@ -84,30 +133,58 @@ }, { "op": "share", + "verb": "share_of", "kind": "analysis", "input": "roles", - "roles": ["numerator", "denominator"], + "roles": [ + "numerator", + "denominator" + ], + "arguments": { + "data": "numerator", + "other": "denominator", + "on": "Pairs each role of `data` with the role of `other` that holds the same entities, a role to a role, or names the same role on both sides as a list. With no `other`, each member of `by` is divided by the total across every member of `by` in the same period." + }, "policy": "share_of_intersect_periods", "new_variable": true, "unit": { "rule": "percent", - "text": "Per cent." + "ref": "Percent", + "text": "Per cent, under the unit `Percent`." + }, + "output": { + "shape": "per_key_and_period", + "text": "One row for each key and period, its value 100 times `data` divided by `other`." }, "coverage": "period_coverage", "left_out": [ + { + "reason": "unmatched_key", + "of": [ + "entities" + ], + "text": "Members of one side with no partner on the other, so their share is unknown." + }, { "reason": "period_unmatched", - "of": ["periods", "entity_periods"], + "of": [ + "periods", + "entity_periods" + ], "text": "Periods, or values, one side reports and the other does not." }, { "reason": "unit_unbound", - "of": ["entity_periods"], + "of": [ + "entity_periods" + ], "text": "Values that declare no unit." }, { "reason": "party_total", - "of": ["pooled_entities"], + "of": [ + "pooled_entities" + ], "text": "Flow parties of a pooled role that total other parties of it, left out so nothing counts twice; one entry per pooled role, counting its distinct parties across the step's inputs." } ], @@ -115,6 +192,7 @@ }, { "op": "growth", + "verb": "growth", "kind": "analysis", "input": "single", "roles": [], @@ -122,28 +200,40 @@ "new_variable": false, "unit": { "rule": "same_as_input_or_dimensionless", - "text": "The input's unit for an absolute change, a dimensionless ratio for a relative one." + "text": "The input's unit for an absolute change; none for a relative one, whose value is a fraction." + }, + "output": { + "shape": "per_member_over_window", + "text": "One row for each member holding a value at both ends of the window, its period the window as a span such as `2018/2022`, its value the change: a fraction for a relative change, 0.25 for 25 per cent, and an amount in the input's unit for an absolute one." }, "coverage": null, "left_out": [ { "reason": "endpoint_missing", - "of": ["entities"], + "of": [ + "entities" + ], "text": "Entities with no value in the start or the end period." }, { "reason": "zero_or_sign_crossing_base", - "of": ["entities"], + "of": [ + "entities" + ], "text": "Entities whose base is zero or changes sign, so a relative change is undefined." }, { "reason": "non_finite", - "of": ["entities"], + "of": [ + "entities" + ], "text": "Entities whose change overflows to a non-finite value." }, { "reason": "unit_unbound", - "of": ["entity_periods"], + "of": [ + "entity_periods" + ], "text": "Values that declare no unit." } ], @@ -151,6 +241,7 @@ }, { "op": "rank", + "verb": "rank", "kind": "analysis", "input": "single", "roles": [], @@ -160,16 +251,24 @@ "rule": "same_as_input_or_none", "text": "The input's unit; none for a per-period ranking without a limit, whose values are rank positions." }, + "output": { + "shape": "ranked_members", + "text": "One row for each ranked member, or each member and period for a ranking per period, its value the measured value, or the rank position for a ranking per period without a limit." + }, "coverage": "entity_coverage", "left_out": [ { "reason": "party_total", - "of": ["pooled_entities"], + "of": [ + "pooled_entities" + ], "text": "Flow parties of a pooled role that total other parties of it, left out so nothing counts twice; one entry per pooled role, counting its distinct parties across the step's inputs." }, { "reason": "unit_unbound", - "of": ["entity_periods"], + "of": [ + "entity_periods" + ], "text": "Values that declare no unit." } ], @@ -177,6 +276,7 @@ }, { "op": "aggregate", + "verb": "aggregate", "kind": "analysis", "input": "single", "roles": [], @@ -186,16 +286,24 @@ "rule": "same_as_input", "text": "The input's unit." }, + "output": { + "shape": "per_key_and_period", + "text": "One row for each key and period, its value the reduction of the rows it pools." + }, "coverage": "period_coverage", "left_out": [ { "reason": "party_total", - "of": ["pooled_entities"], + "of": [ + "pooled_entities" + ], "text": "Flow parties of a pooled role that total other parties of it, left out so nothing counts twice; one entry per pooled role, counting its distinct parties across the step's inputs." }, { "reason": "unit_unbound", - "of": ["entity_periods"], + "of": [ + "entity_periods" + ], "text": "Values that declare no unit." } ], @@ -203,6 +311,7 @@ }, { "op": "filter", + "verb": "filter", "kind": "analysis", "input": "single", "roles": [], @@ -212,57 +321,102 @@ "rule": "same_as_input", "text": "The input's unit." }, + "output": { + "shape": "input_rows", + "text": "The input's rows that meet the predicates, unchanged." + }, "coverage": null, "left_out": [], "description": "Keeps the values that meet the caller's predicates. What the predicates drop is the caller's selection and stays in the parameters." }, { "op": "compare", + "verb": "compare", "kind": "analysis", "input": "roles", - "roles": ["left", "right"], + "roles": [ + "left", + "right" + ], + "arguments": { + "data": "right", + "other": "left", + "on": "Pairs each role of `data` with the role of `other` that holds the same entities, a role to a role, or names the same role on both sides as a list. Left out, each side is one series." + }, "policy": "compare_intersect_periods", "new_variable": true, "unit": { "rule": "same_as_input", "text": "The unit both sides share." }, + "output": { + "shape": "per_key_and_period", + "text": "One row for each paired key and period both sides hold, its value `data` minus `other`, its keys named as `data` names them. `data` fills the `right` role, since the step subtracts the left series from the right." + }, "coverage": null, "left_out": [ + { + "reason": "unmatched_key", + "of": [ + "entities" + ], + "text": "Members of one side with no partner on the other." + }, { "reason": "period_unmatched", - "of": ["periods"], + "of": [ + "periods" + ], "text": "Periods one side reports and the other does not." }, { "reason": "unit_unbound", - "of": ["entity_periods"], + "of": [ + "entity_periods" + ], "text": "Values that declare no unit." } ], - "description": "Subtracts the left series from the right for each period both report, and writes the difference under a variable of its own. The step records in `sides` the entities each side holds." + "description": "Subtracts the left series from the right for each period both report, so a call returns `data` minus `other`, and writes the difference under a variable of its own. Given `on`, it pairs the members of `data` and `other` by role and compares each pair, leaving out a member with no partner. The step records in `sides` the entities each side holds." }, { "op": "join", + "verb": "join", "kind": "analysis", "input": "roles", - "roles": ["left", "right"], + "roles": [ + "left", + "right" + ], + "arguments": { + "data": "left", + "other": "right", + "on": "Pairs each role of `data` with the role of `other` that holds the same entities, a role to a role, or names the same role on both sides as a list. Left out, the roles both readings hold under one name." + }, "policy": "join_inner", "new_variable": false, "unit": { "rule": "per_side", "text": "Each side keeps its own unit." }, + "output": { + "shape": "long_by_stat_var", + "text": "Two rows for each paired key and period both readings hold, one from each side, told apart by `stat_var`, each keeping its own value and unit, the key named as `data` names it." + }, "coverage": null, "left_out": [ { "reason": "unmatched_key", - "of": ["entity_periods"], + "of": [ + "entity_periods" + ], "text": "Keys and periods one side holds and the other does not." }, { "reason": "unit_unbound", - "of": ["entity_periods"], + "of": [ + "entity_periods" + ], "text": "Values that declare no unit." } ], @@ -328,12 +482,17 @@ "left_out": [ { "reason": "currency_unmapped", - "of": ["entities"], + "of": [ + "entities" + ], "text": "Entities no single national currency names, in a conversion into each entity's own currency." }, { "reason": "deflator_missing", - "of": ["entities", "entity_periods"], + "of": [ + "entities", + "entity_periods" + ], "text": "Entities with no deflator in the base year, or values in years the deflator table lacks." } ], diff --git a/python/descriptions/src/dfo_descriptions/schemas/operations.schema.json b/python/descriptions/src/dfo_descriptions/schemas/operations.schema.json index 8dbeb80..e6ec469 100644 --- a/python/descriptions/src/dfo_descriptions/schemas/operations.schema.json +++ b/python/descriptions/src/dfo_descriptions/schemas/operations.schema.json @@ -5,7 +5,9 @@ "description": "The operations a step record can name: for each, its kind, how it takes its inputs, its one fixed policy, whether it writes a new variable, the unit it produces, the coverage it records, and the data gaps it can leave out with what each counts.", "type": "object", "additionalProperties": false, - "required": ["operations"], + "required": [ + "operations" + ], "properties": { "operations": { "type": "array", @@ -35,13 +37,38 @@ "op": { "$ref": "steps.schema.json#/$defs/name" }, + "verb": { + "description": "The analysis function a client calls for this operation, such as `share_of` for `share`.", + "enum": [ + "aggregate", + "compare", + "filter", + "growth", + "join", + "quotient_of", + "rank", + "share_of", + "sum_of" + ] + }, "kind": { "description": "`retrieval` reads a version; `analysis` is one of the analysis engine's operations; `source_pipeline` is a step the source's pipeline applied before the DFO read the data; `mint_choice` is a choice the DFO made while minting a version; `card_selection` is what a card draws from its version; `card_derivation` is a value a card derives from what it draws.", - "enum": ["retrieval", "analysis", "source_pipeline", "mint_choice", "card_selection", "card_derivation"] + "enum": [ + "retrieval", + "analysis", + "source_pipeline", + "mint_choice", + "card_selection", + "card_derivation" + ] }, "input": { "description": "`single`: one `input`. `roles`: `inputs` keyed by the names in `roles`. `none`: the step takes no input, since it records a choice inside the version being made.", - "enum": ["single", "roles", "none"] + "enum": [ + "single", + "roles", + "none" + ] }, "roles": { "type": "array", @@ -50,6 +77,28 @@ "$ref": "steps.schema.json#/$defs/name" } }, + "arguments": { + "description": "How a client's call fills the roles of an analysis operation that takes inputs by role: `data`, its first reading, and `other`, its second, each name the role it fills, and `on` states how the call pairs the two readings' roles.", + "type": "object", + "additionalProperties": false, + "required": [ + "data", + "other", + "on" + ], + "properties": { + "data": { + "$ref": "steps.schema.json#/$defs/name" + }, + "other": { + "$ref": "steps.schema.json#/$defs/name" + }, + "on": { + "type": "string", + "minLength": 1 + } + } + }, "policy": { "$ref": "steps.schema.json#/$defs/name" }, @@ -60,10 +109,13 @@ "unit": { "type": "object", "additionalProperties": false, - "required": ["rule", "text"], + "required": [ + "rule", + "text" + ], "properties": { "rule": { - "description": "`as_recorded`: the unit the version holds. `same_as_input`: the input's unit, which every input must share. `composed`: the numerator's unit per the denominator's. `percent`: per cent. `same_as_input_or_dimensionless`: the input's unit for an absolute change, a dimensionless ratio for a relative one. `per_side`: each side keeps its own unit. `converted`: the unit converted into. `same_as_input_or_percent`: the input's unit for a difference, per cent for a percent change. `same_as_input_or_none`: the input's unit for a ranking of values, none for an ordinal ranking, whose values are rank positions.", + "description": "`as_recorded`: the unit the version holds. `same_as_input`: the input's unit, which every input must share. `composed`: the numerator's unit per the denominator's. `percent`: per cent, 100 times the ratio, under the unit `ref` names. `same_as_input_or_dimensionless`: the input's unit for an absolute change, none for a relative one, whose value is a fraction. `per_side`: each side keeps its own unit. `converted`: the unit converted into. `same_as_input_or_percent`: the input's unit for a difference, per cent for a percent change. `same_as_input_or_none`: the input's unit for a ranking of values, none for an ordinal ranking, whose values are rank positions.", "enum": [ "as_recorded", "same_as_input", @@ -76,6 +128,35 @@ "same_as_input_or_none" ] }, + "ref": { + "description": "The unit's graph reference, for a rule that names one unit: `Percent` for `percent`.", + "type": "string", + "minLength": 1 + }, + "text": { + "type": "string", + "minLength": 1 + } + } + }, + "output": { + "description": "The rows an analysis operation writes. `per_key_and_period`: one row for each key and period. `long_by_stat_var`: one row for each side at each key and period, told apart by `stat_var`. `per_member_over_window`: one row for each member, its period the window as a span. `ranked_members`: one row for each ranked member, or each member and period. `input_rows`: the input's rows that pass.", + "type": "object", + "additionalProperties": false, + "required": [ + "shape", + "text" + ], + "properties": { + "shape": { + "enum": [ + "per_key_and_period", + "long_by_stat_var", + "per_member_over_window", + "ranked_members", + "input_rows" + ] + }, "text": { "type": "string", "minLength": 1 @@ -84,7 +165,11 @@ }, "coverage": { "description": "`period_coverage`: how many entities each period's total covers. `entity_coverage`: how many periods each ranked entity holds. `null`: none.", - "enum": ["period_coverage", "entity_coverage", null] + "enum": [ + "period_coverage", + "entity_coverage", + null + ] }, "left_out": { "description": "The data gaps the operation can leave out. A step may name a reason this list lacks.", @@ -92,7 +177,11 @@ "items": { "type": "object", "additionalProperties": false, - "required": ["reason", "of", "text"], + "required": [ + "reason", + "of", + "text" + ], "properties": { "reason": { "$ref": "steps.schema.json#/$defs/name" @@ -103,7 +192,12 @@ "minItems": 1, "uniqueItems": true, "items": { - "enum": ["entities", "periods", "entity_periods", "pooled_entities"] + "enum": [ + "entities", + "periods", + "entity_periods", + "pooled_entities" + ] } }, "text": { @@ -117,7 +211,102 @@ "type": "string", "minLength": 1 } - } + }, + "allOf": [ + { + "if": { + "properties": { + "kind": { + "const": "analysis" + } + } + }, + "then": { + "required": [ + "verb", + "output" + ] + }, + "else": { + "not": { + "anyOf": [ + { + "required": [ + "verb" + ] + }, + { + "required": [ + "output" + ] + }, + { + "required": [ + "arguments" + ] + } + ] + } + } + }, + { + "if": { + "properties": { + "kind": { + "const": "analysis" + }, + "input": { + "const": "roles" + } + } + }, + "then": { + "required": [ + "arguments" + ] + }, + "else": { + "not": { + "required": [ + "arguments" + ] + } + } + }, + { + "if": { + "properties": { + "unit": { + "properties": { + "rule": { + "const": "percent" + } + } + } + } + }, + "then": { + "properties": { + "unit": { + "required": [ + "ref" + ] + } + } + }, + "else": { + "properties": { + "unit": { + "not": { + "required": [ + "ref" + ] + } + } + } + } + } + ] } } } diff --git a/python/spec-kit/CHANGELOG.md b/python/spec-kit/CHANGELOG.md index d2b6879..70e3735 100644 --- a/python/spec-kit/CHANGELOG.md +++ b/python/spec-kit/CHANGELOG.md @@ -64,6 +64,32 @@ and this package adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 differ from the published figure. Its params name the total (`total`, `total_label`) and the party classes it covers (`whole_of`: `official`, `private` or `residual`, comma-joined). +- Code `allowance_exhausted` in `registries/codes.json` and its bundled + mirror: a 429 refusal on `datasets.pin`, `presentation.shares` and + `presentation.write` once the caller has spent its daily allowance of + pins, shares or cards. Its problem document says `retryable: false`, and + its `Retry-After` header names the reset. +- Endpoint `datasets.analysis` in the registry schema, with its refusals in + `registries/codes.json` and its bundled mirror: 36 new codes at 422, + `rolling_populations_differ`, `several_members` and the 34 the analysis + engine serves, among them `unit_heterogeneous`, `cross_frame_unit_mismatch`, + `join_output_collision`, `rolling_anchor_unresolved`, `role_ambiguous`, + `compare_no_key_matched` and `sum_of_no_key_matched`; `timeout` at 504; and + 27 existing codes at the status each has on `datasets.mint`, + `datasets.snapshot` or the platform rows, among them `request_invalid` + (400), `snapshot_revoked` (410), `over_ceiling` (422), `upstream_error` + (502) and `service_unavailable` (503). +- Endpoint `presentation.shares` in the registry schema, with its refusals in + `registries/codes.json` and its bundled mirror: `write_token_required` (403) + for a replace or delete without a write token; `write_token_invalid` (403) + for one whose token is not the share's, or that names a share created + without a token; `share_not_replaceable` (409); `payload_too_large` (413) + for a body larger than the share routes accept; and `binding_invalid`, + `schema_invalid`, `constraint_violation`, `resource_exhausted` and + `request_invalid` (400), `not_found` and `frame_unavailable` (404), + `edit_conflict` (409), `internal_error` (500), `release_mismatch` and + `service_unavailable` (503), and `timeout` (504), at the statuses the + components routes give them. ### Changed @@ -95,6 +121,9 @@ and this package adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Code `upstream_error` maps to `graph.members` at 502, the status the members route answers when the read that checks whether the graph holds the node fails upstream, as `graph.node` answers for the same read. +- `pin_not_permitted` is retired in `registries/codes.json` and its bundled + mirror: the pin route admits every caller under its allowance, so nothing + raises it. Its `datasets.pin` mapping stays. - `starved_axis_binding_restored` is retired in `registries/codes.json` and its bundled mirror: Search no longer restores a starved constraint axis, so nothing raises it. diff --git a/python/spec-kit/src/dfo_spec_kit/registry/codes.json b/python/spec-kit/src/dfo_spec_kit/registry/codes.json index faf341b..6ec8b03 100644 --- a/python/spec-kit/src/dfo_spec_kit/registry/codes.json +++ b/python/spec-kit/src/dfo_spec_kit/registry/codes.json @@ -1,6 +1,32 @@ { "format_version": 1, "entries": [ + { + "code": "allowance_exhausted", + "classification": "refusal", + "definition": "The caller has spent its daily allowance for this kind of write, shares, cards or pins, so the write is refused until the allowance resets, which the response's Retry-After header names. The problem document says retryable false, so a client raises at once and waits for no reset.", + "owning_contract": "platform", + "owner": "platform", + "introduced_in": "v1", + "mappings": [ + { + "endpoint": "datasets.pin", + "channel": "problem_details", + "http_status": 429 + }, + { + "endpoint": "presentation.write", + "channel": "problem_details", + "http_status": 429 + }, + { + "endpoint": "presentation.shares", + "channel": "problem_details", + "http_status": 429 + } + ], + "lifecycle": "active" + }, { "code": "alternates_unevaluated", "classification": "warning", @@ -47,6 +73,11 @@ "endpoint": "datasets.files", "channel": "problem_details", "http_status": 410 + }, + { + "endpoint": "datasets.analysis", + "channel": "problem_details", + "http_status": 410 } ], "lifecycle": "active" @@ -186,6 +217,11 @@ "endpoint": "presentation.render", "channel": "problem_details", "http_status": 422 + }, + { + "endpoint": "presentation.shares", + "channel": "problem_details", + "http_status": 400 } ], "lifecycle": "active" @@ -288,6 +324,11 @@ "endpoint": "datasets.files", "channel": "problem_details", "http_status": 501 + }, + { + "endpoint": "datasets.analysis", + "channel": "problem_details", + "http_status": 501 } ], "lifecycle": "active" @@ -429,6 +470,11 @@ "endpoint": "datasets.refresh", "channel": "problem_details", "http_status": 422 + }, + { + "endpoint": "datasets.analysis", + "channel": "problem_details", + "http_status": 422 } ], "lifecycle": "active" @@ -475,6 +521,54 @@ ], "lifecycle": "active" }, + { + "code": "compare_no_key_matched", + "classification": "refusal", + "definition": "No member of a compare step's data side pairs with a member of its other side through the step's on mapping, so there is nothing to compare.", + "owning_contract": "datasets", + "owner": "platform", + "introduced_in": "v1", + "mappings": [ + { + "endpoint": "datasets.analysis", + "channel": "problem_details", + "http_status": 422 + } + ], + "lifecycle": "active" + }, + { + "code": "comparison_periods_disjoint", + "classification": "refusal", + "definition": "The two sides of a compare, quotient or sum_of step have no period in common.", + "owning_contract": "datasets", + "owner": "platform", + "introduced_in": "v1", + "mappings": [ + { + "endpoint": "datasets.analysis", + "channel": "problem_details", + "http_status": 422 + } + ], + "lifecycle": "active" + }, + { + "code": "composed_unit_sum_unsupported", + "classification": "refusal", + "definition": "An analysis step adds values whose unit is a quotient, and quotients added together are not a quotient in that unit.", + "owning_contract": "datasets", + "owner": "platform", + "introduced_in": "v1", + "mappings": [ + { + "endpoint": "datasets.analysis", + "channel": "problem_details", + "http_status": 422 + } + ], + "lifecycle": "active" + }, { "code": "conflicting_requested_options", "classification": "refusal", @@ -587,6 +681,11 @@ "endpoint": "presentation.render", "channel": "problem_details", "http_status": 422 + }, + { + "endpoint": "presentation.shares", + "channel": "problem_details", + "http_status": 400 } ], "lifecycle": "active" @@ -618,6 +717,70 @@ ], "lifecycle": "active" }, + { + "code": "coverage_insufficient", + "classification": "refusal", + "definition": "The grid an aggregate step groups over is too sparse: the share of expected cells with a value is below the floor the step requires.", + "owning_contract": "datasets", + "owner": "platform", + "introduced_in": "v1", + "mappings": [ + { + "endpoint": "datasets.analysis", + "channel": "problem_details", + "http_status": 422 + } + ], + "lifecycle": "active" + }, + { + "code": "cross_frame_facet_mismatch", + "classification": "refusal", + "definition": "The two sides of an analysis step hold one StatVar read under different values of a facet, whose values do not combine.", + "owning_contract": "datasets", + "owner": "platform", + "introduced_in": "v1", + "mappings": [ + { + "endpoint": "datasets.analysis", + "channel": "problem_details", + "http_status": 422 + } + ], + "lifecycle": "active" + }, + { + "code": "cross_frame_unit_mismatch", + "classification": "refusal", + "definition": "The two sides of an analysis step resolve to different units, and combining their values would be wrong.", + "owning_contract": "datasets", + "owner": "platform", + "introduced_in": "v1", + "mappings": [ + { + "endpoint": "datasets.analysis", + "channel": "problem_details", + "http_status": 422 + } + ], + "lifecycle": "active" + }, + { + "code": "cross_frame_unit_unbound", + "classification": "refusal", + "definition": "One side of an analysis step declares no unit while the other declares one, so the sides cannot be combined.", + "owning_contract": "datasets", + "owner": "platform", + "introduced_in": "v1", + "mappings": [ + { + "endpoint": "datasets.analysis", + "channel": "problem_details", + "http_status": 422 + } + ], + "lifecycle": "active" + }, { "code": "currency_unmapped_omitted", "classification": "warning", @@ -691,6 +854,11 @@ "endpoint": "datasets.refresh", "channel": "problem_details", "http_status": 422 + }, + { + "endpoint": "datasets.analysis", + "channel": "problem_details", + "http_status": 422 } ], "lifecycle": "active" @@ -742,6 +910,11 @@ "endpoint": "datasets.refresh", "channel": "problem_details", "http_status": 422 + }, + { + "endpoint": "datasets.analysis", + "channel": "problem_details", + "http_status": 422 } ], "lifecycle": "active" @@ -867,6 +1040,38 @@ ], "lifecycle": "active" }, + { + "code": "derived_input_ordinal", + "classification": "refusal", + "definition": "An analysis step reads a derived result whose values are rank positions, and a ratio or growth rate over a rank position has no meaning.", + "owning_contract": "datasets", + "owner": "platform", + "introduced_in": "v1", + "mappings": [ + { + "endpoint": "datasets.analysis", + "channel": "problem_details", + "http_status": 422 + } + ], + "lifecycle": "active" + }, + { + "code": "derived_input_unusable", + "classification": "refusal", + "definition": "An analysis step reads a derived result whose rows hold spans of periods, which a growth step cannot window over.", + "owning_contract": "datasets", + "owner": "platform", + "introduced_in": "v1", + "mappings": [ + { + "endpoint": "datasets.analysis", + "channel": "problem_details", + "http_status": 422 + } + ], + "lifecycle": "active" + }, { "code": "direction_discarded", "classification": "warning", @@ -943,6 +1148,11 @@ "endpoint": "presentation.render", "channel": "problem_details", "http_status": 409 + }, + { + "endpoint": "presentation.shares", + "channel": "problem_details", + "http_status": 409 } ], "lifecycle": "active" @@ -1285,6 +1495,11 @@ "endpoint": "datasets.refresh", "channel": "problem_details", "http_status": 422 + }, + { + "endpoint": "datasets.analysis", + "channel": "problem_details", + "http_status": 422 } ], "lifecycle": "active" @@ -1340,6 +1555,11 @@ "endpoint": "datasets.refresh", "channel": "problem_details", "http_status": 422 + }, + { + "endpoint": "datasets.analysis", + "channel": "problem_details", + "http_status": 422 } ], "lifecycle": "active" @@ -1371,6 +1591,22 @@ ], "lifecycle": "active" }, + { + "code": "facet_heterogeneous", + "classification": "refusal", + "definition": "An analysis step reads an input that carries more than one value of a facet, such as the measurement method, and the response lists the candidates.", + "owning_contract": "datasets", + "owner": "platform", + "introduced_in": "v1", + "mappings": [ + { + "endpoint": "datasets.analysis", + "channel": "problem_details", + "http_status": 422 + } + ], + "lifecycle": "active" + }, { "code": "facet_not_available", "classification": "refusal", @@ -1427,6 +1663,11 @@ "endpoint": "datasets.refresh", "channel": "problem_details", "http_status": 422 + }, + { + "endpoint": "datasets.analysis", + "channel": "problem_details", + "http_status": 422 } ], "lifecycle": "active" @@ -1467,6 +1708,38 @@ ], "lifecycle": "active" }, + { + "code": "filter_predicate_type_mismatch", + "classification": "refusal", + "definition": "A filter step names a predicate of a kind, or with a value of a type, that does not fit the column it applies to.", + "owning_contract": "datasets", + "owner": "platform", + "introduced_in": "v1", + "mappings": [ + { + "endpoint": "datasets.analysis", + "channel": "problem_details", + "http_status": 422 + } + ], + "lifecycle": "active" + }, + { + "code": "filter_unit_conversion_unsupported", + "classification": "refusal", + "definition": "A filter step puts a unit predicate on an input whose units are converted, which the step cannot match.", + "owning_contract": "datasets", + "owner": "platform", + "introduced_in": "v1", + "mappings": [ + { + "endpoint": "datasets.analysis", + "channel": "problem_details", + "http_status": 422 + } + ], + "lifecycle": "active" + }, { "code": "frame_not_refreshable", "classification": "refusal", @@ -1483,6 +1756,22 @@ ], "lifecycle": "active" }, + { + "code": "frame_too_large", + "classification": "refusal", + "definition": "The result of an analysis step is too large to store, so the step is refused and nothing is stored.", + "owning_contract": "datasets", + "owner": "platform", + "introduced_in": "v1", + "mappings": [ + { + "endpoint": "datasets.analysis", + "channel": "problem_details", + "http_status": 422 + } + ], + "lifecycle": "active" + }, { "code": "frame_unavailable", "classification": "refusal", @@ -1500,6 +1789,27 @@ "endpoint": "presentation.render", "channel": "problem_details", "http_status": 409 + }, + { + "endpoint": "presentation.shares", + "channel": "problem_details", + "http_status": 404 + } + ], + "lifecycle": "active" + }, + { + "code": "growth_gap_year", + "classification": "refusal", + "definition": "No entity has a value in both endpoint years of a growth step, so the step has no growth to compute.", + "owning_contract": "datasets", + "owner": "platform", + "introduced_in": "v1", + "mappings": [ + { + "endpoint": "datasets.analysis", + "channel": "problem_details", + "http_status": 422 } ], "lifecycle": "active" @@ -1541,6 +1851,11 @@ "endpoint": "datasets.refresh", "channel": "problem_details", "http_status": 500 + }, + { + "endpoint": "datasets.analysis", + "channel": "problem_details", + "http_status": 500 } ], "lifecycle": "active" @@ -1607,6 +1922,11 @@ "endpoint": "datasets.refresh", "channel": "problem_details", "http_status": 500 + }, + { + "endpoint": "datasets.analysis", + "channel": "problem_details", + "http_status": 500 } ], "lifecycle": "active" @@ -1688,6 +2008,16 @@ "endpoint": "datasets.files", "channel": "problem_details", "http_status": 500 + }, + { + "endpoint": "datasets.analysis", + "channel": "problem_details", + "http_status": 500 + }, + { + "endpoint": "presentation.shares", + "channel": "problem_details", + "http_status": 500 } ], "lifecycle": "active" @@ -1734,6 +2064,38 @@ ], "lifecycle": "active" }, + { + "code": "join_no_common_key_columns", + "classification": "refusal", + "definition": "A join step names no key columns and the two sides share no role column to join on.", + "owning_contract": "datasets", + "owner": "platform", + "introduced_in": "v1", + "mappings": [ + { + "endpoint": "datasets.analysis", + "channel": "problem_details", + "http_status": 422 + } + ], + "lifecycle": "active" + }, + { + "code": "join_output_collision", + "classification": "refusal", + "definition": "The two sides of a join step have the same StatVar, unit and facets, so the rows a matched key emits cannot be told apart.", + "owning_contract": "datasets", + "owner": "platform", + "introduced_in": "v1", + "mappings": [ + { + "endpoint": "datasets.analysis", + "channel": "problem_details", + "http_status": 422 + } + ], + "lifecycle": "active" + }, { "code": "member_not_resolvable", "classification": "refusal", @@ -1766,6 +2128,11 @@ "endpoint": "datasets.refresh", "channel": "problem_details", "http_status": 422 + }, + { + "endpoint": "datasets.analysis", + "channel": "problem_details", + "http_status": 422 } ], "lifecycle": "active" @@ -1834,6 +2201,11 @@ "endpoint": "datasets.refresh", "channel": "problem_details", "http_status": 500 + }, + { + "endpoint": "datasets.analysis", + "channel": "problem_details", + "http_status": 500 } ], "lifecycle": "active" @@ -1893,6 +2265,22 @@ ], "lifecycle": "active" }, + { + "code": "mixed_time_grain", + "classification": "refusal", + "definition": "An input frame holds periods of more than one grain, or a mix of points and spans, so no analysis step can read it, and reading it again gives the same periods.", + "owning_contract": "datasets", + "owner": "platform", + "introduced_in": "v1", + "mappings": [ + { + "endpoint": "datasets.analysis", + "channel": "problem_details", + "http_status": 422 + } + ], + "lifecycle": "active" + }, { "code": "multi_recipient_truncated", "classification": "warning", @@ -2057,6 +2445,22 @@ ], "lifecycle": "active" }, + { + "code": "non_finite_result", + "classification": "refusal", + "definition": "An analysis step overflows to a value that is not finite, so repeating the step with the same input reaches the same result.", + "owning_contract": "datasets", + "owner": "platform", + "introduced_in": "v1", + "mappings": [ + { + "endpoint": "datasets.analysis", + "channel": "problem_details", + "http_status": 422 + } + ], + "lifecycle": "active" + }, { "code": "not_found", "classification": "refusal", @@ -2079,6 +2483,11 @@ "endpoint": "presentation.render", "channel": "problem_details", "http_status": 404 + }, + { + "endpoint": "presentation.shares", + "channel": "problem_details", + "http_status": 404 } ], "lifecycle": "active" @@ -2436,6 +2845,22 @@ ], "lifecycle": "active" }, + { + "code": "op_spec_invalid", + "classification": "refusal", + "definition": "The recipe holds an analysis step whose op-spec is not valid, such as an unknown field, a missing argument or a value out of range.", + "owning_contract": "datasets", + "owner": "platform", + "introduced_in": "v1", + "mappings": [ + { + "endpoint": "datasets.analysis", + "channel": "problem_details", + "http_status": 422 + } + ], + "lifecycle": "active" + }, { "code": "open_role_unavailable", "classification": "refusal", @@ -2487,6 +2912,22 @@ ], "lifecycle": "active" }, + { + "code": "operation_uncovered", + "classification": "refusal", + "definition": "An aggregate step names an aggregation the analysis does not support.", + "owning_contract": "datasets", + "owner": "platform", + "introduced_in": "v1", + "mappings": [ + { + "endpoint": "datasets.analysis", + "channel": "problem_details", + "http_status": 422 + } + ], + "lifecycle": "active" + }, { "code": "option_coverage_probe_failed", "classification": "warning", @@ -2612,6 +3053,11 @@ "endpoint": "datasets.refresh", "channel": "problem_details", "http_status": 422 + }, + { + "endpoint": "datasets.analysis", + "channel": "problem_details", + "http_status": 422 } ], "lifecycle": "active" @@ -2665,6 +3111,22 @@ ], "lifecycle": "active" }, + { + "code": "payload_too_large", + "classification": "refusal", + "definition": "A share's request body is larger than the share routes accept.", + "owning_contract": "presentation", + "owner": "platform", + "introduced_in": "v1", + "mappings": [ + { + "endpoint": "presentation.shares", + "channel": "problem_details", + "http_status": 413 + } + ], + "lifecycle": "active" + }, { "code": "pin_not_permitted", "classification": "refusal", @@ -2679,7 +3141,7 @@ "http_status": 403 } ], - "lifecycle": "active" + "lifecycle": "retired" }, { "code": "pivot_not_homogeneous", @@ -2784,6 +3246,22 @@ ], "lifecycle": "active" }, + { + "code": "place_levels_mixed", + "classification": "refusal", + "definition": "A sum step pools parties whose totals contain one another, such as a region and its countries, which would count members twice.", + "owning_contract": "datasets", + "owner": "platform", + "introduced_in": "v1", + "mappings": [ + { + "endpoint": "datasets.analysis", + "channel": "problem_details", + "http_status": 422 + } + ], + "lifecycle": "active" + }, { "code": "place_scope_defaulted", "classification": "warning", @@ -2987,6 +3465,54 @@ ], "lifecycle": "active" }, + { + "code": "quotient_of_no_key_matched", + "classification": "refusal", + "definition": "No key of a quotient step's numerator matches a key of its denominator, so no quotient can be computed.", + "owning_contract": "datasets", + "owner": "platform", + "introduced_in": "v1", + "mappings": [ + { + "endpoint": "datasets.analysis", + "channel": "problem_details", + "http_status": 422 + } + ], + "lifecycle": "active" + }, + { + "code": "quotient_of_side_unit_unsupported", + "classification": "refusal", + "definition": "A side of a quotient step cannot be a part of the result's unit: it is a share or growth rate, already a composed unit, or a sum_of result with no unit.", + "owning_contract": "datasets", + "owner": "platform", + "introduced_in": "v1", + "mappings": [ + { + "endpoint": "datasets.analysis", + "channel": "problem_details", + "http_status": 422 + } + ], + "lifecycle": "active" + }, + { + "code": "quotient_of_zero_denominator", + "classification": "refusal", + "definition": "The denominator of a quotient step sums to zero in every matched cell, so the step has no quotient to return.", + "owning_contract": "datasets", + "owner": "platform", + "introduced_in": "v1", + "mappings": [ + { + "endpoint": "datasets.analysis", + "channel": "problem_details", + "http_status": 422 + } + ], + "lifecycle": "active" + }, { "code": "rate_coverage_gap", "classification": "refusal", @@ -3030,6 +3556,11 @@ "endpoint": "datasets.refresh", "channel": "problem_details", "http_status": 422 + }, + { + "endpoint": "datasets.analysis", + "channel": "problem_details", + "http_status": 422 } ], "lifecycle": "active" @@ -3085,6 +3616,11 @@ "endpoint": "datasets.refresh", "channel": "problem_details", "http_status": 422 + }, + { + "endpoint": "datasets.analysis", + "channel": "problem_details", + "http_status": 422 } ], "lifecycle": "active" @@ -3101,6 +3637,11 @@ "endpoint": "datasets.recipe", "channel": "problem_details", "http_status": 404 + }, + { + "endpoint": "datasets.analysis", + "channel": "problem_details", + "http_status": 404 } ], "lifecycle": "active" @@ -3162,6 +3703,11 @@ "endpoint": "presentation.render", "channel": "problem_details", "http_status": 409 + }, + { + "endpoint": "presentation.shares", + "channel": "problem_details", + "http_status": 503 } ], "lifecycle": "active" @@ -3191,7 +3737,12 @@ "introduced_in": "v1", "mappings": [ { - "endpoint": "datasets.refresh", + "endpoint": "datasets.refresh", + "channel": "problem_details", + "http_status": 422 + }, + { + "endpoint": "datasets.analysis", "channel": "problem_details", "http_status": 422 } @@ -3328,6 +3879,16 @@ "endpoint": "datasets.snapshot", "channel": "problem_details", "http_status": 400 + }, + { + "endpoint": "datasets.analysis", + "channel": "problem_details", + "http_status": 400 + }, + { + "endpoint": "presentation.shares", + "channel": "problem_details", + "http_status": 400 } ], "lifecycle": "active" @@ -3402,6 +3963,11 @@ "endpoint": "presentation.render", "channel": "problem_details", "http_status": 409 + }, + { + "endpoint": "presentation.shares", + "channel": "problem_details", + "http_status": 400 } ], "lifecycle": "active" @@ -3452,6 +4018,22 @@ ], "lifecycle": "active" }, + { + "code": "role_ambiguous", + "classification": "refusal", + "definition": "A column an analysis step names, to group, rank, join or filter on, is not one its input has a grain for.", + "owning_contract": "datasets", + "owner": "platform", + "introduced_in": "v1", + "mappings": [ + { + "endpoint": "datasets.analysis", + "channel": "problem_details", + "http_status": 422 + } + ], + "lifecycle": "active" + }, { "code": "role_declaration_unverified", "classification": "warning", @@ -3618,6 +4200,11 @@ "endpoint": "datasets.refresh", "channel": "problem_details", "http_status": 422 + }, + { + "endpoint": "datasets.analysis", + "channel": "problem_details", + "http_status": 422 } ], "lifecycle": "active" @@ -3640,6 +4227,54 @@ ], "lifecycle": "active" }, + { + "code": "rolling_anchor_unresolved", + "classification": "refusal", + "definition": "The latest period a rolling step counts from is not established, so the step cannot resolve its periods.", + "owning_contract": "datasets", + "owner": "platform", + "introduced_in": "v1", + "mappings": [ + { + "endpoint": "datasets.analysis", + "channel": "problem_details", + "http_status": 422 + } + ], + "lifecycle": "active" + }, + { + "code": "rolling_grain_unsupported", + "classification": "refusal", + "definition": "A rolling step counts the latest period over data whose periods are not calendar years, which it does not support.", + "owning_contract": "datasets", + "owner": "platform", + "introduced_in": "v1", + "mappings": [ + { + "endpoint": "datasets.analysis", + "channel": "problem_details", + "http_status": 422 + } + ], + "lifecycle": "active" + }, + { + "code": "rolling_populations_differ", + "classification": "refusal", + "definition": "The rolling steps of one analysis recipe count the latest period over different populations of series, so the recipe is refused before it runs, whether or not the periods they would settle on agree.", + "owning_contract": "datasets", + "owner": "platform", + "introduced_in": "v1", + "mappings": [ + { + "endpoint": "datasets.analysis", + "channel": "problem_details", + "http_status": 422 + } + ], + "lifecycle": "active" + }, { "code": "rollup_not_summable", "classification": "refusal", @@ -3688,6 +4323,11 @@ "endpoint": "presentation.render", "channel": "problem_details", "http_status": 400 + }, + { + "endpoint": "presentation.shares", + "channel": "problem_details", + "http_status": 400 } ], "lifecycle": "active" @@ -3865,6 +4505,32 @@ "endpoint": "graph.documentation", "channel": "problem_details", "http_status": 503 + }, + { + "endpoint": "datasets.analysis", + "channel": "problem_details", + "http_status": 503 + }, + { + "endpoint": "presentation.shares", + "channel": "problem_details", + "http_status": 503 + } + ], + "lifecycle": "active" + }, + { + "code": "several_members", + "classification": "refusal", + "definition": "An analysis step takes one reading for each input, and an input names a dataset that holds several.", + "owning_contract": "datasets", + "owner": "platform", + "introduced_in": "v1", + "mappings": [ + { + "endpoint": "datasets.analysis", + "channel": "problem_details", + "http_status": 422 } ], "lifecycle": "active" @@ -3888,6 +4554,86 @@ ], "lifecycle": "active" }, + { + "code": "share_not_replaceable", + "classification": "refusal", + "definition": "A replace names a snapshot share, whose cards are fixed for good. Only a live share takes new cards.", + "owning_contract": "presentation", + "owner": "platform", + "introduced_in": "v1", + "mappings": [ + { + "endpoint": "presentation.shares", + "channel": "problem_details", + "http_status": 409 + } + ], + "lifecycle": "active" + }, + { + "code": "share_of_grain_mismatch", + "classification": "refusal", + "definition": "No key of a share step has a period its numerator and denominator both report, so there is no period to divide.", + "owning_contract": "datasets", + "owner": "platform", + "introduced_in": "v1", + "mappings": [ + { + "endpoint": "datasets.analysis", + "channel": "problem_details", + "http_status": 422 + } + ], + "lifecycle": "active" + }, + { + "code": "share_of_key_unknown", + "classification": "refusal", + "definition": "The denominator mapping of a share step covers only some of the numerator's key columns, which leaves the pairing of the others undefined.", + "owning_contract": "datasets", + "owner": "platform", + "introduced_in": "v1", + "mappings": [ + { + "endpoint": "datasets.analysis", + "channel": "problem_details", + "http_status": 422 + } + ], + "lifecycle": "active" + }, + { + "code": "share_of_key_unmatched", + "classification": "refusal", + "definition": "No key of a share step's numerator has a denominator group, so no share can be computed.", + "owning_contract": "datasets", + "owner": "platform", + "introduced_in": "v1", + "mappings": [ + { + "endpoint": "datasets.analysis", + "channel": "problem_details", + "http_status": 422 + } + ], + "lifecycle": "active" + }, + { + "code": "share_of_zero_denominator", + "classification": "refusal", + "definition": "The denominator of a share step sums to zero in a period, so the share is undefined.", + "owning_contract": "datasets", + "owner": "platform", + "introduced_in": "v1", + "mappings": [ + { + "endpoint": "datasets.analysis", + "channel": "problem_details", + "http_status": 422 + } + ], + "lifecycle": "active" + }, { "code": "skill_attachment_kind_unconfirmed", "classification": "warning", @@ -4309,6 +5055,11 @@ "endpoint": "datasets.description", "channel": "problem_details", "http_status": 404 + }, + { + "endpoint": "datasets.analysis", + "channel": "problem_details", + "http_status": 404 } ], "lifecycle": "active" @@ -4370,6 +5121,11 @@ "endpoint": "datasets.description", "channel": "problem_details", "http_status": 410 + }, + { + "endpoint": "datasets.analysis", + "channel": "problem_details", + "http_status": 410 } ], "lifecycle": "active" @@ -4537,6 +5293,11 @@ "endpoint": "datasets.refresh", "channel": "problem_details", "http_status": 409 + }, + { + "endpoint": "datasets.analysis", + "channel": "problem_details", + "http_status": 409 } ], "lifecycle": "active" @@ -4598,6 +5359,11 @@ "endpoint": "datasets.description", "channel": "problem_details", "http_status": 404 + }, + { + "endpoint": "datasets.analysis", + "channel": "problem_details", + "http_status": 404 } ], "lifecycle": "active" @@ -4641,6 +5407,22 @@ ], "lifecycle": "retired" }, + { + "code": "stat_var_unresolved", + "classification": "refusal", + "definition": "An analysis step needs one StatVar and its input holds several, or none the step can use. A composite input read with one series per StatVar is the common case.", + "owning_contract": "datasets", + "owner": "platform", + "introduced_in": "v1", + "mappings": [ + { + "endpoint": "datasets.analysis", + "channel": "problem_details", + "http_status": 422 + } + ], + "lifecycle": "active" + }, { "code": "stat_vars_summed", "classification": "warning", @@ -4668,6 +5450,22 @@ ], "lifecycle": "active" }, + { + "code": "sum_of_no_key_matched", + "classification": "refusal", + "definition": "No member of a sum_of step's data side pairs with a member of its other side through the step's on mapping, so there is nothing to add.", + "owning_contract": "datasets", + "owner": "platform", + "introduced_in": "v1", + "mappings": [ + { + "endpoint": "datasets.analysis", + "channel": "problem_details", + "http_status": 422 + } + ], + "lifecycle": "active" + }, { "code": "time_text_not_parsed", "classification": "warning", @@ -4785,6 +5583,16 @@ "endpoint": "datasets.refresh", "channel": "problem_details", "http_status": 504 + }, + { + "endpoint": "datasets.analysis", + "channel": "problem_details", + "http_status": 504 + }, + { + "endpoint": "presentation.shares", + "channel": "problem_details", + "http_status": 504 } ], "lifecycle": "active" @@ -4835,6 +5643,22 @@ ], "lifecycle": "active" }, + { + "code": "unit_heterogeneous", + "classification": "refusal", + "definition": "An analysis step reads an input that carries more than one unit, or a pinned unit the input does not declare, and the response lists the candidates to pin.", + "owning_contract": "datasets", + "owner": "platform", + "introduced_in": "v1", + "mappings": [ + { + "endpoint": "datasets.analysis", + "channel": "problem_details", + "http_status": 422 + } + ], + "lifecycle": "active" + }, { "code": "unit_not_resolved", "classification": "refusal", @@ -5040,6 +5864,11 @@ "endpoint": "graph.members", "channel": "problem_details", "http_status": 502 + }, + { + "endpoint": "datasets.analysis", + "channel": "problem_details", + "http_status": 502 } ], "lifecycle": "active" @@ -5081,6 +5910,11 @@ "endpoint": "datasets.refresh", "channel": "problem_details", "http_status": 503 + }, + { + "endpoint": "datasets.analysis", + "channel": "problem_details", + "http_status": 503 } ], "lifecycle": "active" @@ -5208,6 +6042,38 @@ } ], "lifecycle": "active" + }, + { + "code": "write_token_invalid", + "classification": "refusal", + "definition": "A replace or delete of a share carries a write token other than the share's, or names a share created without one, which no token can change.", + "owning_contract": "presentation", + "owner": "platform", + "introduced_in": "v1", + "mappings": [ + { + "endpoint": "presentation.shares", + "channel": "problem_details", + "http_status": 403 + } + ], + "lifecycle": "active" + }, + { + "code": "write_token_required", + "classification": "refusal", + "definition": "A replace or delete of a share carries no write token.", + "owning_contract": "presentation", + "owner": "platform", + "introduced_in": "v1", + "mappings": [ + { + "endpoint": "presentation.shares", + "channel": "problem_details", + "http_status": 403 + } + ], + "lifecycle": "active" } ] } diff --git a/registries/codes.json b/registries/codes.json index faf341b..6ec8b03 100644 --- a/registries/codes.json +++ b/registries/codes.json @@ -1,6 +1,32 @@ { "format_version": 1, "entries": [ + { + "code": "allowance_exhausted", + "classification": "refusal", + "definition": "The caller has spent its daily allowance for this kind of write, shares, cards or pins, so the write is refused until the allowance resets, which the response's Retry-After header names. The problem document says retryable false, so a client raises at once and waits for no reset.", + "owning_contract": "platform", + "owner": "platform", + "introduced_in": "v1", + "mappings": [ + { + "endpoint": "datasets.pin", + "channel": "problem_details", + "http_status": 429 + }, + { + "endpoint": "presentation.write", + "channel": "problem_details", + "http_status": 429 + }, + { + "endpoint": "presentation.shares", + "channel": "problem_details", + "http_status": 429 + } + ], + "lifecycle": "active" + }, { "code": "alternates_unevaluated", "classification": "warning", @@ -47,6 +73,11 @@ "endpoint": "datasets.files", "channel": "problem_details", "http_status": 410 + }, + { + "endpoint": "datasets.analysis", + "channel": "problem_details", + "http_status": 410 } ], "lifecycle": "active" @@ -186,6 +217,11 @@ "endpoint": "presentation.render", "channel": "problem_details", "http_status": 422 + }, + { + "endpoint": "presentation.shares", + "channel": "problem_details", + "http_status": 400 } ], "lifecycle": "active" @@ -288,6 +324,11 @@ "endpoint": "datasets.files", "channel": "problem_details", "http_status": 501 + }, + { + "endpoint": "datasets.analysis", + "channel": "problem_details", + "http_status": 501 } ], "lifecycle": "active" @@ -429,6 +470,11 @@ "endpoint": "datasets.refresh", "channel": "problem_details", "http_status": 422 + }, + { + "endpoint": "datasets.analysis", + "channel": "problem_details", + "http_status": 422 } ], "lifecycle": "active" @@ -475,6 +521,54 @@ ], "lifecycle": "active" }, + { + "code": "compare_no_key_matched", + "classification": "refusal", + "definition": "No member of a compare step's data side pairs with a member of its other side through the step's on mapping, so there is nothing to compare.", + "owning_contract": "datasets", + "owner": "platform", + "introduced_in": "v1", + "mappings": [ + { + "endpoint": "datasets.analysis", + "channel": "problem_details", + "http_status": 422 + } + ], + "lifecycle": "active" + }, + { + "code": "comparison_periods_disjoint", + "classification": "refusal", + "definition": "The two sides of a compare, quotient or sum_of step have no period in common.", + "owning_contract": "datasets", + "owner": "platform", + "introduced_in": "v1", + "mappings": [ + { + "endpoint": "datasets.analysis", + "channel": "problem_details", + "http_status": 422 + } + ], + "lifecycle": "active" + }, + { + "code": "composed_unit_sum_unsupported", + "classification": "refusal", + "definition": "An analysis step adds values whose unit is a quotient, and quotients added together are not a quotient in that unit.", + "owning_contract": "datasets", + "owner": "platform", + "introduced_in": "v1", + "mappings": [ + { + "endpoint": "datasets.analysis", + "channel": "problem_details", + "http_status": 422 + } + ], + "lifecycle": "active" + }, { "code": "conflicting_requested_options", "classification": "refusal", @@ -587,6 +681,11 @@ "endpoint": "presentation.render", "channel": "problem_details", "http_status": 422 + }, + { + "endpoint": "presentation.shares", + "channel": "problem_details", + "http_status": 400 } ], "lifecycle": "active" @@ -618,6 +717,70 @@ ], "lifecycle": "active" }, + { + "code": "coverage_insufficient", + "classification": "refusal", + "definition": "The grid an aggregate step groups over is too sparse: the share of expected cells with a value is below the floor the step requires.", + "owning_contract": "datasets", + "owner": "platform", + "introduced_in": "v1", + "mappings": [ + { + "endpoint": "datasets.analysis", + "channel": "problem_details", + "http_status": 422 + } + ], + "lifecycle": "active" + }, + { + "code": "cross_frame_facet_mismatch", + "classification": "refusal", + "definition": "The two sides of an analysis step hold one StatVar read under different values of a facet, whose values do not combine.", + "owning_contract": "datasets", + "owner": "platform", + "introduced_in": "v1", + "mappings": [ + { + "endpoint": "datasets.analysis", + "channel": "problem_details", + "http_status": 422 + } + ], + "lifecycle": "active" + }, + { + "code": "cross_frame_unit_mismatch", + "classification": "refusal", + "definition": "The two sides of an analysis step resolve to different units, and combining their values would be wrong.", + "owning_contract": "datasets", + "owner": "platform", + "introduced_in": "v1", + "mappings": [ + { + "endpoint": "datasets.analysis", + "channel": "problem_details", + "http_status": 422 + } + ], + "lifecycle": "active" + }, + { + "code": "cross_frame_unit_unbound", + "classification": "refusal", + "definition": "One side of an analysis step declares no unit while the other declares one, so the sides cannot be combined.", + "owning_contract": "datasets", + "owner": "platform", + "introduced_in": "v1", + "mappings": [ + { + "endpoint": "datasets.analysis", + "channel": "problem_details", + "http_status": 422 + } + ], + "lifecycle": "active" + }, { "code": "currency_unmapped_omitted", "classification": "warning", @@ -691,6 +854,11 @@ "endpoint": "datasets.refresh", "channel": "problem_details", "http_status": 422 + }, + { + "endpoint": "datasets.analysis", + "channel": "problem_details", + "http_status": 422 } ], "lifecycle": "active" @@ -742,6 +910,11 @@ "endpoint": "datasets.refresh", "channel": "problem_details", "http_status": 422 + }, + { + "endpoint": "datasets.analysis", + "channel": "problem_details", + "http_status": 422 } ], "lifecycle": "active" @@ -867,6 +1040,38 @@ ], "lifecycle": "active" }, + { + "code": "derived_input_ordinal", + "classification": "refusal", + "definition": "An analysis step reads a derived result whose values are rank positions, and a ratio or growth rate over a rank position has no meaning.", + "owning_contract": "datasets", + "owner": "platform", + "introduced_in": "v1", + "mappings": [ + { + "endpoint": "datasets.analysis", + "channel": "problem_details", + "http_status": 422 + } + ], + "lifecycle": "active" + }, + { + "code": "derived_input_unusable", + "classification": "refusal", + "definition": "An analysis step reads a derived result whose rows hold spans of periods, which a growth step cannot window over.", + "owning_contract": "datasets", + "owner": "platform", + "introduced_in": "v1", + "mappings": [ + { + "endpoint": "datasets.analysis", + "channel": "problem_details", + "http_status": 422 + } + ], + "lifecycle": "active" + }, { "code": "direction_discarded", "classification": "warning", @@ -943,6 +1148,11 @@ "endpoint": "presentation.render", "channel": "problem_details", "http_status": 409 + }, + { + "endpoint": "presentation.shares", + "channel": "problem_details", + "http_status": 409 } ], "lifecycle": "active" @@ -1285,6 +1495,11 @@ "endpoint": "datasets.refresh", "channel": "problem_details", "http_status": 422 + }, + { + "endpoint": "datasets.analysis", + "channel": "problem_details", + "http_status": 422 } ], "lifecycle": "active" @@ -1340,6 +1555,11 @@ "endpoint": "datasets.refresh", "channel": "problem_details", "http_status": 422 + }, + { + "endpoint": "datasets.analysis", + "channel": "problem_details", + "http_status": 422 } ], "lifecycle": "active" @@ -1371,6 +1591,22 @@ ], "lifecycle": "active" }, + { + "code": "facet_heterogeneous", + "classification": "refusal", + "definition": "An analysis step reads an input that carries more than one value of a facet, such as the measurement method, and the response lists the candidates.", + "owning_contract": "datasets", + "owner": "platform", + "introduced_in": "v1", + "mappings": [ + { + "endpoint": "datasets.analysis", + "channel": "problem_details", + "http_status": 422 + } + ], + "lifecycle": "active" + }, { "code": "facet_not_available", "classification": "refusal", @@ -1427,6 +1663,11 @@ "endpoint": "datasets.refresh", "channel": "problem_details", "http_status": 422 + }, + { + "endpoint": "datasets.analysis", + "channel": "problem_details", + "http_status": 422 } ], "lifecycle": "active" @@ -1467,6 +1708,38 @@ ], "lifecycle": "active" }, + { + "code": "filter_predicate_type_mismatch", + "classification": "refusal", + "definition": "A filter step names a predicate of a kind, or with a value of a type, that does not fit the column it applies to.", + "owning_contract": "datasets", + "owner": "platform", + "introduced_in": "v1", + "mappings": [ + { + "endpoint": "datasets.analysis", + "channel": "problem_details", + "http_status": 422 + } + ], + "lifecycle": "active" + }, + { + "code": "filter_unit_conversion_unsupported", + "classification": "refusal", + "definition": "A filter step puts a unit predicate on an input whose units are converted, which the step cannot match.", + "owning_contract": "datasets", + "owner": "platform", + "introduced_in": "v1", + "mappings": [ + { + "endpoint": "datasets.analysis", + "channel": "problem_details", + "http_status": 422 + } + ], + "lifecycle": "active" + }, { "code": "frame_not_refreshable", "classification": "refusal", @@ -1483,6 +1756,22 @@ ], "lifecycle": "active" }, + { + "code": "frame_too_large", + "classification": "refusal", + "definition": "The result of an analysis step is too large to store, so the step is refused and nothing is stored.", + "owning_contract": "datasets", + "owner": "platform", + "introduced_in": "v1", + "mappings": [ + { + "endpoint": "datasets.analysis", + "channel": "problem_details", + "http_status": 422 + } + ], + "lifecycle": "active" + }, { "code": "frame_unavailable", "classification": "refusal", @@ -1500,6 +1789,27 @@ "endpoint": "presentation.render", "channel": "problem_details", "http_status": 409 + }, + { + "endpoint": "presentation.shares", + "channel": "problem_details", + "http_status": 404 + } + ], + "lifecycle": "active" + }, + { + "code": "growth_gap_year", + "classification": "refusal", + "definition": "No entity has a value in both endpoint years of a growth step, so the step has no growth to compute.", + "owning_contract": "datasets", + "owner": "platform", + "introduced_in": "v1", + "mappings": [ + { + "endpoint": "datasets.analysis", + "channel": "problem_details", + "http_status": 422 } ], "lifecycle": "active" @@ -1541,6 +1851,11 @@ "endpoint": "datasets.refresh", "channel": "problem_details", "http_status": 500 + }, + { + "endpoint": "datasets.analysis", + "channel": "problem_details", + "http_status": 500 } ], "lifecycle": "active" @@ -1607,6 +1922,11 @@ "endpoint": "datasets.refresh", "channel": "problem_details", "http_status": 500 + }, + { + "endpoint": "datasets.analysis", + "channel": "problem_details", + "http_status": 500 } ], "lifecycle": "active" @@ -1688,6 +2008,16 @@ "endpoint": "datasets.files", "channel": "problem_details", "http_status": 500 + }, + { + "endpoint": "datasets.analysis", + "channel": "problem_details", + "http_status": 500 + }, + { + "endpoint": "presentation.shares", + "channel": "problem_details", + "http_status": 500 } ], "lifecycle": "active" @@ -1734,6 +2064,38 @@ ], "lifecycle": "active" }, + { + "code": "join_no_common_key_columns", + "classification": "refusal", + "definition": "A join step names no key columns and the two sides share no role column to join on.", + "owning_contract": "datasets", + "owner": "platform", + "introduced_in": "v1", + "mappings": [ + { + "endpoint": "datasets.analysis", + "channel": "problem_details", + "http_status": 422 + } + ], + "lifecycle": "active" + }, + { + "code": "join_output_collision", + "classification": "refusal", + "definition": "The two sides of a join step have the same StatVar, unit and facets, so the rows a matched key emits cannot be told apart.", + "owning_contract": "datasets", + "owner": "platform", + "introduced_in": "v1", + "mappings": [ + { + "endpoint": "datasets.analysis", + "channel": "problem_details", + "http_status": 422 + } + ], + "lifecycle": "active" + }, { "code": "member_not_resolvable", "classification": "refusal", @@ -1766,6 +2128,11 @@ "endpoint": "datasets.refresh", "channel": "problem_details", "http_status": 422 + }, + { + "endpoint": "datasets.analysis", + "channel": "problem_details", + "http_status": 422 } ], "lifecycle": "active" @@ -1834,6 +2201,11 @@ "endpoint": "datasets.refresh", "channel": "problem_details", "http_status": 500 + }, + { + "endpoint": "datasets.analysis", + "channel": "problem_details", + "http_status": 500 } ], "lifecycle": "active" @@ -1893,6 +2265,22 @@ ], "lifecycle": "active" }, + { + "code": "mixed_time_grain", + "classification": "refusal", + "definition": "An input frame holds periods of more than one grain, or a mix of points and spans, so no analysis step can read it, and reading it again gives the same periods.", + "owning_contract": "datasets", + "owner": "platform", + "introduced_in": "v1", + "mappings": [ + { + "endpoint": "datasets.analysis", + "channel": "problem_details", + "http_status": 422 + } + ], + "lifecycle": "active" + }, { "code": "multi_recipient_truncated", "classification": "warning", @@ -2057,6 +2445,22 @@ ], "lifecycle": "active" }, + { + "code": "non_finite_result", + "classification": "refusal", + "definition": "An analysis step overflows to a value that is not finite, so repeating the step with the same input reaches the same result.", + "owning_contract": "datasets", + "owner": "platform", + "introduced_in": "v1", + "mappings": [ + { + "endpoint": "datasets.analysis", + "channel": "problem_details", + "http_status": 422 + } + ], + "lifecycle": "active" + }, { "code": "not_found", "classification": "refusal", @@ -2079,6 +2483,11 @@ "endpoint": "presentation.render", "channel": "problem_details", "http_status": 404 + }, + { + "endpoint": "presentation.shares", + "channel": "problem_details", + "http_status": 404 } ], "lifecycle": "active" @@ -2436,6 +2845,22 @@ ], "lifecycle": "active" }, + { + "code": "op_spec_invalid", + "classification": "refusal", + "definition": "The recipe holds an analysis step whose op-spec is not valid, such as an unknown field, a missing argument or a value out of range.", + "owning_contract": "datasets", + "owner": "platform", + "introduced_in": "v1", + "mappings": [ + { + "endpoint": "datasets.analysis", + "channel": "problem_details", + "http_status": 422 + } + ], + "lifecycle": "active" + }, { "code": "open_role_unavailable", "classification": "refusal", @@ -2487,6 +2912,22 @@ ], "lifecycle": "active" }, + { + "code": "operation_uncovered", + "classification": "refusal", + "definition": "An aggregate step names an aggregation the analysis does not support.", + "owning_contract": "datasets", + "owner": "platform", + "introduced_in": "v1", + "mappings": [ + { + "endpoint": "datasets.analysis", + "channel": "problem_details", + "http_status": 422 + } + ], + "lifecycle": "active" + }, { "code": "option_coverage_probe_failed", "classification": "warning", @@ -2612,6 +3053,11 @@ "endpoint": "datasets.refresh", "channel": "problem_details", "http_status": 422 + }, + { + "endpoint": "datasets.analysis", + "channel": "problem_details", + "http_status": 422 } ], "lifecycle": "active" @@ -2665,6 +3111,22 @@ ], "lifecycle": "active" }, + { + "code": "payload_too_large", + "classification": "refusal", + "definition": "A share's request body is larger than the share routes accept.", + "owning_contract": "presentation", + "owner": "platform", + "introduced_in": "v1", + "mappings": [ + { + "endpoint": "presentation.shares", + "channel": "problem_details", + "http_status": 413 + } + ], + "lifecycle": "active" + }, { "code": "pin_not_permitted", "classification": "refusal", @@ -2679,7 +3141,7 @@ "http_status": 403 } ], - "lifecycle": "active" + "lifecycle": "retired" }, { "code": "pivot_not_homogeneous", @@ -2784,6 +3246,22 @@ ], "lifecycle": "active" }, + { + "code": "place_levels_mixed", + "classification": "refusal", + "definition": "A sum step pools parties whose totals contain one another, such as a region and its countries, which would count members twice.", + "owning_contract": "datasets", + "owner": "platform", + "introduced_in": "v1", + "mappings": [ + { + "endpoint": "datasets.analysis", + "channel": "problem_details", + "http_status": 422 + } + ], + "lifecycle": "active" + }, { "code": "place_scope_defaulted", "classification": "warning", @@ -2987,6 +3465,54 @@ ], "lifecycle": "active" }, + { + "code": "quotient_of_no_key_matched", + "classification": "refusal", + "definition": "No key of a quotient step's numerator matches a key of its denominator, so no quotient can be computed.", + "owning_contract": "datasets", + "owner": "platform", + "introduced_in": "v1", + "mappings": [ + { + "endpoint": "datasets.analysis", + "channel": "problem_details", + "http_status": 422 + } + ], + "lifecycle": "active" + }, + { + "code": "quotient_of_side_unit_unsupported", + "classification": "refusal", + "definition": "A side of a quotient step cannot be a part of the result's unit: it is a share or growth rate, already a composed unit, or a sum_of result with no unit.", + "owning_contract": "datasets", + "owner": "platform", + "introduced_in": "v1", + "mappings": [ + { + "endpoint": "datasets.analysis", + "channel": "problem_details", + "http_status": 422 + } + ], + "lifecycle": "active" + }, + { + "code": "quotient_of_zero_denominator", + "classification": "refusal", + "definition": "The denominator of a quotient step sums to zero in every matched cell, so the step has no quotient to return.", + "owning_contract": "datasets", + "owner": "platform", + "introduced_in": "v1", + "mappings": [ + { + "endpoint": "datasets.analysis", + "channel": "problem_details", + "http_status": 422 + } + ], + "lifecycle": "active" + }, { "code": "rate_coverage_gap", "classification": "refusal", @@ -3030,6 +3556,11 @@ "endpoint": "datasets.refresh", "channel": "problem_details", "http_status": 422 + }, + { + "endpoint": "datasets.analysis", + "channel": "problem_details", + "http_status": 422 } ], "lifecycle": "active" @@ -3085,6 +3616,11 @@ "endpoint": "datasets.refresh", "channel": "problem_details", "http_status": 422 + }, + { + "endpoint": "datasets.analysis", + "channel": "problem_details", + "http_status": 422 } ], "lifecycle": "active" @@ -3101,6 +3637,11 @@ "endpoint": "datasets.recipe", "channel": "problem_details", "http_status": 404 + }, + { + "endpoint": "datasets.analysis", + "channel": "problem_details", + "http_status": 404 } ], "lifecycle": "active" @@ -3162,6 +3703,11 @@ "endpoint": "presentation.render", "channel": "problem_details", "http_status": 409 + }, + { + "endpoint": "presentation.shares", + "channel": "problem_details", + "http_status": 503 } ], "lifecycle": "active" @@ -3191,7 +3737,12 @@ "introduced_in": "v1", "mappings": [ { - "endpoint": "datasets.refresh", + "endpoint": "datasets.refresh", + "channel": "problem_details", + "http_status": 422 + }, + { + "endpoint": "datasets.analysis", "channel": "problem_details", "http_status": 422 } @@ -3328,6 +3879,16 @@ "endpoint": "datasets.snapshot", "channel": "problem_details", "http_status": 400 + }, + { + "endpoint": "datasets.analysis", + "channel": "problem_details", + "http_status": 400 + }, + { + "endpoint": "presentation.shares", + "channel": "problem_details", + "http_status": 400 } ], "lifecycle": "active" @@ -3402,6 +3963,11 @@ "endpoint": "presentation.render", "channel": "problem_details", "http_status": 409 + }, + { + "endpoint": "presentation.shares", + "channel": "problem_details", + "http_status": 400 } ], "lifecycle": "active" @@ -3452,6 +4018,22 @@ ], "lifecycle": "active" }, + { + "code": "role_ambiguous", + "classification": "refusal", + "definition": "A column an analysis step names, to group, rank, join or filter on, is not one its input has a grain for.", + "owning_contract": "datasets", + "owner": "platform", + "introduced_in": "v1", + "mappings": [ + { + "endpoint": "datasets.analysis", + "channel": "problem_details", + "http_status": 422 + } + ], + "lifecycle": "active" + }, { "code": "role_declaration_unverified", "classification": "warning", @@ -3618,6 +4200,11 @@ "endpoint": "datasets.refresh", "channel": "problem_details", "http_status": 422 + }, + { + "endpoint": "datasets.analysis", + "channel": "problem_details", + "http_status": 422 } ], "lifecycle": "active" @@ -3640,6 +4227,54 @@ ], "lifecycle": "active" }, + { + "code": "rolling_anchor_unresolved", + "classification": "refusal", + "definition": "The latest period a rolling step counts from is not established, so the step cannot resolve its periods.", + "owning_contract": "datasets", + "owner": "platform", + "introduced_in": "v1", + "mappings": [ + { + "endpoint": "datasets.analysis", + "channel": "problem_details", + "http_status": 422 + } + ], + "lifecycle": "active" + }, + { + "code": "rolling_grain_unsupported", + "classification": "refusal", + "definition": "A rolling step counts the latest period over data whose periods are not calendar years, which it does not support.", + "owning_contract": "datasets", + "owner": "platform", + "introduced_in": "v1", + "mappings": [ + { + "endpoint": "datasets.analysis", + "channel": "problem_details", + "http_status": 422 + } + ], + "lifecycle": "active" + }, + { + "code": "rolling_populations_differ", + "classification": "refusal", + "definition": "The rolling steps of one analysis recipe count the latest period over different populations of series, so the recipe is refused before it runs, whether or not the periods they would settle on agree.", + "owning_contract": "datasets", + "owner": "platform", + "introduced_in": "v1", + "mappings": [ + { + "endpoint": "datasets.analysis", + "channel": "problem_details", + "http_status": 422 + } + ], + "lifecycle": "active" + }, { "code": "rollup_not_summable", "classification": "refusal", @@ -3688,6 +4323,11 @@ "endpoint": "presentation.render", "channel": "problem_details", "http_status": 400 + }, + { + "endpoint": "presentation.shares", + "channel": "problem_details", + "http_status": 400 } ], "lifecycle": "active" @@ -3865,6 +4505,32 @@ "endpoint": "graph.documentation", "channel": "problem_details", "http_status": 503 + }, + { + "endpoint": "datasets.analysis", + "channel": "problem_details", + "http_status": 503 + }, + { + "endpoint": "presentation.shares", + "channel": "problem_details", + "http_status": 503 + } + ], + "lifecycle": "active" + }, + { + "code": "several_members", + "classification": "refusal", + "definition": "An analysis step takes one reading for each input, and an input names a dataset that holds several.", + "owning_contract": "datasets", + "owner": "platform", + "introduced_in": "v1", + "mappings": [ + { + "endpoint": "datasets.analysis", + "channel": "problem_details", + "http_status": 422 } ], "lifecycle": "active" @@ -3888,6 +4554,86 @@ ], "lifecycle": "active" }, + { + "code": "share_not_replaceable", + "classification": "refusal", + "definition": "A replace names a snapshot share, whose cards are fixed for good. Only a live share takes new cards.", + "owning_contract": "presentation", + "owner": "platform", + "introduced_in": "v1", + "mappings": [ + { + "endpoint": "presentation.shares", + "channel": "problem_details", + "http_status": 409 + } + ], + "lifecycle": "active" + }, + { + "code": "share_of_grain_mismatch", + "classification": "refusal", + "definition": "No key of a share step has a period its numerator and denominator both report, so there is no period to divide.", + "owning_contract": "datasets", + "owner": "platform", + "introduced_in": "v1", + "mappings": [ + { + "endpoint": "datasets.analysis", + "channel": "problem_details", + "http_status": 422 + } + ], + "lifecycle": "active" + }, + { + "code": "share_of_key_unknown", + "classification": "refusal", + "definition": "The denominator mapping of a share step covers only some of the numerator's key columns, which leaves the pairing of the others undefined.", + "owning_contract": "datasets", + "owner": "platform", + "introduced_in": "v1", + "mappings": [ + { + "endpoint": "datasets.analysis", + "channel": "problem_details", + "http_status": 422 + } + ], + "lifecycle": "active" + }, + { + "code": "share_of_key_unmatched", + "classification": "refusal", + "definition": "No key of a share step's numerator has a denominator group, so no share can be computed.", + "owning_contract": "datasets", + "owner": "platform", + "introduced_in": "v1", + "mappings": [ + { + "endpoint": "datasets.analysis", + "channel": "problem_details", + "http_status": 422 + } + ], + "lifecycle": "active" + }, + { + "code": "share_of_zero_denominator", + "classification": "refusal", + "definition": "The denominator of a share step sums to zero in a period, so the share is undefined.", + "owning_contract": "datasets", + "owner": "platform", + "introduced_in": "v1", + "mappings": [ + { + "endpoint": "datasets.analysis", + "channel": "problem_details", + "http_status": 422 + } + ], + "lifecycle": "active" + }, { "code": "skill_attachment_kind_unconfirmed", "classification": "warning", @@ -4309,6 +5055,11 @@ "endpoint": "datasets.description", "channel": "problem_details", "http_status": 404 + }, + { + "endpoint": "datasets.analysis", + "channel": "problem_details", + "http_status": 404 } ], "lifecycle": "active" @@ -4370,6 +5121,11 @@ "endpoint": "datasets.description", "channel": "problem_details", "http_status": 410 + }, + { + "endpoint": "datasets.analysis", + "channel": "problem_details", + "http_status": 410 } ], "lifecycle": "active" @@ -4537,6 +5293,11 @@ "endpoint": "datasets.refresh", "channel": "problem_details", "http_status": 409 + }, + { + "endpoint": "datasets.analysis", + "channel": "problem_details", + "http_status": 409 } ], "lifecycle": "active" @@ -4598,6 +5359,11 @@ "endpoint": "datasets.description", "channel": "problem_details", "http_status": 404 + }, + { + "endpoint": "datasets.analysis", + "channel": "problem_details", + "http_status": 404 } ], "lifecycle": "active" @@ -4641,6 +5407,22 @@ ], "lifecycle": "retired" }, + { + "code": "stat_var_unresolved", + "classification": "refusal", + "definition": "An analysis step needs one StatVar and its input holds several, or none the step can use. A composite input read with one series per StatVar is the common case.", + "owning_contract": "datasets", + "owner": "platform", + "introduced_in": "v1", + "mappings": [ + { + "endpoint": "datasets.analysis", + "channel": "problem_details", + "http_status": 422 + } + ], + "lifecycle": "active" + }, { "code": "stat_vars_summed", "classification": "warning", @@ -4668,6 +5450,22 @@ ], "lifecycle": "active" }, + { + "code": "sum_of_no_key_matched", + "classification": "refusal", + "definition": "No member of a sum_of step's data side pairs with a member of its other side through the step's on mapping, so there is nothing to add.", + "owning_contract": "datasets", + "owner": "platform", + "introduced_in": "v1", + "mappings": [ + { + "endpoint": "datasets.analysis", + "channel": "problem_details", + "http_status": 422 + } + ], + "lifecycle": "active" + }, { "code": "time_text_not_parsed", "classification": "warning", @@ -4785,6 +5583,16 @@ "endpoint": "datasets.refresh", "channel": "problem_details", "http_status": 504 + }, + { + "endpoint": "datasets.analysis", + "channel": "problem_details", + "http_status": 504 + }, + { + "endpoint": "presentation.shares", + "channel": "problem_details", + "http_status": 504 } ], "lifecycle": "active" @@ -4835,6 +5643,22 @@ ], "lifecycle": "active" }, + { + "code": "unit_heterogeneous", + "classification": "refusal", + "definition": "An analysis step reads an input that carries more than one unit, or a pinned unit the input does not declare, and the response lists the candidates to pin.", + "owning_contract": "datasets", + "owner": "platform", + "introduced_in": "v1", + "mappings": [ + { + "endpoint": "datasets.analysis", + "channel": "problem_details", + "http_status": 422 + } + ], + "lifecycle": "active" + }, { "code": "unit_not_resolved", "classification": "refusal", @@ -5040,6 +5864,11 @@ "endpoint": "graph.members", "channel": "problem_details", "http_status": 502 + }, + { + "endpoint": "datasets.analysis", + "channel": "problem_details", + "http_status": 502 } ], "lifecycle": "active" @@ -5081,6 +5910,11 @@ "endpoint": "datasets.refresh", "channel": "problem_details", "http_status": 503 + }, + { + "endpoint": "datasets.analysis", + "channel": "problem_details", + "http_status": 503 } ], "lifecycle": "active" @@ -5208,6 +6042,38 @@ } ], "lifecycle": "active" + }, + { + "code": "write_token_invalid", + "classification": "refusal", + "definition": "A replace or delete of a share carries a write token other than the share's, or names a share created without one, which no token can change.", + "owning_contract": "presentation", + "owner": "platform", + "introduced_in": "v1", + "mappings": [ + { + "endpoint": "presentation.shares", + "channel": "problem_details", + "http_status": 403 + } + ], + "lifecycle": "active" + }, + { + "code": "write_token_required", + "classification": "refusal", + "definition": "A replace or delete of a share carries no write token.", + "owning_contract": "presentation", + "owner": "platform", + "introduced_in": "v1", + "mappings": [ + { + "endpoint": "presentation.shares", + "channel": "problem_details", + "http_status": 403 + } + ], + "lifecycle": "active" } ] } diff --git a/schemas/registry/README.md b/schemas/registry/README.md index 64825ab..df4da75 100644 --- a/schemas/registry/README.md +++ b/schemas/registry/README.md @@ -59,9 +59,9 @@ Retiring a door is a schema change, reviewed as one: dropping a value from `code - **`endpoint`** lists the Search endpoints `search.resolve` (`POST /api/search/resolve`) and `search.options` (`POST /api/search/options`). - The Datasets endpoints are `datasets.register` (`POST /api/datasets/register`), `datasets.mint` (`POST /api/datasets`), `datasets.definition` (`GET /api/datasets/{id}`), `datasets.options` (`GET /api/datasets/{id}/options`, the write-free preview door), `datasets.members` (`POST /api/datasets/{id}/members`, the write-free member read), `datasets.snapshot` (`GET /api/datasets/{id}/{content_version}`, and `GET /api/datasets/{id}/versions`, which pages a dataset's servable versions), `datasets.files` (`GET /api/datasets/{id}/{content_version}/files/{digest}`, which answers a stored artifact with a 302 redirect to its download link, and `GET /api/datasets/{id}/{content_version}/file`, which selects a stored version's file by format, bundle and layout, renders it when it is missing, and answers the same redirect), `datasets.description` (`GET /api/datasets/{id}/{content_version}/description`, a stored version's description, for a `spec_` id with a `cv_` version or an `ops_` id with an `ocv_` version, and `GET .../description/values`, which pages one dimension's values), `datasets.observations` (`GET /api/datasets/{id}/{content_version}/observations`, a stored version's observations), `datasets.pin` (`POST /api/datasets/{id}/{content_version}/pin`), `datasets.publish` (`POST /api/datasets/frames/publish`, the door an analysis service uses to publish an already-computed frame under its own identity pair), `datasets.recipe` (`PUT` and `GET /api/datasets/frames/{spec_id}/{content_version}/recipe`, the recorded computation behind a published frame, and `GET /api/datasets/recipes/replays/{replay_key}`, the frame stored under a replay key), `datasets.refresh` (`POST /api/datasets/frames/refresh`, which rebuilds a dataset frame's rendering on current data), and `datasets.operations` (`GET /api/datasets/operations/{operation_id}`). + The Datasets endpoints are `datasets.register` (`POST /api/datasets/register`), `datasets.mint` (`POST /api/datasets`), `datasets.definition` (`GET /api/datasets/{id}`), `datasets.options` (`GET /api/datasets/{id}/options`, the write-free preview door), `datasets.members` (`POST /api/datasets/{id}/members`, the write-free member read), `datasets.snapshot` (`GET /api/datasets/{id}/{content_version}`, and `GET /api/datasets/{id}/versions`, which pages a dataset's servable versions), `datasets.files` (`GET /api/datasets/{id}/{content_version}/files/{digest}`, which answers a stored artifact with a 302 redirect to its download link, and `GET /api/datasets/{id}/{content_version}/file`, which selects a stored version's file by format, bundle and layout, renders it when it is missing, and answers the same redirect), `datasets.description` (`GET /api/datasets/{id}/{content_version}/description`, a stored version's description, for a `spec_` id with a `cv_` version or an `ops_` id with an `ocv_` version, and `GET .../description/values`, which pages one dimension's values), `datasets.observations` (`GET /api/datasets/{id}/{content_version}/observations`, a stored version's observations), `datasets.pin` (`POST /api/datasets/{id}/{content_version}/pin`), `datasets.publish` (`POST /api/datasets/frames/publish`, the door an analysis service uses to publish an already-computed frame under its own identity pair), `datasets.recipe` (`PUT` and `GET /api/datasets/frames/{spec_id}/{content_version}/recipe`, the recorded computation behind a published frame, and `GET /api/datasets/recipes/replays/{replay_key}`, the frame stored under a replay key), `datasets.refresh` (`POST /api/datasets/frames/refresh`, which rebuilds a dataset frame's rendering on current data), `datasets.operations` (`GET /api/datasets/operations/{operation_id}`), and `datasets.analysis` (`POST /api/datasets/analysis`, which runs an analysis recipe tree and answers its derived frame, and `POST /api/datasets/analysis/anchor`, which resolves a recipe's latest period and stores nothing). - The Presentation endpoints are `presentation.write` (`POST /api/presentation/components`, `PATCH /api/presentation/components/{component_id}`) and `presentation.render` (`POST /api/presentation/components/{component_id}/revisions/{revision}/render` and `GET .../render/data`, which draw a stored revision on a named target frame and mint no revision). Search's and Datasets' `schema`, `capabilities`, and `healthz` routes and Presentation's read routes carry no permanent codes. + The Presentation endpoints are `presentation.write` (`POST /api/presentation/components`, `PATCH /api/presentation/components/{component_id}`) `presentation.render` (`POST /api/presentation/components/{component_id}/revisions/{revision}/render` and `GET .../render/data`, which draw a stored revision on a named target frame and mint no revision), and `presentation.shares` (the routes under `/api/presentation/shares` that create, replace and delete a share). Search's and Datasets' `schema`, `capabilities`, and `healthz` routes and Presentation's read routes carry no permanent codes. The Graph endpoints are `graph.node` (`GET /api/graph/node/{dcid}`), `graph.nodes` (`POST /api/graph/nodes`, a batch of node reads), `graph.members` (`GET /api/graph/node/{dcid}/members`, one page of a node's list), `graph.roots` (`GET /api/graph/roots`), `graph.documentation` (`GET /api/graph/documentation/{dcid}`, a source's document), `graph.sources` (`GET /api/graph/sources`), and `graph.resolve` (`POST /api/graph/resolve`). `graph.node` and `graph.documentation` carry `node_not_held`, `request_invalid`, `service_unavailable`, and `upstream_error`; `graph.nodes` and `graph.resolve` carry `request_invalid`, `unsupported_schema_version`, `service_unavailable`, and `upstream_error`; `graph.members` carries `node_not_held`, `request_invalid`, `service_unavailable`, and `upstream_error`, the last when the read that checks whether the graph holds the node fails upstream; and `graph.roots` carries `service_unavailable`. A node the graph does not hold answers inside a `graph.nodes` batch as a `not_held` entry, so that endpoint carries no `node_not_held`. Graph's `sources` and `capabilities` routes carry no permanent codes. diff --git a/schemas/registry/code-registry.schema.json b/schemas/registry/code-registry.schema.json index 5c46e24..23765d4 100644 --- a/schemas/registry/code-registry.schema.json +++ b/schemas/registry/code-registry.schema.json @@ -101,6 +101,7 @@ "search.options", "presentation.write", "presentation.render", + "presentation.shares", "datasets.register", "datasets.mint", "datasets.definition", @@ -115,6 +116,7 @@ "datasets.recipe", "datasets.refresh", "datasets.operations", + "datasets.analysis", "graph.node", "graph.nodes", "graph.members", @@ -243,6 +245,7 @@ "enum": [ "presentation.write", "presentation.render", + "presentation.shares", "datasets.register", "datasets.mint", "datasets.definition", @@ -257,6 +260,7 @@ "datasets.recipe", "datasets.refresh", "datasets.operations", + "datasets.analysis", "graph.node", "graph.nodes", "graph.members", diff --git a/tools/capture_client_contract.py b/tools/capture_client_contract.py index d2f108d..c069777 100644 --- a/tools/capture_client_contract.py +++ b/tools/capture_client_contract.py @@ -80,6 +80,7 @@ POLL_BACKOFF_CAP, POLL_BACKOFF_FIRST, POLL_PATH, + RETRY_AFTER_MAX_S, SCENARIOS_BUDGET, SIGNED_FETCH_STATUS, STORAGE_ORIGIN, @@ -749,7 +750,7 @@ def _retried( `may_retry` allows, waiting `retry_wait` before each retry.""" response = send() answers = [_read(response)] - while may_retry(request, answers): + while may_retry(request, answers, self.actions): wait = retry_wait(response.headers, len(answers) - 1) self.retry_waits.append(wait) self.sleep(wait) @@ -2184,6 +2185,18 @@ def _retry_after_503(parent: dict[str, Any], ctx: Context) -> Derived: return _refused_first(parent, 0, refused) +def _retry_after_past_cap(parent: dict[str, Any], ctx: Context) -> Derived: + """A retryable 503 whose Retry-After is one second past RETRY_AFTER_MAX_S + answers the search, which raises it unretried.""" + first = parent["exchanges"][0] + headers = {"retry-after": str(int(RETRY_AFTER_MAX_S) + 1)} + refused = _refusal(first["request"], 503, _BUSY, headers) + error = refusal_error( + 503, _BUSY, ctx.actions, refused["response"]["headers"] + ).outcome(ctx.client_codes) + return Derived(copy.deepcopy(parent["call"]), [refused], [error]) + + def _proxy_429(parent: dict[str, Any], ctx: Context) -> Derived: first = parent["exchanges"][0] refused = _refusal( @@ -3726,6 +3739,14 @@ def _empty_narrowing(parent: dict[str, Any], ctx: Context) -> Derived: "search then reaches the same answer; the retry spends one of the two default retries.", _retry_after_503, ), + Synthetic( + "search-retry-after-past-cap", + "search-place-ambiguous", + "A 503 service_unavailable with retryable true and Retry-After 61 answers the search.", + "A retryable refusal whose Retry-After is past the 60-second cap raises at once, with " + "no wait and no retry: ServerError with its code, service_unavailable, and its trace id.", + _retry_after_past_cap, + ), Synthetic( "search-proxy-rate-limited", "search-place-ambiguous", diff --git a/tools/tests/test_validate_client_contract.py b/tools/tests/test_validate_client_contract.py index 3982480..700a78e 100644 --- a/tools/tests/test_validate_client_contract.py +++ b/tools/tests/test_validate_client_contract.py @@ -96,6 +96,17 @@ def _edit(path: Path, change: Callable[[Any], None]) -> None: path.write_text(json.dumps(document), encoding="utf-8") +def _comparison_member(document: Any, name: str, side: str, index: int) -> Any: + """A member of the output-comparison vector `name` on `side`.""" + vector = next(vector for vector in document["vectors"] if vector["name"] == name) + return vector[side]["members"][index] + + +def _digest_vector(document: Any, name: str) -> Any: + """The output-digest vector `name`.""" + return next(vector for vector in document["vectors"] if vector["name"] == name) + + def test_the_real_contract_is_valid(package_dir: Path) -> None: assert validator.validate() == [] assert validator.main() == 0 @@ -190,6 +201,21 @@ def _vector(name: str, change: Callable[[Any], None]) -> Callable[[Any], None]: return lambda doc: change(next(v for v in doc["vectors"] if v["name"] == name)) +def _allowance_exhausted(doc: Any) -> None: + """The first search's refusal becomes a 429 `allowance_exhausted`, which + a client raises unretried whatever its document's `retryable` says.""" + response = doc["exchanges"][0]["response"] + response["status"] = 429 + response["json"].update( + code="allowance_exhausted", status=429, type="/codes/allowance_exhausted" + ) + + +def _rename_series_left_out(doc: Any) -> None: + vectors = doc["$defs"]["series_left_out"]["properties"]["vectors"] + vectors["items"]["properties"]["warnings"]["items"]["enum"] = ["series_omitted"] + + def _served_order_after_reading_columns(holder: Any) -> None: """Moves the varying co-operation modality pair back to its served place, just before `crsPurpose`, an order that ignores whether a column @@ -962,6 +988,107 @@ def change(doc: Any) -> None: ), "refs/ref-without-party-totals.json: member 0 records rendering", ), + ( + "refs/ref-derived-member.json", + lambda doc: doc["ref"]["members"][0]["roots"][0].update( + content_version="cv_" + "0" * 32 + ), + "member 0 root 0 is no member fetch-spec-known-sentence serves", + ), + ( + "refs/ref-derived-member.json", + lambda doc: doc["ref"]["members"][0]["roots"][0]["rendering"].pop( + "without_party_totals" + ), + "refs/ref-derived-member.json: member 0 root 0 records rendering", + ), + ( + "refs/ref-derived-member.json", + lambda doc: doc["ref"]["members"][0]["roots"][0]["rendering"].pop("layout"), + "refs/ref-derived-member.json: member 0 root 0 records rendering", + ), + ( + "refs/ref-derived-member.json", + lambda doc: doc["ref"]["members"][0]["resolved_periods"][0].update( + period="2019" + ), + "share replay_key but differ in resolved_periods", + ), + ( + "rules/output-comparison.json", + lambda doc: _comparison_member( + doc, "member-count-differs", "right", 1 + ).update( + content_version=_comparison_member( + doc, "member-count-differs", "right", 0 + )["content_version"] + ), + "share content_version but differ in spec_id", + ), + ( + "rules/output-comparison.json", + lambda doc: _comparison_member( + doc, "derived-file-format-differs", "right", 0 + )["artifact"].update( + digest=_comparison_member( + doc, "derived-file-format-differs", "left", 0 + )["artifact"]["digest"] + ), + "share artifact_digest but differ in artifact_format", + ), + ( + "rules/output-comparison.json", + lambda doc: _comparison_member(doc, "same-derived-ref", "right", 0)[ + "roots" + ][0]["rendering"].update( + groupby={"by": ["time_period"], "op": "sum", "levels": {}} + ), + "share content_version but differ in roots", + ), + ( + "rules/output-digest.json", + lambda doc: doc["vectors"][0]["frame"]["rows"][0].__setitem__( + 0, "dcid:Count_Person" + ), + "vector 'two-rows' document is not its frame's", + ), + ( + "rules/output-digest.json", + lambda doc: doc["vectors"][0].update(digest=doc["vectors"][1]["digest"]), + "vector 'two-rows' digest is not its document's", + ), + ( + "rules/output-digest.json", + lambda doc: next( + vector + for vector in doc["vectors"] + if vector["name"] == "quotient-of-sides-swapped" + ).update( + variables=next( + vector + for vector in doc["vectors"] + if vector["name"] == "quotient-of-variable-named" + )["variables"] + ), + "vector 'quotient-of-sides-swapped' document is not its frame's", + ), + ( + "rules/output-digest.json", + lambda doc: _digest_vector(doc, "quotient-of-a-sum-of")[ + "name_documents" + ].pop("mv_ae90cefe711d4addb439f873f2010dba"), + "mv_ae90cefe711d4addb439f873f2010dba has no name document", + ), + ( + "rules/output-digest.json", + lambda doc: _digest_vector(doc, "quotient-of-variable-named")[ + "name_documents" + ].update( + mv_d355e59c50ff8cf07e86a4da12b64297='{"frame_ref":["dcid:Amount_ODA"],' + '"verb":"quotient_of"}' + ), + "mv_d355e59c50ff8cf07e86a4da12b64297 is not its document's", + ), ( "rules/key-format.json", lambda doc: doc["vectors"].append(doc["vectors"][0]), @@ -1307,6 +1434,11 @@ def change(doc: Any) -> None: _drop_action("route_deprecated"), "no row for 'route_deprecated'", ), + ( + "warning-codes.json", + _drop_action("series_left_out"), + "no row for 'series_left_out'", + ), ( "warning-codes.json", _add_action( @@ -1817,6 +1949,41 @@ def change(doc: Any) -> None: "reading_columns" ), ), + ( + "rules/operation-outputs.json", + _vector( + "growth-as-a-fraction", + lambda v: v["arguments"].update(window=["2018", "2018"]), + ), + "vector 'growth-as-a-fraction' has a window that does not start before", + ), + ( + "rules/rules.schema.json", + _rename_series_left_out, + "warning-codes.json: no row for 'series_omitted'", + ), + ( + "refs/ref-derived-member.json", + lambda doc: doc["ref"]["members"][0].update(parts=["ODA to Kenya"]), + "refs/ref-derived-member.json: ref fails the schema at members/0/parts", + ), + ( + "scenarios/fetch-ref.json", + lambda doc: doc["call"][0]["ref"].update(format_version=2), + "scenarios/fetch-ref.json: schema: call/0/ref/format_version: 1 was", + ), + ( + "scenarios/search-retry-after-past-cap.json", + lambda doc: doc["exchanges"][0]["response"]["headers"].update( + {"retry-after": "60"} + ), + "the record holds no retry of POST /search/resolve", + ), + ( + "scenarios/search-retry-after-503.json", + _allowance_exhausted, + "scenarios/search-retry-after-503.json: the steps never make exchanges", + ), ( "rules/reading-order.json", _vector( @@ -1965,6 +2132,18 @@ def change(doc: Any) -> None: "ref-without-scenario", "ref-parts-not-served", "ref-rendering-not-posted", + "ref-derived-root-not-served", + "ref-derived-root-rendering-not-posted", + "ref-derived-root-not-in-frame-layout", + "ref-derived-replay-with-other-periods", + "derived-version-with-other-op-spec", + "derived-file-in-two-formats", + "derived-version-with-other-root-rendering", + "output-digest-document-not-frames", + "output-digest-not-documents", + "output-digest-variable-not-named", + "output-digest-inner-name-without-document", + "output-digest-name-not-its-documents", "rule-vector-repeated", "client-code-without-condition", "client-codes-unsorted", @@ -2030,6 +2209,7 @@ def change(doc: Any) -> None: "proxy-code-is-a-registry-code", "warning-code-ref-digest-changed-missing", "warning-code-missing", + "warning-code-series-left-out-missing", "warning-code-no-rule-issues", "warning-code-is-a-client-code", "location-localhost-alias", @@ -2141,6 +2321,12 @@ def change(doc: Any) -> None: "reading-order-series-interleaved-by-year", "reading-order-null-sorted-first", "reading-order-without-reading-columns", + "growth-window-that-does-not-advance", + "series-left-out-warning-renamed-in-its-rule", + "derived-member-with-parts", + "fetch-of-a-format-2-ref", + "retry-after-at-the-cap-waited", + "allowance-exhausted-not-retried", "reading-order-vector-row-ragged", "reading-order-vector-list-items-mix-types", "reading-order-vector-struct-field-mixes-types", diff --git a/tools/tests/test_validate_descriptions_vectors.py b/tools/tests/test_validate_descriptions_vectors.py index d2e5696..f41ef47 100644 --- a/tools/tests/test_validate_descriptions_vectors.py +++ b/tools/tests/test_validate_descriptions_vectors.py @@ -124,7 +124,25 @@ def test_an_operation_listed_twice_is_reported(package_dir: Path) -> None: document["operations"].append(document["operations"][1]) path.write_text(json.dumps(document)) - assert validator.validate() == ["operations.json: op 'sum' is listed twice"] + assert validator.validate() == [ + "operations.json: op 'sum' is listed twice", + "operations.json: verb 'sum_of' is listed twice", + ] + + +def test_arguments_outside_the_roles_are_reported(package_dir: Path) -> None: + path = package_dir / "schemas" / "operations.json" + document = json.loads(path.read_text()) + compare = next(e for e in document["operations"] if e["op"] == "compare") + compare["arguments"]["data"] = "numerator" + path.write_text(json.dumps(document)) + + assert validator.validate() == [ + ( + "operations.json: compare: arguments' data and other must fill its " + "two roles ['left', 'right']" + ) + ] def test_a_missing_analysis_operation_is_reported(package_dir: Path) -> None: diff --git a/tools/validate_client_contract.py b/tools/validate_client_contract.py index d9c1937..9f1502f 100644 --- a/tools/validate_client_contract.py +++ b/tools/validate_client_contract.py @@ -36,8 +36,8 @@ - `proxy-codes.json` and `warning-codes.json` list codes in order, each once, none of them a code another table or `registries/codes.json` holds, and the warning codes are those the client rules issue: `ref_digest_changed`, - `route_deprecated`, `server_warning`, and one `key_` per key-format - reason. + `route_deprecated`, `server_warning`, one `key_` per key-format + reason, and each warning the series-left-out rule's vectors name. - Each scenario's file name matches its `name`, names are unique, `expect` holds one outcome per step, a step that acts on an earlier result follows one, a synthetic scenario derives from a recorded one, and every body file @@ -86,19 +86,28 @@ SCENARIOS_BUDGET bytes. - Each ref example's file name matches its `name` and gets the verdict it states: from `dataset-ref.schema.json`, then from the rules that each - member's definition carries its own `spec_id` and that members hold + dataset 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`, `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 root of a derived member is a dataset member's `spec_id` and + `content_version` of that scenario. Each member of an example the schema + accepts records the rendering the scenario's build of its spec posted, and + each root of a derived one that rendering in the frame layout. +- The derived members of the ref examples the schema accepts and of the + output-comparison vectors agree wherever DERIVED_IDENTITY_RULES says one + identity fixes another, so one `ocv_` names one op-spec and one output. - Each rule file under `rules/` validates against `rules.schema.json`, names - the rule its file name names, and names each vector once, and each + the rule its file name names, and names each vector once, each reading-order vector's `columns` and `rows` are what `presented_rows` - gives, and each file-selector vector's `query` is what `selector_query` - gives. A missing or unreadable `rules/reading-order.json` or - `rules/file-selector.json` is a problem. + gives, each file-selector vector's `query` is what `selector_query` + gives, each output-digest vector's document holds its frame's rows, each + operation's variable read as the name its `variables` give it, and + its digest hashes that document, each minted name hashes its name + document and each name it or a name document holds has one, and each + growth vector's window starts before it ends. A missing or unreadable + `rules/reading-order.json` or `rules/file-selector.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 @@ -503,18 +512,20 @@ def _check_other_codes( def _check_warning_codes( document: dict[str, Any], taken: Mapping[str, set[str]], - key_reasons: Sequence[str], + rules_schema: Mapping[str, Any], ) -> list[str]: """As `_check_other_codes`, and the codes are those a client's rules - issue: `ref_digest_changed`, each header warning, and one `key_` - warning per key-format reason.""" + issue: `ref_digest_changed`, each header warning, one `key_` + warning per key-format reason, and each warning the series-left-out + rule issues.""" codes = [row["code"] for row in document["codes"]] problems = _check_other_codes("warning-codes.json", codes, taken) wanted = { REF_DIGEST_CHANGED, ROUTE_DEPRECATED, SERVER_WARNING, - *(f"key_{r}" for r in key_reasons), + *(f"key_{r}" for r in key_format_reasons(rules_schema)), + *series_left_out_warnings(rules_schema), } problems.extend( f"warning-codes.json: no row for {code!r}, a warning a client issues" @@ -533,6 +544,13 @@ def key_format_reasons(rules_schema: Mapping[str, Any]) -> list[str]: return vectors["items"]["properties"]["reason"]["enum"] +def series_left_out_warnings(rules_schema: Mapping[str, Any]) -> set[str]: + """The warnings the series-left-out rule issues, or raises under strict.""" + vectors = rules_schema["$defs"]["series_left_out"]["properties"]["vectors"] + members = vectors["items"]["properties"] + return {*members["warnings"]["items"]["enum"], *members["raises"]["enum"]} + + # The class of every error the key-lookup rule raises. KEY_LOOKUP_CLASS = "AuthenticationError" @@ -773,6 +791,7 @@ def _check_proxy_problem(label: str, response: Mapping[str, Any]) -> list[str]: "take_newest_version": "VersionUnavailableError", "log_in": "AuthenticationError", "request_scope": "PermissionDeniedError", + "stop": "PermissionDeniedError", "wait": "RateLimitError", "wait_for_reset": "QuotaExceededError", "report": "ServerError", @@ -794,22 +813,33 @@ def _check_proxy_problem(label: str, response: Mapping[str, Any]) -> list[str]: RETRYABLE_STATUSES = frozenset({408, 429, 500, 502, 503, 504}) # The retries a client makes by default after a retryable refusal. MAX_RETRIES = 2 +# The longest `Retry-After`, in seconds, a client waits before it tries again. +# A refusal that asks for longer raises at once. +RETRY_AFTER_MAX_S = 60.0 +# The action of the refusals a client never retries, whatever their document +# and status say: a spent allowance clears only when it resets. +NOT_RETRIED_ACTION = "wait_for_reset" # The status that cuts a synchronous build off at the server's limit. BUILD_CUT_OFF = 504 def may_retry( - request: Mapping[str, Any], responses: Sequence[Mapping[str, Any]] + request: Mapping[str, Any], + responses: Sequence[Mapping[str, Any]], + actions: Mapping[str, Mapping[str, Any]], ) -> bool: """Whether a client sends `request` again after `responses`, the answers - to it so far in order: the last is a retryable refusal, the retries made - stay under MAX_RETRIES, and for a build, no earlier answer was a 504 - cut-off, after which the build is posted once more only. So a build - refused 504 then 503 raises the 503, and one refused 503 then 504 is - posted once more after the 504.""" + to it so far in order: the last is a refusal `tries_again` allows, the + retries made stay under MAX_RETRIES, and for a build, no earlier answer + was a 504 cut-off, after which the build is posted once more only. So a + build refused 504 then 503 raises the 503, and one refused 503 then 504 + is posted once more after the 504.""" *earlier, response = responses status = response["status"] - if status < 400 or not retryable(status, problem_body(response)): + headers = response.get("headers", {}) + if status < 400 or not tries_again( + status, problem_body(response), headers, actions + ): return False if len(earlier) >= MAX_RETRIES: return False @@ -854,14 +884,32 @@ def error_class( return STATUS_CLASSES.get(status, fallback) -def retryable(status: int, body: Any) -> bool: - """Whether a client retries a refusal: as its problem document's - `retryable` says, and otherwise by its status.""" +def retryable(status: int, body: Any, actions: Mapping[str, Mapping[str, Any]]) -> bool: + """Whether a client retries a refusal: never when its code's action is + NOT_RETRIED_ACTION, else as its problem document's `retryable` says, and + otherwise by its status.""" + row = actions.get(refusal_code(body) or "") + if row is not None and row["action"] == NOT_RETRIED_ACTION: + return False if isinstance(body, dict) and isinstance(body.get("retryable"), bool): return body["retryable"] return status in RETRYABLE_STATUSES +def tries_again( + status: int, + body: Any, + headers: Mapping[str, str], + actions: Mapping[str, Mapping[str, Any]], +) -> bool: + """Whether a client sends a refused request again, a poll included: the + refusal is `retryable` and its `Retry-After`, when it carries one, is at + most RETRY_AFTER_MAX_S.""" + wait = retry_after(headers) + over_cap = wait is not None and wait > RETRY_AFTER_MAX_S + return retryable(status, body, actions) and not over_cap + + def retry_after(headers: Mapping[str, str]) -> float | None: """The seconds a `Retry-After` header asks for, or None.""" try: @@ -2397,11 +2445,11 @@ def failed_operation( error=error_class(500, OPERATION_FAILED, actions), trace_id=trace_id(None, headers), ) - return error, retryable(500, None) + return error, retryable(500, None, actions) status = problem.get("status") status = status if isinstance(status, int) else 500 error = refusal_error(status, problem, actions, headers) - return error, retryable(status, problem) + return error, retryable(status, problem, actions) class LongBuild: @@ -2467,9 +2515,9 @@ def polled(self, status: int, headers: Mapping[str, str], body: Any) -> bool: error, again = failed_operation(body, self.actions, headers) else: error = refusal_error(status, body, self.actions, headers) - again = retryable(status, body) + again = retryable(status, body, self.actions) if error.code != OPERATION_FAILED: - if not again: + if not tries_again(status, body, headers, self.actions): raise error if status != 429: if self.retries >= MAX_RETRIES: @@ -2571,7 +2619,7 @@ def call( retries and self.cursor < len(self.exchanges) and self.exchanges[self.cursor]["request"] == request - and may_retry(request, answers) + and may_retry(request, answers, self.actions) ): headers = exchange["response"].get("headers", {}) self.retry_waits.append(retry_wait(headers, len(answers) - 1)) @@ -2579,7 +2627,7 @@ def call( self.cursor += 1 self.took(exchange) answers.append(exchange["response"]) - if retries and may_retry(request, answers): + if retries and may_retry(request, answers, self.actions): raise _UnfitError( f"exchange {self.cursor - 1} is a retryable refusal with retries " f"left, and the record holds no retry of {method} {target}" @@ -3596,7 +3644,7 @@ def _ref_rule(ref: dict[str, Any]) -> str | None: seen: set[str] = set() for member in ref["members"]: spec = member["spec"] - if spec["definition"]["spec_id"] != spec["spec_id"]: + if "definition" in spec and spec["definition"]["spec_id"] != spec["spec_id"]: return "definition_spec_id_mismatch" if spec["spec_id"] in seen: return "repeated_spec_id" @@ -3604,12 +3652,19 @@ def _ref_rule(ref: dict[str, Any]) -> str | None: return None +def _derived(member: Any) -> bool: + """Whether a ref member is a derived member, which names its roots.""" + return isinstance(member, dict) and "roots" in member + + 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, 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.""" + digest of a file the scenario downloads. A derived member's roots are + checked instead, each a dataset member's `spec_id` and `content_version`, + since no scenario serves the derived member itself. A ref with no members + names no scenario.""" ref = record.get("ref") members = ref.get("members") if isinstance(ref, dict) else None if not isinstance(members, list) or not members: @@ -3636,6 +3691,14 @@ def _served_by(label: str, record: dict[str, Any]) -> list[str]: digests.add(digest_of(path.read_bytes())) problems = [] for index, member in enumerate(members): + if _derived(member): + problems.extend( + f"{label}: member {index} root {position} is no member {name} serves" + for position, root in enumerate(read_objects(member, "roots")) + if (found := served.get(root.get("spec_id"))) is None + or found.get("content_version") != root.get("content_version") + ) + continue spec = member.get("spec") if isinstance(member, dict) else None found = served.get(spec.get("spec_id") if isinstance(spec, dict) else None) if found is None: @@ -3655,13 +3718,10 @@ def _served_by(label: str, record: dict[str, Any]) -> list[str]: return problems -def posted_renderings(scenario: Mapping[str, Any]) -> dict[str, list[Any]]: - """The renderings the builds in `scenario` posted as their `options`, by - the digest of the artifact each build's manifest lists for them: a - manifest's own, or for a 202 the manifest the poll of its operation - answered done. Builds that answered the same file list each rendering in - build order.""" - renderings: dict[str, list[Any]] = {} +def _answered_builds(scenario: Mapping[str, Any]) -> Iterator[tuple[Any, Any]]: + """Each build in `scenario` that answered a manifest, as the manifest and + the `options` the build posted: a manifest's own, or for a 202 the + manifest the poll of its operation answered done, in build order.""" by_operation: dict[str, Any] = {} for exchange in read_objects(scenario, "exchanges"): request = read_object(exchange, "request") or {} @@ -3676,12 +3736,32 @@ def posted_renderings(scenario: Mapping[str, Any]) -> dict[str, list[Any]]: options = by_operation[operation_id] else: continue + yield manifest, options + + +def posted_renderings(scenario: Mapping[str, Any]) -> dict[str, list[Any]]: + """The renderings the builds in `scenario` posted as their `options`, by + the digest of the artifact each build's manifest lists for them. Builds + that answered the same file list each rendering in build order.""" + renderings: dict[str, list[Any]] = {} + for manifest, options in _answered_builds(scenario): digest = _artifact_digest(manifest, options) if digest is not None: renderings.setdefault(digest, []).append(options) return renderings +def _spec_renderings(scenario: Mapping[str, Any]) -> dict[str, list[Any]]: + """The renderings the builds in `scenario` posted as their `options`, by + the spec_id each build's manifest answered, in build order.""" + renderings: dict[str, list[Any]] = {} + for manifest, options in _answered_builds(scenario): + spec_id = read_string(read_object(manifest, "definition"), "spec_id") + if spec_id is not None: + renderings.setdefault(spec_id, []).append(options) + return renderings + + def _artifact_digest(manifest: Any, options: Any) -> str | None: """The digest of the artifact `manifest` lists for the posted `options`, or None when either does not read.""" @@ -3692,19 +3772,54 @@ def _artifact_digest(manifest: Any, options: Any) -> str | None: return read_string(artifact, "artifact_digest") +def _root_rendering(posted: Any, rendering: Any) -> Any: + """The rendering a derived member's root records for a build that posted + `posted`: DFO reads an analysis root in the frame layout, and a root read + summed also records the `groupby` DFO rendered it with, which no recorded + build posts.""" + if not isinstance(posted, dict): + return posted + wanted = {**posted, "layout": "frame"} + if isinstance(rendering, dict) and "groupby" in rendering: + wanted.setdefault("groupby", rendering["groupby"]) + return wanted + + 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 that answered its file in its `scenario` posted, since a ref - records the rendering its fetch posted.""" + records the rendering its fetch posted, or a derived member's root + records one no build of its spec there posted, read as `_root_rendering` + gives. A root's `groupby` is the schema's alone to check.""" 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)) + scenario = _load(path) + posted = posted_renderings(scenario) + by_spec = _spec_renderings(scenario) problems = [] for index, member in enumerate(members): + if _derived(member): + for position, root in enumerate(read_objects(member, "roots")): + where = f"member {index} root {position}" + spec_id = read_string(root, "spec_id") + rendering = read_object(root, "rendering") + if spec_id not in by_spec: + problems.append( + f"{label}: {where}'s spec is built by no {name} build" + ) + continue + wanted = [_root_rendering(o, rendering) for o in by_spec[spec_id]] + if rendering not in wanted: + problems.append( + f"{label}: {where} records rendering {json.dumps(rendering)}, " + f"but {name}'s builds give " + f"{' and '.join(map(json.dumps, wanted))}" + ) + continue artifact = read_object(member, "artifact") digest = read_string(artifact, "digest") rendering = read_object(artifact, "rendering") @@ -3759,9 +3874,238 @@ def _check_refs(validator: jsonschema.Draft202012Validator) -> list[str]: return problems +# --- derived identities ----------------------------------------------------- + +# What fixes what among a derived member's identities. Two members that agree +# on every field of a key agree on every field it determines: `ocv_` hashes +# the `ops_` id, the root versions and the execution identity, and names one +# output; `rpk_` hashes the normal form, the root versions and the execution +# identities, so one replay computes one op-spec, version and output; the +# normal form, the root versions and the execution identity give one `rpk_`; +# and one file holds one output in one format. `roots` holds each root's +# version with the rendering it was read with, since a root read summed +# under a groupby is another input. +DERIVED_IDENTITY_RULES: tuple[tuple[tuple[str, ...], tuple[str, ...]], ...] = ( + ( + ("content_version",), + ("spec_id", "roots", "execution_identity", "output_digest"), + ), + ( + ("replay_key",), + ( + "normal_form_hash", + "roots", + "execution_identity", + "spec_id", + "content_version", + "output_digest", + "resolved_periods", + ), + ), + (("normal_form_hash", "roots", "execution_identity"), ("replay_key",)), + (("artifact_digest",), ("artifact_format", "output_digest")), +) + + +def derived_identities(member: Mapping[str, Any]) -> dict[str, str | None]: + """The identities of a derived member that `DERIVED_IDENTITY_RULES` read, + each as text, None where the member lacks it.""" + spec = read_object(member, "spec") + recipe = read_object(spec, "recipe") + artifact = read_object(member, "artifact") + roots = [ + [ + read_string(root, "spec_id"), + read_string(root, "content_version"), + read_object(root, "rendering"), + ] + for root in read_objects(member, "roots") + ] + periods = member.get("resolved_periods") + return { + "spec_id": read_string(spec, "spec_id"), + "normal_form_hash": read_string(recipe, "normal_form_hash"), + "replay_key": read_string(recipe, "replay_key"), + "content_version": read_string(member, "content_version"), + "output_digest": read_string(member, "output_digest"), + "roots": json.dumps(roots, sort_keys=True), + "execution_identity": read_string(member, "execution_identity"), + "resolved_periods": None + if periods is None + else json.dumps(periods, sort_keys=True), + "artifact_digest": read_string(artifact, "digest"), + "artifact_format": read_string(read_object(artifact, "rendering"), "format"), + } + + +def derived_identity_problems( + members: Sequence[tuple[str, Mapping[str, Any]]], +) -> list[str]: + """Where two labelled derived members agree on a key of + `DERIVED_IDENTITY_RULES` but differ in a field it determines.""" + identities = [(label, derived_identities(member)) for label, member in members] + problems = [] + for key, determined in DERIVED_IDENTITY_RULES: + first: dict[tuple[str | None, ...], tuple[str, dict[str, str | None]]] = {} + for label, facts in identities: + values = tuple(facts[name] for name in key) + if None in values: + continue + if values not in first: + first[values] = (label, facts) + continue + other_label, other = first[values] + problems.extend( + f"{label} and {other_label} share {' and '.join(key)} " + f"but differ in {name}" + for name in determined + if facts[name] != other[name] + ) + return problems + + +def _check_derived_identities() -> list[str]: + """Every derived member of a ref example the schema accepts and of the + output-comparison vectors, checked together, since the examples name one + computation in several places.""" + members: list[tuple[str, Mapping[str, Any]]] = [] + for path in sorted((PACKAGE_DIR / "refs").glob("*.json")): + record = _load(path) + if not isinstance(record, dict) or read_object(record, "error") == { + "by": "schema" + }: + continue + members.extend( + (f"refs/{path.name} member {index}", member) + for index, member in enumerate( + read_objects(read_object(record, "ref"), "members") + ) + if _derived(member) + ) + comparison = _load(PACKAGE_DIR / "rules" / "output-comparison.json") + for vector in read_objects(comparison, "vectors"): + for side in ("left", "right"): + members.extend( + ( + f"rules/output-comparison.json {vector.get('name')} {side} member {index}", + member, + ) + for index, member in enumerate( + read_objects(read_object(vector, side), "members") + ) + if _derived(member) + ) + return derived_identity_problems(members) + + # --- rules ------------------------------------------------------------------ +# The frame columns that name no role (docs/frame-grammar-v1.md). +FRAME_FIXED_COLUMNS = frozenset( + { + "stat_var", + "time_period", + "value", + "unit", + "measurementMethod", + "provenance", + "status", + } +) + + +def _without_recipe(unit: Any) -> Any: + """A unit cell with `recipe` dropped from every unit-request object.""" + if not isinstance(unit, dict): + return unit + if "numerator" in unit or "denominator" in unit: + return {side: _without_recipe(part) for side, part in unit.items()} + return {name: item for name, item in unit.items() if name != "recipe"} + + +def output_digest_problems(label: str, vector: Mapping[str, Any]) -> list[str]: + """Where an output-digest vector's `document` is not its frame's, read as + JSON, or its `digest` is not the document's: the columns `stat_var`, the + role columns, `time_period`, `value` and `unit`, each frame row once in + those columns with no unit `recipe` and a `stat_var` of `dcid:` and an + `ops_` id its `variables` names read as that name, digest version `out2`, + and `out_` and 32 hex digits of the document's SHA-256. The JCS bytes + themselves are the reference implementation's to check.""" + frame = vector["frame"] + variables = vector.get("variables", {}) + roles = [name for name in frame["columns"] if name not in FRAME_FIXED_COLUMNS] + columns = ["stat_var", *roles, "time_period", "value", "unit"] + rows = [] + for row in frame["rows"]: + cells = dict(zip(frame["columns"], row, strict=True)) + cells["unit"] = _without_recipe(cells.get("unit")) + stat_var = cells["stat_var"] + cells["stat_var"] = variables.get(stat_var.removeprefix("dcid:"), stat_var) + rows.append([cells.get(name) for name in columns]) + document = json.loads(vector["document"]) + problems = [] + wanted = {"digest_version": "out2", "columns": columns} + unmatched = list(document.get("rows", [])) + for row in rows: + if row in unmatched: + unmatched.remove(row) + else: + unmatched.append(None) + if {key: document.get(key) for key in wanted} != wanted or unmatched: + problems.append( + f"{label}: vector {vector['name']!r} document is not its frame's" + ) + hashed = "out_" + hashlib.sha256(vector["document"].encode()).hexdigest()[:32] + if vector["digest"] != hashed: + problems.append( + f"{label}: vector {vector['name']!r} digest is not its document's, {hashed}" + ) + return problems + name_document_problems(label, vector) + + +def name_document_problems(label: str, vector: Mapping[str, Any]) -> list[str]: + """Where an output-digest vector's `name_documents` misname a minted + variable: a name that is not `mv_` and 32 hex digits of its document's + SHA-256, or a name in `variables` or in a document's slots with no + document of its own. So a nested step's document holds its input's + `mv_` name, which has its own document.""" + documents = vector.get("name_documents", {}) + problems = [ + f"{label}: vector {vector['name']!r} name {name} is not its document's" + for name, text in documents.items() + if name != "mv_" + hashlib.sha256(text.encode()).hexdigest()[:32] + ] + named = set(vector.get("variables", {}).values()) + for name, text in documents.items(): + try: + document = json.loads(text) + except ValueError: + document = None + slots = ( + [items for slot, items in document.items() if slot != "verb"] + if isinstance(document, dict) and isinstance(document.get("verb"), str) + else None + ) + if slots is None or not all(isinstance(items, list) for items in slots): + problems.append( + f"{label}: vector {vector['name']!r} name {name} document is not " + f"a verb and its slots" + ) + continue + named.update( + held + for items in slots + for held in items + if isinstance(held, str) and held.startswith("mv_") + ) + problems.extend( + f"{label}: vector {vector['name']!r} name {name} has no name document" + for name in sorted(named - set(documents)) + ) + return problems + + def _json_type(value: Any) -> str: if isinstance(value, bool): return "boolean" @@ -3818,6 +4162,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}) ) + problems.extend( + f"{label}: vector {vector['name']!r} has a window that does not " + f"start before it ends" + for vector in document["vectors"] + if document["rule"] == "operation-outputs" + and (window := vector["arguments"].get("window")) is not None + and int(window[0]) >= int(window[1]) + ) + if document["rule"] == "output-digest": + for vector in document["vectors"]: + problems.extend(output_digest_problems(label, vector)) if document["rule"] == "reading-order": for vector in document["vectors"]: unfit = _unorderable(vector["members"]) @@ -3916,7 +4271,7 @@ def validate() -> list[str]: or _check_warning_codes( warning_codes, {**taken, "proxy-codes.json": {row["code"] for row in proxy_rows}}, - key_format_reasons(rules_schema), + rules_schema, ) ) @@ -3954,6 +4309,7 @@ def validate() -> list[str]: ) problems.extend(_check_refs(validators["dataset-ref.schema.json"])) problems.extend(_check_rules(validators["rules/rules.schema.json"])) + problems.extend(_check_derived_identities()) return problems diff --git a/tools/validate_descriptions_vectors.py b/tools/validate_descriptions_vectors.py index f2532a4..4200b7f 100644 --- a/tools/validate_descriptions_vectors.py +++ b/tools/validate_descriptions_vectors.py @@ -12,8 +12,9 @@ Checks that the three schemas are valid draft 2020-12, that `operations.json` validates against `operations.schema.json` and names each op once, the nine -analysis operations exactly, each reason once per op, and roles exactly when -an op takes them. Checks every vector against `descriptions-vector.schema.json` +analysis operations exactly, each reason once per op, roles exactly when an +op takes them, each verb once, and a client call's `data` and `other` filling +the two roles of the op they name. Checks every vector against `descriptions-vector.schema.json` and its input against the schema it names: an accepted vector and a vector the structure rules reject must validate, and a vector the schema rejects must not. Then what the record schema cannot express: each file name matches its `id`, @@ -122,6 +123,19 @@ def _check_operations(validator: jsonschema.Draft202012Validator) -> list[str]: f"operations.json: {entry['op']}: roles must be listed exactly when " "input is 'roles'" ) + arguments = entry.get("arguments") + if arguments and sorted((arguments["data"], arguments["other"])) != sorted( + entry["roles"] + ): + problems.append( + f"operations.json: {entry['op']}: arguments' data and other must " + f"fill its two roles {entry['roles']}" + ) + verbs = [entry["verb"] for entry in entries if "verb" in entry] + problems.extend( + f"operations.json: verb {verb!r} is listed twice" + for verb in sorted({v for v in verbs if verbs.count(v) > 1}) + ) return problems

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 delta 336194 zcmeFZe^e7^*EV`jG9eQ(8HN}_2q7c^0t5&cAs`|G0`fB=0zw1?ga{E35JHH;6sxpY zrIl1#X{D7uVx>ZrDpaht($+ryZnf1`t5&VGYPD8dXlu1+!_((^-*vuo*7vTn&L3y3 z(|fUMmu4n&?|WZ+U;Em7xc;8(>$|euhj6yWMQcBdyG@TZNcc-vG*s8uH3i3JFLZWB z2)Sh7@ZS&KWnrwY1oUz$_JV=6#>jR-E_#_1`%GObum8`bFH*!9&f5^>c+bfHxrBVr zRq%m``s->x(R;y8?>W%FW;lOWCLEnLZ9O6CBkX^0=6D>Fxm;$6pQO7UNtAq}bsLpS zM_t@6aAhw$cyx%~$#pPdiLm8B7ub~x?c(6#Ak!m1hq=Yo#ihj(UTnk4`nuxEisJvl z{{Q64g8#bkf4^<8S(HnReLfMW_#f;s^8b2&KM-O6oBc)emf-l8(_H>(-zLxse&8kj z+nhv={cC}StEa?HR=V0Qp!^w&I>wjn=f`2~_P6-UG`RuNKyi?tHY(T{5<1;mXPsdU z%?XRv=Z0rRSZ7)yEwjW??Ag)L9G1)+T{Oo#h8@ep?*Ah$D$Y9B8m~yuCtBvkB&n0F zDejLT%@vI?o$vOK9Wx=LFuTVbv7u4UK3S_vy;rKR4lL1D2rTCK7s ztxdhEezm39(h|tTJY{V)t*Jpp82xlPi#@rNDIrmK2`AH`j$1^qc|8B#0C5<}*dB&Vb#rJB;>(+vjG{PK*X1*MsF3r$(2*=(>G zhgDvh8<$satX^E0pIBfjEMJmXR8w48qF%}_E#qN$st&C`q`i%Y%O=2|bYxMfKT-A%Gmj}W=W)2yghTI^eCZ?Q#J zKf@AQ5>})y4X=!-pIH;ho;BOw{?km+ENeo2qG%pFDVc}mo06kayi-fk%<0jv)y#~z z1@)Phg{4`_WDH9J|ES5$%Cj2l7RTg=6jT@5>@ktxtu^dg4koIr6Rl*|V^~x}Lxa4* zYN>0ivlce7ZL4?~S-Q%yI;`-1w74aniGHfOHFr%V%E5|QMs_4#$FVtBxMqTOwDQZz zdV!IWIOWhbXDjS0S7dXsiLI_yNu67ww9seX{pNgmsi#R{QP!zUUeVt5J_bfD^R@Wd z{B4@*fc(I$pi-?l*cMVby!}B{uykh%+5- zF4x49(b;}T;=+7FKKq{-pjc&E9n&1&k_!;AwOZDgQ4MARfWX{5Q$-uO424^Q#23z*%iyDRn8`1Iru@{l)WtA2Wn}Fdp-C;v|R0(rLcj)>bzpS ztv(X9$T!8$0_UcQ4lo7kgJ`WaSPBNS>MUR|Ygn2-G`tQBRtYW=6+N|zqU+~m#HeCx zz-CsknP?uJRF`Z9RMdg1L>NlvR|6_40TtC*wrqCJ)LOL2maEUR0WLBC7d3@82qwk< zS|!Dnl4b0rrKP21uyV>uOf>)yIRIp8EngnGJhakWWd(Ci0z_CR1J|kt$AT5wU<0ex zSaZR*Y^$bL+$!5@c{ANo3D&c;R<6+@KP+T2yx_Pp;hjg*W@60!VKpOvDzsI-#)j%K z&C@nkC_4u1Y6H8Pi4dOH(Fj4uCdj0uP9=05cwZ%iok{Prx!NQ)w@j(Y-6kvdD3ND+ z+Q6DNl?~j_>Qk=v_O*fcSvA%Gb6`eLCIp+h5ZiRyl=s=fYPP3)g{N;c)a6sFnF%w4bXG3s~0c+a8nzqHJ{EPxy zq2F5DlAI!2u??bfTB)tfX0m|^Gb&2Vb<1-qZGX99Ol@>s=*q16bmNrOY}U%AM6jA| zbzpO5i>>Tig%zT4&ZMzoUyZ;y98Mai)S(nC0+Bd*ORkyB5G2vL&XGa`_*RTdyx8EX zmYD3#VhLmM3iP%>z^(DuX_5j`0@*>@*r&3BgQJ2)Avx1!x;n^GXU~P(43CLj%FJdSPK!c{W?=9=p`L z1~O75_z))_!%%?$3n?rt6c*+#u}^dLm=RJHRUNmYx<*yYty}4V!O3E%A;BCIHI;kl zCgG~`)tu($<`!p+W?&i19@vXr=QxG9ySvA`r^wPgL~^z#&;GV+n@b>sH&~&$NqG@Q z0P7(ym)joy25Z0-=ZOD+Rb)(A%+BXw-UW0)QeonxTk|kURB=klRKT}a#k%UFs$j)b z#lhpn)yN??axm|eE7dDG^{^UTun3DK$&%8TWR0A3W7{eWlf|rxvVSA7dC-etE%A5Y zVWN@}fX6at43%RTUQvPlB6(+HoC=E!1k6O5OmN_wii+489u{jMLYK1>R>Z@%Mpfym zy;oG$MAfS6G%MK)DioQPN=PjsP3#3r?O#h}1w|}xb{t;+m-Fj*97jj(YV3PHSwhwc zA|d`J(MD$*ARuE30Tw_&jhjVU>TZOTYmplv<=T{m5Kp4L3w?4S<@$115QY4#erA7@ zeR;fRM0F%ROCF_|ZH+d~F~%5UjdA9=#;I_d2AL))DS2|$B$uWbQjOsBl?LN{Q-)!I z&A!WB#ndl}D9Q)NRxAxEHJ0U@@?oDP6-Kjhc~)iNlw%jw#MMUC=~gDyM}uD*8;#bq zrVLv?_;p=#R7)Y`7-OpukY0$Xo-SnN0@5vcz zuRK!(NY^sbEO(16(L)EB#;hg+S|B(ogw@yLc2WC1973zA^i}d|;RiE_1jN&P}m0SZDdRO7{ru)A!Bzu*P{||=ZQ8X401P6D)5C_Bl zX?IIjX1Q^J+(`kOvZ>|a;lW`kez^^!te7FH5SVi?zf~6=L!`@W`6E#nz1gnb`2uZob>gESTt5R0u zkt>&YRw}HJU~N-=!cnU+7Vhht{%nL_p`X>?qR9v-0UpZMCO=&sTpm1A6jD9CXo|&K z!>sz~a4Uqylt|7jNa~YJ6jtm8Z!NfvA*MQ(9S8fJJGXMKKHh5oQzd6?3+u8P3qbi>$f%Q;bZJA5~x}G%wK=S%G_UmclCKVLr8fMl7Vw#Rz|tgN(?ZrvWB^RLkR;3i zrYN4&F>@+y##4S!y_EP=+<%-as&=Uq*Si)1mNKM9fKnxxDA%(NxahyKrp?E!j`J-C z6q(`7jF2^RwROR!kea_xG?_I`;q`!`y2#R55mC{QH0$T&#}vip#@U#;Me+3smc;6L zaY>~Bp^Vg`G*fzsp%Q3Y;sP^3Xp(|tZZU`lW!{wTwA>)3&2wY;3)^zVKbEi zcyb_HRxUR{woI!w0eIqS!lz5-JI$!xVaMc!Uc^&x93;VcWcEyJ7wu4!&f`K&<^Kb&-3#P^cD0 zOp6o6K^9JQRY_EC0I;>eE?=wv4KQZRHRL}4Q$eM~!@h(xr;tT>(2(X7u#`%rL>aFN z^<#%CpF%X8UzJnVI2yfJREq#yz^YIJd;{krcmw~SD|ULPJ2F>~ge zIdftYl9N+XVPWr!?4^FOK}MF49g3Sd)xcOP2@%iRQO7TYx+so{p);I;B}_9w;g}_^ zcFmDk>}UL<_}0+eFq1wF3O|e8&0kMjpo#-5O%}hfa_j9&{Jq>Q=9J|jz&?%D87s^+ zp|#>V$;#0BI0&fK_O1S|W%($7(g9d3r3W1`$%{UB!@zH3^tF?!zyWb5EB$= zIkeeXFH8gSRO(VLwg4zf-O5CM5aQrqa%A})>MD^H&LvJ!sw{^*69IX~TdnZ3+C4N< z#s&qO0Up-~P{;u`K5Le8dSG;Bbm5$$7&TZtF8R+u^W4(-7@*`)kXSJ6DM+iv$cIz9Xh+OPLoDy2@NEMJ*T>!x$&&x1AlZ#9R3+u24cb zse+|fMS9WR@l%-3@RtX$0|T`j?0$uPT|lyz0hYHR4U&Jv0(NF*=EBJpxlo&B&erAR zfM2w(wf`7k7l(>OI+4&tCk}PhN@qvHcrLF`-0LxV#^(-k_u8KI%xVG{i>C8T5~ClYK01=1V{m!dh` zgj=z(wcGQ8zLXOTX29s^@tE)bOPLJp3n2j4H!nqQk|4`0`5lr zL5LY&cosM;UTe@+1?c56_^6f80Qix zHoB%r^7n7>&UDX}nLPX;Kwww|xS|2%lzdeQq_RYxcl@W@Isa0vKF|mJty=x9TK%nB z{r^?9(rf-!to~N4rfT@V6|4U*D^_~V-)hz0YSrIr)&EnqO0W4_srp-~n(FWTtyKNL ztyBSv{9C2^Tc!G2rTSZ?`hQKOdg;$P2kkq{jIVM$KIOWs!P8u9E=Y*b_iSQ-3*99& zC?L?=0>UmS`dW@Y5D-ygT$rANwd=1xK}qktgSo7Yvs1+q*MI-582J(3|Mdw8vCBTY zIF6~hLTl4EHxzFfuH8DZxo>o6;L(u>l~>3Y7rS;f7e(}xduX!WJ+#m>uRq}8Xt3<~ zjEy@3_{Z(*D#|^S0@Azk%7#Ppv&sry?h*v8-q-BT?eycHjc|JLx@~XjwCp_Bt_t__ zO`ekVUU}WV-2&gV83h*`wF|x&`}SS=-Tm^rXEI6)a<>TFC3^O)h1~T!vDebZ_C%fC z*F0n6!|4#>eEJk#s)%)03 z=qdIMxT*ceT6bpLgJ3U^aQ##8jyr-lWjel2r9X(!2xpLBf@RoGBboXgtWAGQ=fw`n>_z(48kvgs|u&EF*H!tlO6gwH7O2#S4E zdzzhc29vag(Ccay?VWpAoK$*Cf538VP>)dXw$}yE6!O_bKpNg8^&1HV=eyWG6ne_O zGYv0erfWzz9roaAG!%sJc`xTJkOhO+FyJGvC8{~yi&%yAZ1T{;FJ9XCJh8Is%1|@A zoQ=E}$aS(-1E8a4`bKO|A2qUg0b!m4wkl{4JJV|96QrYCBx7PV^>G17M zODgh&mT@eyn2U$^-VG(UIJ7O@SY7-eGQ(uIX|!w(=neImg14^4v3$=zBLT>#Lh%Z^rvvNpIS}eSZv~ZI3*+S z=5Hbs3DL>WnJvxg#~&5Gik^(Ii^nJ<50&b?SZD@iuC6vXNL549(}WU zTSS+3J7R7)98EmAlZMA<8q;S=&W;Ok)&fcQI2(-^s^Av9j-4Cm`0R6=w@MQn6T0Zp zwPhFPxov{yT~r`gRWb+5xylwDX)b!XKR|GdW{PqHo=aItAa1{lBMMS4;Y-}|ddj=6 zZ`$dJ(sCYiOL}mFhA0U_lBzPs=-18c;Fv{l4xJ6f2Or7ior%weSn@hYj_)D0YY22p zv(NGO?;HlbG119yY-_9J3my`%hYBewihG(I^2f;-1-Vx92jBP>0_qt) z;;JtQq>)6)C4r`pDDg&;xmlPhulvm^59Q3hB7~yEO2-rrLCQ@G|1FwwbyV&V?FfWu z^1FD0V7oR^#3D{UeTO>g=$+8>J^vF1{OAMoNeo?}lq5X^EZZskkupJ#eRta(OuLC! zGK0a;5yNp@^Nj#~LPb!tfLL4W-C07>1rl;_o>A;XpVm9!Ys`P3iXUTL>3KN=fg3d| zDZ?p>ycn*KblQ<3DCCs=`tQ*T7`cp2>=h`kkA@aN+;|v7Ep(E6$p^3Jj`>T7L#Ydc zqKI|Z%2nH_!?i?fhNR2DCzyw=A+{6PQ56|Q6AoPsj;QgMEBKavUKFufA?iGe;g^~# zJQNd;TD>ZI1|E$mFXJ9WXA*|rjk?;Dv&s>98hhB%i#){moI~N6+h~bz|KN(i(?1I{ z1T@6+Ye~~hqF4I^W}V$PdW220uIHN-ov%Bik!=|M?Yq?P41rnk*PG-y6js-DmxWGN zFXhK^>DK4L4vNl7434Pvsm>!v67EDi_wd_aw?2ig2~CdlTaU(St6~@847;d8ML1Q&N8w%IX%mLXBS^iQ zM2+h=anat`_i-}OLxUKzT1>NoAhyP)NEQth|_2x#Firu zs0`QQ^(9AG$ctL59m`1;| zX?s&&@rC{z@nDUU=0!R(o12)$MGPaAxtjt7{zEn`QI{ zAVsqs^(Ab}I7>1b9C&(fGvD@$7#)k9h5uZD-Dz*bM?*`Joe1V6JE7?xv@5W#e*HW) zzA2=8yGPd_EW{*#G1$s(xrgLegvD1i$7$mB?~XQK%wwi#B*gCo`v$d`z|S9S(<6MA zYxjF>0$i>~=0sfo_FXYok;(Ezm#Url#ER878}`$$jHXQUIoy}nix86;!)N@Yw=#aEsjy9(3azL+3 z|CCWL5?I6fFXiMt{wMK5@T)gO11o1KQth3lE0Ez{?UCrV?NIp?Bt z+uMQIq`#VZ*o!m=o(>Z`yC!^)>5cTia#Bty4I?h}`SF1eTD48!<08A7)DLFU9n_Wx zlzSO`S3t@$EPVr}zQ{N4W=C(L=w`+5gD#n0BD6&J133u~e!r_HJ`zIhawK2Yf1#%q zQdN4Fx5FmL@gNfK%EC~1&I_`paza;dQS9g?dXRSI*jR*kvxK~Gq$ev1ai?Orj;|=8XV~dz-ollhzP~n?g@t%yXi7mEzPXig9Q+7hijS0 z6Rb6nyvc4@P?f=ZEIdMT&S|TNxC23hzdKt#<7mBk zc%!0|kSFeDqus4#(QCNoa1Pn{l(*ylNa=bR?thUwNlPI1{iCVZU;dj13FQ=%>Bv*> zkchp5g>ziGUv_BaciCCGSdMU>z(%mD-**yRK^Z#QLGYMCJE@Nd&K9(FKvp=w7B6ys zBEm977^;d^Ig~6E^t{3u?1ely^b{_u`u6v%JgIMo?sEaY@s2QwhnhF?Zv=eYcW~i) zj0-pH#ZtU^m%(vkOe$C9ecImCdz&x3EF^jZ8U0SA`-Jdd(6@yg*Vu27pk5aLx zL1iJNKOqq7)oayK8e0pdALL`<0^S% zRnMEp+HVf0vWE5{b-0)AX{SzKpTS(G^&g_kv)DuT5kBD@{gE4DDo)?s_9PlNMdPTM ziV$c+LvtMI!#+KAEMlaI>Ak^SUw}z-0}lUyGFq17Xl>8u)dJZ&1Pm_n12h| z2*s>!Jt=Gv5VL8{Z~Jp}VtAreY&tzVCqkqD0nhQE4(->7PfAh7%%VL4^szXd!uu;V zZT{Uq(SvV^@Bse$0!Ojj88NLTXe;%8*vIeV4RSH_6R*HG;VtTnKYrne`gcM#Lp0RD zCL0wbP9fpp+UPfUxZ`z;zh?W9d-OFaenSEI@deB=B?FGsSm zW8SLYKHc^eTGY{mkpGi*+|-T_PoU~|>F6b7(|cDxMOyJmwL=>Lkp* z=6`DoM;d^c`F8j35=bh6ze%`j<~^!!xXf+4mNfa-mHgvS0ENGJT`)uO9~pu(lb+Hs zILbl^DsuWis|Qf3K<#+p2yba=*LUrGw~qnC`Q!oQeqgLq1uBmLbz@B(3RIBsP_7Pz zfKKt7ISZlmCoL$a1)*1!1Y%Nn*w9Z12~No|-p`W1bc~X3F?vcL=}5v9ogr!0zsZ|e z_mt17t^)Kda9t9pO;RtEF`x)Q!JQ7GN^akOOxjaku$d?-nZ7zm7EkGdMI~Z(yO`t?v!5VikUb68E#wMBfe^Z8W`)_az|uajEzw4?lu>d_uf8s`43JMa%_GF`R^-4!RfA060cxqzlLvo=x;Quabg;0Xy9d^I=o?E zXFHxQ(LRfcUoiZ_K@&SaBVMd}e2+jy{YLb)9CN z^y`9ca*wTXNQCIi7`)ke8_|ZgN=y>q?vZ&Wto^oQR(ez+*=eLpLxG z9#Ct)8`pbAM0Vcxrop>Mk5PIa=|rxr?fM-uM@kykP|JdQ6)L09V#97u-(d%YcexYf zM2v{h9pH&d3oeL{&yZSp=o_uj@y0LO9h{PbEb&H1_0K%0E}R@uRf-FiSxjtx05TCX zshmyAR(hMt*`50cm#ofrxgrf9<$2$sKX`%ZqK(tiH-ih0ue%{l|mH_}HTL zL42WzB*3|%U*{^e41>%zq0L)lJizPAVhx30<>TbY@bQP7Maa;)n}E_i zCzwU91y2X2T<8zEg(*Hr(nS2G&c_%&GOEfGh?nu=K@rP7FS&cB@=DS*c*Nw*zEp}p z6)4!#EZ6hN;aWNG#y7$fr1T{o+Mf9$Z)gMl)za<&fm}jyD^O{v?tW+}2)!lFTBd5?|&r1~mtFTD$Qd(+wqR0qryo9!&fRkrPi5 zE9+aU!q8&z4MINR7+K@gp~mUP8_lnOFPJGYjSf{oFflE5(78Dk);V@RA;s-viwMJ+ z0V$V8%=S~d4+T4iK`)?zM-^NYdeYMM0`Gh7#~}zUjL}o3oyTqA7$|072R%wV{U&mv!8_AU#K;33)9gG2a>cDeb%>@@Ja7IQm_=QjLuY zi=0JFa3GMkRdM;`>}bEqs`UK0NB8YxHmxssyZ;-aiQ9+vsv54p?|Naz3(kx zUf4%?#}ZAo6S4b;7N0uhn{<%u_&c+)tt7i|$X%|87`;d@mHM&P;=HyYN*ZS~l~3I!ik$Z<^Z@Z04FAF8l zTubWm?QU_ApnC}$&;+$nh+E{C!_H-8B`AGC5AQW}DdmAcG%_h|4gzP#bye7Ne!J2x zHUdAs4F#L{Sx5X(U5W$~*&&X<p|#Lu1J() zXh(`WpLpil%dLUL?zHn%wG(Hxb}5E$i_kiu;c#w$3W)|H7jw~1Lq1M;#v$q3gkS#6 z_UjPt9*zC9!SpPRLMUdQi#dp^U4;$*geX5kXmIR!;D9EC9X#zf+?*?1@)D@;!mUD; zRE%Dx1WuCuYs-wif&06{#O8abpnUi)^0*y0herUhQ$6iMakmFgy-DOa2#pwj=L}0Qb)TU`Dz4Ib# z_%T8ST`X4=6gw_uktKT_@i`fq6MXdQx*w^XZaYgfY-z_fHVS|8A=dLDz%IjMU*^Y7 z#$D2~JuL?uKTAYjT?H)Bk|ll}zTMQ%JbXp|6E@bt#?Z6c3xbj_v7t)>G%Y%jp^WDR zB&c(Y&f<<-wLd_>cG~)7cB<+l9&i~s3wfw-Nm@Q+`Fzn^O?6*pKiQ1KPs(NxKQ6^m z7o>%?^rWsEE+6%HGQx(RrjhlZi_y)5e7ry^_mm{<{2f#%P*4_p0R_zYrkyDgZgeI+ zJV9Lh1M8f_Oe^u@p?TC!N7W~eXk7Y+G!8a>>`Vje$+(Ak++#S8ZS3;Ud68teq~lHL zKlnWb08H_H!SDg>$zGSSy)O7f2IZ%GQq6`R%Nn#2G%sBNuOJR+u0a zKX`K4G4rzH6T9OYyCd>72D3K?09GhwjwABuyskp+ozn;utRHn5p2cY~VNagHs-MA( zCmj%_(h1Nowcmv-uIRlbe3w>6441HUQg&N`BZOVeXRbu}si)(96HsDj>QiUp{^|gr z&TC7QsGTlRHTRKlsgj>cAQwCo}j6NBJz5BpGJROfS8_ZK0~)S-U8^- zBu|5;PJ8UPcuiHJ4wqGZFLeDV-T zH*xNwIFcp&&87Q3C~xu9df%QR570c-?E)e?@1^Z8FD~Wqb#B2S~kT6f6-HC`r?&qb`q)?$#>8{>moBa6f8^CvWd2GFP zi#StXj2#dbJ5xEXU-T1q{nGR)o|3E2dLMi6?XQ|R8FHW&F+RZXscKge`0-87_e8~a zTVkEb=ZB}CRNWK_XA{I*tEQ!^CGVtedwJ+yJ{932ws8aOy*TnM#xDO9jaBxL-Vs0^b`Gue2USWB%J(VmjNyJ;mI zsziu{tBrf)nR|uur97oUv~{8tvILbY5wDbr3M9wQL_9Bal5Q=-XFb35J-jK@vIx!m z7BRxtd~>u&w5}F{+MUc?q2eb765gdKsI;|*kkXxq5ji*)q7wP1MDh$GCMHz%God=~ zBo3MeEiWAEft@oSB5eH?0@W1fqiN<&oK$!BkN8XIGZ9Yz_;Eoj-dq$n2U{?L7k?#; z(|Rv$>fLDs74zF)^#n@ zsE$*SvjcSZr$x4+=@nPcqNN;-d;t&lOcIa#>K9?EKOAH8(8jKdYVu&YJ9p5VKqsA< zGerA2MjYVW_NxOPb+$vq5iXKPEZw5-gJNh$Arh9E#HlfX! zjs}``pt-hC2SN|R&33{oo#_>F6)J%WpSF(o7`I z-8ev}1Nl$_RTsS5QhPc4tj=9%8qkp8;b%V*H~W&U-psLU+Ae~6&;PR_c`C2)568F{ zL2%V}vE`|bazaqIOt$R;zP(n%R|@oKL?6e}fo>X99fwJLy8DCEmgfgu#fR>Ge1Xts z=jkLobsQfpq)z)~u4fVH*<#}|f(S1w&Y6MG){TU$yniTIcKVmu=27@m=3|GlABBur zMMLWBKez20qJ8+D@)^{m)q5R1=U)%vdYA@9owFeGCRE+Sp`rhM;XCPE)$B#pGZ5)} z?8uNXfuECrRqHX;n>>&Y%2|Quw@fmes8!}Whji5msQOi8T<9yzBjd7=wo^e};r%uZ z9aFx6^d^Ov3@6%D3?|otpeU4?*JEg*{|uzkZ1S1}+z2;X2=YX{+*J_$Jr_1iOuRg7 z{#+~>0iQm0sy@yEn>}7VicI%eW_N@y5{oYhqK_bQA#_VAjF)0@HhmsuZsg!u4V0Cy z*7NqU(12knl6Ci=v-A!;I#;~_(fewdt=#ph)kMV};Wj6<>BbvqNP5FZR?xlk!m$|z z%k?K%^uo<$J#UtI6%OO#RLAJu9NMF6AZp>^pA8B&G11;9*6`@@frdgqN<$!jYQ3<| znPphVL5lz zaS$v;k9Z%Tx2r1={)jok`BT>WAnlF2vlew>AJFS}revQhIf3x(t{gRn7GZB0t|B6< zp(67#GLkBuck^3VjeAZDpi#7YiKr_e4z5Wet>LMujl zbZ+0$pDmR&g21yA(`o92*{wcx%_fL|#_`}23))wo9Nw97 z@m6XVQ*`HyR}hFopx%B0ZVDFoaZ*o7x89FwJUR;984V~bmCuh$kH2&D$b+b%k=17z z$ln2JBib$ffdy|@!u5IG{ujqUysx}Cx_fkJvKKQjSebg@$79Yl2**`bK%<<(wn8WPB7+8ibF(`PH&g?A^Fp3TuFmJH06 z1<~r9HiyNzDtSCPb;2BYF**c>56bFg;iUzaKv2qUYWIeRg5voAjLH;yR9$j85%}L{ zUCgss#KcN#yO?A&uY6+(K(g>j$qFiA&bdM-miOat9>r(B^iHbd+8}pQ;@k0$t;3@6 z=0M03bqNUB_21#5Np0x3z2p<1i$B^7DDeFF-S|gYd5dnY^UB-&4T$}ZV}74K>dzi< z!~aO~3CR(2h<6ROWsgFk`Wju)?0xK76b*wZ)m%JgG94G((M~o#)_a3GK2sS>Lfff{ zmn4D6%dDi5-&-}6iue>4XX~6l+2U{>+**ULpP?a)B@~Hs?v8q>7 zraO?HN5?|VZzJNTN?FGYkc9MNhe=gmSAbbNq7c#8amOc!Z1U|+Ib0=Lu7D4pYWol) zqh63F`*h(Ii?<&~J8n5h(k46jn;SCaTsrvV8%uf;Z1l_>+A~=>Cmj@16D4Dz&oiHI z^FTL#lHql|wKM6mf(z%G;+nYl;;&}Dw&@SD*>~f^vJa|B7VSQ-H*mw6dx&fXB`#$H zJ9HU<&;9trR$1nu-TuSoEYj_i}4!F2ORKO z+o@*=^m*I^ynReG0;(P}6cVOJjOh@POb+8Xz4)U^2@&($;WFt?LUanqes7>lu1Swb zPZ)M``ACu92qAVjST@J}DH8pzT>!$JVHJ;@`>wooQy8sz_t4_=d!E`DPlDs#of(qJ z5Mg%Y35_rkn0DIqZ_TeE@}&K`NHfBdK@&9`G{%fUjg=6+JU9?=`scXI&=pD{9VfSW z&21<;lt(@~H||mQD<^O(Xrc38Y}mAObm-o?9g+7ia&la%Y*fm23_FK<+~p3<&^e##POv4%Kkb3`O&?b3$4UUqiMwjIx~`9O79`$f8Q&3*fU-bk9fcF7 z6D0mP{%9ifvl^CuJf;|Ur9Yt4@45JFY7av;JVdj$`T3moR~9xPzj?Zo&=$YjHWW$; zG-$JqOQDV8hkR+AqkmTG7^><~v)44T2xjEL8W|VO+4o9xGrlPh&Hwn9gtv&FV(zb5 zfY6H8biAS`c`bU_yhZmIkshG;_I!^-|I)YHHn7Ee`1F(>9UH;KJ;ljkIFDtfh3phH z7CO52s-kHW1~8ziSoc{p7sN271IknDNf{s(dfw}5yMEy!f%Yx_z8-X~eX}gL@78D0 z;D#He`VoH0P89iw^TdGV7@!A6#S2Q-@+PM%p4`U@?}Hc`Hz|}Ryp>arLlNH#4H9M@ zGOtCQTUg@FRLKGiKf7=JZH$~0!1a%LLswam5v(=UI0;|O^si#$8$;J*!f+jSxJ$=I zTXWub!biqT1-wn)5CHYsyqqv7>-{=*J$f+oAq&*;!);d)Tr1;G@WLF!d>W4 z;k70jLnEeT6k_C{ddymrh}yvIFGZ&~WF|Yr77?x9PV#%sg$KAI_lb4a{7!3JczAS% z_9XY-(h?`6t~l3m9T?cL&z49vb_jmG;Djd92{Dn6`MOe~EuQn_ zWe4-i4zq7lH)wqym$dhtU=Q|i2+x0xwWUvf*f=e*hK_8&%sH&i*Byu|8Pk12u%-#o z6Hw}%ZQH@A6L5!*Vlbw$<{i8(pM^hn-I##-Ucn3Bgj3j;-}eUbggJ|_v-FQ=;`3Z{ zev!0U9knMBI^5UG&#b`Et+rs+&~2X11EX7DYO{$l3GtnS+rPrkkIz1en4I_BG!|ju z22R^k6dHhHz2gfP-9Dt*AW^4KnNgVd0wsm_+k-7X3Gw@9o>X9waL@3e9_YS#Yr`-j z^t_vy!l#_jGHTc!pxUYxzeNj7Hw4GDLPGzE^EpW(Qv8yvOY;_KzCoD&$z(R;WMpafI* zoK>-usI0gjRE6O)3>%N4UFPWC=BkCf>I`<`4gm@fKf^=6``<);)Fn^d9G+wV=6kDT z1=TZU==<8^1Z-A1U4YB)76!RfuAV~$*qR`ueV2>3)<|bNlkXl%wF}=@3FW-lgB1~I z-*7djWgfdaj76<;lYTlrI7P?Sj^VlwScV{^BlucJ&h-1}8C^4O*n{HE zN-dK!v*(5|X}Ui;Y5o&O9sXah*Pys{?kxmMXGD^L!9dyZ7)7;3iqsk=mcM40tpnk% zpakYmT00L&@rPV}6<75-g>P@){sUeUSY`d98fB=xMLEu{mQS$nYY95 z14~(i`K)5TNX8et3oWXGqcDDDy6@rPi=U6#o=L!zv!+p=)5cn`8@)Vy8xb_YR6pi* zMLQs=k(Pr<`RCz?&yT~n#BeRO z*RgXUJM7DZ)25@?7t`qw$UnQYA8uiwmep?75HKWST#w<+uge>PAxI$6gflRc`Zl3^iL2huM;2igPhQ8*`O{JJBSrc<;jF?gzG}5suK`iW zM|ydhZV--Q&3TS_368ccXhH2I^$u#QsQCr-gZ_0l-2#Y4j5eN)KfOr%k&o6HFZlw~ z$CAdUJ&CR5{R#1Ui0m0H*BpNF$v)H9&PwzX;LNd(4Jvd=H|&Pb2tRs?hEC7Q0-=YK zm?y+{r-jMUO5H&qi^oB8lJ4@sFN}&YsSHY;$~$$Jd|f^vkFBie#*&ER4TTWf_DAxzSe1F0{4hgINpTXo2p_$2&%j*kP$xZiB% zbw|QDbg+y%7A#v@(Yc+u^;v^!kWx|;cvcUyMw^=Pfs4{1AF79ry{hQg{?(>8bGx^O zQ^*k%qXT69&2=hh-1IL`Jpu`G&s%6)W$$MfU*#FJot!NH5-(!p3~2UK*+;dly@;34TJ)^S&o4@7P=_WnlE} zc|D#IYy!VM8uuZKIw&U^m-xwZrlaNlFCbf37M>qY{gd+EZr!Z7X%Vr!4;<$Q_ngpkLICp&N^y9NtXBSynt<*+Nbq}n%nt3t&-{olti9r&0_lk~ zsDr7U&SVLQRxU@-QRffIp@@tQ;SPV~6WM|WJ`?^r9c|S02)yC39*;dp3*g%s?6sZ0 zV&4`wW4-j=<_{mt_2EnSr|&^2vbA_25uEl)#WtL&iPew+{IeU9Z~FMc%LW6&y?k8T zL2Yt&PX1Vo+QYtw{45&zb!us?@g2A2 ztA+TuKpBOPY{5RIcSkX2_f=u5(9&WBb_E__@wI2wJrcnl$>Xto&F8~^re1J?(Da&1 zr7A>*UaZPd8F*A-AnH>dB(C^&VI(rrt#w_p>W}-bfEZFZ*;0T{XaP zyU}@`gZKF3V-GKl21lJ8NyrKb2Q3FA-A7{(oA(P_v}IgUIwqxmJRhJ`ow zQ%X7ID_dYtgq)o0Q~VykWqJs)*!8QRFVRHUM#aI99T!G}{}@vTwZt9_`Ve{hv^FOv zC0n&CFc=bpKBF)E79G*gcPG#OFO_Ro(xl48{Et+w`-%T0b1nQ|M6ADruL78#`)|`G z|5mYJp!c`Ulke~VgD>StN+IM;c8E{I5TI96A9LsKe@&}o#-TK@-_(mltyAy&{7de_ zT!)2AvMIVg? zsfne=Mc6nA!@-P?UJ?GUw}W7YBM8IKZPxEX&Q0`p`-ktjV{6FN>sdLGRmj=<_1BhP zfwz6O9Jw&z(DQxdS1yrjDq6 zbapa<2_zwG!w|y7fCLf*jEIPc7_1J6&BoRxmx@0|0Tzs^5A7{lJPXV$Fsu6N$Gc8=kH%5$pj zoe$@b>Y2rzN@;@%TLST3k#xR}@b?W~k{~3t_EwX{9;FSvxTS|l0t2lGQIpY87 zr4)K#G{vX0KihZ4p@u9RWgUJAcklC?fDGZ@qx+KP&ttDSlfxGn9kUgrh@3 zkwMU~BKdAgI8TadhIRwRd@<0k1CN^)6BU`l75D*l6Yi~sdjjF}dfi-D;Jw2)k6en! z+>R)amaaYkG(cQL1-W}UGwdW6?^AA&f|mtnHE%CNZoW^`e~xnbGm%d+Y+f{Ccq&Q^ zKbLZnCoL%9%5~tET&`M(I{v>d1_-7j+@h!Oa*=ChPRw*Pc>M)LZoWIWW0bO{HXFFb z!mj-47x^bc3sXQN21P2~izb?&;LO|oE$Z3vBR;o`zaiiW9{rMdKfjawZ{%6-vKUKV zJ}39x8HMs?Xlr`%j9vFe)cl_Ql#%Wmf9vO}#s%5Gk~4<-uge4R+On`2+zlMYJxkhP zDK*j04zFc?JH3yr$bOnLY34GEV&!M-7n4xP5zp>ebvP~j1UjEC=jDVizsCb!@b_C& z%jXJUU}Y6ec<|tyLzY|rq9_^~>M}+QHEf5|+^(;bp0_AC{?@=58iC@p4W1}@+ysL& zBTst>f2pg!aSCV@+?PJOrs8$(M{!5P$%&?jZ$VLY1o)2CGO}vzFnhh=gMW-6Y&s{p zSa7+}tNLYP4@GX7_RH4FS0(QDu0B63X;e-x@=Tv*?LObrdQ%sOH(unvy?my0+~SY7 z-i^L}+ArB@=S*o^)pOgc4!bW@8!|h_t_2C-nyWm?{9VQ8-=53)7FRfh7o%14q)ebe z8+`kHp&qK-+&j(=JMALK)jN*}`jU%|C!A$a^VUf`B)srLq(vA$c{%v-n4mO-{M<7$ zPE0zuYVDC{OAhu-YRg#H*0*EXzVTO1#{dO+UR~&8$Io)Tdh#Xc`3-f)CqC?HIe%iw z{$pU)ep?SY-PAn;fXPh6-e-k;&_W)NMexOGrMl|N$*a`I&jae{wmk@EL+`J9`4iz@ zvShAP?5EaD;j~m~OMM{JTTSABKfCnRzUn1u9V4D!e(hp{lM_gYTH7&^M6(;ux=*8LCNTjqNEbk`S;Ufo@Yu8K?q@2h4!qripa17Ce{nQL3< z|BCEHoB5R426s0kES-u}f(>htZ{GQdhyH|9kT*uPSh#W1cNo9Xj9$87 zJ`#Vk;?=FG(Bcg8(cE$u@Sg*t4s;vJkGSM6d)N(IbHMJe5u{wj#TMzsPUJs~v*8Ey zj~_|}aT%I7kMnmRN~_O7!5|J4*GwFcoAN+ceSB7jzhRGnekVW%S%mG3HxUTuc!sbx zqOrDExz&HO4XC?IC2;1#?OORQ&v#YL_>VvBs}5}&VJC?Emx-Nk!>iD%HdO$LvcrDU zFU;-)4ttm25yc59wosV!pE7dnIHvh6t+5e+HpXyzm2}ALhX8cPZfihsBE0}lHtYzQ zApBzi@CRSw|hX^+Tf;xVIrXb_WWYE$u{d>+LYhG4JNNicD`_Uw6NuD?TeOg z)#42T#?Lk|DSyz61E59Ia2yM0IJCQ)@VA0pmU6 zsCbw2)ziWYOym$OnBAB2NLFb(l#dEWPIPg8n)?)L!Cud<9}jZJf}32wOyZaQlBXqo zf6C}Ef<8^Y5nyW@w4Z|<`QD-cTTh5?P$p{y;?$rsB48PuBia=_dp*jI{&T}Tfxt1c zE>u5$(R+^Pp!@?MXH2?hy_LGz2;gKq&c0DlayfHu$XTH@?IC9}u)z7%!uw(urJ=O) zEOh-9ZRMjmq9Q@;WPbUUkXcqCjy%68$oz9^@(4D@#oBU42F(~H;KBSZ-)b*fDR!x< zTj~oDWt#n7yjz*NhcjV|03?g!k`?>e%Y12kN|FJBh3JJHFHh8Hb9NL)=FH(^zd<3F zc%g+~>4CHv{GUk900H}cQLvNgIh;d`he1#`R6Sr~6t$*q=S;>k8F7 zubjQfow*e$l0t|m*|jv8MEtdB2?s5S&;}Io3!lVK!S12E=W$%p&VD_+qpz7;9d8iL zNwpzE1RGO9YH9F0C<9IQn79)+=GfbXe6RuAO=^!H#061F+*Vo80Fgv6HqRdSZR@(f z??}i@bm2+r6?-Y{OAFD*e&!UiM}VgvPFT;ND-|h)rR+Y^rJT`$u51NT5g$zBPBv>0*)Cfu>c9|3I`Ee!4I12>D%LUt>%zNQT-~h(o#TvYd*Ccz$ zn8P`uTl~@Q<6SwpVOdzB=tCY)gdzG2{fk`AG(-+}T;$0O8pI9C8hzlH7@ZTHg|ftzH>|+t*l`SJ-w5i~ zI@EJG5!2xr6F68SKj6o_?m+m{sj*L8mM^ppVZ?BZosIET>v)(5S^X&n*&gH?vRWXOas2mwG76o$Qqv3SH+2~ZHQ)hT(?`e0kQ86yq?QhkJfn=q`Oi>{@w;6}Q; z;1Rdj9|wg+B9@VXz5WAlvH?k29~%TLs-z#0xzHQ|{zuj!i~rR@XL?EuRrkN#zY7$;(W(2$r__x)lsC z@YQ^&$jXgC5<|DE!hXf!zlgK7QN^h~Ei4szM`jM7UMeUgn=3?q39cMf5liYG=U#z2{3jxT@6Gpq zi}u?vYU1o&?2xG{B6Hg>izdm?xKwDj8oYgBwMYM8(Qh{BJ}*-YN0`TKMISuTcGlUS ze(tD(s_EIP`LSZ2AO;Eo;(46Z9E1ZWD^3VwMTXyfKz$+lRw_xk_awVKN_1628I7yB>Go1_65%^W^kmASAJZ&%+(^!u8w(%(nj(L$jkypD$?yZ zX!`Imv0|(EL86>sA8!)=v}%fAwqwEkp>ER}?kKD-T=757tvHEiKaCv3q#xu(b|5#d zV)+p(!EEbIhnRI@$iCYeME0uFC(&WqJEv{t06)VJ6hoWU6K=r~01gO3%L|bHXuOt# zN9ZqH8ohbj?)rK`nas!~ z=%dJrFX)@SN9Q&{$vg`Hy~9IV#0LteUig&#e3;nJck7c~9&UUo+H_$|Ta$BDb$_S&L0*`8r|bQ`;L2>D|EYSAHgx#iR}>1dF&fOQQN!{v|q zv$+JlW4jef$ZCgW1If|R@GN;$==&s#TBY8?-T^!$x#{gnBOrF3}r|58l{ z=2)nvPyYW=P0{}k)da$}|6A@fqF4_p#Q)ZB&H4q1QK;qwY@H2C6_A2$uK+sT2${R* zx}&Mj&$}qMcb$PO5+?G02lPK3Wc-&x%Lj1XK_T;zVDUg{0$)8F{0QuDARyrS|4U^Z zKYr}&>ab$8BFWN!=KmC>K?(|K;CaLUl$BXz5{#WBffnoc1l#M?ODx4!b*rcE1XjW^ z%mnV=aqFSghf5v&gntUZpI}0gH26m5oDfL2Q<(YjCgkE!yzH^G?R^E~21kc=i2RZ` zV|XFza}PqfVIaY>5Ngm;XRH*Vd>9+V;1Ro1Pch=889OiM2hBu+j=uLfVVB`_Hhh%-For3XR;2y< z3|jTLH%D)GfhhowH+a^(Hw@mLDfAI)321_13*o2*N`)+Hpx|O9XwM>s8Ro6!M5Kap zVgl4bjfk$01M}$8cCV$r#xFD0k7FMp+=tF)&On!Y+SXeDH)5|~G)w(PMr2z{M756Qy+l%Ca9*S{Kdd)gV)kTl#qM==BKQ0*d) z1%?m-hj$DcmOY4k$rTi)IJdd~v4bQ1>{)hM@Zq169fv3F`c}|ak>)mb9v1gmr1xWe zxhN@lKXS?6B44}o7su^STUtKL9TJ^7_75aEdi0BWUG?x9G(X-OfuJzA;;vsRPCU%d z#Ah3h4-{K8;O_k8xZ|vf#iwJowe@}i^{kG**$>}MYFoL+lwzSXZ+GcC z-p90ct?LMyxc~6%hl|r5o}PGT7J4P&i_$IAw@Nr$kpU_P{PHF|;303GLTYJA1bJ4Hw_gslkCld$}#Bli_j!Xx#RzPIba4K&t-pPc$MA&0S!G1)5@vz?uAaozfoH+Dwz#?RjK#Ard?xT3b zpvCsHVrL>;|0*_>VPY*6Aw91&X%B(E_+OUezaC6XpT1&-D~gPDK+DMb157w{r*VWz z@^{f2&M_wsW#VigJtXlF^hoxvMo znZpT?C=>^zbAdLUED6#9X|t?Bw2v=vUg(k+y(D)YlusEvEFoWjf~6x19dpeB#{4# zocR~7Y#TN6ODwRoU5PE_Le*k1mD^&q->y+}qEMy`h3?Zi_z}pIr;QD8upQchyQlD< zdyKTTzwIBvMcc#dF~1MpUfIq?sp)%gKp`sl96K16mtXV`<_=xjT=png3H}KrDR=MW zlz-m*I$#n{r6s8$xBVZX_~%x#biwjYtX^1M@1F*IkvgU(%_aMDK||dOgDOY>s>DmF z-3+}$qB{~AxK*3BZ|1BiVtk+EhmG`~aqoRj`D(h`+8U06*I9=wVTQVk{t^VGfJkZZ z%@xbPu%31bS*Lm?7`+PA;+vILpu=euWb0 zFDL~N055L(jK_atSpUHawZwdf8Y=F9-~5E&l#s}!HcViA1;YyM2&m{btwesQayTh5 z{W?&(_0Xm(WXHGzNvJE$ZK@3!Y4?@?OlW-MzW#5%Xqp{bw{j-meSWE}ElAaa=}`h* zAew9+l}WWtTuaUR?w`5oAmX{}rME@X^*^I5!^#V2_*67d=3|>y6S3=&b&5n_1FZ>u z{_JI%KP2t zumIVW30&6AK4viz&Qk#q;NdGmFWG}ETDkmZu0PabIST?tG8OM6-n-8lL|^?%KNq61 z<&2e}2MRXz*9a&?m@SI%wvUvL{|LIqgTNkzH9M1_^O1B%{O#STMo zyt^%8E!sHK@WhH-_nzQ3TV#<6$|9DNs%Pg#Wh^Sp86*b%=*MwYx(Rh4=UQ%Ne7J0& z_t~j4+91X@K}m~uOYAp96%}Jbei0^oF*M#qGKc?g9C{K5%}M|2y@f?VmhIV;7& zS186!E@Vdu^fLF3{1lIE1iI^RCzr+v#GsbEW=eNpEK*#J9NNCAzl7puvhlYw^FFcj z1ONaMwM#kb>mf^!*KY%4Lj(dSN~J+7gd;DHJGdBj3{Z^*{qq|Z&PV-Pld5LKSAzzU zPa-lU*SS600;k2k;aFN@3=r+Lar;-`znvEp!-cL_eFPOoxFPGHdPj1Nn^Rq8?Owz` zA$e3%zjVa*X(|740|2EP6ep15g)0{Z;)=WZVc6C#p-a3iguOx}BcWtBCB;L}qNj$* zvt0mW8D>4r?i3}n0!7Qk(9|4;t(Ky5Y#l3TTm7(P^c7%oBR%;+OBp=uCZp~8B-WRk z5NH+ag9zva533o=EmcoRLEz+|xen;?>e&K6m%KUio?tv;`#cU;uJU!fyiEzQM>fmu zRt*X`ER#S{3!JbmGJJ|8+Nf3ZcIZkOk2G8i4!Xk+lkhCP9-#XC+VWtYWp)9Tfy(>)5y6MmSeVv@a5}2V)5VIKc**5E@~c%E|+gX*Xw3*@tDT0MA2{oJD(s$ z&olw_2m8kT?4lb$fbh~#VCovX6Nj2zL;mF&EF#!*O!E3aIcU_p4G0~T?UE?Cbh}Ve zmuB>A*&vkW5AoQ{ce5gb0Z|u2muDh~ife?9*LMP=dBKN@)-2=rd_!iQLii20qS50^ z2VjLuc;pL(U9|@*|KM*C!}<*r?}pOh5w3UU?P3ah_+R7SS^sxVr=ho0_R{1m6?G_OhbOt}-rZjf^`M_^V`t+tGkgo7F<$B5j+Ql^F^?&s_pX60rB&pv0uAWqpX= z#P6LEvmz}?}~<)g}d zu3Ljn-FdWt?y@OOZvc{AgCi*x~G-iM(n5n|y zHNFLdU?DzSe0el&!RkU?ScW|XRaX-K2Qq!2RM9KzBY5yG(E^W%Sh3B`*-vwMefa#_ z_5V->g449@?MHZmcNYT(Fsb5#L3ed?MXThv)Swrx_mhLC1$ig)8{aMY!O$$lBa7D= zD9VuqU@STg2RZ>W>|8+YeKAl}Gd^{lwJ-z4`TxPj7BSH`QPJ286tEOYj*njpC-$NX zV)>1}C;5Y_YU=C5E+BL&U^$vO!kT$V#(YzM-3C2*teQG`xp?&C z9Tm$wj@sZwp$7^K4uYiQdoQfqX4xsEmCg zrpx5`&HAuD8!3!;M6rIa$2BiC&|A=;%y93&n)wGJxuc~3qwviN_e!EW;8SRnJ+MQ? zU0=s6C(Z@G0v&-y%RaS_FXdKEd$baiuK@yqLRzqw7gc_#^cHhhD2C1-j`d!fS^Q#c z@h*mBYYd_beE%#i%AdR|GTvDNQl0u`WjXTjc1!VpL!juHH?){E6pPjmNRy+f^EPu) zp(xsU!zY7E*K%;oVd~6}@V!tU@}sCQ9e?#}+A6pE{8TM7?*@jJorPEZ|8>Btp2kcW zT_YF_$jGP8!_UjYJgkU4fHa1E(|1FIr2k4d9+vA$)7gDqN>?3pv#Eatf(x#DEAnuw zQh>(HAgZ&GSSo0Qn?zYkNRLGM?l^m`ew6=iNP1N_-wI2Qmv54OKeV#umF=qVhLB`F zd64TN5)Te=M*JMGuw;%qob?oi^`88sTXLFejZ?f zM)MrTFuTwZ-Z}iWKYNVO(*|ePEGELja(K=1LC-{)d`n!Jppb-J15y0$Dj&v8T*&SD z@fYT3*V|n;#0_gVpSTbG(?AGu0;FWCQkMT$rSwNBR5w?@f;j9PxZB(2%BjV7-ajaZ zB8(cQkz7gom~u+64@7vp$H+P?iz9+qa62Fk@t24Vpvbsx3Rud>prPe)(HTb+7uyKZ zbI~h46y7RwLheA4tJnyVUfk#(J{-@}`xkS_H(p=S1~0~Wcqs2?Y!Q;a%$>Ko?v=Cq zWV~-Y`>T)JHXnT2Rk$&yUhD@9>R^#~F1eEuj3>X-T8TK0JCauC0Nne!-d*_QAj$))&J#{>~DmUo>TJe+M}&mzexH!1XQ z5UFLPto>~AKa$aw(yzr4he%(`SzaNzda9X!6a~hw;XsLd!4riH8ieXgmANSrtqw?* zdes<<(#M~VUJ76N3mA!8$JrC>j_}HY{7}L!pe%FfTpx$Kg7W9tWz6!swaH#DTLX$Y zX%dI&uETmRl&2>p#Y?#1g|Z@BdfnIKqopV2K(Z*-9yyEdNr##v4&f0ma@LGHmA!O< z{+IILYS7a`z252UxpP)p;f#f&gUJIp<4q(6XQ}Hkyd_0cVaskKOsnviVD3FD!zQNH z^{o`9BOqy(j1`GQ$wXp%r7nA+OlBaGg?k-=@OHQlSLCfbeu~zeu#dM!<3w6c}F!lIGvNd}7U+CvNA52p}p*`L}Zi;p$(;x^l5e z!FSI6P8tZgcwvexwt++LE}l!D^HFkm5igcE3_T9H%<=Tw`kU<)DDZgiC;C>%_sj!b z!J9^?ZrrV${bjdBZQ9XiaM`N+uav(x>We`iwpM1j7fPX~@vYz1?h6|E=Es$FOP4$> z4^C;yFApLPLrS!dXnTAeGh-USRUL0vjB=JUQjqs@ZNQ6H~aNqzVyPjk&gJw zik?6Vr|WlMkiEBH;o5tH{E9*!uC)E~MCfLZwKd1!C?o&yABL&Cr;~PV9o$i1SekwC zansql-~)r53l8Qh_=3>7-n>7OUtYyEOK36?9UKBO!bsBbIFF}RjFkKePcnF`=x-Of z@5A!OI=_y~pOq)rM@h1;4s$J-@9+(DoB3BD2=FWTH9Yggk1n9r$v&WRxf(MJtrI=A z_dJobzcS=@rXj829nVJ!f|)n@rFvebRJrdwP+ud4n>~-04$J=9`@_AyUAtBVj@Vtj zIPEAf?K+07)*+tt*hAjg5&Edh5+EyK}d!+~Uh+)63`cBa9n&s7{%A}5?6WhFZ-+6z%)L&{H z2iF9ez0V0moSd2JE0g_1e05;>rSebXUn9wn+5F84vAFfa6&$#nbKPk1e0uPf>c z5n8)BJHP=sPcE_Bm=heA9-v|U5l8%2j^~7$AnuTDt5B`%A@TUtv1i1&QnD|xBw>e$ zcz;ztVVkwfMU6pf4Wrm9+84y;xcE#a^caz7U7EOEJ3@{*`QAHkIp~OySZ@#hbNP=0 z$@58V>2o-*%VwIHgm-&3NYAip2EoiJD95mI<#D*lN?IkasO*D z-}#drLhwSyNe?uPH9>j5@(G^wl1BuZ9bOw zGSywl#EjvtM>V(Nn#awF_}YVJ4OVaIQR2TI^(5l%_6iL_ zQ5jSx#G3B>Ui@1C4JKGu)?AAtM>Ut=RyJCT@0<7<-02*hh{;dTdj+?aS9RjV)9^SY z7y0l`*^VlN)#)@?go{>INpZkKS_0RIX>P*CjXl9Q+ps%20|zaHUnP|^%Z9A`C5`DO zs4|o<#;J>YqTstdjhNE`7mUgPX={H*RT;h(%a6jL+URziCuo*p-z`+f$KOV%)Fec^ zl&8gi4C`sd&1-2V!DR**ALsU^ETS3FqKd+UD_EmFF_x;>P8*`pZ8N|u8^2q|=Gl{? zuUGKeiP`iXq@@~%pV(eLF~7aW3nnP;9#2Wo#u5ruDMc4(i48Wk(l{F&IA33hTYYGe z6c-(#NP;tRSdD-f$?N7KTsDm63Gkt47;5j2%{rX7r>m7fzfD?6v2+QqT@W{7PAwDF zE$Ea!Kfw?pzCn3ng32GUVi|POd;(8wI-6o9==WjzZhZeqPaZyBqEKVw3##OkPX7`` zBQfV26d9z|eLLH2O1$MZ1=i>KhUhGOET49YaahGF25b;DET@(K0Kn9bfP%6($suwkU>kJ!J3O+iBTTE z1Z%8%YH{b^Y?BQ^a+Sp>4k;9{XximeNpS69ULt&cM=!=1O1%bD8njG|#bHzpt8uHR z5^GlJOK@2-KN0til_m1g?|d+Z0kF26BWV=;{Sj-7&QvOXAhZlS#n z*mxk?Z27n47Wu(gzMIvUp4}b@JIm%LA497xes?!TPLTHiTI+;G+nU>PYYIGyapB%e za6GJ+Zw_x47;m1+hqW?`?Jflq&3G{_a>Z-BVcm=wcQ5Hkr`u;dHAzg#XQOOMulXlf z!_-9~ z(+@wbXM#39kRMwK7J6k9bhJUWkrbA_vkFHLoUxsD z+v2!H+V6%nJ86^zBZi6{h|#kN_WHr^c?4^((_VXQlvCtjn$YG7uU^-+trO`yz(gM#TKsr5Ra2Z67F~k#w$t`OMC$6SXvalyRO*a7#VTOl z2U4RDoA*+!DXZN@2)+WzX(Pqx2<a z#dkvo#X((!4?hbpIlzZmzVV}?7jG-eEh4D%G2Ef^JSFy~cX#!S#x(byC+T%3;>2{e z$n?d%VEE{Vd*d1NNkIo;JdrbgAC=ogjNTbwc8_mRof}y<)s5FkUUa*_2bMXIta*0OxZL--=)Bg9!@(wv2iNAi5tVYOScma8>cVBE^e0^2~tm| zY6Y&HNK0(7ZwnO1_trL4{gZZ(xQnVxm-;>S4=jVz8OPNpr7X3aNq zj^u=dic>=UpzjYmq*HE$JwZ%MBBEN)xgEN-&-8= z%Wak`XDt1iMUDiW`vCtX(0cYBV;YI^p(87HBpQ{DHJV009t3_N`SC1=%7Mh3eIGVr zr#OdI{^vkhx#`EpZcLo1_i><0uT1c8+qdfI~if7NtZ^Zq_ED`0!U~ocBBj88xjw&hM79dojZ+psc++$j1kF{Y`>4tj`=wY1} z$l6`emY!bRdDG(NG##|aju>+<<;t-+l6KnR(6R6}uVUILz+Vl{l@j?ZF8H?4CaSZ; zfAL^E2GqS1HY1)hwMT=`EAr#;tdTwK*lJ=|KS8Z`sFaV(MEq9lqONMf(gzR>mPD!$ zF4;s80UrrF;H#rmCAj`v7r5$;QC;B3I31TX1hv0}2ze`oFDFj5*@{H`=1^4>ZoLCh zI%*VK>qCrHWBGB|XjoMN^FDjar6^)t5-8KzqH8K8?w*w2joTA=W}?Y`))hzOp1Phm z9K4Me2hJmf=817x53TgW88xtZ&~HZ+;Q2K(z}hwAXp|jBD`+jj<|Z0!k2NW@%o2{N zW(Zct@nC}~Glh-l5pA@^D{ATNI9mvlDh+-mgzd8+h-UC{!CV;XsSbV_-qNa)V(fnj zjMmduWyaUaX(hqI!XARhZ3VNGt5il@&}so7=I3yc1HG`g8vY7cwVAWnPE&A~8~DNL zT}me%S@6Z;+;(y(o?nqcdKYg5lUXM*R}fQ4mxrNAf_>FAk>G+iv`C0Md)YV_u=7Z& z1)*_uv!W6k2g4hIw(6s>I+bd@u~A3!Y;oQi%NQVeIu5i1Rpi#smw`khpWC-1QX*K9!prFNw!Hz#KuUPXj=X>+K>es z-k1hsG=56^ZE@nV{8~~pg_|4&>o6p`5@&2KEJFWMqbHVif`y_JFyzXs`Te-)sl}+o zUq|E-bnOAZ2v6Fqio*5&fa%azNAolAVMRm;5S;3sTym4?aCwO z+FC#j#&HiXwGxAI;fgLDG4cfp9np9@f_b9ySj&IEz0Ya|q_e)XBA9fZNVOot#VaDD z1eu4@B3qmhTd2hE`V@^A-G{*#r@qWXT7WqjWmF8;5NGn0=mI4QY<9FFHwjLTfmz6t^&IFQcCOV%1@ZiP~t1d~2mKOqlEgv9b zyKRW>b{9`a+C6^)cVc`V%*!C^BIm`d+?I56A}g8*$_kF|#n+b53?a@)qDIrTo`IYy zWO~`-0Z~-^%*jm$o~Apx7GH`4%ZOH3z&AS85z$NJ*Y0*HP2-=b3|WA7!g%1A{@NI# zh=Y(;oL_>~I*JBi%}wwRn&>JmHnz|>f{hZI<%~7UsS)gIE!Dy&_EhNvt4{M+tn`Rz zB}jK4{O`P}fYDfvJ{ZS+OKT+npQ#qI0f}CV1HT5NT&RVKGPaze-2)8xz<{AC^Z zcyx9rs~Lce9uO9Ye3VbvEQ`+c=^Ro4Ti+#a$)DGvDVB=8m%QoK4dHBv; zium~1r_J4X$o?)R45E~ZJuoexYT(5E0KDXO0XQ@Ryi6pfwoCwda z2ecx7F)*lIDlkTl$-4lL8Y=@=+2I&bL^M;rhGJxbyi8!@=C*BY9^_kXvsoj!vzC!8 zvN5H+2yqZY9GxOfAw>5R`VVbrFHx!K)QbsBrRm=nG9iSCI!8;`5y90=UM~X~vuW1L z(HybNwEN{G2>wrB29sVJqBXX#I+OP+SKllf+4~h=iFB^|GD1$w zF^4U=#jV3f62qa{=;V3k)Y zhwy`O`#o9WKvWI+6N#vhVx*OIdSUei+V6zp{2<@?bOz*Fm+nD8BEQRpS#rGfRR!$D zR%cpi8vgqfrqPuDJ19K{;`5tnBCOU^isYu3zlRuVVF#ljfG^NmS*HUUB+GI~LRp>= zJ)o_C$Wv*rEk?f0Sr`@YmH2i&IP9{><}zIS17sAWo@WHVca*j|;BG&fA;VMkw9*B~ zC4fhJ8%{MsjJHtZ7`$mWzaMXzM&)+oD--JuD<8O>>W1J*LzBgLYzi$&QdniJ( zMkkyXZ&~plnl1ZtV=j0z&0lc$UD1$->Gpy9boNzM;^to?ItAt{Ia7EU*iEb|!3BTQ z5@)=;7UrwzJeAtv%9-$M`Bqtx0KK5C(3Rv9O8_YfrTyS}hS0dd*Z^49?1AMx+6}Xk zNwtm`Euq0eEdPTB55i?_mb_8DiB^JbFQc_Gtc-?k(R?b0&~sZDg(g~D_qVi3gyjLW z$ro!xuo&nBZRcY&)~^>mlr;{+E(h5Ra3|id^^gtZ6-Z4{AQ*o-zte!*Z^9)SbKr+A zMkU8__j-cyq2g#Qz>WMOltO~{cSCafiFrpDEOP5*t4o9!qiBSfX#V~k@@QiUZ3SFk z>Zidc&I1NO_B3%ASdmbStYva1Ty&Nv$3`{H6Jp~o8U_Oqr|Ols#LnWglsBk(Anp&2hRJwsaeQ%0^uf5O6%62*5A6mBc0eCYLR~!~nsDGz zl@y2@9(Ydm-&K(D{|?TuHHC#8iEMQFS-39Rk~wnS!A|e&1`vr~jbtDi_zk=iOwggD z`fjY;M<;gL;=hAn8jbNIBb3DW?iAoCW6@y?;41g2D#20l`D!egrhwZ7?*$};%wb@E z{Tcb4xN(}(tk9a0-#9}unEl36UIh+*NPaIipD*l18C~r_JM~2O*C9RuocTG(}&6Wn}z;pLew&; z-#OYhitvZuAxdPp1LW)chw4m;@7(QchvJeSAaiIx+M~v;MhN8v??y$GiIBY>+~nS7 zNI-zNfe0kL-h_m3+0G>p_cTr5PJp{H6MRZ)0cE;xsak@A0%2{x_3x?08aoIuHt&-R zm2L!OHu9pdQ9!#1zSynr$C_X;$VY!z>?rdFY-;lvs`bFV>uIkK{0^oT7yB>#MTSRD zJ2uazQi`>ld<{0fqOAk4W(;5`c?lRoXFP;qU7@NBXZ%UCC=$!$fE?Oso&(mJY5Oo- z)Y$B$#zh9U(U}-Q{i3xYX5*S%M6{Df1EYzHz5(cNEcRl1O@h8KssZv)9Su*diH^gX z+0o!NuL54z_DQ6PkW~IiwL)ChZovb_(5fPAw1Ji0(&scIPDK#Qp;|lqPyqH|HgW*c zYAu@rC7z~nc35$MCBSU{#idFCZfdb?ME(busnGLmmISh`Q9W5$IjE-yH`-9C44eN2 z2hzTgMw$NUlQCM8Q@8ZcYF=L_8pr6|C#-g zjj|IU&ZLzoI&Ax)%81>AX}1_BoaW2%^APx zcB_$Z1j?_f5ld2Kt z+Vmf8HI{Z*Q0C|?0F#<82f_qvphwhTz`QkBv2H1U;9* zY;C1cHu%^weG#P1DV6Y$msMKaIKL+mPpSZCj0{1!Y_N!Qn#EmkaqIEmS2eMpLCX*G zCYmQDWnSsvGEoREQxNU0v#?R+N5-=ndr}sB#4;x7UtQg#v-ki{PSjhQ6o6^hU$=bT zc@xsX=dzNa$Q|HV=hCz+RLAcnWyP;j`f=?s3p1epj%tTs!~OA9a;(nJkHWz-z}ILZ zVHaf0k|oOUDQ<)qo~aq^{CU0-I5wEUhi9U}NS%8?=$sL)#QA{=NY?X=Y>6!(yr-Ao zfoEzeVDFybg6I@rKu&WM8SE0t)8S9cq6vQIuGe5$3)soPa#c63`@F}Hhc8ZT&O@td zuRqZw42Xz>6p6KjWcg40T3j2ff~oM31>2z|J#zfjKdcxcMQtAKwGp7a@6C@IF_Klq zVQsMmZ%dz|kH9O(nY4B^eKoyKpBwvorxATElu>-4W9htAgB}c(Rbba}GWDJU{ zQWW812l8Ro*fNWOuPcTBB>RC^FusBz7$sF2*s?P4AJG=OdK_)W=sOFquH@$%O)(!W zq|cI%?gY|0Bd3H-H0}5}!2raR+3HYAFG2WMTEfS*qkB5>%EeVuTyTYI1h_RJy3qn3 zTJ5lITy!f|S9a;3oAm-1tK37?XdxSQHu!y@#ZSq{Q4L^?F&0{e3{~r}>OtC5p$M*AJ&IO|_rO*Egg2w#GjfqcvUQ$2di1LnnsB+{}eAyv@ilHAkCL|!31cAuVNcnVjPR~ zYW#PE#i~A=8UZ2xwnU}G0-xw^ymSG454|`}O8_W7V;lX!OVoZ2n^Uu)2V(FQ*ql)! zwh=%K>Zch%103$PkV&(eAvk4IwQ2Uhu7+-V{Q0EjUYxKNHp(lHT(E*|Ltzo`{6)J* z0()vXXj=C(7&#||wmPC%S?3gd>Nf!4mq)N#V0~AnM91MHb7_V>_8-fS!U$rSCo$&h z!BwK63Rs5A?;`SuanSF%a5m=_0_$je`A$&_shTPxivc!wnmw=mvNT<1?O>HI2Yq8`wOUNwlU$QHB8rw~j}rUnZjcR1BLI@(KwY zKWHNfdK*c_JGL=ipEjz<^4)>qMHroyWlh3|H|gbAaGVlH{MR_x9%a$dI;^=(jc!=m z4aTmyX343vU#k!zvbgcsY__CN8OtfOeJg69B|EJc#&c$g7?TAm9WHC2trQ=7A03Qa zwR(cR>}aC|*UgGny`7SRN`{pn^YP{6tH_`Be(YOVzR6$u0AJOog` zGuD!G%Ox~wXD(ddp-hNtp98i*jroAYHt^-hDC^vLo?#qk!b#<+8VlwZt<`7YqG*_R zB3&X@nBgl;UU=#oFgj!|%@+f|r&r=yRX)MFd-aLvfJ`gLfB&9eg1_|W0Z0CVHQN&9 zvBRv{g$Q05Xz-ibDbuG;6eJ;ylMO!F)&&mQ=JT#5g8X);zynC#^UKf^TDvol$M`VaJLmEk zN5;H!6_3eeN_M{F!E1+tWl-S>Y@K}duK-YtSEzEQ)QV9s!8^mOm^n<=&V5$Qr&6UO z4*W>vqw&TnYIMM4b2H!}JKDPwTQhQ@dN9QIN_{^zr_jcoL#>%{!d~#X3-a~t7GgeY z=LTzLIHTOzXw4Kbnw_5zrid+>jel`~N3IpnGT1XeP|eOR!iW}ShAAWv>sVl!+A_h87i$(qN%ce8?5t&)K=$Km4UH~ z9;opu+6gE>MwT%V{SJu(N|HqxqR|UkqZ_h^@NHc1l(xIzy+`yJcwP|A;^QK(Xn=En zRw=QAPN5~n>sJ6&7cR=L#hdbaN^r?9xjJIh??`C^Xt$QC2jIYPeI>?xJz%CG0Nct$ z&5ii&jtH=t;Al%$Y#dsZg^$A_j0<49a+}`{(qI;HQb>mU&d?|kp1VH<<~8vd)$TNc;?MwG zEz0Twh%|dNn+H+6^=(fXw)!b03l8*HScuw{FIlyalrd^c=p7Lco=eN*@q&r@dOXn3 z=1s6;ZL!e=al6xe1wPSQZM0a3`6!2tf+YI8A^#UiS030z^>t_P1z$>9!a!d`D3DSD zN!h|43c|1iQZ@quM%J(dQ#J#FR75%;g_cEwA`_J*pp_IsBOpc)4MH(x(V(bN`C&k+ zt!os7s({~leEgAyb~2fH@2=;bdj}^;zteoPL70b#U5W4wInN__(>fT)HnORrjwnvt zz5Gg1kfe5S?6V|M6dQO!a29e(T znKdDz&&R0;BK^wX%n~R0bBNVX_g|gju#lF|NHXx!FAhin1eD?|MA)%8tjHs*HyWJe z;m!yXltb^;!o74c2F8Fi>4+iYU&q6_hnG|jh860_3|(j}J{dPI&~rSYjpQIDwN%!d zfI`F0hTf{TkVFET8fvkyT-d~-t;m{CMTnF;;V)Wbi5(i-^@7jXpvqZdo6=Yo*?_7m z71kN!i^;&7{BsI)OWf@u%&n5uEyn1BU;sKPF3^J_r0M@Eu z7Y;19Lm8Il!TmTNgBA}=%m=)5thSDrCPRQcUgpygc?7PyGe!I% zTxJdMqW*x!MufKKDJegK(o=37bSipM8zs?;6%FL@uKy1|p|1AKG7n<;omo~r@vVUk z(umL(~jfiuXR==a!DzK3gU;CIOg|lZ{`HsvJEq| zLvUOPt?cz`jgy22m?0f2Z^H}*-jM9bvp*RN-+p)(RzbU0$#H1F z`3JbSO;>XL%rheDC3QBAzo&PZCRREnt^n!$O*fYu+QoW}6J zc1&2fgq;aI0nrM$nV%7uBPD~(5HQX{C-@)iD|(3Vs4=*R_TSzEyLrwn!7mGEjNwsa z>{@8aT$TB$u*R4+l24p0oIytS;s!f>wkRyPjgYD%T^UAp^xp!{vcC=193(l!n&3K_ zDPn>t4NY-O(gEP>1#-@ep`4C0MPHRg{`XIT~*DEYg&?-Sti~VK>aLe{4+(q!*rL83xzDob-}nSnTP6VmCQh znxlpDevR2ssW=WfdGmE12flP2wjWt@yce0+4sKPR_n@R8Y$prwC5bZlO#{e_Iue`4 zqM2mf-uea--pIld8CK2|EpZ)$Vy@d&V}X%oh88fcsXVg%meoL>FSOdo?MmEyyCy{; zQq{CnGFYiF(_!_K37=PDHwUk)@Q_t8N0=&~Z{s!cCBI0)epJ~0wIhwZ{idX+C}RC) zjgjVSkpezAp%&MxPG*9R9Ql_gTKR3^Gz9N)UUF6}AL4?|H{cwU>l><)R2T$$%Zm! z0W~#S>m+OTX+5OFm?|U*Crf$8ka``$svpTv{}$w>Qb-FIP(jJ5YZX!G&kjW0$Qa{u ziNKSz(_dGGiQ#dc?T#G7Y)GVQBU+m={S+`%tqUi3n!|`~xqI|{$Wm>HejgKZ$>=8B ze#w`3?9%WBY6C=>%o=Cv-CG!qn+2F@lg57O3BrP%A{pQm_+Xw zojTz(=ovzZQL&PA5zY@g)?g#1XMoBP`F+WS5meuY1_lR4wsl#9fA7y#3^I{u}FI&%wU0*WaY-1Fd#}8?cw{)CMt|x4 zQJ*GHuPjzj#I41r0yR}OvTdB!LR$3Is#b%TUCQm$(O`X&{M56uoO%*dHDM~>I>6QE zO+iXXM4rMD7F3J|X_8dwYT+!S*uWw;Y50}_mN;jqF_BZPiuFS5yp4eWh9cnUISBeL zzXxNkJotws!_x+Juohv57AfryFg}4Fxw`3jQm4Le5ZmO?7Nqbfmg{3%v5!3WE{6a| zJqNl#KL>?mr013bR zKs`pU&cX6254C}#_-spkQY|uy?Yaa3Qogvbs)2kpl7*U(AO6NgtH$IEa^_>!fSBKC zv5@Uw7stpG_aP?@8pT0kLQNXQS4!Q}ab>-D{2a<+3mE>zd^jpl3u{nLp1k})(Pu-9!E=Hnz8-EtVs-d;m ztxu>k6%Kiz_qRk=o<(}S$OYX%5k`>MK1K`3o^^-^dfegwovUm-2%RMdB}IL@wPh3n8U$m)GTU>g%y0)!YFvSHJ z_$D)q4Mc39d$%l#v*M=Im&f<644ulOl(AA z0?|!m5Yc5fsyt*^>k2nn`iWI9Bp_f~6V}G0noZ&u=4&SmuA#)Wmct$CDaF9U#sY^Z zH;K8TpjMhhS9i>C8mYzg{{Z7{+KLmImN1${l+nx$$SlGH6#f6HFCnILRWgycU=KRv ziOajD88!KTmQqcq>HM#FBr`P)UN2cDK^6}(p*b1Z+U%j8z(GxzDEomxoW*Azpt#Rgiw*OvSLiAYLT#|f4B4A6_VBjJ&W|Ps?4+N_U8_C^W z@8cw(Fv**Q{N&W*UYQE*nn-p;`x^!W3sYtoJ+nyG&pdJZbBGiKaGL7J2|C|`yG$JE zQh)|UhY>~y|M9|@vOB`!IaV&>XuHRENq!{yADx#JMq^7xBkk7-C)ZT$ zPQhWcil8;0nA_kQ%CmFvQPa+BFrZU4(iwzBVdy&L>WrgR{Jp{kq+ zVaeTOciyyJRRt==m*AB7?WQxWgM~V3sy%q!@JN5<%47E?Sf(+j@Et*$f(o zWG^Sf>LI-~SjO+1Rv%Bx-2CRTjVGH`deleEVqT_i9(blkFn@15YV_)Q{Hip8EcFQF z+3>Fy$J;i+T0fu5%RJu^L=0rW{WzguWex4g*xU7Z`vNlzCyq1BEs;$h@gvG#;t})a z3D~(7EpYIAuT=%f`{Se(Bt!myr83FvQ#_n_4b(i`ixdLVFJGzhgD)vrT9i^{%-u5h zVp-!2gVQ%Y(Q%wLC(+|7wl zfQFiR#dTPMsQN)i;7qAakfEK&v`MmHPL+Y|e-454Psr@Zn`z!5bTotMv&hbgETAKi zCs?8r=?DT}bFycoRUnJn;5ftd`Z}_G2D3BXYh|INR}XKLVwxh1gZI1{T7P+2tsV64 zwdN$ynOQHCk z2%d)yOA!iy?q^K{N!2r#y3-=&WQB8SXcfmGQpaXUF7>2E>|9Ez$wxQ>XWZZb4R_2K zj?lgHOIeI28xN>Ol^U>U7LB)gTT*gqV&7vpyKVmnO^W(IOv2>~PUKv|cHElsoe{MV zxdOg@j7`{P^o$ioS0pi<6xI%?nW?#Of%g~;=S(4`bSL6n;q`6W?rE~&AapA9S&@sl zJ8+2mMh&+0r$>1N+3sZ|aL>CnbyV23AJJyBIo>*TrxkDkr1V;Tb%MtHJBy*)Z%8K8 zen&sZfF26_Uz`aQm~fH@kaOIUAJiIo6+}}W5kUYMB3dL|%H2Xl*|AQhN)JHltZEmH zZNKcrZQ^{^tn|}jyeEYuz!*F2-9|11=Uj^c5a4jx3N(+lTn?~ zk^E7y$DD~IDIN#m2HFomUdhWsMKg0h!UaYs1 zk{Mb9+0_g$Q?_6+b-|i);(Qhgt^9qIn*`s6H~B_2q%g`-UhYQxQu!ph2H5U>FkI6okkm>|h*sOL~rie~B}{kI)n z?V|Fmk0rw#-Z&FpO}_m~ih*r&^*f2qp>rnLrF1s+yxm$VZ%cgl4Y+HY(sq| zw3#(i)+%0x{`W=Ft)TgY`aQ`G^xpqMT4Y?CZ99kinoP(?E*fn;8Q1jgkTQMK{no zgYes4H2s6fNfWfQLGW^Cl3QD+rVPy$T z^^bUgBut-NW}~S;M!>vyK4o<}>Ytepb+M%>7C1I=qm=Uie`{jiIeJzPNtXk{2FU-7*h;pJOU@3b4xWF|E&`&(4x(;MVN&YS&7wIatZ*Hf`m9Frx$}=4}uDB#3MbvR! zMS~bo=XDiZH%e!!6VR$lOaLK_yaMYHGn&Bu{0Zxt$S4L| zd$rNiMi{^wEHORBX&@OJs`O-hs~QtMOM2%ysnAaJtR6Lu&Act>$4fO9A$zFNwVgz?QXSG8lhHqyguXW> z)U-`Bb`3pE+6>`k@^>F_#1NPuIB!Pcw_)t(f5I>ApMgc35dl!})cs6R?cK#OqElVh zUF?I}=kf01jz$d`>eL=$2hp!S(?e7mrJJdmo}vRe>8PIflC0vM;(9Tp{?QYEH0)3x z?FC(R}2+ZCTP_Sy~gG8!a z?cE1;UAH==k2s;ZFaV_SzVP;`^3ez$I$vO6^`k!GOwp&d?~5f#s-yafpp&b+`eH?F zYHeR}Bx=GoyJ%`29Zh2|FN0@j8bXAie05bysX75O2AI(9nBn5m!y=WJUL`7}WPyAa~XCT9;SCx~Hf$7!!LUF3- zd{-$H2aAJ}v#GrIb66J-&BJ}BKZdKjc}8m|N+EML15cfW27^9dq!4)lZ->+GXNCge zKU9+vHX74Iwha(HsCv&FAU@le$_KBSBkErRa9%;}`+(R3f0_4yxEcRzctCVf({`#n z`3+2hYoNG_IQ+Lvk_)iCd;WRm_8h`PaAw*zvR!0b%p*B*4^YI{>CCFWAE! z$nipirOM$uh?M1(H9SnXudNgTNYv&_M9l4*;uyh^<|pda0}7&auZG2&{G=nU{ya#` zEr^g0e&(k^Ay-CEOf$(1t({xpg^*OVg7dyofV4<(j>ndDmqk{ZqQbxzi%sO#4kTsL zwJwTqAIDc;6>k)hjyB{jUHLlntB~c^&c9oO>7Dd&|NCWnp0KJx&y-NNSN6tJ`Q^v0E)0 zjM&=?medmm%RE%5!jp!Oik&dWsQd+L*}2@$mH9PTe>}Y&o)ljBY4%BVnyG3q1MdUAg@?Yh9$0!E&sf3kkITrFD}F zc5cO<`2qK;ym7g#oEkn99U&UpGzzjO54~O)P=6aDj-4Q*;oTgfp4O)%AAI*f8U0~O z+E}uf*nY$u17RXF6oZdxj1`ja^Bp+Zr(R~yAgxq~jS8<47S16pW$cWy{&~sQ7Iu0s zOR9mPz-66AlG@Me+L8b%ZXnJ)-dF@|%F>afn^jQKryWaD`eyqMgCkT}^e)pkC3l`< z{tR-2FuRekLA+P)(?xJg53JyAOwWyg_;2XV8*4L`KqO%VEt5zv3Ey&%Iq}WE{9cAd zD_rG((JH$nnZb;-{nTJaBys2q+_S$Wo{2?WA3W`F688@*o=w7L=2we`iGxa`aQjDm zoO8E#H|KbjP)^S@G~rt7On3E2ql7pB#27%Rg%^byxy81`=)Zrg+uI4Lr4fVBlSZ4pv@u4Hsot$1TG}TdAix@bF5czm^C1eZA7DC`<}l zpjJX2y5s==u<0UioCq%&V+QiY7A|G{l`MeZ*y4iNna7R)A?{9quqDvpMPUS~PcrewktK6@dt64qz`e0)To z4J7g55n@lcw2dRgycSToyUYojbD>tUz}hW6D3z$O5hB{~Rq7P`G^%T&%1+U$b2cZ* zMsQu^BGANTPH|Rg*G;%{_mkBDP{5x+!l&e&wMNOD3SN|Z=3&laj(t#k&&Hnl$&4Dy zs?8iOlK=iwid*Q`PZvryEnV6w!do}ocQas}O_vLKu_V#B*lZyw^yg>L@>EmFl}YKX zFExJZ12l<5;rSgJH(mLiI;BX=EcIiJ8ZrMWX!vi)HF~wKC?^+pq3fP{a(?$hbcy$Uo03&$5(ybHZs*6DR z!^R?{`X_2^XeZ%ieb1v6Q9(9Z#*lb5*2*@+ing3bYb@koKC__?ceFkL>g7E)UB|gr zh1xcCmqPCl{d|^U#9mk*BY|ZVXtMXSI<)1E<0CDs@@52kB|wS_h;YtWGL_iQ!mc_$ zgr-J{tR*DMTNb{4&>K^;Mu|BCEF}51gltdf@`~ir(ooltu!X7chp-&-oxAmZ@>MoO z#dIMP)b!9)Ja5D`dn*#4MA~2GQfH15+hv8}{lg{jcfuqU81V%{`_*@cGdYkR~>r zmC7?n;uB^^7vddFA_7d_*x)`jo>X}31)bn#+H6u8z4%9QD~3p z0|?&s4S<9Tmw(_rcH3|9P~zfBgc-tc795HKhWsLen9zU4)g~(M7*GvE>z*RHn^4=j z;~)0*bC)ANv?b?qim5E?%IpjaSB^<_bX z*{7KO0b)AMEv|C67|HpxVgr#2DncYy%o3eR;dZM_c$1aJ@wvZzX581Nt!5arWj9zf zgItOu0~Wd!NOm2KWuC1}07q|JS%-4nGB{o3=uJl&OqU?kL7J#Bfqnfy-f}H`u@MWW zoVe>S&{(?)2*}ktni8rgg2RH%JzJTiLi05aH)uq^AezsdUt}pI>-WKi`7_Ko`GHw* zZSNm}6;Mu&L+B|Cyr6XfRj}b2w~b@2=H%A5wJGX+_X!8KJr{Fzno|1bEUa(hhe@!+ z>Eoac5!-rZ>PbB#rWbjHLo6JjAr|>9?KS!fKyjB^a%B-_yJ5{854J`#S5n|5P zBw>IC%sPX3@8IJVVPfBhZpEZgIYp!mxG3id=4wUsUZ1QDl9{ss_6du=DE0wL_D`fj{NJLuFbA~f z0&;4iBc_JNimbVXy1Ztnh<_dn_NT78&W@B?Ggh=@mO*W97~PD_?N$?0?~WCFO~Uuh z{YQgs`pbu4=X6+GM=~66Tu1(dYADBF@}{Y!Ndsg!y7KEXl*OG62%mD|P??W-wi_+| z$c+Top<9l!DDli<`u!wy2Y$2sK{2-!S&hA}$iSzq$Vjn&v!=nkECyQH?G}fn#e3t6 zI`L*&cR8={DL--s@~~dqt(6x_bZX2*3nP;LEzImj)hZ zwJ}vmZZwuW05_lCTrUIIa1~JD)E3-L*H)EjssM72Bjae6a@c5WnOFuBfC5#W`j1QO zhKg9hII$yg(DCEMnT_QaQ1(iy?~N13l?HLbFAo*lg*XxgVLb~^1!`{b5L8ej;L&a5 zGl%@{dYPo}plnXcKP>|DF1x4!GsGkd1q-Qb*+}?zed%<-d*4J$c&#kiih4iSRWAmAH2S zbHY#r&hZx8$$jHFzCZXSX6QiHe9H~LvTT$@5k8LJE6G^JKi-h^Su|E~Q0o!y1E2lM zc(G$kcOLa`{txypwlnV4)5JejT8r>FGaXg)9ujlzcY|?khUp*lkZ8@4w@|V&+nlDc zAA3u(`ou$G`#xwkiy+CsmMRai2xf|$hmxi8nGB?f@T5d&%HJy!n5zW|zg=V_4L<@+ zPCSGMmjRFnt%dUnmEl1@#5No_`RIOpQb*uPP~pW1VjDcF&on`7RS<1XrvJg$^#_!} ziLFi>CZT`uMblmP+HcOSlF;|3WPE|TvUh^m(c~XOqw-NRaF62}bC6#9V~$kPj0QXY z54~AiuOYPFKS9g~>Xw)wwl?{v($ot}q;L}&n)W*cMIN}YQl^0^DMvX-AV$BMIZ?Dp zq0OXhN4*DQC=ym0t9wwgs1HuW6}r?#_%mwlyC#ZVySR1;E+c)5Ts{ZWqDaqI_{mM^ zaSkEltdvw?-jRg4f1aJ3!tGK2nJAhbG;Ji|mc=gK51ImW8)Hr;gji@B;tQeJ$+`Rf ze3ClG)7x?%^Po7q21tbAQ%95v$t)PYUUdis=|H2R7w#b9ES@B`X&mYZw9l<>o^%gT zIXp>h-z(IQ$}?^|>?E|2`JSe->3eQ=cQlrqdX%U?xyM*T>vW(M68|+=+vjdVH*^o* zV@iyESRCF+$XB=GXFCh1lsjvZ>$Jx&5#>t7QNM zI9QyK#D9_L!DKtY=Ut%*r9oZp77KK-R;0XX4Z5t?gOPE-Ew%+VcHS)(g1tZ=5hnov zn(>HeXzs?4l_zEvp}%B5=L3YkV|D6=M?_0&6T=ucRu2BkwIGJhxJLpGoAhU8jF_Ha zU@1HzI>iRnFj?%JEh7bfiAW7N(;E+zC21_@QOTx0G8trif2SX#;6IPh+96$7VQO#1zKGZkr;O1FCB~RU9`m)S0XuTO1+#x3ZGf zB=`@rbtVP(RS3in#;2Ctic0QI=wLEQ5k1WCT4*4NJ!VWTB-ibd3r&Zua>wMwN$eG7 zQ;!06qOM8ARKw^CYQ{8iOC#D+-7!sE2kX>+y7(wiuuao(=jG*8Y1N#$_2idQwEa`z z#N-ME!xa+i+Zg7k7p9B-9>Fv!|S+`~hw zJ>py#+|Dz_UhP5G2RDPFGI`S&TS4x8E(HL^n3>5+l-Gs{_~=!Ti*ja(oeeQF2|WatA%jza4D@}Ye+EV}2#>2% zW{K@GU8uhgV*c?&IfxHzn1x)@rJkJyIW(z1&k_sT2tBB&YEhYu`dd7Rb<#sHi~^o6 zxPj-WF16=uu~#EHL@k~z=4RR!QCGk9Wlj=n1%LhgY_Vg0Y^pFHYNVe#CM7(<>IMKP(8g$+kLpKEy);|wbHBSCMq1(aTFyZiPf{H^N6haKt|sq95CUH_ni9fM zBgi$sBoNpLqnW)u2^}c5A(zGHH_ZWV8dZOrBMyYxbn%LZ#I$b6)lZuN44xxary9+i|U)L zb-*87{R%;xZN)aN4I?Lf2dJ`qp*BJa`f2P$IB9eZhnGXVFYGNY^1%CQ(nLOnZYL5t zjQJDl5TCf?etRc41$_GtK5;kz*Dl4Pg1daPSbXw+XD<>P55S=7JaMh$hE3XA0e6so z0}iTz$$zM)=7~cZ>EBlAe4xl4)jVGe;cidQhmlCA;sOLkU{1)N@V*$~iZN0lJc^9e zbrHeg)W>V>=rlc1oDlXI?R_{)5fJyH6Ijxt#*(MVTU)CHl6;Z5?Br|*Nj6Zy^zQ)y z<@$&lgEcAW44>^PmXv z$~X!C371&9M0^3)-TZNJSR;B-edKX*Ilkz^t(Tys?C;(OPi3nm#pP<=dq<4!@FCS0gG=2 zMiDZvW+6?9PPqS(xuQY6Z@D-CdD8AH#WAX_AC2c#j9xAtZEELpL@0ved^AMi5*E#X z*PS^P*WU+ZO7NC_fC%=KLSD~-AV{0+U5pBUu2(8od#xAub_X+dphue^^Sa?)R@fz_ zDU~<-%&^>rN0}_qqa9r$@}1iMDt#EFmQ(3db>(6!V+ghWy&nTIT{;JlD^~a)KH%)W z0F-2KIRN+5k0YE-A7Umn8b^_U3WGl4h-9vf$$I+CvL}#hRqaHmsQh>l=EAreE4}5P zbt2Nic`3<-W|1rtp9-hM8}kWR!rb{1zzsnFU6S0#fiq;ilD-v9>5G+Gx+?0H<&Q~iJIB|{r(JMy>`%%y?2MH8f+A;+w4vSGHvuQTn~Gg}0v z^7Y&zA5lUz4Iqi}l9KSruQB1O!blzDeI(5Mr1#2J# zvEJj6CdnT@%`ew)m}3p9n<@aMrPWx4I64b4$Tu&Tp|;1dKy6jy1~IR3oLv7JfZE^< zVrTgEMH`@Fsdr!7AnL`;5~}?91sqwdZ?v*OJ+TqyM6X`n2oqAGj@ks1A6MsZ61x_; zDY3o8`{_M)21E}Nw94T)Rx*#4$b*g14B_qiC`p-6z>nRV+j+rgXa<)80*>$umQcRR zgeEAVum<(&Ch=kDT;XPMRcSkGMFdk0yvTU6zo^9P(IXD*eg0&Kv#@3^>LZK)#d0g% zSK}A4SGNMM6h5|S5LIbfGd>R>3=)O!&xk_z<*nwJ3G2gY5)lYg(Vmf~@s34_YuVg@F;91x46)##nQ@bfOLN+4nB9G$qYPb9&;q zVa(TrEIcLIA%!o1bc;$=*~7r`Y%VFC59G>O6(A4RV`OaY=MKpvBLdMa<` z?W?g~JY^8R1k;M>8?m5{+(sL;M0zaZ#L2=3focrcjnLPvlb5X-2SXC;v!&LL9O9DT+T95Tx7F zO8+d5lG1i%Q1AskIY^Ux1?TWvAnU?&N6Q3Eyek9l7RzWT!>Q(8G6V9RKg?^PB|~~> zLb{C8Z7Rhu_2)Fg2cr3Pl@VRY*km(IuJX-0TsoWlQLppRFNs8PnR-gImRqOH*L)e9c+4%52UFP@ZEk@IU}>ppdfZ3kg3`C$GZW zdB!taE8Ya^Mjvw$WO~x%I&JQ- zzlQBFI78N36F~*avn76hm3n9)4L(0XRv{M#*}aeL}|3cWOFcCx#f}?@WVQk z`Lb!@sG*1qghk)*+dVd!SJ9$%0N#YiY+PH5p{1xV)tzSXc4XOEs|gK1%+QAXycpK< z_M~D|!9HRBT;gjA=eCv9QI^1+p$ znkn7-Fdw7-Gmbnx$YXhu6U3sb&1L|B-y3Bk`Mrx3oueQpWzf{eA6M6*3^p0ctbDqO z1D(n?o7GNoLoCk7?;a_w?o>rnwzD~UV){U9OxOEk>EzA_B};epb5;DJ^v+>eE+OX^ zpp(i+hiZX_s7kd!W7^3WI{~V|o0vC17WAwRz?VJ6(J1+aol*llt5C=5`Es+r5Pe@? zSDT=6rg3#lCzy7W;9%wQPcSE;)}QaDIzh?2Divj>n-ap`+_?vRhuLLEo3eHVZr$Bp#FOP`2(jcstS3X*g#pcu<3wvCle905z~t z+%|^V(tFjf?&(?!OyBxi{OVdGnA`=I_&B?x-><8z-mCrPNVzWmObS|8my zTdXai;$1yh-Rg;#5N;(6bjUMXuta;}SGkORVMHjibP!AmiWVt2s18e6GK<{4d>|^! zt%{H~cgmbPCA;6?JRE%VCD`nyr8v0RL}tfCw_$kOJjr}0%pL0kuE4pcy$V2qjzuZ* zM|M$=G@cFkZ_Qsg>gzoY1-S6U&5j^vbMXH>F;tS_`Ql+*bxLxW1&q`A7K@a6@w-}l z*&&Kbc`RpMeV80NR|^s9`2=j-3-jR;_aD*PY3J5mHBO?Kp<&9gss<$UEZLeUtQi@9`=VIsbea zgm*||YZ@c`@v`r^N-USr=I~L$y4K;Mn)H|t!NO^|U2IbTkLf~|JXYzv4>&Oxb#P{~Kx*NL zU)Tdq2nJc#)kbK@_b`u3dv-=1&xw$) z#c_u2u}61H0RZ`yJuKLkM4o5qe6s%phpNJ(m@SV4`+-71$JF#1T!(q5|4IRM!wzs> z!&=gBK~a>f>0T5e=PogH)896h^d-VR=I=^=Ov8@)(Ncj{+WFcNl1TD6_!6cf=aWl) zS<+0LQ4aC0-NT`#e8>qXImvdyRQ~PgD^M^Jv)m};3D?k%j;g5*8TXQfVc~b~ljJOx zd>Cz4-@ZSy9GK{9#X%CA4_9tm&F8}dBNEz?7H?LC$+}k&Pxbl_O+v!c#&Qc8ky(LJ z^xdoZ9v&|)Ct+Y*EyzDTien_)H#3DfSLN!{J3&k#A_d8ONEn9qep?JEB2awRDZG~g7H|a2G-Z} zpAMC1(;HhPKSGW>&v1_Mw9lmmwOI&bQDUk;giJrFhC`wW6v3L1=*@^`>y*z6o1wK) zweN-ohqLMU{YxYd?6PFE|ljxiHj>LWSF>X`sqytQN+oc{YIU*xIlen))Mxcg&OC1dcS%Az_R? zYkEN%Lq+edf_s&NIg%Thb<<{M3pJg5h8Lkt=ek>E^6zZqE4CH`B#I}8tp7gGgoyEv z^X52}GrokGH5KHWV>D3zd!9{gvj@c)MIF0GY~KYA=+RHjs5EyrA@yCe^)ikdZU>qywGRTQpUyux=`R4o^RJbmq&VzPjgJPq z01u(Q>0@DeOJ2oj41_N3Ykxan6?&AS3PeZm=5=(r@sODoonY}T#u5o=98BU|zQ-Ui zLh{qfa;hv%Bgq-NzEYt=?|e;4=RRn-oadx^F<%Nb*S-H^-|rBAw|I8;nopqEa+xN3&_C(dT#jbi!L#Uo=PQZf6y4Vg=fhN5!_A5;_qjTED5OvFkkP|%>#S9TruYpih^WhpdUc}4Z z25Ugb1F;Nqp{Bxq7NyO8I8;fKhT~tsi<>1wbMc?pMg=0DUO(Afj)^ggp-S!v_nBo{ zGOQCMq;AwU*ocsR5wt3C_pVo*v1AS?CoJ593}43FP06_D;3EVU20(>T2XPuZnT1$o;#+{U{C9vE2?N$^ zum-yZl!d8lds}am1}=PJPE(hEye3Rd#^12{uF{(X#|Q8Pp{BaXt6QENoS^=OqGCMv zK`%McWq0Xe*3gOkvWlmrw>IFb%rRWQ@ZtrBla}Y?Suua)BTa~2(jBi1(a8EgAS)|h zpXznen{EH%#F&Azq_R4?&-hSnjJ7_$zSc*#O|m&$bj7M#Nac~)rK|bq34>QxTteDB zBSm3^KKzIGjDPuZnT_h(4U8tc~&$ICx? z%U~LE^C9KRY7zU9cx7`LrTdycqT zNcrkdz#ThrobB*Dte}!W126ao>$rN{twaXAErqLB9_x=AR5Fs-R^gksy@;(kKk0R; zqpCz_OB~;GtD~GInt3%bn%cVvN^N@jCDh3FSBWiKf-Kg0y9UfDJSD1#>N{0K*gUQr z{P}Vfk~dp3bTUlCk|_mmn;WQnalRDDMq7s$zY^-QdEr&4{+uPzpEn5{I%-_reWsrZ zxj*v98a?zO@~6gehWVhcuftog^$jh^f|g9rFn!qSB-`#vNi0Kj7v4Ycm{*}n=H_C7 zJU*6dP>&WMX)N0(_JZ%;w-3thR6p5=;azt1);_U)qqI(K{RSMnTP=D+e4xO9hMoHy zHbA}Oi-P2~9}|wj`>2E1jJ#q7Ko@5LBaKZxgrN?RH^kwkXc}A*=k(4@6F9i!%>OWf z2&@S^k%uyU4`MpT)8N}07DdK9+mt5*C8*|;V?As5BSSV#D=H_G4siCR>7NRjD0vkn z^Gm&eDGm!&eC-*L$(CmzQBx zmpoOAy=eTWWCQhO>l^ruehW`i-wSXpFKlF1K)b!GmFb5Y=Zk3?IW`Q5h0=S;J%3r_ zP-yz{L*_8`O!^TafGhb61i<#feelHkJ7!n~`LE8LDzrL}3)h5qN~Jiy{`(mkEcK={ z6=5>{VZ7uvs|b?)$15Pe9$q9($E6S&Wq0;xzE0$y8mSIU!52NXNEJJ^;!~N|FX1A! zI**S~?>1iw_NK~fBOJK@QHM1V3@bV22;rek*I~Sb*GgcNl&xB&=8uM3T(zn+IA zDobYqd9rKpCWh2AZ;SbDL42Kz%iX#zgYyG!e=`^J0iPHO$_u@5s-Ubv)g2T&8sjZ= z!bN&evIABqpHWpu-oL3)h^sqVU&b61&4VnAj_&A280&P^oWK~?mv9I2_Za1Hjv|PO%P#d zJ!DpRCXNI&C&PhDSl$B$8hIZV+?H9|B*|Z>ae>@)z!9UNOBeBty1$>&l+($V@8=M+ zrRQ^AfFFi!c>QN#j>e!NW9MSQe>u!2tm*0HGo`qcK%XZy4LaGGo_GQ$zwjtEL?61r{h_H5$!!|#2>R16E zh;-pT4&d#3u0|%io^@c;Iw;l#l9aid8@vG-?BAs}zPpu`&?*#~%m`px5V%F9-&Cs) z6EkZX$kXV|YeIVU!RgLERpEkVH{)KHl)~V|v}SCJw-Y?8F#HO9@ZMq^_2_vsPIljK zeCb9#0}q#4@h(m*R1eqs$dC-AgC~2NgH--yr`eBI{`;mt*h4?{<(v=8wa3cRG+zBB zCr%oQhrnQ!|7ON|UaA!l0W5uQnK?{Lu5Z+!oLIfMI!urL)qoMmAq^rCrlexU|@tL%g{2A+*-6 z29Ai#97YaXU!zF_n0{637LGE1Poj+E_@wZOq%mRdU-ZV*vq!{^S+VZa#S(~(>Nbuq zE8q4mn)Th3dR~7-6C$>jEDmUlZZ_+6LU7znN0>OxQeZGT;~!w2&ZM-K_W>vw0F{<~ zgO$sB1}~F0Nq+db!hnT3D;f{s5iswb%t_eRsd&te^D-B>C@&fR!QMrS(j zi^oJgCM&&C4V|eyF9iqT32V=>x)$V{(<~{GOIZlp-@M>r5lPr^ha*ZW>(Cw5s3r=uADgfI zWH86^)RP)-3i$YJuG5KL4v6KypE+<_IWGaRc=@&3AY5-FNKYsWCR=Gz=)fnxJ%t_9egF z*7xBA^FG2JIU{Bp0=lpHaTCBLqonjBleLbt|Mgxoq(1`-h37Om$*-Ha*$Wg(3bs0{ zwpS{NeRClBKmL*9RIWxeLiF$;9n;RV%pdhYP8>JS}J zai=UoeTTPz&Jw7*m*ej{fMiHN5P-+9{hAUGbO)@$iiSoxB@3+X&st#2zDwp1c(rEe zDd1x>tnBUx-}rxcL8@>Szxu0pkhZ6P?1k@6{}%*KPeLm&_nD@?>kd#s*^fb*XisHH z$a3DZSe(SWCmbbIy17t;Q7NSp_*}B&s{71#b@Wlhoh3QMhLOqb$tgEWWD&zr79UMY zhVdCmzu>_kW)kJ8SjppfS3ZekS?U;4yJx({MBTP3{(6l%LlJFui*FnAj3@9riv*P!YBF`{E!U zc~TPtE@I53fZ^+%0nNO}3}fN%wjxtd{>Or&h$+Frsla?=tcP&K z7+|2=U=ST<*~%kH>?l^ubettS5>Q_4BsP{sdy(*M6tyqCk8U+vPip&AE2c0A=`nEL zXk(Vvyuq_YezK#q4zGv1dVyZm?acL(3{tG}W$w4{->+bp=}B z-}5y(3*}-UZ|c|&K(S4t<3Op7s0%(2yP=_yCi?C{euyTca)x>DF0YfOPMxhr!=kiL z73~pKxARwF%!CJbeUhiX{Fnh~Ru!KCr0No7Nzy$-uWN zb$B2sACaSpVEV#`kkw|3t8M5||D(u6e$3aHpxNOAup&xkAxwkv!xFOz_Emy`{6CVe zJ+P(o{hyq@;SFgU2S=o;aY-evaj*Mv39V~}QMZXpNH??0m@?#SWK!1{lWt?eWJ}E@ z!{~fLKe#f*#a5GXs7#&0}mO#=#v$V>cTAItH~HtiMkUgfr|c9+dmEDN`V5EX<*D z<(~lk;iaEJkwr4SAw<6?k7i%@LJWBecH(yTjw)6ly`GkLpMBsH{dr70X}wp~gc=(Tu1}mDIyR zo>nXUM@OstNF*l&hYQMjLKXe}qLHjrfx94@+fljbs8=TLm!d9%EFXdff<(O?c_2(H zGtr`VUs2g%CNA!9fN%?1jGO)oHcN5*0X1^CR<=ZTa==mC>*=L&H19XSa-fgy-ze|NGjBl(G7)uB#I5W?L6 z*!RJ=P`0l3#&I~tGO|JC@5Uhnjle0*)uWCntaHo15S*Vck4n8GuXB)qM{+!C>5B+2<) zH1xWX2^Tmwpv#3oSNUA;ccNSw>@87`&H4aYs z1>{Luo#FiUMu?1dZ4W~*Ub7eVHriG{%s8OZ(|6yIk$)S0T-8ry4FrxO(kbX?WY zkdsVXmhMsKkQoy&w!+oLCS<14R%bOrBJkum>JuP$KdU+>NyzcdKWXw2ZVIZ;U;kN! zHQwYAD0!r^55 zXd2wu80Q_iDZh^D*4IEK?)I@L|050F61is7{y+=kE2aNsua{GY7=Olx z*0mLbsbqU5s*c9DLtEUyVsaf0j|AqMM{ndXp86CL_N7=v}jKv<=>5d>&O zB!iGZh%Nsa-jD`-#>PK#9U`o| zkeun2uaFPs2@>9Yu?ee&@fxmaq~}bWVWr zaAE=`-7FS?v|{{LO^hr#j+c%8`%L30ed`E5r0DWS2*DPVtG*pMpL@@-Ryjrapy?@_ zV~LR4I##FeuOY^JV!kr29`C^Dk>m%WoJGvH3hm@_Tcivl^~&RvT_OS* z*CO=}BfaQ;4S>vdN2G1YA`eTMBwN_n?6OS%Qu+Ml!T72*i8&1o(eq2;Mgw2Q1@j++gtAcJc>xqd+9fN|(}1ky#` z1=hgWClT#!@>V>OuaB5hi~Rb`0u5KNXx)I%4F;KP$>qHwCXIRYyjlAClF zf+!;F-Up-PYLb!PdEIb~yXD8p&3s^G0-r~}c4N-ELqj7~DTmeqf7+4-6ZGWx0w zDCX{#TnzVl6L7BIFzk$GoD=H!!&X9GI+b@+5e`qhX+aHN3@a|5XZ=Xwm*qY};V3sG zH|!w}m6dhDX9)U-_niQO4eFH}$(J1kM{OD$wgVy>kuL%*#oz0Mk1i3-~J(r z;m3_!LRK;@s5Kv6?3?4D=;CP~SWu@fc{5S|JvbDGteGHx@|$N1C2}jBVYl*q%yduD z6uaQager*qIY{NG^onOf6sEBHNH!i=x;~KM5&BqUG(5`m;q0Hv-dEuAm85?I^%n&G z&!H9No78dY|3p+n9lyw6MpWLhmc>F6#Xlj-L*@%&7}HB8dt+#z>o1lxA*VdqG4dQT zPdQi2NihyHw}j*jg4^KfH{BM&eoq&T2C}SHVVq23#QQ^k%8ipPO~lG3I38AX{F!|i^hd)Z`4Y+KARyL|qulYAZwF0_2riZdmvE>KJMKSqS3v-NN!pqWzuI-V}qI{=ifOD2-5q4<$myrZCE_W?JmzPz#nw82Xn`AX3?s zo|{9Grm3OnA1=0-$tORH5s~cl0YoWO%Z9Qk4SPBfBCzxnDjQH~Y$?0t@Yupk;@Bcq zV9?i69HNSCqJA2gJyY~`Cq?~DMF^iSjg|nwdmiC_xVc+2KCZr@3_Rq+oe==ji8hGH zT(JNGwSEg5anFV32=>PCG?ufYvU?rCm-Y}6lY~AoxVw{y{wVOmd-v3!av?3FIn;PC z7DAcZK@nj9W0SZkPUUtJEOGLx5Y=IN=g{mhN#UWeJod%xg0r0(9P)FJD{k&nyr5iR zEb0>qAkp&JWnQG4R$eicQCX^FGCuYuNRg3^>Wx*AKkpCp`<=Fsk`HbRMcDJmF{g}k zptJcQZMD2uI8f7IZToK2m@%-XY&>EJ-`W6Y3x^3o6Rwk(>CHntDFv0Jr1A<{_emJ@ zg)>P}d47;qd=o{V`}@DbM<}88iyx^oX;%H!STx<@IFotKc-d=(^Q-j$xkcb&&qtf+O4cHq zK%*n3>O@L$(=y}SmfGe!$gx1$IhA%mi48@2BTbOkeXrRP#JJy3IT+5lV>q3Znmfr) zjkBIHU-HlsXAY5%i@GVaqC-;{&()of|D3!?bb))KwA>zWpHqqL%Se1@c@|v~YN5g{ z6hlRU&@c$;8vYAAt~$^1 zd!2|eUv#At{jY{R4SGY%#*@rB`FhL>J!%56)HYTl&!NvZn%h|xMQWrjibi@ zntBt|xa&a(BCz0JScHNOSeJj}MQ4F6 z7gQrWGCVp5_&I2ekDIEqh_aAP%2Kwo=;fVt&@9T+)z}sJGqDJ5)YbDL{gFksAbBOv ziK9`o20Oji=49s({tSMs+?5N$^fRVBQ~(}lDnn^5hEc)$iYPTE`l*b6OjnkRCU~_W zD~;QLPk7{BU)iwteVaOcXf%I>V{A-+2jb-zmmh_PQq&zw8L=6xx#V6aq&5b1!4iG` zE|b40|3x!tB;{@B#e%~YOPnh6b-i6UqZa^-xap@YK~jB|$p?S@1X8i%7v#qnu#6;e zuN$nBsNsJjOm?!?la>!ZXTnR+i6|+Xe-2PQe$>aU`1?2Pfj0RQCkrr9g&7&g@$yP6v+ia=pO)B@*pvD3{n2)g_e$(i}7<+0%h^pJox`A~w~ppI^RmJO<|LE zr2!}LFp2NgSX#N!C?OASTiZX_4$BU)64TioqAZbO6|f%hgErkjEN>PUkOOHzLGstY z3Fr()RI{R0aT$@Oig`ww*k*#M^8bT~?TU*Y7Omt8R*No5&VR;|Jw_C=8AwhSsOWa9 zvvovUgNG^K$p|ET1ddQ*2Fk)|u%#7`IV`U#DVw(!aiLgS(Os9uKOT;I_qQ7X@Rew^ z6(Z+*F&#t>;J~1^ZxxBT~Zi!4Z^9((en%9!jHJYAfh!PkGH$zr3kB zOiNUsmbwCoORC1bj8LYx6h@5ih`69Gigta+niM#2KE#?3m$zI;hSpVHXz!blIOGZ}i6ZzvS!I4IC4u~b$wEMJc z2=BYsi`F4Dc>GUW9?g7&f>=^nM=Z-CZb8gzPvgzLMO;gNailYk6kTSt1HY?!r)Ab4 zXCC8|l2xRWskG0^c4_eiixqUyN?_vest$GaU8w!@D=g8w_Y2Y0h2|_ZAypmzU1hGG z1+#U-;1B%vJIX$D0yVFy5UvJtTHMDA?YdwHOJpd852JbD)>Ig;vg;0DKna)YBDI&X z(S7nc;)HJd@w9-RBhJ`N%<9Kdg@|INc%u=@-G9#plhdNM;6qnoD+jA!k~Y`IV1_TQ zs=C!rw1GjN9>VF%-IcG92qwdXAdz%|xbUDbv)G9f6qgBNDB`G8y? zuWFj^H51E}$|r{i9CD3=x`$#Y0sRq2M%kBUgV}q&4tFvvfigO4U{*pkp#hc)WlwT_ zZm=Py1+kHJDtXb@2C4hX;0pYaP%Uqph1`Z$%tFJqEFxsXnU@H5)IJ)*!`YM^WGD1@ znXF#%Gy4SIU3=i`>#D(e{~*$7pQzK2l3rp^OEQ>S;&Y2!pymyg2dsXG*rw2FC z7aI>WxTzY!Cprb*xv4stQf8*g*oy*%lRsoSqCtahp~%P@kZ-Bbj~aM+OSQgPqB%x+ z^wQW#|22Xcs^-pZl%o;jJ-FWp$?mZ!2=DH|fj?NPYTZ=o2eJR85GwDus6cx)Vcj2t zUuVfGZE-fV_QpO!s7mcr#R$iL6O7QJ>-BHz0p}zdxG8}@U zK%h(&LYHHYa@DLPcYCD9wa!e!H9-*SV7Y1{DrOtpRi)LkHY4`(LLb`WX+sj*h2aMS z?;=Fy3dna=b!!M}K2qnH{1*;%3wTo>HLU6&m43M#!q0j$@^i?3QxsTcXKJO8#?36x;l2@FOQ~#JT3AT}i~~OIEDf_Z)so@xm-ZKDlK%t~1TVf= z(1UA3E5?=rMOMvRYPmcgX+0zBaovVskzxl%1SbD3gYIMp_@&!6>)x#s&bFt}N6O`Y)g) zng5oM2fJ@*lp7a8xj3Q`X;r z5Ap8us?@YD?9D@a;cqtPq8MUZNy;V0fydoaF^{xPU(wotjI5tug1HTaMxyV|T3F?M z3@0hg1gR_Kz*>^ip7VJOt~~O%nJAmd_ECTfj?t_P;%a?O1xXASbD9#&J1FQ%l)j8W zgZoiXL(v=iYl0*_1gYaXoe23sV={rIuTDM4_hW*zH%Mir4-*Zk+A8>-(#6^qABjIe z%&_14PBSKBFBZ!vxqY5ZTIkn#x9CVEfA&$sW*nb`bIQe2;5xOdUTh`rjm8hRF55^( ztg%?hv(<%G&SMA*904uB2lrJCEUsj5jv~TRX095kbVu~nBTK3k2C4N(byN@rmt|KH z#|cz*1&-fWwQlLKK&G3P!fO2ZA<(aJc#YCHH3r)_D^Wrs$zg1XjG#~0CL_dlI!qkbS;?zQcRGR=ti;=JLeYU|oeJ+# z>M8naqgJ*Ku)5q?%xlBih}``NSC6#^xz7R#Dld}EDD?CPuHsgqI-gdktVww(MC=xY zh@-bY80ho>)srOw#{*THw(tav222^m=AQ`W!%xr(6~NFKw#e0lBDG>L*t|+x80G8m zgSZaRxXJ@n6GK)#g1Sqby)Rlqmv9Ajg@m4RyUxJ^{D-Ua75xI{hpM!eax&-1mN2Zx zAZ2rDVhp+9ws4@hRMDD^!h`v07=vornM64Zf}nREg38$+So#n}t#TmpP}Q(@9DXkQ z2B|O7?ljnBD8?OJf2eATk5zl5lA4;KNy98#$Sv4plE{qtqOS#!4vXPtL^@mSCvFX> zM&5X&vbHH`iE*)_V#NegF%D0p{tcuijQ2D;A|Dl%MkImBxLrxGCge<-i_-bxN2<(p zIf)pzms`oAtD+lNaD`B&qYlkxgm#tG9sm`_$EuE*SxHFF_xHMBqphM9z4O~N1*Bvr zt6f=MlTB8VUR#9}vQ%-c6c(pWPnJ&BG!~@5%Euu5sO%Xy`&iW|BMjC3^QR`jp`Dvd zR4d(g<*Lj?nkb?f!T7~(8|Wy~z>A=NqH13qgV0drP!t&cL}jU7u!%f0fcxabC#sB& zx<15%6IzEX;DkJczyFub?8XAf9R`+6g86>YgUt@n7HjlmM~!l@n6yAQ#_vy51M65> zC@OA)&hc#$vH*^Lgs61;TeTO-or=FzYtlLNExpDDwMdww2UhG64B5$pwq^Ut`u9P_ z6#NIsLJpk#2NXk@f%HmM1Az+U{2Hjj|5-$TJ>pu2yws3Nz(hIlL8Yp1dntpKT(9Mf zBixrH*psPwgHfogOLKI!O)y~{n+ZWCig(2_J=ezI=*~Sf(7->HpstAoGM^%0l?Y6H zsuJtTL%<`b2Y1d{^|Dw=a0~`pYBLWG zjE?)kHm`SbR-o-ORYold5BSWW)FsdMWEWuuush&-hSX3Z;D4s-Uz0ul7ejR1I-ITR z&s1Vt_bw7VUS7Z^RTm_4oeZ3ltbbcDLf;Nv3hPtnHGBjaL{4dZ< zSzz$L;9y7uX8a3gmqg&}fAK&xQ1&mRJ|3v`T-Bbs*3V^jpjWPeJT7x&n_n#`GCa775uP=9VO%cZV z{yz}l=mQu2Q}wHlfc^IJ93oA_{>x+FTIb2d9P$nNK)V;J?v0JRS&v)E3L=jx%pu$X zu@Xw{U?GxIpI)#iP%GAe{{ zh8p}eEdPR<{7`)J$(sBOY;~rVzsMWE+h040->Slgijw&p9FAHkeDmtTAzXbiF*DF7 z1<#uqcqfG)tSa08V+#IIB?Vg4;@_!foJb<|i;YCCj*&X>1ip#}F$^^l*i#FSmlt?m zi=T?`nk4W&(bg9f_yc@p|NRqc<4xS`S9N$Fywo;zdFFf!ugjP5i3Ne~BLAjm#kyP> zXo_{Ln1+e&3~r;StU)PpNMj}^dofl)dCGKF4ACiHW5p;rmOtnAtDu5&a=U=%k4RCm z@(&|o7Y(5C%wubx=XikwX2t%}rU8eHzV zoS#W9rNTxVn}#A(Zn#P?)~3>8g(=p;v5Z(>XV6VYM8`|1@_Dwvay-{=092!p)Hn|n z2?K?S6sl-36b3}=ho-5GRGzerVWYf$P&c%HAsA(s0n&06vx_4HbB&C}B=I9tTaI5v zv!^aG{v-w|`FILq`QkDm69BHV5Q<11wpJ)>g`m_PZy9yW`HDg5!(ok)J1SGWfD1=71eAZ4{ND1_mnu9Qq1YAW`z>UK`rIivveb`^-YfDDjILw()~ zBF_`^Mo`5wbRni-!8!h#fyoXpStpbH^B}L8EOeR>(@I?za#3YsO|=Wo@hyv;jJ|Ek zgtKx9vF~XNH8B$TEnmmIFa!}XeN99V`C&>v#u`3{AjrcN z!3gKx{imQqYroztBMU;(V=1Lk_eqKQ70hjSQ(t+SFS9+4Bn`{8{^ft!O(Ew(DMfzKN&u7ABv+A5DM=cU&~4mBzK1qq0)zvI$rw_=_0S zk;EJWn4YWc7hGD<_h#Z-jXlJY)-Yv*3`#R@zQNxL^AdC!9437mKqJBZ0{U%&F+B-VRl{o}9X7f`FYI1z0HE$2<#KqPb}D^`ITHvIIv5npgiqNJp*rx=3FmpP07|HJseJ1;=EXE?^(?rA{^>S^WFn8Is2z01t8LYOns}1I=HFVIzJlx} z-SG83p|W$}K`K8ixu_HEulk}l)^`4BAs!gofbWw;vxxkSfg4EPo{KHmh?i2`o$0Z3 z)`WHN{9UIWY)@;2pp}kq*bvRNp2|AP-8&0x_i=;VAbDQb=_io~BArO=-Ni&t z8qP>E0lWNqP|&rdiLMcwo}P$o5R@*od*@;_w>#4KI-?UH2+SHqD~hoaMn=?8RSNZSw{)iP>iAb@!JeslAH1lVqCoxM9t{P10k$e z-Uu*{olN7?(7IKg22z+H}HgvMI7L9x8=XcM*;qW))8%)V; zNt9)Vu$6PMc7@<4H^2ZXe`J9LTZ0lu#zJZ)a;oTRMU)B=nCtP+jL*q+RFqRl5ViHJ z2E_b7Hg&W$$@-JkBh^Rrm7)}KJagh7e+2ZFlFo|=e`KWdLtu|*r}LKD6jjrM!!{IS ze%b&H5}6YL2qWqIe6uwMmg!9z2SHdd(w`bTj|r7%b)jM3_b$M!vQ>h6F?BC^1>N++ zjeIAMekW!Fy^&u){`YzntH!>ECI^CY8(iJUVz*b)RFZoF$a<_RmmN`IK+?1hLU1Sb^%^b27t#un3JYT7hJ=jNt)@a` zq1HaI>uwxtV`)>1mE`ot^3IHzt7BIwVwy!OTG%JIPsO zQ?ycF->)h=O|%`R&eD2HJ~*VHBe~_ibr)2W$RIC!jV4w-5h}l?^GY@dl9!%XwLvIZ zNGIsN!>xN~JT%4VmDvqUW%PQhFY!o2UVa2q)1Hfbkc0Tx>}fbie}1!BC_vJEBzS(2 zF>VaB*16c`LYKymka~?CK^6J(4QCz-^-`XzYfK=9BJ=K|7 zZmzRXm0oL&fL{w5^X-}xQODtHwi2ow>xb12rly$S$m_SOC2I67 z(wMo_@cxASuwBc*hWc6mB;-dPHi!CFNSlgBENSjZ$1qRCMHR z7v%brB38XW|Sn2W9dtGk8;y@k2C|T`r81Im4kiUeCaJE(^@b;CsB5 z$R!0MMXQdOKM~`rXvLME@HLXQ5=PFrBm&AQqO=#GGqal4LNIAh8JqGtUMpq^BvA|L z50YmTIgz+tf#XaP1S?~`h{dYjjBo6bCR3wI!C$qxE4b^>$nzUEJLM<(Lq)V$I*Kh- zZZ~DwvMaycV(y|#sxIUKDy22STU_`1P92r`YtRjII^-+F+a-zv+&m+sN0>-pf82gC zY|Zj?M3R)Ri@mt%_j=nhQETFX|MC_xX&$1C6D1JfFC2o6lyYAO&x1TB--oJ*t6rJP z{(W9t@%J}EIGX?3m_KR!rnOfO^wtPLm|(o4312evDUu(?&4!}y$=m;`VSL(ewne}T zWy6717G6QzCFdiAZ@Di-1xd4KudB`IP5#$H$+%6uN?|=uzV3CPU3379oqVF3S_b>b zODA&Ry~WD$pu7BlaWom1)KO%rWUU;D1({m+ zfk~ztoVB1PE45x*m_Gh_F`A_mGjDOlkg1sKh01GEXvrkesZJw0$&%q|%Gws#ROLx3 zaGc!04F_83^BYVGw?htls7!Uo&y@xd6FCGvDK@;l6KU|8SP7bu32b_DgF~!IC2nK$pPL870+F0f z2~}#ju@@R2#&R4#fCTF#F+31W)zfh?xql-T2bDX09>M^biu3CF=s^AN0TiX9=@E#_ zhEty~O+4Td^w;?2d_#{pmGo1I@l?{Yl}5(2b>AJ*;c*1)ZO*5_C)2cmZ^s2PTi`Iufk`d+!5$ZiHo{{qMy|OS z+>5Gd7YiSA?XIaIH$k1nOomSu@{qM!7KdVxZ>TH|GBj5sk+KEF)TrefWh9tMsIo%TA|A1&%j+$4P*};OS1y) zTJkyd(fQ9UUdwL&0UrX|>mb_q5qTDpMqjq%CwS~1(<{XXY&sIVY|tyjJVlHd$icQE ze1P%cs{K%+Y?NM)g#tLkxK;)_t)=h#HsBxOBy{Wb&cuI|{qK)tFBmr-pTycrBD0K; zn%1v1!p~KOjPGG2vEt|aU%TVyu}dxSA^GxRP^xOjDQ!25V}DcY&0hFN%9`b5zxlt< z#wWj;IRL-N`T1GwHT|WYIKwwqz>|{enk7i_=xP1%%Ikg9IUp6gqS4cOe}VnWESI8>+w0d#;Xcz<`u*+N^1XQE^7Z3N%c#*dA(zr$mbl<{FKN#!!yv>O z;Bze(Jn$HY`q0x+YG`iTbCnL$eup_7TIFDy95mg?QoXS($#n7zqo|RGKPz=n&b!Tq z<9@AKsavbe7%?2jG_bY<-vmL&U$%;N4J|p-L#+=S?ZE%&`MC!B=!=kzVz_K)Y&=&( z1DElSVyuUJDh(D0nE-6|JFA>A$_>eLIzaWb2|z}EZ4ST#PPbaGO$1+TR=KD&|GoSi zxLR%N2!_DdV;wtn#8 zD~;-&(J+fhlB6T>!!pnkpM@qJRAZM%TT&_eI547BdV>+714 zaay(yTWOzNuuo-%n|AGQ?WSY&U*-n*WJ(BCAd#N3E}=~{NOA>eBx%vfzgtcF!1sl?QyS|qL6PV zoy$$oh-9;=0E=;jX_PZ{oRu`Vq!WAP>VDqK1zL3G8`qI>y=hm}4$7rAf`oA&=Rjpn z>dc!_w}tLU+?qn%z+KYmII#Ju^C5j;b7#I@ZMTN{nr;kHj6l{{>9IW>OW_c7<{Q`w zsPr%$k`_!##UFF49(+)OtVd^*nkt5;xIh0jLG7JgAkZ=s080vt%;dZ9Q7*7LlWzc8`0bhe2#=Mz7PNrbiGT9dB&(L=Pzvb=EUXpH zLdG9-LRz_W)v!ic7>l+L3dJ$zT4`J>&#XTYTO-eW6t#ljXc(kcIdBg9&m})+9KUk@ z>qvXEq3mVJPFVK6Qt%;o2dO$uF63pcb`YG-O1yl zxQB4}D0U;dl^O3T|Fh&Fs1yMnA{q= zHgfYOS`e3YGRe8m=j<=-a!9Mo40qktTlR?FEo`WnShU)%|)ouSKZ z5v@}E#wTd(QBDJ?J?ILA>IjJ4_~zZ+D62QWCxj6M4!=a+ktRkx^4dvWUm=04=)2#D zaxL0nn1LOXL3gti@>LtLvX+)RlyW$^GO(Z&{ChMxI z4tY<-UdntEF3Iq#Vx>TC_Yi1p8Zqlw42BGcfvC6v>{r^2pMqdxc6XTYEXJz!*y+OL zp`GwXg2|q6qntoNcRtsnJvgk(1yzAo7Uo`sES33^61uygMpH`(%jMry;qFPq=vTC_KF5+jhmCIO1ePkiU(YpuJ)np z^j?N4Ps`=SE%=Jq88HrSrKugDR9^R-6zy8Ftd5Xb7nZmB`w*Q z?e_6(J6PDju`I9E428-mJ=G4ESpxk^4y}Mu{Jk8SJ$qDFz`o!`R@Nv_Zdt4+?_FZV zoaJXUepXIyM?-N-nE4q~3*8vTtjQy@{xnsB(dOY3wr-!fvUA9zTL?_(UPn6tCBHwh z#j(un{Bx_+tVmrhvU~kBIQ~^9xO-wda2kY0f?&j9-m}K0({ekL3se!R?Ac}lS4Br+ z%cHIhZs^Ps(*jt}+wX~zM$653Gfia$WSHdiBRa89^q95e*q0_Zjk({+%_J}ECKovN zYUHDNzzugbD+Gz;+}p9)i{A3aXvv5_@eK2~V3UkX?yDh=BPyV3D|~+nl9px$t2=Wr zWn~g;cW^zaj)OrveU4j5oY*J0Q_!n?QZVDhw!T|T$#K@c|LTy2Hh|Yt&l$i`Zhq!1 zpjqmY!U7UrjsHIWbZ%~(RF20N9|}$re3+3v08}@CLS6sEx`dw_ShVibnx-->mzeu7 zlofcj7aWdwzy%hmi6yB1?WM^fL+6vsUvlA=) z@4f62GI@`ngHrGqH8S{og&6S9`mK1E@tjEH$J|g6RsJ%W>{L!9fIyQazSHzDnS3pZ zCHkYHs)_3CR5p!?JMaP$ns}!fEBcQ#Gu^{TKX-y6l={{ajL9@1{mqojhA_K~qeDk0 zM-v;91U<@hKf4{p?!`yqedBL4QGzq6H=JsHz|$N4B^Lwk+5fgB&8DWh)XA5#U1UjWRfS(i9=xPp_xXEeGm-=uC<3i&5r@FV#7zk`Ac z71UoW6O4h?effrU%+StBS4y$Jc^9Cy98bX~8#vsTuU|b!LteJUFW39>X-O1+J92Wg zf+%f~0jk-Lw<59By&pdb8}dazehxA~b!>d!YKdgz1Y>~-Hoj?hJuGDDKxYK%<42tA zV8@M2Ahu0r1GKs0)$xRmNPZcyCb3~b=Fh}3RD+#?qKi+5^*UtZGiqn16W#laN&N0| zHXLtcJ0!6Gw(-X5?qovI6d6eC&wq%3NU%RYIkg0_YCR@Zk(wB7Rf9Tujb!B~(wpd- z4x|m>O^7r09l(!45_IDL9s^eb&j#?#kufr5@e(pb)3W%Th(XrP=3RgZi?aD+FuQ#R z@@L_z)E&g9r%I{x$Az!3xrQhB8904^%q;;pXzM5uVu4|U_yMRQ2n^!a;2M^}{2VpX z`m!bP{I>E?9vN?EgXINQ)BCTXOeDA=C_fTf*Lu=6nhC(r#yM$mYIt(}Dh)HcQ5lLAsN+ zq9fm0VT#k)hIV+m2JQ8NUPG5mID?>DhqKi~LFy^UTW5;U9PTW`AjaqS*c4v{&2d50 zD}uxd1%QsW#X+*W2adettq@DJq=pm7yP|(?419Ti>A3w>8Q4~9;tsMi~TKD=Wa4{fc~oaKa5_;kxqJxD)J~vrAzd!*4OKA?rHpsLR^L22thl<#tlgwLDJbbq2SNWZuUich@Kf zmr5~gsC|j3G$BnldvQ`T=jHp!tz9fe!$l^F2~ZvMFD&qosYZ>NN*!;g?Zo&w~oNVt`UPi9>fm-JW<_F2|y155CoBv7MOJ8 z$H(koA$L*Plsc432tf@!Fu|e_EGyTbeQ^c(^-?+R_%l2whK;xd+DPi1z>+PVW0Sxy z+#Vl}EUls|omU-zP&p=|>~$n>@aSuhh*MpOwx4prjXCW-9tmY=w;X7#vKxyO#=(#{ zKi>ukJ@G5E4jscn0igWZyU-GjPF=Bka#QdU!T7zZ0n^V|O$pS$Gk5NuATt+*Zkx_|N0=>L~B=_wQDGn*x~{<-R`C5uj!F+R%) z!C8FuL=^UI_iVUuTqR}`AdX+g>bAD;&aNOo5!T)R#}r!_d}iMS2E4}C_1J-ZvAt#( zl^QlSoFI2sshM&MYchDbjq_$wW74wX5_11VRHi`>nxc`|a*PT2!Svjt>hvym!qgXl+`;=fWm6jwTKRc_QBfITvbZ<<^Jvs9#mmXdmAAf|g` z6yG7e2;)PyYz73H_fdHaF-ky&$m&n3NS=F0074x{^R8q_l{9WRwyq+aK+@%#(R`Qs zx)fsX#0VdhJJ)bYxzc7#v5s99LIedB&l!1Ap;KC@E6NqdN%;8f}h%haO zw{(Oxk*D6tMlx!Q7^_95wt`ZT2R##M8u_7Kc>($P6=3TP7XWVLpTB0*)5~VSCLGJ* zo3*#1{;on(K#puHj8S)@q0LS524Mm>(e@N$ZOEx_iYtk=C(tE^LLpl^9{@Daa139+ zwI6+g4=NcMCYSj*AC-Dt4X~|mA>KSI$nuj53Y8mPGhRozm~#x@0f6(fF?@P6 z^dk5*V3*TT_cmWtp^=_d99%CK3e-TQST7uMX*NoN5@YyA9&G8aELbarqF$Vjr|s}l zqKu1|Yxx#@;3)fe`8~K( z@h`p>9ChiqF%96b1!^0Ujcv7D^3&T!a5{jVF?$vTaybs-BwfXXea;y|LXj!z97%{lE3k`la7aqlg3y9p44!s2z z5-#KBvQ8v!S??%zy~vESgy!Y+M(huB4hnh5*sK}D6d*Uh2dkhcT<(OcQbL>+)GwO= zILPR~)Fm|5p^*?wrdfX+z#G91z>Gt#fEASqnzt@_YPh%uDn7Q8X`hB?CoYjx(aS4K*wo(U`Y(&R0I zNFMWs(FIl=`IbHz47GD7&!};^e+J@~q?JdZPn8$yd>t8Fim=mXOsUK3cUjz|?=lvX zkpJ41jVh=KywL-I9lLESfmnU(#a-Q;0?ne#p5oL|>2Hch+A#QiFze9Fbzk6i*I#42xbsgla*RrNPPDPC0z)vn*7Zp?aU2sxn_zv+jj&@U&lO&L0= z7y~PAh*l$cdfyPK!41RuveWE`+B<~-3KWy=00_847!e}h{TW9+(UxghF3AwaC>pUS zjeKcmT}DEaDpM4-YszYx}annyzWmR z;a{M(9Hd(xupC-xL~!98@BG(kq~WjL!cFgfW;D6T&?%z72ffk$h6x0F?RNoZ9y=1W zRgh}UMRO}{&UAilBO{Ic%A+JED0l#VhPA_IIE<)5E{3ZjY*fzG7yR(u+O=mT_Kvaj zODka#1h#zgvENKs%USOWnXPEheFY|+TY4B5kc*E&h~#5kSukbOOhg(;_m^Upmh8EK z9dZvUwkgyBo)KLNb)U?00*y}sgHK@mM81XxO5S~I0IZPlABG>5_X0u?K;-3Cubn3P z-V%c~NG3R`YmtMPT~UiDV=>^KCYt^UBp!*0Ks(Ab(OQG+XUIX(_AS5xLNw3*3~}KO=uLQ~`yM9N=Ph1@x2}AlMh;0iWish#S>5}&VbW`afIcT>=v_9> zBAB$oTZXQmFzzdOH7H=ph1_5rw3Kq=0HPj=gOW)`qtp*9-z2GfLvFd}6BvDV1`!kJ zY#dq@6WCy4jm$;$i?c|BZ$!I5hVRC?IC_~qnR&H`wN9d#sR&l(qL^q4UjP_f`eL4- zAUoE0A{-tC-X%>Zw(jg?ol|R2Abmw(6u9p$S1UB}yhdT1e6x^&vNLy_e(>RpaRw>( z^q(j;Zt~aAR@}$e7-&q#DAyW9YE^E={1Y)EkUj&{67u)slW|xlSJ?2uo3(8|8k`Y~ zLf0<}31x_7#MU|Skb^4m2Ir_Ny0k>M13k9Hm?lz?)5OFG03d;L-@U%YPHr7!yeK*S zonb2Py2M2FaS`D5zh_yglhk&yMMt>xB26O4enw5d(Sy<3S`xX6F<{(f10p;mx|~(7 z%Fkx9DQt(&K&8kpe-kS~iNqqmk`0j;3zgm)mLm03D@2hQd_)O?L>* z*5cKW=EqlV;-f2GX@?6g7`hn(sz3Xi*NW(`-HD?&>qG3l)MFZ6=LSyBc9HqR0m4>& zlv@E_K9*MeYBR&24f~j~sC@7=g5&9{g(9?baDTEtsr=7d3Ge2IY>z^w-i3i$5zn;~ z?_Et9`N+pU@Z0lp2SOboBcl6fa0_zXkIHo<>1`Z!`Tm;HI8}~+2SHA(s2wsRbuyZ{ zi(K9Q_#`(w0;|IPx4x>S^6dI(g39ieQ3b8@r7T=1>&~hr>KI?MG>iI*+aE2>p$$J; zfbU%J>2y4O<=hnjROSJvAoRWmVF=Oef4?y0(4eUfF78hH2_?Y|r@+z3=|~)(=ZDFA zdvY&hwS~NA<%>A+w=YRu&bg6lxszCJs2a={ih{9Na9#*?^=FOqG1(EbM{o zooDhS=*-D|knO8re$sNK zi~E?loqB|qJ*S#Nv=nP6hE=891%e-kRT&q`L2CUr%*D$i_*yw*yugC*b2{VMxpj9S zhSZ!}KyH0|TE~6F>M!M!g_z;;S8jx>Fl2Tn$+MhT&d~Nk9a&$JEfe#>VmDcFxe(8E z=%p=8s8M4lmDyN$603k6Z|&qoPlRMXfZQvK#7Hgj?hGLdcrm=e)yLS;HNX1!x7V<3dhA@hGXrK)VuHH6Km zi$B`Q{MT0peJezo&}38rqO+iM$s;`0$E4#=@Hh@T0pfCu^hj!RVA*xkzO`ji?eaBV zJ?&ohEZa{M1IDZn#h6yEZRN2ef@s6p{OcEB6-C__ zxA#JHInA&IjA?G_OPv}fdGRsGNS!!qL9UoI8z$8^W|-g!v!rp+uEq@Uz>QVptG8;#O(qla8Z=Ud4M!tDc z?3SFT)5@xP+GM{@C%<0u`4Lqn-7@vIP*#s_O63@hAU10y5gmjQf7Pd)yNB+8zht&X<~Z;yn<*;1adxD zg;Y!Jy7?~hpjoj(7P!y=PsaZv!Ubzsk3paGDMAE7xUvBf1YH*vTFLPn*gAP>qpFuD zpq-`$nbz5oP8~GV7yQ z)LfTzh+0s8_gsu?N#i7>Bz(zZi;1PU|Zmu)rk^5h7U2 z)p|S`=a}V$a`l|g2ZTrcA8ez%V+-^b*H*0PLnVF&tG`Ml4+g5IJsg5nAZ1rDJdO$% z-es|sC37w}!r`W$1kN})$;zUShUN2`E=)`3rmFaQu+EJhI-DPiFiw}J80Q-Q zn~y$QW@Wj$@u9gm38VKGG9P)-ptyiIUgaqoC1SV{2{yJ^iFG)uDk%81w1PN}vwi`^gswuutt>PXWv&QN=onxr0G;ah zh}t*5&E_g`kM^^WpqyV&$m1=j|uE#z7|?g=eUqt^h4`_~my~oYXOkW)s~$ zx(h5>=FgZgsr7Jj+v+g>#sL}ZKr|9FUn9y_qA`sqC<;g?I}`aFDLl-0Pv7o?a+jhT zH9wHxjD0E;)SKLN^4AS#0^joU2BHA!V-0j2WsEFEn!>i?Jb;3s}o#a_>AG)*f!wch=V6t4sbI z1hvQob%+9QSkE+xe+p|M-8a;g4-USd=x<1l`OE!eYeLjDA$h&9;$`#T2{nD0%@KEJ z5&4ypd)W!%YL%@6J2-T%qb-`9jW0yGDXW1<)F73pJPjP4$=C6KvzAM|5F=^C-cmHe zCwY^3(y|X)A5D8POORV2Rx~F{8lzE4B6gaAq#Xuu0mS?{+Ed_1=$Q?yQ=NJAfCawkxE832&p} zqyXQV?Xz{%LjfbZnivC{IK7T068b;0#^}T3~Ga5j^pyLz#d^X|@X90bqYa-;LmFwm?fr0y` zL=)7vw@{5CLMOjw3c_9TP81r`JQ-$GZkke_N!~so#whu+5kNHe+j87HN~_qkGH!G| zlMz!$o`&F(p1J8!%UGptr5yC4TK#`4eR*IL#rytbchXKvTGFK~Arwd{fs`}c;a&=b z77zjgmP^A?XgPx%76h`T6jB6?3T#z`pcYa@jmi-bbU})(B1A+jiW-n=LDYDBv?}WF z8NNUMXlR=3&d$8^&U-xX^Lm*wJ8~o#HZprT`hbFg;mi1{Yc;mx+ykc1#!l9HD z@Pk+VxTFrLAcwtx{RM9;%APOy({5qsVq2iVt{jTh=xp=F=W(I<-S6;h4?iip5oj$e zk&2R-`AJtp6ASjgu^5Tr;0&-_ve4WWz^kl+BEkr+m8-OX#>YkMI4 zq0gwZX`NOG4meJY{UWcxQpG03wWch>k%t(lBL!tU^`O8HKf<5d*68M{Gcc-S zLp}J$d=*|gAEQa4yV04H(ej^o@JS!u0e;GWBzq;*ljQIabeYe_5|cI}uXfPa&w`gg zI)j8Hi3X0N)wU0$2|MwD@N50J5#hOgQ)+^PH27{|5sjgu+k)&G`p`=>@?2pF(84RK zJS-L;dXN93;w8?o9Guw(2VHF4<-#aDp%c{}dUluu$}Hl1Dcgnaj+ou{Ps+|#kQJQx6H&;}`QAmUe3QP@}Ep%4B5-@x7JR+w(z2piY(H+E{}e$KU6@KQyLI;Dyr z{kBhCkb0J3XP!fGd=fQlpyWDijpVZ)ZPsv|b)yZ$m~`KOa^B#>LaWX;H)CyYL6Bz* zDuN2_v2Qi}B{rjARXLXZ)TIXW2R-y1NL0RhSQtA)9l-Qm>vJJi?@pAPl4-x=xY4lZ zAiSHOPb;kDR8+R{s0j>ldW-nqeyI_#t_?SHEv)gucX&=TZ`6}^!s;D2xn_1ZVQyM7 z_k`|%NNiduxO|O0nUZHPhA1)0;fWwLU1-P78`#e7Wa^>!U?h-N&f))L%V%~EFC#C9 zgc`#jH`1GU^C7ggA=8-Z+lTBO`9kJ9dt__Odtl!xSgOL?jW{(LM=mOa9lvOA6(Zg5 zj>S$W`s{O~&b%)+F9+qFW9Tq!6hE1a+jy6y+R+vu0{}YK_-c_cf}H&UxQpbYhHOS3 z>B~EIw|Bw47GL27a!=%A-z!(oRuupgIS7XH!3n%B@XD;^xkb#ionr_aU*%0w($BpO z0Xcf=8un-HcSCcXEV8f>;+V$I^>c4#dXZ z!~u@#!8cH=q`r15#)zFWMUif&aB`V%71yIj4k=V6TPWW4|EEqHjsUpo07Pnk_qop(!s{gH&cUHZz7? z`6SY$(JHwB{4?w1qUN-3?|W2UnUW5DtKN`NmmGaqj=|7qm0g6E%s8;Z&s#moq;*Q1 zE`A#xQ>X)v%DI|V`zaeB$5C}vC`W9RtbiU?4=2Sbc{W8y7Xkk;s`rDZsCZFtL6uf1 zTICv{Z9aXwHpzkZdqt3x$KWqJxBgH|-paPn&`DfC`93K?ul<8v>HLQi)22`7y-%?&(58d47mXcjY=pyeyh`w^(IlGjD-}sm6FOBH&0pF5qtdT?b2=Xl)-A>^)f@8atn_QcpAN z3XiYOL*v^q|K~cRbZEP^b|%fc2Gm2eMScP8^g5`ARy-;|J0P1hZZ`6?*B=$Q>xWd( zJUOfx)(g2lbbzrPKtP?&o&)7T_AHheql@jhX3kxS!1OtFAMfvy@1LMK&S0?8&NgiBx#d33f)a`n~zSwgKTQT zL_D@p7@Al=iLTuvd9_O$g+7_^Vbph4ln2qq;$Cs2`rR>ji0aC5xMpzcd0Z{aC;SCS zZ97$H4SGxYE}=DV z@L^sfKz<*LQH=Yx5SqKR0M)I_N`=9wemz_Yr5DsL;UzOPf@Zv6^n+zM+s;_<${##Q z=$yWov(SQ>ObVY!-vr2)U>>hMQicg3+LE?FXRHh^?_f=Xc5Rnvx?=pQKld5R|RG9HRv1u z@(YD17xPry+l^0GfI7i_B7K`62&iXhwOzP{`x|x$69hI=o3umVJSz)#2!n0zPLTb6 zIN%(cIBLCe&(~7CBa1wB2)fIE75nDw4val;qUBCJG`=+babX{>*z`Ewjcelq_weQ` z142i^;y>|pK)7VUUyGjapjfZO4q7z zVBatxcK!Rt>JTlIi=EV$WsjoN{NIWY4K*RK^@1Hil#3%^xF%aE^f@r0rJ*Q$yV zT6d(5&==Pue59UT3M)^4;|(c}lV^(@Tm|~8e_+(;6MRp~B`NgBd$I0*Kj9=%O|sIJ z=}SjdN9n{Fk`2wz?TZkwQ186NjeW8#fqQxS>}Ozj1!Df90=mfIvFcyom(`_(o-!B>gRb~kuAv1|lR_!=M`+k+5xYgIjm z1p}I8(trN;S$iXmHE|bs>}B*XqgQyJF&Af1xiFpwiaby9zxnnphJLO+hB#-N_p9rf zwK&t@X6pJGHMrJ>YdkZ#dR;jt-Fh|`%H}L@yHeM=CV&PnEpkIh7JOfb0Kn;~d>+Q< zV6K&uFJZQbJ{%mCILT!-h4XxSGHK`-04Zd?HCjN&&yg)A+JCf6n2&xuySjj``Z_5_ z$4r+i+t4fM#+gjl_pDRt(KTobNl65jV@7&X9%S`gVI>Vt<0)eoob_h3;}Muh`T*I3 zF#QX4VcL6_9UI2EQD(_>*>{D=a{ThTG0K+AjdN#}lr`o$sIpG3NA+jc;asOl@x9e? zS!Nzn&cB}vy|np%2*Kz@W9rQGU=E&_xc6ps-Y>)VO3^smEkqX8!k3t(D0%QKEaWmWQ zJgER+_n*-Iaxk3^>I#`vE^HxHf<>_RN(lrtwnO5rdiuwNsuFkv}9`%2@1^i;{CP3pzhE#+awy zF-e6K?E28y#B3v*j84=UzEWc`DRpn|8WBeN*;b=)vgz={h#)LP2u1C1if47vO*L0% zjeo)JXTgs+f-z707I72u$uLQ2$+W(Qgzmn^W@L>VOs7Z2<%f8yYm1e3oQU>L6!bxj zIW+nghf+A_R$yiFIZZ)c7<84yVP!*@`w?o0F@j1=R~n5rgWVl$pC3hZ3t7(b7b_ac zAu9yC=@Plm75X}40;zUq|7sjJN)D`-U>%LT;ZbY2f#q>Rl>Ox znr87lmgVmn?Bkt+WJzN$YGXOW7fIm+#L;dL?Mj^pfjNNBg9vN^eFMGEiklIj?JFsr(WM$U80#q&3@hlZpg z3Jrq0dPHecd1s91E=cn-hok_2R+NBwYX2{Sl=X}2Kzv@0s0evLju)V*VKIlQ5YIDJ z0oZhRaheaR793MNAh?;B0gbOWfaBFBgLNag(o+$mck*E=kuNt(l~B;$(L4!~*Q?k} z6CTIaM^lb^CXv7`L|QK;`Dx9uq)?x#S=VSJojoMd5Z< zYIBYVV^JA!Gnx-Q{Rw_tr_4kJtdeLTO5T+sfWnr)s zMdazrgLP55XHvF{y1^c!t$7(xf2RHUvaksD()?Eh=M4W;=82w_f}r^RMUFj(2-h?B zIv~!q6gpVk*-63&l<(~M;7I&JDuN7*dOBMHfq5a$64NXxj(nJRFK5z?etNJRd#!DG zm5te+oQqnxA8~yc742UY1}5qtZ|{kzf9O?VjO6aiSo;B0VLEjkPAxR)1_Sb|f_+*z zgE}wr?3P-NaFL2mE}8JKt?m|NZxYVTUf5aaUtWju8z?D>yQZs+RI9` zO=00Jh}*E&P$m=AX1yj1Npv7o{UY|${?~*pa9=yUF4z)Sd*s%cHvV;CXo{yhB|r1F zK58Er+IwCXI>Br|{kqU2A%w;}qA>f{I~(eebnh!io0AMq%ln4VSzu3S z=|_dxC?ul#M44>V)*clOWk(SZC`iIOzf|m?TiC?SbMlgMiCoV*U zbeN+y7Pw)Q^0dY`1$V1J5k21rcC{&T;q4a;4v^u?N|}jh6HdbF^=dDjL|{PIE}cZN zyI*TM2^x_St>;_98@T;9ZwWZ&m$QJamsGo!*%r>u#l+P9EyWjWGf!cE*K6xe2`keI z0;c3HJwHi}y~*0noR(_wYyX}SMnL+N(?UB2nu@tGU}W$7bmH$OIDHtnX!9Z(i>w) z0k^ygg}wKW+z7LM&W&SRzmAB?DF*_QV-b?aZ*tlXa?tW0pM{arOqXTc{(UzU%KoX6_%AG);Plbs*d}?6{kZ;+DFT5(7 z_kzqJE!WFgcO?|>l4YZFLnh^!KaUtHQJpZe5cxIGIxogy>nkr|W7vy*_yqMBT9e20 zPp0CFXLCL@hFQkiO;sLtEenmRn$d#KaLR!AT?!!g(Eroi7zvd0)=?xhDH z4({HGxV|#K4ojlWl8uO}bor&QNPFUp&}~wcnW?SL%S9=)>re0rc}Kfs`trxPmD)5L zKT(HYtkTh52pu^wq#U0vYe0R!^4tf7nIWW|&Ph&$a+eO^36pCRf4BR!)U$$xRZf8< z49!)v9%qGd4_IJDL^fK)v@_OJ zwJSG5n|!kR3JYv}H`fLp15_r!6a2Za)QGcv2Q9Q{(X%Lr3~P;Ng^p-DN*=GbV-Y&6 z$2Z*+>B)BQ3KpoG0q;VQsoJCOqWT?uW#1LNzN#kVXUnqVfRVuJCc=Ki@0LGehv4oT zi_4poi>ntHFk8pkL8N2<+$khfzaaacW43f3m*T+MZg!P*d#1jj7CvS$*AEWpi5y3+ z-U%X0kDC7#z}ym9HopLn#vUn%z#E#7GNw1a*AQcaP%KvEWy*t3HkeuP{t*(q93}M< z-;JJKAdq@U|5$s%Q5vfc&31Cs=xg7_`_nqXz+q;n?=7^?Gh2 zBbQc5Ui@Lhg8-LIEXj7#OCt7eu+Jt$9FuDVXMbA~+q>!2atC|w+nwBi|LNwG1}~G_ zZ0Gr~s|}fQ24{jYCo(Ilmr4^Y-@?u;=C{+ zu>{by#fTslofn3{)Tufz^u(t>IWOekD7L&O4DVwDgTwQ$G$1oJ%8mz7{_e`vh#Gp6 z-zqriYz=~kqkGmse|4XLzDKQtG7DgYH&y*AoCG1m#=NZ#Sjv#t)R zQ#p5lLlEglNiMn}r@}#xFQ|dw4}B`TfaF?B`qBChyf2Cm+@$eVbj1?6-a?NUBpX;? z-W*YvM|b~ZL@dGdOd-T>#g`2MbbRs|b-)zgsc|v=qbsnL|1N|f@aR5{+19mQd_+&} ztqQ^!UV$^n_SVWm2inB9#FzA+C+8Ni=()DA5cF>s6xJdDRZ$aUMQPu*fdUG?Iah+& zSs?DK^21!u#;OzR1oQ@7R0nz+1#J@#@i|pCx68$I{nEndG$~nY7uw@=QagU~y>Z7_ z#FVwaW51J(LT-iBoG6TO98Mv=Ty&$b-b5yMf8GEMKJTOyN;P>F{1XCAnXMq{umMx< z=m3RHp7%*M*osq=Yg`ltaO@@K$v9i%OklR*AW+j#7TV6$WMWr}>d~3QG^*r}D~2K# zc<)Qelfr)ckrzsvj=+FSVdI~#y3M*u;NgB`$2p=!<)k5MRiiV3v(U3ESXc; zh1MOQu?l)FOm%6M?+cxJVivrga^g@Wp-gh7vZlh%A?4=rccnloa|>IgqOJf*e`+@~ z@6(CEzx?pN(Afttry8oS$Bt2Bw{s(yJG3=q^r3mTY_#bjY+n7N-26s5MFk==<=^T6 zz5o8~MrzuJdUkzk&H+O`RbSyuk!r<-!bYYH>Yf|IDY6loHn?euJr2w696mqsDI-jc zDERn*Ics5$G26^%DZOApWtnnYe-NM`#|1vf)SI;hX*duA&WQhE4Dt@}JJ(}s@<+I(eD_kKv zw!o0b-^eA*beor+{`TyuT!p2#>L(41H)osAH|6HBJO5tGEWuZvd)5wd`R{vh;6(ae z`FsSjC~KP^P1ReNV*Qd2jL0*4uAFRpGc~FWx*#|_RTdyr2H6oekGx|qLI>Yp%PSG3 zh{68#*5Op%b)5riI&Cj(LV4~J z03wi!R&!TcHox4Xow*>`eKz{P0nqf$Q@mi_n>U?5)QSOiNcx0gh>mC4Z=6ciGv@6= zH~aI06wK1bqHTEE_8)Xi%}X|^Yi_T?iFN6@Io$iRAMFTKtGeZl=L=OfWBbRrn7VRu zl?qa}gP2Tms{np{D^}jfh}uIYN%Z}B({2Um`rTL}Qu7arM`=NNjf2_NJ=+imw(E(8 zdO#936k=n4iIVze$k`TGK?@CDF1et+ulovZsOsy8ORIxzJj3wslp2EIYZ%J-ne&Af z6u&R7c58JX3T?Y$l9I>E^_ytbYCPApMMJR%i_$yi+UO=U?>f%b?Ai~p`FGER8jqHC z5yzHW>v2(NTNs0xQ&AP=Y+pFnV@E$Q+L-6gB1EGcpGX$ib)R?S$-Gx?7%^hU&&C2k zWlRl>s{hCY8~YbWc9^cSLU8nUhw8j^!BVWKr}!Z|jvd1fIO)v4XI3?7VcgN@s$hme zW6Mj}x^XUyW!(=y^No7h+Dgj9>294;9%X@hscZ7ryGEp_Z^|~rn4|9^t~ZiL*OknS znkFyv2l&1yy8_`321eVRn7RZWi@lBJ=|G0(`-~WG z#RWXy*sbOG>E6(pm!FpOWK|Y+=+!RRa=#QN*O=KyEvltRIuoZKt5VqSUmKy>)D%~4 z6n(V8EWv0rmGfEHcGP3?$c1nFj_`oJLo9^ueRajX(!vS9;TLuPY+jJ9UOgwdaHJfv z`i$7+KMa8^0K=CZMI^%WBvYclV`BBu8*(8u38fg8l48wvgM$}QDd$BDS-F2$KB|OE z^BL&80_9Bod{nNA!ovP|Dzs|nGe2sB-3F{tF^;I<-jz_w-JCO}%2al!qON&W91$3u@HS@5DedNf4R6a=?zR2AR))=`q<_P4+0o(1g(R75E$WurZ8X4( z$kgt$fFfj`iYm!$VzH=T4^d?dQm&BxFRJoz2&M1{h3#({Er*;#|HHu4f`#QObC3Ml z9zb6KpN!^0Dz!S(Xz?P6fXb>muRMr8A~q=kt9SoUth0KQ^C{S1tUFN0ybX;8(Hm~q zL_5y1QSWkbBBfs4TU zS0uM70TH9F6#>otk}K4@pj~`XiysEL*C6A7m?j z_|rl&Q+oHs+_*n}l}pm-AIs6r?P?w7gv@${$5FkJFC-5`V`kaAg9YE(jYp5&def-W zA!}v-Nmg);7hfNqd#5~)X%D?wUZC~7EVLb`V#w#V+Wj0TSi2l}-+?uLByca-RoJmz zrAQZ`JgJn2Iz)#4LCCB&E2y*3Kb|X(LrpH{MhQ7>hhuL*noqkdWVR-knX>&d4hlWq z3wF2lUh(hn0jRY6=rW92zjo`g(9UFGtjjk*Rk#L&xV^>4!T`9DjI5lH>tM>VH|-X* z0yu@?26sNfdqMjXoY@Y#I|)kAqn^U{N62Nl$Cf=a-n_`96Va7 zK7GF(BQudgl;jRe3bTM+!08sw!k%H&hMs+h1b#jX+7{I$*|lW4T+{-!rk{N-)uyrF z)!(XB`r=+x(O&x)9)6={yaIo}M9aPc%2==V$Q5Bkg105;u3g&OSA-+WmhVF;7_b-tmd0?Om(_% zD$ZQ>=+}G$FP#c=?^H96`%@nQf|M1lYXg0sH+5Qhi0xgp57veEm-+Y^dio~zlBfAy zyAy%a*_>w*o^4W)(qC`|vf7CiBERR}3eh%%_lqJmg@qWy$5RSDOxORD%-C<1?-~>+ zDPIeoVTn!JDMird>kWq0Rz16_N=)kWy{6j-!jkD|1jOLv2XB+R1aS&tY@BDm|ZYYezRlgJ+DP-^0b6{q5E_v zu$DFX3cWnLssM3|G{k}R{M;hwQIty{UflkitfB*TM0Pi$wO`_|!$xv4OxxL?t3C9@ zK8~kUuYQ%EM-SRC;i|d$8s5zIdSq(rwYTeq3>L)B+i-RoTXZ<37f! zy1!csHK8m#RO8axT@_rT0xe029Jz{g(>%Kw*n@lJ?8^E(IIYQ%teRT%O)_vIe&yLY z4Vdn6-5M&H$I=0FsK@tnBvxl6pr5`9=9(a*`dg@mRet=rsz7`9s^A!7p+|QXLMATF z!;+|}d#lX%x^ky6+r+i-_itR}Dr?n6V*ob4o%0K@4N8@h-TY_|W=#HWCP&AVAaUON zbD?9)z$RvU!cdNr_m`0p%5}+Fv}D&7e=ZDWI8;gEp*mfA<#VCez(6hY^i-i)W8W<( zY^3_zvi?2`uUrjK%ay-5U#vNE1-6xbeF9HHE?&*6!Djz@pb$}G>!T@vMMN`Q1JjL58*q(> z4d2#^u7UNSR;#!s%$yyEeQ^5kno1V>ER1Dyo-N4@u#(r21Zv5=@6_a0GB){FJ{0ni z3xPP(_6HAM$qcc)0XDR)H#HsluGU~?CC@PlElw*t%b{fEPWuzbQGsv>klEIHEA{$C4^r`Xb%`4LkMjDba1q03(jT|1y82ArRg1$oSelc5x1RlU&# z6qF4z+096+R-kcc9}@-)j^MC)VjIYTSz!6QIIZ=}>zrdKcseK*041?=du~0`VZC^n z@}(CVl4v>h5=vsS=|etvV)5!Lt1uyEhf>t^-z9piRCmWVKNsG|i~w$VPOn zs}w@C?j@(}X-W2?Ct=_^P(Oa{@O31V{Mzm72rD?X?l*)PEy92kui>Fb<>Uv*5PK-# zMbF$2)-@-;a2^F-8l(QNHSC70Z*U}``{Xymm$<~lo5IdSApC;A;p#VUg6znx-Pa&= zN^G1>N8LgoV_kz#lUUN8s)K+L8vQMX8P(Q(D-80XlN{-SFjNN6%r_+OV8neBq#%Ba z_A16(*2XO~@TFWZn3}9o<8Y>Y@V6ATGCe`SA@)L-Dh~=LRyDYgZ=Z&hieGxG#sk2@ zF&yTe`paCodA{6=z;fje;8J7eD!mGtJ^2gC-wG5!V=$$@_}RTxE*3AYuY#F#$buag zJx~dBnx$Cw>#V8stEox{5Tbe|t^*r~Rbj_c&-~O96L?mqPfb+^m`HE{=n}Hns`HYJ zRs&CW#P(mZx-wO_gLCipQG?T@woGklC^D(pkIsWa9s2Nw@>*SPTrFDP|!laWKqmK6VFLHiV@LfYZesAciik& zu08-A>?5JYMl;j@Hpnq6wM^h@7r^66@U;!B!L84q$C;*xnfwSnRLv95>Nll`$oAZi z_21kNM<8hT3Y{!(?YM?Krd06fAfXaCh&Rsg9n(lwTYaGfFUq>Qbq37vFS|i%uYUHpALCpUEaQJ!xc(`; z=tsvb!HcT)D8h^9{>n9YiFWSc!?%KOT`(4y)ZV*1P-M20IYx&`ZB@Gv(I0Yt>K^{B zoD)ytWsrMB&*$)3@awBP@nZRbZNs<24{b22CiAdU8}aRU`Cr(N&i-FQP{PYX#v+qG zw(X<9fPHlf=uz038AyyTCWua{gSRd)TC~=;g%D!=z23_wwDe_Iw92&`_Ml1mc+F&d z>xfhF zWPbR|r%~GInRo3OeC+P@u1D}O`reO)4%3wP_E$r#wz(s0#g6N=xZG(nml#(YloR1Q z!c9Xe?f897$fN{bTx4)S%%1;ImE!W9Id&b^09Mw80Esx+8SjQ>TLASSY=`_q6*)eig*iqC!G%>RT1h6Gf*N;XOB z{)f1(RGY zOnF~!+z-wE!ym#!i71BuQYuK-?r#!ih{j5K;abp7S=|iCkQB&=+VSVyTBcXbE_48}vKCPU>k>ZCM{Y>AUZ5D6VZ{6U2iuE)QMMUtnHrxD z6rfrqJJ8Q_&`-QshH^Qbd%eFLll_BeyS{}g(=XR>zw6Nopb(PYg0MH<*VPzc*KVGM zgcs;8DL#PtnwAf?drivZ!&?mzmUo$ZY7xV?Sp0yw!Omcn9I-?72`%l7OkKFm4rG7s zBHj^L&FG7bOYUrhbm@1j&`;#$W4R^BWYxnh*!3@eTIufB|f zR+X3W!j^Trta=Js1Ddt39ir^Bz|{OPbnn;(n-VuO_oFWwMIjnNSK!xfh0!zVhXNp_ zzZ4I`dKm1$BSgg(>nSq5oI95{7#pQHec0D_o{pJXi6DMcoLIekW z!aQ1>GLXbG4E%Koqd)RramxEDnb|{D+qUk+-Kn#0Fv2_dz9*uJ-k1&?PFdG z{taNrCX^{!Z7palhcjE~A6WHH#!)%8 zxpEN-CFBH`6XSv*blV%8w!GyitXd zv8M)`$91yWNyqjrEMoc+#QU^kUBxU`)5Kz}oj{?)x{B?f?*8j4S~{aCGD(H~HmsYN@5A;ZTfgABF!Rd$_-1(L5#9pzm&3BT z1%N~DDfF>Q+}PAqZKjFaszLxtOyPh=eF?TWDmUf46jWPcUj`cF5d4*)`3R`&luMdX zTLaLhXpijbgZ}IjFlkpu8ZlLYqxoJMYm@_M@op@Z3uyfq=s zGrEgC5|P+JLS065;I@OaevZI&8Gpg+VxSQSXYfPLe9 zcQF@Q+0;WE3~wT@hd2UMYTJ5<*+8ow?IC8t@UQP7w(}v3wrfp!BUAM;ya89RwH#_m zPdV!t6{kpH3qq2cID<9uU&;5-@J+N}B@bEyt?B$DoPo~$JE!ij8LJ!FzJCX0#;{sd zbuoJ34)0-W*@Z}MY?&NNqnjU=Q6%Be0U9!QOR}I{cYGKO>R^?&x~JF?DbQ!|(#_e1 zdisLKg}LKDay!v>eykL31G^=o9CgdZD5s)oLN@025o@D%yQkQJp;NH_9+eukbf-8D z;0=#cwD~|-8b|vwpp0C-Av&J<_t!+2y5JZm%ZUvbAvu7N`rsI@bGjU7jlK}9aD%Ax z!-^)3x2haN^NiV1+SsKcNW%v|wFR^1HzOKFmc-M$tV$U{yOy{ir5MFh(daot!)hdjS zB-(+-daRcS-G*oTP-bSLT4AsTcFQGpYVOZ5vYwx0-9i1wF{5|q$n_F6B^E=gy(cph z{pT}#0e0V#;y69G85gmirlNn1>u9GhrT`b~Y%kcVQ! zwV;E%&|548$Y(+yF$a?IL?3ZjJLLiD*=miYqg|w{FTMOBZ%eC8;2e&CXclNc^btEF zWY)5;*a;#vgul47d40t$aG7@Y6$b(bR@+zX+RiqRdUC3RH1;u6QZx#$7YWtZa6Xdw zN9atM)=%WDuLJstS?!(Z8ejf!wVSpqwwJ)lK3u3!MVD1Hoj>#wR(EYbu{VU|NI%Gm zL;I+on4Jp1sd{c%F7!hTRNNZtFZO{GJEXsO1X6#izZkLT0{~fxWY?45;rS7Ole}{& z=pXB~HwTD=Yy!$&L;H^ENuEvxBvy4Qaq}tp1y%5T`XZ zl!o%F!xSkU{RABZ5dnm)&0ui@f-g@G7N@`q{Bf|@O#+(J`)~~wGysL3O1=dktJ@H9 zGCV=w5OF@fb90C|5g+b5RO}8g{@kHrh5^gr8z#2L-0UAFwoHSY_x3CK1(e*fx-8^< zXvUgh;sHcH7Y-Mf;C5Gri}zzX9g5f&lQmlrSK+dk6>$I-GI@mP#q&No0>1^dH%34# zoZ9ar#KFz-y3*lGieqG_HKGm45ufhR*o#&=rok7j zA?=SG@g&6R^^xM(&Y@mZ3CP|Q8Uzd&_CPCZxFcyVSM~&f!wxqA{b6fjhStj(B|eE@ z?eS4!H^|2~qr_^Ad`GT0)Kt`qIv4XvaUg8+X)abIq75A_TJhWkqeTu0+dEnuf_U%M z(Rd`MHen3Z9n(tqOXZ2@$KZle{W@B4eR+!4Ns&94{KgH1l#gr2}t(9a*0p!y#9x6%kr>!XRTsbsSML{ZW6IA>5of~dw@rmQuGdCQ z6;ETzg=ts-U0XR#>|=>eAocesPEQv#sHl9J)!?RTJH$uco+hp|)Sl@5fOuR;pzJZ3 z?bUvqF2+r@`84*d>~0SY647qY5LGPj;+fc#MOxKNakIg4sLL!7kEL~;EiOkpkY{I$ z(|G&(UmnC5LYn-LI2V(?_8~D_Xe!iRd`KLQvEO`1%*4A19ieM z-W+jpigPNe6fPQ@DEUVAocLmnm}0=^Z_ULg99pY+Vi}g^*?D5Vsqq2&l(jBENmto> zB0diTGDT)n)+Wge&_A9_Efn8s6RxJ}K^O+$UvuzQaI2`Z1X&QW5sx%&fw;lsd6*`h zv*Rn95e4~r0n}0CMB+lRl_5=i0f!|FC34&v+Q3apt!EK#;?<58iIXt)gkrIW?4M0n z)#Et7xQVAEv(8jI$R(?yjV%@{%t|4x|Fzf)BsUa?-)hsoDaI72TGk@52Lx;KB5`7y z#_iO-1-Ohk{qy6Lq|27^)W(Vnh=PlpS|l!R;dz}d$d%P3CS3213U4qUpj2@&hDo%! zi*X(^ZQo+dXhhQ&iwb7QutfX@li#pJ?2nIREEP`*O(k0WQfxt{nU{%cA&%RYK~@km z`*yh)#N%%DLi(|`KdunpmrAOUaI4O*q|aBt4N^eApuPVv_I6zR?_nH^CEB=^kZ_w; zv{F2Z`?Ospew9|RfjVo8$vu42lcW;7;ilE%i$c7M_WEjUCBOFjYH=}cKX;8d2*UZ? z8tB(b?V~l~lRno|Bu~mqGbw89sS!XGw3DO=$_HOLAQee0Sdv#4q34%Kjcu9j&6DLp z=5gh5j<^`gwqVm)FXsAL@W8`xDBQhHp}`UxdTONs>du!T<)I;AoB49ch6bETaq4&h zE9tyHKLlzKYh^MFO2TMtoez3O9S$SHV{P0^%}REV>bWSq3>?jd5BMghlhds`Vq^vI z>3Fap@PKb{|0i0fQ%_M6@Wxwr_(1?}ZbqHSz>-()kb{7^XW%bt8f;s=?X4o}-H9vK zC&N0|$0fn|c!G1e+a7?N>OK_slAx6x1w8G`Y`-;@Mq|73VPb!fjp$`E{&&j78AiHU zokMA)XSJV_CqY=2kz8z}G|aj2SWDc?d<=*4i{IuuY0>s18>zSIX;dkd9cE&(x*3-% ze;^nN;i~UTXxs zrzXSjcm9-*d%w${yH&B778xr%K3r0th3wH*v?HD+*TO8=j#@{y)B%1K$7W*g4wqta zl9SAUB?!~E9+j(|F`GDnVS>aiaNF4UVUQHTELRUkc#O8uTEpSa!3UBmVH(=1n9Z~s zvo+l>0lKQpm6ex3;L}@F;HO+Av4*qei15Rd%%@9j#!ji>~8frf#+6(0Lv?*oTIHkZYMKSh1xTF|Ba^ ze-#n>VNh!9iUNTtl8SC0mo{@hXvoVPZXeU$*dV42iQ#{*Pvc#QY>~5w<3p=No}%Gw z*$Z;eLp+$F^hJ{0{5`L#h<%)Gqn@sO2J}O+vS*`c&5V^XW%3o--4+1a;9E5Eb3Rb` zr-4^lWpxiG>DGWYcq5Kfx3*}bI7FziXrYZ_7ob+)s@UMZe!da2qig?d6nhVhNi=-9 z*aGxf_qa9EhsMXlKO<9jsN_sBo^c=dqE(PJB~ednURW12SHOKpKz4tT4;Bd1Dt%&> zNoh{wk3)|&-bJA5J)h`GLyJFkTQ;G#+1X~Q3MdUSt71m)P*=MClw9AQp6CbgF^ksr zofAP+u>}{Iu61&_CGEZrJ{s+!$f)Oka-Ec?J*dJ6^=NBVamamnEm0!oQX$WdnbdZo zx|Sw~U(o!7zdD@4i zV(uViBaMrQ`;ZXgfy!*0B5EiJemQD)aAPu?j(x1yOicz(y|nz*>;U=8N@mf&(HmSF zze&tabjb9zGw|2eZxXW--81Q|DoN1}ZW0~oO(7ztRFbIGB~j&Yem&T*b?wF`xH2|v zKpEE0rp+o7hh+t=R?jO`xm4i>F}isyt(T#Ah4tCBG~I$D6SaXQ+UYXU0UPz(GI3Nw zWC8Y9Kyz*uJ0(Q6kqfBenYEc4dD`a9uu>yhXtS6pMSD{H2-gac70~bh?8m*o*bHAS zqKzzvjiqY7azumB0Hs{)mJ)|$vEIu&l1AJ4wa?1M4heZ}!Aj%S{wo)^3Qa>a{}ypZ zzow-imdl3llwokO%A_F9^Q0Jbm*-3B+y<#~rzeF`OHo%u^gB7#MA`3_7<=pzbs2yV>Yw`%$3*2DBS zK!4lQEj{y{hc(`eT*|Md=F|Blw4*0GOq#4Q?W>()w%qN;vJ#$016Z?kL`%~0$-839zy8o> zJuND}j|~)m(IbK(#Yb!ecr7OZWYI|ybz)O#kjO+VBB?RM5PZzgL8X->Jt#~e&AbMu zk`N_rRB;t)9ych!QW~;Ux{I{%3T`FYZRn~RkCIk#!K0W029s`Zkwm8m=BSXNe=H%U zW(37Gq`9w%4Am3w5}TWBQq2}&RFGLpvtlHJ5HD%28-}QfxG(>gXG?OF+I9Mj+M+~o z+miE2vlZiEwIxQ5YpaR)jw0&9^q>JGP+?<4!L1)6CKoZ76EakbMZ_}%N_%?}E)rQ0 ziM{{xUII0h$TV8O~cS|Vw2K7E~dmV?v61+6jDM`ZO!f) z+7Tw4X=|ossySU4>1E~-9o+OWHLb5OCeCalItJ)dsx(Cy=S^~s=oF>Tsx4Lt6XQwB z2=u6XK~3K!-0w|xkLcnyzNEH1D)=6VCwoS83mD%}A&6+3T>lye^<`v>H_#E-^8N`6Q5Xgs#@Cz$~0J2PRQ9SW*X}?H9 z>sYF%Y)LTXxM4tJ!dJ02YMIxTdfqV5k$7)p{A#+0Z`)vSkXX`8B8=!+Vu<5%5S-?* z)G1{NI(d?q^@QOl<02~qh6}1;^>3f2#ZvncUmukw>&Mn_qj(k!Cx^rRjs9n-`_TV_Z9<|hszg z(>eOIvqe$Pec_}5hR!$XbKw>xIgp#-1_w1BaHjinCOMPG7_vJWtHSA(IS`_WhAyLw z)y|fooT=gD2Mk^38~IYGSc(}3+PcexaLY&zr0XF=x6Q`aoO10Z$OQ&>t+bn4zHoNB z(yVwy_ai>z@u+<5>`b-UiV;077*E0yP)S5I*ht@d525x8HTzEQam{!t(CW9d55}5p zIMeg4Q8!!YyB?dV{EXqAG-eRNobZ!wvTS)bO3Y>aMmB;ysU+N1@ZimZnH>}Qc~U+% z3^Ehr2!mrw4X!Y9p4ara&(M2RLY=d&?5vRKOL zGXw4>#LO9EH^B=^wP9KDrFJ?V?-M2SuG-!$ZxL5GQqNy^*|y#cX1H<^ipW^cKNF<`BRVqUYc|WMGOxM0 zkaI54C!}R|+$`CM>40H8OP-XOp_UhszOfvS-*h0eKi%4B#xBQf#Yy^^frL2DjI^oe zZ0(1QDkW)|Iit2SX;O#r=PH!6?3~;qO#Z0DEIOnl&G~$fbFB6C%mw=PU|PQp_If{d z&BL2_)~5}5eoT|Uy`kf#%>lHt3i`;=#15s>w#`qtBwyZ*VI7m~uXU^(^^{kdD2%=7 zcVyZR(%m6x+KsWEif#w&$EnsRJ$PfBTH#FVaBlM+ON;r>kFTugQ`+hB=4T38EP4LE zNCmdfjm>*2TdaD1LVd;H(u7%ObLtH(=jIfNYs`lDsD05Ej|vmx6~jv9yXW@%NP20G z+mxI$$ziHFprlviOzO4`YVd+8deV2Con$K=9Csuu1}G@q+Tm)58GM9|^kD1hMd(CT#T$eMwTeAh3 z1gZu5I%Xj1rYQCY|AmnGrDdw*-X!Ib56?~?(yS=0dw+3>o^pBa3~a=E&wyQdPk^9* z1->i!FC7C0P|omY05C&Myr&-tS)k5XBKA?q;qqehg?y)7k2~4p2HIU=aA^6dGo~*sM*k2h~q{TK#Z# z_Nm8C1}w2$=&@fnJ$R+rqbqvGbKj2oTK&E0q2HSMe(p&|>t>5s=1Dh|t#F!0pLJWB zmCfmE+WNE8Hu_w^(xPnc6w_lXdO1g*k6PN4&0A%9{O4ZE=vs5@tg`vLOi!)o?H>KU zyLH#H!lNebXP6o7{H=S>TW}=tnMr+?oQLWfSeDng{kb!J)@`}e)LO|ZVml7}+{f=5 z{gKl;Ml9}_QZ=Xfo`jE!tXIw!4@n87^?ULBm5?;$g+&EBUMlVP`j$`Yt+QTOT#|xG zZKovI$Rj};BL*8^FG76Apy8Ye4^7nOIPcVi^*bj0?0BWLbtGZ6$GWS0CFy^5OTDGd z{1=u~?s%iL|K%-WNjjG%)wd{+x?cUfpv{sOmPU4*Fbue{QG&rfJHQrcO0c6w{5aoSE(kQ>rc3DM<)P$aT(iFUgb;8>Wlo zx=Cy+Z6btrcXBP4b`TqDcfap^9>2%WA086ZIq%E!^?W^F&)55{^$J5(f$1E) zEy|m7t)H|mx&r4P0W<+4(8-w8C`HyFN6Qm{v#E?k4U&wY@RhXimEbSf!;A>(bKsA=(f zUFqXQzg3JOCu1}F4SK{%<7c5Asx;k$p=v~|_1jeN=ZHv~Bdg1`U*nTqU=Z50*JcTK zK2!OZ7kr4fxmml>d*>@8pr&BB(x#_&Q~b_1s(_|~&%HK%wVShc{)tR$D;N>lKCj&Z zfEWf_dUox|_#d#-&|*p}C9y~O$J{WOWuw?f+wi?`J= zzeY`e%P4BG9dS?&?EI&7`qzU0Mr?tYVyY1t$u2~EU~Z^#QX93A=;#>2{pt@GYG8q3 zVQ}Zz3{c|~W2_48(}~9_nLjl6x%=9O;c6m5k^Pp%j+VL<{uysQhL)4e<2Ff47>q%} z=6MdK=Gn_an5^rjj_tYWlv%bcx{#e<=Teu~q8@_=CKYn_*?HFG_o~Nc2i{g$YGEB` zY)LVq4$KT2eFlmX2_OgBMwv)3BQ0Ff>8^GYX##(Hob?Uk-^6b&ClD%i?^qixwZvA4jhc{TQu?Zs?g41Nqb3^=~be8$Z zLSGk(&O2m@cMg;Vw1s{xwEf~hiPg+0W3n5ZE)%&r7hS7 zJ);LnQ-c#qC4A_~sg(-Uxh0M-3RAM^rN^YgVY;i`U zI@~>K+>P9Qp1Y#n0~-=R>P0cUcP*7+nsCpuarbif$C$0inAun)OK038eiX10c}TX( zUpMXvZR;@WpVpZdil%-U_Zq3nHCuBRxythCwtOsIGs+lebx}T#%xs=k#q+AVr|H6d zqsA-W*CrHVouwF=^>UJFF2_voZNI(EdVAi9UF~4hu%K36DjKhr4SO6LjPmM^vJ;NSQh<_pB_F`9O#lD*H zPMuthvs+EQ+U&=SIq4AwwevRnBYj2rk_pG87Fht%5dOth2Bp*bf)@(M;=m(s1qbiW z+0q5G3TbcyXE%TeCk5bz%lfE31eNpHG7Kh96d(|w05C7~#+2*yQQuVCWib_mv9R4oWwFPKV||Q= z^~aPPlVMeCQ*qp&XkOm&%-vt~v6tELtcgiWPN;V`CB@xl&kdire96hi-RGXh{m!0W zG%+KO)xMi0#dO)XTg>)cX%Ox{Z!aBSFE~2Uz2j7$`K9t7hPxK_Pu$w^(>HTSoUFCA zaQegRG`XkKK4F~klA|tr99a_JuJ&WM(Xs?71kyuU zk@PK;Nfq#Ck~(W1c(|b2Na6b62Ow!Z=E)cUxIx|W=8=NprDl{40^nRLhKLeQ8&_XRg; z>yA!(@Zy4E@7tOM=ZrTDPWt`DMM}BXV875tYf=fq3DC)(etN>y8(DUfKT`D-V?Mgi zxIH5Pig&@koEY=@?m{P0<;`FKo0h%M{<|e~%Ol$lOD?}<-Rqw#3!S*kz@2~-mk-B{`;^9L{g>_EMF@SVrvz=5{Sb%#9>6NRtRopCrY@=tF2mkpFu%H zLS||59Ry*_7zIoCMKZ*PKshb8r#-ACQyUUn(=xzsK>$JsmRzVPJ@YM;a*pSQ!(mz)DfJ=VXxt>5Qgt6ch-b7;_G+siv(KLa4>tug1Fvr}~O zU|+dyuW_}rXMX)9fcl`S)pdYTYNQVXC?#@|ts;8{}N?Y$pTSNk1xEU;^wsAX?W zTObU#B+5XLlHwe4;q$J)(^(bucjNcZ$XVvTqyCX+RsFsHNp&zPTP)(^*-BGGECpv} z0}4C=JKfj+))B;O>J9Zq4Du;;8@{+531sN>O) z`zNg8?k!KsKfckcaomH>{Rx39mhU)u-V5dn{`dv{@G6u>0SU$f3}6!84bo?x>h`*r z|8Ur9(Z?0k%*H52gi`C0$|%qPy$a<`@zbyMR?lt%z0yH~f4c6J1U(WpFQ0pQpWu{H zKp68(Ivs}5QRsvb8YRI^(#xBHUJKblj9pcpR&lE-amuZ$k1Bb{ z`!vnW=CUdG@*l^HU9om$Tj3EW|^&ie(O^8)K6F8f`%Wh9-SgUf^QUD(@MzdM?bDWlPgxN z9^ziUKJ{yg2iy{kko05eOiR609}*Xp8gJwuX56c>Q>$!Y8b;_ zUPTEgWfK7;v#xe~k1cqXX}$B~8gf?Wc`QJWcmf)c5rSWL_8Ir;xu&Y(8Guik_5b8G z!~X^dPJ(|iC!Jwq#C0-GAs~;+S6lReDc;~ua*YDBRUEVnSC=teZ8AL1{lpLskmU$5G@$rlb%?vwmMlzS#p4Lj6Q}8-QHcj@*+#4j=QZDr-@!1Z0Fk9_=6#|MNJ9Z|3E!J88N(vG}KuSj^h{&!s2SLBzm zbVzsL!r~1>`0v;KHZA?rAY#Dr)xurL)kn#5I&>Sp-TnjdSA`llHf?jVzJDjb03oR> zIa&OjPZRu0j=c9icn#ZVzw`M%|B53Y;t$@)+33FW7 zBah9X`0*Nk^O4WJ2cP6@&e%EhDB#kOzeW!Jfo;j&X|SAzkIo50Ke|X@WYR)%1iAnB zFE$WBKxF~||EAG8B{AkX{&dckk~{CE)2@epaZ%d73OHYp*$j+hOaO|RkRWjUT`M>BK%rE}<7v~rrej0>`vxhs{xfN)POaSqE72SluLEgq5b7h zABSa%*Mtb5E^ujPN2z!gRIF#NwSwD&5E}YR0_J}#srYi|NLj$bCB5oHFd4jU@-=+= z>!trR9{T+8fA7j)Iz|Vy5SWnk>3=f*1ppl-K%?6R4hifWH2CmHZYBMF=)X5@zs^y< zz4MQg4Y0#6F`U4>scb0MlTzLEzYG2ww*Bvl>Fc)tSkresJ=Sb>52H{u zcs)LFDaeC1Q~23a8tF#Wss;p&p*T83MzX>XSAyQ-Yo*3Ekvu0fT*C@dO;8(MAcaoY zG7Yy~<*R0VB?%{5k;XJAJ3^_3^99ucI6HFSPI4iIvUAnupvl=yT`XBZjl)rmCQh9l zqhlvYT|13_A%udQ_F|6JbdN&1&n~OvoK-x$OX{1-c(1W}p0kYyd8#axXGRq#P=^EmM4i+y#>aqR_P)wUNbUk096 zezPNK%Oj;kgl%>z&$LFCT!@?6M+6n8nj#d305-vNfTrl9MyRz~D4-#LRwfgQ>3_5q zT6Jfrz!Occcdkc6|f7N4^o_>!S`R?thw9VO;rf+BIZ zxF%?KCx3x`WJQr@H+<~Tas|9kS?39BmzoV0vCDYgQR6=Zb-gq*V#|lUn%RHz zrmNbrbFD5a7|nORp{E#cm+5T+09HT*fQV^+#6|fjJz&cyv&46GZpA(mj zEDSR16+IyUP%T#g9eg{$9i0^hSyEi)<{Q%KWa(TBlluK-9-BgRogkSK!~Dmcgv<{o ztio&i`T-L_rFT7HECEpMK`HpfvYl-}0zZU%PUWLPdNo#+7?hiaw6$4+1PzRUE(&fc zn9?b_S7;UMup)CuW7L$pAx{d&u5(yDyyH6ndFc_VR{R~B;1g+p5YXio8P`A|BSKFo zoB8WBB0;D(KlE9l^=^l?nWefY-{{acg`%^y3_U5Z2N9}Q(;t*;E-6MOs>ZEORbWoM$1X7FxpYVvMwiA zy-iyS!#xR}m->_7ED$l9Rbz18w{cJ+Z}-)z@uKuJ5&h^6#9sOq3162cFk5I$~D zTwPaDR~}bBI`J~HSrhJc9f9j#47)%8tbd?dn3BPt zI4;+hi7n5Gjs#G|XOnbz28fp9UmU99yO0yz9CoB053`lH&#Buv)5@GhY>3IR)j+Q( zszKm&mHl;9b-UK{XTJ`gHaH$RtPxk_mt(M!)la}d<jXK0%=cZ2^8c3mKS4w@=(b3TnGm4zO z9FGiFXrg1vBjyxM@ZrxCkrb8%c(D42l28J70W=zZLSzU5`X~XdUBR`I#WqE>In=jr zKc2j9PsCfhDe)}VOC?pZ3T0FDpX$kNffH9cp6c0s>Fy8cjKpx49ga;gdu~R<@%z5? z82oY(02Z+}!$-07%ssm3x%3GHEj3ApA^~6tDAeFYBS9}c zSs%sBK@@Z$X^|z^`7}xh($qd|blxVg^1ACUjx9>T-sgAc*UWgVK=lF!j3^|11es1D zJ-|b4)T9+T0V92sj*_T>wd{~&!tba(jMRXWajijuh3j$1{?xSPS`!M8nn{liU(DV6 zp?u*546;@swSuIdXqCp>ZZ4Yq$?@0WyLqH$|$Q-NWmz2km2LLuotw`;GxH+`-Mrg;Na>IZqAvy`sGi zGK1PO5xX6>*^moLD3Zn-- z`{&^1Y9>@Hcc5h|dOq}4rf{L6Mc?~YL?*a`vT2dEvqC1~5dMH~haM8}M z=Hcy=p4Z=0(fLMSh?!)Oq1NHNY3xif81u4&Ysn_%-i(H)8wjB zvy6yY{~s#g@-oqnVmtgb8t#m$33y98F*i4(pChkm2Woa@ zW`Lr0I9LogMWmM#xUaRcrutO)ZAv1yF1~_CGS?}TVnG|Nn?6%d)a4;+{4E9HJSEYt zp?t6zYcPr!Kzfe)CLDnxUDK}hk7xBA_1k#lPuf8kUYN7tlXz1gy@KE7?_?4XxTkPD zGYUC&H|wj&BuEk~8Y5j4GBecD=Ja#ZSnx2~!^%|nWx98sKa%|+`QUA{O%bz~h6kKf zj{n?queVLX#dt?1GC{cTARbw4OtGX)lmSJ zEaVu6gyBUAwN{vRlW-uR@CvsKf!OK~{cA?C<>+$Kv;keB!3Eh7a&{LIpTjUXRcf=7 z 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 z zpn|i)I zpoU2x#8m`{lM}QxEAO00+oY}a(ccG8NpqEnzmt9mbRGH{0YQRWLXbk09 zW&n}HY+3R@kr~{(ZFxVP5=`f-V^D37!6l2~Y98a?n~}R!$lHTC%quM~^6QA`PPf_W zI=}5_8Xm#q8F$O47e?qMbTiURYJd=SNJ7qq3u&foXg;aePz~%oP4Nqnz2NkNJm?7tfX;-A6#5hRWESil7dE2VVyaw{lS~-U zkeK+Q`<>xba+1jsG1{ojC_!W=fj*#ltfd_aq5E_jlA&-+7)HnM#ibt_H@bT-E4^;q znA}s8E{~%eS}cI_$1p|*Z!lXi3Xn12$ffxLY6n3?6L4q?HfsuKw!i(***f@4J-Jt1*j2UViKmEKqUzTa5FliTLp z6_cN&d=!n04sUiEbU(#b`vz8EufDA~_L9o`v*}m0 zmp-{afk4m(AgFi@PY;JnYGKsQp>YV(2Hg@4l$Z)k(vbqR-q8Y4#54u+KXti8zXR&c zMBZ{ytpLS%ASXXcWDF&!5j)JZ9}L4q55A?})MlymQZjC7TZZ;(WZbR!Z3mzuURdiI z3x)^U)CB_o!5;>TS2*Y@?7aX&oFlH(g{2yY|ASLRM6rijKwdZb4=MZT*0%K|x>aSb zX~unR>nFYT84tB>)cPoZCxwwDaI6M=7#JxCr7Rc_1AqVr3E4>|8&d_K3nlX*MxUZS z#!+UUU&c^`tq0UmRlpb=d1c~nJ3kJ8gJ25UCLHDVMP`hQ|L=Mie1I}Yz#K7>4PYR7 zLdQm=q{9g}4w5GEU0AivbVnY<3i1%NE_@VvK+NuVUvkEH#Io0Y+cLxv%Z(oxB62t! z5)8ntW4Z7SF$|`In1F;KT!=xcUBYl;4MM}%TtCO{i;62Vzoo*yDOYybf? zz@kRL8?+FM$|P#YkdW1nTbmzKym= zCI@4PY0~IZ#FiDhmHxy0zyd|&yjBuww!xOM%D8k>F@>$4{^)i)Fy zS2$eCSR|)2xj9pL@-7;HT+5I|I2k|e%b1T?k??RL<68uYONs@aIJD{Gh^NS&$Dw_L zb~f{)BT*rbpush$LTpOl=`*R{$NTy-nmm57TcwIjwEkN2Z|cesRTbAy9j&)j3CYPKPa|zXc5h7fikem1BFf zsSBn4Eqo;LCCV`FTwLRmNc-sgciW3tnxdCdak!l3f39Urc97AI9si`N2GJC{zDv~m zIHWRCv9zTREz;F^z%Nrd(k)>iGE+U$ec?oK>WBd^F;k1-@nj%3Qm?3^Ocs-L9>1+I`FViN{FX7QdCIrh1 z!v8rPP(-v8%NqKtUbc`oG2Aae)Au&;8 z&$Tb4;zjxaBv-7=S*qUJN!Pc=|Kg($nJa2ne|>~xv1>WYhJGIut^fprgM~4HD{mpx z_}~I)9wtus1Jt~F@h+H&|Un-^nG(n^Qy#_H1lgFWjQwDVs{fJnpl08D{HW?q0bJ?09 zDMdU2VSb~mx$A)-UeaT(Gm3vGO9xY!Wy2e?!Wp4YhI6z2V60Vpyz_tO{r@NW9VG9` zimm0r(?f&>;2=VuC(3kA63gwmy;YEB;#bkf>(}q6cahvxOFiv`o?*oSm*^b@VHXS6 zf-*v>$ZRc8$9!+E+@m?*=YFBIHY+i5-SNk*SxJ%MuODB}N{x&#ezF4IHXMZC4hhyQ zK!AoUIKph8!7}qTcEo0QEH=$>7p&t(xT-qH1Cd!5s$KqCFx!Z%z4t(3Tcx1LiRiHJ z&AK3EAc|OSo*5Y*^kg(En-Nv{WH#$h#vf0fe9z)BxN0L5xMX1Qp8@nAg&aLk#wPMl z;onn6RkzwYN)lD33X{`T1#$ByxL-S1>33A3Lr3g=rQH6b@sg9&rH9Rs0M}(UG(LCa zy5l+;lK*yIuecT|b{1-uM8+H+S-fRWe zeW#b`xh1MAHk1*-_)Lfk9Sz%J(;Zhl`XQydHvZyhwR(X!q-C3d3vscN!8HX$ zCWOF*RGJtW#x}ivdVNb96+K4qI+ecinFayUW|A_%uZw??|>3UQU=cj zrP#QJ(R5jucrg=DMDMIk*BW)8xgWOXNUwD977Bzq?L{-7bdSpMr-q^98rgRl>6PQA z+4mV4PsZ)Dp;!G45f(;mEgHwJ6K!Ft{3<-NU|RY-9&py+iac+(G0WX+1Ag%D9re59 zC*0vNAT1^HL_RQJP=sz^E7Vgh0Q9Cp^?sWhxBe7daLVqV5X@h4%O0G_^q2_Fems#? zJQ0`ubmI4|L9og}f7@cA{2omrfVZs-W*{tp8M~(){|#980{46AA4+;vR74Tc4vB1g z-os_Cp|SASt!WeEayL-rvPTnY=Z3c2oyf|5Hjzz!R+K$Ck>l~KFa5XSP$ojrs8lK> zJYZB#lLjOV0z4uhiWm};pGv#f(*o-VT7p_HZBe&ECpIf`nWCI_3yAI+Ql3Y%(2#2p zuWEC%pVep2*5+M&b|(8>E$`2-&pNU{)NWn&de;w}irS)s0^S82Y{mKSWxUpD1hZx0A5HoV5b>sz7>cG|Q!7Ud#O-fz< zMX_a$d|km;F*`@Gu5clQql$jhH=Z#23Qx(C=LhgfCZzcSd5)>H!qm>bg0O3H@e#f} z#D}KU;KBR2l}MQD+>I@^(HGvCZhLl4Et+7}ls6^aLGKeA_~s}_6(zig%u$cpar{Mc zj&@Y>0$~9k$$}?>ScV4g2x5I4wiA##G=#)1R7T_=qK;F1z${InO=cN>h33$#Fzq_S z^f95kj$xB*J%);4BIbUf~N3D>ND5dkPm^@jOqyMbLW3nR0=-JK%Q~({r zLa{bv3>N%3TwQHc8yM$7!V}^p%s<+FEmaE9Or_fBYA7r90}F&EQdmI#b2wXKFGSjI z%dtXPY1{JQRhSrTMV4D`Xmm1(+I4)A*P3Gywfptt^&D2zo+t3wa9yU7tB`n%!ID1* z!#x77TCNm&&mD13QhMZV?9A*}JOB9GqL+O+Hc@*MUQXmp2X5oPOxvWJfA!J(B>mx@ zQ1;*WniKane9S&U*3#gK9ZpF1`tCda@?DNo)c)5mf8}6N0^=!r7)?N*L*xNy)5P!& z;oO5-F}bc$r3q7vT+e54WPdLtF=#~NF_MrTtJH978)wkQ+)rAY&v_yBtAM>F%*N4L zMRw9*o3w9A{u~|W-kZhwZ7EB9L*Jw`jV=Wl0zIY(?aA~ z=Wd!)i-HGXY`}er&0L+K$BoNf_w3-^S6R7H&nn5&MY%E0sywDuzJ96LnAI& zKMt*tsK}2LMl9FY;Rk=rX1loX!mASq)wu~ehbpH}Nn>m03|G0oEu@gQJfK_wLpE)8zB zA+lqcxyms3Aq$sGfxryqqV5C*4(#*y!fi1U08%&|GZhjOFo!lO2gu@+LWmxsMa>*l zi@ZHi4XF8+d6F`0WOr6QOg}dB=55R?eNsJEe2# zB7|$5SPU0@195y?F3A@rGiU;0BRYncil`&Vdl00~L`&$4TI)`Io$JUuQ`fSL z_humPd|m5nh!Y=+6j;bP6f#Klp5@3(sUKLxJS>C5Ax+W-I0tj0FRzBATr zNkX=CtRV?WwhAHpl}fVB*w+~Qk{J6~LkKN*ED3c>o6t67CrK);_xnCR_xJOU$Bc32 zocH^+K3~t*>s_cNQX?kI_lSUM?E}sV{z?3 z)Ht$tWF+uMTrNmTAVYB46>I`oV0n1rd^Tf(pwZ!B{tpUdV zz%=p0t{YYi&So^f?4cl$_=ho{xUM;C6dfQZjA$Gg?0K2)WA@l~JBfV6ckWcl@eKE4 zPAPkjuV3WH7WNA7{$Q{u)mOCM5Jg!nPajzCiduhri|ymRsLi*x4}E+Q^|gF9^y5s_ z_wu_pKcb+RA`q2(11}D2uoCK7TDgV{3`OwnAGSKqk&dZhs_4p;e{>{2Q1=O$ly(2^jVlWB6r2$w+-WH-io39pX{RrPeUF6 zRD1={F{~0XeQ=Rxsl>+%AA-rA9F)bxLoyd13a~#`Z2kQ5cDx(oH;A%NCtLue*|Q$f%PLtLnR(*K46Tu&!79Oz_@QzcP5C-R99M;lJj{v+Ccj8%g^7V4@!>(&cpy@ctPyocef?e!{B(VHgZFoyC#^T+Rlr4oA>vvD@Z)wL^GZ`LwZD1t4H5kLU z1z|^)NW6B0{seBC-9^FE=F$TRG3drYp7&b^VsziiYWc-D)xcfyUnU*wPCwrjpdnm) zUnP$HHBKz6vnr?7t0?Po=&~AdJ;`eDpk>T4=@%!yxWt^0o+$d_ALAyyIxG$>1TbfhTEn-A%nj+Q3GZK2YK z1bxjGSx0MlJca^|g&8q{(yv~A?Tz_M`nB-4(U|k6fqfs3xmfW(DPitN$$!qmk_t9m z7cw^ir;qrt`Nw6FPIzOSleQ`~nS5eQw8ytz%sLhF0QmhfGw|HEnV8EJZ*PA46hn!r zc=zoaD)v9S#RKDM24o;}HOS-K!bBq20&7T*?)IA94wWRuXk!Zg8 zI9Zy-20Mk5naSKY?pQUL847LltMt3TGD=XB3ED%b80Sm{RVuphiL}U>LABU%yvgvk zc5K$W_iW$IV{_ll9r}Jew(y;P5M1;b3s509u6+8~}1*0$&ZGjFq}>Hh-?LEM=OJ^1U_;8;VyhRY(AY+~dQW>(YJPr*jS&AR9NQcELaHTCbjIUO z#m8?yQI!6Qjs3rPDfcQqUHSzA48()(kPDE<27v<$LP9!iI}m_-Q}tkcF~E)`L-EZR z3v;0VnSvAWItyU^>4OFvY)VjiLXHNcfhxq5Z|FG_M=I2Ee!bvYNqAmK`L&z!@bu@! zUk51Tr?+@`e(?wWuIm6aXs=u|V~80Te^@JvipEnJhkc!PNwbI2T9N$78h^ z*$Y?#N{-K1MDP`}kq%nc*^JFRgx!h7IIIRwK1#r>PV<<%pyA*${QEd%;@y{&-#(P- zcVF-SzDVgc<>|*#@=>RgnyYXHQaq!Vl%>-@>i@KWkXZ+@&u5t!s!$u{Lj_1dixDXU89NpY8ET+Fz(9pqfApY_r}5)J ztUx^uDeQ_;A*9X%WCr>dAR9YqBn4T^4JB`o%%D6FR1Y>L1EUXC7QBKE0=_Hv9MQ)Z zjnoG6O(fg6ivbX3O&ukX`>7flD!(Awh%sm}$9$@|3Cl-tQqrL=$eAp-3`fBzi2wXO zBE+@9{v58L3NcX2*k{M1Mkt@9f1mhwitGV0 z6d#W9$TI`r(B~{L>{FH+brj8j)Tvw^m?g-FO7g%eq4Xi3fDq7*|9&Vq5PHks#w;?8 zX$Iqv20Djz>5I6cNqJSImJAzn`vvJ28#SqBoHq#b5&nE`A626`D>~H8EXXYWFnp?+ zBefrEiE^R}v2dvp#r!%5-~tXQ9=|%-gxkUJGz3@2!UK-!FD0YI|NRd zqTvv?ih-3gIVNB}2*3$oEyzG+CFyM2;D*Wc|J*USD2VK+z%U|LLv0X6*zr`5ErO~O zB)S0>4}1#?{0)FrBy>7ej?C_iE~V}wa}=W+sQ~q%Vz(g420G0r4Q$&NeZCQ845K&32;p zswRrt88c1YPbL;)R;UJKo=MCP>Os~&8{jK|0zp`OoC%9$i4}^oVDYA6732O3EljC= zJy^{+G!sLy0}F)(p~6m;Zl}n13D%~g=ome?k9tgtv;d)*Mk5&ggp>4riPHL*lQfJ5 zsOO;&4PZlgL8z0^8Qec;+cv2qbpCCuNt``hKo{o_cbqObN$9do;{p|}H1qp-{`%!f zyM-%4CKm2-YL=%GEx6PUocLo$8Ij<2_7Gy=LgL&#gqLu!aULEblgI+Yc*L?oFfg!K z@C%IamWN)zz>_!w9Y0}@85huoOgGp(Q0?Xhp`-}Tvs6hcTRx7Tnn>N%hM6|j@zir9 zECEI#-Ve|^UKcb{W9WovKD|Lx+J#O& zt>ZkrC@tv?oc>JEobfYmafWmcrqC2k$IcNW(580yae)I=9AIs-$=HZ1Y4yZW!l%Ru zY{PM3ED1}tiMVi%U^FJ@G;cRnuC!#1C{z%Ys|J<0YXjzT7j5GWk+ z31k^(f>=BcRS#6~Fs{arSu*38>IBR=l09o2QHvYs6T3xxE=%5$-6_71rI5<*3ofQO2~bP`0U@i0hJjlH1pumO8+%y%HTte? z_W1Zpx{@wOE+xK}t}FtT#e-0LM`sX+280JlD@R>?BTHoj%mwF$F;s3q=s|oyS$qp! zb(>=#zMZb7%W1>`+?xk}8^ptWND{TfSSX9{^w{mk`8K}CL!H679)H_o&k`pGQ2adv zE_}iz7<>{TV}Y>Nkb`mwHm0GppaGVKC6`dbFl%ormtw*gOLK%v2+EEJ*A_t}x$Q5l zgh#A>1a6Cjrz|Z?Zl{C^mi9K}kuXKq>ERAb07hk;J2K%NSyzOZp75Tmw~agm%)NmD zRD%I+4qv(M1_7NY zVUuOJ1QrEcoBY3DNTdL6CY0l8!WS}x)MA0N+9{nwpn{HtzOoLa@+>6$U>RA0SHQ4) z0Jr!YuA%GZ<9aa%CwYD({7Z&KNN5OzMB|_|iU##xGKrXo^)yxjR^J;&c>ppwvavY8 zW}q5JkYp3tD@}Sxnu*+%rrRWwMBYlXC7^l0hiLFRBnnoVNAP+jidI_m@P;Ky%AgQ? z$Ax6D0$6~)080)&d1#wAK2fI9QkO3`5!`er8^BWH^~Q-J*k#y?;>TB>sN`wQ;A>4( z^E|x7cQ;YP(?*H^Q6ex7h>q`sOX;1pjQJUZpK) zZiBE?K(={}a)J0l*#saiCJ%BK+|bcU{vU}4XZ8>T@JS{!c9sG{Nx(b8Krq=+q8k)o zO<)KdXDO0&NXDU9Kqcw0%&|!U{iLHZj>v=Jk>yqdoCsh6f-t^uZM=9JjATEWPUw;Q zZQ-aSXq!ZF^gQk-cq+-+(}^J%lH^{A85fL9IxXWYB9xxA;|h?-3dI8V2GDgxBF@OT zI17~~ot1GdrU*4A1M?`dzvu1!glAtxX;EaAIIFKAf zl)yj8c#DWyC+ErdM6eu_3oB7fNFE=6sU<@&hYfAq9Ms;o@bXt zW0UEgeoA794Z(QmA>0N;1Swdbeg+xJOs?_t_Y*5mW_SkpwKOC*$plV{X+m1mz-_Vg zur|+}HbB^T1p++oq2!L4AaI~_a`#Mds`x^3-%QAexG!`N(t+{Y&%I|mV`m{<-&|z0^2M&Kx9gP zP5CoJA&~K@=vk^ISsxT7P&B9vOxn{X8OuYYo?yGNmwES znfaf1@a*7!S_mJ&4zxoM5D@}EIwBar1Ii|f$XKWH%O*L?xTXrv?g$hx%!mYn=29fL zfT>U$DCBeZi`sEJ0!c|OmI+7|mra?JiAAs<}6#9 zx=S{_Shg`$RW^g-3`W8(Gezm#`D~Qb?Y-rG{9!2$GWW@bnQ+FE?A=riuS_MmN2yv~ zSN!DOrs`Jh+yy`r5$UGrRb}-N~~6Jk}xOs>9%kW)LU`J#*&>2sa+=pHcyy4PK%h=+12VgC4ViHO2^Cu^ z7N+^mmZU1yr3K8Ejwp7gg?Is{qXk6(g9FGqFpQk?2w}i|Zzv9=ovSL_=2VeBFMG{- z*L2#>4gntm0fPya8(6F$_ORd^#4`{Tobtx5w2n=si$XpRWB(~jM8adHA-MF0TBnFuRzHR z=+7N4Ri!Q+d?8(>HNCkCERY6p&XN#T0;|oeM%WM{DZnupQ4kk~ zL=$+J&yE{;3e>ntU;1^~W)an~^c%7*&Z^VMWq?2;MwkS>PVez*WvH&F-}bt`q-q4V z0&52vm7Y_92P8lQD$j;0I-|d;O;?RC<6c#Jgc?WMh!>EA9Zm!Up7SF32#{bR+`&*& z&!9Z?y0N5YlriqrskGZR<2fSb{~t^NaR>5IZn(>D_n-KevS96iNBCci4nl4ZAagu0 zMBVM1F+JNovO7HE?d(m0dUD2W75F3|ECFZ5otZJ`)$6BTp0VWB$53z0So6BIq<%N! z|Lq9K|5*?dd5NeT$k32v3gG!vZU*a-0EQqXj~I zV-{Eo6ifk8t`@{8H#n)GpUERPB(m2!lV9%Me;3`6b@-m&UOWWc3-Y}?VhJ=4gvY?Z zXNsH|X6y~glsI#LX>V*M`OJutratl8rsn&HmivH>`rnh9!vFZ~dz<;6?4qgQ5qF4Q z)O`z?`tKi&?E9K&^!_nH3xCDrJ*X2oVgjf)HDa`6u_HC)ST4z>dpWQS7Go;+#92%1 z$|1R@#ab#?4$D28)Y88K?v#Qg#=hVn8}58uqghA?c8PQgBSj+`Ua>p#TuIyZisP9V ze%hz5IG>qdXoKVt*(XEDP44BScI1`Qa+4xD=~vFkO(_9Ohi6JsxeYm9F)wrw87Nx3 zP8(E%^QoSS(5brOUp?KU({UxZ`qj41z!d=Ajsvsj3$kk$fVZ5heyzLz>6MGsZzA^3 zUb$TTwr792V)U7J47TrAn52$MjsCNL^9jtl=etnO=%aMQZH1{mxzgS${~mJRd$8wV z+?mnA+w55h)fYaIV$2e&-#F=hJqH&Tu`I9xliGygudI^lg&w`Iteu4g zPyvhqlmw_^NNZg02lN5frs1`u4`6I7MP9Ro9V+)yW*KtkJ5;hqWc}?pWqkIHVa5A= zn%s!{OM&@98*O%+#1esP#;C!0Nl8B|tLDtIpMH539!sRey*un9cG#xy~?H&$|6SdBVWf@_YQp;yr5yTW{VtwF{ojeNse|`jy2z zvtc>Ko;@h{$=OgW`@Y;JrPxp<`+?l&NkjeY{~$9Sq;d~-o(d!n)Xx4VWIIcOg&xao zi5#%bekS*21iQulbWAPhxS3g2mPxInvp&}4i{F9S;FoffaR+>}|GxUQ=RjEYo9b`d z2ja75s<(BGa@U^7BM#1Hf3N=2b1;`^#MBA}m23{?Vw)70^ltvNznRHd5Wnmhpr-#=QfGpq zq+s)$?_b@6U$Xz4>HBsNO+(c{dT@xVo(RZ*#Ax0Fs5DrS_I=_D16HSTd1IDgBO1vY zt88pb6Y$3Q8=sH1|lU5PgIf9i5rI4mL$DU?VME&YA0fUH zGnJgf^88a~`Z-7C1w_rQbB@Uix|qA>oRA;fYwnffQX`b69h~FtExc?VOUd!@7E!jy z0{s=D{ubpqe%|0r1^|J$u14D?l2DS*vx=;`Z>OC;PbJ>x02+PPv0OSUNzfnNE1bh}~lM(B+=*S7K5&v#6 zkaMm^LhsPioQpM*E~qVj_Wmv70JEUYxLsA74}}g7O7^Y=*?mPxU8b>{iVrF5YP?Lr zh<+3apUa7ylNvqrH79mXn%xqg8$U<3vJ}cqo|8$lRLrd}mhH9F%)L@0_ubMYH>XBk z&&naUfKsDy*~%-oq(-sVDlGR}4Sq&CBA0EX?Tb}>uI`Agp!FXQHoB6Ybt8L?x3a%= zmQ208N{Mx2uH~G{sC9R4>zpe4;o;nlIW?=p6S>`UyVDLYr%SQ2EzDb((@V3h%UhY# zAGPhy!=X^rU3QS+pcj)@2@-=JQIC5lteCz!ckPqOphYY_r#DZAXUx>~PTn(%bG{QU zX5bu3uZwG>8}}Ehl9+itJnQ=mYk2;}#(5|!39j5b?4dlAw>f8Mb#x-{>)e5~qYHUI z=8Q&>JW0D?aOamK6)P3(-QH$A@{`M-;LNK2^(96qwJC%a~FHpd|?HP68nIBafL%u_L2G03YL19 zvXClwOJ#?we0d)$e~0pXB_Hbsht_;GpTo-zck?xTY?O~t9_4HK9PvN)Hec7rw&B=% zzM;?2wJw*PstWvTU3;B63W625X?PD}8O&opPn!t{BsQD>dPtobwSE*6E9+<9+NWd>&NVe+`?8sraE zzyS=leIvO{M?UWSdDID)N8E)9x58b#3QKBzdtJf`uhpJSgR_oRDEKvWN`|ak`t|;7 z;jfzavvMsgtef{AJy==TP#e(e+ELh28~ELIps>9*NYCwQVOMSNWw#%YH&w-0hJ~7> zYHvh4VyY=;MG^7Sp?XU4 zH+k%N4|&VnJVlUElPpRnUPy6QEE<~+YnajtG2^40pK_lK+($qE-Q9v`+~>k&FUz85 z3Kv~YZf5UKy?FVgt>vUba-z9!(e!-y=*jS+xAT|SPbC*oX6GZUP8Aj{%wJABRadm4 zuoE4xP|<*(g{epcM;D|@`@}hglAMWWne(7$7CK;trW1dmfQ=vl8v)Rdos5i0i5xxE zU9>(Q#eRCYXmdV#8BjAGHv#lG6_b1u zml5+v#n6FC1YtPhiGT|tfp8uVfx95%_nOvu2``Z@8vBG%^6dz5RMB>KE*`>T=??3B zEv~d59v0EO=aLfjJROP!>yj>edKHV-CHH!U6-(BoEQ9s4VqUX5MiSd+vh8Ux4nwIp zC{~`gAG1Km*pTK?N8*G)d20~l)xdKyQ5q_AfJp#=1rh?4?N6TZ#WHoNdS1E33Uz6h zy(m@1%5~|zUa}Aviv_GVXzAdiazBS&QuV0BAf#)=gBy_Dn7}dvq6Gx}FmSmbZvj?c z%{OD&>u#}zZ>I8@N5xvcSNzYsEe3<3?6|ifYbJPbc@RSChZ5;nXDVg}wv@b7{F`~4 zRjlR6Es(>dsaGd8WVK8wevDi8J*BHGl{`jn3$>F?G-3uhN3V*+cdlL&+iRQ#J4zTD zC}vNc`B8jOktXWRQDUl?~=CS)&lsGKpTlqMZI4u;U`S_N&E)*&Q;xHG=+D^WVKREX?X+4Oz$gA5fc*k~5 zSam|n<4oW4$4nnFZ)vWXNgqv~S2abW#rA~`+4dVgg_3N9Vm)>NE6+N=UA}!jXB10Z zeB)30E|jGC)|CW!FO-h@c9(=KTxCByToSfWW_5O=7(gXMN&~KE(7p|q9 zT_}lMC?7rhwS*G8P{HnpFO6TITloQuvaa&7pKNJbT~)82X6co>>hFFgr8#vqdj1Zj z1$DKT{k=*{>Wcn2V1+3GRi#f(H8ungU7Mb%c*YO0RgPFxYTdJ_VpAmXGPqOwiERNL zr7d+$-vb6p+v}S30-u(4)wNs>e9P_!w?FCk7Tm{Y|B1jV<-JGF3%ty}^~hq*Y!q~OOV*r`-;C4gA}ihEp&_qQFN|8TDZX;Y;pBQ zO{ZS4!_^mcU6+Hsu1?i;_XdYueN%Vyd$2x)gETgjNYEri24yeKJd+#^V>Nu!K>2uu zCC8rlK>K_WyG0rz%xD}$qJruMD4RndBET|v$XqOxCv*q`edDtWJys!wR~Hs~(?aU5 zt}OJ8hQw2dJ2?arBkqXrhdR(lJ#h6?-EFaY-S1>VY#sZgm4dQOO(eo z!{sN;v`7)nVZnZvP_Z)XT>n(Mj1S@LfHJ#M8RxFS-j`Zs#Kl4Oa~5T(`9o=Y{8adN z-E%qTTK4JDy|i<_WnzoNqvyiQq!#b9hb5QEE{<4*6_zP3j;4iK5OhG{N(#pQrkLqG zA#R-n<%tcTyi|BB?Y)a4#?G=b%tHLJZN<$novUiQimeWJm8ma2U_T!q`N|PAgTL5;R2N!0k5 z8cG7x!T}kTtAE#%=w=>0+@ta69y!8M9hOYKaI^_uB_smMUxz6)gEfc)c4^~IL{XSr zkTQJDzW%x1MTcw0>p>TY*EN^=iQbE0*NCt_StgoD;e;QP00y&2ordIkg!VB-|5vC7 z=m=7gV*i?Lg7dipijO z;5DEK#4eH%FSz3s5J}u=k)r}v5wJKt8s2>^WbqaIrQvH~i?6LNOo<$ShxcDbxXn%dQ|12ncu@=KRjpw8fU>1}Z5edDh~4QJ_cw z;o1NsoR>@$55q+7@@um7 z8kd#ni@WD*S@y1nq`h}1l~*k;Sw$9>*DWrmMb?!!F0PD5c9%~;puXphfg#cc#*u*8{3jRmF1skKWjhiVyWazsC+#e5(JYM|oQDrT+J2 z%525=`aivt&5Gak|9+>$x%B7@`1DCfT?pev0TB>hCb zN^`&OK8aG5mVSJViRzU$e*7zmMwNDcponK%`I3qz;Uyr-N9sJHAqx;z17(9DF#&H{ zgx!+~`eVy5i;$_Eevcdzv!HRTjmMuT*jKn$|2PBZl{D>fVNftV$+xmDA5`YTDo-kz zFDJ!TdiWK6al!IX8k1WqgBT#j6oA;721rZtI_yf_tJ`Zff}k(T z(AYF&NnF3A>&$uV1yo9`Y*-@y08PL$o0pJBGb4bOpm|vcsimJ|Na&|Lt-Qzp zMWorv%M7W$l+DT*B@ugJGiV4ul5lK}OBr=)Ef4$6;CUX-e99>`tgV2U#rj zu21|D*}9RpDv2R8=A|J;pOcxUlB?1fvVEzVRaY2t>9Qq)*-G+aY1UPFN(!!Nu2n@! zilu1*Raccj#UZk)LP<&Gw9PKop&xBpyb9WON|6UI$mW+Ql^*UDtX5KXO(#~?Eh(p` zQ|hW3msG~myQ^B4R5>z+t2&m{tTQI6x|MP-1Ms_-p+2@}t?IVlo|TM0RZKq(l}uvw zkl)^bOsVP-Kh4HW_3DRy`&KebQH7==Bs>?Cf#UfDqRG^LV=90Nc$iM|2B(N;%|M9> z21qeqC>X?Cm=>wwXD|6!No%^pjN<%+F{F59)9jg&cI5i;>WL-oNH34-q@y~GS3;^^ z`|V%35?jsk(^bjJs-E-H3&`3jcx@oy0TY-+P^v+I1@H<6Mh7XP;}K{Z3#@)tRrNAM zzb~t!8nH*9z6UR#L%s*pKK9QIBMq#7Kae0$P6Z8EN+OU%oVRHt z$O)2+70-89cghK^WL0^E+kMvuCTn zGmQGOH>*9Fi7b)^N&<9H=4+8YGu@5-wsz?}*7#&@CfS62<@t0-jXLlTvoJMG8k^z4 zzE$0iy)cvgNQ(KaGVh?0ATIYa&dw38K7Q<5_T~X-`7|GmqXwgF>`D`>VN*6Kr2!JJ zvgtHUzlNuQqKwIjB;KZ}?3E*t1E8hxeTF3RLo2%$vJK@K<8Jrv-Qv6rdCTF=HZ6z5 zI)~2b?!!gqG+2^!lFUjmmLy-}txc;4F@=AQ4>WIU*bkUl+uGL%Hke1|c-4qDSoGzD z)kroR`jHb~Bhz5n$6bt@rkVm*hH{~zc18lg6wp8W8ij_@Gy@jO2c-jJ<`fG}Yd|J| z@#zPh@*EuFFni zl!EZuQ_CmBctEC$NU{JH3*;Kr#^(uHL&~?gt`eLhKi?+Lm3PS4H=oJMW#8-iMC$jc zsrmk-T3U(o^iaPPY1CUz8dkkM*?-=}TR-gKsSS}ALZoqL>%ziX-({Ed!n)dkW!JI7 z?%I%Lw?6I*XuX7JOp)TTa}B=|-GxNC%@f?mo-Rk8S3c=lG+ld1Iq%yRt0?^xR+ge! zcclSjQzmse4Itxjs4Hmji7fG|D{1iUD+#N+)^PSm$y?}aLM$Ysg*reL5&--_bxbs` zbiPUd_W8Z%v+7Xt{sCp5VgVWxQ0gF~ znovZ7%Ij<#*z*%A>lzvY`bs+}buA4bQ5dLeZwS)A`m_#g7YpnZ7;%LJ{njVuQS#%BJ=ip`)O&K9`+P8(nBRFCFBl{h@Ttw*I;Q#ei$4>c2~bmtG5~f3@6q zA4F$wmoIUYC)dv|M_88^)>9UiFQ=E+)vqi^j+J-UTY{{gw}-FQ9N=3+oZgT4Oe|6j zC?ArH##Lo<)|aC=Du(OtR7dMqJgxuY|A2PEkAEGr%!19ZA5gC2ymRb6OweO0FL{af zv{O1r0IKCWqeu_P3I`p}K(Amn)+g%$CzRq`>0%7Fm7;jMB7=jn5!}^x<@!y8K!cYExEKZfFZ7uGF=(TkXA_*t4e3csQ@4Kwn}j& zExoFap|X;`lHbAD-I(#CYJjn~F;l<#DMP#QN@Vpc0}TW0z#F1cDW)2r3Vr~h+qIPO zN+k`+8kPuuXV!)uo@bmOKg4CfQI4+8>Z{&le9pT2tojE7=f0;?;TJ=4IA(A7ZOJ`F z9p?j}2IIyzij7yoOjc;tH9`#*D>>;kiVfB)xnngt4Yn)5g#ZdN6NK8&K~1}w$~H$_ zW$N3pwP7-hH7Hae!-k^x45(I!-H^#$3u=IG2Z$`dcCv<0R3ke8T7X$mN<`w&E@Nc~ zZQlqK-J#)lV?kuCSA$DqVP9=n!$}nsM2P0@z-nw*N1NVG_(6_k3C*VIeY#-JeJWu4 zOLlC7xcl3M{{Jh- zop;6FB9SnhK=+Ik(2p{feZSvJl9gq_`=vh_C)oM?LZzDcV=+_|7mt{WPab*(7lFzr zfdR}7S0T=&`accS0J;i;*q9gqwpFSzHK3}Iu|g7phrHfiuzh4Et+j7=V`f0L${F3p zY?YcmzB_XJgi)dmA+D||H35xRs`6B7T^n2*i&W}L8v+`ys(_o0Y^+dWh&9dv{+AwE z&Yk#AihZ2a2;U`=q@(Y>{r0CX$~R_F8X@I|(!cZ!)J(y@l{Yd18Y9h}gd0~HBNzX1 zH%XZ4Z=4Q3YSJX8q367tKkCd_Z{zg~H?v=w>{n$;3@L zl&Xg|!zB7lb*cS)cwVMC_tgEVHtXhT&bEN|fM$*p_fO(ka$r z-SjK~P}~5S9u~3#ImLmYh$ri>1>_IYA*CTc>dR+z4g$e?i2njx@Y&mwow9ET$DXg8 z6rDcaG_lg9BIDUK)!02P5Y$9@9dJ_xj%a$P(j(TI-n1W#NpCG|T3G2#Z>?)uS?L>V z?QU9Mxg`cV`!f2$xIqt8gh{!^F{+pjuH=gmOsaIv!Cudm`n2LXE1)Irck;R1^_8m6 zDtBD3Pd7O{_P%tz6}=sBH?n%U$)^AA*!8c%JjefDx&EgK3S_FZ5u34;!2WU-h1A`$Vo-&b`QXuV&Gv;UDFtZub_4 z$J)c2rB;j9y|E&c?q&_|&hOuPn)j$a6uU9jyifHXSFqOmRUeh!SZOv;eLQ{RNAp3| zaj{O07C^b60r(Ubhk_w6G8@u|Kr7c-cs+ENE_Rygq`~b-2u?}#5Qg{#%s$H)lLhs% zwQ@~$BhFkGIpdX>=K!W1*KzE+f}wGT&Ai|T*0m$Qhi$5snT*-_1Sc% ze#_B77pSY-)+kZXC%&25FgVH|W7dM5;85E(~E_!cprNtN!b7Vp3**E7W}F3+aYyX#s4R;S0hyIVq5Uvb0DU@Y1sd%T-eBiR#FJ1ZihQstYyTs%q+`o71zih*#Jk8(^Pb#3?^bU9 zX`u$PRCD!dmUN}n&u;Wy;@6} z7W#U_TCX)N{^;evOvmX#1V1oPa|~0bq57LLicLJu6imyEw7Uo$g>YJPTkU_*RW}6Q zJXHJEzl@T;ZJ>Q`$vD87=m{O!7nDf6Yr3S;m(@zC30w~7D{o~4t~BdA?#V_XbBfp$Kt|%X%ek&)@pf$_(64 zxlO!26!6=O#tLzC1TI@E(Xz%;Rw zDkjFn^Ut0V(ML~oci+}Aco_J3x?k`5;PFpH>Y_C5L{1R}-qUhS2FZ$Mk zXE(XI!onR7O*Wk^x)Y`{z4~?RPWbh=tKT^8CSRXj-KJRIExf+4`aS(_-F1KzQL&(b z7RFNnz1s-FBAE|yh|z{o!;6Ss_r{d*HlZJpBGrUl`>(;^B-efDNU|IOBY-qU$>UdH z5h~7%z)MXWm+B#`G;PI^7@U#u^Pxmt)yLyM#_o1s51+c=;@fxqqw257ynEL-SASVk z{+_u0b@g}p-wW5L8~&t|?}T!^sJrp^=Jm&t`<)WDuJ0@P*Y*0J>l|mV;h6X~^cr-S zDb$8vLuD`(+c?(H512Y_Iyj9d(IVLVfwA{|b8Jl}$E#+VZOc>9FNRvk#OB|hnSIm) zaZc?076!a)#pM3NfPH!A1}dq>}~_4ZM&L*+8c7Lz(N`r4`QDwsIsWxv6i2W<)cj>bNn;lUPeA@ zC&8O4Z%9RRJP^*;+Q4x;b__{@eMN#AFk7q*kkec5>46puC>&ZMaTQaLEO0{!$z=ic z4CD+jN7F!Sn_3X(>cHJLjUX=7!AEUcLEJwfEs{!{Hf(E0SOFumT5IvY2P z=r{838{oodKzkSml7WJaNsxR;`kL&65uJ{#H95{vi;mni`NN}59XNn_0^}2P18Hy* z#OWB1enBgXcHEH!qX=wWLiq-1M5Spc$aCX0+eaezT)4)8Px0QzN+j41P@Tp}H8@ac z+`w=_zlRJ%x$OvrYYG{oz8$4&iVsG^JIdE~Q8>qvJF1#@& zmmh8**_0;a4C<{ok{cN>=&V$feX9?RZj1+Mss3Yo z<9U#FlPyWSFuvB~*e{!cD`PjTdxZUo1Bv(;^9i-Vt;Vc_wJX}I#hy2YMR$3;J(54w z{I&KUedlpo9UpYTFv^WL&HI1;6Mti- zS=ZoE?v43oy{Jb|`ILFg&us?lKD)Bt{$Lq-k-KX%+)SFXDsnF6Q5^_Npfvko(i z)x7o_ADRsUQ}5o`2r^WC{OHD3(1F0mZ*Ocjk285&%ryOsGF(<}1Wy?~c>MLopS6RW zYW2l()~P$&L_amKhJr4s{ya^X%MKdjnbxhIah2k7SHCql9VTzv18Iyr+eqvJZA z#1E#NPb@n5KA0VT;?ybh!93%MZzqweO$80*=?N;l%3F}2iR>pUGtvgt$wU7kp_pr# z{v@PRBKXkilh{sju%+tLtWNo0tH7skQHMq&_F}fgopB%A^gnq~PMJrxZ!z6>?Y6%9 zw6Rll_u*Gh`#SgRwh@0e*17KknA6RQ^u=zBgM;*xP-1ipgO5Maqz$sc6mw}K9rUjK z26jTo)Fto(7+KVvbXzORNN6I5oZSb#~i*;?;}DuG71n#V69c&g^z^n<(u%yW92Z zL}ORr2NUfZ8~a);=pNvB192XFf6F<$pkTKqgTAi6cDswed~{u`(cR$X)2@pxC!=1@ zc3o~cb?fD3S4_+4pD)qfal7B={LRswu-nsZk}o&;gJ;I1Vt4unuLqMl-B};bP&lV7 zx^q8xAD(jRF8tsV#RfyI{AN&^grHkWqfWwl8-uXZU)KxvN^~vuX*8NcV}>L z;H$UYJuM*j2JBxLfL;K%1(JanUnY2ShY^8bvP4K9bhQAvfkT>Jt#{uJ{%iHspKfMw zsOoFtO?-bMlQ$ojuL?+Rh(Nh#kwHI_DK#`qw?9lZ)H4yPvXe3JFc*4y;j)Nk0?zF9 z*K=-`=N`0hyK1Hi+n27$sHIv}>v_wZJ#oV%vP?4qwHjwn;~oBRF5|W0&9M(*55PR~ zM<32}zM)v$d>Z@{Cg-b>&^Vf41Hnq_M%)NVFf7v$lIb}QW}k=F(}*8oeTZiWbK_qB z4XIRthJ_1<-#F;MXt@~m#_Q%(OSq~@$j#Tmmsa1z-ed(wsJ_j*ITsA7<>fb*f+L&W zw%%L|j#_YTP}`ywe4r_Lg8n;+nQdiWH$7wsWUNda!eG z87#$~qLUnztUuM9>Itt{`aP?zTR&Lnzepj8sx!7d0wGC(GpBk)LXw+iLV6@ZQdVbT zd&nWFs z`jw3L3qAVlSr6WS?J=UPXI}*qr@g}ah}rLcXIf9_Bv_6M`577Vn{rsS4G!Jd#HP40#ejJMCB_?9X%Y9gX<8lxEN!h0< z-0(3L^ink4?xHt1Lk>&D+w|p!)CN+PPxTdt)UEzcE)hy4oAFM?1;otbU=9xjORc-L z46HWLi3U$U$V74n;83rq$eE>1{J3LQhO3p<{hlWFjZDNp4bO;uKm66#q0Obcj zf-ztemuaaFSS+NyhH63@0$0lW7$J>Kl$F-LY!hwB20}ePloSd@i0P>!*A0x#U>r({Ed7hP%zW%kiYCt7$6gp!CNAcPep6r&y5t__yHmzOnIUbe zYl<|rni^M_cxx!6J#bCx)<{T)+aaY}57ckGTGPMvSiMvHgY~Uv>RoOiUG<0lc~^Kw^rBh-r5Mct@`m1<(@G1ePoo&IymrAC3*k@ zRu9cI#g5AkaV@|F=SjB-C+_X)Zw`V^o7T<33>1Fk)|tq0o}>L2`ZcG{N^@DBJ8&fb zckAD7rN3@Lf8~pBaNORr#5}wqbQ}M%KVw7jHpj<-2OB!Ki5~}7K|34eN$L)J`oAa_ zR8EjK3t&yC#2OswFJqRz`E4#HX#-j!0#n6;EN}Dgx##xD^|tVy;j18(7THm8a4@mq7s{H(O6vH_@{C)*3okdpJH!gB}T+I z({IaB_VoWBOIHFH)7r-0GiSE8Xw{pks zTB9Tir+rTpg<_B_E!r&i3g2_O-}qfu%URy{eU|^TXJOw_JFyHg3vks6KYyDNmqoSe zqSun488W{iW#)$IN)x7b=>=Ul)#~A?lJ73M!Tzzj+-fQ(7-ksg?1Lh?- zgK`o81*=d_Bs*2}d;^j>nj$DwB8`kOpjDE`M5Yn7n}$x7m`BuI9=cXy5h1Pb8S+QV zlj5Q75d0PZsj~2PLWP1eV9*h!AbcIv=z|Yza&qYrK7Zo#($%Dj01H8`G;_l~4Gfi) zSY2=U0nhC>;N%CP1%vG(r~V|ap=PlC@DMMW#gUKudF0owEplFS$%3%`;^Ap0;+7rY zTkHsi`V8s1;g=-wW@Bak_jjH3n4Xn{zJ9P!7uFwV)L@3|@! zc4&m5(dvGj;ocXnyYq3+=W$RxsRCWSEbjS4z)88?6Hj-6meBl@RTHdtd{E$}LV5fL z^hYvJhF9QEL2i!eY)AuvNDOtOd}*p?L1op1K+k*rpIhgBS$uEt=O=r=th=|o6wkm% zu~u3(K$$nf22kj|!0Auwzr^2L@wrXuE2Q63W8qXa5na{%e>^beeW9;_IIeJtDVDzn zQBzzM;n?U*lbHkr6#3|kJ3|6}4AzR+{I7fNt(pET@av!V)=z(){q@qlP19dYh0Ez4 zXD~IGN2p6oL$GC(t;{fB(gr1%CjK4Fy|G$I73#_x`Zwt}lxAT-AkgF&OBYS(Qt#!t zRxrfx+D%kE&r0B4(B~Pc+QQk6RiZ%~elFBomU;pQnd1Z+gxm+_xF_kMGR ziZIw3bDlj*B?Eo{FhIf^oAV->+;wm3^{$)WhF~U!p$xJR6Uc@%U{y%dp|k6ugj@_w zL0Rt5`9DNMkibFW6rXz;s)GBwufHk&Zhe3M^|wF1yWc-_z02hv|NCCac~ z?3{cnEQ32;q$_rY_E6+)v2notW75y>dSH*BE$?JAf7N!^PvyT~r-zDWDNLYJ0}Kn8-NjR%#htj`UHnh< z{oL#CfBcht|J3ylF8?0BfA0DiJ&tK*I=(fgoM)2KnMphWx|71Y;dT*c!FQo_o$hql zoDhsdnF-11wTbC;$n-D`I3MwO>%XV(SFHbZ`QK~z{XNgr{abkdT0}dZfB*i(iM{$i z>h9-H?+g6#{Qm9f{nlak;7(1fIe9TF%y>BC+msrzuHh>^kc!C4e| zOS0&Wuod1ac^k^6b*gXP@eM_{~m?UrGjn%5kZ4_6V+bcR>nt(vzT8>_&zcs zc`BuLB*>I*5)$B$3{NP#D1@$HWuFILJQ;J5(6t=8biRuwvLp3K+?=UdHsNvgBhFg> zFSOEi>JYXrDZtx4Zl_A~0s%9XJs3Eu_n>Zc z9yCXcO#SKmpfv(F2FW~zpdqkF`)NJHpIra4?dPA^D)L>PPM78xh6br%KsRrRxU-rd1ux+&D0|h0Uo{ zTlL`C^{>T0qaSo$|Muf&@`Kmczq|Z8{J@o{mn5IX`217Yo(!|zN)apOqt?6Y{}j8Q zd@$YY-|Sy*$3J}z2t2PY>6xzKvghW5zUx1Jh@*~8`1IrQhSCQoo|YYYKYxa~hWjjS zQ|o1qUL@_Wls*{xJUZ|9(+6Ka|J?h#`@z4Tf7So~`T!yw1Lm0;21!T)l4?w-&^QY! zZ@z;}g0qK)wwNFT7UkLijnq{ij3wqq{zlbR9Ka+RH-RnHaA^ZqK}NCOXr(te|{ z#0y8{NHX{+))%>pz=Ouz=$srl+Mai+s>R&Iww!P*Ro;C*tRp#bFxWNH)7_b>RA?Fp>E}|jlf9WeA0b@XHn`C zsnN@vSt=d?0dERLy0CjADCEBi=LGcq5llnkA@?uVd5T4|?n<;gOZ^8leOOCM7Y~fv z$68;yd_bzzz)FCONf1tBa6*76t}=-=_vbjIC%q$75M##@tvqms06-JKA6987wvA%0 z7?|H>UFvAJA9k zRF_5%82E77N_k`&F}W2}PC6+iCTC$Yh}AM1A0+f>YVioce=#kL`y1laD}PShw2**#=$Lno;Oc9?B9AQTQpY$7+rYXJG>2 z<%TJ41V|cF_6ICA(kn#c12%slL=e)1COO=xWqXAaI=C)n2Zg2v3JwVLE3`Xyh1{?) z1pJ9QWejWuu2q=|(t^$^^n^7gf}cTSdJ+i~7L;WQ0SboD@yAHMfW7%}S{~qrgfd;E z|5`bO(B*GL8vHq+<3}{s5sNilJ7*ouo0#K5YnvOV*s0L%;mT8&yatJC$eds(7UATpp;0v)WFK zyw*|)#!J%j6fELDfx-;MY-|nz$Y>NRF3%;PMaq8eglI*FdB@O{(dct!mj^N;SokQlm1W_EAkn=s&xZrDw|f(NZ6N+Ac;Uv<#IJJ7qk%!s|54 z?Mf3cU2>Tuz?+CYF-5Ml%=7*JS0Bm?d_SMKqiLJxTO_QPU+gZEUY@p3GlwV^PVZ2f zE%OWL_&k;GG0dZMO6h= z&%*(+%3lZ_I#j@|LN^?OEN6H7B(Msg&5MK$1*u54 z*~1*WQx4e97R?}s2mJ)rKTG{H%XylmhaC)bca$pyoQ#g&sdghR@h~FGU*|cx@{W|h z8?Zmb%u}B`Yq71b@|^ylwfTcxvrg=h&L%PwxpQWpcUSf1su4Tou(TlxYhED7+^ADg z&Oy+KXmNA(eElCOGv}U^<1>yYx(n14$~}3QO{*$*oa0gUIlT?M(IXm%7%xtQWF}{o zzZW{^@Gh742wggO#pR!ct_G_0(#|75 z-h3p-N>k4A=UJeWRj#g6DD_uju=Dw_>={9-FUr3~9{-0UFaIactweRW{Ab?GQB}MG zyFs|}T>vn^L4_b@%|*(C!e26`w+0mm2=)0-BYP(@tx{uqC;78(>^`*N-X`{-Xx~{u zg~AQ@5-H!NLdD8Y&YxMqkMguoTTr1HH7iVQWra?ZS1)**Ga2ea2-YbOF9z{U)_clM zZW*RoeAufuz61ZeDx*N{{nnz^fAzY$jSQk@wW__}^ti{lM{P~e{SfLC{B0%?sAV@?4&!*G^ia9VC@q#d+ zu{WPdjR&_NI)*dzrgTkGW4ef;(a8%EUKM%_Gd$$RGUi{YXNeWf0Y}Po2i04-@0i_@ zUWlQHRtt;+xVDs&Ts@TI8RZwIIlj_6%KwVy^vW?sM)F)!ene*am_4fqeZ=!NbW}wo zGL>RKnI5OLGxf^6&gCuLr#G)=2j4$zmPB!(!R#PIwcX=(x^3sru2s&+=+N2-q0k`P zO5eeS%Hw8N`VR*9j9XHBRD+7X!&}T&s`jA5{-p+BP zJ6TBBIy9Bh*aD*5%>ZVk3M5dM>wi_)sn`rp3*&hO98IFX8EnX{j4h|^H5CqcyJR@^ zD)g0p9~Z-6@yEZwbEc|?_}PPg_2}@8qegJHk^OwbP>O%qXCIq+U%?z zW38#t9nAd4>E7d8h+x{w{fW?NHWK3*jKz;j_g89450};sXH=dHSQe)BS7m6_@+(@` zE5o7!d$k@^Mn(mVLX=HPg<_LKkftXy3fgiLq#-GSQItj>GBg$uN~Ov&uMf(zlUXvn zm-j72Bid&Je|f3>YfI1Ri46O9mZqqUfOaV%SoC0!k9J#S{2(p>tunR=bWZ~*-3hDm zU@|lnql?|aRG^2siNs5mLeqQI3~26^8EbvRYtRB8tF{DU^&U=O1^_>Td8iTYM| zi&N@IV;B--)kN^7WtiNu72XCH=%`kuMy=}o4?L3S{~*X*Tcbi*qP<;3)zjzAmSIk_4#|l~=AepJ9!_aJXU=V|IC?%+*>rVg1?Tvz_bsWy3(WNqVaK1lY}}}W zR#^r3zKXyW&-E(s6n6P#Lcg|%QGL9+^hTtsfkt&@6rIU}F$n1V3F4k`k-6zqS6fBr z7)-6Mw~A4wr<%fg!IZ?gus6yf=qaJnY_J|-1RQV(#N1USU`3rNV@R~k)t{1p%(7tO z$hiUY0fjjTlHtK}CvmZ{WA#I;SOdd()h$+WL56|VZC3F)hMTH6NiGCNDE6lOAbj(* zt&VEM^qtu9!YZM|@U7p=!31Taw?@*}HxgZqj#R(9Q7$q1tNKIK)+30NA+(j(mUX>$< z7PjJLy9@`Q0XUpSp7?~u9_nL;`dKAS=BsNC`zLf3I#Sb zmfo1M5kMr9IP3Wr9fXK+#Sqh z*e4Sgw3foeCfPM+Lu38nc~rmL-q4k-buL`=hmJ;|vwUtA9$Lx}(;*t-W|B#ZvrnnP zF_X(RQ>~?YJ4}jerd#jpFs!bz9@^(Kp{>S#X#c(m?`xcg4m3>oR^v8wP}!7I>wXg# znrhU-K${F2kP>YE7%l}WFT$x*y8#q54qojMu@qmXK=Ms|=4tG_pYpbobLyfY#SE+b zEB(6&R1SmK2{RGcbIK+i9-nA(e$F9jnCbXh@94uBmbj0Da&earHQsrd= z`uAXydva<+VI<(MOSPM9-hAIjZl_P%!O(8&g~Z?%6! zvzzfNzONRH=2>SL9Sp2ncw@A7;lsLs_gLMB0NHj*q3-FY*VLW3dA?+FOkM8H3!{@$>Q3Es9_YS5(;@ky>y(8mx3vEDF&-y5cQf^9 z?jzClg_9&xTo{#42TkJ}0(gEuG=_5OE=FIvGUdACW$ViwQ;O@ZTVDw>?NU&{%;I)R ztLknJUGbT!>Tt{YsQf?<>t|KtnyIhqyzmWQa^BS4xp__b*dDX!%4-c%zt!Czx~^=& zsV^JK^Rdvbr|BD-(6ave@%%!}UBs5shV!2UMjVJUPd$Dk8%6Ig5sK5tC7(N}kwa;>W{qv#1 z2FscB<7m$;3&SZj0>u-~6!fETVi`rUKPc~jlH8+mg*~KDW*A%la_F}5w6yv+Lq$F? z0kM1N4xPp0O+rhS0^B3*kYIAN);i`%(xzy>^pi)$u4Of<)0FNiFPWqkicL5??Q(sO zb#VtIoP4$}F_>OoKYSBKLVQVzpiGd)v4Djd#88GzjIKFN$HPK^J+E1c0C%mNHsxpMP+%Ug-)GDRHI7U3x`uF|` zHnl<4*$rkkbvcmdGSx;}-(l^7{vRs@{48O^3JHKsMGgO#G;9(Rppph*Oaq8(G?P|n z(5;Wad@r~Xwk30UF+&IssrNh>xae+;%fn8g*|8Q$qvW00t%#$#?m5obdo?fww zXbg&J>$P)%mNM!D_(WC?+acv3B*{+~9h{@T%0?o>mrc5epO0LT-pE&2BaKSg-xw0} zEX@9|#?YAOSM0AhhQ++-wGYHyH{M_KMUKkY4>P=l&ZRAvBu+9WU*w4<4Dgk9yZ^JZ zq*1@A!9-Qejg0BAaCq1l8`Bx)@TxH}=H(TKHsxoj`JykYwfK!!K_ zmE{IVe}1oR`g6Fu0j5Zv9Dc9toYr)D_=AtL^mxAFEm{m z{?q`oB>}j=;Wu5+ccsjH%&K?&6=_C5e;g6?)xo#Adk&^c_{IJL7M~B;I6tvSvseqUe&x*UdHBQTcgM^h4}aSr zLqe&UDP70kW%T`wP%d{QG@4nqze9-Y;|@^RewdJ1lF7J7*fgsYtnMLZHuDQw`J#Ev z8n&!pQDC#SEjw4VsafBa(>NsvUklTHct~TNC_LFF(%&$4E?OD1{6uGPm*_|F^~>Ay z)l!i3I_J+LN0&|-Z_71w-`hOFRw39uyV*=?tC;JKgFc6l;}slwdStjDOqW*lJcmT8{=wkC!Tcu9-;^yhLCk3SGmIeHi5)l4uk;y9PU=Iz+#>$B*Wj1t2zb5R;C#(0#F_peMkqh#)9%7Vkr2 zJv-Kl)Fo^fl}Z8%)MOH|d`nN&N1m~2n?1)r@{U!%>gmCJm1ao8YluG(VG`@BY4%4~ zSZJv~Qs0pxeB^}J;9tI+wm;eNi0_H!7eMy}k4Jt5nlolCe6*-w+>Ti;XnPVKY37PJ zNw_qUJ;LXaLXw?sriv*>hxRHTY3xab>7UC-v>In6JX$fLt>TsTX!Quh0Rh2-{{rV~ zTuU8^T4z|70^J>6XC7@R(7WfA|7i0_=pZy&|5>4&0ab!fL?0A>R)woCG@o(vScP7d{o`LLr}NdE9%mm@`R48M_)vlAj5*SU zkNqc370(HLeB5?YE+pt>+nROG+4lIak;Fro4;O4AIU*mQDlj+PBk{beP_)Nq|KnYn z_fzgoxp6jj@{F!OA78MYk~{bE| zcG}f>E{LLahbx*(7=5?vK)+IwD(DIj3(Ob5E%aa1T9rLRr z=ay@%hMtM-vG!NzN3?XrI`qw#w#Z{0Eq&K`jZ^#k5s=&>-v;4iO~IYYxHHoy`r`Mj<_|#tW@c*5vL>=zZ)jAZOuF9_+qA0O^7twCXjQxAIm2&Z>r8?d zg=;EkFmCaUElg*m?vo6B;62bxvW-s?mSkM5oZ5HYR+{dW^Jjy$*n8Gyzm=^zab8#b zB3cdNX7~9?TbI$E5=XjC?SRc8v%Iu_senB$aXX`}mXI2PTT2c6S0**GK8TIeTPN7f z3HHx!HM5(W3#pG&?dAp3?@K~12Xqc68NwB*3J)_sr_u;PPaFU4YbZ(Yz-M?G^F9^eGyGcuX_?>7i?)& zkTHB^GzhXm6YN&xF6nu4JSvN+A=Q7HX16+bDP#juxNPYUXy)Obcj$>KXMtY9(roN& z`QL?$x_IkIRX!3v-G6J%&!rwu58Voxv25Yfqqo)?f}`fR-MZXmfb$3_V4}yifWKA1 zW{}GWh>Z+WaaCJKFaG&uUE{KZr`N*8JZdoqgv}4UjJuNC#eoy_ zbJN#!+qOTw9mirOczPAteW*Eowia6wJ|pV+le=HS8w0mpyl1zzEAaPIDlXD8NVTmZ zE^2eo__mraA-E3&NoLQgIPWP({l40#yb?_q=>?BhF_&JM^83<$zf%F>(JFb*HVOQv z$`(y&TT*Wq(+SzI5A9+NgXgui*u@#Tf@hhgu7I|uU*h`0eE2-dE&~{O4vEB&$M6&! zfrN}TOl`{Y^WmysIKh^*eVG$~H8`TJBQBvYSlT9)$0b5NDo_USBeeJ-A#*~mI)fBR zpo=S$u;Zijwzqa$f>&g>y|>$%yW(>zb(g=f zxkkjJ72kZXa<(^nWU>0cY*SfT-8S@P`+OLY`}NC?{VQD%pD$47c5$E^A{}Z_ky5#N zye@RTe+uT?)t1%y;POh2M_9!ljVr&k{rVzRk#O1>U&;9}TNhkt2&RmGATTjUh{`K; zVfG(xlboc&U0SO;$AyC9`b;J5mzcFHeobzaIJEP=rl_o%-9B*kNM`Arc1JaH^6mU~ z&G?<0SLG|;db`u`&Z>6ZLg}vgS`qCA@o9alA`Z>CBpO|n(r#RsK4bNf_KAhNcdS0s zKDiJ?J6*>B!7n;=4{uFZK8PTz03yUeH-0UKdLk&)yVyR}esAaM;`ZtG`wZ9Ax7*n7 z@1scwj-tC`J>%GJLJ-ROP>E!71(-_hYP2oDY0l>b(z?`riqA#+Ee)TyJJ=t{T>~vd z?GJXY`OzLq=wM4jcppk#n@!}bm(7>;f})JkP6yE+vrJRi&u=~S_TU_SwFt*F)>a%; z3E@0*|C%vBMEjZ7*F*b5%${9iPLgb;)aJ&&PwgeN&uQ=V-yi*Sp8Zyjw^q;Q7q09H znfXi{pJ}PScEPiN_@kTGu6#BQjeB0l9M^rEaf&%Zdi5M*r(P7pIM`2Xi+joG{swF=Q|-i5Kdgo zo|G;UtH|=7JbR99B*WaX)d|Sidztst^Gqj*9iK|74;e#}z2&+TiPRJpZU z9^O15vCuX9wEJ5dG;%eEF`jJR|R5dHZH`Prj;_=xdMtKK{CKCV5VbXXfC;k zT6@>uGu)apdv{o}i=^2rbZUX_b183gdZB0b>CKO-LN^sSp?FSu5*KO6A+;kB_T(`9 zw^#)JW&%Y*TqoJodS4EApz6^iv^7goCei9knyr7<^6{h%*#&;jr))k}I8Xn)WlI%q zj>HZbil2}*S|J+|!tAIbW_nO}sxoI>S;5&2FAAcbJI>3sU-06Bv~SJVZj(atx%=kR zg?{>fUu|8t(dE{u=l+{7*}Iak00e7-sdr%f*C*iuoI(P_v#O@7_bIQi#iw%klf@_% zTfF%S6fa%wd&1td_g3xmb(;$cm%re_h4To*27#Dwresj(z3Lv8b|c%%gDP3j_3RCkJT=Ko4dJ zkZMqHU7@gSrow%(@zO%87k_SUDqOE$VEKH~=Ilbh7w1)3S|zXP}$tgS~k9T@@8sc;M|DFHE=~4=FmrJ8S86pW-DH{)V0a6shz$^S4QnAgMTh0akvDY+SJn!x`Nu!ARud{@ME&iL zFTQRbE&L<=aiz+T!)nOej)w``n;WA9{N4jN$ni05)l&PxyZ=XgD z7d1Y03uhn>Ri)CU6|Hf{PjM3SP;w&TNni}Rl;nr9ytp=aSA)$dw!ij8rF|XV;S(K> zyr^x2`8UL!bFe6k$p@6d4IrDh|Uk~}L@>2AtLwy^76bZ?|uvuYmC zmU~oxMMZgD^qM=jI)cKdJ7nprib&0vBX=4*Lc{GGvR^c+ygwGxa;LB3JZ2{4eo6jF zrXef~_>ecw8o3^91g=xu9@w=U9b-ZRzs4P1*bSAv-Z?GTTy0)^MKv?dDApTOWofH zBpl-I#Lmp{c@F0TTN*!pmByyroz;0Z{3BXOG6+p!+`NTXJ9MxOWK-!p`Ck&e2$R)w zReqklntUhqlb6dSX^5tP;h1tM`$^xYU2!oW_-}^)i(Sn&o7FOy?x^HBU4V_^N$zDH zk8Z@hz1yiqnA#rAuQxc;Q|0{8eT1`Ig^$^iZGAoLc%|aqomJt|klQ!2pY`?bidRD0 zO}aQAtWl}Vcm>}lgAALZh2>r-$bR0~HmQ19F>9udTG;Kv>=%7~?1a6=wLreHx9?_m zHUh?@KQK9nEY^Q%`S~k|Dn}5oTW{afuTxPF^Ub+T)fxqFhI%sV6q29;TY~t+c*QqG zudaTUb|?HO#$GZal5dylziw2{&?$m>L5bWy7zXGhfk>b{v0@~W;eC`DBQH-S6o8~+ z#ID=r`fn@;&nE_!SiRJXIB>f<8yIf@Bo6o$5u3Ci*pg%lQEUko&&e~kA&~$K53*#| z%Xrhnw`=v^T^(AtrMP6(OYlglkb8mjusoFv4i^_HeqbFX7?d8sK&V!RN?z=x=;C=o zGPwx%RJ4xx^LC^D`>VsyQ_efv>15h@cGPy*!kdG{y3Iu@adx&wzB|M|K-uu$}> zf8ryDwW%YU|Ml8&`Tnw3D(~BP}zb2vd z2eq%dBSvojoBgxz*Dh)OgO9JiMvUJ6mEGI;`>PbESaN10?r2I5>_CcZ?b$By5@jUj00F32{klwqey-cw?hh|*&*o+^b)m*)OJ)3V*BDt`0Z4b zJS!sFK864}&Htl^+9GG7@s9i;t}jy?_K^!hK$lcAQ0QOU{m0bO6LQ~3^CHb0#c)=2 z@&xE@wLG%gTDwDu$JS0cQrZdmAC^VB1}fLs3DdV|w#&mK9g7Tdc;TGtl%7)QKl0@f zGaUsvNWg6a`VqWJjr1sbub?q`ZGmN0um6nnEiyCEoTg~D zGrP?1wQb}g$Coc)*j++`2V?2$Ymv5=7C~CRN^RTDlx}|Q8;Q^~gZrjHnFIqNI!Tm6 z;c^49vk*1gwz6m7Zqg*4@w!9PbS99MaT8LlW=R&eQsuHUIa*3y$qU?* z2##<^k?vAIo>6(~-DH;FWAofZ&jJ4P$nYWu1A}Qiv$Rc8+R8+T93#yE_?H0F1KDjs z<4!)jwX325(nXN)B!hfL#K>eFM(fE<2$yq&X=loxyzY(sdez0iXqxIbxYiMkL~bim zC{-0GM5@qJ8ZuBHvL@7J7zONqK?}|Ul-X-61JCmHoUX-iBU6xoaFL|DR2aWekJ?i-%V5GawfE`U zDnxHgq7FN9$T2oI=Z0W6ku3>cco~dobcD!ACOYCcH)vv$dcyAVinVWSqp}@+gUp&V z+7OI{wnaveK*pwkH|4O1QLK*f5p32xV-vJAPbrpZ%2Xsx2~2OzbQfXNpY$$@N#MD&az6p)Sp~k?a?mOWLONms5L=Od$1a zt^Z0<6nPLXLgOsRCL^(4DcUI7iBx1BVkXkaLRTG^bWG)GY41H!+4v?j>Xu_*hb2$@ z_}&;eCI)ST5s1RzC4mK?-JU86?!e`KFx4A^b_@Wx90DkUjw`x??(aq$kv++l<3(&8 zW)^DMy@_&`8AqzL8=5mT8O4q(f~GfVOTX>Kt5|PSqskpu2U#`gB<#cC-t?o!C_+Al z{z%x(&EUz@BXA)dfkX<3N!iPlCAVi2HE=RIqW}E4K??o2pEHUjgK^anQ*?#Z|2 zbg||p9W4ics1Rg=A`NHYoKQ1FTRJc!mK~Z~iV36&kvwko?zdG@T}9D3PW=XH2j*4( z{q{VduF#4QoRDQ?X@YNTju&WwI611;s~z`LrFG+$$U zfJTr#1*7czM5jb)0_E@6KE(#?2^vpm$uI(b3KN}K2a}> z{OyCq(BIMk{G*736-S2ZAc+=xHs`Q<`ZoEJn=6F*z2SK_<5Rz}^H0r+To{>sh4Yos z@#l~I7qL^;vGVFKZ%3nkJCZ?!ufPE&hm7k|j^;R}=8REw4Y0K)2e_O70+JaDIX>Jv zMj4qx2&Dq!3mJhmR$Y40ygO+Ip3_Xs4rSNOK=k}FUhg~s zBX_wUzDW}~LNa&{aqZQvrO}p7$AjQW^n1db9&{#oHe{$PH^WP7GBZGx;nbP` z=tGlf4S5nw0!R8nNStoRw9p=soh)sVmB^;m7?gBLqOF`xbod;YwB$&BZD&_xw3AbA zhwn5nJj|h*3i5r>$)E*102l%&1(?Q}561)#9)Ksg!m)yK2jT+(k_djUW(?-jzfWR2Wz&SB@0cmJJz6@`NfspbHJ^=(r3_^>%G5y8vWqgq0i-i71fxj+$O$A0 zASX}7R1Cg^%no=)qGlFmgjx`T1bHI?YIj7tqCM|SF<37%hsVQ{t>JHQU{K}>nI3f$ z-(^P6b2=ZiuxavpcrRt_WVG1nKS2*~-ikfNIH3OtEujq1wS(qKuuRrvzE_&Uae1qlmt)%q5=!-i`4J82rbP>9B z)iE*|<4HR?a6%Ex@zX;gWHJHCQD6{pXrZajh$Bsi%@qFK;Ox8B=uJ+AL4i${-;Sl! z)AEHu+8{ommZx)3O%M>xwmMp$ya)9?zQ3nFSbIfq^qnKKYTlmpn;@8Lpm0smNt!CI zXid7oUzle}DQUs<*-GkzT+QnEnffR1dZQDZN`hASPQQKpZT**bqtVhk72vQmrkE1$ z6}%8jB=sm&c{B1MA(gm+k(r!Ac*qSXX$oSHYdXv;*ii*0r7E*d zf>IwxritJHSA+4i^t3=~J=MTz9xtX?-5b)vWin64`K}DHYEn8@k)LeXqNp>uz0_Oh z5w9XB*);HQ*1`tMZk?F@PSqW2c-Gn{jx@~gHjg>#!~ucA2FQv8=o+L?#UNe57#em( z7on*pO_|mSC(0X~;M8Ca5Y5)~ho)QU6Ov|g1pzYW@{uN|J4Hx=+gFI%F;7JjYXz&{ znTV38cr#2pO#(U_^}(LG2*~6 z0iw@?iJbk+l!JgwA5SM&Ma`Jdt zYzyXD-aV&R9T7Z7?Hr9JmG|i}(n_bd9Z@`|<2m#m>d}t^ZX08J1ZW2%VP+->Npo?N z<@>CdMyK~3F+6AOT>6&_F?JGojY(xWd;xj@2o?5cjQ$gWkxf{dBsbYF>3kHsS+N29 zK*QvWKV!q4XXjpSTK4{0O#7YQocM5;>fD~DE$_!JhTAAKk3lph`haYZkxYP$#mtM> zN4;J-4Fo0nx;mVUfpV3)nC?5n2C)=|kT*kzsgBx7h2%HLQck2#?2>YF*ax`E)JcI6 zn$XO)g;0rWFc2njQZV&N5cv&!co@?;po}y7R?g+qD_*Pi}iy`u~}| za!W}gr7aS#!$-3$M~wX^F_Ztz+0pNo_E-JGkMF<6jNbW`BkiBbktsFPeC-Xl2Ei`| z^(_E#(@kRN2ho`1l%dwk3sNXW^`5Ed7-f^r|G*o<<961IbV&ul1o|RoEbhz*PHG|& zWHE>d-+;Fy=pVob@E=WG%5aLxf`v76Q^(s{YciCHu%u;!SBk>F>o+shk}FGZ<07-k zvUF18lKNqlHuq#-(QVn9X1fmtv8vA8;8b6Chf`;o7k&6|1Ay>Bpu!n5;Lm^Z7Q}A| zvWNxdBXLrhKw^Um%{L(a*ivvJDbs7Rg_nVnITA?%fG#*f&>ePw@Qvi|X{YL&H+-;< zHMq;mP3!mIoK||Y`-4|3LBF^lK{%xu%g~NR(P^hEnlaW5BN^E~IgjTzRXvz_)pPx6 ze7jY|NrmFwS!Ehsk3~0^8eG)o8C}@dma+$FMxF+OMk^Foo8Q&U-4i~m`t+tpcRs9$ z72eg!-52gP`^@D>tMDdl9dH{)W1NeS#Hxe57_L;KEG?3q2)gYhrjX<_OHaObKw30~ ztLm*)xbq)(mC7kM7|*9jP*|*kvqA6y-`Tg%ynXcL!}i#j&Vt|!U+@3a(M@0+yKv$IRGy z&XawkB$;n8bz*PknXyz1l4*yVRE4Uabg1BJpb)B5>L zvNHv-u`JA-HwpD30fi{N0p3ME7f*zc_(>50)?t z+JXxga3Ff%dSG*BK_a=RdCSs?-l`?)p|ekLeh&spaFK$XJC`9zUMBFT_%-ZEsKk~c zJIaZQp|l;RyK4CAhH(y-ojkCh?ZR-&&yOfB$ywAXJ0O-WxoFdB_zBb|0^>mrJ~jaw z;XlVoawg3d1TKLFHDic`mcJPQaRr|aMDBK;m1|uF^b0kI;Qu|tU?UY7Y6f*JfK7r( zB&|avJj9UTpU^5Y0m3|f)fYFlI(;&V%ed>Edp6vE_TQIVmwlQhjiXViNG70x6fHp@ zE0aJ1B?5hifxIAUS!M~Ljmv)m-Ns5dm88vN3I-R3qt^ZWtad7AgAdM0O?R2PDu?(w&RmipZw!4 z-CbmO`P!oQm$p4A{j@sn=G|qTxZn_}jtor=O_`xdSCgTE0wKT*2izaihAM08yX^!C|84#e#}c z>Y_}KLIS{VW4A(x3~sv?({`^%9yjO=Qt&@(37V%g04xUxLV=tn0Aw&xQu-#OLV$^B zuGEUwA!$GOzg;9KPe;rZGXF$_WCNyJnj>71(bm}WA?}Oww$6LJmB+8QfLHT-+)rm| zC)``iN5C-32+oOMOY{dod(d7OHmWS$Ek6=Tod|2kGL^g$6yx5KK?|$_j6Oy#Ia{QK z^u;RPu;gEHsF=*9!X>lwrnX;IJixS9%dT#L-}J0gbX0N5Ho~A~a zlV+AkFX;v;wqj{|dnsAsDV?RfRmbxdwp;e<#H+ZZb(Zs1Yu`B1{*K20@Z&<0Ih3bK zxe`1Rc_rtRRUBBo9)MCTQ$iv%o=V1xi@VuQzD1#*z)OMoAh89t;D;YqFeb_0L5v)40zg3ICH+NO|% zn;y^3^#;W2!puleb!k+F`IH)EH*CCi^}gKXd>fY`e_PW($AzXI?R;PMZsbn$c>WZ)ck28B*~C9lb;=H|1ZYh3D6->wY%;At^fE zxj5JG;kEVe^M5?U`jX?_i%%Iox)%B#R_#htB>kZPWeFiW@Fwg@7zqT2xD>;iAEM}* znm}PF3#kdGeON+1MJ`LYg zExpzAd`sW`cu8?yZhLqb4N^4$InXHmjLcBZ`wp418Su?MqF>-o>X;jPbA36-a0_C@ zB%5SY7!yCs8$^AS6KM>`&OXaBN6*nLWS$(hq|oL?ZeMf!2A5l%&kt;FD~x$@uTKsu zgbxLrO0NNYNCz1>3DzKO<|cuzp5Da&c)cPDx>}Y3rJfpedC4ou(aj+M$!`4NgK)0AV;99#4XGom=8N+QP`{BtBqq1>hN80t<>$CiG#1X*!&?uYQ$ z*>|UQp6K^YxadMd>Hi;;5kMvIH_%^(a%kfLmWb2^cx1bG=imLbel{gQugPJ7^r<2; znG_=U25nh1gB6!Xr6LnK5$e`3E(>_bf(kO$5o=QxSET(*6Rx_nb@uS$wTq7c1BWKu za(U6&*Uu5F2tb6Efvn+B;E#JdBh$Hv5un@S&>2sdZh>B>XSjt- zl(6*< zm_KSeBsUvSBH4t<`yQ{(eQr(YarqkjqiM&t`zfy~KX)YzyMX?IUuNckem4L!4IGpL zkkwhf@PCFXe}S~3TegcaUiRwA=iY>GE~CH_fCEB7i+(~ZKzq2vP^?w+>f`6H38Tfo za)0+rzrmr>wkwTz>0f3Gz?r3p)?y4;oxaR4k{he(%g;jTWs8kg6pUEclh>CP%U2CpC-O*T3N)}B z&<-6uIG8+Jgb^vXOW(@l23!-zyYg2+>>TD$3zkk2a^6Z=s-kXm8%ma-X?q9Oi_~6n z52h|Dvw596P@_jvIeg>*ED;br6TAQbIUaC)-G9hDhdnBi!%lW zwkEojj5p#>PdBU3f1@_IC()~9f|2_4-4`kX-&hSY5Q_xbqhLP-xF@pUwCuJ(=TH{K zTl&lobt_8Ok_N!1s(dwCun`>dy}J;L(9c5yx=SbKj0<9=&V9aGYt_xrH%@~m6U8Ow zCp9DX%&xrrX4&Ai#HA$`C&zA0vpEgIl;Q8LLD(L8w|Yo6$Xk$2p(u2)FfpiPnvpJ? zOJxk$n&6H>z}6H7{s)?z;HxAy(v|7SnC5`;%~@?oLfOjqa;lWx?jGz#w&YN9uw)Ub zLb=cKvNmxzcW{IM@H;9H0oTd_BT3j-4KcRCpvUO%wDy7=wu!J)*hB{Pi1UqAT1`p4To z@IJU9M#X2reInCaTa#s=HB-BEhj?4kOFU1S zL>#KF+0+HTM)W-CZkhY(WrK?@F7}-2$t>Q@PgXj8Z%}zl!@iAN%Y}-wPx^g2bm3*u z3&%WiB7?EPql}q)$m_c&-#cgAJO-<7E$i@w2X#YT;U-%Sm&`Gmc>VDD+TyNNL)KgV zEcqWz-vZb2{{R2^?7mgIweD^0Qd)^tl63v7dxUjCNLE4-l2A$eY^{505sI)bh{I9D z31KDb5S7ajr^8AJNfC1Yzvuh=JCDbCNHcAFzh9T<>-l`X=5cIK@1A8ZBu(ne?h|UW zr(**AS4;OdSfJz@?_s5Z?@R8Sv29Ci`~^MO=W;&mp*2^{O9OQBlW-w!KiFCGr}pn} zL-O~&=`}539J|xyYi@cxuYMn%E<53Q3h~pC$FeC~W;Lz&`s=T|PrZ*yKjpdj$<)%n@wbYe{|)BjO)X0gO?$UD z@7As7uil#i*qNyCM0{2Bh61{UD`h)uYj`&MVfx*rMd6@cuRfXzz7fl5IV%1#b`cwb@r=G$vACgibJcm9qvjy4rM?Q6j!#)^v(+ zw-0QD$>RDZmz#cQ-Vk$SWz3J236i->%#?eRJ)=qSG0qDr|LR)#V&;dc^ls0D7?*Bv z7u`S-wAAHPneMPje@FVd^n0FbV`g^m-*)=|!4202(!v&vtMrT*1%RAUF4-NOkcTO< z$C_JTtoqPH8X!gxP_?l7_P;MSeYlwZq-7(=&9Tb%j>XG)fJ+pBNrw)rTeyO>Z9}~G z#44;8j)(2oZ0g79m&Pm^YDqaXyYyk|9Y5L2BOmUkr`WYUbblB4VOd(Psq=hXR;@f_ zRrWz5Gx6mS%?tLZXLYNG<98>|P0pE*zO_vz7xm(HO+e-#H8 z2s|?KFh1GM`9~bhfdWm3a7bMY_TGhj`Cg;ZMaUWZm8F4=;awfHGh& znLH-kK5AxLnfwVur3!K3V2tO z*L%&$jMi*@u6${Gdz;&tC!NEI6RsKBKkM)RS5SMb==E^=gm(t_vg*mQkh)oS1+Vr@ zgl5=!mB-9kaOAJMD_@xay(BS5FG|E3k7>B=f8$NbA_x{v3)*q9mHBpZ|d3gQK zjlrd_XYVtmg7Zl_?%R)(vWy*GSD&nS zM}+(IM&Mnz?b%*!F|pkZ+xq-QY(BBJ7kS-?fg!SPkoA9A1N|L;buStG0x1UkUkh>w z3p8e{A!o#Z3n=!wZ|Np6;5Pu-0exCL7%s)5VD71_4gZ&}bx<(`>VE_@uDU8652VVq zTtFOVC3@*0j&B)v1zx)3avJt~~$v=dEkC>Lm9Km^GX;en)MZUIsDV?)=m| zx9;*?&Ys&%+aCM9J@P4X`yXEa#H{N+M@+ms_wpy{b~lr|ky|O#vEl=BuYVd@!{)^#K$M{TAit)2Fh zVzE;oEpVOD{O`&C(tL#UJqI$69{cn!b`<}aWZ<&1Gf*A-tgP(SIr8V+?X}Fom`&Zy z+xq=RZ2~@*Z%@AboU{4#g_r%?N5!9Ow%@({DyF93;^P0#jxPV)u>FzO+b3H~FFpM4 z!|0CB{WGO0>m62)L@T%vub0<~GR?dVp5~TbdpPi|E^X2~ zlY51JIDcb%(BRbZ%E|ee!Yi!9g&VJT46Yl$Fd366x?*~`c;k(rXMc=8n%t1-cE$2= z$;OV3XK%*8$R@Kgkt^K8s*RmNLsQ?IeJRNdzCvn^UwKA+CYhmfh&LXQzblQ!%-cG> z%v^I}SLU26Hcvn2{rzw#qHOk;Lzyzk72)A>+P^tRpl$2-jOcBsj6m1V+c)@QiEZeY z`pkviQ=jg6$N6N~`hL}ya?Db1@0)u|Z#{he;r)&;n#@>lC)v}A(yoqomBpqXQiT6B zJqn|)BJ?uev`$E;!_}vp4_ChXoch9JbM=?InQO1iv^sG5_RAOBKeT=s%uKm5+v;HV z;YBacei%Phw`KUC#|qXfRQdAOhgV;c+_rmruQ=S@{c`u$5Aava4#gF*RrTqfHNzeg zysyk1h2C>oT~H!jKUg-CWkbjA%Zb7)=J}4v>O&i7F|@8iTT)Y;ZTJ=urzP2V$1_&o zQ{-sx;wfYHTgd-x5GX(2$ZPHWJS>tC69v||wuJrEWS7#@de--Vh^q%+hXz9I& zuRcud_=@bPzOu99UHr3HI33r__U2TU-JKVG!sVQY)=7Cm=jq~dnO~{Tj%TtZJ7L%3tO&kX5OoQU494t?Xp}shi@;32S`BxQD>lCr` z_`CagujhU|{&mrglUEiU{^Q+)W1#38f#S#^L^?qr^-f+;Mr&tNtdHjPX1l^w?|%qg zhIx1Ox(M5X-n1u5B(m9JH+~_-kJv3nx!%ba!~RP(GKHCXl>x8OW!N`GAOHTkdPmch zrH4=dF z%A;k@pEE-9vjY72pU}WD(#iQ1bUbtU(?3feK78}x?9+ygpn@iW_Qn)* z56VLTPKf~4Qwx?)DpW3%e^dKx8cXvYp|Z$-C@8*H;VnHI-K;7Yb+k2b5N<>DW>IKz z5dB->jvH52TAguxbZlhVC#P@wcNnW?-;gTsI7&sa_2sI?RnVHJXK9ZY2hV(8omCFn`ayZ}mGKc&~eUj`r`qxA#7+|MuFJ*XV5Y*8+L%%fwx&-&%G&y;5Vg znbx1jQtiq4b|`W1$|kD|r~B88dVH?_c6Z0?D_g8Cz0)5f3Q0Yng(%Dpl6z{2THDU_ z7F?&EI=i=RB6g3Ki2w{tX+VJSC=(2aVIkPI+yKk&kx#Y{i%XA68jm-9>)-LtJ8ebF zf+w@y)qZ~PZDhwVesi0vnkRzYu$`fdnIjQQ>c>-nkrJRkSMB};9SMjhSp);pE3%G0`%tk77k@ zw@kZj%x}`>J1a}iCwIlQ?t#x^*^>d^t+U$yd~H;hG#E7Q;kxj6K)zemejw808EWVZfxS6&3>RGGDj&F~BTK28+$K$LGSN~d( z#9J->z-0=V?if}6Y0!VHm+%mMH7*VEfILtPGPQ>;0U~v6)+V0|Py0(p7k@tc?Y|#m zS?NBfpd->V)iYG?(Z+73YxddP3$Mo1oY7{R%D5#{jr1-*y{Yx&Ztpzzea@)flKhO0 zA1mJxM>kB1V1Ng~)CqX(@;`LL;ms=0gLZ6FpDL~pdZ?y z#(CA|ZWenv_pj!Jf9(Fc?MLn5*k5O4kFUP9`h5D^%OBr<%73-V2Ct4=eL4L-?@rPD z%3pV6!&fH`f8F?_#8--O z1rFXUN*y+grbg0>a}LQzH8yl!{nTK=E?f{^i6+6!R=t8H#pb>SVE4L|B*D31tl_=T zJk%CpNtf%o*L;W$7|}Akd@BO*b{&-`6sx1bZ-%(q03AOo3CjTkJS-^A@%5N!z>Zyp zPS==l^+g0BD9x3yigJdswsp4nJR0M+B-1L8n4%2L^RGTHS+|Lsio2OK0|8!{D+Aw$ z2w$G_NI-8BF*vx*hP$|83CrjZc_w0^HJ}q^6+nDD3ZRN5vUPx_v(==aFLkla3wkqu?593#T5TNq&E~7wA{*0ee+ab&C&gHZ7NB!=m_Kp zWCZTnz6MNq*`H_>@-)U+qSuTc!fb^vqbm@R)O5^a3c(V)3%-S}*396Viwq_oT?{-9 zDCtR>hYxng?YU1##a@92&`ro}t)+?@MQp-8f!7iK&UL17=y&jAkDG+ezH!Q(o}nB` zx|)bfd7kkJ&D40St;S?D5=kEnPKoj%FJCFI=g-xouK6EtoJiy-!wR7RdOm4n+wsy) zdI1uk<*OKdq*R%gGxz9iV-MzxMi5)CIf<$QTl7lfbgJ*hL+_8}jvm>SU5~F5HJpMf3)|^J7 zq%sFpcmo(EO_Brg#iX@jQ#D&kP2i3}t_*c99x+7YV3LNQg_)p}OoD>6Y_*Xa*xd?b zSdL9&}`4O{iT z`#w*-VOLXsm}N4!k8eYtlvO!^TafR{vXs}OgmLZ!=9SYG%?hq)?7g8ri$KK|$gd+S zwN7-i3jIg|(+FZL%h^_ZYp9Z&-Eedowo=|)zgj&b`M(eP_qT>!yE{EDPxAL+eWl`{ zoDhgTBEN^MmCjTR{55oj5QA-$KSI`PT~!u+1`~uVY^!_#*(B4tsVt+Y{ZmZMOV~HC z_X@9cA|Ar_%C~armQa0_?_Ynl zGHPd9XVG#C{JI`)%?csD-tTPvTC;`g(ZC+2W)j=5&*bkl>0GY{&hYQlrW*o4(B^iI zP`^{g4yBs{X3AOwfaNN<6R4bW01LTQXYU0%722ivoVdoItfE~M; zdNq_!XD6}FTbn3vwXK3*geQbJ_JKIZz+6P#A;9C{LTW4>^!RJVIL$rPp0w%ZN5?S! z2doI;-Cbu&E)e(9N9A7UWQt;kTT2x*|FvST7i@=1Z#q5ftfGo~h@;pq@*jvy>qF<7 z(pe-bPJp|FbwOYhmRfU3kKMH)7Z0ph8d%Lup!>_cnp^m89*Vx2*W5Hmgj7<)RA3xS zD^+uO&GdMZ{bF+kwKb3HFXFrPtAHHDPGKZ2(gx546%5&Z(gxgY1zTLo^+d^BnkE$? zS>rTl6C?sr(3(W3H&~5x#ycRiSOR@61X_y}=pc;^86u`yTZpYZo&Z^igT*g2(rG+*?d0##?-dyH^^Rzy&r*xWn21iG8*6d+7N@Ac8aiR0cfy zoO?`-tH<_}M{#!WVfYYYli-!Yu-vM}x0v>I&QaO)F;mG`aIp#}aium?H6<8333Fi` zUcVlEjsQqW2HbR(FuUNwoy>uwV;S|;b< zE;mP3ZCWs}N8-D9#? z6e_+z5g@MBhSBXRSdkQGz%{@_1VHm3Aa^f+k)Fozcm&W|ZJ|Vep!n zT5b;&BJ{zgm_qDz7<{Rs1``1{5MF{F;YKvr4YM*SzW7>2cUqZZ0)yZ2~R z>)oAa9jDeC^;5uDSrOBEnj0l@5E@(R?ZV$utZqH4#!;qK7)R>;iGQS6FaArrj4qpQ zYErIu2mea3MSMxSobFg*a$j#0|3$Gwd{w)GE;2P`=~D^h>>TkmZ7kiX!ZcEUI>9X4 zZ#ufz>!_346F=Tb%;V^i)(&obaS7MY+ZrDA?hsR15_O$O6GCKk*FQ7|{tjZR$vi+2QD)#k#5L}DSfipJz% zNl&C3duB~q;HU&*PWCnNpmb9Y0J5beQaZ}Z&9$IhmGPVE+$+SU#7opqC*TL08g5^o z%c~=WtFo(R#zX+>ce7?8_(%4TA>icDJu2AufhOt#IMna7 z+Zv{lIQq0gAdwnseXmX*^UUXj(oPT`W{MqmBHD&vRx3xA{3XcuV+h zvgL=o@9Z;^|Hn0m+ds)Z$;>4_R&Kv}H$IX7XtJ_DBG{Nn1Gcrwu2_asn!fpCE6bA4 zQeV8csZ}}c4)Im?NAWl94!Tc;l{L5nU~UFtml?=_+%#4_2u82b9`Wqf=_oZyzk*8T z1mgE;AT=>L0h$@g#u?niyDDT^$v&M{Bebu?U)g|URgESi%~+wMi**d0V~L5CO9EV@ zo#-4ALrM07NdkTYmIdqbHH<5-YS0Amm~X|B2us>eFgL~1wWMGynYgI z-)6)sqNm^Gr!uaPVwFz5W&_2lz$ifzV-$+S$c&ZK$Zi9VxbNyejhz0+xxuqDG-ukQ zUJoA582!n-k|VPiSTXf>jzGU5^-_v5&g6X8@_?WOdyoEviLZ<53ENoqr!3A2h8Ukn zJCr`Y+*p+)*v;CSX-wX!4Dz*(-6aXhH)yC4;q39hlvN!G)#vGF-5fhT9M}yGi8Q5V z57agZc8g8HPnSDuAbwm}OmH@xoI&g$c#GpuVlpI4ei;?ER~gzirF!>R2+5|HIfr~q z8R@$iDAVqR8T5gpody{yUSYTLg3mEN1T}Ig(@@MsWDk9_6iZ5vBCiyr=G6J&c?+Z_ z!B)fgQLd8EM>2@NAPVZVV$mMY&M7(4xraWt!sb461Nnk-xv%5EK6Z@RfDCP0QU zr!)>M^qmWgh)p262TmDOjGFBFpb89za;Y4=iF|?=ns1DP1%z^!?rx8U_w=}tTYkg~g#Ta{fUgm)1zanuYN!R|-3) z)HgV`P7>~BSI1gJnU>R@t?kH^XEnG~<|nZcN zC5iv+;^d?1g(!d*X1$e{}E0y80ZK&7x4BSHjgW(G;d zf^tz{peQA(Str3LLbggS0(yd_QPY}?WAqwx9{H{xIImjPH|;*H*+WEP$k|ByYS6XT zgOv>@jVy8u3jdh8z{xsMDFqR*j&QK!)s3}xH@`a9wbFdnIqF89ydZec9rbmH%(QtR zFb~;VLv!9)C`-z`7@9*~_qb_Dwv04g-=t8lBWI{BrTW5HbpG^6frGC#35%v7uaKj3 zM*Y<9`cO>E;VB1%{N?r2qq~N)T3ByB0OY*5jPf zwr#u?QH;>B%H*!zo19N=+j$ri6rNm&1<|oHAuc*7HAi5HC0K4U1vdvWM@)fQkljZJ zh5iAQjwHxcLmUINxJWDqzZ&&GX&QYMB)U4F_aWzN+o>m4R4e)%Crp0oJ%xY3p?UYK zVJJ-Mq2q)BL#)_HP$!CCHg62 z+hm{zF@R3>K>rX)Xd+~;*$hP`TdBdc&K}+M_+5e%=pX*C#gsR>QWf;Z8{_+d3jlvcHslT7@IV{b@SHaiWO zZq@h7wenL{k80MSGdd&h>#rq;OR%N{J#E(1fdK4K!>baepFgXn%T!Hp;YIK zuLay#QZ|-v!XmekXJ8Y8_72VuOK_`i59|?y(v}xAwIym#M!`-dlf<+67L@g|pQP?w zj?mZHt>#EDQ8RGBIg4a=X609}WsGilXL5Y7vxC`w{RO$gYvt89lUEJTSN&o1M}H9h z#CEaODU&wmp<3BF{pGpbwtc)V(Q4t0Dzm%#>v9kH92mGwUsEyTzS*dLdajq>;el>? zf~gD3oN7>z8{k(v&`VFOaEUaZZcv#!&+pj4J^EVHndRp54UXq7^!sDr0exM?%=_jW z3@+p@za~Wu5QTP*#;%>|KpM?=LBa;*^u=i;2Wt^~uz(0Q?r1I5^kB>opxOSGTZ4KE zbk(;gH0a2U_d{?SS_wVae3BY>6I)q$u+@k6TAQzOt-^7`W&cpR z6vqB}V7g1x=$)ZVm+!}9&FMQN%QfL1uHJF$jf)^4j{NFv;9mHY%s#vJhSh#)Bsx_uFZbFt-k@kxy<4=UGu0x`5SjxUa`n0TAa+o9fdy?+ zWO6_*@*I}db1DqH_9;Tn^4fa}hN}?kP};TJ{G8@&evPcUF_dKyPpCs@w0+eGtKkNy ziD;Qu>em@NBuR0bU1zz7IxTOXAMmq=VBJax-Bfus1h{y*A#**w9!t^DG7vB~P9_S0 z*oz7DCOvXKx(AJ+yQVUXF)n7C$rKz@KD*0uEp=92)wMg-FUK~M-1XT^@KiF;5d*O; z51A&^i-&b1X%MG0fEPsq+#x^;LxK2)`};)1L%Sev@HY%J`cgtY%z`K&8}$wht5T!f zUD$`HVR^^>9t^w&nmStNw29i2MilaWxU%-GDrQ)uUaL=UESo`!fw<0AbgzmaE@{`! zeJFk)KsJVSrdM%YT;i0Dif#>?cSw6hYb?c)OW$MOG;A4mk7S!dQAlH6Lcq~y_T!{s zZah2LDo zyt{tkmBPdfH(d0#Mqz#41HU%|AL-jGyzX;0&@KQ%dq=+cfD`kPgxTy7qgS>Q8%ljH z+jgd;k(R7VRYp_Tp`$PU;Wrjmq|+i;w>0l!uS)mfy!EYq#xGhjcx}A;Dw0Pd*6_`1R@3*%MqOncdkS+plP(U#j`4&RbO*(m5>qq2%v70Z zF-$ux_~sXm_}6{E?lWTbmG&zSYKLl|O=vLU!2Joj4V~%%tLEw$4Z6X>Ou%TsXh98< z9IRwmGJSv&YFK(d`GgafLucfZ{qcjCGI<}8%JrtRfiJNYBr^c41Y9%7d<}3LAy1>* z^J+f{)}wYoc=U{>9#WW!%enLEcKJsBdV_dIc7-^S*ar}R)eu%gM?SIC-ZqX z=|6&J_?ye(zMsrZ@N3}>(l_V3x4*qhEz9fko8bMV%k#zl;7`l)^Y2dOn=?xD%}LgA z%&>xH|9HMD<6!;*e_j=zX;Du1!RL!5C~QFFi$-y2iMvp`w$f9uw0>?_=( z=r&xm_<4LiVStJblt73;_@yxXG>9> zX;`saptWEx<97ZUf0sD(Mn+26-?UC6PaFf24g@#f8+?ET4}CxVGd476Ud}(Tk1ENN z-cG?A&DUF8-NSq5b}7H>etx9$dS5EfRMUQ3bCU5Wf4%>#K?_ESX;8V~4&zn+JxI0{ z_0UWo3sKXpBf~K+dptU0q_xoezFkAcYNIhljp8uZM(R#tL!?1UE%EQb?ay`~CS$X{ zTR9Um*)(owqKq1lL_O%BoWxk7-RyoShf5z>d!xyS^a zPuhz`P#rI4rmS7?LN9T1y1&;Tr}s=p(1?J7g&6j<2mV`W{N3{}DF zlY?=FeR>r+&ZI`Mx8!-nn*=wd@fwpg*8`@gxib<3+6``&T^36fR^z3lV0~)}lUSf^ z_pRZLt4uv-Z>?vD;OUAx;;S&T*CTmRGdG65MTXD2xvK8?gNSR{7 zi4sv#f^&ZRNH{;NtT{N|+Lg&J=xCGQ6EJp}hLl^+XWA9W4ji3RV>7-hKcvfgEpt{u zRr~xJ+wt9`Ir=t*%%Flgf1P@npk<1PK-nT1&k2viqxb1)7jNLE7{iP5rI?q9TGr71 zXjdOCMR=RA)L+z^EpYz8lk%eIHwf6`S-fnuOZpyb&%1h-l}n5G@tb%j6TbX~!*33iiz+pTLlN6j*HR~~vSbC&DeDtVldTNY~9TGCHv^DU@H7e5~ zY~u+23eP_$7Z=3a+jpnhH`rqTbVIsceyiWovV|((Rgze6&VSk9G{(M)x%X{GnX7QU z!Ud?=)Pr&KxtHSOpR8?ZkBo5a-8VV+zIc-aEok+R9Tb(xDxyMNrf>|)3jX$AHRxPc z*%z8RWfTa3yp(KBSQ}6B9A%WlmL!kkPj>#2PLcHA#ntOc^^6a5_g$%dg)s$tg<>PZ#vHC)Kz%=85c)_;^VRg+Tj2x>dJe zrddI1RjKSE&Z4ruyV@o%E^yMP2dQJ2qg5UE2W+GYO)4wO8@A22#^8BtM4@haNro2+ z{`22BIEztbI-g}*V)%D~A(W3YA+X%V4QmZU@EQoL-H>9yUTN2OYA*R=wgSOQBYUV) zk`neNzQLyWy2KroBte`^{$27a+y(=h?8QXGReRh0hTR3j?Wr~Hn+|r)PqMve__ScG zJ*~!b)1lx6Cv6`azAKn)&#dv@bhvYYH82N(ARh>*0a2Y?l!SoT56S{$kDx$va`@BE z6TUX3jN-2Dp+sb#Joun_$&wxP!2DL6Gv7+esleC6Km28bJ`A;~ge9cPSmZ){K=z=R zQJp~58a5FDrCXkgcxV73Px_rw0PLqZ*#@9HkqZlVh5Z6mKuqvmoCu7X0`U(~K(yE0 zdZ51nZWsEf0|Hd5C?NcQhnNt{4?@k+rKqtR(S_bmBnRXS`j%DqNm7O0EM6fapkPqu zUsjV3g2K?06o`sj1e)m0>NygiN4^80`2Sj~TkE-YrtUqgIG~tbkHl&9lOsf=Ax{>@ zPQDiW9N-x1*m?Ga#@CDZfljscVg14smPer>q=zQSg|UIAj+Rg%z?B0qTxq0~K!T)L zPn?XZ1YQVg=Yg>AGNFRySIEC!#t&(%O9=P0t6@bH{-*kA!AsU9)!*8c-@yvhWG*0) z=|uBDP@&tadLI;otK{pEB?v>5&}SG$?;=ltx-3Ie)q~XAxmkFc+6Qzkxuy7|YQGq& zh8Gn&T;E$Wcl-z`qS)>xYfYicb=m%!c~0P2(!f)Ly9ojJ7##z#6a2%YIy(>uR>Kl# z435O2kT)vQ%tp;s9{B>D2au=I0b(LhaztHXS3A(k1Mi~wPRHsa`t9DcwikK_5OqH^ z0%8K-=7G)>gJ9LL7ONvK>blzX8lCpVK;}lW#HlETm{bi-YYCB}fEm$aaE>P+11(iO zA0a8NvIBPPUqDS@+qfuQM4o*ZTW&$Lj-xdrID4shp6|l}{~fGDs-YOyGi2NH!Z8TV`hlliBb6#Z^BaSM9+Z+jl;0w zt)7n@?c{j7J==F^ZbgID!oW@(-S`JKC%~v8cD%tYYtxiysxfvei0sBvCp0S5!5&yL z6<@zmvvRzVw4~T!j&V2H6gufERznDg7@;IL3W=U`o_;WL~tav+&P$&kZVW3Qsa0X=aEVNH`EW3U?NX%pms2MYMdlHKWqI_yvAHFODD%2g!W zHdt1{Ju;Yrra?3*Mg*&&3jAH*W0VWjOKd4!O4LOVw%i<@&D{Z7Ei-HQ4)A^h(dhq5 zMO~Evf)h9qR0%lax|<4qX|P&wadklfd>8${&-{O10=ohP+<_jb6I?cZ(DMd~4fX|% z;TSToYS5a6GlvMMu9|)~2$@dXWjwd&==FR2wNB^imqt$uXA$OXoc>Qipnp@1Ps3!s zQ3aqMPY;P22*DeOHy3|R2>MF(yM=OtcL}u2iVa(R;*MW#KR+e!xl0c>(lr<-!mh?Q zil6t+LG&$gU{H>3fvCtH6pJ$I;V4lo)vmz7VuW1LuYE&#Y}I?=+x0Y%3-CJ6e+5(O|JsEklwM(iHx#EaqX{R)7v-xcVqS zAaqUvInXPO9P(7_iLA@@X6KL;urzXvC?RQ~LEsOP3i)Y*L9;=on-mq@xc-cv(#Vw> zAYeYEg++>Y*mv9uZZ|Foznm&BDyfU;N-4Y07oBu;=clTopMSjMr#f8}F0Yy%ZX)}m z=%4Fv_*#T=*jhW{4}Q)VT`5YE|XhDzdd1eZ$KvoXof)q!)T)A@Yqby z>_U-b4jhUcR!?t$CaslJ5z#3pLFrK4qV`KBT0(mv0j?7BAutcM9VWSv6~rW*%uk@; zs65oHP-f{d-N;rmLMRMjXG&OnwzXH=vb42oQp&v4BS= zG!ykfFxs#&>=;}DJXLLr($SlKru4?Y?dsv5&>Tz-f`zA6o1}4r*{k&e3wm3l^L~ya zX|AXwDay$VeukE5qNFY&jwz!U&>Nm9%3AxRsUmMvUNIw({7hNa78TnhatBvNr`!c* zh~PBQp?J6p1V#)Bqu?R{6EYAZ38=a%a!V@CJCaFXw zW+u87@s*lLWMm;hWHyX{fc+bDUUeQdaWEbxw&C({iv}D-k3_2`Y+t~8v6s+9{^tlZ zZCmI$q?i}Tc$Qz*9u?=}bO^Lcc7aCE3VVNF{NE`W0&zeW4Rq>c3gmFZxVC8gI%#FG z(@oPg#V$9@YhOV>cY{ZGf}{&fJwW0>fIz(&lvY_FGGI}x2D}}*ys2~c0pO{WNVn6% z5U{y%y4Jbj^|pVNK;g>ru$ykH>YNvuohn`&=&(|(3n0nB#qb1NDpLTAn+sgE zboI_1vJQr1b8pqJ>UT~tyHp%=!%Tgd+tNIe^6Cja;KMLLMYR>1x`J0b%-C<% zU7T>krFQ?O+nuu2z(0b-Kocld6`dP12z z2z5seI05tV{Mk<6!G+kJZEQ7YZRn8BqGH31S%NC3JHj#K&WYILIL#7&ZG+yd%)(*eZ`&C1P{r*EIR=$+yXHs7|hG6l8 zBz;$kMc&T#8*$I<2PTpi*daL5bPAri2_r|n)RALB$2YjR?S&ka5z-LR+s&zgW%-U>pkmnPtq)|?!0%U zY1t!rB9?=lm1}W*=Z?Bff(wnnCfajWZgkJiSAoDox$M8b4XLxPSPbkO4@`g7QuZWj zW7DiB7UMfXSEB(xr3BC|L2!YF!5uIMtt+q7Qsx4Wf}-Rt>LGJ9%} zy+%z?(f#R14IiSZ;wxcKn>P;4`egBA=dVC?r6x@4mTc{|AD}8Lu!muRFL*E)VOg{r zF2)D@dvR&ZHn&7mPZ#I8hKBw>q&@VX!pBkULxgT>Jkg53UjB;Cf%sQQv(Xe8@He=U zT&}@1VY!%{bctW4yia2v#Y|RFN(dd<0^nm?pBxQfF^dvvN1mX)7reL0PzARfYy-Lk z;WYYV;5F%x!(a&L%e5eh>fU({v<)SK7YT611mHKy!2?efM9du&ZmMz%x13sH+)*UB z;qRgOA=pO=)H8PCy!jTKbjnJIVxqHx4DFc+Re| zj3}Xkcmf`zYx=;D2k>fS))2%6+35dQtq=->4jZrY>I}rMhD)F$T86x0Hq-*j=MczK zgHyAm*7>YRECn-OV^aDHm2yFGhfNodE>+I!=#bcDkH75Vz0Pk^-G zOI!L8-tox_J@tSZL9P6hy7MovMmVMM1;L--ZtbB&iPuB)p1pzbs7_CCYxE$QeG3^~0QrdN4}bEcN=?YJd);q;+Cz27s1<57C3qgycS zG$G8e^xDOlTY9wPp5V39$NG$DuQQxwrGIuj6pT215^lEy1->cM1Rp^-rrN_Y zq}OB4#?t1F{@T$^pF6jYczxx76%G&qg*3nGN*!a+33+Ppzj<F+(oYES8{pcgAY^nRJlRC)(m z9VsOx zUkfd6zEfp*$SAO&0{?N`n{G8`AIhS#tC_307iG|!u~1QJ^sFb;$GcwFejNXrzoW~0 zt<_(p{T-vVpU1zEvWi{%B|Upa^c(hctl`4xX=DevsFJknjH_ew|)<9pyKGo1B;~s9l z%&MbQHq`OH_RIM9{H#!)6IKsPM>;;$ejEQml128nTRkt`e)WssN7>4SvL>G=R!2C7 z#z0mP_N!UOT6E;gWU1Vju=rOm&@14O+>g$4A6$j3gXcl7-kO7?s;44!V(T~rKu3>6 zrgP0y2EoK3>v5PYFGl8YZB;C=k+u&19#bIiLe_H2AYeO&Vo_o;5e$V$#W=7XN0&8J zScp9dE|(knyZ?rOQD+l23#!Pj@?G_ep%J4~R|UK<749}G-K{*0byOEue1304j%m5 z?@bzsU_0S@CW~yO;2^6o3&v)S*r)9`W1M8-y-Yhfi=Nz+%213{++UFViL3Fp)h8r^D@mHJAp=g`@`c;BNH* zunULefFc_!0ch8G7#TcU-kF zcUhqDuwg-F1TivC7$*Y^j_4paH0+SGI zgbCD^E@kMOr?@XG`xkS(RTk1qG;6A$|AW0tD8?LB_ef9m6^bhNhSnOHwjYXfq@SLX zJz4uF^&R!Acx>frd7y-UlB1?y%sD!@KKF`9fCfW+Y?-1{Y|T4EPt5o9=kpEA3OfVh z3A#kcg}8v8s@yz7lH$i{J`zk8o>SZDj-V>9qRL`}!zs zP~a0e<$Vi-F=jSKPJ)aSS=m!kz@TNsKZEa6rtXx~0enBC&>?^i?&20`9mLdvf2V@3 z1-A`@Vl*_3xvmAg4^1JpK@?;Zv5*=|tncIN@l+h9{iRd^z(QOD_8-^~*!y~Lx1rQd zwonF#62VGzgw2Je1{y*Ie?eJ&XJnmyiqYSNNdXu6E6N%=qjWEkTT~Trm%pwI%+S!^ zuQ(XsQ9am-oFkkSm>b0on`wv?dL41^e@~}oqcc>*F6?SOnIb=j-wNEsg(PdJ32TV@po0io9Xx4S zVJO8s%i9uqHdd1oWERL26qViRTxkuEgyY50fih>ofwDWDYph+I&Fywp1?s>X1Kc_B za;>F?nm}^HY2hCQ+dx3F0L$1RHSA5kl-&d(#!KYkEdJg(5||;l zTJ}U2Bh@^ZqE##P_i(Rbk7K*E&593jP_E#58RL&l*0axKwH>sllnZW`y$nv3#k+^I zAMuw3-O%)vy$uFM5R+q8S{`&q@c)SV4!EYy?*Hc|A&V6uAlrbCCG7YRLb^?03Z<1Ef!u=x}5hxb&b<5a=en1gM0%5y{q| z6)`*^TV+CkB!gdwoXs<*eT#%E|Vw6nfn_rBc`2ec;>*F! zu|6q(Ue=R-57!dYz&tZv*X(znlB)Jv9@!)4ky#Fg6k3*;1PcESC^7rKq%rW7W$P=S zK!s&Y$(+E7xZnY+cO|)jKUi)oaSW`E3mvfDU0OC%84$ZOqj^i9)<$1k>Le%`@tl~o zu66JbF{=I8qhS3-j|(9=`9juR%%;blW0Y>HjsH}-X;zV?O>5~$VDI&0u7bXl)FRC# zyfL2(jCzJ=4>{OT|A+j5$a%_gU&)d{d7L=X)~(DkNZ;yEiGN^YqYLhhyW8?q{8L=r z;*~VrA2+rG<>CkLYCWl)?rkrvbv2?8(r^r=!pH?{Vg+F&0W_MWRe4Eppdv16!0ugH zZjhfzQ4YTVLyEz{DVX=HH-YsqrydLK8P6kS)=Qnh>nk;2{O*Ms7%&XueRJQcTm zU{2whF^m0H9kb=-Ay2-0Dq8ka&x~6dhnZpAedrs@*m@t1xs2zIE*SrG?U#*ziGN4I zYwfy9o@*BM|L!X}ovi$b)C2jg$hkZ=)jqJoKDgTIc1c3d*~XQrb9*Y1gD+YAA}vYj zxzM;ebzb0+6TuIx{w&D|oGx4_Au1e#8pk4Z0~1M%B>S{~^BG87*&RG#^>@kMo~w;tyqeFc z)Cl2P8?)80JYI>JSHOL3QD>c&zX^bB?iD(5M{Y7T>&p(oXs zriNoma74THQXzil(hd@{#dIk1a9=$v zb06B{q2C-6mk*p^DDcv)4qx5Z&KDVS$r-dvo$R{6J5LfyoGxAyhE`j5#y1BJSxR3| zt}LmJ4n1YPqV#0oPfs@MxER)yh2FAGEIk+a^OG$)3#)2|LSMkSxf1xxlWjV#;~;FF zhz4YF_Jp=di(pIw`7Z-(ER1g;A^S`53d?{YhK6HuBZAp&?K?l6CCgSLy$M=79fB#K z8Qz!$CQyKshzyfD!?gkk1b=SNtL2Aj*%X%E2>k8Ib{)5>+UT%(HdUpXFwg|-oYHX& zD+BlDBZGq-lnhI-%DPFOC*w9t+GW#eyxz@LCr-*{r9(XvjXPes7aom6 zA0YiOjMB&!0Y?UoLM7cAJtN%77L~T#)OB0?%ml7!)=1VU!94hvy3-(v!j8a0- z5H|K(oXtYS%QNa!{F*B98rGGsNtu;^8F>9EarauwGflAhwsfTDMdPkl9-Lzu((odi zA4{L~yrOKZYC0|AfT$u51Hfr8vxNt?UK224rUJF~_p@9s&luxAV=zdHO&pu#Su$JH zn&~(Z(&@STm~Xhk=5Fclfq%vA8Cdl0SZ??aHguqc;ADHL(g}lM>q@$en*b$Oy2KQU z$U5CN&q}9yr0*N|y;@v&yf1vh2B6V!yufvY@+-h(_JTEMlO7Up5$5XRX>ke*AkL76 zsxVx041@AJr!6-iYp28%2WzgvG-!(n8VM6_+K>CfDWz)Az?gkz$@uXP;WS%%8Lbzy z$~uF8mL3XM0ADH~0EA9#Cqz-uBCk^*bpqaX{QI?!A z!@x6%Q*Uy&|0~~w)9X|>QmUR~4;T)FGr|DLJBfXONNj1)?9pPKz^caR$a!{EWuZYf zqoq1Q7Y~s9k*Ivmp6uncNOPkF`wHgn)v`d1Ihn|tSd0kLXG}XpyD`7}2fJ(MW#cN_ zDXj_C8SY>%syEGfw%y~hJt)qJgnkThfSqW;H><3vCZK2VmEy--B zLn{k}1HexuX9Tc9ptI#?fQQUN*~)^Jo3*+n5VlRs08yo|HqrE3WeL4bP1UKPJ&NS0 zOLo7Mr36t410I2e#Np8ws_`3wnK<>Qf_nT9TvPg|npPvfh9u$fBy?QU6!{Z%mC0Y&{XZ zQaHc7vUl31eg+Jgp{k(JQAJ7A{nn}I{X(xfnY`UUew(vza4~fL(JzMNYiaq(RY!Iv zn5&i12=j~r8@4TNlWeVM(dte2pqc4VSLf`bDgPkHo|zWLt8^lA{uD?vR6vu_qRHpn zCGL19n}b*(6k>#z*9Aq4wv3U(@~eqyr6486T17d-g!UhEPa(s zYCD;a(GB_WIqDY0SYEoiq|n}-eY~fU4iHX23cp!7XG7|8q{tr$vGHnvY;Jx3pbUY?OoY)^3}4!ulr&qguBWw z_pWXF#$j3_sAv*HbX=-07s#+N_6H#cteGX5D~F+kvKgL0uf7TDz~F@Om?SjTb^~_J zfozbN!rxi59f|xv56-BWvXLI#FEFR2%tC=^rV4S zhWh}1NG%BXM6J~{(Znbzt7(kvfhwn*3xl{-JRUNt6u z3y;nTDfT;|bF5t1o6vMNb!Fhm6U$c4`KElhH@WG2ss+;6vD-pf+ib zgO5RKU69h9P#ad3J(7h;B(Zc|UO#8Be4=-U)puvsjGx-Oylc*H<*$NR_(3Gvz9Yef zy;Dn=k$uC<2xF(PaM}=hT0YgA*>vUA+QM)8mQT$2yZl4%{-*C=0o+Uigf4jtMTEol_Ao>~v1Gzv@&y!~GWWZ4J> zQF$>HOTrS<5Um?f>kgzRGzY@4ZA9l|CYWiqhvdCTQ%sAcC!ob(+h@s{lkm@xl}tl5 z;v!HWeo4&aowT)|S)p+=zvC&j;$#BkkK_t;zdHvyj6$%#C-wxeuFv5G(E& zTJgeucg3RMf#a|c%j&26rT zzS-7v_f-<*uza3%!9?J&P;LZu76S+-(gCz0s2_;Mr3i2X1ft9Y5XC~`2Pcw<_D&PI zE6zH|ZG*W^9ymlS1VeyCsJ&uE@X678C7a)^Oz;pe)-uxb`a2u(37-3~X#%|(HRtqY zy&wYQs{>|^0TFC4!Oe0fXzigSb^??{APu}McxA12I+X+fKqmgvfOPY_bBtB_b8l2^ z2tKp%{y_3OzK3i`*b$8eyN0zEs}qK%76K(i&hWMY)$<3 zGJvLES7hG2V)e_JZR6j5SVfyhKazd3)9Ue=l*9|3t5<4ip+qFjo&$VQ2fB9)qHXn? zITAK!1C7?bd4*u!c3W|QH#1J^dqwURTeR0BmbY?7LLl?Tj$bWeXHnoWDh}~dfp;0O zS~zd!k%KpXX!`BdcFx6vtApm*94WgA>jB&Lc^APBSW+ zu)@GKB-r)&mkmJu3P^W(YU0JqtJh2CIUcFL*>Cmi%&r}awny!lXRcF}dzhT6n+N>^ zizHT-#$}oWyVAS3_(_C~*xpqmpPBeoEB2wYXoJH>TC}z5aDvZ!)h<H9o#r`vapYwpe4a^&0Kk&Q3T9BBS-WX-F2dyZVa`HK}0f7@L) zS*tVu%Oi~@x}9xB*y9O@r!O75=38`lN=mM;E!SRcZaCj=^@r@T!IzPTGOT>oTF);( zvhIMP@>R+1`Hg(haBO^Co zH2wW*59g}J7e(`bJo4n`tEP9a_7-0C&3SGPHBwko7dectmh*?PVNCiwr%G)@-4)_x zaj~J=P~N+?iDGx&$NJ=p2YQx#S~J`^HTqg**mCu(U+eexj#SPaE!p>j^!nB0FD}jZ z4~nssK4|KGweRAioG*TuKYHYK@cWG)2lns&{`wbB=f64fPw=NvkpFfDu_D%7u6^Fw zDj+e>FU7xy#x~B?{22W2=)XFIA-NZxs0=}5O@iEtVdp&&qmmw?J@N-NHJK_`Q^f7F zkPB|W1Ik$gMkIBFdhfw#}IB{ zMy8U0L{K6Cn?Zk)A({1#%$4|wtSTu5G93XXfK4%gOM!mDL5<_I5RqXeC5cD?$a9!Y z1u;zk0b^(o2k$%~St*)@)TCKV(usgy!D%Oe-Orhza9kQGo!2GtBIiou5EhO|c!|$N zW0O8L1-v5lQ2-egb!;aNMRlrWx)uY_X^8eymTs3}zHk4a1z*xrJRJ>s&;}@W&1~T@KNt2&R0VpoZNMzsj}i z^jwhv;}#P3=~=6H_)-VnYPJ%o*x+iDCk5eFBTm(15@cmW{|> z(Ro%fAlkN#L9h@e0MCe;ga=8HuV|ZLZ8fIH$iXO?udQ7t;7SrU&<78F+ohFB?hX@$}i;7R@ulZ)hlf9{4#g98fbvsUQ7 zF67+!590+(IlafR5(g1hso7_%;15o3geN@Zf3dd`OoS)AH!$WS1eq=vEJ?xR0hfr= zB}IWZPOLA|G_Iro>`Xa~D4)jONfAAStvm|Qafh?b22l>(ntn56dtxalx2h_Mdw zRNA*LV?L!R1y!qhBv%g@DChh=n9b|9+m-NK83?ZxIO`Gt5ij(1nuuz zVl9YD9wvcD)1e=#kqq36fWjt^*#|R8VA7cv1D^wb?c&5>R^|42E6iWZ3cEw%wuDuG6jl09!|Rk;U)2bK_{D*;OTdf!0ledQL%8Ixj}NE7fL%*CA@PKvmy`E_c1FA5l(B(2K)$d{RY_q_UtE&I!m8T7u&2zy z(sw;4hO-=Cq!;W1)SAT5sx5$bh$AeKKpr6S!dYc%eOO4JSgNp1D=WNixv|0_w5mBI zI$k&kiX#JsKt?pC5B7;VswoJT7q#_`c$t!>1S`eYfRo95nYZM+26S%}R~DG)A@!kb zZl|!r;)mYkjh7t0sA}(vRoJIh1m1Ll!Y0^oK$A_c{AZU;n>d4;l3MLNkrY(r19}{> zQUTsX;my8{6EH&)R-W2L2~(wBIm1s|0S91u%T*iya@be(eF%nYk|r`W0r*jDsP8Zk z2Es*eXRfAGzVbRGa;&uL^X<}fEUdZ_vf=51CxPEl+?R5J>IXdzA` zF%cODjLD@{pcQd=OakQgf1%|52o~w^`Y*r#DG&nINDfk* z0{8zDWe}S|KK@e?xtbUe9}gZHg4LvM8~`V^L51OV(g4uI)Pt}H$JbSy{=J~tfifR1 zO~=6}ZD+m(B^ggJaX5s~{1zXyps7l#1w8;zBvrx1D(QR{7ct02)xk*%Hj_cGK!YJk z@y>(Q8~{6rMRO|kLtq!>(+@&}1RTpIpITkUwdN_sy8_lH-OfzVT;N!2A_RISY8 z0`s800WFpo!Pd*Q#Pk4Kg5$SU3q!WXFLZ=3g|e}f3(Lgel>x6y`)|1jI>`b65TD9@ z(hyg%a4`E_Kb1uT$QaN{AUUjnEvQKcFq4+V$SHwT1zSiBT7eZHVHmAU%@*wB8F*#P z+V%DSJvBvv4(IT*2iH{v|3Eak7G>P2ouJ-{3CG;W*0cp%t3JRw+W8ErOZ0i04mX^sE{AwO`QHs6*2AYr%jlG36QC5wIAZxg} z5_ZBBeyT|TfH&=E&#mN577JQ2z{KI0+*Af{MJ)iokE>Ao|7HPZ?xAUkpsq`U@APlU8|ibq3=b7*w5L?ou=lix`S}b7UQuzZWp~1 z2Ik~$`oVFu>UBtF{G!2Qt=BJa(po@Kynwt2kc3B(T&1(7?a^nG`v?pnJRLdx#@9DJ zbu@*gO-DKc$UXp$0!b0Zmwjm_oNMJ1T2e@${kz?)cSjQplHw8K9RcjXIDR>>`zfS)t z)Eyuyg2_x!Tv&f^Ut6U_BVPd@#05T3n1QuK7!H^e$|C`&2+felSNOcH>&eSWFamuv zqyMvd0nkXSlnx*RLW6XVs^^fo31Lol)n=~KN`R6FO2}c$LG-}!<3SaNfNi2=zCQ8J z&~xW`LZ;J_YAKv95+;$R zz%_Z(o&igWSfy2*0gc2Wr&-fyfUd#>AT70E|AvTHBoydnNP-SJ1y);yB5R$&#@z$C z8@%)LE2)Y+MnsAvH zRV({XS}*VTI&o+!X}@!4^|H_eMP!-?1Bq}&UDfORrKhb|beu@M=efBabXHRTIqOv& zZTIh`Zw^yEs!j=A?3JqmB>+Q?;MUtiFFsvedTPZ_XE#4`ep$Uc^vct8FHC>$V#Xk9@~*Vby@35{PJDG3=Dg1(fs63`>)f z-CbtY$ojh#acO_SUbE-hTZ&bK z9q;Zlw&c4ktRLWkp%qt1`-tJyN( zQd}L>|3I)rn~=%BK7rIPQOX=yoH;Ybp;HlS-RFd_1)QtgeRyys3vJ(`CvAow}LtcwlK7^tLE4Km)5&GE+;4QQZw2ARlG|D(0ElH%x24Ad*WSwvX(0cUW7(~_MsF#&sDvad5dn7 z?bz9>TAkwHYFw*zi)EAR*k$*)HYL(^PObi}m^*p8*Qy>5rEGO|s}1VcYCfRbS~Zl+ z)^PE!$?LyT6Z5*Qb;v2n!nv->ufI(ZqgyR)9r}>M1f>Ex6BRgK-#z4;ROAY|R|3IF z1(R#Ay~H)RR%(4q*QUtvM(eMux1Vucp>`showerkbCs!q(?OgCEpTJ}*S*`jTsPD@ z+%mK|)bT^&Zm!z2b>es+n7HZD5$yvy#%D z`%lu537i3C$c$&x%S9cpHZ1IxjZK+juia>EYNXrOwaaeJv8m_)B}+|6rLrRSc!f0T z=Ecz`sXN`S)P4~r+61G|-JT}1+qto7u6fm2n>))VS4#B6Tn*SnNXG~;{Hc9fwcG95 zgj-I{)oCynJUQ)>TQhbf4>(QD3kBLO=mKLk=Txqzmk$Yklu|1W^>J{-AnBxF@@a0` z4^Syd3v=IebPxt?Ur&1~b(^+cAX~RDK6{e(m)pl$X&Amq9;I{}vrIqle6o6Z=!{Ku zgUa1w5G{b;0OuOjJKkv>Tb=IUZhW*g^pv9E^&Lp*fP!G7odgpH#oul~r2DyB9W4!m z;lhIhyI~@5y!#(CAA(7OD>R9eF!I~&=+Ut7XVPZfA;Ss&j>GPONB#OEn_FKG6;6cg zC~}QC`gPc{XA!!s_b1YKTy$%WMT&n&LCAX zmGa=ZuiskVeERip;q#E4LXRUy`)|X4JRiuE8+od)zV=?iC=dOB>!J`wmcG!H^@i1}dMA9XXQds$>r{AR+i8Z@T zYcbW)mtnh~T`qmJ;?J|Y9(lYx`Yvpr4P9b{4n*oa*UCqiL6Jp9wO@pBeC{Zq_G6gz z+4s6CLzr{tj`CsG!08eo(WGUDzNh9fR(S5FuBgWsC*!0Ui_yXAn9#=f$PO3+w>QJv zbM~VsIs_0schFYUKPdd@kfA3kyChVE~l144uh!w=c)lKj^5 z@_9z4=aOTB+p^~FG?=SE%>p+<%PH5WJF0c}kmc?Q&(LEw;peP-9Y=c}S#I%O5OZvf zG`wQd&B4)kuaZH!J|C}K-KU1H%XZ)LOg!csUh}M9_gU3zrzCxs9mlTpAGNvN@ofC{ zhuvn*S@7}er*V#Bc2l0MG0uBxuJ+g2-06TRO`e%+oo#9YZZ|dqr(Dlea;E#DdLghl2;QGd zTONL56AUG~_~uFG&P7*_eG%TiX;_yd_{%rx@S>h$8^b%E-Pir2>MtiS*AJ_cZl7zu z{XZ{s`jybnjy}r2()U~i3dQZ=7oUxkzF6@$<&~QNlgjPyY#urOIeu?w&kKMa>o1c_22}J0GEVesd9&W3Exh;k7`u0w^Iv=kI2fIkTzW;7&@BYPJ$LqrH zJR2*WlCF5~v@eYQ#1tfi9M^rb;%@GG%IAP>!zZHNTznt5@BHF9$4=e;$>#a%)eeu0 z|2*{f4|^*0PUi@gF0&3;Fz5Q>+n@sdNrog_&Lin;V0Yj_LBv^ZFG8|?w-zTJKNtS< zvp;nIuKH&P#@_Ef&Hw=BQ`MB@WOwv)WFSQbxfPg+a9n1Sf^4yR1``PY&OjG~Ln^>B zk6*q0i_N6tTe}Y?`*oIldHjdlzdZvy69GOdg$(Gv{iOL-+Pj_)$@|@x96zqSJ=RPo zz771jY=792*|kHrCv5gay-ECddH?z)9mn;M-t}IFUUv_}UXQ#$)8pwe^_WNgaa0pY z>zim(iaAt}4L`uNrMn0wcpzZ@5dxG z-p|rw{PFCs(tqxMoZ7#CN$2s$;V(BqehIE%+Ctxn($xMyd4gsMy?ggwcCs175r_~R z5HH8+0_G!(j&=|}66uG)PxjL4CAW{q8^b1%U~ee{LIq_^$aF$e&m?95iO)DBz&%J4 zoKDg$;q6xt?&!VaN4u;Ihg)Dk!}HsJHUIM(rk+!OYlLtDW~Wk@f*Ko?W?@(=!sJW< zf-?aPhT;GiLkAT&?d(f|3y~gx>B~9LY$mkT`NUh0Bla~gXUSRxrce0sNHfxJNx z9ZX~xSn~Vvzi$6y^U3kwaZsJpGbq8JB7FL=P;;59f3*2G?Tg`m zr=*{jU~+9Dn|i}Z*k2j^|2+g{I;otAfEk1$T;O67q^$zW#dF!Kbq~lgQ42~(L1->v zglo&$O2!yC=u}zvbJPl9hJY@BkX8opCMKbQAcU1@$uS&SL5VzOSGspG$rG54AxkwL zt-*KXvGFTsTv%XZsn*X*qc!5#CA5)nk>aLuZ819m`1gaD(C5ZTg0*G9+W|sHj;WxN zx*>Zr$>75)e)a+&F^V(g)6apB5`!u@4!CEz&KO&c4bX&G5GE2}DVlO(89rA&Q>>A| zjHX}0Mq$4`t2j_Cl$%I}HvtHcy!wa-7r;^&2f3bv1Df+VO&(B*k!&TcE@u$aMOOIS zb~sw6FjKMi7-V&gXnI+P@j$tilJa%oL8&tLf0rhwrRTqoloWq@UZ^wz65~$bMnjf|&`4(n(NAVQz_-a=l_o7(QJw@ov$MUf$=53v*czVIn1Cv`(y~v!N!e>=G&H>v2(8|hCl}Yek0^e74|5H4o-pB@A94ENTn%XyPCBHG>{pZ$^+6L1V@vS zPJ{sAkAuf0p%##CtM)T7(&;P*RnbnD9^_Vn$z3#NR;K-c^(N<&7gm=g_8QX$)CH>r z5QMidKJgdsRu@0HvK~20rFV<@6t9RKnk)34S@)kfQYB@G zwJ^Y2LQc&}7NF#YuqUvEWvhBUZg-YE4>+HJOoR{S_Dc_|ADr=ky(4$Aw|QN$a%R0{ zy6^bms@zELIdv7vU|XP1ZsR=6T@0eFmW2=!Ad>S(?to}f-Ek!(eyIPDf(UP)I>=>_ zAYk}(4f%6QNgry+h&sG{mNT)7bSI4ngKld=>mc`6&I&bs+;heiv6M9lA+jq3$+qeI zAmB`{_71OWQAW22sq+X}S3s{aAm^x0noQa%nFeS-lINrmB7wS!M>18|PBc!qlfp8+ z2izTbSH0KOoffYcv!9yY7s{wXA`AyDiQq`_8K5Sprz9af51_?rwP3qw(hlT7riw6E zwgG1ViwBkLMH#;Yc&~2C6~c80{gvwH@*a6_ue&H-L#bdwGXQoG^f$4_cK+F!6Y3xH zXg)c0UCMPWupZQwt3W;wqJv$~LWggHW-vhv!W}fNy_h9N&mlX?N9ANAu@8@uiflq= zrJx~Nl9xr6!AcG1d^4Zox*qYyF^4ikO2<&n^0e9@F%jr1>X0A=9-7>6LSr9<#PF0^ ziKMgS6mLc>x}g7q?xBJ|>AJrj!aFWBADr1spFuOtejv}9)X2;C^J%IZ6elGB)oP}u zCJ1I579b_;;RZA%EC~e3ns?MMdLJkLz=?#}XHAQM(R!V?f@WN;c{hKn&&9fjVqg~K zn*@OvyMlg#6eOrlIAI_K7(yz>%}#g7R^ik`1IZ_mGIk)s#9hnkK!s0#-7|6emK9S!8bF~-T~DT`{@)UA|Ycy8R1iyRGt&yg;95w z9k}H)UiU`nngFFb9!Nwqy+jJ;4yIC(Nc>PFJV8IKGjL4v+U)h_GLLQ~LYdILwr6Y+ ze^xbcR=)6gSNBmYZJ9RVRI#5+gDf;c5~wClViNkNI&_CXGP>Dct@LG;_aJO8DM7-g;_@u_?HIK zK*<0j#!^7&lj&V(5pju7BNXe(WOFXFS87JEBEc>CJ!NLMj&cbKH+A9`%x|34bSbN% z(aWG-GvdIQ4<9HQ%L~GM?dn$`E@?;{PzA}X;&i2pS+7t-S2~RbZ9fc4ramjI;H0-x z*DvidF>+!IV=SVmW$Bbf5zs0o`7W$CxpTP1e`+>Y2V@Uk!U?pXp#V+7R#L4?K#)n& zy*9}frwD9mMl?U#>@1PMQV2|dCBDJ+)^|#6gPg1=GZF_v2MdGKr4myDWOzCWON{&6 zhKx32l9ypLkF}Iz#LmU7F6nG6Jny@vettw{LP)gr#I*l2omeK|EGqv~H#8y}2dN`q z40{5-4+;tlQkyiFoAQ1H*b)5zs(RhFoQyxmUM=c0n^>N!beiy?e%UE zN5{gbZ6jvb(lY87MI0Xs=i3_b^@_BX7K0qKa7>OUbn_5wIWS+~bi{rJccY><_$f#} zs67E#1qXNn4df0_lGH-qtEGT;#v~j7g#;25=`TH0?;in-Y0-9<_#2B{ptiyz*g&T) z2%OZhO>{L6(d8DN@b1Z0yxRBH^fDt^UBUX$d7S(Mw-{DeZPhVMJE(h87{-?s4i${O zPSSR;`Q|oDl^`aRx+aY3`mj6Aw$V;Pq25y3e;Iv(LaV}&qRPtC3Pd6d(mRx6fx%gW z)dKH`2kJ#S0^1N10sLb8In{c1i?%MkSidF$EGG%;K^=1_pdt83z{km=&rTeqr&JNt z%2R+JHSA`mA%V$Va2*DHnc5c-?Fq5b_U`&tUsf#buitbB${C0f{LO=A&wxvJSC*L{WvTABBcjgYbF@T?8aY<0AleQG%lF|`C zIwFatB82NpN9(CLjS22F6cawcgA_4TS*c!VL88Q^Z|SH*dIU3g&CopIwu@i>y7YB@ zX2ihSjWgJ%XO4dP*V2#m(g-p^5-oB!kXjwo_ftcfKvqD{SWutWeW5VPd^ z)HtL3JJ)Q1H>b^D%|Qo0@5(xO_`O9#fmFYz<-_S>2g9a=%lzgx9Es>lh>v!> zWJs+5Wv7W{+nMke=qbX=o2ighmTRs(XU~LbX z6~N+yglrjd$po&Br+zyczPsZ}>D$l22MECDYk{}Oe+wm#jai!!1#43i(Vu8dg4xKy zwd*`nEXUZ0mI<`d9&p5rNaH^az4wzgkatuqDe103Ce+db?1n%%k_)6VMhhkYrxx1n ziBXlQAi02Z&@6?yJnt8;@y>I=x&kCekFXmNzm09@yH%US9G>T2MZFVZfM9-JHaJiI zUS8Bw+D;on8Z4fd0D$BqT~1d3LEBEGi(4suL^_QaANwxHku;Qe3zEeq28?QH!>v2d zY}1{9sNv}0NdK>=FAbMf!bTvF063lCNOA;Vtr$oHz-9~_K8p1VSbabXQK^xKYa_q` zxB~tsi7_iLk=QZiUS!&TILZIphLJljT6R%-jS9D@i2A>Xfbt@!poh|2QcM7M_?(f0 z&m_Fl+r!!Z>f0Yjyd29o3yLj;?FwQsU2cR+%t&DQ^4c-mtPI>!5XsZA`l`aezv0jD z?~hJz6LlhB<~n8F!SYdFJr6#Al?@^w7f`}g>wl+VJmSq*W*JZ*T%nHuogGaBbb|*8 zT|jSvMj0Ac5V$vZjmUpkyK#m@{W;wN)4~r-7C;*zFHX-%Z}9q*`S@f|!3x}>2-1L)5p6fF^LVMsCS|Tf zOUQOaoK9&Yp~Rz=bqU6-)qmevdU)2Mob;WKwMW##)`ihOBOaclp0X}vE6H^jSMC0xPE17~ybQ!4?@LD5#ntEEn~~hHn{&BILUfM+F*|0`WK#I|v;zAcZLcr75P( z00qC=%jiy;q4{3jt)6Ri{`^Y&hj|@&2BG6(lSb`Gb|Q>qaW`+0Een|2NL84bst6KQ zGAq@r8Pwrp2+Z3(!juQ;%B=W|6F3dhG9?8x>o0h9zL;P0c=#yiSG%4F3;MHgz z32ez_zAG)9i;u0*;DvEd6%eDoMHZpOZ2`+0?FaN*znoesL@m-TO-$0bAkuIgtT}== zjss_h3eLP#AU-&aikhK1i-Qr70jy1i^-;@%FoJUI!EJ@oF7b+R69CYLIxr>3G16!} zwb73YLeB?87=`}uRsFWkGevtiU|XZ>fJy7&bpPJje-ytDm<5-Dp`>&YbhrR2MEY>! z*zB(@`BtYBoDHl7SiwZEZ?Vds3$3o)zypoG0~W2tQvpKo_EyuMgX8Frl|U$Kc{h9U zv^xXl2#16F*$hx_13VBV^Pr6o1Hs)u#x*JZn#mpp1LGnKsJby^uS)r zEhX-O#~Z~1wykADm{JReqpATg{B51i1TYN+K#7@#q9R#@8xiy#E^QA%vOdw`bG=K5 zIl9g;5PVv@qIh}XESglN)>5)E@SDci0sGd9^x*dfsnco?Y$&`iNU;Ge4kT~2bYNcV zk*Q#=^`RUl+6z571P7$gBgLj0GcmfwzI9;IXSM~uE~dSHBq~UorQP3I+D2=5ZZJdj z{BqDg*F@u4ks4iM{vA(J@ewKA;XHiC#DVj(3osd@M2u9N**!Oof8JujOq$mE!(kI);@8{15hw15^cX+N4{uxDQ#znI z)hPaIk=^mL&~5gylomv9${z5d&Y}w9c3zNrlM0lMy8!m^bJ=_s0ym!@G4XA1nJ{Q( z6NF1}oM>X+TkJ9@(XXM5w7PKRwc{Hg#1 zfcj=rup9{M0cBwT>xko3!5g0* zR!;nSG5KMV=UeQjPM@xKI=hCW%Ys6inj@nV+oEGG2{)FX55nNa+0X!hCSjDt7)oag zu@UdLb&utNX$xM9Mdl6 zsC%z5_mgRI5p;byYM*eouJnA@$n}Y*hhj7BmsVH@mp9#vj86mz{(Jkp3cui{ zroqUhM1A?nq`6lr^cie4JdoUq`M?LynfFO;ob zInNpRU+*-HNA4KERJP{9yep7q+YhIF7V+Jb_T;?0BR@!kN1I+pW+npuICK7uBTs`* zH{Fj!_zQ`-ghfrinQBra_St=Z)*A<9G!^`@>EB2q5#SXnA-9qn!cs5>nciz~Ge{j* z8ihy!$cV^J{<>;WOy#@~LxpA(AVkxR1)wqTkl6~I!9u$mXV)h!xKg=3#8J^eTSrJ? zPL+JY!^+eU4~5y_S9aY_aY6?xpioOf!$8i_T^6^}!MW;KNQA;Jica+M(^cUDXO(^? zniEx#$Rv=`VMo=~5L1Oz6lH|m2_v4DN*AIyC`A}_&g^u`8n@LRL2Eg`7B2DaE1PNI zc(iIDWV6C$u*S|4F#KATQp7gahuO7e-hG7PYK<6AA#(QI41R#&0T%wiGB^n?jO%ejXX zDwYoVV`GSw;+LT9%Qc}5fonu3m=dQZaJkMP%|WR|d551EWXDF9q2-F;C`BuDJK`u7 zcr+L&G^%<0>Qo}vSq~B&FHl4jAV10g>T#}mZRlymil~$0_sTXuaDG$0KU5b1UmV$h zl8s#SY7RrIohEUn_5M_HkxOVzTWAL;(R}hj`YzICOU)%1dY>|Qp>-sEYtTaJTu{*_ zXh+m{;}7}Usu$j^c@e6H_6}Zc{bgz!*HyE2D}4a=VkrvEQq(Q3Ol~**0CTkFcK3Ow z6vY_S>V&B`=MP@9`_*ZCo9midhcM&j!-GHCL5W=GwiJ}L11gQ`O&lFc&2+m_8z1J} z3@soyq=nku^pMG;>kYNi!CS4*_@EznpfaY@*f==LRDzfXo&dCk5p)8Rz=%gNx0m)H zOGH3(9Zy@%M|8&G9wC|&KP*gJn2r!FTX@8wiR5mZx! z;YXVL2A{URp4vTuh+}@?P0c45;K2$a#n4S|phpdz0r!Pk%MAEdG!G3PP%u0xlIo&-JR)037LdY5OvEbAuF0m8=9Bw|nN*9F zWtkB&c#I+E3JQ2}P*bzB}GNUr4b1h<;U2B%uzr|;`syyf_%@L!rI2Pq&QmD^&; zFfK&3Q0c-UD63>naT3&D4*p*LVJLd%t_MX1Mpv2rO)q_eq&VH$X zeI7n{*f4-s>6*%@$x6=hEY_&h{1v>EHu3Bl6wyTBBg!G8 zpqAzDwL;=8W(^BPXe$av>#{d{9iZ)LH;m;?GR&}Lo!Syp9Y0g<~_!>DAHWDxhlm(uI zSVjbgCWA;Kd<1azyOEe{i!`xXZ~x9fUf0{&Ta0Xf`-SU!)eo$A?6Q5CiN_^wZeit( zKW1-P5Td&0IVXhoJj;zK?Xzfh+#jGbqHl(23^Cj2Z?d>vhk#MvriDMmO>%6|ewmty zOc+#K5V&j*kFx{-n-60JqbXzrmT|RsR)NP#&5_*uIcn#MpLVuK+3x;}hM#;?uBPyG z_(HUT7oa7)#L@S?BTfO>$Qooz`-aD_3!gEuVZh*<+z_|!r97uyml9F(@IzMWX+fG&^Jqh{C zjg(s5FzOCL;|lnhb@p&>kuUEaMy>o*r$D^6olXVco`gZ0#*X|TpObYD#M@e2hfLbE zcGSpCGv+FF{Ioyi-}GV%I1+3(A9fMka2NqVm{VBRgFq*6N8JN0`}KNPT7=Z2@e3mF zRn8oSr`@`enlVEYMm&RLoFv=@#gp*c6e0CJ;8$B2AZdo+sK^UsEWtx)A zf}{lP#Y3}%Jm&(TuW7wb#Fs68(Kc#l9vi3nZk$@cakcf%InB~J_i(A5&+(A9M+@9e z6bAf$Jxyg3P%n&dRs=^&t&?=`7QXk*tM`le3}KmJQJkNrrb1X8J8{P()ZU9?_C3dSKnTk2P^=UODnZ3Xil0lJBx{QQBq1n>UDkkYvLcgg*l(* zoY4@p=aU~x&ov1WB<}uA4fi7cXxSC*37`-#Z5ezC_#+rXI3!%CfQZisGYi%Y>>QLV zmdZ5cf2x-17~Vr^h=+gmKD^ufdBiBUlc@31ks#Uf2RUNy+m?MpuqC91M1Qj3Qv}wU z6%BlF<+7Cl&W&b~hBOKz___`gAQ9Xx38|rE(phDa!gFOK>>wkO^~P&9oTB1^kFM>A zJ67_ez~XM&&`_(lhEax;ZJGt_=bct^8<~KtQ(#|We&luL71>}G@mwQ?TS@q~S?nn8 z4cOA?9yzO3HWbii>8vgiUI1N0(NzGY5edpjj^U8&113OpTrLm=HZ?AbECt2C88^Vq zl)TFMwObQ7nx}YOO?hT?e=)~|lgTcnnRPjlQcMQ5P6ircE=KF<=iub(RBFG~;sTru zsJal61YT)eAL-ayJrpXmIafLn__2}u`5+S@sMM*avIc4x2GWx%(G($xgA#M5Y4vV+ zqLgGO{MyY|i8)9@xT`QpS;maL&>9J=g(DSg2UVqz8c_|v$krJ`CDW#o$lzARP?S*U zTs{F8{;$YGLMB-S_%Udgz-YuQoNAs0th@kYpd*K?drk3jQ4$&S++0hOTbQ1e->_6} zV4K*@|CI$z!JZkm(= z@k46{nuJ4cAuzMo&utx@v8Jf|1dYCAY~hebi`rnJBdJ9)Woj4Hb1^tIw4bsM5DHaz zil7z~pli|K&)==g3|XqMjw)}x867_XBeZc?TpoBJc^XDwG?*goO4eCc3hHNhdVN5D zWUG<7I5&*7fKHR(ftUemQOmvFmx z7id98FmdqU-_3PDVz`-Q-)l&j1Bmvr?0fD9`DYG%+q){FI*zd{>Q9rl77}_QDbUv0@d3xPaA6jHq!`r^flOcle zxp5*+!2APMm1@N#O{R}?BwEkWXs&OUXZf*};pdtkMZIi&7rk#{artqsxx~sItyT|Z zhhNi67?Skbt{`Y*w9B%mKK%kc-4Lm)z0u8=`!U+PX~~=8T(M>gH=5PPJv}#fVV=B5 zS8jay#1n@m&Y%7+ZE|6|sKqRLMjIz4udPZ_m()y4CD#M$gjog&0%X!h^EEy~2I@6cN5-_C0$z@}F-InX^%Pt* zhEeC~1>HGYw;m%hKl}e*0nFNkM51I|y#-swDb-xcjxeuD-F(Mor#RaNWhWe6L4?aw zja{OFVM1D_mqF0w@ah6|J$f?=0%R~#0P{a(t+yb>;T!{Er`KE^b+`3Jv?&F`0AC+1 zZV-2>$MM9pbhV=x+sC_I^8)=K7hz5?GmY{M-BRFc2`B-`3ZR5KiBzqBMel1{5+hF% z$F#UdTea!OsKai6AC60r#7%6;o_mV>MQ%@lS^W+jXVpi&WkAHA%%H&m;i=Q~}Qk zQv)qalRzg1kIA$0)imh2aqT8&aDby~WQ2d>UF0~@tbJxk+z9snW9qHLqUye|;eDou z7>1N~2o)t&1O(IpL6J~I>2NTS5|I+YIYS6yVSw0!NtcwA1BxP|B2rS0SV)P19q$^R z-}k*Qe|TM7GO_pBd&Rx(b+7ZG9`y873}QU4aFw&PK>ao2XzIr#Mq^&AYjfUq*NQxE z*P=l8uKb^_`s|qs2y(eYwzmv8Z-j=fBbAfPyw&gG;%`7Bnq32d^`uS&F zpX3E}mFIay7Ph*D)xx| zCzcmK|}NfzT&> zuYja6hgrH1Nyy0%98hJVwSd)5vLhrxMLD*se!-@S;!*cM`2;s&enMAcprl}>5ET#>h8Va|l~u9m#5k!ALtg#})2hWS}tZKBko9b!^T zK-NJO0Y@x)IxKMjAdxk2f6N7HLZT7Xnc0LQ@v~U6P(mb$+eRz_)vqUwNkWVRkx>?- z65}4ibuVp?yxHnGQPAO%q&>>BaG_b99`@w^DM)ZznSZ(K>4KdV<$+$y3PmRbP6S(4 zAieNVPPn$^a_JmbN3*wBmbTteG+FVD)3(YVSy$4v~&I6-*Z=@n^Z zwpg3?nq<;+36E~iTktJMLTth3tVnAH&oJHF&Ri(vlV9xG8yM_bY3_Zkup7>DRTs#Q z;VvRX8@glFDQLs0NmewX@gd%wg6ga%VT8X-u-wdv(-f9}%XM%xR6ej`oF!d-(Ox%S zajQdllN!cd-y-!I0J?cRy5I&jaNIb+N+*1Ta);==QY@*e&wIM?uNyDF(e>qMSVpy% zPb4zNaL7&eAd0w@NDXF6f`+KP_cjQ(!%0Rmbu@MI!elpsJt)1oXCXOyIQ3rFs|Ddp zZsqy-7A-};ZZ;qlN9T} zZVCo138V~I>PUKJ8#$1(ed*~ivsKiXGzDH1cZsjj&9K#3bMH!Bp+q*y?X2~Bvn4Cc zJ%5gA!L0P!>$Ri4e~J>^@8l16eO$1&qAt+yzsfj3?V@kVf&oXy;OveO7O^R!@6n=m zSS${#wWl>jDE$#k*+$yq{5MInaT!#9*3Y%L$o+Z#gzLA_eew;hi(BS?;Yx&ynI!G$C2CVQ^rn8_t+SW5Dpf!iLxpfnV5Y>VS{k zJI>DFPz5?kayqn0{Ci$pWP|;t!s0&n5BcA_e&_9XMd@Ds#h=`N<^OdR6MbnRs=lG& z`Q<1kg-&w?M3@sz{*G-0%y&DkhKPJ1{>3N_EI&ospZbQdo_EH|TLAT41Y{B_QsTpu z81@nyEoVYQV*ARg{0xC~s+>*m-+Z7G=i`wAdyamIvWIsz)lFo*>3p>?>Ul;cx<$Ow zMB-r1k|Rnagb)QUXG2DSbDX#(3p{2O=qpl!62YJ;*iltU41$EbR->eVh0Jx-%$Pc2 zTx0Swt8Gmy)6dc5HtJ3ipQR`^j=fxU@>5KSwTD(g7nwemwB*vOMb7l^431V#;t9%X zm-I$U#{p-LvDslc-zjCu=UMS1rW-x<3ud{&yl~e$HU4i(qQJg^|HW_zwhL!f77(;> zc#Z^tk|;YhQX7GxYQqN!Hb>Y*+!MDL*9b7HPgG}*uwugIwNv6e(q3bfp0f(~}wjooZpdfmgdK-Z0mD}iCy98y~2v8h0Dm159g z*Lw@ND63R7B$|OBk4JQt%s;)UA$77b{xRVrzS+!8-}R|SP(jA=8xK9Kj)t8Lq;a53 z3JE4#64BZh$HOPX5a2RF zo{0t4-5R>bD_R1#E-TaYJXyd%Fc6JR6?yD0$bjl3x)TstTI7K}8pg;x0+`VUeJ8xj z7I~g4Slc~M_tcWs1>4BTDthVx11_?RU>%4s=q&i{o0Q8q-_~8St<`>8VVRd_ae+s- zUVf(QmRlhB73Eo9ph3AaJoxrut62KsJO{H7VZ#;nlDwTaW%ufM&JUZ<={CyGifpsr zu7C5a=aYhfZsQ;df+D=AH#-kTSzNJMd?lKgXp~c6s-QE$IAQDPAKh-xraBT2b4fhH zLkzRNJ{32mR7Yb--l5!JQ?D%YKQ*$B1M3RxUZQ)h;?d~#_?u0huL{Dum+FE`0f2L+ z%q{_L2cA6Rw7xTl1YC&dHqXB>{WxvMqno3iqDaW<@024300ek9Wi)(Hi7u9qfoL?! zRq|YNQ8EDHd@dFS(IQPn6|KNk5t*fto|_~71+@`wB`(vwRPkhV$Df-7FJfUrx0P-- z1Zm2-TB$&efqmW`22H#=fQ=O;Hw$2hdI>RrmIEJiB|!o%E8)v>sBo~bnUEee=d=d~ zEGyUak}XW@w$;5-@zfk+$%K)hzrq8a(R%?f=7H4>heQf#@t`0rWSXHEaaB-xrQ$L; zCJcx#xAxL1Jkh;I_gY0q;LiGTQAru3V+1puf&uVLI;;RdQT%Wi(}TqEx?s<3Jok=w zX7wKDxxyX4CCtT+A&rBa1UgG1jI~uZ7Re=vS^Z*hnMQc3VLMrZ(1<_9+%%u%?HmN* zHH*TF-RpF7mUIGWr7n;vVgxYHTSE=r86pKmc?CivDikcmK}R8g#=(NYA!%BD8O{N^ z;-0XR9mMOzyp@k%g@-M*BZ%l_b~v5Dv65s{MzF&m>Gn41Y147Mj)~b3>WEx1bj@wU zSgw56*+AEdA}`OvLO1vP86ye)haq7!_=|cGyMwRkR`2cP$X;qh*FM>D)15EF1vP{ z2VJY^_6jMia`Oq|7KtM72ZJRdN{<4IE+AGX8e#U-6A2bJ{yei3_hK@XdN5-#|+tWV3M6l&Mf+l_X#H zev9IF?LhFPdOx`a;qv=pYWcBBe~#}piL&?zWMnMs#V9pZzX%BgJVEhy}93l6Gu?XL-WQz-_o6H$Z^ z8{Uove7pi|J1+#SWUB~>X2f>6t>R~nqQ>v!9=T)lGa|j~3tbbaN!C;SVqATmHIh=L z6_Bj&ObVo)GN%ib(4tFs_LzClCS9hP4mIba{EUv<{|N#RI$1Z*kB zMqx6SXkUymkyH=Ba3XzYxOs?-lh8Ge`Fcr+LV!eCpcpxJ)qk)xbV4)0%7?l?;V)n= z0BQEB2{CgnK@6LV9$W?$)G3>+xt|C{C!+Ferw7G$9jR*depmRVJ2t<*3jzyK3-Jk* zmt+AnTq=iBT{Z0ex$tLqyzcD`3Fnz8WEDA(_@Z${gB?chpcq3IZk((nfaHx&;>+n# zeir`i=IR12xgbofTE<7bh~h5Fg1G;SozxLmR2V`6P-@A6M0OG(92Ua@y%0N8Kn$lg zQP_BtP?*LLp?3ShwgDFs!O@{X;3XqMummRTN4yqpI!n~l;5)2MY8T`LCsymvAdhAxBDz9Qt6qA%BGON z2My2*E5_6`3$frDiRyv`xI-fD8WBz`z>pX$xAP^~U+M^78&N8I@#tDvgs;rM_bK4 z?N&SK7iWfc=l*hDOuDPPa6{K-(dLAP0A0IvBww0RAbB z)X|>C>GY5D&2oK?tkZRu?l^t$jdE0PYMirIk=CIzr^k6?%);*n>J$RR`C7|(rrE|_ zdY%gkXh{l<^2?GQPQMY`bL3X5&yFJFp0oLnrr)NKV$l1odKAG@A%-&qARVCQKMBda z5Uw0g1xQ|$#_TC?A-J&^uH2X0i}YTc#6C0Ui_m0EZMt+s(d?@ig1iKC1jRZ9mS{Vv z3m?m9oj-+1#7Iy193f34i@2aFMjAR}Uwq<=R=D$n+FeJ?Bj(g7Ku`~M42Qez-_0@> zv8f>Yk?}wEC6plQ-YSFmN>w&*)gl)&Yb%@C1#`D$a(`pxn$ZGcn6!=ITpF2IV3W(E z08U5H0YT-Pq})Uz?>wIfWFX652nEPHTa&|xU;GFL9m#HlkLQA)K z&nP3-ozry~(<&y3PEx8&jXsrrC|x`9nx*6X8$}y?^76Z;NAoJ1YPLh}P?EjhdW>}Z z_%&|8oM7J&>1DHCKCpYq-;6a9FRR;Z&*?h0TE)s%5IIp3>wCM1(^Hb)8#!(trC&Q2 zis2^6DdqX}cv_TGZJuvWQE*RXe*g4@7k~$ySOAj6&4HX6V}$G^%%G!zfzz8TVB?7* zDP9pL=OM;q=?jTW09%AbySeVS#s)Gby`n{F#R-R~o?6|ZX|Q`b(8k+FAfj{BWPV~P zfW(eS0?8%?;T9Yf4mjs(q5_rsF=0P(B}bVlEr29s6bKu$*+Z@$YNFrNeub=s3zq@f zBM{s=fVU9|2u~OU3doMyxk6MrU;ry=iu)6y6EhShPT?i6LAeWgD9TqWoPf)s%~rr& zfTtzj2`?tY-GPfV700^G5gW!*vBd&&jqXq~i(GY$zBWQTWrw zTQ&~N82LJeAH6u){m$4+`HyE~T4JrJB;6kAQmnu>!FGO)orkQnLbL-xTx>&!(sB5P=6S62GVz`Ja zd>2avBn}0T!zs}Tl!W)J%5>)+3p(YHcpu`l#Q3Y=WJI97Oqg=TcOrGZUOF*=CB%|2 z8A7{NGFQlg!%vIzvntMZe>ygj@x?24N&Q8?^~F-ip7+0l^BYWGHx8;VKthaltuOLZ z(Jbic&L5iw;|=x~OZl=G8pRRh4^y$p_4oX?72kC4%U^u?Yv8^}_=CeF1`32QE`yDQ zfgh2hOX2;xlS{tk?HjD;e)8K_+|ctvcS=+#qcwJuZ z;38#29oSaDa7tbO;@%w%Bg|Q)O+JTFtTCsh{>n}AN8JYHO(`n(-CqZNnwD$-uyd)C zX_)%Wl#aCAw|UbwO&;{tQ^gN^7>U<6S1%H4v46d*+r6#lEjR!3^bfK4BapJ*DDLbT z9Ru5uo*-;KEao-u6Gp&g;7}5?U~{!e%Sg+3&G(N*y}a4b@Sv!;w`Y9J+~wC<%l?M& zP0_T+r$5|@T$$eYCV~5edaSBr;RnjBj4XjZXzJF;%oaAG$yA<}HuD`Kd`IwiRRN#U` z$(s+ynFV&g2@P(o^3EvCH$M8um}&51jix2bIXIW%ecgwUJ^2ybqIq!TUv` z*=WU z8QLx!Mo^ISU~~{9L0r3)1gGggSQi=u*~uI#zEe#g!*Qo`nF$?@7f{618k}ZB`$C#T zSFP7;Qq~K0YMrO8lKMoxWL27tg79SmO^$4dST9)*Mv{)fS}ZvlCDI=BaZ)Bh7f!B7 zI13acaZdp>Zz{_F#zqPKBo1!Pk}yKfq$$qDjrS-57M@@KKgJ8&(YC*Nt2qccr)!&#BDwiz*ivB?k%Qbuu}HWr-(6fBryd7gLjs22~Dz^)-)=w5i?uh@$R9R zNjy8YSB>S}K>2_)SR}S&dYHLA!f2s8@Ix(H)+y-a zV%)17OnN=|G>#^RJBOKWpvGH0&`P;xH5IdDW3}d!qpJ4)np|?()-;w-p`G}LE+BZZ z7Pi~l5wjLumm<-O;p%~oR7v9yXLrd`54CYdCbd6ty74au$mR$r;sOb0BGbf1>;%IS zr}H#5GKEg5%N#YziN_K|T2Gh=auD@d&roJqpyz9b>J;%3D-VrvW+u%$X-Sj1Klgaa z8jm^SGMV)Lq{yb_{@Eq#J?4+gWr}$xN6x%hq$I}TK;j2{YB=+vPF75qUvl)|s^^hK z_9It}y1od+Eb>0G;;@!v=F=+!Gwh!TI8Jkb>Ef4hW?LEOnv zb~dLG9p@?2t`Jk%Qe33Y3KjsYtx1x`*CqVstP(61%- z*+bIK3oBB`9m`**Jk_AzS-Z*{<0gowDt@h5cwo*QZl?dEk{uq#!OCuuV>9~&EnXr7 znT-%EIg40M?>G=42;h-5BD1LN3ZZby=~kLnM_&&0VjSpfo#36kr<^I-e<1QsgTH7P zAO<&I+G@i=`qj(AlHI)lC-=Ro7tmT#^%Q!ED`c0Bt7cNIQnm$XTplfn>b2nNshddU zrwoElwi)8rSb4;q8sALefqhk{eelU)gs?I~u-gA(mT z`;+S*Bby|ltI_H2M-+5=E&W!L@;^Tf4trO9a+KU8$CYW;GKnS~JaX6iROsqj@|tn& zOd0Qk6?gqMFDyOd;iOkmvMag!`Ca84v(gJ5>&E9P$f=~sHy_=+ru3S}hVl6d^5@cA zn~OGkmKJ)rkLxNZs2s{@ehft73J>pbeT7-)4s|t8Zr)p3?*Vh;6%@$v;vz&3P7f1qn}`zv^#`K`BGOP9>^wz46y^9i*hWa>WD^E37>)vw z096NcAB?%=L8~V$Yj%q>iBFcp;s{Ds$8n|p!;$xvZ^ala&xO*nb5b1{#&}{f% z6(Pe;97(l`Bl3{c8NT@G&sVS?h1=OxT7d;e?N_=UskrC2rLn*KR4LZ8){^c#tO35g4 zd@DuDS)rYw1AWqYq*Os18whS*=~*K<;g8rvxB1tfUdw+kE8CLjKj9HQZlM5kRx|ED z28H%%4;W~w@CZNl=>F)IZ>8Md9(UHSFwuK|?9ctLXHl6>6JEfMf^nAmEy`P^xMj5G zNd?wX8V}R|vp16XYyn9K6)Vxx5KRcuMg*ZU)TN<+Tb(>Ju@1rJ=D?mh6XXdKY(R}g zOVf+vVW^p+5fV=DOl40_8ZbpbvBNEhpmlSzSX{+aOQ$E zVO|qjub)kSO|~x6eD3~gJoWWQjq%*Z6-Q-A2+leeFJhYILFssP8A%CmNxysW_(zQg znOmL8=6Rk9ws)ITdqNTk=_6DskIKei&!G*r4JFW5C8y#PVUY0g@!+`GLg#R*V~Q1J zQTXOtSJ>vUnm5p_^s@z&yC*`JH3F})c+%;D(}Z_r7cl9Z;z`r(s;Xig_@Y;S>@y== z%OvWGlR0-BqITfs_=9^}x0NmSJR9uPJ$K*9<_B+~8foEqF?e0~yk95Dt(0xaWh*@| z2e0qe*>}peb?&x|G6zo>s?t6G*Qw;zRokwWnVrtnbFEwulu_ThdE1PX8jd(BY>E*= z(0fP$vgm5;Bqrqyb2jV^Z4O40xF_f7=4Z^AUYMS$@9kL>>~U2$-+LlWKz&PmPi$+< z6X+f)%NpNm)=;LIfXRB8=!w_2+NEu~U$*smS%K$Qy+fH!4@D6ygjE7j=nN6890{OU zDEVW!E7Qtond0h6k}^u7zJFsNW0@^IAaU1l-l1jWs$;vZX4;q;`y@LRy=Lw3|HwCS)}WcD(_c$jI;K^ z!_jTu%Hp1Ta9uWa8}{##{`O}Zc9ZAXIL^s5^3Gb)CR!6$3WcC0Y_Mtphy~{7Sb}Kc ztz6<(X2cxhLlub!wj{6v&Du1#%ic_T z-mJH!a^YB(=#~Q(geO4uO9%Xg1yko*KuMRze!|{?FHP4{+(1!Sr*{s2pKQa_TlmVX zxN^RpMMm?lR}00@xZe7zpe%LV^TBu`S$jCqAKOdN)_f=9z%C^3IIW&))lU0s(57P1 zyESu>_nC?|zwHZep7DGXjPMAKHe2eoggN0OG)q0^lp9&nqVLL^E1u>O`w5_b;H-r+ zMdk*=LOeTL1Esakc4p?uygsk_kdIhuIP{e2 zfZw6;$ZRS9Xuf@x6}0w}uMnM+_Od!zS+pg0WhUo)Cg&z9zFa7iS|Z2RmXNJ^KB%{= z(sbV9(d3;unrQw%>7sdlOv0Xy;kr6hwlpGh^#(qhZlaK~AhCUx7)gTn37>!EhX7hU*1>8oERwzkT5sOY+n!YJ7`(YI?VBEDtcaGc>1dsMc(DPDEtJ%hVXb%O z8!r>y{OI{(JT7y&HLyghT$!~T{-~8qISMP5w zsA&CpLI@z16Z$ZHF0Yb(u53}edVq8}-HSYtkZIM=k8EEa@K1-?M=MNCY2YQ(212eUtaR`V!-aa;7M>rag~UuyM&|6mc-?>wbwGU z65m48PHHCIdX;Q~z-4l2qN?PS0{lsObti;06K|JnOBvA&6ZTj) zU8ywExOF{FbGaB3>N*`Z_7>N!b-3*;EO+}WWj7A91S1^ zLIiI|qB3@vlaXb<)i%!P-9~Fxo)xtBz3GU8lBZarp?;Q$qwaO5IY)LrDBsrSvs(3@ z)ZZ5E?;V690DT0L0LYR3U+?<4DK^2JonW}{Kk=Itvlb9iWfQ`y!zr zlXBp5BN59C+sI9KOVV7P^!tj0ecsDoo6)B~7ZgXz%e1oaudT6P>S7lh*O@dw#F%&T z;ru_=hDMJ|@CZs*xp~N)#LEX8NVfWC+9b%u$+bB4=R|8 zzAu~LX|o|j6T+7O14(jHJwy|>$b_wr(Xv!=qf7Hv>R&clpP%E~xhPPj;%FZoQ)fkU z1x#lV+K2@BpcR7^d)$d>f-rR`6lmk{K2z{NW;3cMK#GAtTR}&h1#z+z!UR_oTvT#1 zI@boyugLJ4F`@AHGcpxx5Q(j4^~PVDLlY27#I7IAZ`#bF^4Cr&!88Y~^f=Ahf(4;x z811#y0Cy>dh=S~FyAtElPQSo~6=%GhCaz}!`S(Ab4>)85y(%0^yT*vbW7@G)TIvek zI%moV%)Jd3+eG?g&^6*B0g-PB-)r_4RDwNBcE0n7 zrO!7=rLlFhl=>lb+{_^ej_;n!hE&cU{or}BiZ~z7P_EAEV|>Gv#af5gGLw7N__OS( zP-hM)aC5WBzt+_q7*bKyH&c=k&KQ0gI)t62#5KOP(qx|zkhrAPDznehi@pYA=1;Va z21Zx(YWal}cLQ4}^3#&Lc!gXpr?4c`cMn~$TPEnfqn~c+R^3&#Udd-(+V!?Bn?AO= zu=K0Pp#rDw1wp4P+C&cmYs&HD3!xJPr8w}z3^sbQ6hD3))(%@iuS&M!ty9Dhr+^cub|?JYe-tG z(!@KzaIiZ(sJ3FLZ(`n1=@wt; z=?EID_}aHmzrkcve(_+>r=VXIfBU%l0uzpIiCV7=H(0!q(x0f`Wa6J+;@i6@Sf!HD zpQ3-)WV3GRgb9*G=2=w+`&JryXN9!6ZMV32?Rj@_NTsRw`H;tMJ8EyfdHyvx zzH)^(KZM)v7GP06r%xf|NabqptA)^gI;CSr;1C70b-bsED>>1^oh+Fa+KEbg?+aEh z)?^^5RMu52hVnj9$kWx>{?YWZl_Ez%o13Lj?bRN<^I>^NUmk7cM*g+*tIskUWaGal zri80E+UrwS(FrowCGRLU#8y^BJ6 zx?z{e{RcvtE4O%;g}~bPRoeDn59z85@~#Z&?+y`%qi6{)A%H+84!u-(hHyt%dMED@ zWd*5CX!gDG(eEw`6KRLJ)ghIyb>yoita~M8)Vyg5ck}ORER0O8aS7J5IBQam|KMj# zty46qBfYNN<6RRn*d4mBs=5Dd$czsWK%6NmkcfJB8Q6n+E{(!$ZN7QIaIaX5(xud) zOv>wMt~GBwxjfFbf8aL0HGoTPES!Gec?0DIokX$W) zRXbF^>X7%nkXPNie^n`DD-V8*AE~~o4^==Otaf`6130Zw2)S=2idtu@1=7@bY z(_NQCKcwV(cTJ3DM)uc44mO1PSCx7{pBT@K@~*8IT*Z8hI&m?c5nKH7+W_hFtJ4=# z<%w(nBRD_?5VaI@A;q!e)N!ER7qIoOYnAsv$mCa}+*5P$ejGKdnr;bJUbAfB{ zH2kHDlS$qN7ZQ62 zae~3!7fS7~Dz|Ixpw30DElmfXiR9#+-V-}0640w=O;x{^}H zwbk26yOZDPe=&*Gt-mnjvMaxe+wDzd!{Pf6%o3qjBwP)ti3VxNffc+;e8hvvzeu7) ze;lwaV43nPV5?`2&rG*6m>W1pG{nM0<6!~?B#sKsfD#|^6gc+?fjLW!)9S2hL=rXA zg$T@%R2Y>{5y}lv|4?XlX+j3K>29_@Zb4$6Y<|?(r}3Ll{Jzpy^Sac#B6(#U=-wx`4s`lBApv0oPq$KV@rzaAuZ5ozT;N4?fV^W z7ryA*^`Yu}|8JmqU@VYL(veA`pCO7_Sy?S)g?LyDC`3?i&7O7lgdhb^VN#6Xvk|_S z{RH^;?Xa63&pZ|y->|v=H!G2PP2>2&TMz zfv<28H%z6P;R8oN0BI-oyFA;4lk( zgI)Y3E!8J`R~uH;)d?>W7gj6zNKSGorxW`dr-l2&tg1D9q$g>ole~esaxrXu^?aXQ ziDJ>9?jG{8CTvr+(STx+MDziNJB2U%!gf`kU9B3*a8Ied^XBE(u=wf~KCB`*iX5h> zO?KGboYbmZ9a=9m1Z3ghffg+WY0)c38fG-*ItJaiuR_* zcQ0OG@$4=q&{Lywu_i^8=aS~+dgg(_*U5tT1qK68i<_M??zz4y+Wpzc^td7KQp%Bi z7eZcrB79zY0JI{z9vyj@;$cXm4ONE?m=&o;A9c82$bHqfTZBHq@qs&`9R?p8qd~!9 z*vDCFM&@?(0;zEEU{bN(A7Xa6>_-`#E}ZQ==PHkSBUknq@0N#+vwEH49IGv>vN*O& zrI{<)H=c-9J+S2Gw-Z2hCJp~mFa`GK_t_D@d!dO&`2Al&xW6(5(-`8}uhwf>R*yWaU$u8-^Fg3}q^ z?4UO_;ZDhO7pU2MMtfy?`gQBWBlnjKoW>52<+u+YPQ00m!l}=ognX4{ZL~b;`j2q# zEx`b%$S69?p-um-@}7T2_kFe+Y|7ufZ->jooISd0TVW34w}WT;+aljC-;;gosn5OQD}DTIZ;XypAoD|(>a!(PyUJJmKB{4GE;w1rQfzkf_q0dN z*L6rYxwo$A1g<=@`kciQXJPQ3TetRHQ`>0TbMDt8^1B0jns2@G2@hS`bAI1r+jp6= zFlz>Vwj$y{scRP(=s7Z(n6CY$v_$FW91};AOtZ_Xdjn57TsievlAwI8^Hy_4WD#}c z=H|yCo9Ap(h4CHEVo%?;FWj(RedpPqWEd z&2?7zocP6o{UJ_gdg@&bo@L1^<{Gd~`QF=QMjF0SYVK!7%UR7jKAMDj>(kl&?U5tPBQ$E3;DKy4A!=8jx&}f~%jb~JwAv|@e0z6r z#6DtPjhydmf7_nR`<^zBY>!w{GthU$U^Tbu%GlFCBMA{JYcvOs8?33i8q~4u{pE-a zH46qa3>>PijdjGoZ;IGbvuN;)fm7A>pl9{(ha>jXm=9hs0J(~>XMeCSvfYeTLWh@mm@MB8X9N(8H0(*QT3DwNgCd6`O6A(@6l7NT@{aNSmnAE2j)FJ!ol;wmkpUoMW7-3)r0biE95@1c{pfh- zvZH1e%V}$Jzq(SJZ)QkYW;tb)Gw4d!CSBb5SE>G^CXp9v*7@dyZgkJH=n~0K{wL9; zB+z*3Zv+~}jSQhYhrciTz#nysEUfu17nwQRY1`#u zY_12RoM=uIPgwOjPuw_6jRSLIBvQu4_K2lThx%9g?C{0B2KkL{r}O)PO}0O>vBuxG zbQ0V&8`#$@Or7ir)yPSHCbBd_K15|GA7Qu>XJZM&j7#KT_i6^NP18NA3WBhaw=IuUy;?B8fRj=4+mt&Ph-rowvdyb5?M!u_w7=#=c z!9d6s;GV~!4=6MBOwFZ8s#rZvhW1k{_ z)$AYS-Zlu5DN*T_A7@0-YvbkYJ^g!1_VwD1Z?2N5O&es%d<`gl__M=rQItyU(ZTx$ zTTRP!pI;cCk(ENCtPb*ek?1U}375cSgsLUbWYaRMjjDuZ<5B`;&PF>xIKojH?;-RI zF2fmNtPyeq<ilU*JuC=6T z@>62dl~tG5GrQ`je98H#PJ+UDa@n&=!4?Ob}Hu(B!xvt)9B0Dy|o( zc=qd`UcKbo9va|YZqYYqA`_T-H+(xo1KlfX`?gI~M)}qjbA5Y5gWW4F`marNM}^c@ z`3{7Jx>xP{+duIsYF}-`;0uE=(`wxTwMm)iL$&t?Um1j(-pU{Fom>=suJ*C-Oav#Y z+_Audb|a1;N1z&JUaji0!(LKIeRgMJ<@WUfF$s6&T?i`Vi@Mtm3XMPMkd{ZUSKqE0 zDk(*Iw}l%d?Jqo=Kp#%>d8kRQQ5l?e+h!lEX`6iLa71*C!(btB0E=sT2geO$M2T38 z+yF$hL=+>~*C>x)V`tr6^;-M}?(0xsG~VIVG1<5GB6V}=`zu$)-!*ZbPliX=*2c~K zFd6-AgZNOq(}C#b+E>1xLic{NI=I#7!^P;QwcPi<)045M>-&fF2Wp~U)J_e4FN%w9 zaClMpp)Y#r^2f`?N8_um$=a2js>q$H{o(s3lw}mZRH6UFr|4g`e+T~=;HCmyq1u#8 zjCdVoh-jE#+L$l&g{izMb&MgZVUlT+?#l~PE-|`w3Pa+C2TbqezZ{$jkFlszACfXm zHNDH#9aj5zBF3R^?vSiunrZXcOteP>`pe_SNp`N$MS<)os|a<2#GT34wZ1*0J1b|= zV`8`q{OTvtPB;H*IrqCF=631xW;;EN+-ua}@Q(^>+6}W$oLJowcI^6iR#<(^-V;mp z_Fwd&+*5g#@$qrY&blRjFfwD-eU+J*lq(v4O@-@7Nw)}~eqm~ob;LvLp9x3PUv+)V z)QPUEx^h7-S8VUSpRYcCjq$uSy_@4-5m zT+Lm3c0W0}Y=MQ@nRNZ-8?`Rcr~wEt=6u=;9n6}#Df#3ocmJ}5ho($pXne{}<|~X# z`EXVG*}IMVVxyxle_ZFC*eS{nH9hda+j%jljurNrQsZcuL0JE2&XNqDhoA4B|Cw&K z_fnnnkWTTb=vId}g`dp15Lv=f`t6HyX=B>mZLWuMb&u4@K;#E;li zB3YPfxgn3Sqv+KMop&8gTV15=G^UJVvaU7B+{otyx3`~X9gu`Q{V(7b@p?s+?gTba zPtq;I^aJb)>b`+Y(c+h_50{^>;J~yjuOWRy?&+$B=NJ(S-p@Zj=YGze&d~oswmpN;hTo`eyrQ;w~+7qUinS(v(J-zf7HeMt@v)Q=bHRRt0Y^muPQ!q|EVsg z@%89@_4+^R783g84wd&AU)I7*>|HC5?wT91Bv-toDI1@aOouquy z2O^cvRXN!hml3;8eFB3HWFZhK_%PZw4`VW^{@(XG_l??4UyuEfBh^%XC@;F};b_Qo zP3)%nk|B@ck1pL7+_7uZ_Gbg@D~G%di%fg+#|EcA#qO(*hEkiTX|{<&b4I5ShqPBf z5S$Z4+0hl}#2^RA#Yu?DCwj=Y$@dWv9*Y;fmSUOnb(1vj$v#c}iibD${2C*FrR+iDv+n)^=Hw+?MHyjk`9KZ2O3Neg2`Yeu?77Idh0 zq8-rRWXaymrijuu&}&LOld#izyU_f>VB5Q*`BZo;6Yom%( z8d9tzIZFlT@GLz@pPG3fNEBwCCFhLJN);j<-g>KbED0lMEz2Qy55YkdSsM{L1C92e z!NdlQEGkAesPmp0{kHN_aU+chqRrLcyTQpJ^l=n}l zNmE?v>R$}Knlr7DD?T~+=ls5=jgvV}&D$PWxG}}QrR}?4|9U9A_|~_9Lz7P5M7@*% zg5gBAi1`ZQb1Bf)DyI!(==}-#cU12@x7y=Xo2|?|jgilZr6spzPx^i< z+t*(|ITUSJXF4RRcnp9MSb?Yl2_(t4k6G@)JSubSXg{Hvc$ee6x5iN{jyi&+AS*p@ z`8~G|X{&4%zm+(^+suh@rj&^1$k8t#YgWtpBEE?2b95ZY&eXaXR z?Z=5YhlaT?P8zmyP2bc?>d=e;g#zqVV9t)_8<<%MyW|FzCEH218yV$!=iSJ)QL z)EKIcOa%2avOr6OEDke^(i^v{!R*EP;>XeN9)6zq0Yby!phU63(3VHHS|29$J#Kx3 z8fhQTgEV(c{IH8odCeMP(Ivxn(-GY-YCmP-4>hcMaiy3jdW48zMj9ui@*+?$k0A7F zk+Lx~Qky4P)AUvtJ)D$f>pXiqGiF|hlQO9jG0(VhY`zlbioZ|n;O83!c<7nY4Yb0Q z;<=K4g!``7C}n8GpKP#yan0~q)%&q8@jpf4;|v6+RAf*@m2pv=0BwyzP!(t)bi!>E z-8L%$P)CI{0WAitK>~t{73ei(E$=0d0BONk;3+(eFI6bP^<1vb(fv$|rgBNpF=vqH0=xm6%#y$M(M9{>;uhYLP;+K|& zzNj)BFr9Q5P5<>cezxo2{F+^ZJ(K&sHUD}WKi%-!%70?$^oRa$)4%@4W4C#m8b1iX z!4`=a3gJ{sAU|JXt8u7iw2ib$QXi&eh2arUK~Kt&j?qvAQb*M)_4Z?$I_CpNWA7H} z7u!Fbm7~Vh_^q&i-4e2_|3Y{NSnxCc`^c3^2?+Tup?~ zv3A~##?YHBE?UlbG%!ZM@$Ju>~#@6hhou|0=SSG{2bKSLeeC(Z z@3-yWx!jD~4>!Fnh9|)R_TqQ6fFzCT@gRTAVGHJpY6TtIxZ?JES2fyMk{bSwx~#$gVH$ zKP~=T`|HN#ig=JSX&i^y&JfV1Ogd<*9|Q!BMa}Zh;lxeOCd|?6&^%tW;bGZdKW^#m z7gqy0^$ULG|B?Ix`@J5EJZPL=1azg(17^E26~?UR*@nM4*ID>++4N##*6pWS{z`laJ5Y5FU zu%V#n4A{Ac#&Rlf#m}~L#!HT9WDCN=oMyvlZ<+_mk}wxLjXMeEapb~aMC&-5#F=r| zIDtJ=<`Z2$RV2zotXR;r3VOc43551TggE3jLMXvi5DpJoAL(vGX^55xUBNlAnR*3Ez~fQuBHW(wnH32LZIFR`Jd>AMKnU76orEJf-5X>Bl2~E zJFigS&e01~@DQ&fza>QT>IE|n2!ZmCNQG<0wc-DVrZ0huY5o6y&YWpxT4tK|y{1%( zWLmY!sYsHPwTL_IX(4Swn$sSN5Q;El384*Hu6s&|k|#ES1>ab2qPQx#j;@A01*|52ors1l^|eK;vF>EB8d-)Gn%y&@SQEbe=d z%Y#8z(vUbDwZXwgS@|R`mvPE)habnDX^^SZuvIi?)Tl)1nV6HpoRw(^gE#QO(myC{ znhlp`g;$iarNE5^BUP9;sYkjAlr3ZrGZ$x0ZP+KBFEn*fsg!-eOw5#rQ6@wn`bCdS z(sLRt0wNpv1qPHuU+;lQ=IA6 za8%?!YF45eBxf&kB-6hEs1!)JH3aax=%EH4xuj}JNqV(h1az}jHCzw{#9IWYy8u=} z2ap@SWco7`8?H)M38&X*L%bJ^|2lhjw z+Lj=WnS3mMMgs$$N2*-PEt(}7(Z*4i5`A%y;w82UoTgcH z<5B=y%7<;B2`&JVE7$;TlcfoVR{Twr7VjEha9weL{VnTP!+#>ka45k0k7Jz>_P8RP z#3ZmSv}{~4JbxCPZ}`6g!UEG*HsARbBOC-4e0`2ewtOS&WtPz0!LX9Qnj??Ia1fC( z346-_^U2mo;bm@>$GD+_(hko2?8%L)FSk|A88-?7>-oPI0f(56C{ASd&j#(6g+QG> ziS~)KcVUtczmhD8gBgS?XCM~!c7s|=Jj)O1nml62WEj9_U{a;uoUCk*Mx&Rzg!9Dp z#<4)9UY@Hacc0s`1#!?6Uw==ce2A9ZGsPs@47{ zNdyF_>|MwC@We?3^C*b=-jMCjUV|Ki4~_bc{|T%Ar~i^luNEKGv%+9qfd-W9lfwV4 z$4AB4n;TtU9ufLEm|3W*ujl35MG62pfb|egfjL5y4$H$JSQ6xi95_|V_mBZ|TTbUu zCBtNaoJLMzK&B;>An5r=+RfmW#}}*tjy74M!11+Yp#>x?vAI;txvT$FIVJ z@K(6)qA|w|qmTn$sl-~&o}icKtCo*XRZ!>2Z_l~Y81}NJDsbH5*`Kp#4L)!d0X#kN zydf<=pjYx_$WUBjpVZr7W|{R@cD>H!d4<%RcmqOSd@AR0V@&X+_?6w$Ce(A~@8rC0 zObmvb4T0(iji%#3C&7RO{xB*0Y6mpbm>hgT0ShDCWxEO*czH({ z<^TtZ1K$LId9bNCby5m%|HyzLL@ElbEwm0REY6*JbKlDrVT6NCrPd3DSzt~u+KOPp zZWM|m@bmDVg!@+lL1wC|0M+5|P+NRtx6Ops$%SOD$IW9e9}3sh!=PNspNn4sx#JEd zi`N6PyU4K)XF=Wu)Kx`6>!$>VR${_Tf(#KHZ!a2JUY6^BQ+zu3@o033-81bJ?mxM~ zH>-ntgpj4R!|hY1bbw|7v_T+^C)7E~?aGb2c{%u5{MvvS*L4QC-*WR16TTPh1PS9U z4)8HB5=8q50v^}}t{(=;BG--2P|!VzG4pb6-VE-GU*GMJrt8Uz{BzI29U%aZN@E-7 zmofbZ2`3X;8mKt)RaHW&W2+dj1kQO!ZnnQ15+d6D(21zNj3O-!NI1FZodl%8xtm?V zBk?H#&e!z@cyy5t28ih2MZcizL%$_3BrC<~Z}}cQ5B@N^LDNN7UtMu$-d#W`ut`j! zO|l(;r~C{SP0Avm5%R;mP!e+!5;vd&xu1h?#6On``J5)sz{}6VO%5|F^;av_<~_an z{^d7enuF^EP(n_?PSL}kED9_a0kjGnBp9bM3Ejvd#Rnia@g?}@=oZacWd=_aKjeMC z2}-YoG6{xT4&$vI~wW@4v`OPnGY1vuvd{uk- zk2#tiWrk1q>+&6&^gHBwii?@&0_1dD)aU;^5U&EUG6DMf*NJc~rLA!V6~ z;EWuPK#E=pBu{`Qg($Dz+C4kX$W!T5{?ewYA?oY5L!XVt*1?=97j{jHVz)zlCcuhd zqn(Md5HS!Y!laJud#K6Bk#^EK3X^sywd6-O+4gBy7mj-tOlpI9$Nwe7m=wynqu@sA z5&-x)3ahGqrt~?#KXPWD#_W?G7MYo;_T%~DCZbPJU6ktOV{ECcvvp^aSD&#JAUf#i zRu#_2P6kG((+86e;ViI_Kvan!2@@@$X&I2bcb|#Xo_d&uOjq{UTHds%&)jNnz4r)w zYbN@kVym`+xrqcLh=+5!gfUs(fS6709kp(kH(svJ)-V1ZGSKRsW^!9O5+*5EhFGrO z-#vfAgr$kzgCUkz^9-QDLale5%>6pu!ZHt)XE|esi)-W!Z{w4jP?Tn8H$7>Vb zXR6%U`noAG#A*GZZr`-Yw^atWerehq;=2Aw06Z}LV*L3NR*(Mo9~I^eNSgv-K|j1o z*NivOBn~0gO9K2{%uH1^wsCLeg@97y|K?5U>AgQM+JnSHn68b0;epa4{73#ohV(R+ zG36w2m*Ntv0@!b7X1Qj_8kIG&7&gg_t6O$9%=!2++y9wait4OwhPQTw%oBe+Ua~02 z{F3Tl+hpK3;{+IT`=6bWW5|#T84Su$a844~qy|BK<}mZ5!{SQw7pjTdoNpcOTWD3` zu*71DzMAu&a32vkZJHu9Z**YX5A*kOu_K zI05p8fI{O#pb7+2lmR6mSQV_WDcYQ>z5pw4(FT!5k=lc8Yi?Z(S^4pt=5jh6arxil z6Lfr!)8o;)D2xP7GDumbK2iIyZR4$!d-ab@6W<+js6ho;A79FD&%4#s7gAk49#CN6t3Gx6{#&hm5!JQh zfw2%*yU6K7YzQ6|Avy%1rx^k4jp`g$SWG*tzIglDTTl98tS&jMteo}&KA7f`GN#-p zT|Vqf7;JeUnMHa?BBaV*PEBfj#&Q{L&b{mv4b#N$)i-bd=a#fDzPdg&$j8zW=5`<4 z+5nqcPBWFzPpklNC=g(lU?M(+`@!J#l+4X?R~=SWTCUcp-Tw5}`@RiU*Bw?{Oh2qa zdkioyxZ4B-+%T%jvoiZ(!dX?GSF}o`UJIGxkk-wjootJY7b8e={t0`m_u|Kd+RA6&k zyT8!tPCZO9|JKYZ@VIT%zsm|Cki?a+n0OOMtip86v`5Oj9LGJz&X40`s05oJcJ+&1 znw&h7PTsZLz5Z@@Semt`)+t~?oGK38x4xx2e8Sok_%}Go+J(ivk1EM*SMQYK8 zDN!dtyNtmZR&I5Ou&_C-)lm?0+rIyxRhvU(rOgYiNLct;NPvLB(GUJ*3uoF6EFcBW zB~Y#ZPjrxh9@IyU*!!d~py6?F5b4VrkRO0p&6}f zw@-Uv;py8;L(hJEtQk{gmjb_=CYZH>T*x1CMd&iLA~Bu**-DL(i}8>W-PPW9j4--ntzcTC={V8&N>85e8Vp4J3k12KPx{{Iq#ORTE4T z33ZMXKD@mq^y0_flDKE~DLVfYzP!CYG!Y&Qlj0Pp4?|-DDOb*uj?yZ~&)_zSfM2CW z?4tNmPIKYl?WF#z)z8P*7R+eVd0Y7Hc3S_9kGNnTnH+^?$F_$j0AxyTS*5CwBO$m#`|7h~?Y)-!5o3ToSJK)1AIU>rP?losa#R3A&E^bQkV0zq7ah zSq5Z3qYx`1WW;!nQi%|e6**jCa-10@w}$*mY!oC4w~&IM$ix2AF8eQSxu1~ccw09T zSTPTVwyhuRPMmOL>E-P(00;R;Ojb;91f44EWIX&hRFV|rWUqH*$BdhQ&VvAs(jQGd z-q->M5=eFgG}N6*%M}{%9{Y~wN&#X$4hGnn$sqeE-72mCmn!fWVsf|42@xhRXs_Oave1B1iX~2m(=G zs2l#eK|oWkfN@AJ_+m#9TMDPNuD`eX-FQlYbDQ4V9UJak?|)JKVSEFx(0|l}?ufdQ ziSR6Xz%0%-R(^z4L*RN*GE3>bXg1|pV^hW{$h^oXJ9ZV*XYb6pb2GGWz4&8yYMP6u z{$v=T7q|4YGmehQfUvDp#8gaS`yhSl-*AlLld4M`dwH8NWw*^)bA(v1{&Mpnr~9FU zAIGE{6=v?xpTG0eozDI@)nCRp70hhYkJ)(^!x4;gNmIE|dGOp|hEQ!D`?DPr(XcEz;Mn?=xat-np<+XYoW&tFPJu}SU zlcH9>?re1<92v`agc&6$_2j3`_B5KjYj5-XFw+E;o~=;LT0mdNV%WTfk>GOPnne~1 zU!@CG9k*G`IczkG=bPyOvAG@zRs>W|5U265=^O!Gq8YZ!*nloUuVb|Zye}xGXGy@AC4$2sbp*V^W{48A_q*3x!*m zHB8$C?ZCq8o)MES?|R<6F3cf8H*iM*GYTpD_!-0LgaC>T?RiX}5)4ICwxS(AbI$|U z!iQ#Y>MNHT{f#?Y=f0oxbJs3trX%q360Chrt)LYgku!mb7`zg{(KUSd+?|=TtObrm z7GCBWOnseoL`SrjJH7Gff{s_ZjtO@=HIirj^6MN`XE`s6)j zxl{qE&tECBaAB(7EqLWwGwJ&-g?T%S=kK0;xA>KJjmbuim<~?)4O#6ZLUxdlK^iFq zBXA{+NlY*dHpUFvZFRRaY{4hf(ml`SeKi*EcDs8t%>NUZ4zSfb1dJ{uL8Y2hXlDxL zi)B3T9)Go{#{7G6fw!;8+1<$(@I6^~8(#%mTU{xM^|=8zt{fu}0iA$EK<6|rP-MnPHVO7M`p%3lWmv;B zi2(uE8#S3TdGvyq$L)f8jJH5v$Q?HZxg6$?4Bf_g{UrrHzNS<6?7!RkD&o`D$E6cK zxu$dX7=Y^n2m(-|b4yr=p^0RngK9_U0GEzsvF$$nW4WK2yG)Es792KRyyxuQC$D0x z?HvzRE_h*@xaZp47h#}9NGgotB7;#GZN>n?2{$nX9;lw>B1el2*^oTSP_(2-sZ*^+ z`QNbk1c$&f7hluK`}f?xI~bOf;1qZ$2v{@dZb=0Eup*sW&}6@I3|Z0umI)#lO*JNZ za(CoaN{zFl^0Pn;Gd!+}QxIdv2Zu8ei&yIFLn(~<=1#t|=k?vsVVlGWGkXrFElg3a zU4nQr`U;Q-@s;=cn?Z*Sod9(nCPGK&js|m4T7qlfk?RWwCV$)W>+XMHWCB#k6%YrC zAEprGymqg^u2Kd=l3g4Jwa4$yEi;i^EyWK;;Nh7GZatDTKTosC#cKED!*dfn zdX7%`<(kbcHWAHQ^LrGX9kOx*M*WqC#PWS~@xGXW9 zqOrH|-rVrx35xjtV+@dSprZ z6py{-_ZGcAZN2o$nb@T_riAX5fs_JhQwcj$w#+%UXn>60nz_FlQS zD*VEyGdbzXP*zNruP4&O@-zxHXB)`bFY%hb1fzuilFeWT{D?-vvTQV?^WOiNaH zV?uCGRa$_j#pHcz;+E~r$d1$=x79Q$;#1%ky>@SE7Yg$+&8ZUcoT^=J#{WjO@;&VZSit= zcTfkvsJqN}+Sz@}TPj~asfqc1QDNndX)XIATk2l-e&SP?(pHLZPaE8q+;T1aMZ&tC z%M&Xbh$FSSXBh*?$!D+M*KGKH zO<^@}x--NE;=b1(tv6n|9=qCgx*`U3c*G!Z^mp0nWz*M5ih!zE02E`(MlD@TwD#K8%{hBe=v{@65nH zlciLU$X;krqSPuIA@dohz6`+0QNUmiNknCqHi&gst`&+$bz2o9IJLN-(IWV;aB<1h zR`mgSn_S16E@Pd-btR6idJ&CTc^fZJ1hcI2O6Ig~YE_`}OPhj1?5&QJ__y*%)mkVO zw1%v;x>oX6t8jo#uHSfBH*}xXgOW9^b`d&>(VuS@g#OMO0B(2KCkno0Rp@}#w~{Ro znneg|yUdz{m@3xJhEcX?dY1V(RC;S}kSa_R-O$ms>^QmWlfvZ|Wkm8yidi zX%!6!6Js|97)Gp(X*+nk6>4r2Uo5zEUDwcNf9d_!YH%*4TK9d@=i8hu?P`r3u(wI< zxjzw+f~eB|)`S5^n?qOH(w5WiLl>nCINKa{d{7yg8}+{Qdn+PcVR0W!M7{`R97tTH zH$c=%HnzA#nc8X`;NH)Rn4Nem@S%_L3R{~4I`?-(%&CPH@Z+Z1dWa89y1#p1p3R9X zk79%L8Jhd2-M_MTzRgL;j>i@9w#cp&-ywTRV;7kauTV%p$)q(gZI%B&=GG4hef**Gr@5I`$f7#CDYnp;u zWIyBJq5BUaq7v%@dtKsA+Ajy{nXU*Z+QY^B=k7s3+Yh)eLPrXn8NNWk?9%FVa}i|n zZ8$8^!P@)1193K&uRI-z`)!|f@aFx#f%P_5v~)%tL1_jzk~x8&6H`N!*-Ph=qkIle zALW$X+fV)#Y;ycWs*v*0yqi#a<@>XOwZ1dX9_+e5GLTYx?fY|ubvtHsARYrA5h01T z6mAwx?2noZGG}&XHlZ(JMF}+3e&0ufWG%H(>JxA2pi`#U z#u?16ZQS@WmOBcvJuk5Lpuph_Nwad5t}!cx&BErO5GcLgt&q3SaAE%1TFg3x zx`RjAq&DTjtv0u=^u?~f;SgG8(-wimx7;9-qZ{82@Fy=L4%v(Jgxq$Ab!CoidXYOn z-_d%do1pHvvus|QN#vf-2$_(R+d(94oXO9$X$%x_smYqqjVxexW+oAOl(vWq@C2qV zV{&A1;=RDv*ApTfonibplFTGrObTFmQtW#DtAn! z6Kz9R+{61K7wv5}Bw*Te$>5pV$KT%+B)2)m9J<^VG-$@Ulp8D;l+B$-&LV)d znJx@TVZ6wTj3K(e`&$~O=sSC$Mzjr&quvub@vIUS@Nj|>4-+a7yms7Ar%DbXHKf*i zkEu4Wf8e&vO!2uBjIqky5Sk&Xo`ETfZMmC}>CH4E#nSoUp$BbIgLSpN8{f62tOdrP zf1&keO#(0?o}KU9a%ixPBy}KgDkw7WTG^}@#+s>N)^sm4nc)||&Nf-sW(wzm@}#^M zZh@OZ9v*tzmNIzF=7r;j$_+1^KOg$pmOl88jr0o5bQcfiCkKa~K}Z8fT~bY5G!Ang zm_8eYNqE&&KmE zD-T~}fC408(Ezb}y-Vm}JxF|7YX>%deg@5^XHb%3fw9fqJ8^sCdza0J#qZS4U4CGr zV+*})x{}JVB89M|?z_+ZIkd+pH1F`rGAGY=kK_@H92 zv-Zu#FRhzcOjRZaK1qQt;L&lQD#U>_i`CnnFB6+`XWls+{-8FpH}PH1*R;*IXAT}V zklBE|8|=hT?qds}k3|B$2gqs>7S9(!SGXG+CS^%XYUVc0PY0>6kR|r~^ZU|o&o+OZ z`QPD;2Mv)gKaZA<2c_A&>YyDDngwYluU3%$d5|_3jNH3CxdTo zzB>M_-15RT@yN9YF9tu@j5|)0saNUN;|EY0RJXK<372%!S^JMbDDeLcgx3C`@jNVq z(;34!UUKBYgQ3B(&*dce2Ku#$^Cr@m694FdP>7x^0M$J*nQ)^Cp(I!l_BH-d07xW(9#}Id)fOQpX-xbM z{O`JWVAeO_b^0%I5(_z@X{0`(B9Vc>*M_u1I)r%%5+8>p3r4Y&BFU2C0Sd?Qc1(qQ z)G$bP#`~HPIugZp&JeSXu?f3Rt|go$2JQSI&e)$iBVGUJLpHBKDbg1m_*dpA>L61{ zCxS6E<0P?MGOb-BN+F500{=V19y;)C=t$O3&T&zu-)qtA37=@z&Fr~iraKW?q&%uJ zp<-lzE7y;ClEj~9d?myZw|2uQr7_L{=BiA45ZCr^x22n;Qf(1i#5gWl+CDYPh17zq zN=5|vdjea$lc7yah#=)lRUHH0WJktPZluif%oMkOB*E=gQCedP2Ux4JF1h_HS>Mh; zpx`266lIB@xP6dpY@ZorFs7)@(aTnMS3J74ea;XpF8xplN@GycB#kL1wNk_tDtiGZ z%^;dIrlc))Geb*lr(RVPzuT5R=jO4{hc!ci^s$!0JxJ@V{o!bq3MeHSK9!E@ zhE~)~`=MUAy=~6hV;de`A6i{E{f7p(;08;TNun2wcSxUP#q&u1gh3{jo>}iMT%kF$ zz|>Qtyzt?jsIVmK6*xKY=*Y3-VXJ-JIn7rd>xfI=BTZ=0Q^f5lP=CIoPF}xhEdP_fFg@NdG9@CJnLI7 zkJ^s5P-;co%96a@j(+N*ue}3!e z4A$OL^P98uo&y8hKjq?=55*s&HjcR*&|kIl(%gT`KR)y#Gf7$s0m=xra4&*)qhMoz zSZD6r@^23(hSKY1{V?Db0p0F#_M>iu6GBl^5$<3RgiCK%hiB)_XFHRJ$jw`L%IyU=&(W+gSy#6|F^+;oS)YP(Vs1u zg**s7fr5xr!9-v&Yyu;oN0zD@guenp`)qQ-57WXuZS&q9-|)y~_;B6AACtMoJa73E zlY!09J7X7wV9uIqB3zr{vF4aK$=?a5L)H>3n!c_`$XrOM0cp~uchZ9N|6x{G?CU-C z#QsM+1A(`)OQ116gJSFc7lhD+mpiOihsA zsbtr08)lv~?AW#D?pW9X>s6(fd?L%Ica#jb z)U*;N+T) zi^Im0qm)hH5>*7Ft$>F^Oo^;;OR7L*T_JNEHzwnL*vEA=E*LzS+;MHqi==hEGk$@y zV1nJTpr{9a2NnlX)=H2GN5zDPh(Yn=*%D}-{j)}z6u$y6d#1h`z~*;n&8wt@6^?(G zrNdGI1_u%e3YW;z%r63{fp;S&jW-4M8r+O$CNqKtk`gzu2FucYJx;Bg^Ki}ZSkeKf zRfjJ59)x4KGcy`N)Kug=4k(cX_EXXyV@fPWdG)@br)oQThu@8DD0O~*2#}1xRoR)T zO&|)C`IOh@GKlzdn)X!_88TgsC-N4ci)DzO#fjGwmYPP5J(c>yJdpB=x4|Fea_ zXqrUdj}6NUrEB_EOJR8(;3P&MjKE-}C6;~{j@*YJVQvPZ*d!AA8B{2B{x`(Dn7PR< zj+F|Ioer|sP;DZYkIX=?e5G!Aw&G$BAF{r~xim$%>b=nah&(6js@prUB;C)WVp6B_ z8(F)YtL||}Z}^2)U`Q*PYo{#oDCAb*6PQEik0EyDt@9r5j{f$`s_^JEdZT2w^#=w} zZq;H?vR#0hz{K_1!5^e@wkdaPbwVddRu#7bFRob7IXPN2dE1IPe;{9=46i?;+{XBQ(pZX&xp^?x9rdNvtOGkFPMH||M_K#Z~H(jK0y0CL@ zwDA`{ToA{XEt-D1v~xl9v8i=r))_xH~Kb;1&nr}rR43NM0c{DPB~i*-Ds;-NxJmj3W5Jn6gm?CGvf zFY?9HoxNWMHsMIM40B-zKHy(nMcE>hpxt%(^Xz}T%om->ld^xtl z{}<5Yiy(q=sV`jjK^hfd@r8*v6y>?w{-g%0~tA_K%^lb zft$eay82bQRu;QukKCIQ*`Qku8VB^W$x8R*WFhgp{Ijt*`LWJ=@Ah3inCZ`Ck==FP zPv$mA@%o5vk+J5|J!j@WKKW*`-5IB)=gzENT6<>YOAJ@DIv^#edw1ICdodMx1gp~AgYKNTw>>>O}TwVU|?C+)c*{sKnZ!!s%0FQ_6lNm1xBEMQROtL8;S8GyU zEpMB%Fw;LHu?Wh1VhfE=%%Q9a#GP|cw9;#et@ryGu9|P$7fSbkQga+EmGv^4w>#Jl zWKZKNU6)NdyXWz}H{o`*S3!z7eHji(2O^D$_aYq$Q^bZ*X!ZhB&YT_Wa?~CaIMqrV zPHWn^&+cnaxF;xb;Y#I4GOiXV9?kvqKHuJ0FV*sP))BF4-H#&WM=OI2i(KbFj9&Al z?!byw=PoV#>umMop6IwQmkz9aey$DdsU3s+j^vW%RjOAWj2w7ISPJsz-OpK?JRkFE z-srIGMYL=0<*P?n=hfe0ixbZFSX@7&{cwr;c^+fnOVi_&i|a40-WRkb_Q2)hv-ckl zMkghM4DsLRBgD%upN*62xyv`oB+M#?#$5?F--TuW9d%(uU4{dpz+b{URvoa6!&}c>wbX9+R2e&@0+fjl)^Uqr`yqCZp)83he|Inan0RcZS4sT(So0(AK!IDA~k77ZsntcLa?!K8^8t>{L zUj@p}?{pt}h>V8k#5kU~a;ozxb&#dJc4;oBTD&7*e&vP*Dlz{l+`0<#wl@MMUmIE8 zcVpp7BpZ6D`bogLO2;R9G3^c60sslOvvipR`+nX-w^o6lU`u{C;yCDvS)2zAGQ^Hu z?2N+E5Q*WGJ+6CKUby7>soNku=!o|!_5oR(Tv}uj6>?~3%A}Io1DT2ffVTvIl#$C5 zu|Z5xa`Ot%q%{rP4@9JsV~UgStq7+hAG+oaFeR!SFkTQtxByln0vS+Fh||uOAR*I_ zu{|RhIRQcrAIC~?IuwAFk%Ipv7y_&c3&$X(r4*{TnkY>f0`z=SvNGf*|2d(jpfW|} z-y*xl5bUd1Sl!MPxQwC_P!hKnOjLm?LOY^4=Cdd}Nm3D?(!H);CAS?v?U62>BUmhz z?^euZ^ZB2$xe}ttqdrLj46b8YI~yycywMdUN&!4qS$VjSF*5vlO*(81pb0?@6yVx` znT1%5$6!ML81Uah7zpb`31T)4!vOMWiMO9g8CD11Iu_z)O_H0xcEYfoJp=9k(xM%q zSGy0iao0Sti#hn^zINmmUNgfF(ji+eBRfT8WUb_;Fbc%P4T^U?y)dKofevmWCtKT{ zXyATQ)=Ip&#rNy^GWpde!ShznCZtYlIJ&4t`J}8K;ZBHk2sn8YNE3AdYeCx&#iAq! zgR;{r*xuVxA#cN_9?k5C*$&fYXo5DbQ`_r=zDn8u_APopY2Pj2tX+SvYT9V!<|nRi zkJz<4MNO;I2a($CPdwk2+kw)J#5>AlHd7tvF*ywiFj-&fCGUeO&Dd~10yU}xMX_PB zDHH3(;s`s^km7M{N7Mz298T^%)JeT~xo}i#gePDy$%XIIC2|>czAL7l+yBJp?a7NB zKazyFdslz@d4K^^#_n=&@B3r&Rb&CQ+H9Wq5D|>(v=sW(GwSQ`O8!7wR)HLfo$sVljN9d zb{J_W{lna$5B(lv5&{nq*8x?^{YEf)gq);^oa_ZvVh2ri8C%XOa>d7`^{0%NOn5pd zoxS_B+~7+rXXE&)-7LN0ueZ(e)b_aLiw&9-GG(=83Yza{{orSn9DT-)mk%$vX7{2O z8wJ2Rf`W-1az+=)OzDbzB$07qkTUb!&YPS>D(%~Jo!)z$Au)L=M{WI!V4e6qZMxSr zGu-!)iSZhKf6dWT2chET-0f)UOT1$7t8-tTY>v5+{BQ5NUzb@yvtTE@Bx7TRRp_stl&q+go=1z2J;eVeD}eNH z_G`GH@Ybs1<`WMZ_{g5}c2h6l_5D1d=#VtUC64#3Z4LEWt!q zZUlv%x9K|Y_P*WV)x>vKeg|cp_vkwI)`G&RKkH!(pvupvi5Qm5r1G21J7tpCvl#~& z7emB;$&|ZbNvlaRA7z)`$+#shbkuJZxcjFRodX$ZuM=@)s&)7=-u=83bV8K0;Hu@S z7`86*CJl%cl=P)5(H!r<(mA5mk-R1NTb5|vNokO8*P&Ja?R3s)&Aob~QkWhTc=~Ni zoA>d9w$uGq^_yEePugytEoXG+_@RxSTV!u&oQ-*s{I)mw*VWurcg}}*iECqeli&5G zY`Mll6-vdXJd66w6U5iiV8Q!w_F>lTU8cO*N5c$VQniFea!?dYB;6=OVJr|E>Iba< zJ8PQk>EQKL%D9ow43Xsla?KpOce`yQnd0x)itRI3&tt#8S~hOgva0skIOl4NUT5F( znb)ojton9-OV>X!(&W(ANDD1iu^C}t87Jpxl0OmIXBm=n>4S)i0KoE4H z-jQCIGrVOv;IZ<U_iHiUOEws$ea_&%ku102&(LHc|n?2HcO5WF!h{H1r(7Lc)= zq)^k<`}UpPx2v1q{r!7&)`gp0eQ!V7eZQI(cZ2SyBjkk!aTT#7QaFY9(+t=^8aKlC zBDf+>nzAnB;+{=fM_D8q1)2_hWLsFtylXW0&;u~}%(kwfm_K^J1hiri;|DVsd1Yu* z7LuSM*D(G)*~wf#W@EpFbaIrSNo|Mno6OgZZg6gqh+Qo62C5qVZY+sdGzViH7hibX z^)}{f^3UEa_xas=KC`bIrk79nq~Wt9Q!@(cm3~{cv%9c#(GI>Dnw+G@U^3*_akdc= z5=?Veklbwcz^+nv|Gq8Ue^{shltt{|xgdax2euj-vIV(6g%gO*2+<$JPLcsA;NJyV!2 zjVI>o2J9{L3B%aC?|d}RNHQW&;f}w&Ghc5CsSE6=vAAT#Dbo^7tVo~vk3OUQ!rQK| zZ-3hTb`rmX4X2@v`|*wj57J8lD%N5UtVAsGkq5XNDa;Mi1*8j1SGODyd~4xMI%d@( zZAbuGBjylRqT)39LiQ(8{Z+A{(L@e^)_y5+p?+oC_wi#N=fG%?FH894~eQpm1Ij z`Xa~X1$+UAZ=2KJz%;a1-p1E&RrXT+H}7GVFgU_(R*^lWtcmPY4Tv41BcuPYMC>Y= zZakK8DJY`;QF8fZ)hcc`JGR5T^Rjss^R)468Skickw?{}ZsieKdzqEi zB};^2Wi#bt8rzs7o-$7}w=}F?5K?8+tv$lE2l&^!hPL4?Rc_seu}WV#2eVfJ&HRxn z|8DbGwXbpqb5>!(zem}mu?^>l*Q`k>?8V1<7ps0PwH(o~S8&dqcJt(>)~Yq#cCk8N zxjK1=ZaxYAP_?mJJTundtD;W6UXyyrEXB`{J;bp_DN0ZCw={iSUZ*6LZ&v;4W`u1$ z)U+&QdUa{{g4oGlRdlxL-P#wju=;d2SO^8vSEJA`)I^UkFOr@e01QPDJHVgmBQ2hC zrw@XNpN6&$kUpMcE%I>47;Z2KP!Oo~>d7ijo~`zD+m>6mLn5m$cCU=JOwo9{ohwEn zNHy-k3@Q`hB%D1ym>1x0NXR@8%&$t^OC3w(#*3$?xUvoN8S|V}Ico#T)P*UUD+_*c z-DVb4ALNf__~BaD3gSR@uDrUVJ9@;(YhEP}d>ga>yBBS?M3X|=&=G$i6L;>}i+#;ngtbpkP!_f?)y9mUo_+VmObOv9Lh5R6FXeX}A9@W;&sKTl! z9t98+O-3)tB-9Zm;RS%)TVHp=h@-vUwH@NPJ2yi6t3P*d8kuQtaBb%ynUbjjDDG{} zT-vDPmb=RdsrbxX<}|6eY`)mD+x@XgEc1r3eb~LvSc&+HU>4?sp%_$diN49nt>g+nyyew>bjaE-#?A))Dbav~3PTIm6 z7~X{-gJ2X%WJ0f?2q+HF^gGD-%VAkZ4cmx0*@Jz;VTp+5d zM**hq8EtZ3+~zijzbhA3Xtg5_e~A8R0WJloAAvmCeOnK@9b}%0=hb6;?c4GlvPT;H z4RHbFR;vHn_sC!d1W-l6w(=(on^d~t3SmeVqDlEE3O|YIVwAi6(Yz`M4Kt^PV zuSI)DffAjjX$XePN|9t3Ddc-r;bL{@1L#_o1{NaHm*@#OCHNz(CWqy2(D$8i8r51d!xhH0Pq6j-BB&`s zg9$?g>l5awk9thb6V(kRrKvyn za$9zUx70-T)QzmTH0|fU!WJ4m4~P>`q#~37dY?BA_Ypnj1lvXd*P0i!=0}kIPA*EC zy#JkrzvXbvx$D6i4|kKNCoe*u`u%R+3$Qq~VRh%5#{urUT3pKW4N=ZN8b-UymJi48 z7LU}FE?*;)zoo=>wd7YcdwP zPt9N%o#p76X(Y&*VbN~cBGk^yUp*vSBg;l|#DEB7bcLKCn5&M+P=L4+(He&|C20ye zM<`Odph1q0plpnV41B5AQeT*l*Hx7*U=Bhj1(t<=CO=S;It(pWWx@oRm$=qxc(Df& zB66q>QnOiCP`jt+-blE;&9%~ZAa3SSTi)|%WR1Pu)BWB5%IJxuO2O8bY!d&0oyPk>nGoeLU!42b);ZJ2nHPxKnoTGX4eB3#5C$C6hmP6 z*iOPKI!$_L33}NQODb?k{4HI-js?)10RoYw%YwXp!d6c zp})9zSx~@VAX~Qb;57N}h{W1!JugPq**iFc9+-aQp4yh4fssUeC+9=w+S2LX9k41e z$QvwupaHY5XF~0fjCH>%*oU0zRV;u$v0ui=lSz5-F;b~sIYND3)+jEdyreeqA@3BA z^Axrw+XLq2U0ZtO&D#E+Pa_-c#WSxRj(cz;^0KluyH;i|HJiyL+=^6_RK2(vzbh$Sb1R)_S=G>+)t`M-DxB68WL_d(W>C1HzfuB`8G1Y*{()JjWAMa`rhpUvn$l zgA+afjlA|YL6QZ%@=+hcn7#PB3`@6bl0wqui=5z!_l8ATU)^+$9s)@c@$@>aUT$38 zR}YsRU)V4eQwx0$_%z7mAcub+cpxj zjrbp(VEVU7sUyTVmlLXIS9k#>Vb{)Q`9HDu2e&%%1D!B8Ag46t%ey zN8$~nmzy%wsPO#>eKNXY%EL=x1YCWK%qF5$bY8@2){A0amysc1P7-DpVEzthU?8Fo zrd$ZT$SYn})uh?t2dzIW$quOat%I-YyPPV?zM_5{pxe@y4J>zqE+*~Sn;M>vekgpa|5=3erYd;&_w zcsFIplOoRw)$7ht>eI5ye7B(+g6JV+taE^QXYV)G@(kIRvc%3-D+eznncXtRMqBvr zC79X8{k=Z#PF`C4^ECJIj%b{A90ob|6Vfm4z9lICI zeJI_LP`GibOR<9U6nu96;l6)!h6M3}o>7+R`5d&!O;*IEVg@gM>D>&u-Cs{H{OV%G zirJTBo@T}21OuWvr8|e(4;x9m}Jb#MF46AO1>qLiT8$3UhkXrBPHGm~U`KO}*$p z@+s2?VOr!X^QPn5!;hQ-;LGwt8S-+KCS-M zof|v%lF8FOaraWfpTd=YJC=@h{&1*JAZUjmkB6?``+tup=IxJt-?D!k#C;Iic`9?y~Q^kV-_)&{ahMO#shJ> zhw+22kvet1M&Q(ppCQ~Lk^oO^F~X}R4NmDW>22$#^RPGyO)WSOz0E)z1e(H_oe zLADB^8I@}pnnALb7EZ~&g(%u?3zby2EQRF%d2aLjzW&E+X56{UdCv2E_T~Kv+;eSa z^{I~M*Vcc(vhU5jz_ZtuRG;g3b!|f-)Y$Y9&0>AQI_9DKc7-MB&Uks-ZxblDAN7bM zWj*t)OasRnINsyG+-I5K>aCu-ii&jbGEsA=ScDQ$Qp{8UlbwHU%0~T)-m6-4b#mat zYwN17biBD1`2E_x>L-Ei*CMNnI_joC{0ZCWM!+@I$O8Q>M-W2;i3%43{;~pi1GnJe zu54&^K~PhZ&$osOf>{uuHed-B(!M;{9x-!JjllM70DRF1ym~jZApX+AVGgs;slVsY zE$AynTR}HZs$iOgk9ITs_%_rpi=i~OXq^zp#C>eY9`ALwByQy7&?=EOBV%0Td`0y@ zAU7|ey0oKV3j8QWrCJI*{~i>DvD{MPE*svgZ^g?_I5*A0>i+NEq0Z7nR=T$nrp>q# zx0XG>f8%0F{^Zqa4`$drsG`fceeftYFjRnxLJRW)Yg~hdIwPF=|c75liCX} z=5~`y=J6hNyt}sf`*p3_WEehmrn;iz{WX{tu&?$>(1yG`y1J&L^BTavYt@N^_vGEJ zZtm#07X7_Qi?>uWP3;=-o{3_! zbZdu^cg%OSFGCjxU&wo1-4WRPCDwU{LXz(KL3BlOMcg;#_P>i0X19Ca$fBfEYEf-Sv*ovOG2 zE*|bm9nNYi$Xu;-lI7|XTD&yi`cOoaLyfdlU?UW8##maVa#_w&6vlVKI8&4dsg3L6 zF@7uTE3WH>Ko^Eg=P-~?BVlxrl$)joITuytg@CY_poWk@!ULi)3<^n;@NpY|K|(Te zk{QbkCH z>Ll-XOe0Qshcm(`-g41f-Vvsa8iR(}OimTgF@B+*CbAlqC$n3+Y-axO8oeNxYE)fX z3z}32f7GxJK_+sqbn*(oTI`QsPo1KwS9A7ZmB z;ZKO;7^ho zz!Cy$Fngg73H(2ZkU%U?-59aVM$R$DT)I_Go|{*tdxaM{Z%0$x0cHBeGNJbf<3H(= z#79)5l6TQUB5Ivzk1m!vSgQ3{2qX2idw2tUJ4CWxa`1Zm;rB!YK!=#zF>5*;`ZRxi z&Ez1H-hC!_Ghs~KQQ*dBd%jRMoIiDKC)mWDjjVC$%=CqkNX30WLic` zKC<~nyYbJEB+npddakbYZ>CRAH@m*ShMpBPy!U`}!`#jP5z93&zw}O&)wCkStR29aILR$jy|N{?XrAC$ z;`P!jg$<#Ts_&&9#eaj0K{PF3c!ODU=omn{?BjhrmP-<*@KbgO3NayPA;c+TEe0x_ zkdXG)veEbi=e9hK3o&~yR)+zuf52HoP{>IRSXN#d0o?a!9kT&KYMRo~phN&KO$ZJC z@PTq5o^&WpO^Nq@chuyGStrX@#+`vmxhhqM#~ zsUrGq@U8$MO2k4U3ge()s77#y;2}ulua~c0aO}vU1I^5fNj6~{re&C0cm(~fwT?}5 z^>|}cpfM`pf~Wln=Vx16X2gvuxUgkU=a^&jX7n9NKW>tG`|!e6{hh*-h0i)#x54P4 zVYLT3XW2ttWMJD3m^Czh-CjwO-ir|$lcj7=$*PIf&Yh2c)7E}@wCz<`Z~@I-a&MfQ z_)Ou8j<$iYgaXgn6P*j}|0%2peD4~5vY?tc%w6T#MtU%glKIUB>LW(yj-2kSefXt& zxBUDs3u}o)PVNrt9{Kyzwi7=uO!TBy>Y>&sM_K5Sb(=zyCujU>f40!9h~6FZ>Ftn1E)X{cg0V$lNh;w9FpGc_PJxt^^RQIpfcoVF0})i`I2f1n zw6?V~EU%!DkotxUe}p#iCu#jwGBmDSu`6mX&&tN6P3;$A1UaVLId#Ul!q>GOL6Nq3qj$^d7| zM3F2ftifPm6V+KZmIL++G=$-5Lt{o8Gj0f4x?EJJ7ECAfmYBd$o8O`YAli)?XS7@) zU`KmdtJ*gmMxCM0P#r~E+(X%dcTy3qJ-u`)aEO!&V zKCa=9BfoTA=pBD2cJW!Sq0`qCUGOsQ;ustJQPFZ}-#4#wP6uZWRjXWa$0lL_IrG3G z$2zm%l-|20&1O9Y(J4i<>V^j&?7jaTP&7l}+;A}_AeSisc1MWhMT_c2cO9~S_#G${ zL)4}rQCxW(*K%FR3@?jxJyzI2i|b3KH0%wTha_o}o(mllD>>u+Pm`VO=tQeIl1Y2k zZoj(P!18=RbYYQSowO@G?@{c#xgT?)tBZo`9J(@k0Y-F?=mE@x;jo}JrK9heHH(E% zzQ3L&*iFX~rc@#hx$()E$RihJ~lXaaET5oIL3L~}C zCAhS`l;QB4(O8*vs-P8h@`l83^x(;NLTF9L%Ph5SR`B1w&yTj%eu{{3D?VOFr)U9@ zE1=>w!0VJ@y2i+TT6aC(hNrvh*i18dGAw-Pv)SW$ZEy1%oU-*b*tzj;#BHlnA=+{a z{UKK5GPP@-Llv8HeUgUe>mpwIUQx*;^8MJ)Suu->&({6cb=LlsbNl(vbx>i6ai=yg za3h>O>qBn{dV2h#9afe!N9L%Ai7YOz^9#<6tXcuXKt{wKDSlkHu1i%VD)~>M5a5dL zM<(*weO6W8rz~~%3x%iUQ>9!R-869ps33LFIh(w-m`4G>Oj_#Jxoy6H=*ax?TkM5m zEzWdKAZ1>baL_t+ypfaDuqTG=w~LMkl>20#o^C<=OSVl497e5Aj+2VU#tD5!%+LA8 zj-O5+di&4mAL_5`0)z8gbZaUB5VoK^5CaueUK}YB zf~^ejdaNlhj2J`wmS;{v5{7`Z3`}v?7rYR4b9w$3DN@HwDQQ+8$S%sOqhn!GMkma| z_*n;4oq38_<=nn;Tev{SxQZTN7?k;OI*U<&u^aT)VKgl*83drr!LFT6kTT;`u>Xml-H|nBXKG`AEn|0wRHRViroZq+2X*=+y5DzTMk+6b5HRY;n6`S-(H{zCFRh zvgCw64QlfxWV!*EI7BO-+Ydj?XD%U6g()j(wVcDvg;auw(Uu7S`B5W7JVNcF`b3UV ziH%N@(d1KtDQ5oHwurwa6)0Y7dF?klvE*RzgUGklJzKxt*|P4&h~FJQv$7(m6~kV;9TjB)rOl5fobAlea#+v9A6~*PFbK?_c)8 z*a$r!T*Qbmmassa5XhaJ;$GpT#n+T%lOU|~VIITf`Zsh} zhkbA1_l_SUfPHufKonW1yH9nF0?f2aP)Tph7=uEdC4t@K!G75>1OrnUTP+pn8_zMN zp3q)}l#b~FAu3YaLzuI@CjDju26W2J`}J>wKlXk#`H=~85iZ=su%b}x0Ve^SH4=zH z?oJ4&bXkFv*76oEh0>4;wCdI*)+<$?ajHz?bo8U5}my&;!ewjtX{Tm1>h$SBPJ^VUrkA*t5p%^ z@%?!Nu|FUG?4-Zn{8oGoBr)&I!6nlW+4?!|62K*HuFtRYqI{^PH zETPUrm(hegNn8p$OEEkIh6I?ZWdZL01$LQYtPjp48wj)F15X8aY{o6O&6L!j(ZHI0&GxBQJOf2T?9GYn_K`GmmEuspg>wFki;yVxIz|ktr^6O zBQ@F4lPoB~DxgzwhMnBtId6gChep#h~fegUCVBn$%R{$V8t6|%&cR52qR;5*~gy5i=S{G<3a zWK7=>Q;h+57mHs&poa@fTWl#o^#Vc+&BcF9g(KmhR@A{jXs299p%-N=;k3n@mX27x zKJ}gKwd0}PD=fwj5LVN69`HHtG5yrPQ%Bo#XLT#u79F_{lc@6)KFV?VhW#31zIMW% zlDi6jiUN2}!RC?rF_Dhn5^ApFE8aC`z&d49uuQLGqg|$~o zyfq?7Gn7=W@o0$uko9rPJXTXPLec`9=Lmg7)8lzaO@R(t+i)3l+N^u@?t8mrCt1UQ z%xuF;R*S~?irQ{lKHts&Dm-n~a6mcBVR(^lkmzRO@1=GPe<|lWj4aZ7!dp7T#mbtu zNsTRi!rYMVk?80<{VS2D4OzOP{qjfe*>TfP6`V7?k$JCp*w#stLz<&YUz?OCtk@lz zm}og%?s)b11E;6_Z7B~%rI%NPdIpYiZOB>~(lu&i9$#I1`<~L74X2d!!u(PF`pN3^ zx1TLt(r_*Wv=_;hLBDPVxC5#(d1P z2-GENaY?M0T(oIk!1lsYzlL1p(tO)32JZ_q59zE!%rbw>I1ikwr;;j9fKG?l8Qy zui-A#6M-nFENvvMBXl{A+L4JqC0j`Ms-a01PlQv{jEL2Wd8BqWv=MC*Tu%sOryy;B z1Au8P}rM%XztuG^VZ)DFGBu^0`&C(EcbyIk8lso zjCTJ?dw!!mv2!#zS&L zayFyWFVZFgOWop@9N@2-7+NcIpfj|&OU|E6i_*HgW8JN*4b>q*QT8<^16qQeJ8#`? zXi`QYXwUN&P!OHTg&yR#gbG4U=e3tkxpoivOZ-nNtm#*dU6M|P=4iF?2}jUBaYOD# zBx(D^-J=`chHUP0G&Rct`1K37UN>|Ae6h2s`2Yx*vRftyYAIPwB*NJPj4KAAL?#e!XY5zvahziPxn9P-y3QNogVwJQ0a9gV$WwgW8BJ&{an>(9s zeQfxq-0I*~WYMWjL-%(8D4+xemC}|nYX|6X2MaV#jmbS8Cil8W=#&0KHV6W4m&a8x zPD?#%v`ON20^Rps5q?RiC`mjFag>LWj$gs>(lY;Rx5dj1j ziwlwg{?SDpfGe=sKx(kOKGP^;Ukyj@9nLh_VmY!IY2;7as{eM-rYz^0W%5_`2`%q%-eiDcH$t!-kZCPGzSP*m)#?QN)BZACgJY^HuY zAy$ArfDuYhat?v=AD(*DTew9eZYDI)(Z0E+M_3MDpROM)KA^M^DhJ`M&*LC9NJtNr znWP%z<337Yk$BcS!^T(Nez(Q#{f)Ci|L$9u0Z84EyEVY@=759+Gat+>(77iJo3>}g zSyA&zclr1-^IY{AqGhGh5}rF5@|(B4LhTDT$)lgjk?J&PfAWc%(5iNx_9z?%1LTsN z%Qe%q+6)(zEvi9rwN*c;+b0_rcK_q>YtiT+!1ez9_T|Rq-RB*a^n)FNGc(VHheR9- zR3h2wrFleuUQG@<$Gh!r z#FEm{eY9JvT8toE?F?%0XX{Ta6>U2*z+Q$d#Ush`MExC>9T@=$>Q<$k&fzwi zLQRKn#(?9UVe4yPzvtNPXN~mw(5rpRGXR@Aat{~eXk>grX>Z)Gi~+Xqo)anY@eIUh zSrj7N2!%(camh&9;3XZ^=P9)!$=Ni_FSBi&_43Sv=7NJa7VrNv&%wt9pt_Ikd2zeF zF`~QB!PjMcj$!>Ch`9qG%Z@TfnFkcw&t=WkCA*2~>;eyuRIgUyG+sG3nsXz{uV(y! zpupLI1gU0R(y&ZKha6%S+XU$$c z(xfT5`>w-Z+7ojg&Px)l2w9+Y_+CCBS?5@t+Pmb=*rp?)kD}K4*xeY~vN!V1)TU#h zfLhd=DnsH(+STPGI1gF%V zpc$OtI1XbebCm8oc4t8o{ZHu2KF|}`?N@n>n3za-R{YW&YTy8xK|vtUA?NOlQhSGF zXhYHDPUA>;7gs`oHK-sZpsdbm9}q56TkTos`AumbKb4)q*V<_|p2sgKc9;D#u6ToQ zQ*L)v{>Ck4jwb8+pWoTgbgjGEA;`s^&M~Rq_wi0Fpg`9EjEEC!OKwyMd3U!r-3o1t3N0GH z-qbC5*j+t{I|Gb9+S&MNg6+43iPj|tm(2{HmPn<`8e1)0XwLHO&q|{>=@QF(qm-5h znjUngv70g+>r5k)-R>T5dKTK&7nb4VYnGSnclRns8_IH^Ff!MOLHWE~q#M7PT42?( ze^K_BEm|Kq6S%7q-lBA=&NJ~nVGr+ZTo|L~eqCW{GxDBUl|UZ`A4yjoqTJc!b$72e zRfl#)Mb^;H17?Dhop*0HHHG$I6H|f|>%1iTf_I2wd5jsFlRC!Kc%ncnF%U8c{6Xdu z0%y6PzvYl6Bw;`PKvTJw8EtZ5syJ05L(Ll6lE^Zt<$E;KI~x+V=5Iqk_C=dc%`#t- za^ddlrjF3wzF1RNbBnv2Ib51V>zO&XdxuTW-Iy+V{dM12M5LRoY!@BKj3`ijz!L6M}Kj8eiT505DqqSSGAW8pT z-{1M+0XozB@2;GOdeGO;OQ@U><5azS8qNG3u4BB5dk*QBYIo11S==LVOzbBH6BDM$ zmj|2^?mADkO3DpS)~N|E$Bwc7i7(R~`84-h`oE3aPGS$Ab^< zZ$cKZ7IeO51$UmI>$GKeJ0zA}P9LU*O?){<^i{ClW1i)O)D`!}Hyib6Uf;3B^ND3w zYV19?W<1Cf444pW*;?kFXR}q0O0p?|LonP1z;A-@B?fO3DK!BEfmnqAa);$2ezumY zD4H{!ZH39VkeTTd+3=irS~T;9(L1i2ROKL<(R`Al8-2E6-9jt-{m1StXdbl*aD_9b z*Fom&=Dk(T6E?w}6!64R;Ktx71h(jJg?70lUEn3j7&q5+M%muxtMa*2RJryDtIcK( zix*n%lf~GKm!Ug)F>zO>&x>2Gu*@YC214tJJ(W{N44eA!Q#!r>#k~#9Q+iAslU)E7 zxPJe~d$G-~Jr>bi>=VoR&7!ms8c3Z5;jI9vfG=qCXJJr@jE^`QxroptI?!B8k5tEU zJ#;^z*`vqOaet9lkhR-^VfPO<&+ZxSc(9+J8gDaMs69vTM#8FFh1|8|MVs{j{yRjv zi2g#HJ~^usuzWr5pKM;(Gs^K$(d?k%HxK-NAF^lgN9Alqfh`2l3dV^|ltHv6N#B7t zg4d0%mUyz8X^NLO5qL0)7DzD%m7d;aE!Bqz_po#5F zId_xb47X=b60!X8emc59I%cDW0XoRv%@}&R8BOgw8KmKMa3Oc2<(zRNEDj#L{}5nz z?HvDdnVU1h@8IS8)y-g~Q}`gnt;8v{5hky8U)f&hc~m|_I5a*vfOi|5EUMwVd_n%~ za;x+?@jJehP9>vC-Mw{qORfyRt8>dLoEUX=_ojn4?@u2aLT{Slm*F$db>x|YmG?WE zBR9E3XZg&(F|q|h>_3`mOk4`sgeX+RRU$ubAp_1m)F24F(F4&7<_ZLr!enWb$VjB* zO^+W=nY4zL>v;3Lg-F9GF`8YC%vp(4*9N9HO#+D_ckv!)W09u!K;!L>9#6*;E(>yK z8^1KW2av;KfJj*tajC*+@QC34NnqCpqeM_I1qo@1jm8`ZGtiK%WTwcBmDfWA=XBL2 z6SlYC;VU?+ykY^<-x4Ce{WiJeJGUNI2ny_u-YV8D7eBvsReYG z3qOe8SmXt3%R-9##(C*Ib=`53%gYM`=-$s8i?qxLehHjsDE94%^B@?=<nBm@;)#Ebc|LU^d6gc z*ze)Rx34z^e!Z5lqHb*OVH)~f8a72DF_I9a-X;`y-)jNc&_DrMFK^RyAVq&hlYxmt zG6WU;ppXGyk2%HcWQDn7Z4H--E~|%r&Cl@385noO5FG#;-hvsb5Xh%MSPpgslE@6$ z7z%DKp9BCo2=gKeD*U}AUMT(H)3>cXVb=?`tb8&q_(FK$(LVJP*Yu zHDrL!U<8meNpYssQz*@`a{&0K(Y(lb1NYObEkl1ri!#(!^P9F0Pn>exLou?PUqO^} z9`B64&X+kS>`ZlfG{l$#!<;yDaglG(_?t(X9)5iLt!Jy_%_6_f@js7nAKgNxgvec+ z&`32X7bAn`oa?)Wx<8c_G3I?cB*wm+gZmO@0-&v{bY!~WBdvFW&56;aKC5m>*QMJ( zf-zW#kE>|$qNThm+zN)v+$uWl?dh13j6UvlgmCW<*dq+44|9KDdms`y*sR3?JQt9`5aEu-v0^-g0LcMv&kGI$ zH?LtxQY4>HpT7B#^E>m8DUSDC{Ko-;?ZHRCyrV~aoLMrNS;&A!X1QU)TRghn-GI|{ z**7;_7R&b=xjF4?_?R^}4&7FMUcUI<`Qk&4fA3vWH__0d;E~@u=||mFk9^j;+MW5+ zf-$I;zxnGrVA3YrJ^i!&QRF+9k6G6Nbyhq{`!9{hJKs(Fc;foA{($63^ZyzNa-@pk zQl4^4YHSi<=UgM|I55<&LC4z~KsRl4eMIZxOg*}oqjHP%-&;5IIPTar{Pw#0shrPV zUD9u9?_Q_pJ$$~U+CFFkXX4|d@8*3x<5=PH$GFMI{#x|-?7QDSo^^cXvLR=3{a+X? z8X|NQBm{6Jp92_@YKTXEyI>jZ-`?K^}VyoW;eav&LaS0k{f9&Xs$L;STHiI6ZfUiRk4|TqS>?AW( zwpgYm72v{(sf;Se%)lge1oA};z9tj|$z1cHa4naB_zw%<9;pNjRfYkQ5~3)&&L{YW zeaq3_$3NcD^kz0%;RA3CBQxsvJNXtLb$EMwr}5w6<)>{%ZCgz4xV7){@BR&+M`g5} z9hRU!{MOe7)6gu3B^l$N3~kxB`R>;y(@o}%M>5ty9DW%jB9<}B(NaoRpR`6#c8e3P z?Cfu}nU#`F&RJu3!FQL`+HkG&r9b9A@mw6UcuQR2U#av|?)xjOQNg-Z3pMs8TBmT5 zYq$%atk9QzD1TdeZc~us&5Yll*tPui@v$SIs&+d5%t(0R*>d9J$fTG4e0LA8m|a3m zyW$CI$$@hvSrr{wLzkZz-gE4J@{&=1-PtZYGs*6-dLS>4>oG%CB6L^S24-J;dF7d7 zTTxh$lUwG=CyVHoe?Pu-Y%dD$bfPm=mswCI_Y;GcxdH2bhmdl#~>$E0f92A236YtSbI0&SO03ixLh395L z4<-pM&iULv5U7v@EXihQLIwi6A1udZpd~g$n}_sp8?VKPtNcq2!i(AL0Hip@4ulPNP>L*gYKown5fU54Akp3^=N$ zAi8iFE#z`REznRLLGiNz()Iwn{sSxlV;NvQ`f!b4@Fz^lLZBuPXRmrj%hSyOoaz(f zI`vGJ8{8Q4fa*>-9s@xVe5b*6{9kv+|JI>;7lAaTxY(=3eyi$?74Rc82|;~udEsOr zI)P<`5-bvEJSHKb#zG2Y3+x^N$GCtIWM{2-dZDH2qw2=k@gM=(5U^6=yYNfEd%%29 z<;7@2{g^}ovYUhN#KHzpd?DAA_ki&8L@R!d$Z`Ll?2!cP!7ZXXLaH9Bp8+y z92g09HJ)SxUM|uOkx2OcunqwcPEE!ll;u;9P@4o=?<7NbbJLNR5SNolsW!Q$M8``= z@c;ymH-gEdEXk~UqoxT>p@wpP{7NLqMMv z&Byx#_}U{&fA@maR`*g8>V+zD1j%Z7FR_R1PFU5<@4t6U)=|(2^*zY^{dV}1nvpli^ zPmcMR2qV6sOeSjuZt4a#K)`Ybe+ti)f(ymnT(`H^$|G!0z--^;6)N3TNjm&X*Kwy;ly95 zMOg=Edr#YDS(@u6~H zQ%m1lS^Deocxuu8wsdlY)#+X5Jmxe^;LK#M*Koh=^uDWEz~7ocKXLDp$CkUbLT~}{ ze&AQgz#=;b_C2f`aipVJz7%!=+87ulC%mELp9femm1rXpPE8!=VR8Im`7f;_!v5o@ zL2xph<^qQCmXN?j7?Klw2?~M&HY!um4NYW*G7DKS;Gpi2h874XR%Et4%VWv$3xJh9 z_7j|p98Lyb<_IqfE}TKbP(y%JMZrskM*_VFF~hK27QkP39=}_@rq%9~fWhYq2?5+g zrP_I{HAyaxe0edN%w!gdtVxi+TOggJiL{F89YLNqk2jTXZUs~W#FYat;!4N=4p|`{ zWMn97gtGy-T)Aic@sH)Pt*)OeoFv7tO5B~)3Cq%iMXPe%Sd;_TQ;19&`0uCiRCiFw zSPsh7(vZie?)WFSg5>$Fc+1v)>H zlBdl-aSSAeChWZ~6$*&1kcv4+EK}_k2s3EwCoUmP*bhXrnt+uA-esZ|G+{Evip?^E zrJC7<6;Chmg?qGYVXjubUIk!%OhyrGrkpRI=6AyG+0oW{VX(b}lFJ|dhUJ`voJ0i6 zS9OR$2r{-Qj?!*5y)x@Cw8&gx9NpuU({`Si`Rwo3MPZ|3hWvn?1_44tK{JdsWSoHW z|JyDVdtp(IX$@D$gWSfqz|JTx(1qH01yq~KAocPu;fBV18)CL6YkK90;Ahucq45cb z3nm!#o}izVw5|%9@XhE4p@3h;*ME$w1p4q+e-17&7xWJ@@ixfjfX;ba8Z3%&qDd+gb>*7aeNog^|dnU)PuCRE144gmQm z5X%P>4cHv!$1(FInnFG!F6X!;*p+%%eUe-(@!V)tW|o)YHqC}JhS<4~-Yn5}5o`#X z5@S-kZ(zpGlXsu(M<6VaE)wCHZ$8`y92#w;mO*E6rh@QNPuA7vEb}lX?cJRi3GVx8 z<7yx!>EUh2=$s<@d2fjxkCm2ZWrzAaL$->goAyT51-n~Fm+wFM^jTYLc$o7yGqaR& z&}Arv?QCc0|0%Qo97g6peT0BTs-R2u6lKD4y-_ZAvB-tV@Yt`|qgb9xwn}#EuI2TW z${U>YVkEgbfnOKnhnt3-rnOFvd|XR!9&}i9EEXa+i7N$=88JZ^nqh2c{V= zwUW(F^;&Xj{PUr0`@&{^8&(Uah$R`Ug8}Kog4n_cC72XJlA#0UvyPma|J(vr2{5z8 zDmuo`@De@>n>YAftgRpeLaNq~()*`an!PMaUMzkVF}* zOAN7M3(5#_QpJc<0nhA;fRRbO^M6;*4r2>M{PBWs zaGArtzvTU0|2(wqdf3W>ELkMwl&X`f{hL||8iAzD!c;KgtqH8n`3xZ^C4Yc`fto-u zvVibDL>Z+3DQ>RDfoF8b=M)9Y#Fi3)Bqa3BW%EBgk8UeH;af1C{&7S+2lD`iKow8~ z133;Eq-!4`9(;Kj{4~5*1E&XK5O@Je<`|yVezB|V_9s3&iCKsx+yBS7<^NgbKzpo8 zX5NDh!A6)SmYEcvZw279my2=WXHeCFfRF%1z!)sX8F3U)CCMOgz}5J1 zB1E#JTuTASRD0Fm67v&IF~;Rvl7yPbSU7}vO2Clhzs%&@?m_P$P!fSnt(6B+@R4I-Vg*>oY6Umkm?n6tm?eTPPQX(OmA& z|8?gKo>G?iWL_||Hq^H%KSdP)oGjAmvrf~4Ks&Fy%&mcshLPh<0eEODCy~)RQAF-b zqQ^)~q#7MuCaJvi>%;`*4j+GS?c3aGcbay*T4m9i{%261%dH_L2BPT`4qER&^Yleq z+vl*@Z&S?x#<%j!QLYVIPC(HlYlQsHD_gn=BSBRr$6waH1S8Qe=5rFt*P9uzRfXo|v^5#zuZwuGRs9jH=* zN2E{0FM%aC!;o5t!>V}G8bNiQw*kvPrFMneh5leXWrV z_Zl1?@saq-xy(`1**$S?nVC}n$(yg6#fi%I?wxb3B5SK=_zq9c%w_S*!?WEgEZ^&d z@A@_^^F$|bD!!2_d4MTX^-_)YV)zKEj=g~#us;O=B=BDl8A1ep8#M4~QqyZsY+C?6 zCH^w35s_RH{&9g1BL+Uoz~kX4JrvU~ov0OPp!jWSsNFeoiH6mW(M``zqSHGY5`A?_0#ixT7jr_+DieL8-wZvZe zR5_8Zb5HlMh7)2rdgNH>_atp$Xzw3PG%j2tEs>eOo&o1IuZ-fYa#{uRZ36`V5;Wpa z?j%I8Z9u&65av{lf)<1j7 zH5zx#nLf-zW0Qf0Ah1#2F)Sy%b_8R|@Z|F+i8pzplTY`Ilbu^8EWH;pe`=;bY#!N_8@0 zi*)6{4PG4F;0TsArk_Fi3#CzLRf01GwY2z7umg;ML2`lwfeTg=C@*UUC^Plf%724j zUVpzb9KI_j%HgBHKWhI4jZz5-ih6nTz3g)??c^-qDVGEQ@EHs`hkF4XhiFNl4zh}H z;dUohxW`MJa#5~svTllS2DJ@sEq8?0Z0ib9o#f^Mn$&9C$?)!Jmc9Qy{8G%aS^yuO zdDa=oxEk>&Fn?1aT@t0CAf_@;OFXE^^4Z>^d-{{mWNt=jCAnJ9CV(CqHYCS{06XDt z`E-h$rQ^bJC9EzR^ZFCWMNO7AX=bwO^`CznU%vJHliz~R7QU>19};fM{6fXcCoM3P zIW-ERQ>z7XdA9VArM6{;l#$(mXP$H2A76A>N|czF3r$j75-)R(_xwm5Rw1m?h?F?! zPq$vAd$wFI6|J4u?m@43aCY}Wf1mq`3bOJ2rq9=%0DU-U$<4Ed5c)f)1@OXKPvnXgtR4Q3#Kw^th0>6i1VRsnFliAMuFdt z3*x2P=QLi$reo6?LOCGR!{-+|d*mSyS4-h@Zr)tGzrxFB6>K`D%Lm$?)ef>wjF8 zYGn_Vz~_OT(D*XgA1rUNRshotZx^=qu=)Gq+j_IBS<9E4zwm1K!*ics6>Ru%RlI_R zcOlrxSmF;Oh(aUIBLe2s;~kJhw8T-IK9oKo3YsogD4TUG2G_8w)~z_DpViVUCOVK+tPeY0E&Fgn-e*jHw@KMik<30p}QxUQtn-+HyD zz2bB8H;GKBfTu?woq!jSE)}<6WnPY7<;C{b;T_*1GC@R8P|2+hH@2m?3?T!hfwegv zdP*>bb%0<=SC+Ilgm-_7$}IBrjYR2{PupAZFH@kcye^!r)XQ9*@YyN0xVY2Tg5!Xo zTBYmrTc<5Qj6(#V7u2my98qnFu1Bc!MDDn`wTVJ8h}onG2Pb9qqm0{W05C z-n`-0a={tFBQgU8^pBgqK7w39l?80Q%I=1EHy9ZZbY!gAlM1nnj};1p2)+=`am8$q z%nhLa^geJ9L2+p;oWPp`Q)w9_k%8c`zQz?$Vx;yxKC`4VG9cHv%Ho6Mix8Kf{VzNP zcQTU$KVcUK8wQ9;%q($TbtZR7)z}Y)Ux4=TnPT$!zgQM<2zD;Jml$txf@?1$gJjG>(mPkorPrvB3A*M%Q^zl@LFv{lHi$jcc_aexWJ!a6X_x;dgS z^r{>v01Gzu1HI~tUSayyNAuQ>zkKxd(+>eK9Q404$AM%ZMFw;#CIPRi`S_6w=;GD9 z72|UjRlfM(39E(=ldEXA^LMLWe%KJQ#8CKQ0*6zH#WN+h#g%KSE8JT&5(azKD1D|*6#B6;sZ{3BLHgh;3RS)C`VjTSr7&yj(edTpG$g;9(Mb;L!uf0t*L`v%xwv3R4?vFi&^CcqER&DHoI z#!({RHf;J}D;pFL0;&YwqgA_!(C#nOolh1&>kOc;c)l6dap21=XVRmSjAY4du~e9X zs4{?i$Fkf7{M=<|Ga?n5NSlPvg}K@?22t+JbKmuOSNz^g==d{Y?)TG~FY4Cg<_fqN z#GJ{@+xGj~xxf(BxPXA;SP>+vH3BU1=fnEzpTHRa8$j=v)S zPRi_M)*nydhj45Hs>^Utx(~`dP807Cpwv)C@LaapZ(8&a-5e6y}& za>8E(bmL=Q#3M318K7zk$Op3oPKg1iQ|&8y+lISWTL5afFv2(XLT#lO$u)A-uZb`T zfq&=&#O#Gs!U#X%%?R1|4O6RfR-ehysJ4T5ReOu|m=L{! zzY`3w)8Ni?kV)n$=ZnQvK^xt!4XZv#cRcvArjRQWN_m5_>d}|Ag_nO63~a>wbdck!$m-|LJ%cvElpG+Q-R(XL9gxlC=yFmn!j~dc@Ze0PvGp zT^HDUZAGPD`{;=G-}0vJV@IQD6`H=#CIJy=s6WA^r}AkSuo;jD^dKA?+tCma`aM6h z#y7}5?^yM-4qR2B(!dCvs@^>2{g-g(!s6P_AUaP2_CuBC!>bH|9e%(Oqo~4NKg#OH zCtki=t(SQ_JUaHTt)SLqgGVmGq~cO;>ky^nKY<2>pdmf}iR&i+Xs`Q016K z&Syuks+h1Mj#MIcBFuMSo=0;<@lVID!)#ZiUEt}gJ4gWBs_oValscku7eg$^5JFzLms2B#E-r6(m^Lo!XgOfcj{1{!Z zsFpxLT`auq9iCU*ZeuQJ=~0O`RVo=Np(5`yCa_-T=j#2U_}T^ylZc;VIU z&dm|Jv6)lwYLkF8nR=^A;au(GzJQ>9_>yZAB( z=35X4ysiX6<^ca=EfRgNHS5ZXtSsz;N`|eGH^0~8z&bV!0pMP>A4>Bm+OVkdHM9j` zn?t6Y7j-k|_sW$Yw)Z+Yt8R>0^9_Ma}ADs{2M%Ue3)|L%a6% zmahG)wjkM803SZrej&UnCKTdeYevEVNgvTB!8hV>M6dvvg?-CN$i*Q!Wa{vkoK$p{ zjvrsD$#xG!?JSyEH@xd$Boz16_H2u`;9v_D(^|CI$7J6n7h9^jR?ved0egL~Xhr4Z zuH5h;&f!}>Vrv-N4cHY0c9KN26h+oe?K&0-iNcki2K6Gw^j8I3ls4WR8;s%;`8*at z0qAWpGmFpE{n~Xl^3``Zw{p-&Bq&XsN2eh{|^7?%NV!$BhsGG=ti$kf=%;;y>ruHwl0?_Fkn z=35MJ3?m@71gC)z3IE^}d<1$2ew_qv3?5De+R;_k+gRBBqc3^O{2OEHk90kX1e4_d zgf)(63*b(IRHBMMsXnty(A(ntY3jFe&@aBI{%n^g0!w|Hz9xRg2 zM&Cc1(ciPSR^AA%zuvX;&vA>6{PVD4&BQl82IDlU69Y@93>ucX>RH-v;%=ivqz#Ry zXt9uoxJ(q2sHk;!a~PRA(g@W?c75+P>o?zKcr&H`e%IT`kIoXbP|0N@^}+gs00IN+ zz+8?g6SkK9n)xze+x(kn>*>m_54~RszyJ8*s!~AMxw1wC83`W*Hpj&>eX;#32VChh zH!JHqx_Tq~2Sq5}c^qek4WJM;O0M4zek%uOddZ(Tbp6ebu*(CzKb?`Ql_?VpKc@OH z``PNhUO%Fg*i7nt)b;tfkuXvHigHepXvp{YO#B;f6+w#s`-aD*TkvKBFSdZTyt+$4e>|flB)*)1s(932e?dpiN4Z z!eI${LVd|cfL3sg3M<#HBT%AtsYb(P*nbLQj$>1uSxy=B4|hYjj@DJoV~lKc^Mzk{ zJYn9g*j3Q{Ilk1SAw}ucXI-SbP4qM|xYW7fn9{osNRQ-V8(yDxLb|IP< z#p8D#yY-?0;O7yL0Li6*^Yjt4c>_JTGou#o%)3?J(5;M)n%ZxE2s%PQ8!Q15PEnP&f}kwW9y|h;^gFuC z`c@ZB7%;kUf5x4WO^3Q4My=gqS2wf^Ns&v_@$P3)>-#5V8T;+ayJL@pTK{b(1a!e( z!LjlUE-=pe!oK=Do0|%|>-vIS99&IPA`R~fz<-*9up$I!A)CP3yD4hZ7HIOJ>E!W# z@}?Kv@B6}CoNt(QCEw&v0=>``6}831*W4{75^_G+nF0=B%>7c%l)P?g@9vE{#B|Dc zrhaMby|+$oW^1;k|3S0Wu2$-a%k};MyF*NAY{?q;pEiX7BH6rfiPJ9`6D=;J)ZhKs z^u2qak9MJ4$?>Tc_w<@IdH}wgPl1uGK+<~_%{o1z=wFERu6af*GrWp$gR;-}AYIH5&T3B_JwZ?)AR@N=D zt|hJwtSA<+-uL)@p8MS2?_ao=*K3B!lv6(C{VC_n8R6A^R)tqOdcE>!UU7U-FtT2C zEhA*Y(#n~ZL7v`Tt6NpCydU|>uzdCL$j{!Um8+wxf4mP^;-~TfX1w;UwKv;JZCdjE zNgu1SeD##-BlpL>>Xu!SH*|c*{%dwsU%x;7Rj=mx7VuCAEdoi}tKQk0^4?DGbal;( z>JNBlp`oMsxX16r{JKhhUnaE~%$twv=BlFCcDvB#L0d8?dwX8Yc=f5ZQ!ey+(Dv&( z^ZbaQm@zk1>jVqDzSTv0j7vP?+t2$7xQdHw9@s)aBwDO>VI`P% zPHu}LkO~}w@y{Zny0|7?O0JWGA4hw3*|L7r#r+TdelbJX^ihsTM=)s#;Hsp4jHW}T#R?c|e@W9A_bLZso37@;YD6qL? z|4`hxpxM+p!E@xFgARJSJ^axav0>8E4VN^gl0la`nI5_|F3molH}Q7&FC~jF4SML) zxF-8Tp5dfY=Twe4*WDX8WMh)`<{n?5@00MAa~p7q=oNQ1yt_1^@2a#LN3I4X1^ai~ z=ymx?$qUk&PdsaDwoB`TWFAzL!YQ@W3R9jg7h@HrUD5{7_P;(3I$Hp9bLod5Dj^jh@3^e8`98*T1Z)22>X?!;Xy z0`bg)YC6@qy>`sO;n~b6JBd_&_%1gGH>Z`7we|H_J8kw0`rPi zV)oCIy4kPXidDpy&h4}R-_`3ji-D&mpF5Ynm?tm&8I^=YMNgxB^heI4r;zYcrf z{=}-!5i7Ub!{qvr@yESStezX`)xu(nh=3k@Dr69}aFF%L_1&+3 z^V*b~6FdhWnf+ z`oaKs1{K%YoYkMjk1p){eOJPnNQGOSIPl^^l z9`DSsY$Jnl^--$y%YYggHc2zqb3)LxtCUIeW={y5>yPdTGM z?b(b^RUY|MNFzcAEH0noUZ7;_@}vD<_D}NB zu7rO0+G6S+FCfj=hqX3J+Zq!1SBEEyA?2t;Aa%rF-#jUPqYa#V0^xu_d9xUBgRDH% zs|L>oKJofb{$IE%cx;G6_$mDk1&`^rcQ(dWJjs>!#uK&{lSpvO|5KAU`T6r#fOUno zIrCFb{QP;00DD3T8;!C2SMZ>Ja`4TK_tX0wIr;62z5BhTqLXi&Nk9^=>hNh@{>j-l z|GsZWh#rFy-L8N4L6btWB&4TgZe8Z#k& z^5&1u9d~tK>h)t!?!0MupY@+E3QmSQdG$Vf&QG^TMepB#{huc<-oWSJT`ay@wTvVq zCs`mW;J1?!eQZ_7*OG=e%{g;Eo!mU(&i;4TzdUJ;?60@QR*4RM{d+6Qo%hLN+N_^Y z-m6xyFo0hz;YDfXgK9fHb$jcWyJ*hY+X?&cO&6&5HWOU@N&vpL$D;OclZ>L-^`m=M-Fkm%|5Jf^P-lKG#(1a~b_e(i$bNGU%Q zeS+7lJm7^<3!xL>lYUaSHOjw>pALK5DR*`!k<}fxZ140oqet3-xgj&qkM@e@*IxE>h%~;YQS;-IQ#5 z8}p&8-=8O^rv7~DhM->mWi^G0_0QTqADuhp6Es9aHApeJ+TXwoC{OLQQ^>K-es<#R zgxvBuwd0Zc?DS9Zv&(O%V6N#FHu)!kdJsL2DxGFgWKuRbH7=eV;!5CY^u5S z&x7&klc46BcN=o?PSWO?cYgU5CdLCfCFs2pSIwi6){RaZnT7X2<_?)U|HDlo$!Pu% zIkj$lM*pLO(qb1xyxZ}?<6!+s6qH2@dP+y{%Kc-`84xXBBS=@ z=;B)|pG|xRt`Q6iD^16Q5f2-Ii^TDYZLed+iHR2)8V-H9(eGUs+bPFf;B*ONaoo*k zpFc0c)jqiSwFAB_Jbw16V_()*+(w1MpLWTHegB#7GP)UqwLEO9^_FSy*i>i!*tah> zFH$3~OiA9mq6eMF+6iegAvq5F+nT@AuVM2K*}jgq9bYVdckaW#Cy>7v= z$}{_pLkmJ*ta>c|%dH3C;_F~SCraP_nfv6^8&6a2mJ>pFgtw!4qSbk3UH#2_ z+SA*I-u;vNe9pVuxnE9zt9L!f@m_oVn&!UaPPV$U@ z=oy%0uc4hWsVCdgSKm(N5@>5hH|*zmSQ2^F-SJ6@pW;48UUKNXHoF}WT}?kHUjI|O?p%NI?A^QE zk0*kZ2WIqER+aSDtRA<-FFJl|`S79{Up}W;bJW{E&iVVdkORYBZrwIw`;F)&*+*}` z$c=ka({xEn2bF5FVmxiy507f{uAr02`wyS`eKDOhy}&wewhgvTnEx6qI>mnh*XXA*|+ zj)y4(hS65VWJ(@VptWq$4&r&Jz}& zI{WDEyM{SU{qvM_WfKZco$J$V3hblt-rV8niUpGju9l`7vfK6w4)l6BZ_?z8-;OyQ zGxlI%Q|KT0eQYj|uj%i%<4p?Jw*KaJr=K6`cTU^T-(l-DkL{f|S$4J=W;y%KzinQw zY>N2keG)77Ts@ciZ{L?&nsgt5g8xw%Lbf% zJahnQW05haas#m})ShnO+ubdyYgyN>p(#7B-)GM)EAN=F$j6tLqUL#dA)l2KV3`bzTI!_Tr%5wTEVF;Im~OVU@E`K?SYwVNceBR$CGdHwhUrw2x?tWdhD7Jdvp+3rix z%BpCjFj_S)`#A7qhcBxTNHXm=SVar37PYoO3$CFY)aO&4@(p&YubjfE6g;( z7Vof!d{Y!`!KV{SMgIK50i4;6Af++nRj1~)ALm;-i9}}S8V4F3;5M_Z$GJAUSG)8q zzn^>cVRxIID;)zXm-QG^l+q;I<0e_xrSe+1?}3miYg%BRPTta8SAD$JY(at}^;PfY zO?lCuJ9(}3y3p!Df8ePWcB`$0n6!4nG}q@u%Qu{TVDTH?AtBV&{g85?cz`XhUmJa) z+k@|3MK_mzj6K=ewC*Z$6vtk9AuyP3gLI={5wl;h)Q4bt&+e_s4t z-wEscU)=TJ`m5>9NAkwb?K+|OiwYBHF=gNh9Hv~0O&Y;~9j7lBCjr}k0dT0xiD6C3l%S(%BATkYCFtS4U_DWkJ1G~^UsKsX6!vmI^|IqGD z>adW#&EB`q^HPrsQMt{-O(*_*tobu<+UK5L-)%wGA+_b8zwYlzN#!0-`d-aMiHA?VKf_M$zL6fZQu*dWHyg!zN zTe^oAy_6?~EyE}4TG-4an=SJiB5T{0%Dt)MymOdlDACK3kfONLJgVVi)=5*4X>&AQ z0{y4)MRQZ0x23hdoz^=rdu^t!d$(PURcm%{pJyM4ckle%HrT#AS9jW1zd0dKsudH;0`!YZ=X^kT^^{p|DR&$RgS z9g6yvrYDIPI(dkC5@)NDsMG9)Ax|-1K;#x8M4jF!8Z*M@VSH5QR4_g0b-VX1<`jMo z+p=xKZ%2?xm`410J03hnw1>}hSn&~``+`@%3!?C z)9sp9y(6OEhrGn{$bzp+mfHDaV0Q}1;{OQwxY}0Nm2aQski0m-Mg%kItTWkLNvw^7 z=;CRAL|u44${SPbyg#iz8Tn=VO5_=Sd_C&D@2B-AhkV&_r$BE%6w?%!*!pM(@FUIg zBDKo7%5nDm9z51mx7fz_{n*ap(95M!1On(uYNwl13xV82eHJ3H;}{01T#!F#1Su3278vbT~1 zTh{ZEEr+T%&yBvb>&x%>*8c0I;%5ds6`V1_cmH}vNjGwM zY_a!byFUMOk72T%rp5pN9?_cq5^r0f^xG1Z>Ay=SZq#kFr`vtUp>FeS+#s4{rAwd? zM@&r3Ovy;k?iL;!(G~8^z`>DzE`*L4Cj1x_5-R+N2od&?QP`7V0bK}*>Vu=TP1f!Uo|X{EHJ>6fsoT z4;31Wb`8O!*wN@QC<`^gTOT%Zgdb`h6)=X7(ZW$wz#I_aFVT*k}dTExi5w#;%J z>t@SwT&q@!)~)re6Wx>As61@j;?EO*X`UHgQOeME9_?*AbnyQA7wA3IC$!__PFhuv zI;!)SZz6n6pbhNZ2CyoIBryYymqu{)|koPCXXFIE^d6s3Bmf5gjtC>6Q@qH zHB6o|MP$=ZA3G%{DaYtLwd1r|$&;r~O$kU%Ps^DxD}Bt&oQ#2)iL-KM`(^2~RXI7i z1M_m`XXw~5v1#v6P(jO3zP{B4IVHnY+(4%fmwrcB61=_ z2WyA;4UHP+9hDWGqe~mEkMSE37n?LPz!W!jR0imfHfH>{fUCpqZrk1dH(Y(^R3pUR z;TcKB)HGv)ASVNjQ;iPzKg>8WJvGHJ)0iN}uR#fksVQF%k`hu9>_l=|rZL5kAnL4& zO)@A4B}`8=COEk%Ji3G$XUY#|!wJtH$ABQ@P6#Q?M;b&^pmEgfP^Hzp=z7~PP2B_k4yDH+Nk z#*B=a%7m0j$|%Du<4mL;$dJt0s7#a~9h#6jQYDi2-K|dX(#zaH9+S_%gF)=&A z(QS>y-^0DHVpwW=>coku?FOiZp&wHcW=>2lo4eoOvw!Ql0_NP5|TwB9=e2S#+fLrU7$<{qD>EvmFf)XneAFDbxFo# zlQAvLm?F8U(j}y2CZLP6m4m{Ei8^>krKV>jDTkz{8+^7Bon#Wp7U>i*vq6UhsZW9; zbCOXRlAhpXmX64rl;E>MF~X2yn39kj@{MwYF=a|Z8Xj!dSur9tIdyt!O80Pan968K zPfx%)HjoZcws&|kmhnrTReT}Y&OKs|_t_s(m9eSQ&z31eIw^JOXZNN|G^QCuUpz*D z6lk>pIH+jmS=qJSrWKlrX8?wPMY5yRhN1*wn;? zDdEYo*vu5;%*fZ$*o2gv5c_r`WFx1b{XWke9h_Lm6e0MJqQzTWLle>yGbe?=E)Ghu^N3J|W~NU=N0b8-W*Tz6LlaV_BqvNV z%uEtlaA#6_f>E8Qgi7ETQflyV4K*Yia|~i{8H8h&(ML-|)7#w_ohjayV%ObKI{>UR zxI+|m#kW%If)ivJcy_=%SE(D$#k3~k$OJEvXnZ$x0LY)7I#bZh0SRda^eTN)eu!#7 zDnvpV18Jcm51N_ib5s#F)tH!?nUNo?3QL`COu;4iC2rEzbxM0YTs$Y$u2tK>aL8r4 z;j6+&Pftks|5}aHI-mb%HU96m8jk;m)hPawZrAmH-0Rda1OLap=4aY<`kzai#|HfG zOKXmf3;OCXZ=Dd=?*DX{YwX?T)1huTU;X7eTUKL_HED`3XV{H1)j2UzjqL)qi`dR% zJB;lZw&U1NU^|J;g6$l(N^HMktHO2(+huH5uwBJ=5Zh^NXRw{cb_81mwqLLv#dZqY zPuLD%+kaP!q!|AzsPRlhYYJl71 z8*5DTBw@Wa z|Ndt8i(8Jr9(ZS(ch~p8-oC3R!vntCe8bP1By~p8Y`DUHwaW4LKo{4@mLo^E`m5Sg zamBRlV&Wd6D0w!jxus+f5!RtldZx zLqwkvyO6-!_KOZy9ey5>zGH*&pTeDk4-lDM`0B%%IYdNSn#4C{lkbf4T`<>M)MdEq zrg!tUR;`#kL?pYl^YEs+(cPremp9h#TO#tll@)dU$CIuR@J6YUSGXKwC0`MyZ8{`a3x&fZ@;XBpA- zDYqr7CjTg+*@+>2>25yMi)v?~Q6E7E;IAStYC~-6T|6|GMh76 zMfC<7Ret+_Ac>RzsSZo*8i?+m7%Q_ABv0fWS4GJpaVFV0_#Tz5pY5qwl72%x#zX9V zSbX8t@!PGgY*^pDxoecY>$=~^Z7`bVuN1d^u(xeaiul<8*S~v3?SKC~3`06&K zL+~oGyMig9W3|g4z20rQ>z!V1D}8(Uo@qlXQs=ysF-ZU5Px#o^-~txhlhQej)jH|s z4aRSy)V2yJ8PqE@WH}336*m3>kv3+XJZV~SLo7~Z`*Yr{9&1bAUJeenof;$}B~dNy z2fKf6IUN?>&<9XM;-QQ+Ku+0Ir&Fv$E_jAO#^ZR72)Y_oAb#^%qG(Bw9KzOf^Q z@v~ZxUU4_<;+EQ}$B>-%<7H(1;Js3EBLF6iP z;X$DsxsOcVUB-4!Rd)82 z$WL)HteUyuu%Fry3HI+ep(ooS#e&FuZr|uerk;)=I`>!3vXygiX4oKdI`}g;?=yKF zbygw@jp{qS+SZK4`nNqp23j9)vSaCPq6igv9Y(@%z1ey(q{v585Pdcb;t zFs6)8!`67lIR(EbWEGs~pwWMhzrhg^qFl>m>UMme?NGPc$gggOb*GJoV9QI+%nT7R z+I6>tu^(bG#4>hjSgx3{!TtpzCe=0%#R?Kqe(mK2_(wj*dZF;eh5H2188(V@@qc)?kV zNXfMOU!lDvUtGn3%=w~9!c4SnXH=(O@m{Q?Nhc*rW-XJ56^yici9OHWpxxThLiKmN z#7Y)ep~T&3>K54Z3q7&71iNET{&8?(5oyNT zYi@MMVZnr9*jx4wHQ}G~uMXI254OXeZiz#UML$Y(ENz27+RAThjfYx#;Ow3mJ|$AZ zckhJLx-PwOMxQRxFxmbdI6(?p3WcoWu)q1F4fgVWYTTmxg2$_7ND5f0A`s1*Z}!Dm z=k@A%w$LR=WRgkwmTPqa`KRoQ#FdF%#8xS<+co%WnT;BisLbSG_^^rVSIOcu?imV7m18oC~D;wI-@aU zssc|d|B_Tui|L7^f;PO6=$Y2r8zNxdBvCNSC-3ShFYx=rP+n2U_T~%B5vlpLnf`eC0dBuSa2lb?kHS~ zeHn{=)Zzr(VN!fR1?A^L@w_#qKhEejOX^tF`4CiI=Zb2`&`&-!v_@d1Wq4s4weBfY z;X4j!EHS(V=~as(!QbtVaDU?S$SS(l27;j|P+O>ejJkx%wi|VnAGH?@J_4m9Q|nMr zvshe2wX@Z=)TFs%w9xVbL%Eb_PWJb9u$Le218QP_U{7@#Nifv_ew6*cNbh_&c?zwM9WemOPIkvLIfqUJse)b z_>Mkh1$1aowU%yB?I>mZnIyC;x^;CHGi_`hk1i8_8>mc9xPVBOv2Gv_A8iAIT0cp$ zs3oUNNy$H8dzP&@O^Q{=27>QO0|c>TI7mT;3T5sJR4eK4anP4DHc(&fv6taROq-@P zrqPSP8bHtQmKqyqORheGwizIar#@ZPjE0*o?xDzUIYr)aSTvV(f9ZHy5(SzjbHtCps1;Pevq z_QEWHK>W9<=*VVYbYv)J#Qi(PR=l9;mtV!SEgejPHa(Nn(AD;lI$EEL{`1}D_z*^x zH3BnN6o!f8>G8pk(M|KXB%p?)54fUF6!x>aOUl83$PzlK5V%<093|GWi1CY?!LwgBiqjZxS~eK%zqW=;bD;A- za8(kjAIOzD(w&*rH7J+UJJN-3)Dd*M4`iI^?-`Y}`iMG<278x9&=nIaLE=4Hu0Tpv znLq-vaG{|VqO;b39+WKNw2ri(b7U>O(Ozw)emY|beLmL*UvfFKuG}YrUSBFnGSSgf zE79vWf6oRR%qEcM@7oa7Z+C+`)|9p;AmZM<@KR=dl>%EXpvgoK+DhV zC}Ad|+*nvn^_6IMk(kp+DZdR^g>MEmQJGD67Sj&A>SJZv#7|(HRyh+q)6Qn$gjwTf zK?k)

>}AT2@PX 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 z%0D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%0AZP07ftQ-NU66jm5YHC6TN^t@` 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