{"$schema":"https://json-schema.org/draft/2020-12/schema","$id":"https://www.numonic.ai/guides/ai-distribution-channels/schema/v0.3.0.json","title":"Acceptor Index entry","version":"0.3.0","status":"v0.3.0 (2026-11-02, #2013): adds governance.contestedClaim and terms.band.standardBasis as structured fields, and rules that not-located is NOT an enum member: it stays mapped to no-published-position (primary read in full) or source-unreachable (primary unreadable).","description":"One acceptor per document. An acceptor is an entity that takes delivery of creative work on published terms. v0.1.0 accepted 2026-09-02 (CTO), on the #1626 band semantics accepted the same day; v0.2.0 (2026-09-02, #2006) is its semver-minor successor and leaves the band vocabulary at 0.1.0. Not served at a public URL and not a stability commitment; the stability commitment attaches to /guides/ai-distribution-channels/schema/v1.json only. Constraint 1 (#1624): no property, enum value or description in this document names Numonic, requires a Numonic account, an API key, a login, or any relationship with Numonic to populate or consume. Constraint 2: the vocabulary can express 'this acceptor requires nothing' as a first-class outcome (terms.band.value = 'accepts-as-standard').","$comment":"Design rationale (D-A1 – D-A26 for v0.1.0; D-A27 – D-A29 for v0.2.0), validation run against 55 real entities, and the reconciliation with #1626 live in docs/specs/2026-09-01-acceptor-index-schema.md. Concepts are modelled in docs/skos/mvai_2026-09_acceptor_index.skos (mv:AcceptorIndexExtension); each $defs entry names its concept in $comment.","type":"object","required":["schemaVersion","identity","terms","evidence","governance"],"additionalProperties":false,"properties":{"schemaVersion":{"type":"string","pattern":"^\\d+\\.\\d+\\.\\d+(-[0-9A-Za-z.-]+)?$","description":"Version of this schema the entry was authored against. Consumers must branch on the major component. Entries authored against this document carry '0.2.0'."},"identity":{"$ref":"#/$defs/Identity"},"terms":{"$ref":"#/$defs/Terms"},"cycle":{"$ref":"#/$defs/Cycle"},"evidence":{"$ref":"#/$defs/Evidence"},"governance":{"$ref":"#/$defs/Governance"}},"allOf":[{"$comment":"D-A1 class-conditional required sets — festival/competition require a cycle block with a declared aiCategory. Motivated by the stock capture's gap 1: cycle is meaningless for all 23 stock entities, so a flat required list is wrong.","if":{"properties":{"identity":{"properties":{"class":{"enum":["festival","competition"]}},"required":["class"]}},"required":["identity"]},"then":{"required":["cycle"]}},{"$comment":"D-A1 continued — classes with rolling intake must NOT carry a cycle block (omit, do not emit five empty fields), and must declare the assisted/native split, which is the load-bearing distinction for this class.","if":{"properties":{"identity":{"properties":{"class":{"enum":["stock-library","marketplace","platform","broadcaster","streamer","publisher","brand"]}},"required":["class"]}},"required":["identity"]},"then":{"not":{"required":["cycle"]},"properties":{"terms":{"required":["band","aiAssistedAccepted","aiNativeAccepted"]}}}},{"$comment":"D-A27 / #1626 I.4 — a delivery-practice basis on the headline band is admissible only with entry-level evidence.confidence = 'reported-by-studio' (entry-level confidence is the weakest confidence among the claims that determine the band, #1626 I.5/6.2). The >=2 independent concordant reports half of the rule is checked editorially, not structurally.","if":{"properties":{"terms":{"properties":{"band":{"properties":{"basis":{"const":"delivery-practice"}},"required":["basis"]}},"required":["band"]}},"required":["terms"]},"then":{"properties":{"evidence":{"properties":{"confidence":{"const":"reported-by-studio"}},"required":["confidence"]}},"required":["evidence"]}}],"$defs":{"Ternary":{"$comment":"skos: none — a value type, not a domain concept — Three real states plus two honest kinds of absence. 'unstated' = the acceptor publishes no position. 'unknown' = we have not established one. They are not the same and must never collapse.","enum":["true","false","partial","unstated","unknown","not-applicable"]},"Identity":{"$comment":"skos: mv:Acceptor (docs/skos/mvai_2026-09_acceptor_index.skos)","type":"object","required":["id","name","class","jurisdiction"],"additionalProperties":false,"allOf":[{"$comment":"D-A26 — found by running the 55. `website` was a required URI in spec §3; 7 of 32 festival entities have no own site located at all, only a submission-platform listing that refuses automated retrieval. A required URI would have rejected 13% of a real edition, so webPresence carries the absence instead of a blank or invented URL.","if":{"not":{"required":["website"]}},"then":{"required":["webPresence"]}}],"properties":{"id":{"type":"string","pattern":"^[a-z0-9]+(-[a-z0-9]+)*$","description":"Stable slug, unique within its edition. Namespaced by edition in URLs so an acceptor id can never collide with an edition slug."},"name":{"type":"string","minLength":1},"legalName":{"type":"string"},"class":{"type":"string","enum":["festival","competition","platform","stock-library","marketplace","broadcaster","streamer","publisher","brand"],"$comment":"skos: mv:AcceptorClass — enum ids are skos:notation (docs/skos/mvai_2026-09_acceptor_index.skos) — 'marketplace' is added to spec §3's list: the stock capture classes Envato, Redbubble, Creative Market, CGTrader and Sketchfab as marketplaces rather than stock libraries, and the distinction changes which terms apply."},"jurisdiction":{"$ref":"#/$defs/Jurisdiction","description":"D-A18 — first-class facet, not identity prose. Required register-wide."},"website":{"type":"string","format":"uri"},"webPresence":{"type":"object","required":["state"],"additionalProperties":false,"properties":{"state":{"enum":["own-site","listing-platform-only","none-located"]},"listingPlatform":{"type":"string"},"listingUrl":{"type":"string","format":"uri"},"notes":{"type":"string"}}},"parentAcceptorId":{"type":"string","description":"D-A14 — the id of the acceptor this entry sits inside or beside, when a parallel section, sub-track or sibling application publishes a different position from the flagship. Prevents 'the flagship declines but the adjacent programme seeks' collapsing into one row or splitting into two rows that do not visibly share a parent."},"relationToParent":{"enum":["parallel-section","sub-track","adjacent-programme","same-brand-different-event","sibling-application","co-located-third-party-event"]},"aliases":{"type":"array","items":{"type":"string"}}}},"Jurisdiction":{"$comment":"skos: mv:AcceptorJurisdiction (docs/skos/mvai_2026-09_acceptor_index.skos)","type":"object","required":["values","basis"],"additionalProperties":false,"properties":{"values":{"type":"array","minItems":1,"items":{"type":"string","pattern":"^([A-Z]{2}|INT|UNSTATED)$","description":"ISO 3166-1 alpha-2, or INT for explicitly multi-territory, or UNSTATED."}},"basis":{"enum":["governing-law-clause","organiser-location","stated-editions","corporate-domicile","inferred","unchecked"],"$comment":"D-A18 / stock gap 6. 'unchecked' is what all 23 stock entities honestly are — the sourcing pass spent its budget on the AI clause. Without this field, 23 'unstated' jurisdictions read as 23 confirmed absences of a governing-law clause, which is false."},"quote":{"type":"string"}}},"Terms":{"$comment":"skos: mv:AcceptorTerms (docs/skos/mvai_2026-09_acceptor_index.skos)","type":"object","required":["band"],"additionalProperties":false,"properties":{"band":{"$ref":"#/$defs/Band"},"positions":{"type":"array","description":"D-A2 — zero or more scoped positions that differ from the headline band. Non-empty whenever the acceptor publishes different rules per category, track, collection, tier or use. The headline band remains the row-level answer for the hub table; positions carry the truth.","items":{"$ref":"#/$defs/ScopedPosition"}},"aiAssistedAccepted":{"$ref":"#/$defs/Ternary"},"aiNativeAccepted":{"$ref":"#/$defs/Ternary"},"aiUseBoundary":{"$ref":"#/$defs/AiUseBoundary"},"disclosure":{"$ref":"#/$defs/Disclosure"},"provenanceRequired":{"type":"object","additionalProperties":false,"properties":{"standards":{"type":"array","items":{"enum":["c2pa","iptc","xmp","exif","proprietary","none","unknown"]}},"required":{"$ref":"#/$defs/Ternary"},"quote":{"type":"string"}},"$comment":"skos: mv:ProvenanceRequirement (docs/skos/mvai_2026-09_acceptor_index.skos)"},"c2paHandling":{"enum":["strips","preserves","re-signs","unknown"],"$comment":"skos: mv:C2PAHandling (docs/skos/mvai_2026-09_acceptor_index.skos) — SDR-019 §6.4's round-trip test upgrades an entry from 'unknown' to an observed value. Unpopulated across all 55 captured entities — see the validation report."},"rightsGrant":{"$ref":"#/$defs/RightsGrant"},"releaseRequirements":{"$ref":"#/$defs/ReleaseRequirements"},"modelRestrictions":{"$ref":"#/$defs/ModelRestrictions"},"aiShareConstraints":{"type":"array","description":"D-A5 — replaces spec §3's scalar maxAiShare, which presupposed a ceiling. Several real acceptors publish floors.","items":{"$ref":"#/$defs/AiShareConstraint"}},"platformAiUseOfSubmissions":{"$ref":"#/$defs/PlatformAiUseOfSubmissions"},"enforcement":{"$ref":"#/$defs/Enforcement"},"rateParity":{"type":"object","additionalProperties":false,"properties":{"state":{"enum":["same-rate","reduced-rate","separate-schedule","unstated","unknown","not-applicable"]},"quote":{"type":"string"}},"$comment":"skos: mv:RateParity (docs/skos/mvai_2026-09_acceptor_index.skos)"},"clauseVolatility":{"type":"object","description":"D-A21 — found by running the 55, not predicted by either gap list. Two stock entries carry a 'Provisionality note' recording that the operative clause is hedged with 'currently', i.e. the acceptor has signalled the position is provisional. A register whose whole value proposition is freshness must be able to say 'this one is explicitly labelled as liable to change' rather than presenting it as settled.","additionalProperties":false,"properties":{"hedged":{"type":"boolean"},"hedgeQuote":{"type":"string"},"effectiveFrom":{"type":"string"},"announcedChangeDate":{"type":"string"}}},"deliverySpec":{"type":"object","description":"D-A22 — found by running the 55. One festival entry carried a `technical:` sub-key ('4K minimum resolution, 19:6 aspect ratio, .mp4/.mov') that had nowhere to go. Spec §4's acceptor page promises a 'what to ship checklist (disclosure text, metadata fields, file spec)', so the page architecture already assumes a field the entry anatomy never defined.","additionalProperties":false,"properties":{"resolutionMin":{"type":"string"},"aspectRatios":{"type":"array","items":{"type":"string"}},"containerFormats":{"type":"array","items":{"type":"string"}},"runtimeMinMinutes":{"type":"number"},"runtimeMaxMinutes":{"type":"number"},"otherRequirements":{"type":"string"}}},"notes":{"type":"string"}}},"Band":{"$comment":"skos: mv:AcceptanceBand (docs/skos/mvai_2026-09_acceptor_index.skos)","type":"object","required":["value","vocabulary","vocabularyVersion"],"additionalProperties":false,"description":"D-A2 — the band is an object, not a bare enum, so the vocabulary can be versioned independently of the schema and a consumer can detect a change rather than silently mis-render one. The enum is the #1626 vocabulary accepted 2026-09-02, version 0.1.0. v0.2.0 (D-A27) adds `basis` — where the band comes from — so a practice-derived band is distinguishable from a terms-derived one on the page (#1626 I.4). Optional in v0.2.0; becomes required from v1.","properties":{"value":{"enum":["declines","accepts-with-conditions","accepts-as-standard","seeks","unstated"],"$comment":"skos: mv:AcceptanceBand narrower concepts — enum ids are skos:notation, glyphs are skos:altLabel (docs/skos/mvai_2026-09_acceptor_index.skos) — Machine values, not glyphs. Glyph ○ ◐ ● ★ ? is a presentation concern and lives in the renderer, per WCAG (band glyphs need text equivalents)."},"basis":{"enum":["published-terms","acceptor-statement","delivery-practice","observed-outcome"],"$comment":"skos: mv:BandBasis narrower concepts — enum ids are skos:notation (docs/skos/mvai_2026-09_acceptor_index.skos): mv:PublishedTermsBasis, mv:AcceptorStatementBasis, mv:DeliveryPracticeBasis, mv:ObservedOutcomeBasis.","description":"D-A27 / #1626 I.4 — the assignment basis of this band. 'published-terms' (an operative clause in a rulebook, ToS, contributor agreement, submission guideline or supplier-published delivery spec) and 'acceptor-statement' (the acceptor's own words addressing its position directly) may set a band unconditionally. 'delivery-practice' (what studios report happened at delivery/QC) may set a band ONLY with evidence.confidence = 'reported-by-studio' and at least two independent concordant reports, and the row must visibly say so — enforced for the headline terms.band by the root-level conditional; for positions[].band it is a semantic rule the editorial routine checks. 'observed-outcome' (something was seen to happen — a work screened, an asset stayed up) NEVER sets a band: it populates practiceNote and the band value must be 'unstated' (enforced by the conditional on this definition). Optional in v0.2.0 so that already-captured entries remain representable; REQUIRED from v1 — a v1 consumer may treat a missing basis as a schema error."},"glyph":{"enum":["○","◐","●","★","?"]},"vocabulary":{"const":"acceptor-band"},"vocabularyVersion":{"type":"string","const":"0.1.0","description":"Bumped by #1626. A consumer that does not recognise the version must render the entry's prose conditions rather than the band."},"derivedFrom":{"enum":["sole-published-position","dominant-position","positions"],"description":"'dominant-position' records that the acceptor publishes more than one position and this row buckets them — the festivals capture already did this by hand for Chicago Southland and Raindance. When positions[] is populated this SHOULD be 'positions'."},"unstatedReason":{"enum":["no-published-position","not-checked","source-unreachable"],"description":"D-A3 — '?' conflated 'no published position' with 'we did not check'. Required whenever value = 'unstated' (see the conditional below).","$comment":"skos: mv:UnstatedReason (docs/skos/mvai_2026-09_acceptor_index.skos)"},"headlineRationale":{"type":"string"},"practiceNote":{"type":"string","description":"D-A27 / #1626 I.4 — the home for observed-outcome evidence, rendered as prose beside the band and never as the band itself. Also carries the 'row must visibly say so' text for a delivery-practice band."},"standardBasis":{"enum":["affirmed","documented-silence"],"description":"Semantics section 3.2. affirmed: the acceptor says in its own words that nothing AI-specific is asked. documented-silence: the governing documents were read in full and contain no AI-specific requirement."}},"allOf":[{"if":{"properties":{"value":{"const":"unstated"}},"required":["value"]},"then":{"required":["unstatedReason"]}},{"$comment":"D-A27 / #1626 I.4 — observed-outcome never sets a band. An entry that only has an observed outcome records value = 'unstated' (with its unstatedReason) and describes the observation in practiceNote.","if":{"properties":{"basis":{"const":"observed-outcome"}},"required":["basis"]},"then":{"properties":{"value":{"const":"unstated"}},"required":["practiceNote"]}},{"if":{"properties":{"value":{"const":"accepts-as-standard"}},"required":["value"]},"then":{"required":["standardBasis"]}}]},"ScopedPosition":{"$comment":"skos: mv:AcceptorScope (docs/skos/mvai_2026-09_acceptor_index.skos)","type":"object","required":["scope","band"],"additionalProperties":false,"properties":{"scope":{"type":"object","required":["kind","name"],"additionalProperties":false,"properties":{"kind":{"enum":["category","track","section","collection","tier","surface","use","deliverable-role","asset-type","territory"],"$comment":"'deliverable-role' is what Envato needs: permitted as preview, never as the licensed deliverable. 'collection' is what Vecteezy (Editorial) and 500px (Licensing/Quests) need. 'category'/'track' is what Austin (AI Film vs Hybrid) and Slamdance (DIG) need."},"name":{"type":"string"},"description":{"type":"string"}}},"band":{"$ref":"#/$defs/Band"},"aiAssistedAccepted":{"$ref":"#/$defs/Ternary"},"aiNativeAccepted":{"$ref":"#/$defs/Ternary"},"aiShareConstraints":{"type":"array","items":{"$ref":"#/$defs/AiShareConstraint"}},"modelRestrictions":{"$ref":"#/$defs/ModelRestrictions"},"releaseRequirements":{"$ref":"#/$defs/ReleaseRequirements"},"disclosure":{"$ref":"#/$defs/Disclosure"},"quote":{"type":"string"},"notes":{"type":"string"}}},"AiUseBoundary":{"$comment":"skos: mv:AiUseBoundary (docs/skos/mvai_2026-09_acceptor_index.skos)","type":"object","description":"D-A11 / stock gap 2 — aiAssisted vs aiNative needs a shared boundary test, not two booleans each entry interprets for itself. Sketchfab and 500px both draw the line explicitly; several others gesture at it.","additionalProperties":false,"properties":{"definitionSource":{"enum":["acceptor-stated","register-default","unknown"]},"editingExistingContentPermitted":{"$ref":"#/$defs/Ternary"},"generativeIntroductionOfNewContentPermitted":{"$ref":"#/$defs/Ternary"},"captureOriginationRequired":{"$ref":"#/$defs/Ternary","description":"500px: 'Every submission must originate from a physical camera sensor.'"},"quote":{"type":"string"}}},"Disclosure":{"$comment":"skos: mv:AcceptorDisclosureRequirement (docs/skos/mvai_2026-09_acceptor_index.skos)","type":"object","description":"D-A6 / festivals gap 5 — a boolean erases the difference between mandatory, optional, and mandatory-but-explicitly-not-scored.","additionalProperties":false,"properties":{"required":{"enum":["mandatory","optional","none","not-applicable","unstated","unknown"]},"mechanisms":{"type":"array","items":{"enum":["on-screen","metadata","form-field","credits","checkbox","keyword-tag","category-selection","written-description","production-file","unknown"]}},"weight":{"enum":["scored","context-only","explicitly-non-scoring","unstated","unknown"],"$comment":"AI CINEMA: mandatory but 'for context only and is not used for scoring'. Cambridge: films 'will not be judged more or less favourably based solely on their use of AI'. Sundance Nonfiction Core: the GenAI questions are explicitly optional."},"requiredText":{"type":"string"},"quote":{"type":"string"}}},"RightsGrant":{"$comment":"skos: mv:AcceptorRightsGrant (docs/skos/mvai_2026-09_acceptor_index.skos)","type":"object","description":"D-A8 / festivals gap 8 — free text makes 'which acceptors take a perpetual grant?' unanswerable. Runway AIF and Austin grant perpetual, irrevocable, transferable, sublicensable rights; AIFJ grants screening-only for the event.","additionalProperties":false,"properties":{"applicable":{"$ref":"#/$defs/Ternary"},"notApplicableReason":{"type":"string"},"exclusivity":{"enum":["exclusive","non-exclusive","unstated","unknown"]},"duration":{"enum":["perpetual","term-limited","event-only","unstated","unknown"]},"territory":{"enum":["worldwide","regional","unstated","unknown"]},"revocable":{"$ref":"#/$defs/Ternary"},"transferable":{"$ref":"#/$defs/Ternary"},"sublicensable":{"$ref":"#/$defs/Ternary"},"derivativeWorks":{"$ref":"#/$defs/Ternary"},"royaltyFree":{"$ref":"#/$defs/Ternary"},"purposeScope":{"type":"array","items":{"enum":["screening","promotion","distribution","archival","modification","resale","unstated"]}},"quote":{"type":"string"}}},"ReleaseRequirements":{"$comment":"skos: mv:AcceptorReleaseRequirement (docs/skos/mvai_2026-09_acceptor_index.skos)","type":"object","description":"D-A9 / stock gap 9 — a field the stock capture had to invent. A third-party consent instrument is legally distinct from the contributor's own licence grant, and conflating them makes 'who requires a release for synthetic subjects?' unanswerable.","additionalProperties":false,"properties":{"required":{"enum":["always","conditional","none","prohibited-outright","unstated","unknown","not-applicable"]},"appliesTo":{"type":"array","items":{"enum":["synthetic-likeness","real-photo-derived-prompt","text-prompt-only","recognisable-person","recognisable-voice","property","trademark"]}},"prohibitions":{"type":"array","items":{"type":"string"},"$comment":"Dreamstime bans uploading generated human faces outright — no releasable model exists to attach."},"quote":{"type":"string"}}},"ModelRestrictions":{"$comment":"skos: mv:ModelRestriction (docs/skos/mvai_2026-09_acceptor_index.skos)","type":"object","description":"D-A10 / festivals gaps 4 and 9 — 'no models trained on unlicensed data' (a training-data clause), 'tools similar to Runway Gen-4.5' (an allow-list), and 'a majority of the Source Material must not be written by ChatGPT' (an authorship floor on the script, not the visuals) are three different rules that a single free-text field flattens.","additionalProperties":false,"properties":{"namedToolAllowList":{"type":"array","items":{"type":"string"}},"namedToolDenyList":{"type":"array","items":{"type":"string"}},"toolAgnostic":{"$ref":"#/$defs/Ternary"},"trainingDataClauses":{"type":"array","items":{"type":"string"}},"sourceMaterialAuthorship":{"type":"object","additionalProperties":false,"properties":{"humanAuthorshipRequired":{"$ref":"#/$defs/Ternary"},"scope":{"type":"array","items":{"enum":["script","story","visuals","performance","voice","music","all"]}},"quote":{"type":"string"}}},"likenessRules":{"type":"string"},"quote":{"type":"string"}}},"AiShareConstraint":{"$comment":"skos: mv:AiShareConstraint (docs/skos/mvai_2026-09_acceptor_index.skos)","type":"object","required":["bound","unit"],"additionalProperties":false,"properties":{"bound":{"enum":["min","max","exact-range"],"description":"D-A5 — WAIFF requires at least three generative tools (min); BAIFF 25–100% (exact-range); Seattle ~70% of pipeline (min); 500px no more than 10% of pixel area (max). One field cannot be both a ceiling and a floor."},"unit":{"enum":["percent-of-runtime","percent-of-visual-content","percent-of-pixel-area","percent-of-pipeline","tool-count","qualitative","unstated"]},"value":{"type":"number"},"valueMax":{"type":"number","description":"Upper end when bound = 'exact-range'."},"appliesTo":{"type":"string","description":"Category, track or surface this constraint scopes to."},"assertionBasis":{"enum":["stated","inferred","secondary-sourced"]},"quote":{"type":"string"}}},"PlatformAiUseOfSubmissions":{"$comment":"skos: mv:PlatformAiUseOfSubmissions (docs/skos/mvai_2026-09_acceptor_index.skos)","type":"object","description":"D-A12 / stock gap 5 — the reverse-direction clause. What the acceptor does with submitted work (trains on it, or commits not to) is a different axis from what the acceptor permits contributors to submit. Sketchfab and TurboSquid both publish one.","additionalProperties":false,"properties":{"trainsOnSubmissions":{"enum":["yes","no","opt-out","opt-in","unstated","unknown"]},"compensationProgramme":{"$ref":"#/$defs/Ternary"},"quote":{"type":"string"}}},"Enforcement":{"$comment":"skos: mv:EnforcementPosture (docs/skos/mvai_2026-09_acceptor_index.skos)","type":"object","description":"D-A7 / festivals gap 7 — what happens on a false or missing declaration. Cambridge publishes that it relies on 'filmmakers' honest self reporting'; AIFJ publishes immediate disqualification; TIFF publishes a discretionary consequence; 500px publishes a permanent ban.","additionalProperties":false,"properties":{"posture":{"enum":["self-report-no-verification","self-report-with-spot-checks","automatic-disqualification","discretionary","content-removal","account-ban","unstated","unknown"]},"consequenceQuote":{"type":"string"},"verificationLimitsAcknowledged":{"$ref":"#/$defs/Ternary"}}},"Cycle":{"$comment":"skos: mv:AcceptorCycle (docs/skos/mvai_2026-09_acceptor_index.skos)","type":"object","description":"Festival/competition classes only — see the class-conditional rules at the root. Absent, not empty, for rolling-intake classes.","required":["aiCategory"],"additionalProperties":false,"properties":{"entryOpens":{"type":"string","description":"Derived convenience: earliest opening in deadlines[]. ISO 8601 date or date-time."},"entryDeadline":{"type":"string","description":"Derived convenience: final deadline in deadlines[]. Drives the calendar view and the 60-day pre-deadline re-verification trigger."},"cadence":{"enum":["annual","biannual","quarterly","monthly","rolling","one-off","unknown"]},"deadlines":{"type":"array","description":"D-A13 / festivals gap 2 — a single entryDeadline cannot represent early-bird/regular/late waves or a monthly cycle.","items":{"type":"object","required":["label"],"additionalProperties":false,"properties":{"label":{"enum":["opens","early-bird","regular","late","final","extended","rolling","monthly","unknown"]},"date":{"type":"string"},"timezone":{"type":"string"},"appliesTo":{"type":"string"},"notes":{"type":"string"}}}},"fees":{"type":"array","description":"D-A13 / festivals gap 1 — spec §3 had no fee concept at all. WAIFF charges a separate fee per cross-category entry; most FilmFreeway-hosted festivals have early/regular/late tiers.","items":{"type":"object","additionalProperties":false,"properties":{"label":{"type":"string"},"amount":{"type":"number"},"currency":{"type":"string","pattern":"^[A-Z]{3}$"},"appliesTo":{"type":"string"},"freeEntry":{"type":"boolean"},"conditions":{"type":"string"},"state":{"enum":["stated","tiered-unspecified","unstated","unknown"]}}}},"aiCategory":{"enum":["dedicated","integrated","none","unknown"],"description":"Required for cycle-bearing classes.","$comment":"skos: mv:AiCategory (docs/skos/mvai_2026-09_acceptor_index.skos)"},"categories":{"type":"array","description":"Names of entry categories. Per-category rules live in terms.positions[] with scope.kind = 'category', not here.","items":{"type":"string"}},"eligibilityNotes":{"type":"string"},"premiereRequirement":{"$ref":"#/$defs/Ternary"},"minimumAge":{"type":"integer"}}},"Evidence":{"$comment":"skos: mv:AcceptorEvidence (docs/skos/mvai_2026-09_acceptor_index.skos)","type":"object","required":["sources","confidence","lastVerified"],"additionalProperties":false,"properties":{"sources":{"type":"array","minItems":1,"items":{"type":"object","required":["role"],"additionalProperties":false,"properties":{"url":{"type":"string","format":"uri"},"role":{"enum":["primary","secondary","primary-attempted-unreachable","archive","none-located"],"description":"'primary-attempted-unreachable' records a 403/503/unparseable-PDF retrieval attempt — without it the register cannot distinguish 'we did not look' from 'the source refuses automated retrieval'. D-A24: 'none-located' is required by two real entities (Artlist, Redbubble) whose capture records `sourceUrl: none independently confirmed`; url is therefore NOT required, and MUST be absent for that role."},"quote":{"type":"string","description":"The operative clause. Convenience mirror of the quotes[] entry whose role is 'operative'."},"quotes":{"type":"array","description":"D-A23 — found by running the 55. Both captures had to encode a quote's function in an ad-hoc key suffix (`quote (rationale)`, `quote (exception)`, `quote (enforcement)`, `quote (scope exclusion)`, `quote (technical minimum)`, `quote (secondary paraphrase)` — twelve distinct suffixes across the two files) because spec §3's sources[] allowed exactly one unlabelled quote per source.","items":{"type":"object","required":["text","role"],"additionalProperties":false,"properties":{"text":{"type":"string"},"role":{"enum":["operative","rationale","exception","carve-out","enforcement","scope-exclusion","technical-minimum","protective-commitment","opt-out","secondary-paraphrase","other"]},"verbatim":{"type":"boolean","description":"false marks a paraphrase or a tool's synthesis of a page it could not render — the stock capture flags several of these explicitly and they must never be published as quotations."}}}},"retrieved":{"type":"string","format":"date"},"sourceLastUpdated":{"type":"string"},"httpStatus":{"type":"integer"},"notes":{"type":"string"}},"allOf":[{"if":{"properties":{"role":{"const":"none-located"}},"required":["role"]},"then":{"not":{"required":["url"]}},"else":{"required":["url"]}}]}},"confidence":{"enum":["verified-primary","claimed-secondary","reported-by-studio","unstated"],"description":"Frozen four-value interface from spec §2, carried verbatim and CLOSED (#1626 I.5, §6.1). Shades within a value go in confidenceQualifier (closed, schema-governed) and prose in confidenceNote — never in a fifth enum member. See D-A28.","$comment":"skos: mv:EvidenceConfidence — closed at four values per #1626 I.5 (docs/skos/mvai_2026-09_acceptor_index.skos)"},"confidenceQualifier":{"enum":["primary-adjacent","primary-but-thin","primary-silence-confirmed","secondary-verbatim-quote","secondary-synthesis"],"description":"D-A4 / D-A28 — a closed, schema-governed enum of the shades within a confidence value. All five values are attested in the two 2026-09-01 captures. Capture authors may not extend it (that would be the §6.1 comparability failure); a new shade is a schema minor, argued in the design document. The prose behind a qualifier goes in confidenceNote."},"confidenceNote":{"type":"string","description":"D-A28 / #1626 I.5 — free text, rendered on the page, for nuance the four-value confidence enum and the closed confidenceQualifier cannot carry (e.g. 'unstated for the AI-specific position; verified-primary for the general IP warranty'). This is the ONLY place a capture author may put confidence nuance that has no enum home. Never parsed for meaning by a consumer; comparability lives in the two enums."},"lastVerified":{"type":"string","format":"date"},"verifiedBy":{"type":"object","additionalProperties":false,"properties":{"role":{"type":"string","description":"A role, never a named account and never a platform identity. Constraint 1."},"organisation":{"type":"string"}}},"fieldStates":{"type":"object","description":"D-A3 / stock gap 6 — per-field verification state keyed by dotted path (e.g. 'identity.jurisdiction', 'terms.c2paHandling'). Distinguishes a confirmed absence from an unexplored field. Without it, 23 'unstated' jurisdictions read as 23 confirmed absences of a governing-law clause, and 55 empty c2paHandling values read as 55 findings.","propertyNames":{"pattern":"^[a-zA-Z]+(\\.[a-zA-Z0-9\\[\\]]+)*$"},"additionalProperties":{"enum":["verified","not-checked","source-unreachable","not-applicable","contested"]}}}},"Governance":{"$comment":"skos: mv:AcceptorIndexGovernance (docs/skos/mvai_2026-09_acceptor_index.skos)","type":"object","required":["published","edition"],"additionalProperties":false,"properties":{"riskGrade":{"$ref":"#/$defs/RiskGrade","description":"SDR-019 §3 three-factor index, promoted register-wide by SDR-019 amendment A3. v0.1.0 D-A16 required it on every entry; v0.2.0 D-A29 requires it whenever published = true (conditional below) and leaves it optional on staged, unpublished entries, which are unscored until the grade is ratified (#2008). The intent of D-A16 — nothing publishes unscored, riskGrade governs URLs and never bands (#1626 §7.2) — is unchanged."},"published":{"type":"boolean"},"dedicatedUrl":{"type":"object","additionalProperties":false,"properties":{"permitted":{"type":"boolean","description":"Derived from riskGrade per SDR-019 §3's treatment table. High grade => matrix row only, or no presence at all under Appendix A."},"path":{"type":"string"},"gateConditionsMet":{"type":"array","items":{"type":"string"}}}},"edition":{"type":"string","pattern":"^[a-z0-9]+(-[a-z0-9]+)*$"},"editionCut":{"type":"string","description":"Dated edition label, e.g. '2026-Q4'."},"reVerifyBy":{"type":"string","format":"date"},"reVerifyReason":{"type":"string","description":"D-A25 — found by running the 55. Three stock entries carry a free-prose `Flag` ('re-verify directly against Artlist's own contributor agreement before this capture is promoted') and 32 festival entries carry a dated `reVerifyBy`. The two captures independently invented a re-verification mechanism with different names AND different shapes — one dated, one reasoned. The schema needs both halves or one of them is dropped on ingest."},"reVerifyTrigger":{"type":"array","items":{"enum":["quarterly","pre-deadline-60d","on-press-change","on-source-becoming-reachable"]},"description":"D-A17 — the festivals capture invented reVerifyBy; the stock capture has no such field on any of its 23, because the quarterly routine covers rolling-intake classes. Optional here, defaulted per class by the editorial routine."},"changeLog":{"type":"array","items":{"type":"object","required":["date","summary"],"additionalProperties":false,"properties":{"date":{"type":"string","format":"date"},"field":{"type":"string"},"from":{"type":"string"},"to":{"type":"string"},"summary":{"type":"string"},"sourceUrl":{"type":"string","format":"uri"}}}},"acceptorNotifiedAt":{"type":"string","format":"date"},"acceptorResponse":{"enum":["corrected","endorsed","silent","disputed","not-yet-notified"]},"contextNotes":{"type":"array","description":"D-A15 / festivals gap 10 — facts about a policy's reception (Annecy's permissive stance drew an organised guild protest in 2025) that are not terms of entry and must never leak into an eligibility field. Distinct from riskGrade, which scores OUR brand exposure rather than describing the acceptor. Never a ranking, never about films or laureates.","items":{"type":"object","required":["kind","summary"],"additionalProperties":false,"properties":{"kind":{"enum":["guild-or-labour-response","press-controversy","regulatory-action","policy-reception","policy-reversal-history"]},"summary":{"type":"string"},"date":{"type":"string"},"sources":{"type":"array","items":{"type":"string","format":"uri"}}}}},"contestedClaim":{"$comment":"skos: mv:ContestedClaim (docs/skos/mvai_2026-09_acceptor_index.skos)","type":"object","required":["claim","attribution","claimedBand","primaryFinding"],"additionalProperties":false,"description":"Semantics section 4.5: a reported position the primary documents do not contain. It is shown to the reader and can never set the band.","properties":{"claim":{"type":"string"},"attribution":{"type":"string"},"claimedBand":{"enum":["declines","accepts-with-conditions","accepts-as-standard","seeks","unstated"]},"primaryFinding":{"type":"string"},"sourceUrl":{"type":"string","format":"uri"},"retrieved":{"type":"string","format":"date"}}}},"allOf":[{"$comment":"D-A29 — riskGrade is required the moment an entry is published. A staged entry (published = false, or omitted) may carry no riskGrade; a published one without a ratified grade is a schema error, so the publish step cannot skip scoring.","if":{"properties":{"published":{"const":true}},"required":["published"]},"then":{"required":["riskGrade"]}}]},"RiskGrade":{"$comment":"skos: mv:AcceptorRiskGrade (docs/skos/mvai_2026-09_acceptor_index.skos)","type":"object","required":["adultContentAssociation","controversyLoad","enterpriseBuyerFlinch","total","grade"],"additionalProperties":false,"properties":{"adultContentAssociation":{"type":"integer","minimum":0,"maximum":3},"controversyLoad":{"type":"integer","minimum":0,"maximum":3},"enterpriseBuyerFlinch":{"type":"integer","minimum":0,"maximum":3},"total":{"type":"integer","minimum":0,"maximum":9},"grade":{"enum":["low","medium","high"]},"scoredOn":{"type":"string","format":"date"},"rationale":{"type":"string"}}}}}