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 }