{ "$schema": "https://json-schema.org/draft/2020-12/schema", "$id": "https://neon-sprawl.local/schemas/contract-template.json", "title": "ContractTemplate", "description": "Single contract template row for catalogs (e.g. content/contracts/*_contract_templates.json). Repeatable mission skeleton keyed by zone difficulty band. See docs/decomposition/modules/E7_M4_ContractMissionGenerator.md.", "type": "object", "additionalProperties": false, "required": [ "id", "displayName", "zoneDifficultyBand", "objectiveKind", "encounterTemplateId", "minFactionStanding", "completionRewardBundle" ], "properties": { "id": { "type": "string", "pattern": "^[a-z][a-z0-9_]*$", "description": "Immutable template key for issuance APIs and telemetry." }, "displayName": { "type": "string", "minLength": 1, "description": "Player-facing label; safe to change without migrating instance data." }, "zoneDifficultyBand": { "type": "integer", "minimum": 1, "description": "Difficulty band used to filter eligible templates at issue time (E4.M1 live zone deferred in Slice 4 v1)." }, "objectiveKind": { "type": "string", "enum": ["encounter_clear"], "description": "Objective discriminator; Slice 4 v1 binds encounterTemplateId only." }, "encounterTemplateId": { "type": "string", "pattern": "^[a-z][a-z0-9_]*$", "description": "Encounter template id from content/encounters (E5.M3)." }, "minFactionStanding": { "$ref": "https://neon-sprawl.local/schemas/faction-gate-rule.json", "description": "Minimum faction standing required to issue this template." }, "completionRewardBundle": { "$ref": "https://neon-sprawl.local/schemas/quest-reward-bundle.json", "description": "Repeat completion payout delivered via RewardRouterOperations (E7.M2); separate idempotency from quest and first-time encounter loot." } } }