OCN 1.2.0 — diacritic-true names, audited ECO, unconditional gate
Summary
Everything the 360 audit rated P0/P1 on the catalogue itself is closed:
- Diacritic normalization, Tiers 1+2 — 10 + 4 eponym surnames respelled
to the person's orthography across all naming columns (López, Grünfeld,
Réti, Sämisch, Maróczy, Göring, Hübner, Löwenthal, Hromádka, Møller;
Mikėnas, Krejčík, Opočenský, Pelikán). Policy + evidence:
docs/diacritic-normalization-map.md. Sørensen and Würzburger stay
parked pending per-row referent evidence. - ECO corrections — 12 rows double-sourced (audit claim + independent
longest-SAN-prefix derivation againstlichess-org/chess-openings):
London family A48→D02 (10), Dragon Yugoslav B76→B78, QID Nimzowitsch
E17→E15. Four audit claims were refuted by the derivation and left
unchanged (record indocs/eco-corrections-dry-run.md). - Naming hygiene — 24 identity aliases dropped, 2 whitespace typos
fixed; the two checks promoted to errors. - Phantom + duplicate-name decisions executed
(docs/phantom-and-duplicate-name-decision.md): path-marker children
spec-blessed and ECO-aligned (2 rows); the four duplicate canonical
names made unique (5 rows). Both validator allowlists now empty. - Validator naming + ECO waves — checks 13–20 live: global name
uniqueness, banned characters (middle dot, invisibles, controls),
whitespace, identity-alias, diacritic regression guard (20 banned ASCII
variants), same-moves-ECO consistency, plus--audit-naming/
--audit-ecosweep heuristics. The default gate runs unconditional —
zero allowlists, zero standing warnings. - Engine — third safety mode
eco_legacy_only; every change in this
release went through a manifest (8 indocs/manifests/), each with a
committed dry-run record. - Schema unchanged — 14-column catalogue;
transposes_to/same_as
layer untouched (unresolved_groups=0reconfirmed).
Catalogue diff vs ocn-1.1.0
| metric | value |
|---|---|
| rows | 5,899 → 5,899 (0 added, 0 removed, 0 slug changes) |
| distinct rows changed | 782 |
canonical_name |
683 |
notes |
416 |
aliases |
113 |
historical_notes / attributed_to / attribution_source |
20 / 19 / 19 |
eco_legacy |
14 |
| sha256 (release head) | 255ab28006ed6ce5bdf713936298cba1cb067eaa859e5fe167cdea84acf34b9a |
| validator | 5,899 entries, 0 warnings, --strict-chess green |
| tool tests | 165 |
Applied lots, in order (manifest → dry-run record, all in docs/):
| lot | mode | rows |
|---|---|---|
| naming-error-corrections (P0) | naming_strings_only | 16 |
| attribution-polish (P0) | attribution_fields_only | 3 |
| diacritic-tier1-normalization | naming_strings_only | 663 |
| diacritic-tier2-normalization | naming_strings_only | 50 |
| naming-hygiene | naming_strings_only | 26 |
| eco-corrections | eco_legacy_only | 12 |
| phantom-eco-align | eco_legacy_only | 2 |
| duplicate-name-renames | naming_strings_only | 5 |
Downstream impact (chess-parquet)
- Parquet regen is mandatory:
canonical_namefeeds the parquet's
name column; 683 values changed. - Join keys are safe: zero
ocn1changes — anything keyed by slug,
FEN or zobrist survives untouched. Only name-string joins break (and
they were joining misspellings). - Downstream gate, mirroring the 1.1.0 verification doc: regen
openings.parquet, re-run the efcdb-openings join, confirm row count
5,899 and zero unmatched slugs, then publish both artefacts together.
Release runbook (each step its own GO)
- Freeze + gate — clean worktree at the release head; run
validate.py --strict-chess(5,899/0), full test suite (165),
audit_transpositions.py --summary(unresolved_groups=0); verify
accountescacsfigueresand tagsocn-1.0.2/1.0.3/1.1.0intact. - GO tag — annotated tag
ocn-1.2.0at the head; tags are
immutable once pushed. - GO push — push
main+ the tag. - GO regen — coordinate
chess-parquet: regenerate, run the
downstream gate above, record checksums in a
release-ocn-1.2.0-downstream-verification.md. - Record — mark this document released (replace the draft header),
updatepost-1.1-roadmap.md.