champollion 0.3.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +133 -0
- package/README.md +387 -0
- package/bin/cli.js +278 -0
- package/index.js +135 -0
- package/lib/api-key.js +127 -0
- package/lib/autofix.js +432 -0
- package/lib/bridge/method_bridge.py +430 -0
- package/lib/card-source-resolution.mjs +284 -0
- package/lib/cards/cache.js +169 -0
- package/lib/cards/env.js +82 -0
- package/lib/cards/fetch-card-child.js +38 -0
- package/lib/cards/reader.js +435 -0
- package/lib/cards/refresh.js +111 -0
- package/lib/cards/remote.js +387 -0
- package/lib/cldf-export.mjs +540 -0
- package/lib/cldf-terms.mjs +62 -0
- package/lib/command-help.js +790 -0
- package/lib/commands/audit.js +49 -0
- package/lib/commands/card.js +454 -0
- package/lib/commands/doctor.js +559 -0
- package/lib/commands/fonts.js +489 -0
- package/lib/commands/help.js +91 -0
- package/lib/commands/init.js +1259 -0
- package/lib/commands/integrity.js +148 -0
- package/lib/commands/leaderboard.js +478 -0
- package/lib/commands/lint.js +30 -0
- package/lib/commands/models.js +177 -0
- package/lib/commands/plugin.js +103 -0
- package/lib/commands/provenance.js +45 -0
- package/lib/commands/recommend.js +75 -0
- package/lib/commands/register-corpus.js +678 -0
- package/lib/commands/repair-script.js +42 -0
- package/lib/commands/seal-corpus.js +355 -0
- package/lib/commands/seo.js +72 -0
- package/lib/commands/serve.js +147 -0
- package/lib/commands/status.js +265 -0
- package/lib/commands/submit.js +332 -0
- package/lib/commands/sync.js +89 -0
- package/lib/commands/tm.js +573 -0
- package/lib/commands/verify.js +39 -0
- package/lib/commands/watch.js +20 -0
- package/lib/commands/wrap.js +138 -0
- package/lib/commands/xliff.js +327 -0
- package/lib/commercial-eligibility.js +235 -0
- package/lib/concurrent.js +87 -0
- package/lib/config.js +523 -0
- package/lib/contamination-lane.js +76 -0
- package/lib/content-sync.js +731 -0
- package/lib/content.js +733 -0
- package/lib/corpus-registration.mjs +608 -0
- package/lib/cost-report.js +346 -0
- package/lib/diff.js +155 -0
- package/lib/docusaurus-sync.js +1256 -0
- package/lib/flatten.js +55 -0
- package/lib/format.js +954 -0
- package/lib/hash.js +159 -0
- package/lib/icu.js +473 -0
- package/lib/integrity.js +689 -0
- package/lib/license-gate.mjs +478 -0
- package/lib/license-identify.mjs +229 -0
- package/lib/lint.js +629 -0
- package/lib/method-manifest.js +60 -0
- package/lib/methods/anthropic.js +140 -0
- package/lib/methods/apertium.js +163 -0
- package/lib/methods/api.js +316 -0
- package/lib/methods/base.js +184 -0
- package/lib/methods/content-separator.js +45 -0
- package/lib/methods/deepl.js +426 -0
- package/lib/methods/direct-llm.js +586 -0
- package/lib/methods/external.js +332 -0
- package/lib/methods/fetch-with-retry.js +124 -0
- package/lib/methods/gemini.js +147 -0
- package/lib/methods/google-translate.js +402 -0
- package/lib/methods/http-utils.js +122 -0
- package/lib/methods/libretranslate.js +314 -0
- package/lib/methods/llm-coached.js +670 -0
- package/lib/methods/llm.js +592 -0
- package/lib/methods/local.js +76 -0
- package/lib/methods/microsoft-translator.js +331 -0
- package/lib/methods/openai.js +131 -0
- package/lib/methods/openrouter-client.js +327 -0
- package/lib/methods/openrouter-pricing.js +156 -0
- package/lib/methods/provider-env.js +115 -0
- package/lib/methods/provider-pricing.js +310 -0
- package/lib/methods/tilde.js +150 -0
- package/lib/methods/translated.js +229 -0
- package/lib/methods/translation-error.js +80 -0
- package/lib/models.js +258 -0
- package/lib/no-translate.js +233 -0
- package/lib/output.js +238 -0
- package/lib/pairs.js +547 -0
- package/lib/plugins.js +447 -0
- package/lib/provenance.js +323 -0
- package/lib/recommend.js +648 -0
- package/lib/registers.js +1185 -0
- package/lib/repair-script.js +266 -0
- package/lib/scripts.js +994 -0
- package/lib/seal.mjs +464 -0
- package/lib/sealed-qualifier.mjs +211 -0
- package/lib/security.js +59 -0
- package/lib/segment.js +369 -0
- package/lib/seo.js +275 -0
- package/lib/serve.js +854 -0
- package/lib/string-classify.js +85 -0
- package/lib/submit.mjs +344 -0
- package/lib/sync.js +969 -0
- package/lib/tags/bcp47.js +202 -0
- package/lib/tags/resolve.js +314 -0
- package/lib/terminology.js +111 -0
- package/lib/tm-seed.js +294 -0
- package/lib/tm.js +515 -0
- package/lib/translate-pair.js +197 -0
- package/lib/translate.js +203 -0
- package/lib/types.js +230 -0
- package/lib/validate.js +510 -0
- package/lib/verify.js +451 -0
- package/lib/watch.js +145 -0
- package/lib/xliff.js +184 -0
- package/package.json +93 -0
- package/shared/ATTRIBUTION.md +145 -0
- package/shared/CORPORA-CARDS.md +288 -0
- package/shared/DATA-SOVEREIGNTY.md +500 -0
- package/shared/LANGUAGE-CARD-FIELDS.md +532 -0
- package/shared/card-lint-baseline.json +3189 -0
- package/shared/cards-fallback.json +1 -0
- package/shared/catalogue/card-config.json +6091 -0
- package/shared/catalogue/external-results.json +3888 -0
- package/shared/catalogue/gender-guidance.json +1038 -0
- package/shared/catalogue/method-coverage.json +1751 -0
- package/shared/catalogue/metric-coverage.json +170 -0
- package/shared/catalogue/metric-reliability.json +1 -0
- package/shared/catalogue/register-presets.json +3180 -0
- package/shared/catalogue/vitality-scales.json +55 -0
- package/shared/cldr-index.json +1115 -0
- package/shared/code-bridge.json +253 -0
- package/shared/corpora-cards-v1-reference.md +281 -0
- package/shared/curated-dictionary-flags.json +35 -0
- package/shared/curated-endonyms.json +35 -0
- package/shared/curated-fsts.json +51 -0
- package/shared/curated-orthography-conventions.json +26 -0
- package/shared/curated-sil-resources.json +374 -0
- package/shared/curated-tools.json +41 -0
- package/shared/docent/corpus.json +11333 -0
- package/shared/docent/faq.en.json +564 -0
- package/shared/docent/register-blocks.json +60 -0
- package/shared/docent/system-prompt.md +144 -0
- package/shared/domain-taxonomy.json +35 -0
- package/shared/explainers/glossary.json +2975 -0
- package/shared/explainers/tc-features.json +20112 -0
- package/shared/explainers/term-watchlist.json +147 -0
- package/shared/human-services.json +59 -0
- package/shared/license-corrections.json +261 -0
- package/shared/license-evidence.json +13452 -0
- package/shared/licenses.json +6781 -0
- package/shared/method-registry.json +236 -0
- package/shared/metric-registry.json +620 -0
- package/shared/model-aliases.json +7 -0
- package/shared/schemas/champollion-plugin.schema.json +206 -0
- package/shared/schemas/corpora-card.schema.json +957 -0
- package/shared/schemas/domain-taxonomy.schema.json +64 -0
- package/shared/schemas/external-results.schema.json +314 -0
- package/shared/schemas/human-services.schema.json +90 -0
- package/shared/schemas/language-card.schema.json +1308 -0
- package/shared/schemas/licenses.schema.json +155 -0
- package/shared/schemas/method-card.schema.json +412 -0
- package/shared/schemas/method-registry.schema.json +85 -0
- package/shared/schemas/metric-registry.schema.json +96 -0
- package/shared/schemas/metric-reliability.schema.json +178 -0
- package/shared/schemas/model-aliases.schema.json +27 -0
- package/shared/schemas/source-snapshot.schema.json +96 -0
|
@@ -0,0 +1,957 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "http://json-schema.org/draft-07/schema#",
|
|
3
|
+
"$id": "https://champollion.dev/schemas/corpora-card.schema.json",
|
|
4
|
+
"title": "Champollion Corpora Card",
|
|
5
|
+
"description": "Schema for corpora cards — SSOT metadata for reference corpora, pair-specific evaluation sets, and multi-way parallel corpora. Reference corpora (ref-*) catalogue external datasets for development use. Evaluation sets (eval-*) are community-curated, pair-specific benchmarks with optional secret test splits, steward-controlled authorization, and OCAP®-aspirant sovereignty metadata. Multi-way corpora (multiway type with eval-* id) represent sentence-aligned parallel datasets covering many languages — a single card expands into N×(N-1) directional pairs at registry build time. Sovereignty fields record governance facts — who governs this data, what they've said about it, and what frameworks they've invoked. See DATA-SOVEREIGNTY.md for field reference.",
|
|
6
|
+
"type": "object",
|
|
7
|
+
"required": ["id", "type", "name", "version", "description", "source", "license", "contamination", "_provenance"],
|
|
8
|
+
"properties": {
|
|
9
|
+
"id": {
|
|
10
|
+
"type": "string",
|
|
11
|
+
"pattern": "^(ref|eval)-[a-z0-9][a-z0-9-]*$",
|
|
12
|
+
"description": "Unique identifier. Must start with 'ref-' for reference corpora or 'eval-' for Champollion evaluation sets. Kebab-case. This is also the card filename (minus .json)."
|
|
13
|
+
},
|
|
14
|
+
"type": {
|
|
15
|
+
"type": "string",
|
|
16
|
+
"enum": ["reference", "eval", "multiway"],
|
|
17
|
+
"description": "'reference' = external corpus catalogued for development use (FLORES+, NTREX, Tatoeba). 'eval' = community-curated pair-specific benchmark used for official Champollion evaluation. 'multiway' = multi-way parallel corpus covering many languages — one card expands into N×(N-1) directional eval pairs at registry build time."
|
|
18
|
+
},
|
|
19
|
+
"name": {
|
|
20
|
+
"type": "string",
|
|
21
|
+
"description": "Human-readable name of the corpus or evaluation set."
|
|
22
|
+
},
|
|
23
|
+
"version": {
|
|
24
|
+
"type": "string",
|
|
25
|
+
"description": "Version string (semver recommended). Tracks corpus revisions."
|
|
26
|
+
},
|
|
27
|
+
"description": {
|
|
28
|
+
"type": "string",
|
|
29
|
+
"description": "What this corpus is and why it matters. Be specific about content, methodology, and intended use."
|
|
30
|
+
},
|
|
31
|
+
|
|
32
|
+
"pair": {
|
|
33
|
+
"type": "object",
|
|
34
|
+
"description": "Language pair for eval-type cards. Not used for reference corpora (which cover many languages).",
|
|
35
|
+
"required": ["source", "target"],
|
|
36
|
+
"properties": {
|
|
37
|
+
"source": {
|
|
38
|
+
"type": "string",
|
|
39
|
+
"description": "ISO 639-3 code of the source language."
|
|
40
|
+
},
|
|
41
|
+
"target": {
|
|
42
|
+
"type": "string",
|
|
43
|
+
"description": "ISO 639-3 code of the target language."
|
|
44
|
+
},
|
|
45
|
+
"direction": {
|
|
46
|
+
"type": "string",
|
|
47
|
+
"enum": ["unidirectional", "bidirectional"],
|
|
48
|
+
"description": "Whether the dataset supports translation in both directions or only source→target."
|
|
49
|
+
}
|
|
50
|
+
},
|
|
51
|
+
"additionalProperties": false
|
|
52
|
+
},
|
|
53
|
+
|
|
54
|
+
"languages": {
|
|
55
|
+
"type": "array",
|
|
56
|
+
"items": { "type": "string" },
|
|
57
|
+
"description": "ISO 639-3 codes of all languages covered. Used for reference corpora that span many languages."
|
|
58
|
+
},
|
|
59
|
+
|
|
60
|
+
"source": {
|
|
61
|
+
"type": "object",
|
|
62
|
+
"description": "Provenance — who created this corpus and where to find it.",
|
|
63
|
+
"required": ["publisher", "url"],
|
|
64
|
+
"properties": {
|
|
65
|
+
"publisher": {
|
|
66
|
+
"type": "string",
|
|
67
|
+
"description": "Organization or team that created the corpus."
|
|
68
|
+
},
|
|
69
|
+
"url": {
|
|
70
|
+
"type": ["string", "null"],
|
|
71
|
+
"format": "uri",
|
|
72
|
+
"description": "Canonical URL. Null for private/unpublished corpora."
|
|
73
|
+
},
|
|
74
|
+
"paper": {
|
|
75
|
+
"type": ["string", "null"],
|
|
76
|
+
"format": "uri",
|
|
77
|
+
"description": "Academic paper URL (arXiv, ACL Anthology, etc.)."
|
|
78
|
+
},
|
|
79
|
+
"citation": {
|
|
80
|
+
"type": ["string", "null"],
|
|
81
|
+
"description": "Short citation string (Author et al. (Year). Title.)."
|
|
82
|
+
},
|
|
83
|
+
"fundedBy": {
|
|
84
|
+
"type": ["string", "null"],
|
|
85
|
+
"description": "Funding body, if known."
|
|
86
|
+
},
|
|
87
|
+
"repo_url": {
|
|
88
|
+
"type": "string",
|
|
89
|
+
"format": "uri",
|
|
90
|
+
"description": "Fetch-from-source: URL of the upstream repository the corpus is built from at fetch time. Champollion does not host third-party corpora — when this field is set, the data is downloaded from this repo and built locally by the declared builder adapter."
|
|
91
|
+
},
|
|
92
|
+
"ref": {
|
|
93
|
+
"type": "string",
|
|
94
|
+
"description": "Fetch-from-source: git ref (commit SHA preferred; tag or branch otherwise) of the upstream repo that the build is pinned to. Use a commit SHA for reproducible builds."
|
|
95
|
+
},
|
|
96
|
+
"ref_note": {
|
|
97
|
+
"type": ["string", "null"],
|
|
98
|
+
"description": "Fetch-from-source: free-text note about the ref, e.g. a TODO to pin a branch ref to a commit SHA."
|
|
99
|
+
},
|
|
100
|
+
"builder": {
|
|
101
|
+
"type": "string",
|
|
102
|
+
"description": "Fetch-from-source: corpora-builder adapter id that rebuilds this corpus from the upstream repo (e.g. 'edtekla' → corpora_builder.adapters.edtekla_adapter)."
|
|
103
|
+
},
|
|
104
|
+
"sha256": {
|
|
105
|
+
"type": ["string", "null"],
|
|
106
|
+
"pattern": "^[a-f0-9]{64}$",
|
|
107
|
+
"description": "Fetch-from-source: SHA-256 of the built corpus file (the dev.dataFile output). Used to verify that a local rebuild reproduced the published corpus byte-for-byte. Null if the build has not been hash-pinned yet."
|
|
108
|
+
},
|
|
109
|
+
"archive_sha256": {
|
|
110
|
+
"type": ["string", "null"],
|
|
111
|
+
"pattern": "^[a-f0-9]{64}$",
|
|
112
|
+
"description": "Fetch-from-source: SHA-256 of the UPSTREAM archive the builder downloads, verified on fetch before the build runs (distinct from sha256, which is the built corpus). Used by per-pair archive builders (e.g. 'tatoeba-opus', whose moses .txt.zip is independently hashable); the consolidated 'tatoeba-challenge' tar relies on the builder's well-known pin instead."
|
|
113
|
+
},
|
|
114
|
+
"license": {
|
|
115
|
+
"type": "string",
|
|
116
|
+
"description": "Fetch-from-source: SPDX id of the upstream data license, shown in the license-acceptance prompt before download. Duplicates the card-level license.spdx for builder convenience."
|
|
117
|
+
},
|
|
118
|
+
"license_url": {
|
|
119
|
+
"type": "string",
|
|
120
|
+
"format": "uri",
|
|
121
|
+
"description": "Fetch-from-source: canonical URL of the upstream data license text."
|
|
122
|
+
},
|
|
123
|
+
"member": {
|
|
124
|
+
"type": "string",
|
|
125
|
+
"description": "Fetch-from-source: path of the relevant member inside the upstream archive/repo the builder extracts (e.g. 'data/test-v2023-09-26/ara-ber/test.txt' inside the Tatoeba Challenge tar)."
|
|
126
|
+
},
|
|
127
|
+
"recipe": {
|
|
128
|
+
"type": "object",
|
|
129
|
+
"description": "Fetch-from-source: deterministic build parameters passed to the builder adapter (split, seed, size caps, length filters, etc.). Shape is builder-specific; the adapter is the SSOT for which keys it honours.",
|
|
130
|
+
"additionalProperties": true
|
|
131
|
+
}
|
|
132
|
+
},
|
|
133
|
+
"additionalProperties": false
|
|
134
|
+
},
|
|
135
|
+
|
|
136
|
+
"license": {
|
|
137
|
+
"type": "object",
|
|
138
|
+
"description": "License terms. Every field must be verified against the actual license file or documentation.",
|
|
139
|
+
"required": ["spdx", "commercial", "redistribution"],
|
|
140
|
+
"properties": {
|
|
141
|
+
"spdx": {
|
|
142
|
+
"type": "string",
|
|
143
|
+
"description": "SPDX license identifier (e.g., 'CC-BY-SA-4.0', 'MIT', 'Apache-2.0') or 'custom' for non-standard licenses."
|
|
144
|
+
},
|
|
145
|
+
"commercial": {
|
|
146
|
+
"type": "boolean",
|
|
147
|
+
"description": "Can this corpus be used for commercial purposes?"
|
|
148
|
+
},
|
|
149
|
+
"redistribution": {
|
|
150
|
+
"type": "boolean",
|
|
151
|
+
"description": "Can this corpus be redistributed?"
|
|
152
|
+
},
|
|
153
|
+
"aiTraining": {
|
|
154
|
+
"type": ["string", "null"],
|
|
155
|
+
"description": "Terms for use in AI/ML model training, if specified in the license."
|
|
156
|
+
},
|
|
157
|
+
"notes": {
|
|
158
|
+
"type": ["string", "null"],
|
|
159
|
+
"description": "Additional license restrictions not captured by the fields above (e.g., ELAR access terms)."
|
|
160
|
+
}
|
|
161
|
+
},
|
|
162
|
+
"additionalProperties": false
|
|
163
|
+
},
|
|
164
|
+
|
|
165
|
+
"dev": {
|
|
166
|
+
"type": "object",
|
|
167
|
+
"description": "Development split — public data for local testing and prompt tuning. Only for eval-type cards.",
|
|
168
|
+
"required": ["size", "sizeUnit"],
|
|
169
|
+
"properties": {
|
|
170
|
+
"size": {
|
|
171
|
+
"type": "integer",
|
|
172
|
+
"minimum": 1,
|
|
173
|
+
"description": "Number of entries/sentences in the dev split."
|
|
174
|
+
},
|
|
175
|
+
"sizeUnit": {
|
|
176
|
+
"type": "string",
|
|
177
|
+
"enum": ["entries", "sentences", "segments", "documents"],
|
|
178
|
+
"description": "Unit of the size count."
|
|
179
|
+
},
|
|
180
|
+
"domain": {
|
|
181
|
+
"type": "string",
|
|
182
|
+
"enum": ["ui", "legal", "medical", "financial", "edu", "ecommerce", "marketing", "gov", "scientific", "religious", "support", "subtitles", "news", "literary", "conv", "tech", "humanitarian", "mixed"],
|
|
183
|
+
"description": "Primary domain of the data. Closed taxonomy — one of the 17 content codes in shared/domain-taxonomy.json (ui, legal, medical, financial, edu, ecommerce, marketing, gov, scientific, religious, support, subtitles, news, literary, conv, tech, humanitarian) OR the composite marker 'mixed'. 'mixed' means no single dominant domain and MUST be paired with a domainDistribution (build_registry hard-fails on bare 'mixed')."
|
|
184
|
+
},
|
|
185
|
+
"domainDistribution": {
|
|
186
|
+
"type": "object",
|
|
187
|
+
"description": "Breakdown of domains within the data. Keys are content domain codes (the 17 codes; never 'mixed'), values are proportions (0.0-1.0) or counts. Required whenever domain='mixed'.",
|
|
188
|
+
"propertyNames": { "enum": ["ui", "legal", "medical", "financial", "edu", "ecommerce", "marketing", "gov", "scientific", "religious", "support", "subtitles", "news", "literary", "conv", "tech", "humanitarian"] },
|
|
189
|
+
"additionalProperties": { "type": "number" }
|
|
190
|
+
},
|
|
191
|
+
"dataFile": {
|
|
192
|
+
"type": "string",
|
|
193
|
+
"description": "Relative path to the data file within arena/datasets/ (e.g., 'curated/eng-crk-dev-v1.json')."
|
|
194
|
+
},
|
|
195
|
+
"format": {
|
|
196
|
+
"type": "string",
|
|
197
|
+
"enum": ["harness-json", "jsonl", "tsv", "parallel-text"],
|
|
198
|
+
"description": "Format of the data file."
|
|
199
|
+
}
|
|
200
|
+
},
|
|
201
|
+
"additionalProperties": false
|
|
202
|
+
},
|
|
203
|
+
|
|
204
|
+
"test": {
|
|
205
|
+
"type": "object",
|
|
206
|
+
"description": "Public test split — the non-secured portion of a Champollion-built test corpus. For prize corpora, 'test' is the public portion and 'secretTest' is the cryptographically secured holdout from the same master corpus. Distinct from 'dev' which is for development/prompt-tuning.",
|
|
207
|
+
"required": ["size", "sizeUnit"],
|
|
208
|
+
"properties": {
|
|
209
|
+
"size": {
|
|
210
|
+
"type": "integer",
|
|
211
|
+
"minimum": 1,
|
|
212
|
+
"description": "Number of entries/sentences in the public test split."
|
|
213
|
+
},
|
|
214
|
+
"sizeUnit": {
|
|
215
|
+
"type": "string",
|
|
216
|
+
"enum": ["entries", "sentences", "segments", "documents"],
|
|
217
|
+
"description": "Unit of the size count."
|
|
218
|
+
},
|
|
219
|
+
"domain": {
|
|
220
|
+
"type": "string",
|
|
221
|
+
"enum": ["ui", "legal", "medical", "financial", "edu", "ecommerce", "marketing", "gov", "scientific", "religious", "support", "subtitles", "news", "literary", "conv", "tech", "humanitarian", "mixed"],
|
|
222
|
+
"description": "Primary domain of the data. Closed taxonomy — one of the 17 content codes in shared/domain-taxonomy.json OR the composite marker 'mixed'. 'mixed' means no single dominant domain and MUST be paired with a domainDistribution (build_registry hard-fails on bare 'mixed')."
|
|
223
|
+
},
|
|
224
|
+
"domainDistribution": {
|
|
225
|
+
"type": "object",
|
|
226
|
+
"description": "Breakdown of domains within the data. Keys are content domain codes (the 17 codes; never 'mixed'), values are proportions (0.0-1.0) or counts. Required whenever domain='mixed'.",
|
|
227
|
+
"propertyNames": { "enum": ["ui", "legal", "medical", "financial", "edu", "ecommerce", "marketing", "gov", "scientific", "religious", "support", "subtitles", "news", "literary", "conv", "tech", "humanitarian"] },
|
|
228
|
+
"additionalProperties": { "type": "number" }
|
|
229
|
+
},
|
|
230
|
+
"dataFile": {
|
|
231
|
+
"type": "string",
|
|
232
|
+
"description": "Relative path to the data file within arena/datasets/ (e.g., 'curated/eng-crk-test-v1.json')."
|
|
233
|
+
},
|
|
234
|
+
"format": {
|
|
235
|
+
"type": "string",
|
|
236
|
+
"enum": ["harness-json", "jsonl", "tsv", "parallel-text"],
|
|
237
|
+
"description": "Format of the data file."
|
|
238
|
+
}
|
|
239
|
+
},
|
|
240
|
+
"additionalProperties": false
|
|
241
|
+
},
|
|
242
|
+
|
|
243
|
+
"segments": {
|
|
244
|
+
"type": "array",
|
|
245
|
+
"description": "For reference corpora — available data splits (dev, devtest, test, etc.).",
|
|
246
|
+
"items": {
|
|
247
|
+
"type": "object",
|
|
248
|
+
"required": ["id"],
|
|
249
|
+
"properties": {
|
|
250
|
+
"id": { "type": "string", "description": "Segment identifier (e.g., 'devtest', 'dev', 'test')." },
|
|
251
|
+
"name": { "type": "string", "description": "Human-readable segment name." },
|
|
252
|
+
"size": { "type": "integer", "minimum": 1, "description": "Number of entries/sentences." },
|
|
253
|
+
"sizeUnit": { "type": "string", "enum": ["entries", "sentences", "segments", "documents"] },
|
|
254
|
+
"purpose": { "type": "string", "description": "Intended use of this segment." }
|
|
255
|
+
},
|
|
256
|
+
"additionalProperties": false
|
|
257
|
+
}
|
|
258
|
+
},
|
|
259
|
+
|
|
260
|
+
"download": {
|
|
261
|
+
"type": "object",
|
|
262
|
+
"description": "How to obtain the data. For reference corpora (users download themselves), eval dev splits, or multiway parallel corpora.",
|
|
263
|
+
"required": ["method", "url"],
|
|
264
|
+
"properties": {
|
|
265
|
+
"method": {
|
|
266
|
+
"type": "string",
|
|
267
|
+
"enum": ["url", "git-clone", "pip", "huggingface", "manual", "restricted", "bundled"],
|
|
268
|
+
"description": "Download method. 'bundled' means the data ships with the harness in curated/."
|
|
269
|
+
},
|
|
270
|
+
"url": {
|
|
271
|
+
"type": ["string", "null"],
|
|
272
|
+
"format": "uri",
|
|
273
|
+
"description": "Download URL. Null if method is 'restricted' or 'bundled'."
|
|
274
|
+
},
|
|
275
|
+
"instructions": {
|
|
276
|
+
"type": ["string", "null"],
|
|
277
|
+
"description": "Human-readable download and setup instructions."
|
|
278
|
+
},
|
|
279
|
+
"sha256": {
|
|
280
|
+
"type": ["string", "null"],
|
|
281
|
+
"description": "SHA-256 hash of the download artifact for integrity verification."
|
|
282
|
+
},
|
|
283
|
+
"filePattern": {
|
|
284
|
+
"type": "string",
|
|
285
|
+
"description": "For multiway parallel corpora: path pattern within the repo to locate per-language files. Uses {lang_code} for the source language code and {segment} for the split name. Example: 'flores200/{segment}/{lang_code}.{segment}'."
|
|
286
|
+
},
|
|
287
|
+
"format": {
|
|
288
|
+
"type": "string",
|
|
289
|
+
"enum": ["parallel-text", "jsonl", "tsv"],
|
|
290
|
+
"description": "For multiway parallel corpora: format of the per-language files. 'parallel-text' = one sentence per line, files aligned by line number."
|
|
291
|
+
},
|
|
292
|
+
"gated": {
|
|
293
|
+
"type": "boolean",
|
|
294
|
+
"description": "Gated-source metadata: true when the upstream requires accepting terms (and an access token) before download — e.g. a gated HuggingFace dataset. Drives the TUI's per-dataset accept-terms instructions and the fail-honest download errors. Defaults to false (open download) when absent."
|
|
295
|
+
},
|
|
296
|
+
"termsUrl": {
|
|
297
|
+
"type": ["string", "null"],
|
|
298
|
+
"format": "uri",
|
|
299
|
+
"description": "Gated-source metadata: the exact page where a user accepts the dataset's terms (e.g. the HuggingFace dataset page). Shown verbatim in the accept-terms prompt and the gated-download error. Null/absent when not gated."
|
|
300
|
+
},
|
|
301
|
+
"tokenEnv": {
|
|
302
|
+
"type": ["string", "null"],
|
|
303
|
+
"description": "Gated-source metadata: name of the environment variable the access token is read from (e.g. 'HF_TOKEN'). Surfaced verbatim in the token-export instructions. Null/absent when not gated."
|
|
304
|
+
},
|
|
305
|
+
"revision": {
|
|
306
|
+
"type": ["string", "null"],
|
|
307
|
+
"description": "Immutable upstream commit/revision to pin (e.g. a HuggingFace dataset commit sha). When set, files are fetched from resolve/{revision}/ so the bytes are frozen — the integrity anchor for per-file HF sources (SMOL/WMT24++/BOUQuET) that have no single downloadable archive sha."
|
|
308
|
+
},
|
|
309
|
+
"splitSha256": {
|
|
310
|
+
"type": ["string", "null"],
|
|
311
|
+
"description": "SHA-256 of a secondary split-definition file fetched alongside the main archive (e.g. ALT's URL-{segment}.txt, which defines the ALT-Standard test split). Verified at fetch time when present."
|
|
312
|
+
},
|
|
313
|
+
"subset": {
|
|
314
|
+
"type": ["string", "null"],
|
|
315
|
+
"description": "For multi-subset sources sharing one builder (e.g. SMOL 'smolsent'/'smoldoc'): which subset this card builds. Propagated to every expanded pair's source_export so the harness fetches the right files."
|
|
316
|
+
},
|
|
317
|
+
"builder": {
|
|
318
|
+
"type": "string",
|
|
319
|
+
"description": "Explicit TRANSPORT override ('recipes, not adapters', 2026-07-07): corpus_fetch builder id that rebuilds this card's pairs (e.g. 'lineparallel' → the generic line-parallel builder). When set, the family token (card_id.split('-')[1]) rides each expanded pair's source_export.family instead of deriving the builder id — so promotion, held-out-contamination forcing, and the built corpus's source_dataset tag keep keying off the family while ONE generic builder serves every recipe benchmark. Absent = legacy family-derived builder id."
|
|
320
|
+
},
|
|
321
|
+
"pairing": {
|
|
322
|
+
"type": "object",
|
|
323
|
+
"description": "Single-file pairing config for the 'lineparallel' builder (2026-07-07 extension). Absent = 'line-zip' (two line-aligned files, the default). Single-file modes fetch ONE file per pair (filePattern resolved with {src_code}/{tgt_code} only) and pair columns/fields of the same row/record, so they cannot misalign. Carried verbatim to every expanded pair's source_export so the harness rebuild pairs exactly what the pin build paired — part of the sha-pin contract.",
|
|
324
|
+
"required": ["mode"],
|
|
325
|
+
"properties": {
|
|
326
|
+
"mode": {
|
|
327
|
+
"type": "string",
|
|
328
|
+
"enum": ["line-zip", "tsv-columns", "csv-columns", "json-fields"],
|
|
329
|
+
"description": "'tsv-columns' = one tab-separated file (plain split, no quoting); 'csv-columns' = one RFC-4180 CSV (quoting, embedded newlines); 'json-fields' = one JSON file walked via recordPath. 'line-zip' is the explicit spelling of the two-file default."
|
|
330
|
+
},
|
|
331
|
+
"columns": {
|
|
332
|
+
"type": "object",
|
|
333
|
+
"description": "For tsv-columns/csv-columns: maps each side's upstream lang code (the pair's srcCode/tgtCode) to its column — a header name (string) or 0-based index (integer). E.g. NusaX {\"ind\": \"indonesian\", \"ace\": \"acehnese\", ...}; NusaTranslation maps every local-language code to 'tgt_text'.",
|
|
334
|
+
"additionalProperties": { "type": ["string", "integer"] }
|
|
335
|
+
},
|
|
336
|
+
"hasHeader": {
|
|
337
|
+
"type": "boolean",
|
|
338
|
+
"description": "For tsv-columns/csv-columns: whether row 1 is a header (default true). Headerless files must select columns by integer index."
|
|
339
|
+
},
|
|
340
|
+
"fields": {
|
|
341
|
+
"type": "object",
|
|
342
|
+
"description": "For json-fields: maps each side's upstream lang code to its record field name (e.g. BSD {\"en\": \"en_sentence\", \"ja\": \"ja_sentence\"}).",
|
|
343
|
+
"additionalProperties": { "type": "string" }
|
|
344
|
+
},
|
|
345
|
+
"recordPath": {
|
|
346
|
+
"type": "array",
|
|
347
|
+
"items": { "type": "string" },
|
|
348
|
+
"description": "For json-fields: path from the JSON root to the paired records — a list of object keys where the literal '[]' descends into each list element (e.g. BSD [\"[]\", \"conversation\", \"[]\"]). Records are flattened in file order (deterministic)."
|
|
349
|
+
}
|
|
350
|
+
},
|
|
351
|
+
"additionalProperties": false
|
|
352
|
+
}
|
|
353
|
+
},
|
|
354
|
+
"additionalProperties": false
|
|
355
|
+
},
|
|
356
|
+
|
|
357
|
+
"pairGeneration": {
|
|
358
|
+
"type": "object",
|
|
359
|
+
"description": "For multiway cards: how to expand the multi-language corpus into directional evaluation pairs at registry build time.",
|
|
360
|
+
"required": ["mode", "segment", "direction"],
|
|
361
|
+
"properties": {
|
|
362
|
+
"mode": {
|
|
363
|
+
"type": "string",
|
|
364
|
+
"enum": ["all-pairs", "explicit"],
|
|
365
|
+
"description": "'all-pairs' = generate one eval entry for every ordered (source, target) pair where source ≠ target (genuinely N-way parallel sets). 'explicit' = generate exactly the pairs listed in 'explicitPairs' (directed/curated sets like WMT24++ eng→xx, SMOL per-file directed pairs, AraBench dialect↔eng — which are NOT all-pairs and would otherwise be misrepresented)."
|
|
366
|
+
},
|
|
367
|
+
"explicitPairs": {
|
|
368
|
+
"type": "array",
|
|
369
|
+
"description": "For mode='explicit': the exact pairs to generate. Each item maps a project ISO pair to its upstream file codes (so the adapter can locate the right files) and may pin its own size.",
|
|
370
|
+
"items": {
|
|
371
|
+
"type": "object",
|
|
372
|
+
"required": ["source", "target"],
|
|
373
|
+
"properties": {
|
|
374
|
+
"source": { "type": "string", "description": "Source language — project ISO 639-3 (+ optional script/region subtag) code." },
|
|
375
|
+
"target": { "type": "string", "description": "Target language — project ISO 639-3 (+ optional script/region subtag) code." },
|
|
376
|
+
"srcCode": { "type": "string", "description": "Upstream source-side file code (e.g. SMOL 'en', WMT24++ source 'en')." },
|
|
377
|
+
"tgtCode": { "type": "string", "description": "Upstream target-side file code (e.g. WMT24++ 'fr_CA', SMOL 'af'). Disambiguates regional variants that collide on the project label." },
|
|
378
|
+
"size": { "type": "integer", "minimum": 1, "description": "Number of entries in this specific built pair (enforced at fetch time when set)." },
|
|
379
|
+
"sha256": { "type": "string", "pattern": "^[a-f0-9]{64}$", "description": "SHA-256 of the deterministically built corpus file for this pair (the hash corpus_fetch verifies). Pinned per pair from the immutable revision so the runnable-queue item carries a non-null corpus_sha256 (the sha-pin doctrine that gates the runnable lane)." },
|
|
380
|
+
"filePattern": { "type": "string", "description": "Per-pair override of download.filePattern (recipe cards): direction-specific member-path template for upstreams whose reverse direction lives under the forward pair's directory (e.g. MAFAND yor→en still reads data/text_files/en-yor/). Rides the expanded entry's source_export so fetch-time rebuilds resolve the exact members the pin build used." },
|
|
381
|
+
"srcMember": { "type": "string", "description": "Explicit source-side member path (recipe cards, two-file line-zip only): escape hatch for upstream filenames that defy any template (e.g. LoResMT-2020's 'rui2hi.test.ru' typo). Overrides filePattern for this side." },
|
|
382
|
+
"tgtMember": { "type": "string", "description": "Explicit target-side member path (recipe cards, two-file line-zip only): see srcMember." }
|
|
383
|
+
},
|
|
384
|
+
"additionalProperties": false
|
|
385
|
+
}
|
|
386
|
+
},
|
|
387
|
+
"segment": {
|
|
388
|
+
"type": "string",
|
|
389
|
+
"description": "Which data segment to use for evaluation (e.g., 'devtest', 'test'). Must match an entry in the card's 'segments' array."
|
|
390
|
+
},
|
|
391
|
+
"direction": {
|
|
392
|
+
"type": "string",
|
|
393
|
+
"enum": ["unidirectional", "bidirectional"],
|
|
394
|
+
"description": "Whether each generated pair is unidirectional (A→B only) or bidirectional."
|
|
395
|
+
},
|
|
396
|
+
"doNotTrain": {
|
|
397
|
+
"type": "boolean",
|
|
398
|
+
"description": "Applied to all generated eval entries. Must be true for benchmark corpora."
|
|
399
|
+
},
|
|
400
|
+
"sizePerPair": {
|
|
401
|
+
"type": "integer",
|
|
402
|
+
"minimum": 1,
|
|
403
|
+
"description": "Default entries per generated pair, used when 'pairSizes' has no entry for a pair. For uniformly-aligned parallel corpora this is the line count of the segment (e.g., 1012 for FLORES+ devtest); for sets whose directions vary in length, also provide 'pairSizes'."
|
|
404
|
+
},
|
|
405
|
+
"pairSizes": {
|
|
406
|
+
"type": "object",
|
|
407
|
+
"description": "For mode='all-pairs' sets whose per-direction sizes are NOT uniform (e.g. Turkic X-WMT, 300–1000 sentences/direction): maps the generated pair slug '{isoSource}-{isoTarget}' to that direction's true entry count, read from the sha-pinned upstream archive. build_registry uses it per pair, falling back to 'sizePerPair' for any pair not listed.",
|
|
408
|
+
"additionalProperties": { "type": "integer", "minimum": 1 }
|
|
409
|
+
},
|
|
410
|
+
"domain": {
|
|
411
|
+
"type": "string",
|
|
412
|
+
"enum": ["ui", "legal", "medical", "financial", "edu", "ecommerce", "marketing", "gov", "scientific", "religious", "support", "subtitles", "news", "literary", "conv", "tech", "humanitarian", "mixed"],
|
|
413
|
+
"description": "Uniform domain applied to all generated pairs. Closed taxonomy — one of the 17 content codes in shared/domain-taxonomy.json OR the composite marker 'mixed'. Use 'mixed' (with domainDistribution) when the source spans several domains — e.g. FLORES+ is Wikinews/Wikijunior/Wikivoyage, not pure news. build_registry hard-fails on bare 'mixed' (no distribution)."
|
|
414
|
+
},
|
|
415
|
+
"domainDistribution": {
|
|
416
|
+
"type": "object",
|
|
417
|
+
"description": "Breakdown of domains across all generated pairs. Keys are content domain codes (the 17 codes; never 'mixed'), values are proportions (0.0-1.0) or counts. Required whenever domain='mixed'. Propagated to every expanded pair's domain_distribution in the registry.",
|
|
418
|
+
"propertyNames": { "enum": ["ui", "legal", "medical", "financial", "edu", "ecommerce", "marketing", "gov", "scientific", "religious", "support", "subtitles", "news", "literary", "conv", "tech", "humanitarian"] },
|
|
419
|
+
"additionalProperties": { "type": "number" }
|
|
420
|
+
}
|
|
421
|
+
},
|
|
422
|
+
"additionalProperties": false
|
|
423
|
+
},
|
|
424
|
+
|
|
425
|
+
"promotedSubset": {
|
|
426
|
+
"type": "object",
|
|
427
|
+
"description": "Curated subset of a contaminated multiway card's languages PROMOTED into the runnable lane (segment=development) so a representative slice is evaluable, while the full N-way catalogue stays catalogue-only. Used for HIGH-contamination sets (e.g. FLORES+) that ride the relative-comparison-only lane — their scores compare methods on the same corpus, never as absolute quality. Expanded all-pairs over its own language list; per-pair built shas pin integrity.",
|
|
428
|
+
"required": ["languages"],
|
|
429
|
+
"additionalProperties": false,
|
|
430
|
+
"properties": {
|
|
431
|
+
"rationale": { "type": "string", "description": "Why this subset was chosen (coverage rationale)." },
|
|
432
|
+
"revision": { "type": ["string", "null"], "description": "Immutable upstream commit pinned for the promoted pairs (defaults to download.revision)." },
|
|
433
|
+
"sizePerPair": { "type": "integer", "minimum": 1, "description": "Entries per promoted pair (defaults to pairGeneration.sizePerPair)." },
|
|
434
|
+
"languages": {
|
|
435
|
+
"type": "array",
|
|
436
|
+
"minItems": 2,
|
|
437
|
+
"description": "The curated languages. Each maps a project ISO code to its exact upstream per-language file code — e.g. FLORES+ 'quy_Latn' (Ayacucho Quechua) under project ISO 'que'.",
|
|
438
|
+
"items": {
|
|
439
|
+
"type": "object",
|
|
440
|
+
"required": ["iso", "sourceCode"],
|
|
441
|
+
"additionalProperties": false,
|
|
442
|
+
"properties": {
|
|
443
|
+
"iso": { "type": "string", "description": "Project ISO 639-3 (+ optional script/region) code — the pair-id label." },
|
|
444
|
+
"sourceCode": { "type": "string", "description": "Exact upstream per-language file code (FLORES+ stem, e.g. 'quy_Latn', 'fao_Latn')." },
|
|
445
|
+
"variety": { "type": "string", "description": "Human note disambiguating the variety (e.g. 'Ayacucho Quechua (quy) — NOT Cusco quz')." }
|
|
446
|
+
}
|
|
447
|
+
}
|
|
448
|
+
},
|
|
449
|
+
"builtShas": {
|
|
450
|
+
"type": "object",
|
|
451
|
+
"description": "Per-pair SHA-256 of the deterministically built corpus (slug '{srcIso}-{tgtIso}' → sha). Pinned from the immutable revision so each runnable entry carries a non-null corpus_sha256 (sha-pin doctrine).",
|
|
452
|
+
"additionalProperties": { "type": "string", "pattern": "^[a-f0-9]{64}$" }
|
|
453
|
+
}
|
|
454
|
+
}
|
|
455
|
+
},
|
|
456
|
+
|
|
457
|
+
"secretTest": {
|
|
458
|
+
"type": ["object", "null"],
|
|
459
|
+
"description": "Secret test set — the cryptographically secured holdout portion of a Champollion-built test corpus. Encrypted at rest, decrypted only inside the air-gapped evaluation sandbox, never distributed. Steward authorization (TSS threshold signature) required for each evaluation run. See sandbox-evaluation-spec.md.",
|
|
460
|
+
"required": ["status", "size", "sha256", "createdBy"],
|
|
461
|
+
"properties": {
|
|
462
|
+
"status": {
|
|
463
|
+
"type": "string",
|
|
464
|
+
"enum": ["active", "planned", "retired"],
|
|
465
|
+
"description": "'active' = secret set exists, encrypted, and in use. 'planned' = community is creating it. 'retired' = compromised or replaced."
|
|
466
|
+
},
|
|
467
|
+
"size": {
|
|
468
|
+
"type": "integer",
|
|
469
|
+
"minimum": 1,
|
|
470
|
+
"description": "Number of entries in the secret test set."
|
|
471
|
+
},
|
|
472
|
+
"sha256": {
|
|
473
|
+
"type": "string",
|
|
474
|
+
"description": "SHA-256 hash of the secret test file. Published so anyone can verify integrity. The hash is public, the data is not."
|
|
475
|
+
},
|
|
476
|
+
"createdBy": {
|
|
477
|
+
"type": "string",
|
|
478
|
+
"enum": ["community"],
|
|
479
|
+
"description": "Secret test sets must be created by the language community. This field enforces that constraint."
|
|
480
|
+
},
|
|
481
|
+
"keyScheme": {
|
|
482
|
+
"type": ["string", "null"],
|
|
483
|
+
"description": "Cryptographic custody model for the secret test set. Documents how the encryption key is managed. e.g., 'TSS-3-of-5' (Threshold Signature Scheme, 3 of 5 stewards needed), 'Shamir-2-of-3'. Null if key custody not yet established."
|
|
484
|
+
},
|
|
485
|
+
"serverEndpoint": {
|
|
486
|
+
"type": ["string", "null"],
|
|
487
|
+
"format": "uri",
|
|
488
|
+
"description": "URL of the sandbox evaluation VPS endpoint. Null until sandbox infrastructure is deployed."
|
|
489
|
+
},
|
|
490
|
+
"lastVerified": {
|
|
491
|
+
"type": ["string", "null"],
|
|
492
|
+
"format": "date",
|
|
493
|
+
"description": "Date the secret test set integrity was last verified (ISO 8601)."
|
|
494
|
+
}
|
|
495
|
+
},
|
|
496
|
+
"additionalProperties": false
|
|
497
|
+
},
|
|
498
|
+
|
|
499
|
+
"stewardship": {
|
|
500
|
+
"type": ["object", "null"],
|
|
501
|
+
"description": "Community stewardship model for prize evaluation sets. Stewards are chosen by the language community and authorize evaluation runs via TSS push-button approval. Only required when secretTest.status is 'active'.",
|
|
502
|
+
"properties": {
|
|
503
|
+
"stewards": {
|
|
504
|
+
"type": "array",
|
|
505
|
+
"description": "List of authorized stewards. Minimum 5 for prize evaluation sets with active secret test splits.",
|
|
506
|
+
"items": {
|
|
507
|
+
"type": "object",
|
|
508
|
+
"required": ["name", "role"],
|
|
509
|
+
"properties": {
|
|
510
|
+
"name": { "type": "string", "description": "Steward name or organizational title." },
|
|
511
|
+
"role": { "type": "string", "enum": ["primary", "secondary"], "description": "Primary stewards initiate reviews. Secondary stewards authorize." },
|
|
512
|
+
"publicKey": {
|
|
513
|
+
"type": ["string", "null"],
|
|
514
|
+
"description": "Steward's public key for TSS threshold signature. Used to verify steward identity during MPC authorization. Null until key generation ceremony is performed."
|
|
515
|
+
}
|
|
516
|
+
},
|
|
517
|
+
"additionalProperties": false
|
|
518
|
+
}
|
|
519
|
+
},
|
|
520
|
+
"threshold": {
|
|
521
|
+
"type": "string",
|
|
522
|
+
"description": "Multi-signature threshold (e.g., '3 of 5'). Number of steward approvals needed to authorize a secret test evaluation run."
|
|
523
|
+
},
|
|
524
|
+
"authorizationModel": {
|
|
525
|
+
"type": "string",
|
|
526
|
+
"enum": ["per-submission", "blanket", "open"],
|
|
527
|
+
"description": "Consent model for evaluation runs. 'per-submission' = each method needs fresh steward approval (default for prize sets). 'blanket' = pre-authorized for all submissions meeting criteria. 'open' = no authorization gate."
|
|
528
|
+
},
|
|
529
|
+
"notes": {
|
|
530
|
+
"type": ["string", "null"],
|
|
531
|
+
"description": "Additional governance notes."
|
|
532
|
+
}
|
|
533
|
+
},
|
|
534
|
+
"additionalProperties": false
|
|
535
|
+
},
|
|
536
|
+
|
|
537
|
+
"submission": {
|
|
538
|
+
"type": ["object", "null"],
|
|
539
|
+
"description": "Terms for submitting a method for prize evaluation. Defines what transfers to the governance org, what the researcher retains, and what methods are admissible. The core OCAP deal: you want the prize, you transfer the complete self-hostable method to the language trust. See method-submission-agreement.md.",
|
|
540
|
+
"properties": {
|
|
541
|
+
"acceptanceThreshold": {
|
|
542
|
+
"type": ["string", "null"],
|
|
543
|
+
"description": "Score or criteria that triggers transfer and community review. Defined by each community's governance body. Null if not yet defined."
|
|
544
|
+
},
|
|
545
|
+
"transfer": {
|
|
546
|
+
"type": ["object", "null"],
|
|
547
|
+
"description": "What transfers to the governance org upon acceptance. Each field is a scoped right. Maps to OCAP Ownership and Possession.",
|
|
548
|
+
"properties": {
|
|
549
|
+
"sourceCode": {
|
|
550
|
+
"type": "boolean",
|
|
551
|
+
"description": "Source code ownership transfers to governance org. The community can inspect, modify, and deploy the code."
|
|
552
|
+
},
|
|
553
|
+
"modelWeights": {
|
|
554
|
+
"type": "boolean",
|
|
555
|
+
"description": "Trained model weights transfer to governance org. The community possesses the actual model files."
|
|
556
|
+
},
|
|
557
|
+
"deploymentRights": {
|
|
558
|
+
"type": "boolean",
|
|
559
|
+
"description": "Exclusive deployment rights transfer to governance org. The community controls where and how the method is deployed."
|
|
560
|
+
},
|
|
561
|
+
"revenueModel": {
|
|
562
|
+
"type": ["string", "null"],
|
|
563
|
+
"description": "Community-set terms for any commercial deployment, held by the community's governance org (e.g., 'commercial use by written permission only'). Null if not yet defined. Maps to CARE Collective Benefit. Champollion is non-commercial and takes no share of any kind."
|
|
564
|
+
}
|
|
565
|
+
},
|
|
566
|
+
"additionalProperties": false
|
|
567
|
+
},
|
|
568
|
+
"retained": {
|
|
569
|
+
"type": ["object", "null"],
|
|
570
|
+
"description": "What the researcher explicitly retains after transfer. The deal: you give up the artifact, you keep your ideas.",
|
|
571
|
+
"properties": {
|
|
572
|
+
"publicationRights": {
|
|
573
|
+
"type": "boolean",
|
|
574
|
+
"description": "Researcher retains the right to publish about the method — describe the approach, write the paper."
|
|
575
|
+
},
|
|
576
|
+
"techniqueReuse": {
|
|
577
|
+
"type": "boolean",
|
|
578
|
+
"description": "Researcher retains the right to reuse the same techniques and architectural ideas in other work."
|
|
579
|
+
},
|
|
580
|
+
"attribution": {
|
|
581
|
+
"type": "boolean",
|
|
582
|
+
"description": "Researcher retains attribution credit as the method's creator."
|
|
583
|
+
}
|
|
584
|
+
},
|
|
585
|
+
"additionalProperties": false
|
|
586
|
+
},
|
|
587
|
+
"admissibility": {
|
|
588
|
+
"type": ["object", "null"],
|
|
589
|
+
"description": "What methods are eligible for prize evaluation. The sandbox is air-gapped (no network access), so all methods must be fully self-contained. This is a technical constraint, not a policy choice — OCAP Possession requires the community to own every byte needed to run the method.",
|
|
590
|
+
"properties": {
|
|
591
|
+
"selfHostable": {
|
|
592
|
+
"type": "boolean",
|
|
593
|
+
"description": "Method must run on community infrastructure without any third-party dependencies. If the community can't run it independently, it's not admissible."
|
|
594
|
+
},
|
|
595
|
+
"inadmissible": {
|
|
596
|
+
"type": "array",
|
|
597
|
+
"items": { "type": "string" },
|
|
598
|
+
"description": "Explicitly inadmissible method types. e.g., 'coached-api-calls' (can't own the API), 'proprietary-api-wrappers' (method dies when key expires), 'external-api-dependencies' (sandbox has no network)."
|
|
599
|
+
},
|
|
600
|
+
"notes": {
|
|
601
|
+
"type": ["string", "null"],
|
|
602
|
+
"description": "Rationale for admissibility constraints. Should reference OCAP Possession and the air-gapped sandbox architecture."
|
|
603
|
+
}
|
|
604
|
+
},
|
|
605
|
+
"additionalProperties": false
|
|
606
|
+
}
|
|
607
|
+
},
|
|
608
|
+
"additionalProperties": false
|
|
609
|
+
},
|
|
610
|
+
|
|
611
|
+
"quality": {
|
|
612
|
+
"type": ["object", "null"],
|
|
613
|
+
"description": "Quality metadata. Only populate fields verifiable from primary sources (papers, documentation).",
|
|
614
|
+
"properties": {
|
|
615
|
+
"humanTranslated": {
|
|
616
|
+
"type": "boolean",
|
|
617
|
+
"description": "Are the translations produced by humans (vs. machine-generated)?"
|
|
618
|
+
},
|
|
619
|
+
"translatorQualifications": {
|
|
620
|
+
"type": ["string", "null"],
|
|
621
|
+
"description": "Who translated — qualifications, L1 status, certifications. Null if unknown."
|
|
622
|
+
},
|
|
623
|
+
"reviewProcess": {
|
|
624
|
+
"type": ["string", "null"],
|
|
625
|
+
"description": "How translations were quality-assured. Null if unknown."
|
|
626
|
+
},
|
|
627
|
+
"orthography": {
|
|
628
|
+
"type": ["string", "null"],
|
|
629
|
+
"description": "Target language orthographic standard used (e.g., 'SRO', 'syllabics'). Null if standard or not applicable."
|
|
630
|
+
}
|
|
631
|
+
},
|
|
632
|
+
"additionalProperties": false
|
|
633
|
+
},
|
|
634
|
+
|
|
635
|
+
"contamination": {
|
|
636
|
+
"type": "object",
|
|
637
|
+
"description": "Contamination risk assessment — is this data in known LLM training sets?",
|
|
638
|
+
"required": ["risk", "reasoning"],
|
|
639
|
+
"properties": {
|
|
640
|
+
"risk": {
|
|
641
|
+
"type": "string",
|
|
642
|
+
"enum": ["NONE", "LOW", "MEDIUM", "HIGH"],
|
|
643
|
+
"description": "NONE = private/unpublished. LOW = niche/recent. MEDIUM = public but not widely used. HIGH = known to be in major training sets."
|
|
644
|
+
},
|
|
645
|
+
"reasoning": {
|
|
646
|
+
"type": "string",
|
|
647
|
+
"description": "Evidence-based explanation for the risk rating. Must cite sources."
|
|
648
|
+
},
|
|
649
|
+
"knownInTrainingOf": {
|
|
650
|
+
"type": "array",
|
|
651
|
+
"items": { "type": "string" },
|
|
652
|
+
"description": "Model names known or strongly suspected to include this data. Only list when evidence exists (e.g., model paper cites this dataset)."
|
|
653
|
+
}
|
|
654
|
+
},
|
|
655
|
+
"additionalProperties": false
|
|
656
|
+
},
|
|
657
|
+
|
|
658
|
+
"doNotTrain": {
|
|
659
|
+
"type": "boolean",
|
|
660
|
+
"description": "If true, this data must not be used for training any ML model. Simple boolean for harness consumption. usageRestrictions.training adds the WHY and BY WHOM. These must be consistent: if doNotTrain is true, usageRestrictions.training must not be 'permitted'."
|
|
661
|
+
},
|
|
662
|
+
|
|
663
|
+
"aliases": {
|
|
664
|
+
"type": "array",
|
|
665
|
+
"items": { "type": "string" },
|
|
666
|
+
"description": "Alternative identifiers for dataset resolution. The harness resolver matches these in addition to the card id. Example: ['edtekla-dev', 'crk-dev'] for the card 'eval-eng-crk-edtekla-dev-v1'."
|
|
667
|
+
},
|
|
668
|
+
|
|
669
|
+
"freshBlindTestSet": {
|
|
670
|
+
"type": "boolean",
|
|
671
|
+
"description": "If true, this card is a FRESH held-out BLIND test set (e.g. WMT24/25 general) whose low contamination comes from recency, not from being a dev split. It is the ONE narrow, explicit opt-out to build_registry's fail-safe rule that any 'test'-split corpus is forced to contamination=HIGH: with this flag set, the card's own honest contamination.risk (LOW/MEDIUM) governs instead, so a fresh blind set can rank on ABSOLUTE quality. Deliberately weak — it only suppresses the test-split rule; a card whose family is in HELD_OUT_BENCHMARK_FAMILIES (e.g. the older WMT editions) is STILL forced HIGH. Must never be set on a stale/memorized test split. Defaults to false."
|
|
672
|
+
},
|
|
673
|
+
"quarantine": {
|
|
674
|
+
"type": "boolean",
|
|
675
|
+
"description": "If true, this corpus is catalogued but explicitly NOT runnable/rankable — it is excluded from the public queue and the leaderboard. Use for corpora whose fetch builder is not yet implemented, or improper subsets that must never rank. build_registry reports quarantined cards loudly rather than silently dropping them. Pair with quarantineReason."
|
|
676
|
+
},
|
|
677
|
+
"quarantineReason": {
|
|
678
|
+
"type": "string",
|
|
679
|
+
"description": "Human-readable reason a card is quarantined (e.g. 'gamayun-parallel builder not yet implemented'). Required whenever quarantine is true so the exclusion is never unexplained."
|
|
680
|
+
},
|
|
681
|
+
"transmissionPolicy": {
|
|
682
|
+
"type": "string",
|
|
683
|
+
"enum": ["no-train", "consent-required"],
|
|
684
|
+
"description": "Explicit data-side transmission mode for this corpus (docs/DATA_BOUNDARIES.md §'Transmission to model APIs'). Absent = license-string default: redistribution-cleared → unrestricted; plain standard SPDX NC/ND → 'no-train' (remote eval only over channels that do not retain/train on inputs); any LicenseRef/modified/bespoke/unstated grant → 'consent-required' (remote eval refuses until the rights-holder's permission is recorded). Set this only with a recorded rationale in the card notes — e.g. flipping a LicenseRef research-use license to 'no-train' because its license text itself grants evaluation use."
|
|
685
|
+
},
|
|
686
|
+
"transmissionConsent": {
|
|
687
|
+
"type": "object",
|
|
688
|
+
"description": "The rights-holder's EXPLICIT permission for remote model-API evaluation of this corpus. Recording this is a founder/steward action — never inferred, never assumed from 'academic use'. Its presence downgrades 'consent-required' to 'no-train' (channel discipline still applies; it never clears a corpus entirely).",
|
|
689
|
+
"required": ["granted_by", "date"],
|
|
690
|
+
"properties": {
|
|
691
|
+
"granted_by": {
|
|
692
|
+
"type": "string",
|
|
693
|
+
"description": "Who granted the permission (person/organization, as they identified themselves)."
|
|
694
|
+
},
|
|
695
|
+
"date": {
|
|
696
|
+
"type": "string",
|
|
697
|
+
"description": "Date the permission was granted (YYYY-MM-DD)."
|
|
698
|
+
},
|
|
699
|
+
"scope": {
|
|
700
|
+
"type": "string",
|
|
701
|
+
"description": "What exactly was permitted (e.g. 'non-commercial benchmark evaluation via no-train channels')."
|
|
702
|
+
},
|
|
703
|
+
"evidence": {
|
|
704
|
+
"type": "string",
|
|
705
|
+
"description": "Pointer to the record of the grant (email/doc path). Never paste the correspondence itself into the card."
|
|
706
|
+
}
|
|
707
|
+
}
|
|
708
|
+
},
|
|
709
|
+
|
|
710
|
+
"exposureTier": {
|
|
711
|
+
"type": "string",
|
|
712
|
+
"enum": ["local-only", "private", "public", "sealed"],
|
|
713
|
+
"description": "Exposure tier chosen by the corpus author at registration (champollion register-corpus). Records the author's intent about how far this corpus travels. 'local-only' = never registered or uploaded — the card and the text stay entirely on the author's machine (cards with this value live OUTSIDE this tracked directory). 'private' = a sovereign / WMT-style held-out set: metadata is registered here but the text is NEVER uploaded or hosted; the author keeps custody (paired with quarantine=true so it is catalogued but not publicly runnable). 'public' = a fetch-from-source pointer + metadata card is published; the text is NEVER hosted by Champollion — it is fetched from source.repo_url on demand by the declared builder. 'sealed' = a community-controlled secret test set encrypted CLIENT-SIDE under the custodian group's threshold key before anything leaves the author's device; Champollion holds only ciphertext (in an off-git store) + a content-free card and cannot decrypt it (no single party can — M-of-N custodian approval is required). Paired with quarantine=true and a 'sealed' block; see the sealed property and docs/governance/OCAP_MULTISIG_PLAN.md. Public is gated by cli/lib/license-gate.mjs: NC / no-redistribute / unconfirmed-license sets may not use the public tier. Champollion never hosts corpus PLAINTEXT in ANY tier. Defaults to the most private tier (local-only) when unspecified.",
|
|
714
|
+
"default": "local-only"
|
|
715
|
+
},
|
|
716
|
+
|
|
717
|
+
"sealed": {
|
|
718
|
+
"type": ["object", "null"],
|
|
719
|
+
"description": "Sealed-tier crypto metadata (exposureTier='sealed'). CONTENT-FREE: records how a community-controlled secret test set was encrypted client-side, never the plaintext. The ciphertext lives in an off-git, off-allowlist store; this block only names the cipher suite, the custodian group, the ciphertext digest, and the AAD binding, plus the paired public qualifier a method must clear before a sealed run can be proposed. The decryption key exists only as M-of-N custodian shares — Champollion cannot decrypt. See cli/lib/seal.mjs and docs/governance/OCAP_MULTISIG_PLAN.md (M1).",
|
|
720
|
+
"required": ["cipher", "custodianGroupId", "ciphertextDigest", "aad"],
|
|
721
|
+
"properties": {
|
|
722
|
+
"cipher": {
|
|
723
|
+
"type": "string",
|
|
724
|
+
"description": "Cipher suite id of the sealed artifact (e.g. 'x25519-hkdf-sha256+aes-256-gcm'). The hybrid sealed-box scheme used by cli/lib/seal.mjs."
|
|
725
|
+
},
|
|
726
|
+
"custodianGroupId": {
|
|
727
|
+
"type": "string",
|
|
728
|
+
"description": "Id of the community custodian group whose threshold key controls this set. The group that must reach M-of-N approval to authorize a decryption grant."
|
|
729
|
+
},
|
|
730
|
+
"ciphertextDigest": {
|
|
731
|
+
"type": "string",
|
|
732
|
+
"pattern": "^[a-f0-9]{64}$",
|
|
733
|
+
"description": "SHA-256 (hex) of the ciphertext bytes. Published so integrity of the off-git sealed artifact is verifiable; the digest is public, the plaintext is not."
|
|
734
|
+
},
|
|
735
|
+
"aad": {
|
|
736
|
+
"type": "string",
|
|
737
|
+
"description": "Additional Authenticated Data string binding the ciphertext to this card + custodian group (e.g. 'champollion-sealed:v1|card=…|group=…'). Authenticated by the GCM tag so the ciphertext cannot be transplanted to another card. Metadata only — never corpus content."
|
|
738
|
+
},
|
|
739
|
+
"thresholdKeyId": {
|
|
740
|
+
"type": ["string", "null"],
|
|
741
|
+
"description": "Stable short id (sha256 prefix) of the custodian group's threshold PUBLIC key the corpus was sealed to. Names which group key was used without embedding the key."
|
|
742
|
+
},
|
|
743
|
+
"keyScheme": {
|
|
744
|
+
"type": ["string", "null"],
|
|
745
|
+
"description": "Custody scheme for the threshold key, e.g. 'TSS-3-of-5'. In Wave 1 a single stand-in threshold key is used; Wave 2 replaces it with the aggregated 3-of-5 FROST group key from the custodian ceremony."
|
|
746
|
+
},
|
|
747
|
+
"qualifierId": {
|
|
748
|
+
"type": ["string", "null"],
|
|
749
|
+
"description": "Card id of the paired PUBLIC qualifier (a disjoint CC-BY/CC0 twin, vYYYY-rotated) that a method must clear before a sealed run can be proposed. See cli/lib/sealed-qualifier.mjs."
|
|
750
|
+
},
|
|
751
|
+
"qualifierThreshold": {
|
|
752
|
+
"type": ["number", "null"],
|
|
753
|
+
"description": "Score a method must reach on the paired qualifier to become eligible to propose a sealed run."
|
|
754
|
+
},
|
|
755
|
+
"artifactRef": {
|
|
756
|
+
"type": ["string", "null"],
|
|
757
|
+
"description": "Pointer/name of the ciphertext artifact in the off-git encrypted store. Content-free; never a hosted-plaintext path."
|
|
758
|
+
}
|
|
759
|
+
},
|
|
760
|
+
"additionalProperties": false
|
|
761
|
+
},
|
|
762
|
+
|
|
763
|
+
"richness": {
|
|
764
|
+
"type": "object",
|
|
765
|
+
"description": "Measured corpus complexity metrics computed at build time. Used for queue prioritization and corpus profiling.",
|
|
766
|
+
"properties": {
|
|
767
|
+
"mean_source_chars": { "type": "number", "description": "Mean character count of source-language entries." },
|
|
768
|
+
"mean_effective_words": { "type": "number", "description": "Mean effective word count of source-language entries." },
|
|
769
|
+
"economy": { "type": "number", "description": "Characters per effective word — higher values indicate morphologically richer or agglutinative source text." },
|
|
770
|
+
"economy_basis": { "type": "string", "enum": ["measured", "estimated"], "description": "Whether economy was measured from the corpus or estimated from language typology." },
|
|
771
|
+
"computed_from": { "type": "string", "description": "Filename of the data file this was computed from." },
|
|
772
|
+
"computed_at": { "type": "string", "format": "date", "description": "Date the metrics were computed." }
|
|
773
|
+
},
|
|
774
|
+
"additionalProperties": false
|
|
775
|
+
},
|
|
776
|
+
|
|
777
|
+
"sovereignty": {
|
|
778
|
+
"type": ["object", "null"],
|
|
779
|
+
"description": "Governance structures that actually exist for this data. Records facts, not aspirations. Null means no formal governance structures are in place. Fields are forward-looking infrastructure — ready for when governance bodies are identified and communities assert their terms. See DATA-SOVEREIGNTY.md for field reference and standards mapping.",
|
|
780
|
+
"properties": {
|
|
781
|
+
"frameworks": {
|
|
782
|
+
"type": "array",
|
|
783
|
+
"items": {
|
|
784
|
+
"type": "string",
|
|
785
|
+
"enum": ["OCAP", "CARE", "Te-Mana-Raraunga", "FAIR", "IEEE-2890"]
|
|
786
|
+
},
|
|
787
|
+
"description": "Data sovereignty frameworks that the data creators or governing body have explicitly invoked. Only list frameworks where there is documented evidence of adoption — do not infer from language vitality, geography, or ethnicity."
|
|
788
|
+
},
|
|
789
|
+
"governanceOrg": {
|
|
790
|
+
"type": ["string", "null"],
|
|
791
|
+
"description": "Organization or body with governance authority over this data. For Indigenous-governed corpora this is the language trust, tribal council, or delegated body. Null if no governance body has been identified or established."
|
|
792
|
+
},
|
|
793
|
+
"custodian": {
|
|
794
|
+
"type": ["string", "null"],
|
|
795
|
+
"description": "Who physically holds the data. Distinct from governanceOrg — a university may be custodian while a community is the governance authority. Null if custodian is the same as source.publisher."
|
|
796
|
+
},
|
|
797
|
+
"consentModel": {
|
|
798
|
+
"type": ["string", "null"],
|
|
799
|
+
"enum": ["per-submission", "blanket", "open-access", null],
|
|
800
|
+
"description": "How consent is structured for use of this data in method evaluation. 'per-submission' = each evaluation run needs fresh approval (maps to stewardship.authorizationModel). 'blanket' = pre-authorized for all qualifying submissions. 'open-access' = freely usable under license terms. Null if no consent model has been established."
|
|
801
|
+
},
|
|
802
|
+
"tkLabels": {
|
|
803
|
+
"type": "array",
|
|
804
|
+
"items": {
|
|
805
|
+
"type": "object",
|
|
806
|
+
"required": ["labelType"],
|
|
807
|
+
"properties": {
|
|
808
|
+
"labelType": {
|
|
809
|
+
"type": "string",
|
|
810
|
+
"description": "Local Contexts TK or BC Label code (e.g., 'TK-A' for Attribution, 'TK-NC' for Non-Commercial, 'BC-P' for Provenance). Only populated if the community has actually applied labels via the Local Contexts Hub."
|
|
811
|
+
},
|
|
812
|
+
"projectId": {
|
|
813
|
+
"type": ["string", "null"],
|
|
814
|
+
"description": "Local Contexts Hub project ID. Enables dynamic label updates by communities without touching our metadata. Null if labels are referenced but not registered on the Hub."
|
|
815
|
+
},
|
|
816
|
+
"url": {
|
|
817
|
+
"type": ["string", "null"],
|
|
818
|
+
"format": "uri",
|
|
819
|
+
"description": "URL to the label on the Local Contexts Hub."
|
|
820
|
+
}
|
|
821
|
+
},
|
|
822
|
+
"additionalProperties": false
|
|
823
|
+
},
|
|
824
|
+
"description": "Local Contexts Traditional Knowledge or Biocultural Labels applied by the data's governing community. Empty array means no labels have been applied. These are community-asserted, never platform-assigned."
|
|
825
|
+
},
|
|
826
|
+
"notes": {
|
|
827
|
+
"type": ["string", "null"],
|
|
828
|
+
"description": "Free-text governance context that structured fields can't capture. Document nuance here rather than forcing it into enums. e.g., 'Governance body identification in progress with advisory guidance from Matthew Wildcat.'"
|
|
829
|
+
}
|
|
830
|
+
},
|
|
831
|
+
"additionalProperties": false
|
|
832
|
+
},
|
|
833
|
+
|
|
834
|
+
"usageRestrictions": {
|
|
835
|
+
"type": ["object", "null"],
|
|
836
|
+
"description": "Usage guidance beyond what the license field captures. Records community assertions, concerns, and context that users should know about. The license field records legal facts. usageRestrictions records what communities have said — even when it differs from or supplements the license. We inform users, we don't prohibit. See DATA-SOVEREIGNTY.md for the three-source model (license / community / who decided).",
|
|
837
|
+
"required": ["training"],
|
|
838
|
+
"properties": {
|
|
839
|
+
"training": {
|
|
840
|
+
"type": "string",
|
|
841
|
+
"enum": ["prohibited-by-license", "prohibited-by-community", "discouraged", "permitted"],
|
|
842
|
+
"description": "Whether this data may be used for ML model training. The enum value identifies WHO imposed the restriction — the license terms (legal fact), a community governance decision (assertion), or no one (permitted). 'discouraged' = not prohibited but the data custodians prefer it not be used for training."
|
|
843
|
+
},
|
|
844
|
+
"commercialUse": {
|
|
845
|
+
"type": ["string", "null"],
|
|
846
|
+
"enum": ["prohibited-by-license", "prohibited-by-community", "requires-agreement", "permitted", null],
|
|
847
|
+
"description": "Commercial use restrictions. Identifies source of restriction. Null = defer to license.commercial field — no additional community guidance."
|
|
848
|
+
},
|
|
849
|
+
"redistribution": {
|
|
850
|
+
"type": ["string", "null"],
|
|
851
|
+
"enum": ["prohibited", "same-terms", "permitted", null],
|
|
852
|
+
"description": "Redistribution restrictions. Null = defer to license.redistribution field."
|
|
853
|
+
},
|
|
854
|
+
"communityNotes": {
|
|
855
|
+
"type": ["string", "null"],
|
|
856
|
+
"description": "Documented community concerns, context, or guidance that users should know about — even if the license technically permits the use. This is where legitimate community objections get surfaced. e.g., 'Plains Cree is severely endangered; data created by L1 educators for educational purposes. Community interests in language revitalization should be considered.'"
|
|
857
|
+
}
|
|
858
|
+
},
|
|
859
|
+
"additionalProperties": false
|
|
860
|
+
},
|
|
861
|
+
|
|
862
|
+
"_provenance": {
|
|
863
|
+
"type": "object",
|
|
864
|
+
"description": "Audit trail for this card's metadata. Every card must document where its field values came from.",
|
|
865
|
+
"required": ["addedAt", "populatedFrom"],
|
|
866
|
+
"properties": {
|
|
867
|
+
"addedAt": {
|
|
868
|
+
"type": "string",
|
|
869
|
+
"format": "date",
|
|
870
|
+
"description": "Date this card was created (ISO 8601)."
|
|
871
|
+
},
|
|
872
|
+
"lastUpdated": {
|
|
873
|
+
"type": ["string", "null"],
|
|
874
|
+
"format": "date",
|
|
875
|
+
"description": "Date this card was last modified."
|
|
876
|
+
},
|
|
877
|
+
"populatedFrom": {
|
|
878
|
+
"type": "string",
|
|
879
|
+
"description": "Specific documents, URLs, or data files consulted to populate this card. Be precise — 'NLLB paper §3.2' not just 'paper'."
|
|
880
|
+
},
|
|
881
|
+
"pinnedPairs": {
|
|
882
|
+
"type": "integer",
|
|
883
|
+
"minimum": 0,
|
|
884
|
+
"description": "For explicit-pair multiway cards: count of pairs whose size + sha256 were pinned from the immutable revision (pin_smol_wmt24pp_pairs.py)."
|
|
885
|
+
},
|
|
886
|
+
"droppedUnservablePairs": {
|
|
887
|
+
"type": "array",
|
|
888
|
+
"items": { "type": "string" },
|
|
889
|
+
"description": "For explicit-pair multiway cards: pairs removed because they were not servable at the pinned revision (404, file/row-label mismatch, or empty/0-byte upstream). Documented so the card stays honest about what was excluded."
|
|
890
|
+
}
|
|
891
|
+
},
|
|
892
|
+
"additionalProperties": false
|
|
893
|
+
}
|
|
894
|
+
},
|
|
895
|
+
|
|
896
|
+
"allOf": [
|
|
897
|
+
{
|
|
898
|
+
"if": { "properties": { "type": { "const": "eval" } } },
|
|
899
|
+
"then": {
|
|
900
|
+
"required": ["pair", "dev", "doNotTrain", "usageRestrictions"],
|
|
901
|
+
"properties": {
|
|
902
|
+
"pair": { "description": "Required for eval cards — specifies the source→target language pair." },
|
|
903
|
+
"dev": { "description": "Required for eval cards — describes the public development split." },
|
|
904
|
+
"doNotTrain": { "description": "Required for eval cards — must be explicitly set." },
|
|
905
|
+
"usageRestrictions": { "description": "Required for eval cards — captures community guidance beyond the license." }
|
|
906
|
+
}
|
|
907
|
+
}
|
|
908
|
+
},
|
|
909
|
+
{
|
|
910
|
+
"if": { "properties": { "type": { "const": "reference" } } },
|
|
911
|
+
"then": {
|
|
912
|
+
"required": ["languages", "download"],
|
|
913
|
+
"properties": {
|
|
914
|
+
"languages": { "description": "Required for reference cards — lists all languages covered." },
|
|
915
|
+
"download": { "description": "Required for reference cards — how to obtain the data." }
|
|
916
|
+
}
|
|
917
|
+
}
|
|
918
|
+
},
|
|
919
|
+
{
|
|
920
|
+
"if": { "properties": { "type": { "const": "multiway" } } },
|
|
921
|
+
"then": {
|
|
922
|
+
"required": ["languages", "download", "pairGeneration"],
|
|
923
|
+
"properties": {
|
|
924
|
+
"languages": { "description": "Required for multiway cards — all language codes in the parallel corpus." },
|
|
925
|
+
"download": { "description": "Required for multiway cards — how to obtain the upstream data." },
|
|
926
|
+
"pairGeneration": { "description": "Required for multiway cards — how to expand into directional eval pairs." }
|
|
927
|
+
}
|
|
928
|
+
}
|
|
929
|
+
},
|
|
930
|
+
{
|
|
931
|
+
"if": {
|
|
932
|
+
"properties": {
|
|
933
|
+
"secretTest": {
|
|
934
|
+
"type": "object",
|
|
935
|
+
"properties": { "status": { "const": "active" } },
|
|
936
|
+
"required": ["status"]
|
|
937
|
+
}
|
|
938
|
+
},
|
|
939
|
+
"required": ["secretTest"]
|
|
940
|
+
},
|
|
941
|
+
"then": {
|
|
942
|
+
"required": ["stewardship"],
|
|
943
|
+
"properties": {
|
|
944
|
+
"stewardship": {
|
|
945
|
+
"type": "object",
|
|
946
|
+
"properties": {
|
|
947
|
+
"stewards": { "type": "array", "minItems": 5 }
|
|
948
|
+
},
|
|
949
|
+
"required": ["stewards", "threshold", "authorizationModel"]
|
|
950
|
+
}
|
|
951
|
+
}
|
|
952
|
+
}
|
|
953
|
+
}
|
|
954
|
+
],
|
|
955
|
+
|
|
956
|
+
"additionalProperties": false
|
|
957
|
+
}
|