rhi

Coordinated trade for connected markets
git clone https://radroots.dev/git/rhi.git
Log | Files | Refs | README | LICENSE

evidence_policy.v1.json (18917B)


      1 {
      2   "schema": "radroots.rhi.evidence-policy-decision.v1",
      3   "contract_version": 1,
      4   "decision_state": "reserved_preimplementation",
      5   "configuration": {
      6     "group": "evidence",
      7     "required_fields": ["contract", "contract_version", "policy_id", "sources"],
      8     "unknown_fields": "reject",
      9     "contract": "radroots.rhi.evidence-policy",
     10     "contract_version": 1,
     11     "policy_id": { "type": "stable_id", "minimum_utf8_bytes": 1, "maximum_utf8_bytes": 64, "pattern": "^[a-z][a-z0-9_-]*$" },
     12     "sources": { "type": "array", "minimum_items": 1, "maximum_items": 16, "unique_constraints": [["source_id"], ["kind", "relay_id", "selector"]], "canonical_order": "source_id_ascending_utf8" },
     13     "source": {
     14       "required_fields": ["source_id", "kind", "relay_id", "required", "selector", "deadline_ms", "lookback_seconds", "overlap_seconds"],
     15       "unknown_fields": "reject",
     16       "source_id": { "type": "stable_id", "minimum_utf8_bytes": 1, "maximum_utf8_bytes": 64, "pattern": "^[a-z][a-z0-9_-]*$" },
     17       "kind": { "type": "literal", "value": "nostr_relay" },
     18       "relay_id": { "type": "stable_relay_id", "reference": "relays[].id", "canonical_url_required": true },
     19       "required": { "type": "boolean" },
     20       "selector": { "type": "literal", "value": "trade_mutation_lineage_v1" },
     21       "deadline_ms": { "type": "integer", "minimum": 100, "maximum": 30000, "unit": "milliseconds" },
     22       "lookback_seconds": { "type": "integer", "minimum": 60, "maximum": 2678400, "unit": "seconds" },
     23       "overlap_seconds": { "type": "integer", "minimum": 1, "maximum": 86400, "unit": "seconds", "relationship": "overlap_seconds_less_than_or_equal_to_lookback_seconds" }
     24     },
     25     "implicit_source": false,
     26     "implicit_relay": false,
     27     "defaults": false
     28   },
     29   "source_kinds": {
     30     "qualified_v1": ["nostr_relay"],
     31     "other_source_kind": "unsupported_contract_input",
     32     "adapter_without_real_source": "forbidden"
     33   },
     34   "selector": {
     35     "id": "trade_mutation_lineage_v1",
     36     "trade_event_contract": {
     37       "repository": "https://github.com/radrootslabs/lib",
     38       "path": "contracts/architecture/decisions/services_hardening_events.v1.json",
     39       "schema": "radroots.services-hardening.event-decisions.v1",
     40       "contract_family": "radroots.trade.mutation-index.v1"
     41     },
     42     "event_kinds": [3470, 3471, 3472, 3473, 3474],
     43     "event_kind_meanings": ["proposal", "decision", "revision_proposal", "revision_decision", "cancellation"],
     44     "dynamic_filter": { "tag": "#d", "value": "exact_job_trade_id" },
     45     "required_structural_tags": ["contract", "d", "x:mutation", "p:buyer", "p:seller"],
     46     "nonproposal_additional_tags": ["x:root", "x:parent"],
     47     "author_policy": "validate_against_typed_trade_party_and_mutation_contract",
     48     "filter_extra_tags": false,
     49     "maximum_events_per_result": 4096,
     50     "maximum_result_bytes": 8388608
     51   },
     52   "cursor": {
     53     "scope": ["source_id", "selector_id", "policy_digest", "trade_id"],
     54     "tuple": ["created_at_unix_seconds", "event_id_lowercase_hex"],
     55     "ordering": ["created_at_unix_seconds_ascending", "event_id_lowercase_hex_ascending"],
     56     "initial_since": "max_zero_attempt_started_at_utc_minus_lookback_seconds",
     57     "resume_since": "max_zero_cursor_created_at_minus_overlap_seconds",
     58     "equal_timestamp_safe": true,
     59     "deduplicate_by": "verified_event_id",
     60     "advance_candidate": "greatest_canonically_admitted_tuple_only",
     61     "no_admitted_event": "leave_cursor_unchanged",
     62     "rejected_event": "cannot_advance_cursor_or_completion_or_dirty_generation",
     63     "commit": "only_with_generation_fenced_reconciliation_commit_after_source_completion"
     64   },
     65   "completion": {
     66     "success_evidence": "nostr_eose_received_before_source_deadline",
     67     "eose_scope": "exact_request_identity_and_selector",
     68     "timeout": "incomplete_timeout",
     69     "disconnect_before_eose": "incomplete_unavailable",
     70     "relay_error_before_eose": "incomplete_unavailable",
     71     "unsupported_filter_or_protocol": "unsupported",
     72     "bounded_result_exceeded": "incomplete_resource_limit",
     73     "invalid_events_before_eose": "completion_may_succeed_but_invalid_events_are_rejected",
     74     "eose_after_deadline": "incomplete_timeout",
     75     "response_without_eose": "incomplete_unknown"
     76   },
     77   "required_optional_semantics": {
     78     "coverage_precedence": ["Unsupported", "ScopeSatisfied", "Partial", "Missing"],
     79     "Unsupported": { "when": "any_required_source_is_unsupported", "allowed_outcomes": ["Indeterminate"] },
     80     "ScopeSatisfied": { "when": "every_required_source_completed_and_all_required_scope_prerequisites_are_satisfied", "allowed_outcomes": ["Valid", "Invalid", "Indeterminate"] },
     81     "Partial": { "when": "not_unsupported_or_scope_satisfied_and_any_required_or_optional_source_completed_or_any_relevant_evidence_was_admitted", "allowed_outcomes": ["Indeterminate"] },
     82     "Missing": { "when": "not_unsupported_and_no_required_or_optional_source_completed_and_no_relevant_evidence_was_admitted", "allowed_outcomes": ["Indeterminate"] },
     83     "optional_incomplete": "record_safe_source_result_without_blocking_scope_satisfied",
     84     "optional_complete": "include_admitted_evidence_without_substituting_for_required_source",
     85     "zero_required_sources": "invalid_configuration"
     86   },
     87   "policy_digest": {
     88     "algorithm": "sha256",
     89     "encoding": "lowercase_hex",
     90     "domain": "radroots:rhi-evidence-policy:v1",
     91     "preimage": "domain_utf8_then_0x00_then_rfc8785_jcs_normalized_policy_utf8",
     92     "normalized_policy_fields": ["contract", "contract_version", "policy_id", "sources"],
     93     "normalized_source_fields": ["source_id", "kind", "relay_id", "relay_url", "required", "selector", "deadline_ms", "lookback_seconds", "overlap_seconds", "completion"],
     94     "source_order": "source_id_ascending_utf8",
     95     "relay_url": "resolved_canonical_url_from_relay_id",
     96     "completion_value": "nostr_eose_before_deadline"
     97   },
     98   "publication_relationship": {
     99     "relationship": "independent",
    100     "evidence_sources_are_publication_targets": false,
    101     "publication_targets_affect_coverage_or_outcome": false,
    102     "publication_failure_changes_report_or_attestation_content": false,
    103     "required_publication_failure": "publication_workflow_and_readiness_only",
    104     "disabled_publication": "no_target_or_network_work"
    105   },
    106   "fixed_vector": {
    107     "normalized_policy": {
    108       "contract": "radroots.rhi.evidence-policy",
    109       "contract_version": 1,
    110       "policy_id": "production-primary",
    111       "sources": [
    112         {
    113           "completion": "nostr_eose_before_deadline",
    114           "deadline_ms": 10000,
    115           "kind": "nostr_relay",
    116           "lookback_seconds": 86400,
    117           "overlap_seconds": 300,
    118           "relay_id": "relay-primary",
    119           "relay_url": "wss://relay.example.com/",
    120           "required": true,
    121           "selector": "trade_mutation_lineage_v1",
    122           "source_id": "trade-primary"
    123         }
    124       ]
    125     },
    126     "canonical_policy_utf8": "{\"contract\":\"radroots.rhi.evidence-policy\",\"contract_version\":1,\"policy_id\":\"production-primary\",\"sources\":[{\"completion\":\"nostr_eose_before_deadline\",\"deadline_ms\":10000,\"kind\":\"nostr_relay\",\"lookback_seconds\":86400,\"overlap_seconds\":300,\"relay_id\":\"relay-primary\",\"relay_url\":\"wss://relay.example.com/\",\"required\":true,\"selector\":\"trade_mutation_lineage_v1\",\"source_id\":\"trade-primary\"}]}",
    127     "preimage_utf8": "radroots:rhi-evidence-policy:v1\u0000{\"contract\":\"radroots.rhi.evidence-policy\",\"contract_version\":1,\"policy_id\":\"production-primary\",\"sources\":[{\"completion\":\"nostr_eose_before_deadline\",\"deadline_ms\":10000,\"kind\":\"nostr_relay\",\"lookback_seconds\":86400,\"overlap_seconds\":300,\"relay_id\":\"relay-primary\",\"relay_url\":\"wss://relay.example.com/\",\"required\":true,\"selector\":\"trade_mutation_lineage_v1\",\"source_id\":\"trade-primary\"}]}",
    128     "policy_digest": "43f083e29fcff4f90e66b546c49f74b0205ecb148beb352adb5a211d3e5f86b2",
    129     "positive": ["required_eose_before_deadline", "optional_timeout_does_not_block_required_scope"]
    130   },
    131   "configuration_fixture": {
    132     "contract": "radroots.rhi.evidence-policy",
    133     "contract_version": 1,
    134     "policy_id": "production-primary",
    135     "sources": [
    136       { "source_id": "trade-primary", "kind": "nostr_relay", "relay_id": "relay-primary", "required": true, "selector": "trade_mutation_lineage_v1", "deadline_ms": 10000, "lookback_seconds": 86400, "overlap_seconds": 300 }
    137     ]
    138   },
    139   "configuration_vectors": [
    140     { "case": "valid_base", "mutation": { "op": "none" }, "expected": "valid" },
    141     { "case": "invalid_policy_id", "mutation": { "op": "set_top_field", "field": "policy_id", "value": "Invalid Policy" }, "expected": "invalid_policy_id" },
    142     { "case": "duplicate_source_id", "mutation": { "op": "append_source", "source": { "source_id": "trade-primary", "kind": "nostr_relay", "relay_id": "relay-secondary", "required": true, "selector": "trade_mutation_lineage_v1", "deadline_ms": 10000, "lookback_seconds": 86400, "overlap_seconds": 300 } }, "expected": "duplicate_source_id" },
    143     { "case": "duplicate_binding", "mutation": { "op": "append_source", "source": { "source_id": "trade-alias", "kind": "nostr_relay", "relay_id": "relay-primary", "required": true, "selector": "trade_mutation_lineage_v1", "deadline_ms": 10000, "lookback_seconds": 86400, "overlap_seconds": 300 } }, "expected": "duplicate_source_binding" },
    144     { "case": "zero_required", "mutation": { "op": "set_source_field", "field": "required", "value": false }, "expected": "no_required_source" },
    145     { "case": "implicit_source", "mutation": { "op": "remove_top_field", "field": "sources" }, "expected": "missing_required_field" },
    146     { "case": "zero_sources", "mutation": { "op": "set_top_field", "field": "sources", "value": [] }, "expected": "source_count_out_of_range" },
    147     { "case": "seventeen_sources", "mutation": { "op": "repeat_sources", "count": 17 }, "expected": "source_count_out_of_range" },
    148     { "case": "non_array_sources", "mutation": { "op": "set_top_field", "field": "sources", "value": "relay-primary" }, "expected": "invalid_sources_type" },
    149     { "case": "non_object_source", "mutation": { "op": "set_top_field", "field": "sources", "value": [42] }, "expected": "invalid_source_type" },
    150     { "case": "unknown_top_field", "mutation": { "op": "add_top_field", "field": "default_source", "value": "relay-primary" }, "expected": "unknown_field" },
    151     { "case": "unknown_source_field", "mutation": { "op": "add_source_field", "field": "default", "value": true }, "expected": "unknown_field" },
    152     { "case": "missing_deadline", "mutation": { "op": "remove_source_field", "field": "deadline_ms" }, "expected": "missing_required_field" },
    153     { "case": "missing_lookback", "mutation": { "op": "remove_source_field", "field": "lookback_seconds" }, "expected": "missing_required_field" },
    154     { "case": "missing_overlap", "mutation": { "op": "remove_source_field", "field": "overlap_seconds" }, "expected": "missing_required_field" },
    155     { "case": "unknown_source_kind", "mutation": { "op": "set_source_field", "field": "kind", "value": "filesystem" }, "expected": "unsupported_source_kind" },
    156     { "case": "publication_target_as_evidence", "mutation": { "op": "set_source_field", "field": "kind", "value": "publication_target" }, "expected": "unsupported_source_kind" },
    157     { "case": "invalid_selector", "mutation": { "op": "set_source_field", "field": "selector", "value": "all_events_v1" }, "expected": "unsupported_selector" },
    158     { "case": "invalid_source_id", "mutation": { "op": "set_source_field", "field": "source_id", "value": "Invalid Source" }, "expected": "invalid_source_id" },
    159     { "case": "invalid_relay_id", "mutation": { "op": "set_source_field", "field": "relay_id", "value": "/relay" }, "expected": "invalid_source_id" },
    160     { "case": "non_boolean_required", "mutation": { "op": "set_source_field", "field": "required", "value": "true" }, "expected": "invalid_required_type" },
    161     { "case": "non_integer_deadline", "mutation": { "op": "set_source_field", "field": "deadline_ms", "value": "10000" }, "expected": "invalid_deadline_type" },
    162     { "case": "non_integer_lookback", "mutation": { "op": "set_source_field", "field": "lookback_seconds", "value": "86400" }, "expected": "invalid_lookback_type" },
    163     { "case": "non_integer_overlap", "mutation": { "op": "set_source_field", "field": "overlap_seconds", "value": "300" }, "expected": "invalid_overlap_type" },
    164     { "case": "deadline_minimum", "mutation": { "op": "set_source_field", "field": "deadline_ms", "value": 100 }, "expected": "valid" },
    165     { "case": "deadline_below_minimum", "mutation": { "op": "set_source_field", "field": "deadline_ms", "value": 99 }, "expected": "deadline_out_of_range" },
    166     { "case": "deadline_maximum", "mutation": { "op": "set_source_field", "field": "deadline_ms", "value": 30000 }, "expected": "valid" },
    167     { "case": "deadline_above_maximum", "mutation": { "op": "set_source_field", "field": "deadline_ms", "value": 30001 }, "expected": "deadline_out_of_range" },
    168     { "case": "lookback_minimum", "mutation": { "op": "set_source_fields", "fields": { "lookback_seconds": 60, "overlap_seconds": 60 } }, "expected": "valid" },
    169     { "case": "lookback_below_minimum", "mutation": { "op": "set_source_field", "field": "lookback_seconds", "value": 59 }, "expected": "lookback_out_of_range" },
    170     { "case": "lookback_maximum", "mutation": { "op": "set_source_field", "field": "lookback_seconds", "value": 2678400 }, "expected": "valid" },
    171     { "case": "lookback_above_maximum", "mutation": { "op": "set_source_field", "field": "lookback_seconds", "value": 2678401 }, "expected": "lookback_out_of_range" },
    172     { "case": "overlap_minimum", "mutation": { "op": "set_source_field", "field": "overlap_seconds", "value": 1 }, "expected": "valid" },
    173     { "case": "overlap_below_minimum", "mutation": { "op": "set_source_field", "field": "overlap_seconds", "value": 0 }, "expected": "overlap_out_of_range" },
    174     { "case": "overlap_maximum", "mutation": { "op": "set_source_field", "field": "overlap_seconds", "value": 86400 }, "expected": "valid" },
    175     { "case": "overlap_above_maximum", "mutation": { "op": "set_source_field", "field": "overlap_seconds", "value": 86401 }, "expected": "overlap_out_of_range" },
    176     { "case": "overlap_exceeds_lookback", "mutation": { "op": "set_source_fields", "fields": { "lookback_seconds": 60, "overlap_seconds": 61 } }, "expected": "overlap_exceeds_lookback" }
    177   ],
    178   "completion_vectors": [
    179     { "case": "eose_before_deadline", "input": { "eose_at_ms": 9999, "deadline_ms": 10000, "disconnect": false, "relay_error": false, "unsupported": false, "resource_limit": false }, "expected": "complete" },
    180     { "case": "eose_at_deadline", "input": { "eose_at_ms": 10000, "deadline_ms": 10000, "disconnect": false, "relay_error": false, "unsupported": false, "resource_limit": false }, "expected": "incomplete_timeout" },
    181     { "case": "missing_eose", "input": { "deadline_elapsed_without_eose": true, "deadline_ms": 10000, "disconnect": false, "relay_error": false, "unsupported": false, "resource_limit": false }, "expected": "incomplete_timeout" },
    182     { "case": "eose_after_deadline", "input": { "eose_at_ms": 10001, "deadline_ms": 10000, "disconnect": false, "relay_error": false, "unsupported": false, "resource_limit": false }, "expected": "incomplete_timeout" },
    183     { "case": "disconnect_before_eose", "input": { "deadline_ms": 10000, "disconnect": true, "relay_error": false, "unsupported": false, "resource_limit": false }, "expected": "incomplete_unavailable" },
    184     { "case": "relay_error_before_eose", "input": { "deadline_ms": 10000, "disconnect": false, "relay_error": true, "unsupported": false, "resource_limit": false }, "expected": "incomplete_unavailable" },
    185     { "case": "unsupported", "input": { "deadline_ms": 10000, "disconnect": false, "relay_error": false, "unsupported": true, "resource_limit": false }, "expected": "unsupported" },
    186     { "case": "bounded_result_exceeded", "input": { "deadline_ms": 10000, "disconnect": false, "relay_error": false, "unsupported": false, "resource_limit": true }, "expected": "incomplete_resource_limit" },
    187     { "case": "response_without_eose", "input": { "deadline_ms": 10000, "disconnect": false, "relay_error": false, "unsupported": false, "resource_limit": false }, "expected": "incomplete_unknown" }
    188   ],
    189   "cursor_vectors": [
    190     { "case": "rejected_event_cannot_advance", "current": { "created_at_unix_seconds": 100, "event_id_lowercase_hex": "0000000000000000000000000000000000000000000000000000000000000001" }, "candidate": { "created_at_unix_seconds": 101, "event_id_lowercase_hex": "0000000000000000000000000000000000000000000000000000000000000002", "admitted": false }, "source_complete": true, "generation_fence": true, "expected": { "created_at_unix_seconds": 100, "event_id_lowercase_hex": "0000000000000000000000000000000000000000000000000000000000000001" } },
    191     { "case": "equal_timestamp_event_id_advances", "current": { "created_at_unix_seconds": 100, "event_id_lowercase_hex": "0000000000000000000000000000000000000000000000000000000000000001" }, "candidate": { "created_at_unix_seconds": 100, "event_id_lowercase_hex": "0000000000000000000000000000000000000000000000000000000000000002", "admitted": true }, "source_complete": true, "generation_fence": true, "expected": { "created_at_unix_seconds": 100, "event_id_lowercase_hex": "0000000000000000000000000000000000000000000000000000000000000002" } }
    192   ],
    193   "coverage_vectors": [
    194     { "case": "required_unsupported", "sources": [{ "required": true, "completion": "unsupported", "admitted_events": 0 }], "scope_prerequisites_satisfied": false, "expected_coverage": "Unsupported", "allowed_outcomes": ["Indeterminate"] },
    195     { "case": "nothing_observed", "sources": [{ "required": true, "completion": "incomplete", "admitted_events": 0 }], "scope_prerequisites_satisfied": false, "expected_coverage": "Missing", "allowed_outcomes": ["Indeterminate"] },
    196     { "case": "optional_evidence_required_incomplete", "sources": [{ "required": true, "completion": "incomplete", "admitted_events": 0 }, { "required": false, "completion": "complete", "admitted_events": 1 }], "scope_prerequisites_satisfied": false, "expected_coverage": "Partial", "allowed_outcomes": ["Indeterminate"] },
    197     { "case": "required_complete_prerequisite_missing", "sources": [{ "required": true, "completion": "complete", "admitted_events": 1 }], "scope_prerequisites_satisfied": false, "expected_coverage": "Partial", "allowed_outcomes": ["Indeterminate"] },
    198     { "case": "required_scope_satisfied", "sources": [{ "required": true, "completion": "complete", "admitted_events": 1 }, { "required": false, "completion": "incomplete", "admitted_events": 0 }], "scope_prerequisites_satisfied": true, "expected_coverage": "ScopeSatisfied", "allowed_outcomes": ["Valid", "Invalid", "Indeterminate"] }
    199   ]
    200 }