Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
21 commits
Select commit Hold shift + click to select a range
6b606ec
feat(contract): derived refs, output digests and the dashboard routes…
jm-rivera Oct 29, 2026
5132aa0
feat(registry): register the share import route's refusal codes (#36)
jm-rivera Oct 29, 2026
831e1d5
feat(registry): register the export and MCP refusal codes
jm-rivera Oct 29, 2026
a588976
feat(registry): refuse a revoked version on the export link
jm-rivera Oct 29, 2026
4907759
Merge remote-tracking branch 'origin/dev' into feat/public-mcp-codes
jm-rivera Oct 30, 2026
3c5c7fd
feat(registry): register the rebuild refusals on datasets.exports
jm-rivera Oct 30, 2026
0041a4a
fix(registry): keep only the rebuild refusals dfo-apis serves on data…
jm-rivera Oct 30, 2026
ba5191b
docs(registry): tighten the MCP refusal and exports entries
jm-rivera Oct 30, 2026
52e4e42
fix(registry): state what the MCP refusals mean and register the rest
jm-rivera Oct 30, 2026
2dd2400
fix(registry): map every code the MCP servers write and state the sur…
jm-rivera Oct 30, 2026
9814852
Merge pull request #37 from DevelopmentFinanceObservatory/feat/public…
jm-rivera Oct 30, 2026
8bc3fcc
feat(registry): map every Presentation route and state where a frame …
jm-rivera Oct 31, 2026
32c4751
fix(registry): map binding_invalid on presentation.component_data
jm-rivera Oct 31, 2026
fa6264f
fix(frame-grammar): validate stored unit cells where unit_cells and F…
jm-rivera Oct 31, 2026
4a250e8
perf(frame-grammar): read the unit column by code in Frame.rows and t…
jm-rivera Oct 31, 2026
eb6afef
refactor(frame-grammar): expose unit_column_cells and read unit colum…
jm-rivera Oct 31, 2026
7aec850
fix(client-contract): state the series_left_out rule the vectors pin …
jm-rivera Oct 31, 2026
e5fb7c1
docs(client-contract): say a refused failed poll is posted again at o…
jm-rivera Oct 31, 2026
d8d16ac
Merge pull request #42 from DevelopmentFinanceObservatory/fix/contrac…
jm-rivera Oct 31, 2026
afdae02
fix(registry): register over_ceiling on datasets.observations and dat…
jm-rivera Oct 31, 2026
b3ac9b0
Merge pull request #39 from DevelopmentFinanceObservatory/fix/present…
jm-rivera Oct 31, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
16 changes: 13 additions & 3 deletions python/client-contract/CHANGELOG.md

Large diffs are not rendered by default.

22 changes: 12 additions & 10 deletions python/client-contract/README.md

Large diffs are not rendered by default.

1 change: 1 addition & 0 deletions python/client-contract/pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,7 @@ dev = [
"pre-commit>=4.6.0",
"jsonschema>=4.23",
"referencing>=0.36",
"rfc8785>=0.1.4",
]

[tool.ruff]
Expand Down
180 changes: 178 additions & 2 deletions python/client-contract/src/dfo_client_contract/actions.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,10 @@
{
"format_version": 1,
"codes": [
{
"code": "allowance_exhausted",
"action": "wait_for_reset"
},
{
"code": "artifact_expired",
"action": "take_newest_version"
Expand Down Expand Up @@ -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"
Expand All @@ -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"
Expand All @@ -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"
Expand Down Expand Up @@ -123,6 +163,10 @@
"code": "facet_binding_unsupported",
"action": "fix_request"
},
{
"code": "facet_heterogeneous",
"action": "fix_request"
},
{
"code": "facet_not_available",
"action": "fix_request",
Expand All @@ -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"
Expand All @@ -156,6 +216,18 @@
"code": "invalid_role_ref",
"action": "fix_request"
},
{
"code": "join_no_common_key_columns",
"action": "fix_request"
},
{
"code": "join_output_collision",
"action": "fix_request"
},
{
"code": "licence_not_redistributable",
"action": "stop"
},
{
"code": "member_not_resolvable",
"action": "fix_request"
Expand All @@ -172,6 +244,10 @@
"code": "mixed_peers_anchor_types",
"action": "fix_request"
},
{
"code": "mixed_time_grain",
"action": "fix_request"
},
{
"code": "no_matching_slice",
"action": "ask_data_question",
Expand All @@ -186,6 +262,10 @@
"code": "node_not_held",
"action": "check_id"
},
{
"code": "non_finite_result",
"action": "fix_request"
},
{
"code": "not_found",
"action": "check_id"
Expand All @@ -194,6 +274,10 @@
"code": "observations_unavailable",
"action": "fix_request"
},
{
"code": "op_spec_invalid",
"action": "fix_request"
},
{
"code": "open_role_unavailable",
"action": "fix_request"
Expand All @@ -206,6 +290,10 @@
"code": "operation_not_found",
"action": "check_id"
},
{
"code": "operation_uncovered",
"action": "fix_request"
},
{
"code": "option_target_invalid",
"action": "fix_request"
Expand All @@ -219,8 +307,8 @@
"action": "fix_request"
},
{
"code": "pin_not_permitted",
"action": "request_scope"
"code": "payload_too_large",
"action": "fix_request"
},
{
"code": "pivot_not_homogeneous",
Expand All @@ -238,10 +326,18 @@
"code": "pivot_over_column_cap",
"action": "fix_request"
},
{
"code": "place_levels_mixed",
"action": "fix_request"
},
{
"code": "population_empty",
"action": "fix_request"
},
{
"code": "provenance_unavailable",
"action": "stop"
},
{
"code": "provider_ambiguous",
"action": "fix_request"
Expand All @@ -263,6 +359,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",
Expand Down Expand Up @@ -308,6 +416,10 @@
"code": "resource_exhausted",
"action": "fix_request"
},
{
"code": "role_ambiguous",
"action": "fix_request"
},
{
"code": "role_incompatible",
"action": "fix_request",
Expand All @@ -323,6 +435,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"
Expand All @@ -339,10 +463,42 @@
"code": "service_unavailable",
"action": "report"
},
{
"code": "several_members",
"action": "fix_request"
},
{
"code": "shape_mismatch",
"action": "fix_request"
},
{
"code": "share_id_taken",
"action": "fix_request"
},
{
"code": "share_import_not_permitted",
"action": "request_scope"
},
{
"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"
Expand Down Expand Up @@ -396,6 +552,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",
Expand All @@ -405,6 +569,10 @@
"code": "timeout",
"action": "report"
},
{
"code": "unit_heterogeneous",
"action": "fix_request"
},
{
"code": "unit_not_resolved",
"action": "ask_data_question",
Expand Down Expand Up @@ -438,6 +606,14 @@
{
"code": "write_refused",
"action": "request_scope"
},
{
"code": "write_token_invalid",
"action": "stop"
},
{
"code": "write_token_required",
"action": "fix_request"
}
]
}
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,7 @@
"take_newest_version",
"log_in",
"request_scope",
"stop",
"wait",
"wait_for_reset",
"report",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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",
Expand All @@ -20,6 +21,12 @@
"client-identity",
"role-keys",
"file-selector",
"series-left-out",
"output-digest",
"output-comparison",
"operation-outputs",
"rolling-composition",
"publication",
)


Expand Down
Loading
Loading