2026-08-18 12:15:41 +02:00
{
"$schema" : "https://json-schema.org/draft/2020-12/schema" ,
"$id" : "https://policy.coulomb.social/schemas/tenancy-posture/v0.1" ,
"title" : "NetKingdom tenancy posture declaration v0.1" ,
"type" : "object" ,
2026-08-19 22:06:20 +02:00
"required" : [
"schema_version" ,
"framework"
] ,
2026-08-18 12:15:41 +02:00
"properties" : {
2026-08-19 22:06:20 +02:00
"schema_version" : {
"const" : "0.1"
} ,
"framework" : {
"const" : "netkingdom-tenancy-posture"
} ,
"service" : {
"$ref" : "#/$defs/serviceName"
} ,
"role" : {
"type" : "string" ,
"minLength" : 1
} ,
"tenancy" : {
"$ref" : "#/$defs/tenancy"
} ,
"provider" : {
"$ref" : "#/$defs/provider"
} ,
"zones" : {
"description" : "Reserved for security-zone membership (tenancy-posture_v0.1 Decision 5.6). Its internal shape is defined by the NetKingdom security-zone standard drafted by zone-engine, not by this schema, and is deliberately unconstrained here until that standard lands. Present so a conformant combined declaration is not rejected by this validator."
} ,
"evidence" : {
"$ref" : "#/$defs/evidence"
} ,
"notes" : {
"$ref" : "#/$defs/stringList"
} ,
2026-08-18 12:15:41 +02:00
"services" : {
"type" : "array" ,
"minItems" : 1 ,
2026-08-19 22:06:20 +02:00
"items" : {
"$ref" : "#/$defs/service"
}
2026-08-18 12:15:41 +02:00
}
} ,
"oneOf" : [
{
2026-08-19 22:06:20 +02:00
"required" : [
"service" ,
"role" ,
"tenancy"
] ,
"not" : {
"required" : [
"services"
]
}
2026-08-18 12:15:41 +02:00
} ,
{
2026-08-19 22:06:20 +02:00
"required" : [
"services"
] ,
"not" : {
"anyOf" : [
{
"required" : [
"service"
]
} ,
{
"required" : [
"role"
]
} ,
{
"required" : [
"tenancy"
]
} ,
{
"required" : [
"provider"
]
} ,
{
"required" : [
"evidence"
]
}
]
}
2026-08-18 12:15:41 +02:00
}
] ,
"additionalProperties" : false ,
"$defs" : {
"serviceName" : {
"type" : "string" ,
"pattern" : "^[a-z0-9][a-z0-9._-]*$"
} ,
"axisName" : {
2026-08-19 22:06:20 +02:00
"enum" : [
"I" ,
"A" ,
"E" ,
"P" ,
"R" ,
"V"
]
2026-08-18 12:15:41 +02:00
} ,
"level" : {
"oneOf" : [
2026-08-19 22:06:20 +02:00
{
"type" : "integer" ,
"minimum" : 0 ,
"maximum" : 4
} ,
{
"const" : "n/a"
}
2026-08-18 12:15:41 +02:00
]
} ,
"axisVector" : {
"type" : "object" ,
2026-08-19 22:06:20 +02:00
"required" : [
"I" ,
"A" ,
"E" ,
"P" ,
"R" ,
"V"
] ,
2026-08-18 12:15:41 +02:00
"properties" : {
2026-08-19 22:06:20 +02:00
"I" : {
"oneOf" : [
{
"type" : "integer" ,
"minimum" : 0 ,
"maximum" : 3
} ,
{
"const" : "n/a"
}
]
} ,
"A" : {
"$ref" : "#/$defs/level"
} ,
"E" : {
"$ref" : "#/$defs/level"
} ,
"P" : {
"$ref" : "#/$defs/level"
} ,
"R" : {
"$ref" : "#/$defs/level"
} ,
"V" : {
"$ref" : "#/$defs/level"
}
2026-08-18 12:15:41 +02:00
} ,
"additionalProperties" : false
} ,
"partialAxisVector" : {
"type" : "object" ,
"minProperties" : 1 ,
"properties" : {
2026-08-19 22:06:20 +02:00
"I" : {
"oneOf" : [
{
"type" : "integer" ,
"minimum" : 0 ,
"maximum" : 3
} ,
{
"const" : "n/a"
}
]
} ,
"A" : {
"$ref" : "#/$defs/level"
} ,
"E" : {
"$ref" : "#/$defs/level"
} ,
"P" : {
"$ref" : "#/$defs/level"
} ,
"R" : {
"$ref" : "#/$defs/level"
} ,
"V" : {
"$ref" : "#/$defs/level"
}
2026-08-18 12:15:41 +02:00
} ,
"additionalProperties" : false
} ,
"stringMap" : {
"type" : "object" ,
2026-08-19 22:06:20 +02:00
"additionalProperties" : {
"type" : "string" ,
"minLength" : 1
}
2026-08-18 12:15:41 +02:00
} ,
"stringList" : {
"type" : "array" ,
2026-08-19 22:06:20 +02:00
"items" : {
"type" : "string" ,
"minLength" : 1
}
2026-08-18 12:15:41 +02:00
} ,
"paths" : {
"type" : "object" ,
2026-08-19 22:06:20 +02:00
"propertyNames" : {
"$ref" : "#/$defs/axisName"
} ,
2026-08-18 12:15:41 +02:00
"additionalProperties" : {
"type" : "object" ,
"minProperties" : 1 ,
2026-08-19 22:06:20 +02:00
"additionalProperties" : {
"$ref" : "#/$defs/level"
}
2026-08-18 12:15:41 +02:00
}
} ,
"placementException" : {
"type" : "object" ,
2026-08-19 22:06:20 +02:00
"required" : [
"tenants" ,
"P" ,
"reason"
] ,
2026-08-18 12:15:41 +02:00
"properties" : {
2026-08-19 22:06:20 +02:00
"tenants" : {
"$ref" : "#/$defs/stringList"
} ,
"P" : {
"type" : "integer" ,
"minimum" : 0 ,
"maximum" : 4
} ,
"reason" : {
"type" : "string" ,
"minLength" : 1
} ,
"tier_ref" : {
"type" : "string" ,
"minLength" : 1
}
2026-08-18 12:15:41 +02:00
} ,
"additionalProperties" : false
} ,
"tenancy" : {
"type" : "object" ,
2026-08-19 22:06:20 +02:00
"required" : [
"current" ,
"target" ,
"reviewed" ,
"review_due" ,
"service_class"
] ,
2026-08-18 12:15:41 +02:00
"properties" : {
2026-08-19 22:06:20 +02:00
"current" : {
"$ref" : "#/$defs/axisVector"
} ,
"implemented" : {
"$ref" : "#/$defs/partialAxisVector"
} ,
"target" : {
"$ref" : "#/$defs/axisVector"
} ,
"reviewed" : {
"type" : "string" ,
"format" : "date"
} ,
"review_due" : {
"type" : "string" ,
"format" : "date"
} ,
"service_class" : {
"enum" : [
"latency-critical" ,
"interactive" ,
"batch"
]
} ,
2026-08-18 12:15:41 +02:00
"permanent" : {
"type" : "array" ,
"uniqueItems" : true ,
2026-08-19 22:06:20 +02:00
"items" : {
"$ref" : "#/$defs/axisName"
}
} ,
"reason" : {
"$ref" : "#/$defs/stringMap"
} ,
"gap" : {
"$ref" : "#/$defs/stringMap"
} ,
"paths" : {
"$ref" : "#/$defs/paths"
2026-08-18 12:15:41 +02:00
} ,
"placement_exceptions" : {
"type" : "array" ,
2026-08-19 22:06:20 +02:00
"items" : {
"$ref" : "#/$defs/placementException"
}
2026-08-18 12:15:41 +02:00
} ,
2026-08-19 22:06:20 +02:00
"secondary_stores" : {
"$ref" : "#/$defs/stringList"
}
2026-08-18 12:15:41 +02:00
} ,
"additionalProperties" : false
} ,
"providerAxis" : {
"type" : "object" ,
2026-08-19 22:06:20 +02:00
"required" : [
"available" ,
"maximum"
] ,
2026-08-18 12:15:41 +02:00
"properties" : {
2026-08-19 22:06:20 +02:00
"available" : {
"$ref" : "#/$defs/level"
} ,
"maximum" : {
"$ref" : "#/$defs/level"
} ,
"conditions" : {
"$ref" : "#/$defs/stringList"
} ,
"evidence" : {
"$ref" : "#/$defs/stringList"
} ,
"reason" : {
"type" : "string" ,
"minLength" : 1
}
2026-08-18 12:15:41 +02:00
} ,
"additionalProperties" : false
} ,
"provider" : {
"type" : "object" ,
2026-08-19 22:06:20 +02:00
"required" : [
"axes"
] ,
2026-08-18 12:15:41 +02:00
"properties" : {
2026-08-19 22:06:20 +02:00
"capability" : {
"type" : "string" ,
"minLength" : 1
} ,
"profile" : {
"type" : "string" ,
"minLength" : 1
} ,
2026-08-18 12:15:41 +02:00
"axes" : {
"type" : "object" ,
"minProperties" : 1 ,
"properties" : {
2026-08-19 22:06:20 +02:00
"I" : {
"$ref" : "#/$defs/providerAxis"
} ,
"A" : {
"$ref" : "#/$defs/providerAxis"
} ,
"E" : {
"$ref" : "#/$defs/providerAxis"
} ,
"P" : {
"$ref" : "#/$defs/providerAxis"
} ,
"R" : {
"$ref" : "#/$defs/providerAxis"
} ,
"V" : {
"$ref" : "#/$defs/providerAxis"
}
2026-08-18 12:15:41 +02:00
} ,
"additionalProperties" : false
}
} ,
"additionalProperties" : false
} ,
"evidence" : {
"type" : "object" ,
"additionalProperties" : {
"oneOf" : [
2026-08-19 22:06:20 +02:00
{
"type" : "string" ,
"minLength" : 1
} ,
{
"$ref" : "#/$defs/stringList"
}
2026-08-18 12:15:41 +02:00
]
}
} ,
"service" : {
"type" : "object" ,
2026-08-19 22:06:20 +02:00
"required" : [
"service" ,
"role" ,
"tenancy"
] ,
2026-08-18 12:15:41 +02:00
"properties" : {
2026-08-19 22:06:20 +02:00
"service" : {
"$ref" : "#/$defs/serviceName"
} ,
"role" : {
"type" : "string" ,
"minLength" : 1
} ,
"tenancy" : {
"$ref" : "#/$defs/tenancy"
} ,
"provider" : {
"$ref" : "#/$defs/provider"
} ,
"evidence" : {
"$ref" : "#/$defs/evidence"
} ,
"notes" : {
"$ref" : "#/$defs/stringList"
}
2026-08-18 12:15:41 +02:00
} ,
"additionalProperties" : false
}
}
}