Files
nicholas 816b28e179
Build & Deploy Formulation / Build & Push Image (push) Successful in 15s
Build & Deploy Formulation / deploy (push) Successful in 12s
build and deploy Formulation application
Consolidate the application, culinary data model, read-only runtime, and registry-backed deployment.
2026-08-13 18:08:25 -05:00

141 lines
5.6 KiB
JSON

{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$id": "https://recipes.uuard.com/schemas/v2/recipe.schema.json",
"title": "Canonical recipe",
"type": "object",
"required": ["schema_version", "id", "title", "yield", "components", "steps", "categories", "tags"],
"additionalProperties": false,
"properties": {
"schema_version": { "$ref": "common.schema.json#/$defs/schemaVersion" },
"id": { "$ref": "common.schema.json#/$defs/id" },
"title": { "$ref": "common.schema.json#/$defs/nonEmptyString" },
"summary": { "type": "string" },
"categories": { "type": "array", "items": { "$ref": "common.schema.json#/$defs/nonEmptyString" }, "uniqueItems": true },
"tags": { "type": "array", "items": { "$ref": "common.schema.json#/$defs/nonEmptyString" }, "uniqueItems": true },
"yield": {
"type": "object",
"required": ["amount"],
"additionalProperties": false,
"properties": {
"amount": { "$ref": "common.schema.json#/$defs/amount" },
"servings": { "$ref": "common.schema.json#/$defs/positiveDecimal" },
"serving_size": { "$ref": "common.schema.json#/$defs/amount" },
"description": { "type": "string" },
"yield_factor": { "type": "number", "exclusiveMinimum": 0 },
"basis": { "type": "string", "enum": ["measured", "estimated", "theoretical"] }
}
},
"scaling": {
"type": "object",
"required": ["mode"],
"additionalProperties": false,
"properties": {
"mode": { "type": "string", "enum": ["amount", "percentage", "hybrid"] },
"basis_id": { "$ref": "common.schema.json#/$defs/id" },
"basis_amount": { "$ref": "common.schema.json#/$defs/amount" }
}
},
"components": {
"type": "array",
"minItems": 1,
"items": {
"type": "object",
"required": ["id", "name", "items"],
"additionalProperties": false,
"properties": {
"id": { "$ref": "common.schema.json#/$defs/id" },
"name": { "$ref": "common.schema.json#/$defs/nonEmptyString" },
"yield": { "$ref": "common.schema.json#/$defs/amount" },
"items": {
"type": "array",
"minItems": 1,
"items": { "$ref": "#/$defs/componentItem" }
},
"notes": { "type": "array", "items": { "type": "string" } }
}
}
},
"steps": {
"type": "array",
"minItems": 1,
"items": {
"type": "object",
"required": ["id", "order", "instruction"],
"additionalProperties": false,
"properties": {
"id": { "$ref": "common.schema.json#/$defs/id" },
"order": { "type": "integer", "minimum": 1 },
"instruction": { "$ref": "common.schema.json#/$defs/nonEmptyString" },
"component_ids": { "type": "array", "items": { "$ref": "common.schema.json#/$defs/id" }, "uniqueItems": true },
"item_ids": { "type": "array", "items": { "$ref": "common.schema.json#/$defs/id" }, "uniqueItems": true },
"equipment_ids": { "type": "array", "items": { "$ref": "common.schema.json#/$defs/id" }, "uniqueItems": true },
"duration": { "$ref": "common.schema.json#/$defs/amount" },
"temperature": { "$ref": "common.schema.json#/$defs/amount" },
"critical_control_point": { "type": "boolean" }
}
}
},
"equipment_ids": { "type": "array", "items": { "$ref": "common.schema.json#/$defs/id" }, "uniqueItems": true },
"shelf_life": {
"type": "object",
"required": ["duration"],
"additionalProperties": false,
"properties": {
"duration": { "$ref": "common.schema.json#/$defs/amount" },
"storage_condition": { "$ref": "common.schema.json#/$defs/nonEmptyString" },
"notes": { "type": "string" }
}
},
"media": { "type": "array", "items": { "$ref": "common.schema.json#/$defs/media" } },
"notes": { "type": "array", "items": { "type": "string" } },
"extensions": { "type": "object", "additionalProperties": true }
},
"$defs": {
"componentItem": {
"type": "object",
"required": ["id", "reference", "amount"],
"additionalProperties": false,
"properties": {
"id": { "$ref": "common.schema.json#/$defs/id" },
"reference": {
"oneOf": [
{
"type": "object",
"required": ["ingredient_id"],
"additionalProperties": false,
"properties": { "ingredient_id": { "$ref": "common.schema.json#/$defs/id" } }
},
{
"type": "object",
"required": ["recipe_id"],
"additionalProperties": false,
"properties": {
"recipe_id": { "$ref": "common.schema.json#/$defs/id" },
"component_id": { "$ref": "common.schema.json#/$defs/id" }
}
}
]
},
"amount": { "$ref": "common.schema.json#/$defs/amount" },
"percentage": { "type": "number", "minimum": 0 },
"basis_member": { "type": "boolean" },
"prep": {
"type": "array",
"items": {
"type": "object",
"required": ["action_id"],
"additionalProperties": false,
"properties": {
"action_id": { "$ref": "common.schema.json#/$defs/id" },
"yield_factor": { "type": "number", "exclusiveMinimum": 0, "maximum": 1 },
"notes": { "type": "string" }
}
}
},
"optional": { "type": "boolean", "default": false },
"notes": { "type": "string" }
}
}
}
}