Changelog
This release fixes four production-impacting Modu Parking contract behaviors.
search-parking location labels are now geocoded through Modu Parking's own place search instead of a 3-entry lookup that silently searched 남산 for unknown labels: unresolvable labels fail with LOCATION_RESOLVE_FAILED, requests with neither coordinates nor a non-empty location are rejected at input validation (the location input no longer declares a default empty string — send lat/lng or a non-empty location), and searched_location now returns the resolved place name. parking-detail for monthly/period tickets (월주차권/정기권) now returns 200 with available_days: [], the new daily_schedule_supported: false field, and is_purchasable: false instead of failing; callers that treated any parking-detail failure as \"ticket not found\" must instead branch on the new TICKET_NOT_FOUND error code, which is now returned only for tickets that do not exist upstream. Monthly/period tickets cannot be purchased through start-payment: it rejects them with NOT_PURCHASABLE before verifying the SMS code or creating any payment request, so check is_purchasable before calling send-payment-sms (that separate operation sends a real SMS and takes no ticket reference) and hand users off via the parking-detail app_url. check-availability price_per_hour is now a derived hourly rate (round(price × 60 / using_time_minutes) of the first priced slot) instead of echoing the first slot's total price; a 30-minute 900 KRW slot now reports 1800, not 900.