Benchmarks

The benchmark suites are diagnostic and release-supporting tools, not a replacement for the semantic regression and false-positive tests.

The benchmark ownership and release policy are documented in benchmarks/OWNERSHIP.md. PolyNorm and Proteno measure specialized external-corpus behavior; Google TN is an offline English text-normalization comparison; Async TN is a pinned English and six-language annotated TTS-normalization diagnostic. Their data and reports live under benchmarks/ and should be interpreted with the safety and quarantine guidance in the ownership document. See Async TN for its mapping, methodology, and static dashboard contract.

Japanese, Korean, and Chinese runtime support is regression-tested but is not part of the current seven-language PolyNorm or kokorog2p parity scope without a dedicated benchmark adapter and corpus.

Async TN, PolyNorm, and Proteno now each write a self-contained local report.html dashboard by default. These dashboards reuse a shared static HTML shell, keep dataset/runtime strings escaped, expose local KPI and diagnostic views, and can be disabled with --report none when only the JSONL/Markdown artifacts are needed.

All four benchmark CLIs also support a diagnostic --candidate-oracle mode. It keeps runtime normalization unchanged, enumerates bounded alternative structured-candidate selections, writes per-run oracle_summary.json, and can be used to measure selector headroom before attempting any learned ranking or selection project.

Spokenform Gold

Run the pinned Gold release diagnostic benchmark with:

python -m benchmarks.spokenform_gold \
  --split corpus \
  --accept-upstream-licenses \
  --report html

The consumer reads the exact v0.1.0-exp.2 release asset pinned in benchmarks/spokenform_gold_release.json. It never rebuilds Gold data from a source checkout and never selects the latest GitHub release dynamically. The pin contains the release tag, asset SHA-256, manifest SHA-256, target commit, and matching runtime source ref. The first online run downloads and verifies the release zip and matching runtime source under .cache/spokenform-gold/. The v2 corpus is unsplit and contains 20,037 public release records, including 1,978 external-reference records and 18,059 embedded records.

Use --offline after the cache is populated, --refresh only after an intentional pin update, --download-only to populate without evaluation, --cache-dir or --source-cache-dir to relocate release or external-source caches, --gold-root for an extracted release directory containing manifest.json, --split corpus, --mode canonical|accepted, and --report none to disable HTML. Passing a source checkout to --gold-root is rejected with a targeted diagnostic.

Full corpus runs require --accept-upstream-licenses before source hydration. The benchmark fails before scoring if the flag is absent, evaluates all 20,037 release records, and records release identity and coverage in summary.json and the self-contained report.html. Use --offline to guarantee that source hydration performs no network access.

Lexhint A/B comparison

Compare the existing provider-free configuration with the same configuration plus a pinned Lexhint runtime artifact. Keep Spokenform, abbr2words, language, profile, and benchmark inputs fixed. Record the Spokenform commit/version, abbr2words version, Lexhint package version, dataset version, schema version, variant, language, and profile.

Review URL, version, identifier, and sports families separately. The provider-free run is the compatibility baseline. Lexhint is successful only when URL rendering improves and contextual true positives increase without material IP, date, reference, or score false positives. Do not use an unpinned latest dataset for release comparisons.