"description":"Normative shape for declarations/rail.yaml in every rail-* repo. Authored by railiance-master under RMASTER-WP-0021-T04 from the two live rails and docs/rail-composition-contract.md. Codifies current practice; it does not tighten the rail family beyond what both live declarations already carry.",
"description":"Fixed discriminator. Both live rails already agree on this value."
},
"rail_id":{
"$ref":"#/$defs/railSlug",
"description":"Canonical identifier for the rail. Must equal the repo slug."
},
"repo":{
"$ref":"#/$defs/repoSlug",
"description":"The rail-* repo holding this declaration."
},
"ownership_repo":{
"$ref":"#/$defs/repoSlug",
"description":"The ownership-axis repo accountable for this execution contract. Both live rails name railiance-cluster."
},
"contract_version":{
"$ref":"#/$defs/semver",
"description":"Version of this rail contract. A derived rail pins the base contract with base_rail_contract, which is a separate field."
},
"composition_kind":{
"enum":["base","derived"],
"description":"base owns a complete workload execution contract for a substrate class. derived inherits a versioned base-rail contract and owns only its specialization. See docs/rail-composition-contract.md and ADR-0005."
},
"execution_architecture":{
"type":"string",
"minLength":3,
"description":"The operations architecture this rail names, e.g. kubernetes, knative-serving-on-kubernetes. Free-form on purpose: a new rail is justified by new semantics, not by an enum update."
"description":"Readiness of the rail contract itself, matching docs/rail-composition-contract.md. Distinct from rapp readiness_state (draft/declared/deployed/verified/retired) and from reef lifecycle_state. Do not unify the three vocabularies without a separate decision."
},
"required_substrate_capabilities":{
"type":"array",
"minItems":1,
"uniqueItems":true,
"items":{"type":"string","minLength":1},
"description":"Capabilities the substrate must publish before this rail is usable. This is the live name; the bootstrap contract's older substrate_prerequisites label is retired in favour of this field."
},
"supported_rollout_modes":{
"type":"array",
"minItems":1,
"uniqueItems":true,
"items":{"type":"string","minLength":1},
"description":"Rollout modes this rail supports, e.g. stage1-run, revision-canary."
},
"default_for":{
"type":"array",
"minItems":1,
"uniqueItems":true,
"items":{"type":"string","minLength":1},
"description":"Workload classes this rail is the default for. Present on the base rail today; optional so a derived rail is not forced to claim default status."
},
"compatibility_notes":{
"$ref":"#/$defs/notes",
"description":"Human-readable caveats. Never load-bearing."
},
"base_rail":{
"$ref":"#/$defs/railSlug",
"description":"Required on derived rails. The rail whose contract is inherited."
},
"base_rail_contract":{
"$ref":"#/$defs/semver",
"description":"Required on derived rails. Exact contract_version of the base rail this derivation is written against. Ranges are not pins."
},
"inherited_semantics":{
"type":"array",
"minItems":1,
"uniqueItems":true,
"items":{"type":"string","minLength":1},
"description":"Required on derived rails. Semantics taken from the base contract rather than restated."
},
"overridden_semantics":{
"type":"array",
"minItems":1,
"uniqueItems":true,
"items":{"type":"string","minLength":1},
"description":"Required on derived rails. The only semantics this rail owns. If this list is empty the derived rail has no reason to exist."
},
"compatibility_constraints":{
"type":"array",
"minItems":1,
"items":{"type":"string","minLength":1},
"description":"Required on derived rails. Constraints a substrate or binding must satisfy to use this derivation."
"description":"Which listener classes this rail may emit. Optional; omitted means private (ADR-0008). public is permission to emit Ingress for a granted binding, not a blanket public default.",
"properties":{
"posture":{
"enum":["private","operator","public"],
"description":"Default if exposure is omitted: private."