{ "$schema": "https://json-schema.org/draft/2020-12/schema", "$id": "https://neon-sprawl.local/schemas/quest-def.json", "title": "QuestDef", "description": "Single quest row for catalogs (e.g. content/quests/*_quests.json). IDs are stable forever—rename display in displayName only. See docs/decomposition/modules/E7_M1_QuestStateMachine.md.", "type": "object", "additionalProperties": false, "required": ["id", "displayName", "prerequisiteQuestIds", "steps"], "properties": { "id": { "type": "string", "pattern": "^[a-z][a-z0-9_]*$", "description": "Immutable quest key for accept/progress APIs and telemetry." }, "displayName": { "type": "string", "minLength": 1, "description": "Player-facing label; safe to change without migrating character data." }, "prerequisiteQuestIds": { "type": "array", "items": { "type": "string", "pattern": "^[a-z][a-z0-9_]*$" }, "description": "Quest ids that must be completed before accept; may be empty." }, "steps": { "type": "array", "minItems": 1, "items": { "$ref": "https://neon-sprawl.local/schemas/quest-step-def.json" }, "description": "Ordered steps; prototype Slice 1 uses sequential advance only." } } }