Skip to content

Commit 2ab2f26

Browse files
authored
Merge pull request #41 from DevelopmentFinanceObservatory/release/2026-10-31
release: spec-kit b3ac9b0 to production
2 parents 3cb209d + b3ac9b0 commit 2ab2f26

60 files changed

Lines changed: 12191 additions & 448 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

‎python/client-contract/CHANGELOG.md‎

Lines changed: 13 additions & 3 deletions
Large diffs are not rendered by default.

‎python/client-contract/README.md‎

Lines changed: 12 additions & 10 deletions
Large diffs are not rendered by default.

‎python/client-contract/pyproject.toml‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@ dev = [
4545
"pre-commit>=4.6.0",
4646
"jsonschema>=4.23",
4747
"referencing>=0.36",
48+
"rfc8785>=0.1.4",
4849
]
4950

5051
[tool.ruff]

‎python/client-contract/src/dfo_client_contract/actions.json‎

Lines changed: 178 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,10 @@
11
{
22
"format_version": 1,
33
"codes": [
4+
{
5+
"code": "allowance_exhausted",
6+
"action": "wait_for_reset"
7+
},
48
{
59
"code": "artifact_expired",
610
"action": "take_newest_version"
@@ -46,6 +50,18 @@
4650
"code": "column_unknown",
4751
"action": "fix_request"
4852
},
53+
{
54+
"code": "compare_no_key_matched",
55+
"action": "fix_request"
56+
},
57+
{
58+
"code": "comparison_periods_disjoint",
59+
"action": "fix_request"
60+
},
61+
{
62+
"code": "composed_unit_sum_unsupported",
63+
"action": "fix_request"
64+
},
4965
{
5066
"code": "conflicting_requested_options",
5167
"action": "fix_request"
@@ -54,6 +70,22 @@
5470
"code": "constraint_violation",
5571
"action": "fix_request"
5672
},
73+
{
74+
"code": "coverage_insufficient",
75+
"action": "fix_request"
76+
},
77+
{
78+
"code": "cross_frame_facet_mismatch",
79+
"action": "fix_request"
80+
},
81+
{
82+
"code": "cross_frame_unit_mismatch",
83+
"action": "fix_request"
84+
},
85+
{
86+
"code": "cross_frame_unit_unbound",
87+
"action": "fix_request"
88+
},
5789
{
5890
"code": "default_facet_undefined",
5991
"action": "fix_request"
@@ -67,6 +99,14 @@
6799
"action": "ask_data_question",
68100
"gap_kind": "no_data"
69101
},
102+
{
103+
"code": "derived_input_ordinal",
104+
"action": "fix_request"
105+
},
106+
{
107+
"code": "derived_input_unusable",
108+
"action": "fix_request"
109+
},
70110
{
71111
"code": "directional_children_unsupported",
72112
"action": "fix_request"
@@ -123,6 +163,10 @@
123163
"code": "facet_binding_unsupported",
124164
"action": "fix_request"
125165
},
166+
{
167+
"code": "facet_heterogeneous",
168+
"action": "fix_request"
169+
},
126170
{
127171
"code": "facet_not_available",
128172
"action": "fix_request",
@@ -132,14 +176,30 @@
132176
"code": "facet_probe_ceiling",
133177
"action": "fix_request"
134178
},
179+
{
180+
"code": "filter_predicate_type_mismatch",
181+
"action": "fix_request"
182+
},
183+
{
184+
"code": "filter_unit_conversion_unsupported",
185+
"action": "fix_request"
186+
},
135187
{
136188
"code": "frame_not_refreshable",
137189
"action": "fix_request"
138190
},
191+
{
192+
"code": "frame_too_large",
193+
"action": "fix_request"
194+
},
139195
{
140196
"code": "frame_unavailable",
141197
"action": "check_id"
142198
},
199+
{
200+
"code": "growth_gap_year",
201+
"action": "fix_request"
202+
},
143203
{
144204
"code": "identity_collision",
145205
"action": "report"
@@ -156,6 +216,18 @@
156216
"code": "invalid_role_ref",
157217
"action": "fix_request"
158218
},
219+
{
220+
"code": "join_no_common_key_columns",
221+
"action": "fix_request"
222+
},
223+
{
224+
"code": "join_output_collision",
225+
"action": "fix_request"
226+
},
227+
{
228+
"code": "licence_not_redistributable",
229+
"action": "stop"
230+
},
159231
{
160232
"code": "member_not_resolvable",
161233
"action": "fix_request"
@@ -172,6 +244,10 @@
172244
"code": "mixed_peers_anchor_types",
173245
"action": "fix_request"
174246
},
247+
{
248+
"code": "mixed_time_grain",
249+
"action": "fix_request"
250+
},
175251
{
176252
"code": "no_matching_slice",
177253
"action": "ask_data_question",
@@ -186,6 +262,10 @@
186262
"code": "node_not_held",
187263
"action": "check_id"
188264
},
265+
{
266+
"code": "non_finite_result",
267+
"action": "fix_request"
268+
},
189269
{
190270
"code": "not_found",
191271
"action": "check_id"
@@ -194,6 +274,10 @@
194274
"code": "observations_unavailable",
195275
"action": "fix_request"
196276
},
277+
{
278+
"code": "op_spec_invalid",
279+
"action": "fix_request"
280+
},
197281
{
198282
"code": "open_role_unavailable",
199283
"action": "fix_request"
@@ -206,6 +290,10 @@
206290
"code": "operation_not_found",
207291
"action": "check_id"
208292
},
293+
{
294+
"code": "operation_uncovered",
295+
"action": "fix_request"
296+
},
209297
{
210298
"code": "option_target_invalid",
211299
"action": "fix_request"
@@ -219,8 +307,8 @@
219307
"action": "fix_request"
220308
},
221309
{
222-
"code": "pin_not_permitted",
223-
"action": "request_scope"
310+
"code": "payload_too_large",
311+
"action": "fix_request"
224312
},
225313
{
226314
"code": "pivot_not_homogeneous",
@@ -238,10 +326,18 @@
238326
"code": "pivot_over_column_cap",
239327
"action": "fix_request"
240328
},
329+
{
330+
"code": "place_levels_mixed",
331+
"action": "fix_request"
332+
},
241333
{
242334
"code": "population_empty",
243335
"action": "fix_request"
244336
},
337+
{
338+
"code": "provenance_unavailable",
339+
"action": "stop"
340+
},
245341
{
246342
"code": "provider_ambiguous",
247343
"action": "fix_request"
@@ -263,6 +359,18 @@
263359
"code": "query_too_long",
264360
"action": "fix_request"
265361
},
362+
{
363+
"code": "quotient_of_no_key_matched",
364+
"action": "fix_request"
365+
},
366+
{
367+
"code": "quotient_of_side_unit_unsupported",
368+
"action": "fix_request"
369+
},
370+
{
371+
"code": "quotient_of_zero_denominator",
372+
"action": "fix_request"
373+
},
266374
{
267375
"code": "rate_coverage_gap",
268376
"action": "fix_request",
@@ -308,6 +416,10 @@
308416
"code": "resource_exhausted",
309417
"action": "fix_request"
310418
},
419+
{
420+
"code": "role_ambiguous",
421+
"action": "fix_request"
422+
},
311423
{
312424
"code": "role_incompatible",
313425
"action": "fix_request",
@@ -323,6 +435,18 @@
323435
"action": "fix_request",
324436
"gap_kind": "unsupported"
325437
},
438+
{
439+
"code": "rolling_anchor_unresolved",
440+
"action": "fix_request"
441+
},
442+
{
443+
"code": "rolling_grain_unsupported",
444+
"action": "fix_request"
445+
},
446+
{
447+
"code": "rolling_populations_differ",
448+
"action": "fix_request"
449+
},
326450
{
327451
"code": "rollup_not_summable",
328452
"action": "fix_request"
@@ -339,10 +463,42 @@
339463
"code": "service_unavailable",
340464
"action": "report"
341465
},
466+
{
467+
"code": "several_members",
468+
"action": "fix_request"
469+
},
342470
{
343471
"code": "shape_mismatch",
344472
"action": "fix_request"
345473
},
474+
{
475+
"code": "share_id_taken",
476+
"action": "fix_request"
477+
},
478+
{
479+
"code": "share_import_not_permitted",
480+
"action": "request_scope"
481+
},
482+
{
483+
"code": "share_not_replaceable",
484+
"action": "fix_request"
485+
},
486+
{
487+
"code": "share_of_grain_mismatch",
488+
"action": "fix_request"
489+
},
490+
{
491+
"code": "share_of_key_unknown",
492+
"action": "fix_request"
493+
},
494+
{
495+
"code": "share_of_key_unmatched",
496+
"action": "fix_request"
497+
},
498+
{
499+
"code": "share_of_zero_denominator",
500+
"action": "fix_request"
501+
},
346502
{
347503
"code": "skill_not_found",
348504
"action": "check_id"
@@ -396,6 +552,14 @@
396552
"code": "spec_not_found",
397553
"action": "check_id"
398554
},
555+
{
556+
"code": "stat_var_unresolved",
557+
"action": "fix_request"
558+
},
559+
{
560+
"code": "sum_of_no_key_matched",
561+
"action": "fix_request"
562+
},
399563
{
400564
"code": "timed_out",
401565
"action": "ask_data_question",
@@ -405,6 +569,10 @@
405569
"code": "timeout",
406570
"action": "report"
407571
},
572+
{
573+
"code": "unit_heterogeneous",
574+
"action": "fix_request"
575+
},
408576
{
409577
"code": "unit_not_resolved",
410578
"action": "ask_data_question",
@@ -438,6 +606,14 @@
438606
{
439607
"code": "write_refused",
440608
"action": "request_scope"
609+
},
610+
{
611+
"code": "write_token_invalid",
612+
"action": "stop"
613+
},
614+
{
615+
"code": "write_token_required",
616+
"action": "fix_request"
441617
}
442618
]
443619
}

‎python/client-contract/src/dfo_client_contract/actions.schema.json‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@
3737
"take_newest_version",
3838
"log_in",
3939
"request_scope",
40+
"stop",
4041
"wait",
4142
"wait_for_reset",
4243
"report",

‎python/client-contract/src/dfo_client_contract/contract.py‎

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,8 @@
77
from pathlib import Path
88
from typing import Any
99

10-
# The rules under `rules/`, each a file of vectors named after the rule.
10+
# The rules under `rules/`, each a file of vectors named after the rule: the
11+
# client rules, then the analysis and publication rules DFO applies.
1112
RULES = (
1213
"key-format",
1314
"credentials-path",
@@ -20,6 +21,12 @@
2021
"client-identity",
2122
"role-keys",
2223
"file-selector",
24+
"series-left-out",
25+
"output-digest",
26+
"output-comparison",
27+
"operation-outputs",
28+
"rolling-composition",
29+
"publication",
2330
)
2431

2532

0 commit comments

Comments
 (0)