Files
microdao-daarion/docs/contracts/clan-consent-event.schema.json

430 lines
8.4 KiB
JSON

{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$id": "https://jos.local/schemas/clan-consent-event.schema.json",
"title": "CLAN ConsentEvent Schema",
"type": "object",
"additionalProperties": false,
"required": [
"consent_event_id",
"ts",
"scope",
"decision",
"target",
"confirmations",
"quorum",
"provenance",
"versions"
],
"properties": {
"consent_event_id": {
"type": "string",
"minLength": 3,
"maxLength": 128,
"pattern": "^ce_[A-Za-z0-9_-]+$"
},
"ts": {
"type": "integer",
"minimum": 0
},
"scope": {
"$ref": "#/$defs/scope"
},
"decision": {
"$ref": "#/$defs/decision"
},
"target": {
"$ref": "#/$defs/target"
},
"confirmations": {
"type": "array",
"minItems": 0,
"maxItems": 256,
"items": {
"$ref": "#/$defs/confirmation"
}
},
"quorum": {
"$ref": "#/$defs/quorum"
},
"provenance": {
"$ref": "#/$defs/event_provenance"
},
"versions": {
"$ref": "#/$defs/versions"
},
"integrity": {
"$ref": "#/$defs/integrity"
}
},
"allOf": [
{
"if": {
"properties": {
"decision": {
"properties": {
"type": {
"enum": [
"approve",
"reject"
]
}
},
"required": [
"type"
]
}
},
"required": [
"decision"
]
},
"then": {
"properties": {
"confirmations": {
"minItems": 1
}
}
}
},
{
"if": {
"properties": {
"decision": {
"properties": {
"type": {
"const": "revoke"
}
},
"required": [
"type"
]
}
},
"required": [
"decision"
]
},
"then": {
"properties": {
"confirmations": {
"minItems": 1
}
}
}
}
],
"$defs": {
"nonEmptyString": {
"type": "string",
"minLength": 1
},
"unixTimeInt": {
"type": "integer",
"minimum": 0
},
"sha256Ref": {
"type": "string",
"pattern": "^(sha256:)?[A-Fa-f0-9]{12,64}$"
},
"visibilityLevel": {
"type": "string",
"enum": [
"public",
"interclan",
"incircle",
"soulsafe",
"sacred"
]
},
"consentDecisionType": {
"type": "string",
"enum": [
"approve",
"reject",
"revoke"
]
},
"targetType": {
"type": "string",
"enum": [
"artifact",
"policy",
"bridge_request",
"allocation",
"core_change"
]
},
"operationType": {
"type": "string",
"enum": [
"execute",
"export",
"grant_access",
"change_visibility",
"merge_offline",
"publish",
"transfer",
"dao_action",
"core_update"
]
},
"channelType": {
"type": "string",
"enum": [
"ui",
"api",
"telegram",
"matrix",
"internal",
"webhook",
"bridge"
]
},
"confirmationMethod": {
"type": "string",
"enum": [
"voice",
"biometric",
"key_signature",
"in_person"
]
},
"scope": {
"type": "object",
"additionalProperties": false,
"required": [
"circle_id",
"visibility_level"
],
"properties": {
"circle_id": {
"allOf": [
{
"$ref": "#/$defs/nonEmptyString"
},
{
"maxLength": 128
}
]
},
"gate_level": {
"type": "string",
"maxLength": 64
},
"visibility_level": {
"$ref": "#/$defs/visibilityLevel"
}
}
},
"decision": {
"type": "object",
"additionalProperties": false,
"required": [
"type"
],
"properties": {
"type": {
"$ref": "#/$defs/consentDecisionType"
},
"reason": {
"type": "string",
"maxLength": 240
},
"expires_at": {
"$ref": "#/$defs/unixTimeInt"
}
}
},
"target": {
"type": "object",
"additionalProperties": false,
"required": [
"target_type",
"artifact_ids",
"operation"
],
"properties": {
"target_type": {
"$ref": "#/$defs/targetType"
},
"artifact_ids": {
"type": "array",
"minItems": 1,
"maxItems": 512,
"items": {
"allOf": [
{
"$ref": "#/$defs/nonEmptyString"
},
{
"maxLength": 128
}
]
}
},
"operation": {
"$ref": "#/$defs/operationType"
},
"intent": {
"type": "string",
"maxLength": 200
}
}
},
"confirmation": {
"type": "object",
"additionalProperties": false,
"required": [
"actor",
"method",
"step_up",
"ts"
],
"properties": {
"actor": {
"type": "object",
"additionalProperties": false,
"required": [
"type",
"id"
],
"properties": {
"type": {
"type": "string",
"const": "human"
},
"id": {
"allOf": [
{
"$ref": "#/$defs/nonEmptyString"
},
{
"maxLength": 128
}
]
},
"display": {
"type": "string",
"maxLength": 120
}
}
},
"method": {
"$ref": "#/$defs/confirmationMethod"
},
"step_up": {
"type": "boolean"
},
"proof_ref": {
"type": "string",
"maxLength": 256
},
"ts": {
"$ref": "#/$defs/unixTimeInt"
}
}
},
"quorum": {
"type": "object",
"additionalProperties": false,
"required": [
"rule",
"required",
"present"
],
"properties": {
"rule": {
"type": "string",
"enum": [
"unanimous",
"majority",
"custom"
]
},
"required": {
"type": "integer",
"minimum": 1,
"maximum": 1024
},
"present": {
"type": "integer",
"minimum": 0,
"maximum": 1024
}
}
},
"event_provenance": {
"type": "object",
"additionalProperties": false,
"required": [
"channel",
"request_id",
"input_hash"
],
"properties": {
"channel": {
"$ref": "#/$defs/channelType"
},
"request_id": {
"allOf": [
{
"$ref": "#/$defs/nonEmptyString"
},
{
"maxLength": 128
}
]
},
"input_hash": {
"$ref": "#/$defs/sha256Ref"
}
}
},
"versions": {
"type": "object",
"additionalProperties": false,
"required": [
"constitution_version",
"protocol_version"
],
"properties": {
"constitution_version": {
"allOf": [
{
"$ref": "#/$defs/nonEmptyString"
},
{
"maxLength": 128
}
]
},
"protocol_version": {
"allOf": [
{
"$ref": "#/$defs/nonEmptyString"
},
{
"maxLength": 128
}
]
}
}
},
"integrity": {
"type": "object",
"additionalProperties": false,
"required": [
"event_hash"
],
"properties": {
"event_hash": {
"$ref": "#/$defs/sha256Ref"
},
"prev_hash": {
"$ref": "#/$defs/sha256Ref"
}
}
}
}
}