Conformance
ferrocat now carries a hermetic conformance snapshot under repository conformance snapshot, with case definitions in case definitions.
Phase 1 intentionally excludes GNU gettext. The current snapshot uses:
izimobil/polibas the primary PO edge-case baselinerubenv/pofileas a secondary JS-oriented PO cross-check- Babel as a targeted PO supplement
- the official ICU MessageFormat tests as the parser reference for
ferrocat-icu
Current Counts
Current snapshot totals as of 2026-03-16:
55source-attributed conformance cases442concrete assertions checked by the harness50expected passes5expected rejects0documentedknown_gapcases
Per suite:
po-pofile:30cases /301assertionspo-polib:12cases /88assertionspo-babel:5cases /32assertionsicu-official:8cases /21assertions
The case count tracks individually addressable upstream-derived scenarios. The assertion count tracks the concrete field- and structure-level comparisons performed by the harness, which is the better number to use when communicating weight and breadth.
Small structured expectations now live inline in the Rust case definitions next to each case. External files are kept mainly for realistic upstream inputs and full rendered outputs such as roundtrip or merge snapshots.
Snapshot Scope
po-polib: comment ordering, UTF-8 BOM handling, strict invalid quoting rejects, wrapping, merge semantics, and merge output parsingpo-pofile: multiline values, structured references, comments, contexts, obsolete entries, C-string escapes, normalized headerless roundtrip behavior, andPlural-Formspo-babel: unknown locale roundtrip, irregular multilinemsgstr, and enclosed location parsing with structured referencesicu-official: simple arguments, plural/selectordinal, nested tags, apostrophe escaping, and parser-visible failure cases
Local Coverage Mapping
Existing local tests still provide broad regression coverage in:
parse,serialize,merge, andapibehavior insideferrocat-po- parser and utility behavior inside
ferrocat-icu
The conformance layer is intentionally narrower and source-attributed. It exists to answer a different question: whether ferrocat matches independently maintained reference behavior on representative upstream cases.
Scoreboard
Use:
cargo test --workspace
cargo run -p ferrocat-bench -- conformance-reportThe report prints totals per suite and capability, broken down into pass, reject, and known_gap.
It also prints assertion totals, so we can talk about both "how many source-attributed cases" and "how many concrete checks" without inflating fixture counts.
Known gaps are counted and documented, but they do not fail CI. The current snapshot has 0.
Headerless PO files are not treated as a gap. ferrocat-po intentionally normalizes them on write by emitting an explicit empty header entry.
Not every upstream-derived behavior is treated as a desired future target. previous_msgid history from traditional gettext merge workflows is intentionally out of scope and therefore not counted as a known_gap.
Phase 1 Exclusion
GNU gettext is not part of the phase 1 scoreboard. The main reason is repository hygiene: its tests are powerful, but much harder to adopt hermetically without either GPL test vendoring or a much heavier adaptation layer. The current snapshot is intentionally built from MIT/BSD/Unicode-licensed sources first.