{"id":"challenge-3-v1","map":{"name":"Woodland","groundZ":4,"description":"20x20 buildable land, x/y 1..20, inside a tree-lined 22x22 map. Flat at z4. Entrance path at x11, y19..21. Trees are decorative on the unowned perimeter; all 400 interior tiles are buildable. Track height cap z32. Paths and stations stay at z4."},"size":22,"startingCash":32000,"duration":129600,"objective":{"metric":"excitementHours","direction":"maximize","ticksPerSecond":60,"description":"Maximize excitement-hours from all qualifying coasters, with no scoring cap: excitement >=4, at least 50 completed customers, tested, open, connected and unbroken. No intensity or park-rating threshold. Finish the 12-month season with at least two qualifying coasters. Each additional qualifying coaster adds its excitement for every tick it operates. Never go bankrupt or crash. Build burger stalls, drink stalls and toilets to support guests. Construction advances simulation at 60 ticks per physical unit. Shops do not directly score."},"economy":{"entryFee":3,"freeRides":true,"guestArrivalMultiplier":6,"guestCapacityMultiplier":2,"guestIntensityPreference":[3,8]},"actionBudget":1024,"maxStep":10800,"minRating":0,"ratingGrace":0,"maxStaff":12,"constraints":{"minCoasters":2,"minCustomersPerCoaster":50,"minExcitement":4,"maxTrackZ":32,"maxPieces":128,"finalWindowTicks":10800,"minJointTicks":0,"maxCrashes":0},"title":"Challenge #3","seed":42,"prices":"$3 park admission; flat rides and coasters free; shops at engine defaults","rides":["burger","drinks","toilets"],"designs":[],"actions":{"rideReset":["id"],"fireStaff":["id"],"removeRide":["id"],"pathElement":["x","y","z","slope","queue","rideId","edges"],"removePathElement":["x","y","z"],"rideAtHeight":["type","x","y","z","rot"],"rideDoor":["id","exit","x","y","z","dir"],"rideStatus":["id","open"],"editCoaster":["id","pieces"],"customCoaster":["kind","name","x","y","z","rot","pieces","colours"],"hire":["type"],"wait":["ticks","until"]},"customCoaster":{"kind":"corkscrew","maxPieces":128,"stationZ":4,"maxTrackZ":32,"preview":"python agent.py draft accepts an unfinished customCoaster piece list; preview accepts a complete circuit. Both check geometry and run an empty ghost train for up to 10,800 test ticks, with no committed cash/actions/ticks spent. Inspect physics.completedLap, ratings, G-forces and status. A passed empty lap is not a loaded-train or eligibility guarantee. The watch link shows the latest ghost draft looping while you edit. Submit a complete action with act to build.","editing":"editCoaster {id,pieces} replaces the layout of an existing custom coaster. Read rides[].coaster.pieceList for a valid editable list with chain toggles; id is the ride id. Keep every station piece unchanged. Preview/draft accepts editCoaster even while the original is open. To commit, close the ride, drain or rideReset passengers, and repair any breakdown. Same ID, name, doors and paths; unchanged track is reused for free. New or replaced pieces cost their full catalog price; removed track gives no refund, and the ride base cost is not charged again. Preview returns exact cost and reused/added/removed piece counts. Success leaves the ride closed with fresh trains, no test ratings and zero qualifying customers; existing income, maintenance history and previously earned score remain. Reopen and earn a fresh test lap and 50 customers. Failed edits restore the original park; an unchanged layout is rejected.","stacking":"Tracks may cross themselves, other coasters and ground paths with clearance. Paths reserve 32 height units. Shops and huts remain exclusive tiles. Stations remain z4.","geometry":"Coordinates: x east, y south, directions 0 north, 1 east, 2 south, 3 west. Local offsets face north; rotate (x,y) -> (-y,x) once per direction quarter turn. Keep a cursor at station x,y,height=z*16,dir=rot. For each piece: base=cursor.height-zBegin; rotate and add end to cursor x/y, turn by rotation, then advance one tile in the new direction; new height=base+zEnd. Final cursor must equal the initial cursor. First station is included. Chain starts off; chain toggles it and only chainCompatible pieces use it. Consecutive pieces must match pitchEnd/pitchStart and rollEnd/rollStart.","clearance":"blocks are local tile offsets with base/top height offsets relative to the piece base, in engine units (16 per z level). Rotate offsets with the piece; rotate the 4-bit quarters mask by ((q << dir) | (q >> (4-dir))) & 15. Track blocks collide only when their tile and quarters overlap and their half-open [base,top) height ranges overlap. Blocks with quarters=0 reserve no train volume but still must stay inside owned land. Repeated blocks on a tile are intentional.","baseCost":950,"pieces":[{"name":"station","cost":78.7,"end":[0,0],"rotation":0,"zBegin":0,"zEnd":0,"chainCompatible":false,"pitchStart":"none","pitchEnd":"none","rollStart":"none","rollEnd":"none","blocks":[{"x":0,"y":0,"base":0,"top":24,"quarters":15}]},{"name":"flat","cost":52.5,"end":[0,0],"rotation":0,"zBegin":0,"zEnd":0,"chainCompatible":true,"pitchStart":"none","pitchEnd":"none","rollStart":"none","rollEnd":"none","blocks":[{"x":0,"y":0,"base":0,"top":24,"quarters":15}]},{"name":"brakes","cost":72.1,"end":[0,0],"rotation":0,"zBegin":0,"zEnd":0,"chainCompatible":false,"pitchStart":"none","pitchEnd":"none","rollStart":"none","rollEnd":"none","blocks":[{"x":0,"y":0,"base":0,"top":24,"quarters":15}]},{"name":"chain","description":"Toggle chain lift for subsequent compatible track pieces"},{"name":"flatToUp60","cost":78.7,"end":[0,0],"rotation":0,"zBegin":0,"zEnd":24,"chainCompatible":true,"pitchStart":"none","pitchEnd":"up60","rollStart":"none","rollEnd":"none","blocks":[{"x":0,"y":0,"base":0,"top":48,"quarters":15}]},{"name":"up60","cost":91.8,"end":[0,0],"rotation":0,"zBegin":0,"zEnd":64,"chainCompatible":true,"pitchStart":"up60","pitchEnd":"up60","rollStart":"none","rollEnd":"none","blocks":[{"x":0,"y":0,"base":0,"top":88,"quarters":15}]},{"name":"up60ToFlat","cost":78.7,"end":[0,0],"rotation":0,"zBegin":0,"zEnd":24,"chainCompatible":true,"pitchStart":"up60","pitchEnd":"none","rollStart":"none","rollEnd":"none","blocks":[{"x":0,"y":0,"base":0,"top":48,"quarters":15}]},{"name":"flatToDown60","cost":78.7,"end":[0,0],"rotation":0,"zBegin":24,"zEnd":0,"chainCompatible":true,"pitchStart":"none","pitchEnd":"down60","rollStart":"none","rollEnd":"none","blocks":[{"x":0,"y":0,"base":0,"top":48,"quarters":15}]},{"name":"down60","cost":91.8,"end":[0,0],"rotation":0,"zBegin":64,"zEnd":0,"chainCompatible":true,"pitchStart":"down60","pitchEnd":"down60","rollStart":"none","rollEnd":"none","blocks":[{"x":0,"y":0,"base":0,"top":88,"quarters":15}]},{"name":"down60ToFlat","cost":78.7,"end":[0,0],"rotation":0,"zBegin":24,"zEnd":0,"chainCompatible":true,"pitchStart":"down60","pitchEnd":"none","rollStart":"none","rollEnd":"none","blocks":[{"x":0,"y":0,"base":0,"top":48,"quarters":15}]},{"name":"flatToUp25","cost":59,"end":[0,0],"rotation":0,"zBegin":0,"zEnd":8,"chainCompatible":true,"pitchStart":"none","pitchEnd":"up25","rollStart":"none","rollEnd":"none","blocks":[{"x":0,"y":0,"base":0,"top":32,"quarters":15}]},{"name":"up25","cost":63.9,"end":[0,0],"rotation":0,"zBegin":0,"zEnd":16,"chainCompatible":true,"pitchStart":"up25","pitchEnd":"up25","rollStart":"none","rollEnd":"none","blocks":[{"x":0,"y":0,"base":0,"top":40,"quarters":15}]},{"name":"up25ToFlat","cost":59,"end":[0,0],"rotation":0,"zBegin":0,"zEnd":8,"chainCompatible":true,"pitchStart":"up25","pitchEnd":"none","rollStart":"none","rollEnd":"none","blocks":[{"x":0,"y":0,"base":0,"top":32,"quarters":15}]},{"name":"flatToDown25","cost":59,"end":[0,0],"rotation":0,"zBegin":8,"zEnd":0,"chainCompatible":true,"pitchStart":"none","pitchEnd":"down25","rollStart":"none","rollEnd":"none","blocks":[{"x":0,"y":0,"base":0,"top":32,"quarters":15}]},{"name":"down25","cost":63.9,"end":[0,0],"rotation":0,"zBegin":16,"zEnd":0,"chainCompatible":true,"pitchStart":"down25","pitchEnd":"down25","rollStart":"none","rollEnd":"none","blocks":[{"x":0,"y":0,"base":0,"top":40,"quarters":15}]},{"name":"down25ToFlat","cost":59,"end":[0,0],"rotation":0,"zBegin":8,"zEnd":0,"chainCompatible":true,"pitchStart":"down25","pitchEnd":"none","rollStart":"none","rollEnd":"none","blocks":[{"x":0,"y":0,"base":0,"top":32,"quarters":15}]},{"name":"leftTurn3","cost":123.6,"end":[-1,-1],"rotation":3,"zBegin":0,"zEnd":0,"chainCompatible":false,"pitchStart":"none","pitchEnd":"none","rollStart":"none","rollEnd":"none","blocks":[{"x":0,"y":0,"base":0,"top":24,"quarters":7},{"x":-1,"y":0,"base":0,"top":24,"quarters":8},{"x":0,"y":-1,"base":0,"top":24,"quarters":2},{"x":-1,"y":-1,"base":0,"top":24,"quarters":7}]},{"name":"rightTurn3","cost":123.6,"end":[1,-1],"rotation":1,"zBegin":0,"zEnd":0,"chainCompatible":false,"pitchStart":"none","pitchEnd":"none","rollStart":"none","rollEnd":"none","blocks":[{"x":0,"y":0,"base":0,"top":24,"quarters":11},{"x":1,"y":0,"base":0,"top":24,"quarters":4},{"x":0,"y":-1,"base":0,"top":24,"quarters":1},{"x":1,"y":-1,"base":0,"top":24,"quarters":11}]},{"name":"leftTurn5","cost":206.1,"end":[-2,-2],"rotation":3,"zBegin":0,"zEnd":0,"chainCompatible":false,"pitchStart":"none","pitchEnd":"none","rollStart":"none","rollEnd":"none","blocks":[{"x":0,"y":0,"base":0,"top":24,"quarters":15},{"x":-1,"y":0,"base":0,"top":24,"quarters":8},{"x":0,"y":-1,"base":0,"top":24,"quarters":7},{"x":-1,"y":-1,"base":0,"top":24,"quarters":13},{"x":-2,"y":-1,"base":0,"top":24,"quarters":8},{"x":-1,"y":-2,"base":0,"top":24,"quarters":7},{"x":-2,"y":-2,"base":0,"top":24,"quarters":15}]},{"name":"rightTurn5","cost":206.1,"end":[2,-2],"rotation":1,"zBegin":0,"zEnd":0,"chainCompatible":false,"pitchStart":"none","pitchEnd":"none","rollStart":"none","rollEnd":"none","blocks":[{"x":0,"y":0,"base":0,"top":24,"quarters":15},{"x":1,"y":0,"base":0,"top":24,"quarters":4},{"x":0,"y":-1,"base":0,"top":24,"quarters":11},{"x":1,"y":-1,"base":0,"top":24,"quarters":14},{"x":2,"y":-1,"base":0,"top":24,"quarters":4},{"x":1,"y":-2,"base":0,"top":24,"quarters":11},{"x":2,"y":-2,"base":0,"top":24,"quarters":15}]},{"name":"flatToLeftBank","cost":55.7,"end":[0,0],"rotation":0,"zBegin":0,"zEnd":0,"chainCompatible":false,"pitchStart":"none","pitchEnd":"none","rollStart":"none","rollEnd":"left","blocks":[{"x":0,"y":0,"base":0,"top":24,"quarters":15}]},{"name":"flatToRightBank","cost":55.7,"end":[0,0],"rotation":0,"zBegin":0,"zEnd":0,"chainCompatible":false,"pitchStart":"none","pitchEnd":"none","rollStart":"none","rollEnd":"right","blocks":[{"x":0,"y":0,"base":0,"top":24,"quarters":15}]},{"name":"leftBankToFlat","cost":55.7,"end":[0,0],"rotation":0,"zBegin":0,"zEnd":0,"chainCompatible":false,"pitchStart":"none","pitchEnd":"none","rollStart":"left","rollEnd":"none","blocks":[{"x":0,"y":0,"base":0,"top":24,"quarters":15}]},{"name":"rightBankToFlat","cost":55.7,"end":[0,0],"rotation":0,"zBegin":0,"zEnd":0,"chainCompatible":false,"pitchStart":"none","pitchEnd":"none","rollStart":"right","rollEnd":"none","blocks":[{"x":0,"y":0,"base":0,"top":24,"quarters":15}]},{"name":"bankedLeftTurn3","cost":131.4,"end":[-1,-1],"rotation":3,"zBegin":0,"zEnd":0,"chainCompatible":false,"pitchStart":"none","pitchEnd":"none","rollStart":"left","rollEnd":"left","blocks":[{"x":0,"y":0,"base":0,"top":24,"quarters":7},{"x":-1,"y":0,"base":0,"top":24,"quarters":8},{"x":0,"y":-1,"base":0,"top":24,"quarters":2},{"x":-1,"y":-1,"base":0,"top":24,"quarters":7}]},{"name":"bankedRightTurn3","cost":131.4,"end":[1,-1],"rotation":1,"zBegin":0,"zEnd":0,"chainCompatible":false,"pitchStart":"none","pitchEnd":"none","rollStart":"right","rollEnd":"right","blocks":[{"x":0,"y":0,"base":0,"top":24,"quarters":11},{"x":1,"y":0,"base":0,"top":24,"quarters":4},{"x":0,"y":-1,"base":0,"top":24,"quarters":1},{"x":1,"y":-1,"base":0,"top":24,"quarters":11}]},{"name":"bankedLeftTurn5","cost":219,"end":[-2,-2],"rotation":3,"zBegin":0,"zEnd":0,"chainCompatible":false,"pitchStart":"none","pitchEnd":"none","rollStart":"left","rollEnd":"left","blocks":[{"x":0,"y":0,"base":0,"top":24,"quarters":15},{"x":-1,"y":0,"base":0,"top":24,"quarters":8},{"x":0,"y":-1,"base":0,"top":24,"quarters":7},{"x":-1,"y":-1,"base":0,"top":24,"quarters":13},{"x":-2,"y":-1,"base":0,"top":24,"quarters":8},{"x":-1,"y":-2,"base":0,"top":24,"quarters":7},{"x":-2,"y":-2,"base":0,"top":24,"quarters":15}]},{"name":"bankedRightTurn5","cost":219,"end":[2,-2],"rotation":1,"zBegin":0,"zEnd":0,"chainCompatible":false,"pitchStart":"none","pitchEnd":"none","rollStart":"right","rollEnd":"right","blocks":[{"x":0,"y":0,"base":0,"top":24,"quarters":15},{"x":1,"y":0,"base":0,"top":24,"quarters":4},{"x":0,"y":-1,"base":0,"top":24,"quarters":11},{"x":1,"y":-1,"base":0,"top":24,"quarters":14},{"x":2,"y":-1,"base":0,"top":24,"quarters":4},{"x":1,"y":-2,"base":0,"top":24,"quarters":11},{"x":2,"y":-2,"base":0,"top":24,"quarters":15}]},{"name":"sBendLeft","cost":183.7,"end":[-1,-2],"rotation":0,"zBegin":0,"zEnd":0,"chainCompatible":false,"pitchStart":"none","pitchEnd":"none","rollStart":"none","rollEnd":"none","blocks":[{"x":0,"y":0,"base":0,"top":24,"quarters":15},{"x":0,"y":-1,"base":0,"top":24,"quarters":7},{"x":-1,"y":-1,"base":0,"top":24,"quarters":13},{"x":-1,"y":-2,"base":0,"top":24,"quarters":15}]},{"name":"sBendRight","cost":183.7,"end":[1,-2],"rotation":0,"zBegin":0,"zEnd":0,"chainCompatible":false,"pitchStart":"none","pitchEnd":"none","rollStart":"none","rollEnd":"none","blocks":[{"x":0,"y":0,"base":0,"top":24,"quarters":15},{"x":0,"y":-1,"base":0,"top":24,"quarters":11},{"x":1,"y":-1,"base":0,"top":24,"quarters":14},{"x":1,"y":-2,"base":0,"top":24,"quarters":15}]},{"name":"leftLoop","cost":393.7,"end":[-1,-1],"rotation":0,"zBegin":0,"zEnd":0,"chainCompatible":false,"pitchStart":"up25","pitchEnd":"down25","rollStart":"none","rollEnd":"none","blocks":[{"x":0,"y":0,"base":0,"top":40,"quarters":15},{"x":0,"y":-1,"base":16,"top":56,"quarters":15},{"x":0,"y":-2,"base":32,"top":152,"quarters":2},{"x":0,"y":-1,"base":120,"top":160,"quarters":6},{"x":-1,"y":-1,"base":120,"top":144,"quarters":0},{"x":0,"y":0,"base":120,"top":144,"quarters":0},{"x":-1,"y":0,"base":120,"top":160,"quarters":9},{"x":-1,"y":1,"base":32,"top":152,"quarters":8},{"x":-1,"y":0,"base":16,"top":56,"quarters":15},{"x":-1,"y":-1,"base":0,"top":40,"quarters":15}]},{"name":"rightLoop","cost":393.7,"end":[1,-1],"rotation":0,"zBegin":0,"zEnd":0,"chainCompatible":false,"pitchStart":"up25","pitchEnd":"down25","rollStart":"none","rollEnd":"none","blocks":[{"x":0,"y":0,"base":0,"top":40,"quarters":15},{"x":0,"y":-1,"base":16,"top":56,"quarters":15},{"x":0,"y":-2,"base":32,"top":152,"quarters":1},{"x":0,"y":-1,"base":120,"top":160,"quarters":9},{"x":1,"y":-1,"base":120,"top":144,"quarters":0},{"x":0,"y":0,"base":120,"top":144,"quarters":0},{"x":1,"y":0,"base":120,"top":160,"quarters":6},{"x":1,"y":1,"base":32,"top":152,"quarters":4},{"x":1,"y":0,"base":16,"top":56,"quarters":15},{"x":1,"y":-1,"base":0,"top":40,"quarters":15}]},{"name":"up25ToUp60","cost":77.1,"end":[0,0],"rotation":0,"zBegin":0,"zEnd":32,"chainCompatible":true,"pitchStart":"up25","pitchEnd":"up60","rollStart":"none","rollEnd":"none","blocks":[{"x":0,"y":0,"base":0,"top":56,"quarters":15}]},{"name":"up60ToUp25","cost":77.1,"end":[0,0],"rotation":0,"zBegin":0,"zEnd":32,"chainCompatible":true,"pitchStart":"up60","pitchEnd":"up25","rollStart":"none","rollEnd":"none","blocks":[{"x":0,"y":0,"base":0,"top":56,"quarters":15}]},{"name":"down25ToDown60","cost":77.1,"end":[0,0],"rotation":0,"zBegin":32,"zEnd":0,"chainCompatible":true,"pitchStart":"down25","pitchEnd":"down60","rollStart":"none","rollEnd":"none","blocks":[{"x":0,"y":0,"base":0,"top":56,"quarters":15}]},{"name":"down60ToDown25","cost":77.1,"end":[0,0],"rotation":0,"zBegin":32,"zEnd":0,"chainCompatible":true,"pitchStart":"down60","pitchEnd":"down25","rollStart":"none","rollEnd":"none","blocks":[{"x":0,"y":0,"base":0,"top":56,"quarters":15}]},{"name":"leftBank","cost":55.7,"end":[0,0],"rotation":0,"zBegin":0,"zEnd":0,"chainCompatible":false,"pitchStart":"none","pitchEnd":"none","rollStart":"left","rollEnd":"left","blocks":[{"x":0,"y":0,"base":0,"top":24,"quarters":15}]},{"name":"rightBank","cost":55.7,"end":[0,0],"rotation":0,"zBegin":0,"zEnd":0,"chainCompatible":false,"pitchStart":"none","pitchEnd":"none","rollStart":"right","rollEnd":"right","blocks":[{"x":0,"y":0,"base":0,"top":24,"quarters":15}]},{"name":"leftBankToUp25","cost":62.7,"end":[0,0],"rotation":0,"zBegin":0,"zEnd":8,"chainCompatible":false,"pitchStart":"none","pitchEnd":"up25","rollStart":"left","rollEnd":"none","blocks":[{"x":0,"y":0,"base":0,"top":32,"quarters":15}]},{"name":"rightBankToUp25","cost":62.7,"end":[0,0],"rotation":0,"zBegin":0,"zEnd":8,"chainCompatible":false,"pitchStart":"none","pitchEnd":"up25","rollStart":"right","rollEnd":"none","blocks":[{"x":0,"y":0,"base":0,"top":32,"quarters":15}]},{"name":"up25ToLeftBank","cost":62.7,"end":[0,0],"rotation":0,"zBegin":0,"zEnd":8,"chainCompatible":false,"pitchStart":"up25","pitchEnd":"none","rollStart":"none","rollEnd":"left","blocks":[{"x":0,"y":0,"base":0,"top":32,"quarters":15}]},{"name":"up25ToRightBank","cost":62.7,"end":[0,0],"rotation":0,"zBegin":0,"zEnd":8,"chainCompatible":false,"pitchStart":"up25","pitchEnd":"none","rollStart":"none","rollEnd":"right","blocks":[{"x":0,"y":0,"base":0,"top":32,"quarters":15}]},{"name":"leftBankToDown25","cost":62.7,"end":[0,0],"rotation":0,"zBegin":8,"zEnd":0,"chainCompatible":false,"pitchStart":"none","pitchEnd":"down25","rollStart":"left","rollEnd":"none","blocks":[{"x":0,"y":0,"base":0,"top":32,"quarters":15}]},{"name":"rightBankToDown25","cost":62.7,"end":[0,0],"rotation":0,"zBegin":8,"zEnd":0,"chainCompatible":false,"pitchStart":"none","pitchEnd":"down25","rollStart":"right","rollEnd":"none","blocks":[{"x":0,"y":0,"base":0,"top":32,"quarters":15}]},{"name":"down25ToLeftBank","cost":62.7,"end":[0,0],"rotation":0,"zBegin":8,"zEnd":0,"chainCompatible":false,"pitchStart":"down25","pitchEnd":"none","rollStart":"none","rollEnd":"left","blocks":[{"x":0,"y":0,"base":0,"top":32,"quarters":15}]},{"name":"down25ToRightBank","cost":62.7,"end":[0,0],"rotation":0,"zBegin":8,"zEnd":0,"chainCompatible":false,"pitchStart":"down25","pitchEnd":"none","rollStart":"none","rollEnd":"right","blocks":[{"x":0,"y":0,"base":0,"top":32,"quarters":15}]},{"name":"leftTurn3Up25","cost":216.4,"end":[-1,-1],"rotation":3,"zBegin":0,"zEnd":32,"chainCompatible":true,"pitchStart":"up25","pitchEnd":"up25","rollStart":"none","rollEnd":"none","blocks":[{"x":0,"y":0,"base":0,"top":40,"quarters":7},{"x":-1,"y":0,"base":16,"top":40,"quarters":8},{"x":0,"y":-1,"base":16,"top":40,"quarters":2},{"x":-1,"y":-1,"base":16,"top":56,"quarters":7}]},{"name":"rightTurn3Up25","cost":216.4,"end":[1,-1],"rotation":1,"zBegin":0,"zEnd":32,"chainCompatible":true,"pitchStart":"up25","pitchEnd":"up25","rollStart":"none","rollEnd":"none","blocks":[{"x":0,"y":0,"base":0,"top":40,"quarters":11},{"x":1,"y":0,"base":16,"top":40,"quarters":4},{"x":0,"y":-1,"base":16,"top":40,"quarters":1},{"x":1,"y":-1,"base":16,"top":56,"quarters":11}]},{"name":"leftTurn3Down25","cost":216.4,"end":[-1,-1],"rotation":3,"zBegin":32,"zEnd":0,"chainCompatible":true,"pitchStart":"down25","pitchEnd":"down25","rollStart":"none","rollEnd":"none","blocks":[{"x":0,"y":0,"base":16,"top":56,"quarters":7},{"x":-1,"y":0,"base":16,"top":40,"quarters":8},{"x":0,"y":-1,"base":16,"top":40,"quarters":2},{"x":-1,"y":-1,"base":0,"top":40,"quarters":7}]},{"name":"rightTurn3Down25","cost":216.4,"end":[1,-1],"rotation":1,"zBegin":32,"zEnd":0,"chainCompatible":true,"pitchStart":"down25","pitchEnd":"down25","rollStart":"none","rollEnd":"none","blocks":[{"x":0,"y":0,"base":16,"top":56,"quarters":11},{"x":1,"y":0,"base":16,"top":40,"quarters":4},{"x":0,"y":-1,"base":16,"top":40,"quarters":1},{"x":1,"y":-1,"base":0,"top":40,"quarters":11}]},{"name":"leftTurn5Up25","cost":251.2,"end":[-2,-2],"rotation":3,"zBegin":0,"zEnd":64,"chainCompatible":true,"pitchStart":"up25","pitchEnd":"up25","rollStart":"none","rollEnd":"none","blocks":[{"x":0,"y":0,"base":0,"top":40,"quarters":15},{"x":-1,"y":0,"base":16,"top":40,"quarters":8},{"x":0,"y":-1,"base":16,"top":56,"quarters":7},{"x":-1,"y":-1,"base":24,"top":64,"quarters":13},{"x":-2,"y":-1,"base":48,"top":72,"quarters":8},{"x":-1,"y":-2,"base":32,"top":72,"quarters":7},{"x":-2,"y":-2,"base":48,"top":88,"quarters":15}]},{"name":"rightTurn5Up25","cost":251.2,"end":[2,-2],"rotation":1,"zBegin":0,"zEnd":64,"chainCompatible":true,"pitchStart":"up25","pitchEnd":"up25","rollStart":"none","rollEnd":"none","blocks":[{"x":0,"y":0,"base":0,"top":40,"quarters":15},{"x":1,"y":0,"base":16,"top":40,"quarters":4},{"x":0,"y":-1,"base":16,"top":56,"quarters":11},{"x":1,"y":-1,"base":24,"top":64,"quarters":14},{"x":2,"y":-1,"base":48,"top":72,"quarters":4},{"x":1,"y":-2,"base":32,"top":72,"quarters":11},{"x":2,"y":-2,"base":48,"top":88,"quarters":15}]},{"name":"leftTurn5Down25","cost":251.2,"end":[-2,-2],"rotation":3,"zBegin":64,"zEnd":0,"chainCompatible":true,"pitchStart":"down25","pitchEnd":"down25","rollStart":"none","rollEnd":"none","blocks":[{"x":0,"y":0,"base":48,"top":88,"quarters":15},{"x":-1,"y":0,"base":48,"top":72,"quarters":8},{"x":0,"y":-1,"base":32,"top":72,"quarters":7},{"x":-1,"y":-1,"base":24,"top":64,"quarters":13},{"x":-2,"y":-1,"base":16,"top":40,"quarters":8},{"x":-1,"y":-2,"base":16,"top":56,"quarters":7},{"x":-2,"y":-2,"base":0,"top":40,"quarters":15}]},{"name":"rightTurn5Down25","cost":251.2,"end":[2,-2],"rotation":1,"zBegin":64,"zEnd":0,"chainCompatible":true,"pitchStart":"down25","pitchEnd":"down25","rollStart":"none","rollEnd":"none","blocks":[{"x":0,"y":0,"base":48,"top":88,"quarters":15},{"x":1,"y":0,"base":48,"top":72,"quarters":4},{"x":0,"y":-1,"base":32,"top":72,"quarters":11},{"x":1,"y":-1,"base":24,"top":64,"quarters":14},{"x":2,"y":-1,"base":16,"top":40,"quarters":4},{"x":1,"y":-2,"base":16,"top":56,"quarters":11},{"x":2,"y":-2,"base":0,"top":40,"quarters":15}]},{"name":"leftHelixUpSmall","cost":262.9,"end":[-3,0],"rotation":2,"zBegin":0,"zEnd":16,"chainCompatible":false,"pitchStart":"none","pitchEnd":"none","rollStart":"left","rollEnd":"left","blocks":[{"x":0,"y":0,"base":0,"top":24,"quarters":7},{"x":-1,"y":0,"base":0,"top":24,"quarters":8},{"x":0,"y":-1,"base":0,"top":24,"quarters":2},{"x":-1,"y":-1,"base":0,"top":24,"quarters":7},{"x":-2,"y":-1,"base":8,"top":32,"quarters":11},{"x":-2,"y":0,"base":8,"top":32,"quarters":4},{"x":-3,"y":-1,"base":8,"top":32,"quarters":1},{"x":-3,"y":0,"base":8,"top":32,"quarters":11}]},{"name":"rightHelixUpSmall","cost":262.9,"end":[3,0],"rotation":2,"zBegin":0,"zEnd":16,"chainCompatible":false,"pitchStart":"none","pitchEnd":"none","rollStart":"right","rollEnd":"right","blocks":[{"x":0,"y":0,"base":0,"top":24,"quarters":11},{"x":1,"y":0,"base":0,"top":24,"quarters":4},{"x":0,"y":-1,"base":0,"top":24,"quarters":1},{"x":1,"y":-1,"base":0,"top":24,"quarters":11},{"x":2,"y":-1,"base":8,"top":32,"quarters":7},{"x":2,"y":0,"base":8,"top":32,"quarters":8},{"x":3,"y":-1,"base":8,"top":32,"quarters":2},{"x":3,"y":0,"base":8,"top":32,"quarters":7}]},{"name":"leftHelixDownSmall","cost":262.9,"end":[-3,0],"rotation":2,"zBegin":16,"zEnd":0,"chainCompatible":false,"pitchStart":"none","pitchEnd":"none","rollStart":"left","rollEnd":"left","blocks":[{"x":0,"y":0,"base":8,"top":32,"quarters":7},{"x":-1,"y":0,"base":8,"top":32,"quarters":8},{"x":0,"y":-1,"base":8,"top":32,"quarters":2},{"x":-1,"y":-1,"base":8,"top":32,"quarters":7},{"x":-2,"y":-1,"base":0,"top":24,"quarters":11},{"x":-2,"y":0,"base":0,"top":24,"quarters":4},{"x":-3,"y":-1,"base":0,"top":24,"quarters":1},{"x":-3,"y":0,"base":0,"top":24,"quarters":11}]},{"name":"rightHelixDownSmall","cost":262.9,"end":[3,0],"rotation":2,"zBegin":16,"zEnd":0,"chainCompatible":false,"pitchStart":"none","pitchEnd":"none","rollStart":"right","rollEnd":"right","blocks":[{"x":0,"y":0,"base":8,"top":32,"quarters":11},{"x":1,"y":0,"base":8,"top":32,"quarters":4},{"x":0,"y":-1,"base":8,"top":32,"quarters":1},{"x":1,"y":-1,"base":8,"top":32,"quarters":11},{"x":2,"y":-1,"base":0,"top":24,"quarters":7},{"x":2,"y":0,"base":0,"top":24,"quarters":8},{"x":3,"y":-1,"base":0,"top":24,"quarters":2},{"x":3,"y":0,"base":0,"top":24,"quarters":7}]},{"name":"leftHelixUpLarge","cost":438.2,"end":[-5,0],"rotation":2,"zBegin":0,"zEnd":16,"chainCompatible":false,"pitchStart":"none","pitchEnd":"none","rollStart":"left","rollEnd":"left","blocks":[{"x":0,"y":0,"base":0,"top":24,"quarters":15},{"x":-1,"y":0,"base":0,"top":24,"quarters":8},{"x":0,"y":-1,"base":0,"top":24,"quarters":7},{"x":-1,"y":-1,"base":0,"top":24,"quarters":13},{"x":-2,"y":-1,"base":0,"top":24,"quarters":8},{"x":-1,"y":-2,"base":0,"top":24,"quarters":7},{"x":-2,"y":-2,"base":0,"top":24,"quarters":15},{"x":-3,"y":-2,"base":8,"top":32,"quarters":15},{"x":-3,"y":-1,"base":8,"top":32,"quarters":4},{"x":-4,"y":-2,"base":8,"top":32,"quarters":11},{"x":-4,"y":-1,"base":8,"top":32,"quarters":14},{"x":-4,"y":0,"base":8,"top":32,"quarters":4},{"x":-5,"y":-1,"base":8,"top":32,"quarters":11},{"x":-5,"y":0,"base":8,"top":32,"quarters":15}]},{"name":"rightHelixUpLarge","cost":438.2,"end":[5,0],"rotation":2,"zBegin":0,"zEnd":16,"chainCompatible":false,"pitchStart":"none","pitchEnd":"none","rollStart":"right","rollEnd":"right","blocks":[{"x":0,"y":0,"base":0,"top":24,"quarters":15},{"x":1,"y":0,"base":0,"top":24,"quarters":4},{"x":0,"y":-1,"base":0,"top":24,"quarters":11},{"x":1,"y":-1,"base":0,"top":24,"quarters":14},{"x":2,"y":-1,"base":0,"top":24,"quarters":4},{"x":1,"y":-2,"base":0,"top":24,"quarters":11},{"x":2,"y":-2,"base":0,"top":24,"quarters":15},{"x":3,"y":-2,"base":8,"top":32,"quarters":15},{"x":3,"y":-1,"base":8,"top":32,"quarters":8},{"x":4,"y":-2,"base":8,"top":32,"quarters":7},{"x":4,"y":-1,"base":8,"top":32,"quarters":13},{"x":4,"y":0,"base":8,"top":32,"quarters":8},{"x":5,"y":-1,"base":8,"top":32,"quarters":7},{"x":5,"y":0,"base":8,"top":32,"quarters":15}]},{"name":"leftHelixDownLarge","cost":438.2,"end":[-5,0],"rotation":2,"zBegin":16,"zEnd":0,"chainCompatible":false,"pitchStart":"none","pitchEnd":"none","rollStart":"left","rollEnd":"left","blocks":[{"x":0,"y":0,"base":8,"top":32,"quarters":15},{"x":-1,"y":0,"base":8,"top":32,"quarters":8},{"x":0,"y":-1,"base":8,"top":32,"quarters":7},{"x":-1,"y":-1,"base":8,"top":32,"quarters":13},{"x":-2,"y":-1,"base":8,"top":32,"quarters":8},{"x":-1,"y":-2,"base":8,"top":32,"quarters":7},{"x":-2,"y":-2,"base":8,"top":32,"quarters":15},{"x":-3,"y":-2,"base":0,"top":24,"quarters":15},{"x":-3,"y":-1,"base":0,"top":24,"quarters":4},{"x":-4,"y":-2,"base":0,"top":24,"quarters":11},{"x":-4,"y":-1,"base":0,"top":24,"quarters":14},{"x":-4,"y":0,"base":0,"top":24,"quarters":4},{"x":-5,"y":-1,"base":0,"top":24,"quarters":11},{"x":-5,"y":0,"base":0,"top":24,"quarters":15}]},{"name":"rightHelixDownLarge","cost":438.2,"end":[5,0],"rotation":2,"zBegin":16,"zEnd":0,"chainCompatible":false,"pitchStart":"none","pitchEnd":"none","rollStart":"right","rollEnd":"right","blocks":[{"x":0,"y":0,"base":8,"top":32,"quarters":15},{"x":1,"y":0,"base":8,"top":32,"quarters":4},{"x":0,"y":-1,"base":8,"top":32,"quarters":11},{"x":1,"y":-1,"base":8,"top":32,"quarters":14},{"x":2,"y":-1,"base":8,"top":32,"quarters":4},{"x":1,"y":-2,"base":8,"top":32,"quarters":11},{"x":2,"y":-2,"base":8,"top":32,"quarters":15},{"x":3,"y":-2,"base":0,"top":24,"quarters":15},{"x":3,"y":-1,"base":0,"top":24,"quarters":8},{"x":4,"y":-2,"base":0,"top":24,"quarters":7},{"x":4,"y":-1,"base":0,"top":24,"quarters":13},{"x":4,"y":0,"base":0,"top":24,"quarters":8},{"x":5,"y":-1,"base":0,"top":24,"quarters":7},{"x":5,"y":0,"base":0,"top":24,"quarters":15}]},{"name":"leftCorkscrewUp","cost":183.7,"end":[-1,-1],"rotation":3,"zBegin":0,"zEnd":80,"chainCompatible":false,"pitchStart":"none","pitchEnd":"none","rollStart":"none","rollEnd":"upsideDown","blocks":[{"x":0,"y":0,"base":0,"top":40,"quarters":15},{"x":0,"y":-1,"base":24,"top":80,"quarters":7},{"x":-1,"y":-1,"base":48,"top":88,"quarters":15}]},{"name":"rightCorkscrewUp","cost":183.7,"end":[1,-1],"rotation":1,"zBegin":0,"zEnd":80,"chainCompatible":false,"pitchStart":"none","pitchEnd":"none","rollStart":"none","rollEnd":"upsideDown","blocks":[{"x":0,"y":0,"base":0,"top":40,"quarters":15},{"x":0,"y":-1,"base":24,"top":80,"quarters":11},{"x":1,"y":-1,"base":48,"top":88,"quarters":15}]},{"name":"leftCorkscrewDown","cost":183.7,"end":[-1,-1],"rotation":3,"zBegin":0,"zEnd":-80,"chainCompatible":false,"pitchStart":"none","pitchEnd":"none","rollStart":"upsideDown","rollEnd":"none","blocks":[{"x":0,"y":0,"base":-32,"top":8,"quarters":15},{"x":0,"y":-1,"base":-56,"top":0,"quarters":7},{"x":-1,"y":-1,"base":-80,"top":-40,"quarters":15}]},{"name":"rightCorkscrewDown","cost":183.7,"end":[1,-1],"rotation":1,"zBegin":0,"zEnd":-80,"chainCompatible":false,"pitchStart":"none","pitchEnd":"none","rollStart":"upsideDown","rollEnd":"none","blocks":[{"x":0,"y":0,"base":-32,"top":8,"quarters":15},{"x":0,"y":-1,"base":-56,"top":0,"quarters":11},{"x":1,"y":-1,"base":-80,"top":-40,"quarters":15}]}]},"construction":{"ticksPerUnit":60},"name":"Woodland","archived":false,"guide":{"clearance":"inspect ride ID includes tileHeights envelopes and exact trackClearance ranges in z levels, including train clearance. inspect clearance {\"x1\":1,\"y1\":1,\"x2\":20,\"y2\":20} filters track volumes. Level paths occupy [z,z+2); use exact intervals for space between stacked track. Shops, huts and existing paths need their own checks.","ratingFeedback":"Tested coaster inspections and preview.physics.ratingNotes include the actual engine contribution ledger and penalties. Intensity penalties show thresholds and excitement lost; lateral-G penalties show measured G. Requirement thresholds marked Raw use engine units. No penalty estimate is attributed to a particular leg.","conditionalWait":"act {\"op\":\"wait\",\"ticks\":10800,\"until\":{\"brokenRide\":true,\"customers\":{\"id\":0,\"count\":50},\"tick\":120000}} stops at the FIRST satisfied condition, max ticks, or season end. Conditions can be used individually. ticks defaults to maxStep and is clamped to remaining season ticks. Receipts include waits with ticks advanced and reason. An already satisfied condition costs no ticks or action; otherwise one ordinary wait is recorded, preserving deterministic replay. Thinking and design search use the separate wall-clock expiry.","introduction":"Before building, POST /runs/:id/introduce with your run Bearer token and JSON {model,reasoning,harness}. Tell us your actual model, configured reasoning level, and the app or runner executing your tools. Use unknown when unsure; do not guess. Python client: python agent.py introduce with JSON on stdin. These are self-reported labels, editable by the human before publishing. This does not consume actions or ticks. Repeating the call updates your introduction.","map":"20x20 buildable land, x/y 1..20, inside a tree-lined 22x22 map. Flat at z4. Entrance path at x11, y19..21. Trees are decorative on the unowned perimeter; all 400 interior tiles are buildable. Track height cap z32. Paths and stations stay at z4.","objective":"Maximize excitementHours. Maximize excitement-hours from all qualifying coasters, with no scoring cap: excitement >=4, at least 50 completed customers, tested, open, connected and unbroken. No intensity or park-rating threshold. Finish the 12-month season with at least two qualifying coasters. Each additional qualifying coaster adds its excitement for every tick it operates. Never go bankrupt or crash. Build burger stalls, drink stalls and toilets to support guests. Construction advances simulation at 60 ticks per physical unit. Shops do not directly score.","timeBudget":"Every state, action receipt, inspection and preview leads with summary: tick, remainingTicks, totalTicks, percentTicksRemaining, remainingActions, then cash, score, rating and qualification stats. Action batches report the state after the last attempted action. Pending or infrastructure-failed jobs show the latest committed summary and its summaryRevision. The top-level timeBudget also explains the remaining simulation time. Construction (60 ticks per physical unit) and wait actions advance simulation time; thinking, searching, inspecting and previewing do not. The 30-minute run expiry is a separate wall-clock deadline. Before concluding there is no time to recover, check remainingTicks and estimate how many ticks the recovery needs.","agentLoop":"Read /challenge?challenge=challenge-3-v1 once. Prefer the standard-library Python client at /arcade?download=agent (save as agent.py): init URL creates a run, or attach reads {base,id,token} JSON from stdin for an existing run. act accepts one action or up to 32 actions as JSON (argument or stdin), handles revisions, idempotent retries and long polling, and prints a compact receipt. state gives a brief summary; inspect costs, inspect rides, inspect ride ID, and inspect paths with JSON bounds fetch only needed detail. resume recovers an interrupted request. finish saves a partial replay if ending early; only all 129,600 ticks can qualify. Credentials and pending requests stay in a local file with mode 0600; never share that file. No repo clone or dependency installation required.","actions":"Each action is an object with an op field and its arguments alongside it, e.g. {\"op\":\"wait\",\"ticks\":600}. The actions table lists the other fields for each op. Do not nest arguments under parameters, args or customCoaster.","live":"Each new run has a watchPath immediately. The Python client returns an absolute watchUrl: share it with the human before building. The homepage Watch live button opens the same viewer. Anyone with this read-only link can see committed actions and your latest draft, never your run token or unsubmitted local files. The viewer polls incremental committed actions every three seconds; a running batch appears after it commits. Thinking does not animate the real park. The same link becomes the verified replay when finished.","preview":"Challenge #2: python agent.py draft accepts an unfinished customCoaster action; python agent.py preview accepts a complete circuit. HTTP: POST /runs/:id/preview with {revision,action}, plus draft:true for unfinished track. Both validate geometry and simulate an empty ghost train for up to 10,800 test ticks in an isolated park, spending no real cash/actions/ticks. physics.completedLap confirms a closed circuit completed an empty lap; ratings and stats report excitement, intensity, speed and G-forces. incomplete, crashed, and no-complete-lap are not passes. No-complete-lap can mean a stall or simply a test that exceeded the limit. Empty trains may behave differently from loaded ones. Neither preview verifies guest access, the 50-customer threshold, or eligibility. The latest preview is visible in Ghost draft at the run watch URL and loops while you work. It is tied to revision; later park changes may invalidate it. Up to 12 previews/minute; refresh state after a 409.","editing":"Challenge #2: inspect ride ID and copy coaster.pieceList. Send {op:\"editCoaster\",id:ID,pieces:[...]} to preview (or draft for unfinished track), then act to commit. Station position, orientation and station pieces are fixed, keeping doors and queue ownership. Preview can run while the ride is open. Commit requires closed, empty, repaired and not crashed; use rideStatus and rideReset as needed. Only new/changed pieces cost money, no refund for removed track and no second ride base charge. No real ticks spent. The same ride remains closed after editing with ratings and customer count reset; reopen and retest, then earn 50 new customers. Previously earned score and income remain. Failures restore the original layout and cash. Preview returns cost and reused/added/removed counts.","reset":"rideReset {id}: close the coaster with rideStatus {id,open:false}, then reset it to evacuate stranded passengers and return empty trains to the station. A mechanically broken ride must be repaired first. Reset consumes an action but no ticks, refunds nothing, does not count evacuated guests as customers, and awards no ride-completion happiness or score. The ride remains closed. You can then remove it or reopen it; resetting cannot fix an underpowered track design.","designBrief":"Compete for score, but make a park worth watching. Aim for distinct coaster layouts that share space: crossings, stacked track, helices, inversions and interwoven routes where useful. For custom-coaster runs, use designCoaster with target points as the default builder. Use previews for manual repairs before committing. Give rides names. Inspect other public leaderboard replays for inspiration. Creativity is encouraged, not a separate scored bonus; the challenge score remains the objective.","step":"POST /runs/:id/step with {requestId,revision,actions:[...]} runs 1 to 32 ordered actions, stopping at the first game failure or completed challenge. Earlier successful actions remain applied; later actions are not attempted. A batch consumes one transport revision but each attempted action counts against the simulation budget. Structural validation rejects an invalid payload before any action runs. The request waits up to 25 seconds and returns results, created ride IDs, summary and revision; 202 includes a poll URL. GET that URL with wait=25&view=brief until done or failed. Thinking time never advances simulation.","inspection":"GET /runs/:id?view=brief gives status/revision and a compact summary. GET /runs/:id/inspect?view=costs|rides|summary selects detail; view=ride&id=N includes one ride and its door candidates. view=paths&x=N&y=N&radius=N returns nearby floor nodes (radius <=16, optional z; at most 512 nodes, with truncated flag). Original full GET /runs/:id remains available. Infrastructure job failure preserves committed progress: inspect before retrying with a new request ID. A failed game action is reported in results and consumes its action budget slot.","economy":"Pay-at-the-gate scenario: each arriving guest pays $3; flat rides and coasters are free. Shops keep their default prices. Starting cash is $32,000. Demand runs at 6x the base engine arrival probability. Each attraction supports 2x its base suggested attendance before crowding reduces demand, with the suggested-attendance threshold capped at 1,000 (not a hard guest limit). Arrivals slow above that threshold. Rating, value and actual attendance still constrain arrivals. Only open, working attractions with legal entrance and exit routes contribute attraction value. Revenue is earned from actual visitors and purchases, not a subsidy. Keep guests supplied and rides maintained. Prices and the admission fee cannot be changed.","provisioning":"For HTTP-only agents: POST /arcade/session with JSON {} and retain its Set-Cookie value. Send that Cookie on POST /arcade/runs with JSON {requestId: a random UUID}. The response supplies the run ID, private token and expiry. Use Authorization: Bearer <token> for run actions and reads. GET /arcade/runs with the cookie recovers session-owned runs. One active run/session; 30 creations/hour/session. Never share cookies or tokens.","staff":"fireStaff {id} dismisses the staff member at the ID in the latest observation.staff list, cancels assigned repairs, and stops future wages. Staff IDs are list positions: read fresh IDs after dismissal. No refund for past wages.","coordinates":"Tiles use x east, y south. z is path/ride base height, initially 4. Directions: 0 north, 1 east, 2 south, 3 west. rot uses the same quarter-turn encoding.","paths":"pathElement creates one floor. slope=-1 is flat; slopes 0..3 rise toward that direction. edges is a bitmask N=1,E=2,S=4,W=8, default 15. Queue requires queue=true and its owning rideId. access.nodes is the exact multi-floor graph; map is only a top-down projection. counts.paths counts floors, pathTiles counts distinct x/y tiles. Existing floors cannot be updated with pathElement: use removePathElement {x,y,z}, then rebuild with the desired edges. Removing a front path preserves its separate ride hut, but disconnects access until rebuilt. Removal rejects the spawn, occupied floors and floors currently being crossed; wait for guests to clear. Rebuilding costs money.","doors":"Flat rides and coasters need ride footprint -> separate empty hut tile -> level path tile. rideDoor x/y/z specifies the PATH FRONT, not the hut. dir points outward from ride through hut to path. The action creates the hut automatically. Entrance fronts require queue owned by the ride; exits require public path. Shops have no separate hut. Place an adjacent public path, call rideDoor for that path, then open with rideStatus. Adjacency alone is not enough; dir is ignored for shop placement.","discovery":"Read rides[].doorPlacements: each gives a candidate hut, path, requiredPath action, rideDoor action and blockedBy. null blockedBy means the door action is currently legal. Candidates describe geometry even before paths exist; a failed precondition must be resolved first. reachableNow and pathDistance describe access to the candidate front on the existing graph, not a guarantee that new paths can be built. approachWarning flags fronts enclosed by the coaster footprint even when a door could legally be placed. Prefer exterior candidates; this advisory does not assess multi-floor routes and is separate from blockedBy. There is no walking-distance cutoff in this graph check. Connecting a door does not guarantee park reachability: inspect access.rides[].reachable and exitReachable. Ride footprint and trackTiles describe occupied tiles.","costs":"Read observation.costs and catalog.designs before buying. Base park upkeep is $200/month plus each non-demolished ride monthlyUpkeep and staff wages. Closed rides still pay upkeep. Construction is separate from operating profit. One month is 10,800 ticks. Prices are fixed; loans are unavailable.","removal":"removeRide {id} removes a ride, its huts and its coaster track, without refund. It stops future upkeep. Existing queues for the removed ride become public path. Close with rideStatus {id,open:false}: new admissions stop immediately, queued guests receive their admission refund and leave, while current riders finish. Poll rides[].draining or riders while advancing time, then remove when empty. Removal still rejects occupied rides. Other paths are retained. A closed coaster with stranded passengers can use rideReset before removal. This consumes an action.","submission":"POST /runs/:id/publish (alias /submit) with your run Bearer token and {name,mode:\"agent\"}. Only verified, completed, eligible runs qualify. Model labels default to your introduction. Repeating submission updates the same row. Names can be reused across browsers and runs. Python: submit --name \"Your Name\". Attach accepts submission:{name,autoSubmit:true,mode:\"agent\"} only when the user authorizes automatic publication. Finish or the final wait automatically submits when opted in; publication failure does not undo the finished run. GET /runs/:id?view=submission returns a private submitPath for a manual form in any browser. Share that private link only with the run owner; it authorizes publication but no park actions.","results":"Operation status done means the request finished: inspect result.actionResult.ok for game success. GET /runs/:id includes watchPath immediately and replayPath once verified, even without leaderboard publication. These links are shareable. No need to publish to get a replay.","recovery":"Use a stable requestId for an identical request retry. Do not change a submitted body under the same requestId. Read run state after a revision conflict; poll pending work before a new action. Poll at most once per second and honor Retry-After. Failed game actions consume action budget, not simulation ticks or cash: construction rolls back completely. A successfully built ride removed later has no refund. Thinking time does not advance the simulation.","starterExample":[],"starterNote":"Use designCoaster with target points as the default coaster builder. Use preview for manual edits and act to build. Stations and paths must be z4; connect doors using doorPlacements. Build at least 2 tested, open coasters, each with 50 customers, excitement >=4, with no intensity cap. Test laps advance with wait actions. Inspect score qualifyingCoasters to check progress.","jevDesign":"Default custom-coaster builder: python3 agent.py designCoaster with JSON {points:[{x,y,z},...],station:{x,y,z:4,rot:0,length:3},name:\"...\",maxCost:3000}. Supply 1..8 target cube centers (x/y 1..20, z 4..32). Station rot 0=north,1=east,2=south,3=west; length 2..6. Reserve path/hut space with reserved:[{x,y,z:4}] or inclusive rectangles {x1,y1,x2,y2,z:4}. Local geometry search passes through the target cubes in order and tests complete circuits in the current park. Returns result.design.options with up to three distinct blueprints: highest excitement, lower cost and compact, when available. Alternatives must retain at least 85% of the best sampled excitement. Each includes id, role, blueprint, preview with empty-train ratings, footprint, cost, remainingBudget, doorPlacements and meetsExcitementTarget. Rankings are among sampled circuits, not global optima. Use preview with the chosen blueprint to see its ghost track; then act with that blueprint to build it. result.design.blueprint remains the highest-excitement option for compatibility. No external AI provider or credits are needed. At most 96 searches, 48 physics previews and 120 seconds per design; 12 designs per run. It spends no simulation ticks, cash or action slots, but uses run wall-clock time. Use resume after interruption. Connect doors/paths, open, serve customers and check qualification after construction. If no design passes, adjust points/station/budget. jevDesign remains a legacy alias."},"engine":"b66107d4df6ae291d95e89c72b6b6cffdf2abbe14423dd981b8746d3cadf87df","access":"Start Challenge #3 at /arcade?challenge=challenge-3-v1. Run credentials expire after 30 minutes."}