"description":"Normative shape for declarations/reef.yaml in every reef-* repo. Authored by railiance-master under RMASTER-WP-0021-T04 from the live reef-railiance declaration and docs/reef-substrate-model.md. bound_rapps is a derived projection of rapp.bound_reefs, not a hand-maintained registry.",
"description":"Fixed discriminator. The live reef already uses this value."
},
"reef_id":{
"$ref":"#/$defs/reefSlug",
"description":"Canonical identifier for the reef. Must equal the repo slug."
},
"repo":{
"$ref":"#/$defs/repoSlug",
"description":"The reef-* repo holding this declaration."
},
"ownership_repo":{
"$ref":"#/$defs/repoSlug",
"description":"The ownership-axis repo accountable for this substrate boundary. The live reef names railiance-infra."
},
"substrate_kind":{
"type":"string",
"pattern":"^[a-z0-9]+(-[a-z0-9]+)*$",
"minLength":3,
"description":"What kind of substrate this reef is. Live value is server-group. Kept as a slug rather than a closed enum so a new substrate shape does not require a schema change. See docs/reef-substrate-model.md."
},
"lifecycle_state":{
"enum":["planned","active","retired"],
"description":"Lifecycle of the reef as a substrate boundary. Distinct from rail readiness_state and from the per-binding admission states in docs/reef-production-readiness-contract.md (declared/installed/verified/production-approved/deprecated)."
},
"criticality":{
"enum":["low","medium","high","critical"],
"description":"Operational criticality of the substrate. Same vocabulary as rapp.yaml. The live reef is high."
},
"primary_rail":{
"$ref":"#/$defs/railSlug",
"description":"The default rail on this reef. Must appear in hosted_rails. The validator enforces that sibling check."
},
"hosted_rails":{
"type":"array",
"minItems":1,
"uniqueItems":true,
"items":{"$ref":"#/$defs/railSlug"},
"description":"Rails this reef hosts or is prepared to host. Topology, not readiness: hosting a rail does not make it production-approved. See ADR-0006."
},
"bound_rapps":{
"type":"array",
"uniqueItems":true,
"items":{"$ref":"#/$defs/rappSlug"},
"description":"DERIVED. Projection of every rapp declaration whose bound_reefs lists this reef. Optional so a reef may omit the field and let the validator compute it. If present, the validator requires an exact match against that projection. reef-railiance currently hand-lists rapp-qonto only; that list is already stale (rapp-openbao and rapp-postgres are live on the same reef). Migration: either delete the field, or replace it with the derived set once those rapps name this reef."
},
"current_members":{
"type":"array",
"minItems":1,
"uniqueItems":true,
"items":{"type":"string","minLength":1},
"description":"Named machines or units that currently compose this reef. Not slugs: live value is Railiance01. A reef is a substrate boundary, not a hostname list, but the members must be named so the boundary is inspectable."
},
"compatibility_notes":{
"$ref":"#/$defs/notes",
"description":"Human-readable caveats. Never load-bearing."
},
"source_documents":{
"type":"array",
"minItems":1,
"items":{"$ref":"#/$defs/sourceDocument"}
}
},
"$defs":{
"repoSlug":{
"type":"string",
"pattern":"^[a-z0-9]+(-[a-z0-9]+)*$",
"minLength":2
},
"railSlug":{
"type":"string",
"pattern":"^rail-[a-z0-9]+(-[a-z0-9]+)*$"
},
"rappSlug":{
"type":"string",
"pattern":"^rapp-[a-z0-9]+(-[a-z0-9]+)*$"
},
"reefSlug":{
"type":"string",
"pattern":"^reef-[a-z0-9]+(-[a-z0-9]+)*$"
},
"notes":{
"type":"array",
"items":{"type":"string","minLength":1},
"description":"Human-readable caveats. Never load-bearing: nothing may depend on parsing a note."