{ "$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"} ] }