{"$defs":{"rotation_slot":{"additionalProperties":false,"description":"A daypart rotation slot. Energy and mood are editorial rotation guidance for the DJ — never measured tempo claims.","properties":{"daypart":{"description":"Broadcast daypart window, e.g. '06:00–10:00 ET'.","type":"string"},"energy":{"enum":["high","medium","low"],"type":"string"},"explicit_policy":{"description":"How the slot treats explicit-flagged tracks.","enum":["daypart-discretion","explicit-ok","clean-only"],"type":"string"},"label":{"type":"string"},"mood":{"items":{"type":"string"},"minItems":1,"type":"array"},"rotation_notes":{"type":"string"},"slot_id":{"pattern":"^[a-z0-9-]+$","type":"string"},"tracks":{"description":"Track titles, each must match a tracks[].title in this pack.","items":{"type":"string"},"minItems":1,"type":"array"}},"required":["slot_id","label","daypart","energy","mood","explicit_policy","tracks"],"type":"object"},"track":{"additionalProperties":false,"description":"One rotation-ready track. bpm/key/duration/isrc are NOT schema properties — omit unknown measurements rather than inventing them.","properties":{"credits":{"description":"Verified credits only (producer, mix/master, engineer, recorded-at).","type":"object"},"dj_backsell":{"description":"Back-sell line for the DJ — verified facts only.","type":"string"},"dj_intro":{"description":"Intro line for the DJ — verified facts only.","type":"string"},"explicit":{"description":"True/false per distributor metadata; omit when unknown.","type":["boolean","null"]},"release_date":{"pattern":"^\\d{4}-\\d{2}-\\d{2}$","type":"string"},"rights_clearance":{"description":"Licensing posture for this track. Never claim clean/instrumental/one-stop unless verified.","type":"string"},"spotify_id":{"type":"string"},"spotify_url":{"format":"uri","type":"string"},"title":{"type":"string"},"verified_facts":{"description":"MANDATORY: at least one cited fact per track.","items":{"$ref":"#/$defs/verified_fact"},"minItems":1,"type":"array"}},"required":["title","verified_facts"],"type":"object"},"verified_fact":{"additionalProperties":false,"description":"Fact-source citations are MANDATORY — nothing ships without a citation, an observation date, and a confidence label.","properties":{"citation":{"description":"Live URL (or 'internal' for first-party ops records) where the fact was observed.","type":"string"},"confidence":{"enum":["VERIFIED","ESTIMATE","CLAIM-UNVERIFIED"],"type":"string"},"fact":{"type":"string"},"observed":{"pattern":"^\\d{4}-\\d{2}-\\d{2}$","type":"string"}},"required":["fact","citation","observed"],"type":"object"}},"$id":"https://cumulativewebinc.github.io/cwi-learn/open-wave/open-wave-schema.json","$schema":"https://json-schema.org/draft/2020-12/schema","additionalProperties":true,"description":"Authoring contract for OPEN WAVE rotation packs (format cwi-openwave/v1). A pack is a machine-readable airplay rotation an agent-DJ loads in seconds and spins on any broadcast: daypart rotation slots, DJ intros/backsells, and per-track verified facts with MANDATORY citations. HARD RULE: no_paid_placement must be true — a pack that sells, guarantees, or prices airplay is not OPEN WAVE. Track-level bpm/key/duration/isrc fields are deliberately NOT in this schema: unknown measurements are omitted, never invented.","format":"cwi-openwave/v1","properties":{"artist":{"additionalProperties":false,"properties":{"base":{"type":"string"},"genre":{"type":"string"},"name":{"type":"string"},"spotify_artist_id":{"type":"string"},"spotify_artist_url":{"format":"uri","type":"string"}},"required":["name","genre","spotify_artist_id"],"type":"object"},"contact":{"description":"Public contact for licensing and radio inquiries.","type":"string"},"fact_source":{"description":"Canonical fact set every verified_fact should be traceable to (e.g. the CWI Scoreboard Chip).","format":"uri","type":"string"},"format":{"const":"cwi-openwave/v1"},"issued":{"pattern":"^\\d{4}-\\d{2}-\\d{2}$","type":"string"},"label":{"type":"string"},"no_paid_placement":{"const":true,"description":"HARD RULE. true means: no submission fees, no per-submission credits, no paid adds, no guaranteed airplay, no payola-adjacent mechanics anywhere in the pack. Spins are opt-in and logged transparently."},"pack_id":{"pattern":"^[a-z0-9-]+$","type":"string"},"rotation_slots":{"items":{"$ref":"#/$defs/rotation_slot"},"minItems":1,"type":"array"},"tracks":{"items":{"$ref":"#/$defs/track"},"minItems":1,"type":"array"},"white_label":{"additionalProperties":false,"properties":{"how":{"type":"string"},"schema":{"format":"uri","type":"string"}},"type":"object"}},"required":["format","pack_id","label","artist","issued","contact","no_paid_placement","rotation_slots","tracks"],"title":"CWI OPEN WAVE rotation pack","type":"object","version":"1.0.0"}