#!/usr/bin/env python3 import hashlib import json import pathlib import sys import bpy CONTRACT_TEXT_NAME = "WBV2-P0-003-CapabilityContract" CONTRACT_ID = "workflow:freeze_capability_error_budget_contract" def contract_payload(): payload = { "schemaVersion": 1, "contractId": CONTRACT_ID, "capability": {"level": "L0", "status": "BOUNDED"}, "revision": {"base": 0, "current": 1}, "budget": {"maxErrors": 8, "maxMessageBytes": 256, "maxUnknownFields": 16}, "errors": [ {"code": "PROTOCOL_MISMATCH", "severity": "error", "recoverable": True}, {"code": "REVISION_CONFLICT", "severity": "error", "recoverable": True}, {"code": "OPEN_CANCELLED", "severity": "info", "recoverable": True}, {"code": "CAPABILITY_CONTRACT_INVALID", "severity": "error", "recoverable": True}, {"code": "CAPABILITY_CONTRACT_BUDGET_EXCEEDED", "severity": "error", "recoverable": True}, {"code": "CAPABILITY_CONTRACT_UNSUPPORTED", "severity": "error", "recoverable": False}, {"code": "CAPABILITY_CONTRACT_SCHEMA_HASH_MISMATCH", "severity": "fatal", "recoverable": False}, {"code": "CAPABILITY_CONTRACT_MIGRATION_BLOCKED", "severity": "error", "recoverable": True}, ], "cancellation": {"code": "OPEN_CANCELLED", "preservesRevision": True}, "migration": { "currentSchemaVersion": 1, "supportedSchemaVersions": [1], "preserveUnknown": True, "strategy": "RETAIN_UNKNOWN", }, "extensions": {"futureField": {"kind": "opaque", "value": "preserve-me"}}, } canonical = json.dumps(payload, sort_keys=True, separators=(",", ":")) payload["schemaHash"] = hashlib.sha256(canonical.encode("utf-8")).hexdigest() return payload def main(output: pathlib.Path) -> None: bpy.ops.wm.read_factory_settings(use_empty=True) text = bpy.data.texts.new(CONTRACT_TEXT_NAME) text.write(json.dumps(contract_payload(), sort_keys=True, separators=(",", ":"))) text.use_fake_user = True bpy.ops.wm.save_as_mainfile(filepath=str(output.resolve()), check_existing=False, compress=True) if __name__ == "__main__": arguments = sys.argv[sys.argv.index("--") + 1 :] if len(arguments) != 1: raise SystemExit("usage: blender -b --factory-startup --python WBV2-P0-003.py -- OUTPUT") main(pathlib.Path(arguments[0]))