95 lines
4.2 KiB
JSON
95 lines
4.2 KiB
JSON
|
|
{
|
||
|
|
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
||
|
|
"$id": "https://hermes.bstein.dev/contracts/hux/v1/privacy.schema.json",
|
||
|
|
"title": "HUX privacy policy, topic scoping and retention",
|
||
|
|
"description": "Sensitive-topic behaviour (HUX-10). The policy names each topic class, whether memory may be written from it, how long conversation-scoped context survives, and which just-in-time notice the surface must show. A retention audit record proves the rules ran.",
|
||
|
|
"$defs": {
|
||
|
|
"topic": {"type": "string", "enum": ["health", "finance", "legal", "relationships", "credentials", "minors", "location", "biometric"]},
|
||
|
|
"policy": {
|
||
|
|
"type": "object",
|
||
|
|
"additionalProperties": false,
|
||
|
|
"required": ["schema", "version", "topics", "topic_scoping", "retention_audit"],
|
||
|
|
"properties": {
|
||
|
|
"schema": {"const": "hux.privacy_policy.v1"},
|
||
|
|
"version": {"type": "integer", "minimum": 1},
|
||
|
|
"topics": {
|
||
|
|
"type": "array",
|
||
|
|
"minItems": 8,
|
||
|
|
"items": {
|
||
|
|
"type": "object",
|
||
|
|
"additionalProperties": false,
|
||
|
|
"required": ["topic", "sensitivity", "memory_write", "decay_days", "notice"],
|
||
|
|
"properties": {
|
||
|
|
"topic": {"$ref": "#/$defs/topic"},
|
||
|
|
"sensitivity": {"$ref": "common.schema.json#/$defs/sensitivity"},
|
||
|
|
"memory_write": {"type": "string", "enum": ["ask", "deny"]},
|
||
|
|
"decay_days": {"type": "integer", "minimum": 1, "maximum": 365},
|
||
|
|
"notice": {"type": "string", "minLength": 1, "maxLength": 280}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
},
|
||
|
|
"topic_scoping": {
|
||
|
|
"type": "object",
|
||
|
|
"additionalProperties": false,
|
||
|
|
"required": ["scope_to_conversation", "cross_surface_sharing"],
|
||
|
|
"properties": {
|
||
|
|
"scope_to_conversation": {"const": true},
|
||
|
|
"cross_surface_sharing": {"type": "string", "enum": ["never", "same_owner_only"]}
|
||
|
|
}
|
||
|
|
},
|
||
|
|
"retention_audit": {
|
||
|
|
"type": "object",
|
||
|
|
"additionalProperties": false,
|
||
|
|
"required": ["interval_days", "actions"],
|
||
|
|
"properties": {
|
||
|
|
"interval_days": {"type": "integer", "minimum": 1, "maximum": 30},
|
||
|
|
"actions": {"type": "array", "minItems": 1, "uniqueItems": true, "items": {"type": "string", "enum": ["expire_memory", "decay_topic_context", "purge_forgotten_content", "report"]}}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
},
|
||
|
|
"notice": {
|
||
|
|
"type": "object",
|
||
|
|
"description": "Just-in-time notice a surface shows when a sensitive topic is detected. Emitted as event kind privacy.notice.",
|
||
|
|
"additionalProperties": false,
|
||
|
|
"required": ["schema", "topic", "conversation_id", "text", "controls", "shown_at"],
|
||
|
|
"properties": {
|
||
|
|
"schema": {"const": "hux.privacy_notice.v1"},
|
||
|
|
"topic": {"$ref": "#/$defs/topic"},
|
||
|
|
"conversation_id": {"$ref": "common.schema.json#/$defs/id"},
|
||
|
|
"text": {"type": "string", "minLength": 1, "maxLength": 280},
|
||
|
|
"controls": {"type": "array", "minItems": 1, "uniqueItems": true, "items": {"type": "string", "enum": ["forget_this_conversation", "switch_to_private", "disable_memory_here", "dismiss"]}},
|
||
|
|
"shown_at": {"$ref": "common.schema.json#/$defs/timestamp"}
|
||
|
|
}
|
||
|
|
},
|
||
|
|
"audit": {
|
||
|
|
"type": "object",
|
||
|
|
"additionalProperties": false,
|
||
|
|
"required": ["schema", "id", "ran_at", "policy_version", "results"],
|
||
|
|
"properties": {
|
||
|
|
"schema": {"const": "hux.retention_audit.v1"},
|
||
|
|
"id": {"$ref": "common.schema.json#/$defs/id"},
|
||
|
|
"ran_at": {"$ref": "common.schema.json#/$defs/timestamp"},
|
||
|
|
"policy_version": {"type": "integer", "minimum": 1},
|
||
|
|
"results": {
|
||
|
|
"type": "array",
|
||
|
|
"items": {
|
||
|
|
"type": "object",
|
||
|
|
"additionalProperties": false,
|
||
|
|
"required": ["action", "count"],
|
||
|
|
"properties": {
|
||
|
|
"action": {"type": "string", "enum": ["expire_memory", "decay_topic_context", "purge_forgotten_content", "report"]},
|
||
|
|
"count": {"type": "integer", "minimum": 0}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
},
|
||
|
|
"oneOf": [
|
||
|
|
{"$ref": "#/$defs/policy"},
|
||
|
|
{"$ref": "#/$defs/notice"},
|
||
|
|
{"$ref": "#/$defs/audit"}
|
||
|
|
]
|
||
|
|
}
|