{ "$schema": "https://json-schema.org/draft/2020-12/schema", "$id": "https://nova.cloudinit.dev/schemas/modules-lifecycle-pipeline.schema.json", "title": "Nova Modules Lifecycle Pipeline Contract", "description": "Declarative contract for the modules-lifecycle pipeline. Matrix-runs each L1 module's examples/{simple,complex}.yml contracts through apply→modify→destroy against live AWS. Both Gitea Actions (.gitea/workflows/modules-lifecycle.yml) and GitHub Actions (.github/workflows/modules-lifecycle.yml) implement this contract byte-identically.", "type": "object", "required": ["name", "triggers", "runner", "python_version", "terraform_version", "stages", "matrix"], "properties": { "name": { "type": "string", "description": "Pipeline name (matches the workflow 'name:' field)." }, "triggers": { "type": "object", "required": ["pull_request", "workflow_dispatch"], "properties": { "pull_request": { "type": "array", "items": {"type": "string"}, "description": "Branches that trigger the pipeline on PR." }, "workflow_dispatch": { "description": "Manual dispatch — either an empty array (no params) or an object with an 'inputs' array of {name, description, default} objects (REQ-134).", "oneOf": [ {"type": "array", "items": {"type": "string"}}, {"type": "object", "properties": { "inputs": { "type": "array", "items": { "type": "object", "required": ["name"], "properties": { "name": {"type": "string"}, "description": {"type": "string"}, "default": {"type": "string"} } } } } } ] } } }, "runner": { "type": "string", "description": "Runner image (e.g. 'ubuntu-latest')." }, "python_version": { "type": "string", "description": "Python version for setup-python action." }, "terraform_version": { "type": "string", "description": "Terraform version constraint (e.g. '1.9.*')." }, "default_mode": { "type": "string", "enum": ["plan", "full"], "description": "Default lifecycle mode (REQ-134, v1.12): 'plan' = plan-only (fast, no AWS mutation, no credentials, no cost); 'full' = real apply→modify→destroy against live AWS. Overridable via the ACDL_LIFECYCLE_MODE CI variable / workflow_dispatch input." }, "stages": { "type": "array", "minItems": 1, "items": {"$ref": "#/$defs/stage"} }, "matrix": { "type": "object", "required": ["modules"], "properties": { "modules": { "type": "array", "items": {"type": "string"}, "description": "L1 module names to test." }, "vpc_dependent": { "type": "array", "items": {"type": "string"}, "description": "Modules that require the platform VPC prerequisite." }, "independent": { "type": "array", "items": {"type": "string"}, "description": "Modules that run without the platform VPC." }, "l2_modules": { "type": "array", "items": {"type": "string"}, "description": "L2 composition module names to test." } } } }, "$defs": { "stage": { "type": "object", "required": ["name", "command", "required"], "properties": { "name": { "type": "string", "description": "Stage name (maps to the workflow job/step name)." }, "command": { "type": "string", "description": "The shell command to run for this stage." }, "required": { "type": "boolean", "description": "If true, a non-zero exit code fails the pipeline." }, "description": { "type": "string", "description": "Optional: human-readable description of what this stage does." } } } } }