champollion 0.3.4 → 0.4.0
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/README.md +41 -26
- package/bin/cli.js +53 -5
- package/index.js +63 -2
- package/lib/api-key.js +17 -4
- package/lib/autofix.js +83 -36
- package/lib/bridge/method_bridge.py +15 -3
- package/lib/cards/reader.js +34 -0
- package/lib/cards/remote.js +15 -0
- package/lib/cards/search-names.js +178 -0
- package/lib/command-help.js +286 -85
- package/lib/commands/audit.js +10 -3
- package/lib/commands/card.js +583 -226
- package/lib/commands/doctor.js +54 -18
- package/lib/commands/help.js +37 -32
- package/lib/commands/init.js +1689 -87
- package/lib/commands/integrity.js +127 -40
- package/lib/commands/leaderboard.js +187 -67
- package/lib/commands/models.js +9 -2
- package/lib/commands/provenance.js +7 -2
- package/lib/commands/recommend.js +43 -14
- package/lib/commands/register-corpus.js +632 -125
- package/lib/commands/seal-corpus.js +1 -1
- package/lib/commands/status.js +564 -27
- package/lib/commands/submit.js +17 -12
- package/lib/commands/sync.js +31 -7
- package/lib/commands/tm.js +15 -9
- package/lib/commands/verify.js +27 -3
- package/lib/commands/wrap.js +63 -5
- package/lib/commands/xliff.js +135 -64
- package/lib/commercial-eligibility.js +1 -1
- package/lib/config.js +196 -14
- package/lib/content-estimate.js +96 -0
- package/lib/content-refusals.js +270 -0
- package/lib/content-review.js +372 -0
- package/lib/content-sync.js +1127 -344
- package/lib/content.js +94 -7
- package/lib/corpus-registration.mjs +194 -35
- package/lib/cost-label.js +29 -0
- package/lib/cost-report.js +726 -78
- package/lib/diff.js +38 -4
- package/lib/docusaurus-sync.js +965 -253
- package/lib/edit-distance.js +31 -0
- package/lib/fallback.js +964 -0
- package/lib/file-scope.js +106 -0
- package/lib/flatten.js +80 -3
- package/lib/flutter-locales.js +124 -0
- package/lib/format.js +266 -12
- package/lib/hash.js +146 -21
- package/lib/icu-structure.js +929 -0
- package/lib/integrity.js +223 -75
- package/lib/language-pair.js +157 -0
- package/lib/lint.js +78 -16
- package/lib/local-only-marks.js +106 -0
- package/lib/locale-layout.js +1103 -0
- package/lib/locale-state.js +571 -0
- package/lib/methods/anthropic.js +5 -0
- package/lib/methods/apertium.js +6 -3
- package/lib/methods/api.js +138 -25
- package/lib/methods/base.js +17 -0
- package/lib/methods/coaching-data.js +153 -0
- package/lib/methods/content-separator.js +43 -0
- package/lib/methods/deepl.js +1 -1
- package/lib/methods/direct-llm.js +252 -103
- package/lib/methods/external.js +146 -63
- package/lib/methods/gemini.js +1 -0
- package/lib/methods/google-translate.js +1 -0
- package/lib/methods/http-utils.js +41 -0
- package/lib/methods/libretranslate.js +7 -2
- package/lib/methods/llm-coached.js +68 -128
- package/lib/methods/llm.js +80 -31
- package/lib/methods/local.js +93 -10
- package/lib/methods/microsoft-translator.js +1 -2
- package/lib/methods/openai.js +4 -2
- package/lib/methods/openrouter-client.js +20 -19
- package/lib/methods/openrouter-pricing.js +150 -13
- package/lib/methods/prompt-methods.js +20 -0
- package/lib/methods/provider-pricing.js +42 -1
- package/lib/methods/request-capture.js +104 -0
- package/lib/methods/tilde.js +1 -1
- package/lib/methods/translated.js +1 -2
- package/lib/missing-key.js +93 -0
- package/lib/models.js +11 -0
- package/lib/name-rules.js +32 -0
- package/lib/named-keys.js +172 -0
- package/lib/no-translate.js +4 -3
- package/lib/output.js +160 -19
- package/lib/pairs.js +586 -30
- package/lib/placeholders.js +394 -0
- package/lib/plugins.js +8 -0
- package/lib/plural-gap-redo.js +109 -0
- package/lib/plurals.js +323 -0
- package/lib/po.js +1187 -0
- package/lib/public-catalogue.js +74 -0
- package/lib/recommend.js +527 -32
- package/lib/redo.js +95 -0
- package/lib/refusal-category.js +44 -0
- package/lib/registers.js +255 -11
- package/lib/repair-script.js +20 -13
- package/lib/scripts.js +6 -1
- package/lib/seal.mjs +4 -3
- package/lib/sealed-qualifier.mjs +1 -1
- package/lib/segment.js +2 -1
- package/lib/seo.js +19 -9
- package/lib/serve.js +43 -6
- package/lib/shared-output-seed.js +164 -0
- package/lib/source-contexts.js +39 -0
- package/lib/submit.mjs +57 -5
- package/lib/sync.js +2923 -474
- package/lib/terminology.js +13 -4
- package/lib/tm-evict.js +179 -0
- package/lib/tm-seed.js +5 -2
- package/lib/tm.js +818 -36
- package/lib/translate-pair.js +639 -34
- package/lib/translate.js +78 -5
- package/lib/types.js +22 -3
- package/lib/validate.js +880 -17
- package/lib/verify.js +1296 -104
- package/lib/watch.js +32 -13
- package/lib/xliff.js +44 -3
- package/package.json +1 -1
- package/shared/CORPORA-CARDS.md +2 -0
- package/shared/cards-fallback.json +1 -1
- package/shared/curated-orthography-conventions.json +26 -8
- package/shared/gettext-plural-forms.json +45 -0
- package/shared/method-registry.json +2 -0
- package/shared/metric-registry.json +96 -18
- package/shared/schemas/champollion-plugin.schema.json +4 -0
- package/shared/schemas/corpora-card.schema.json +8 -2
- package/shared/schemas/method-index-record.schema.json +67 -0
- package/shared/schemas/method-registry.schema.json +4 -0
- package/shared/schemas/metric-registry.schema.json +55 -1
- package/shared/docent/corpus.json +0 -11739
|
@@ -1,25 +1,43 @@
|
|
|
1
1
|
{
|
|
2
2
|
"_comment": [
|
|
3
|
-
"Curated orthographic-convention register
|
|
4
|
-
"
|
|
3
|
+
"Curated orthographic-convention register — the decision-layer input to the",
|
|
4
|
+
"orthographies[] derivation (cli/scripts/derive-orthographies.mjs). NOT WIRED:",
|
|
5
|
+
"that deriver is a standalone pass, not imported by cli/scripts/cldf/project.mjs,",
|
|
6
|
+
"so nothing here reaches a card today. An earlier version of this comment claimed",
|
|
7
|
+
"the wiring existed; it did not. Do not restore that claim before the import does.",
|
|
8
|
+
"",
|
|
9
|
+
"ONE entry per language code, keyed by ISO 15924 script code. Each script entry may set",
|
|
5
10
|
"scheme / longVowelMarking / canonicalForMt and MUST set a source string that cites a",
|
|
6
|
-
"verifiable basis
|
|
7
|
-
"Only add entries whose convention is actually documented
|
|
8
|
-
"deriver writes nothing it cannot cite (index, not
|
|
11
|
+
"verifiable basis — a source the card already carries, a published convention, or a tool",
|
|
12
|
+
"in the repo's register. Only add entries whose convention is actually documented:",
|
|
13
|
+
"absence means unknown, and the deriver writes nothing it cannot cite (index, not",
|
|
14
|
+
"arbiter). Optional keys are OMITTED when unknown, never guessed. Do NOT record measured",
|
|
15
|
+
"scores here — a score of method output is a run result and belongs on the leaderboard.",
|
|
16
|
+
"",
|
|
9
17
|
"Data-over-code (docs/AGENTS.md §1): language-specific conventions live in this file,",
|
|
10
|
-
"never hardcoded in the deriver."
|
|
18
|
+
"never hardcoded in the deriver. Decision-layer inputs to the atlas build live under the",
|
|
19
|
+
"monorepo-root shared/ (parameters.csv, card-field-disposition.json, catalogue/…); this",
|
|
20
|
+
"file moved here from cli/shared/ on 2026-09-06 for that reason — cli/shared/ is the",
|
|
21
|
+
"npm-bundled RUNTIME tree, and nothing reads this register at runtime.",
|
|
22
|
+
"",
|
|
23
|
+
"STANDING VERDICT (shared/cldf/curated-file-verdicts.json, 2026-08-06):",
|
|
24
|
+
"'CITABLE BUT NOT MACHINE-FETCHABLE — keep, with a bibliographic citation added, and",
|
|
25
|
+
"record that it is asserted from the literature rather than fetched.' Every entry below",
|
|
26
|
+
"is asserted from the literature and from tools the card already lists. None is fetched,",
|
|
27
|
+
"so none carries a pin; that is the reason this is a curated register and not a source."
|
|
11
28
|
],
|
|
29
|
+
"version": 2,
|
|
12
30
|
"conventions": {
|
|
13
31
|
"crk": {
|
|
14
32
|
"Latn": {
|
|
15
33
|
"scheme": "SRO",
|
|
16
34
|
"longVowelMarking": "circumflex",
|
|
17
35
|
"canonicalForMt": true,
|
|
18
|
-
"source": "manual-curation (SRO
|
|
36
|
+
"source": "manual-curation (asserted from the literature and from a tool the card already carries — not machine-fetched). SRO is Standard Roman Orthography for Plains Cree; it writes the seven long vowels with circumflexes (â ê î ô) against unmarked short vowels. AUTHORITY: the GiellaLT / UAlbertaALTLab lang-crk finite-state transducer, which the crk card lists under resources.fsts from the giellalt-resources source (https://github.com/giellalt/lang-crk, https://github.com/UAlbertaALTLab/lang-crk). Both analysers accept the hyphenated preverb spelling (ê-nipâyân, nikî-nipân, kâ-nipât) and return the SAME analysis plus the tag Err/Orth — the FST's own spelling-error tag — for the fused spelling, so 'correct SRO' here is the grammar machine's verdict rather than a house preference. CANONICAL-FOR-MT: crk is written in two scripts and the pipeline's working script is the Roman one (shared/catalogue/card-config.json scriptConverter.crk converts between them); the scripts[] `primary` display flag is NOT this signal. REFERENCE LEXICON, cited and never redistributed (founder ruling 2026-07-19, index-only permanently): Wolvengrey, Arok, ed. 2001. nehiyawewin: itwewina / Cree: Words. Regina: Canadian Plains Research Center."
|
|
19
37
|
},
|
|
20
38
|
"Cans": {
|
|
21
39
|
"canonicalForMt": false,
|
|
22
|
-
"source": "manual-curation (Syllabics is
|
|
40
|
+
"source": "manual-curation (asserted, not fetched). Unified Canadian Aboriginal Syllabics is an attested writing system for Plains Cree and stays on the card as an alternative — the language is written both ways and an index says so. It is NOT the pipeline's working form: shared/catalogue/card-config.json registers scriptConverter.crk precisely because syllabics is converted to and from the Roman orthography, and the lang-crk analysers cited on the Latn entry above are SRO-facing. longVowelMarking is OMITTED rather than guessed: syllabics marks vowel length by a diacritic over the syllable, which none of the schema's vocabulary terms (circumflex / macron / double-vowel / none) describes."
|
|
23
41
|
}
|
|
24
42
|
}
|
|
25
43
|
}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
{
|
|
2
|
+
"_about": "The Plural-Forms header GNU gettext's msginit writes for a new catalog, per language: its built-in table (gettext-tools plural-table.c). champollion gives a catalog it creates the same header, so the catalog's msgstr[] slots are the ones gettext and Django select at runtime. Looked up as msginit does: the full code first (pt_BR), then the language (pt). A language not listed gets no header from msginit; champollion derives one from CLDR (lib/po.js synthesizePluralForms). An existing catalog's own header is never replaced.",
|
|
3
|
+
"_source": "Probed 2026-10-03 with `msginit --no-translator --no-wrap --locale=<code>` (GNU gettext-tools 1.0, GETTEXTCLDRDIR unset) for every ISO 639-1 code and pt_BR, pt_PT, en_GB, de_AT, es_AR, fr_CA, zh_CN, zh_TW, sr_Latn; region variants not listed resolved to their language's entry.",
|
|
4
|
+
"forms": {
|
|
5
|
+
"be": "nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);",
|
|
6
|
+
"bg": "nplurals=2; plural=(n != 1);",
|
|
7
|
+
"ca": "nplurals=2; plural=(n != 1);",
|
|
8
|
+
"cs": "nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;",
|
|
9
|
+
"da": "nplurals=2; plural=(n != 1);",
|
|
10
|
+
"de": "nplurals=2; plural=(n != 1);",
|
|
11
|
+
"el": "nplurals=2; plural=(n != 1);",
|
|
12
|
+
"en": "nplurals=2; plural=(n != 1);",
|
|
13
|
+
"eo": "nplurals=2; plural=(n != 1);",
|
|
14
|
+
"es": "nplurals=2; plural=(n != 1);",
|
|
15
|
+
"et": "nplurals=2; plural=(n != 1);",
|
|
16
|
+
"fi": "nplurals=2; plural=(n != 1);",
|
|
17
|
+
"fo": "nplurals=2; plural=(n != 1);",
|
|
18
|
+
"fr": "nplurals=2; plural=(n > 1);",
|
|
19
|
+
"ga": "nplurals=3; plural=n==1 ? 0 : n==2 ? 1 : 2;",
|
|
20
|
+
"he": "nplurals=2; plural=(n != 1);",
|
|
21
|
+
"hr": "nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);",
|
|
22
|
+
"hu": "nplurals=2; plural=(n != 1);",
|
|
23
|
+
"it": "nplurals=2; plural=(n != 1);",
|
|
24
|
+
"ja": "nplurals=1; plural=0;",
|
|
25
|
+
"ko": "nplurals=1; plural=0;",
|
|
26
|
+
"lt": "nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && (n%100<10 || n%100>=20) ? 1 : 2);",
|
|
27
|
+
"lv": "nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n != 0 ? 1 : 2);",
|
|
28
|
+
"nb": "nplurals=2; plural=(n != 1);",
|
|
29
|
+
"nl": "nplurals=2; plural=(n != 1);",
|
|
30
|
+
"nn": "nplurals=2; plural=(n != 1);",
|
|
31
|
+
"no": "nplurals=2; plural=(n != 1);",
|
|
32
|
+
"pl": "nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);",
|
|
33
|
+
"pt": "nplurals=2; plural=(n != 1);",
|
|
34
|
+
"pt_BR": "nplurals=2; plural=(n > 1);",
|
|
35
|
+
"ro": "nplurals=3; plural=n==1 ? 0 : (n==0 || (n%100 > 0 && n%100 < 20)) ? 1 : 2;",
|
|
36
|
+
"ru": "nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);",
|
|
37
|
+
"sk": "nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;",
|
|
38
|
+
"sl": "nplurals=4; plural=(n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || n%100==4 ? 2 : 3);",
|
|
39
|
+
"sr": "nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);",
|
|
40
|
+
"sv": "nplurals=2; plural=(n != 1);",
|
|
41
|
+
"tr": "nplurals=2; plural=(n != 1);",
|
|
42
|
+
"uk": "nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);",
|
|
43
|
+
"vi": "nplurals=1; plural=0;"
|
|
44
|
+
}
|
|
45
|
+
}
|
|
@@ -65,6 +65,7 @@
|
|
|
65
65
|
"OPENAI_API_KEY"
|
|
66
66
|
],
|
|
67
67
|
"default_base_url": "http://localhost:11434/v1",
|
|
68
|
+
"keyless": true,
|
|
68
69
|
"homepage": "https://github.com/ollama/ollama",
|
|
69
70
|
"license": "Varies (self-hosted / OpenAI-compatible gateway)",
|
|
70
71
|
"commercialReady": false,
|
|
@@ -147,6 +148,7 @@
|
|
|
147
148
|
"APERTIUM_API_KEY"
|
|
148
149
|
],
|
|
149
150
|
"default_base_url": "https://apertium.org/apy",
|
|
151
|
+
"keyless": true,
|
|
150
152
|
"homepage": "https://www.apertium.org",
|
|
151
153
|
"license": "GPL-3.0+ (Apertium)",
|
|
152
154
|
"commercialReady": false,
|
|
@@ -14,7 +14,15 @@
|
|
|
14
14
|
"level": "both",
|
|
15
15
|
"in_composite": true,
|
|
16
16
|
"verifier_reproducible": true,
|
|
17
|
-
"notes": "Harness core (tester.py), no plugin. Binary predicted == reference; corpus rate = matches/total."
|
|
17
|
+
"notes": "Harness core (tester.py), no plugin. Binary predicted == reference; corpus rate = matches/total.",
|
|
18
|
+
"ranking": {
|
|
19
|
+
"rounding": 4,
|
|
20
|
+
"ci_columns": null,
|
|
21
|
+
"segment_level": false,
|
|
22
|
+
"signature": {
|
|
23
|
+
"kind": "harness"
|
|
24
|
+
}
|
|
25
|
+
}
|
|
18
26
|
},
|
|
19
27
|
"equivalent_match_rate": {
|
|
20
28
|
"category": "surface",
|
|
@@ -42,7 +50,19 @@
|
|
|
42
50
|
"level": "both",
|
|
43
51
|
"in_composite": true,
|
|
44
52
|
"verifier_reproducible": true,
|
|
45
|
-
"notes": "sacrebleu (word_order=2), harness core. Normalized /100 for the composite (scoring.NORMALIZATIONS)."
|
|
53
|
+
"notes": "sacrebleu (word_order=2), harness core. Normalized /100 for the composite (scoring.NORMALIZATIONS).",
|
|
54
|
+
"ranking": {
|
|
55
|
+
"rounding": 2,
|
|
56
|
+
"ci_columns": [
|
|
57
|
+
"chrf_ci_lower",
|
|
58
|
+
"chrf_ci_upper"
|
|
59
|
+
],
|
|
60
|
+
"segment_level": true,
|
|
61
|
+
"signature": {
|
|
62
|
+
"kind": "sacrebleu",
|
|
63
|
+
"key": "chrf"
|
|
64
|
+
}
|
|
65
|
+
}
|
|
46
66
|
},
|
|
47
67
|
"bleu": {
|
|
48
68
|
"category": "surface",
|
|
@@ -56,7 +76,16 @@
|
|
|
56
76
|
"level": "corpus",
|
|
57
77
|
"in_composite": false,
|
|
58
78
|
"verifier_reproducible": true,
|
|
59
|
-
"notes": "sacrebleu, harness core. Reported for MT-literature compatibility, never composited. Run-card key is top-level 'corpus_bleu' (not scores.bleu) — see
|
|
79
|
+
"notes": "sacrebleu, harness core. Reported for MT-literature compatibility, never composited. Run-card key is top-level 'corpus_bleu' (not scores.bleu) — see _rename_decisions.",
|
|
80
|
+
"ranking": {
|
|
81
|
+
"rounding": 2,
|
|
82
|
+
"ci_columns": null,
|
|
83
|
+
"segment_level": true,
|
|
84
|
+
"signature": {
|
|
85
|
+
"kind": "sacrebleu",
|
|
86
|
+
"key": "bleu"
|
|
87
|
+
}
|
|
88
|
+
}
|
|
60
89
|
},
|
|
61
90
|
"ter": {
|
|
62
91
|
"category": "surface",
|
|
@@ -70,7 +99,16 @@
|
|
|
70
99
|
"level": "both",
|
|
71
100
|
"in_composite": false,
|
|
72
101
|
"verifier_reproducible": true,
|
|
73
|
-
"notes": "sacrebleu corpus_ter. Excluded from composite (correlates with chrF++)."
|
|
102
|
+
"notes": "sacrebleu corpus_ter. Excluded from composite (correlates with chrF++).",
|
|
103
|
+
"ranking": {
|
|
104
|
+
"rounding": 2,
|
|
105
|
+
"ci_columns": null,
|
|
106
|
+
"segment_level": false,
|
|
107
|
+
"signature": {
|
|
108
|
+
"kind": "sacrebleu",
|
|
109
|
+
"key": "ter"
|
|
110
|
+
}
|
|
111
|
+
}
|
|
74
112
|
},
|
|
75
113
|
"length_ratio": {
|
|
76
114
|
"category": "surface",
|
|
@@ -196,7 +234,16 @@
|
|
|
196
234
|
"level": "both",
|
|
197
235
|
"in_composite": false,
|
|
198
236
|
"verifier_reproducible": true,
|
|
199
|
-
"notes": "Harness core (metrics_comet.py); model auto-selected via the card's metricModelSupport. NEURAL — reported in the separate lane, never composited; verifier re-derives fail-closed (recompute_corpus_comet)."
|
|
237
|
+
"notes": "Harness core (metrics_comet.py); model auto-selected via the card's metricModelSupport. NEURAL — reported in the separate lane, never composited; verifier re-derives fail-closed (recompute_corpus_comet).",
|
|
238
|
+
"ranking": {
|
|
239
|
+
"rounding": 4,
|
|
240
|
+
"ci_columns": null,
|
|
241
|
+
"segment_level": false,
|
|
242
|
+
"signature": {
|
|
243
|
+
"kind": "model",
|
|
244
|
+
"key": "comet_model"
|
|
245
|
+
}
|
|
246
|
+
}
|
|
200
247
|
},
|
|
201
248
|
"qe_score": {
|
|
202
249
|
"category": "neural",
|
|
@@ -284,7 +331,7 @@
|
|
|
284
331
|
},
|
|
285
332
|
"compliance_index": {
|
|
286
333
|
"category": "compliance",
|
|
287
|
-
"status": "
|
|
334
|
+
"status": "planned",
|
|
288
335
|
"display_name": "Double-Pass Compliance",
|
|
289
336
|
"plugin_name": "double_pass_compliance",
|
|
290
337
|
"card_key": null,
|
|
@@ -294,11 +341,11 @@
|
|
|
294
341
|
"level": "both",
|
|
295
342
|
"in_composite": false,
|
|
296
343
|
"verifier_reproducible": true,
|
|
297
|
-
"notes": "DoublePassCompliancePlugin. Quality GATE (placeholder/quote/casing integrity), not a quality score;
|
|
344
|
+
"notes": "DoublePassCompliancePlugin. Quality GATE (placeholder/quote/casing integrity), not a quality score; no run_cards column. Planned, not implemented: no run path constructs the plugin (it needs a card with a `rules` field, which the atlas cutover dropped from every card as uncited script-family templates, and no atlas parameter carries quote or letter-case conventions). Passed a card without `rules`, only the 60% variable-integrity term measures anything; quote and casing score a constant 1.0."
|
|
298
345
|
},
|
|
299
346
|
"repair_effectiveness": {
|
|
300
347
|
"category": "compliance",
|
|
301
|
-
"status": "
|
|
348
|
+
"status": "planned",
|
|
302
349
|
"display_name": "Repair Effectiveness",
|
|
303
350
|
"plugin_name": "double_pass_compliance",
|
|
304
351
|
"card_key": null,
|
|
@@ -308,7 +355,7 @@
|
|
|
308
355
|
"level": "corpus",
|
|
309
356
|
"in_composite": false,
|
|
310
357
|
"verifier_reproducible": true,
|
|
311
|
-
"notes": "Fraction of compliance violations auto-repaired by post-translation hooks; same plugin as compliance_index."
|
|
358
|
+
"notes": "Fraction of compliance violations auto-repaired by post-translation hooks; same plugin as compliance_index, and planned for the same reason: no run path constructs it."
|
|
312
359
|
},
|
|
313
360
|
"spbleu": {
|
|
314
361
|
"category": "comparator",
|
|
@@ -322,7 +369,16 @@
|
|
|
322
369
|
"level": "corpus",
|
|
323
370
|
"in_composite": false,
|
|
324
371
|
"verifier_reproducible": true,
|
|
325
|
-
"notes": "Comparability sidecar (FLORES/NLLB lingua-franca tokenizer). JSONB only."
|
|
372
|
+
"notes": "Comparability sidecar (FLORES/NLLB lingua-franca tokenizer). JSONB only.",
|
|
373
|
+
"ranking": {
|
|
374
|
+
"rounding": 2,
|
|
375
|
+
"ci_columns": null,
|
|
376
|
+
"segment_level": false,
|
|
377
|
+
"signature": {
|
|
378
|
+
"kind": "sacrebleu",
|
|
379
|
+
"key": "spbleu"
|
|
380
|
+
}
|
|
381
|
+
}
|
|
326
382
|
},
|
|
327
383
|
"chrf_plain": {
|
|
328
384
|
"category": "comparator",
|
|
@@ -336,7 +392,16 @@
|
|
|
336
392
|
"level": "corpus",
|
|
337
393
|
"in_composite": false,
|
|
338
394
|
"verifier_reproducible": true,
|
|
339
|
-
"notes": "The chrF figure FLORES/WMT tables report. JSONB only."
|
|
395
|
+
"notes": "The chrF figure FLORES/WMT tables report. JSONB only.",
|
|
396
|
+
"ranking": {
|
|
397
|
+
"rounding": 2,
|
|
398
|
+
"ci_columns": null,
|
|
399
|
+
"segment_level": true,
|
|
400
|
+
"signature": {
|
|
401
|
+
"kind": "sacrebleu",
|
|
402
|
+
"key": "chrf_plain"
|
|
403
|
+
}
|
|
404
|
+
}
|
|
340
405
|
},
|
|
341
406
|
"fuse_score": {
|
|
342
407
|
"category": "comparator",
|
|
@@ -383,7 +448,7 @@
|
|
|
383
448
|
"composite": {
|
|
384
449
|
"category": "composite",
|
|
385
450
|
"status": "implemented",
|
|
386
|
-
"display_name": "
|
|
451
|
+
"display_name": "Legacy composite (retired)",
|
|
387
452
|
"plugin_name": null,
|
|
388
453
|
"card_key": null,
|
|
389
454
|
"db_column": "composite_score",
|
|
@@ -392,12 +457,24 @@
|
|
|
392
457
|
"level": "corpus",
|
|
393
458
|
"in_composite": false,
|
|
394
459
|
"verifier_reproducible": true,
|
|
395
|
-
"notes": "
|
|
460
|
+
"notes": "RETIRED by scoring standard/1 (2026-10-04): no new run is scored, ranked or labelled with it — new run cards publish composite = null. Runs are ranked by corpus chrF++ with its 95% bootstrap CI; BLEU, spBLEU, TER and COMET are shown beside it, never blended. A card published before the standard keeps its stored composite, re-derivable by scoring.compute_composite_score from the profile weight tables (scoring spec §4.3) and shown only as 'legacy composite (retired)'. It was a convenience sort key, never a validated quality measurement: an untrained model repeating one valid sentence for every input scored 0.6244 ('functional') at chrF++ 5.5.",
|
|
461
|
+
"ranking": {
|
|
462
|
+
"rounding": 4,
|
|
463
|
+
"ci_columns": [
|
|
464
|
+
"composite_ci_lower",
|
|
465
|
+
"composite_ci_upper"
|
|
466
|
+
],
|
|
467
|
+
"segment_level": false,
|
|
468
|
+
"signature": {
|
|
469
|
+
"kind": "harness"
|
|
470
|
+
},
|
|
471
|
+
"retired": "scoring standard/1 (2026-10-04) retired the weighted composite: a NEW contest ranks on corpus chrF++ (the default) or another standard metric. A contest that already recorded primary_metric=composite still ranks on it, labelled legacy composite (retired)."
|
|
472
|
+
}
|
|
396
473
|
},
|
|
397
474
|
"cost_adjusted": {
|
|
398
475
|
"category": "composite",
|
|
399
476
|
"status": "implemented",
|
|
400
|
-
"display_name": "
|
|
477
|
+
"display_name": "Legacy cost-adjusted composite (retired)",
|
|
401
478
|
"plugin_name": null,
|
|
402
479
|
"card_key": null,
|
|
403
480
|
"db_column": null,
|
|
@@ -406,12 +483,12 @@
|
|
|
406
483
|
"level": "corpus",
|
|
407
484
|
"in_composite": false,
|
|
408
485
|
"verifier_reproducible": true,
|
|
409
|
-
"notes": "scoring.cost_adjusted_score (composite / log2(1 + cost*1000), penalty-only). JSONB only."
|
|
486
|
+
"notes": "RETIRED with the composite by scoring standard/1 (2026-10-04): new run cards publish cost_adjusted = null. Legacy cards: scoring.cost_adjusted_score (composite / log2(1 + cost*1000), penalty-only). JSONB only."
|
|
410
487
|
},
|
|
411
488
|
"quality_tier": {
|
|
412
489
|
"category": "composite",
|
|
413
490
|
"status": "implemented",
|
|
414
|
-
"display_name": "
|
|
491
|
+
"display_name": "Legacy quality tier (retired)",
|
|
415
492
|
"plugin_name": null,
|
|
416
493
|
"card_key": null,
|
|
417
494
|
"db_column": "quality_tier",
|
|
@@ -420,7 +497,7 @@
|
|
|
420
497
|
"level": "corpus",
|
|
421
498
|
"in_composite": false,
|
|
422
499
|
"verifier_reproducible": true,
|
|
423
|
-
"notes": "
|
|
500
|
+
"notes": "RETIRED by scoring standard/1 (2026-10-04): new run cards publish quality_tier = null, and no surface labels a new run with a tier. Legacy cards keep the heuristic label they were published with (scoring.QUALITY_TIERS on the retired composite); only human evaluation certifies quality."
|
|
424
501
|
},
|
|
425
502
|
"tokens_per_second": {
|
|
426
503
|
"category": "efficiency",
|
|
@@ -591,7 +668,8 @@
|
|
|
591
668
|
"notes": "clamp0((chrF++ - floor)/(100 - floor)) — removes the orthography-specific chance floor so scores are cross-language comparable; the clamp at 0 doubles as the noise rail (at-or-below-floor = indistinguishable from chance). PARTIAL: implemented today only in the connection-quality lane (arena/mt_eval_harness/connection_quality.py cchrf(); JS twins cli/website/src/utils/connectionQuality.mjs + arcStrength.mjs; constants SSOT shared/connection-quality.json cq-v1) — NOT computed by tester.py and never a leaderboard column. Floors: cli/website/src/data/cchrf-floors.json (196 languages, champollion-derived), regenerated from research/cchrf/results/atlas.json (Monte-Carlo N1-unigram floors over FLORES-200 dev monolingual text; the study + paper live in research/cchrf). Known caveat before any RANKING consumer wires this: N1 undershoots fluent-output chance by ~2.3 chrF++ measured on 24/204 languages (research/cchrf REVIEW_2026-07-11 M1); the N1-vs-N_w estimator choice is an open founder decision recorded in docs/METRICS_RESEARCH_PROGRAM_2026-07-10.md. Forbidden on language cards (card-integrity R3)."
|
|
592
669
|
}
|
|
593
670
|
},
|
|
594
|
-
"_proposed_renames": [
|
|
671
|
+
"_proposed_renames": [],
|
|
672
|
+
"_rename_decisions": [
|
|
595
673
|
{
|
|
596
674
|
"current": "run-card key 'corpus_bleu' (top-level) vs canonical 'bleu' vs db_column 'corpus_bleu'",
|
|
597
675
|
"proposal": "Move BLEU into scores as scores.bleu (spec §9 already shows it there) and keep db_column corpus_bleu; OR rename nothing and let this registry carry the mapping.",
|
|
@@ -42,6 +42,10 @@
|
|
|
42
42
|
"format": "uri",
|
|
43
43
|
"description": "Required for type 'api'. The server-side translation endpoint URL."
|
|
44
44
|
},
|
|
45
|
+
"acceptsInstructions": {
|
|
46
|
+
"type": "boolean",
|
|
47
|
+
"description": "api plugins: whether the endpoint follows per-key instructions (the plural forms a key needs, a quality-gate retry's feedback). false — a trained NMT model that only translates text (e.g. nmt-forge serve): the CLI never asks it twice for the same text (it would answer the same) and sends what it refuses to the pair's fallback. true — requests carry an \"instructions\" object (key → text) beside \"keys\". Omitted — unknown: the CLI asks once more without feedback and says so."
|
|
48
|
+
},
|
|
45
49
|
"config": {
|
|
46
50
|
"type": "object",
|
|
47
51
|
"description": "Method configuration — canonical MethodConfig shape.",
|
|
@@ -639,8 +639,8 @@
|
|
|
639
639
|
"properties": {
|
|
640
640
|
"risk": {
|
|
641
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."
|
|
642
|
+
"enum": ["NONE", "LOW", "MEDIUM", "HIGH", "UNCHECKED"],
|
|
643
|
+
"description": "NONE = private/unpublished. LOW = niche/recent. MEDIUM = public but not widely used. HIGH = known to be in major training sets. UNCHECKED = not graded: written by `champollion network register-corpus` when the file could not be compared with the public corpora (no corpora cards, public catalogue unreachable) and no grade was stated. Like every grade but LOW, it keeps a corpus in the relative-comparison-only lane."
|
|
644
644
|
},
|
|
645
645
|
"reasoning": {
|
|
646
646
|
"type": "string",
|
|
@@ -718,6 +718,12 @@
|
|
|
718
718
|
"default": "local-only"
|
|
719
719
|
},
|
|
720
720
|
|
|
721
|
+
"transmission": {
|
|
722
|
+
"type": "string",
|
|
723
|
+
"enum": ["local-only"],
|
|
724
|
+
"description": "The steward's transmission mark — SEPARATE from the licence. 'local-only' = only a model on the steward's own machine may see the text; every remote model API is refused. Written by `champollion network register-corpus` for a local-only set (and kept when a file it registers was already marked), mirroring the <file>.champollion.json sidecar the harness reads (mt_eval_harness.corpus_loader.read_steward_sidecar). It is not a licence term: license.* says what others may do with the text under its licence; this mark says where the steward lets it travel. Absent = no steward mark (the licence decides which model services may see it)."
|
|
725
|
+
},
|
|
726
|
+
|
|
721
727
|
"sealed": {
|
|
722
728
|
"type": ["object", "null"],
|
|
723
729
|
"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 the community-custodian multisig plan (docs/governance) (M1).",
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "http://json-schema.org/draft-07/schema#",
|
|
3
|
+
"$id": "https://champollion.dev/schemas/method-index-record.schema.json",
|
|
4
|
+
"title": "Champollion Method Index Record",
|
|
5
|
+
"description": "The public index record of a contest method: a deterministic projection of its bundle manifest (arena/mt_eval_harness/method_index.py) that keeps what the method is, who owns it, under what licence and how it decodes, plus the bundle's sha256 — and drops the contest binding, the qualifier receipt and the developer email. The record's canonical bytes (sorted keys, no whitespace, UTF-8) are minted once, by the harness; a node's signed score manifest carries their sha256 as indexEntrySha256. Consumers verify that sha over the bytes they are given; they never re-serialize.",
|
|
6
|
+
"type": "object",
|
|
7
|
+
"required": ["indexRecordVersion", "lane", "method", "owner", "licence", "languagePair", "methodSha256"],
|
|
8
|
+
"additionalProperties": false,
|
|
9
|
+
"properties": {
|
|
10
|
+
"indexRecordVersion": { "const": 1 },
|
|
11
|
+
"lane": {
|
|
12
|
+
"type": "string",
|
|
13
|
+
"enum": ["declarative-model", "method-execution"],
|
|
14
|
+
"description": "declarative-model = Lane A (weights run by the node's trusted engine, no participant code); method-execution = Lane B (code run in a --network=none sandbox)."
|
|
15
|
+
},
|
|
16
|
+
"method": {
|
|
17
|
+
"type": "object",
|
|
18
|
+
"required": ["name", "version"],
|
|
19
|
+
"additionalProperties": false,
|
|
20
|
+
"properties": {
|
|
21
|
+
"name": { "type": "string", "minLength": 1 },
|
|
22
|
+
"version": { "type": "string", "minLength": 1 },
|
|
23
|
+
"class": { "type": ["string", "null"] },
|
|
24
|
+
"paradigm": { "type": ["string", "null"] }
|
|
25
|
+
}
|
|
26
|
+
},
|
|
27
|
+
"owner": {
|
|
28
|
+
"type": "object",
|
|
29
|
+
"required": ["name"],
|
|
30
|
+
"additionalProperties": false,
|
|
31
|
+
"description": "Display identity only. Never an email.",
|
|
32
|
+
"properties": {
|
|
33
|
+
"name": { "type": ["string", "null"], "not": { "type": "string", "pattern": "@" } },
|
|
34
|
+
"affiliation": { "type": ["string", "null"] }
|
|
35
|
+
}
|
|
36
|
+
},
|
|
37
|
+
"licence": { "type": "string", "minLength": 1, "description": "The weights/code licence the participant declared (SPDX id or LicenseRef-*)." },
|
|
38
|
+
"weightsPublic": { "type": ["boolean", "null"] },
|
|
39
|
+
"parameterCount": { "type": ["integer", "null"], "minimum": 1 },
|
|
40
|
+
"track": { "type": ["string", "null"], "enum": ["constrained", "unconstrained", null] },
|
|
41
|
+
"trainingData": { "type": ["string", "null"], "maxLength": 2000 },
|
|
42
|
+
"languagePair": {
|
|
43
|
+
"type": "object",
|
|
44
|
+
"required": ["source", "target"],
|
|
45
|
+
"additionalProperties": false,
|
|
46
|
+
"description": "The pair measured. Index entries are keyed to the variety measured and never compared across test sets.",
|
|
47
|
+
"properties": {
|
|
48
|
+
"source": { "type": "string", "minLength": 1 },
|
|
49
|
+
"target": { "type": "string", "minLength": 1 }
|
|
50
|
+
}
|
|
51
|
+
},
|
|
52
|
+
"methodSha256": { "type": "string", "pattern": "^[0-9a-f]{64}$" },
|
|
53
|
+
"model": {
|
|
54
|
+
"type": "object",
|
|
55
|
+
"description": "Lane A only: the decoding the node's engine applies.",
|
|
56
|
+
"additionalProperties": false,
|
|
57
|
+
"properties": {
|
|
58
|
+
"architecture": { "type": ["string", "null"] },
|
|
59
|
+
"srcLang": { "type": ["string", "null"] },
|
|
60
|
+
"tgtLang": { "type": ["string", "null"] },
|
|
61
|
+
"generation": { "type": "object" }
|
|
62
|
+
}
|
|
63
|
+
},
|
|
64
|
+
"requirements": { "type": "object", "description": "Lane B only: the resources the method declared." },
|
|
65
|
+
"imageDigest": { "type": ["string", "null"], "description": "Lane B only: the built image the node ran." }
|
|
66
|
+
}
|
|
67
|
+
}
|
|
@@ -60,6 +60,10 @@
|
|
|
60
60
|
"description": "When true, ALL credential_env vars must be set for 'ready' — key-pair auth (e.g. AWS access-key id + secret; Lara id + secret). Default false = any one suffices (alias lists). Only meaningful alongside credential_env."
|
|
61
61
|
},
|
|
62
62
|
"default_base_url": { "type": "string" },
|
|
63
|
+
"keyless": {
|
|
64
|
+
"type": "boolean",
|
|
65
|
+
"description": "True when the default endpoint needs no credential at all — a server on the user's own machine (local) or a free public API (apertium). Its env vars only POINT ELSEWHERE, so availability surfaces report it ready with no key set. Hosted APIs with a default_base_url are NOT keyless."
|
|
66
|
+
},
|
|
63
67
|
"homepage": { "type": "string" },
|
|
64
68
|
"license": { "type": "string" },
|
|
65
69
|
"commercialReady": { "type": "boolean" },
|
|
@@ -32,6 +32,21 @@
|
|
|
32
32
|
"decision": { "type": "string", "enum": ["founder-pending", "accepted", "rejected"] }
|
|
33
33
|
}
|
|
34
34
|
}
|
|
35
|
+
},
|
|
36
|
+
"_rename_decisions": {
|
|
37
|
+
"type": "array",
|
|
38
|
+
"description": "Rename proposals the FOUNDER has already decided, moved out of _proposed_renames with the decision recorded verbatim (dated wording such as KEEP or DEFER, which the pending-proposal enum does not express). Advisory — not consumed by code.",
|
|
39
|
+
"items": {
|
|
40
|
+
"type": "object",
|
|
41
|
+
"required": ["current", "proposal", "impact", "decision"],
|
|
42
|
+
"additionalProperties": false,
|
|
43
|
+
"properties": {
|
|
44
|
+
"current": { "type": "string" },
|
|
45
|
+
"proposal": { "type": "string" },
|
|
46
|
+
"impact": { "type": "string" },
|
|
47
|
+
"decision": { "type": "string", "minLength": 1 }
|
|
48
|
+
}
|
|
49
|
+
}
|
|
35
50
|
}
|
|
36
51
|
},
|
|
37
52
|
"$defs": {
|
|
@@ -89,7 +104,46 @@
|
|
|
89
104
|
"type": "boolean",
|
|
90
105
|
"description": "True iff the verifier can deterministically re-derive it from the sha-pinned corpus + stored entries (+ card-pinned FST / pinned neural model under the fail-closed contract). Speed/cost/style metrics are false."
|
|
91
106
|
},
|
|
92
|
-
"notes": { "type": "string" }
|
|
107
|
+
"notes": { "type": "string" },
|
|
108
|
+
"ranking": { "$ref": "#/$defs/ranking" }
|
|
109
|
+
}
|
|
110
|
+
},
|
|
111
|
+
"ranking": {
|
|
112
|
+
"type": "object",
|
|
113
|
+
"description": "Present iff a contest may rank on this metric (contests.metadata.primary_metric). Absent = not rankable. Adding a metric to the rankable set is a data change here plus a rankable_metrics row (migration 076 pattern), never a code change.",
|
|
114
|
+
"required": ["rounding", "ci_columns", "segment_level", "signature"],
|
|
115
|
+
"additionalProperties": false,
|
|
116
|
+
"properties": {
|
|
117
|
+
"rounding": {
|
|
118
|
+
"type": "integer", "minimum": 0, "maximum": 6,
|
|
119
|
+
"description": "Display rounding; also the precision of the point-equality tie rung."
|
|
120
|
+
},
|
|
121
|
+
"ci_columns": {
|
|
122
|
+
"description": "The run_cards bootstrap-CI column pair [lower, upper] for the CI-overlap tie rung, or null when the metric has no CI columns.",
|
|
123
|
+
"oneOf": [
|
|
124
|
+
{ "type": "null" },
|
|
125
|
+
{ "type": "array", "items": { "type": "string" }, "minItems": 2, "maxItems": 2 }
|
|
126
|
+
]
|
|
127
|
+
},
|
|
128
|
+
"segment_level": {
|
|
129
|
+
"type": "boolean",
|
|
130
|
+
"description": "True iff the harness has a corpus function over per-segment rows (significance.py) so a paired test (approximate randomization / paired bootstrap) can compare two entries on this metric."
|
|
131
|
+
},
|
|
132
|
+
"retired": {
|
|
133
|
+
"type": "string",
|
|
134
|
+
"minLength": 1,
|
|
135
|
+
"description": "Present iff the metric is RETIRED as a ranking choice for NEW contests (the reason, said to whoever tries). A contest that already recorded it as metadata.primary_metric still ranks on it, labelled legacy; the block stays so the rankable_metrics table (migration 076) keeps its row and existing contests keep passing contest_lifecycle_guard()."
|
|
136
|
+
},
|
|
137
|
+
"signature": {
|
|
138
|
+
"type": "object",
|
|
139
|
+
"description": "How this metric's computation is identified, so a contest can freeze it as a promise (contests.metadata.metric_signature). sacrebleu: the run card's scores.sacrebleu_signatures[key]; model: the run card's scores[key] (the neural model id) plus the harness version; harness: the harness version alone.",
|
|
140
|
+
"required": ["kind"],
|
|
141
|
+
"additionalProperties": false,
|
|
142
|
+
"properties": {
|
|
143
|
+
"kind": { "type": "string", "enum": ["sacrebleu", "model", "harness"] },
|
|
144
|
+
"key": { "type": "string", "minLength": 1 }
|
|
145
|
+
}
|
|
146
|
+
}
|
|
93
147
|
}
|
|
94
148
|
}
|
|
95
149
|
}
|