Releases: escacsfigueres/ocn
Release list
OCN 1.3.0 — the chronicle layer: openings that carry their history
Release notes: docs/release-ocn-1.3.0-notes.md
Artefacts
| file | what it is |
|---|---|
ocn-1.csv |
the canonical catalogue, 14 columns |
ocn-1.json |
the whole catalogue as one JSON document (schema ocn.catalog.v1), with SAN movetext and the pipe-packed columns pre-split |
ocn-1.positions.tsv |
one row per concrete slug: fen_key, full FEN, transposition-group size |
ocn-1.lichess-xref.tsv |
Lichess opening lines mapped to OCN slugs |
ocn-1.eco.tsv |
scalar join table, one row per (slug, ECO code) |
ocn-1.eco-divergence.tsv |
rows whose OCN class letter is absent from their ECO codes, with rationale keys into the spec |
ocn_chess-*.whl, ocn_chess-*.tar.gz |
the ocn-chess Python package, catalogue bundled, zero runtime dependencies |
SHA256SUMS |
sha256 of every file above |
Built from the tag by .github/workflows/release.yml. The
canonical source is catalog/ocn-1.csv; everything else is
derived and regenerable.
OCN 1.2.1 — the launch release: public repo, installable package, honest spec
Release notes: docs/release-ocn-1.2.1-notes.md
Artefacts
| file | what it is |
|---|---|
ocn-1.csv |
the canonical catalogue, 14 columns |
ocn-1.json |
the whole catalogue as one JSON document (schema ocn.catalog.v1), with SAN movetext and the pipe-packed columns pre-split |
ocn-1.positions.tsv |
one row per concrete slug: fen_key, full FEN, transposition-group size |
ocn-1.lichess-xref.tsv |
Lichess opening lines mapped to OCN slugs |
ocn-1.eco.tsv |
scalar join table, one row per (slug, ECO code) |
ocn-1.eco-divergence.tsv |
rows whose OCN class letter is absent from their ECO codes, with rationale keys into the spec |
ocn_chess-*.whl, ocn_chess-*.tar.gz |
the ocn-chess Python package, catalogue bundled, zero runtime dependencies |
SHA256SUMS |
sha256 of every file above |
Built from the tag by .github/workflows/release.yml. The
canonical source is catalog/ocn-1.csv; everything else is
derived and regenerable.
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.
OCN 1.1.0 — fully resolved transposition catalogue
OCN 1.1.0 — fully resolved transposition catalogue
Release notes (draft — tag not yet created). Docs-only record;
no tag/release/upload accompanies this document.
- Proposed release:
OCN 1.1.0 — fully resolved transposition catalogue - Proposed tag:
ocn-1.1.0(minor bump — first slug-rename; slug
identity is not guaranteed stable across this boundary) - Target commit: current
main(the release-cycle head; this
notes commit or its successor) - Previous release:
ocn-1.0.3(dd2abd3)
Summary
The transposition layer is fully resolved: every duplicate-FEN
group in the catalogue is now classified.
- 0 unresolved duplicate-FEN groups (was 116 at the start of the
post-0.2 cleanup; 31 at the start of this push series). - QID Miles/Petrosian slug-migration applied — the mislabelled
a3/Nc3 Kasparov-Petrosian subtree was re-homed under
E.QID.Pet.KPe(OCN's first slug-rename). - Nimzo Bot/Kmo naming fixed —
E.Nim.Sml.Kmo(spurious
"Kmoch") →transposes_to E.Nim.Sml.Bot, relabelled "a3 Move
Order"; "Kmoch" stays at 4.f3 (E.Nim.Fou), per Lichess E20. same_as/transposes_tocontract unchanged — same two
resolution channels, same semantics.- Schema unchanged — 14-column catalogue, 13-column
openings.parquet(incl.canonical_ocn1,zobrist).
Metrics (at the release head)
| metric | value | vs ocn-1.0.3 |
|---|---|---|
| catalogue rows | 5,899 | (1.0.3 baseline) |
| duplicate_groups | 124 | — |
| resolved_groups | 124 | — |
| unresolved_groups | 0 | down from the long-tail |
| multiple_canonical_groups | 17 | grew via the same_as programme |
| schema columns | 14 (catalogue) / 13 (parquet) | unchanged |
Compatibility / breaking note
guaranteed stable across release tags — ocn-1.1.0 establishes that
precedent.
- 10 canonical OCN slugs changed:
E.QID.Mil.MLn.* → E.QID.Pet.KPe.*(the QID Kasparov-Petrosian subtree), and the
duplicateE.QID.Mil.MLnwas deleted. - No FEN / moves_uci / zobrist / schema change for those
positions — only the slug identity (andcanonical_name
"Miles" → "Kasparov-Petrosian") moved. - Consumers pinning
E.QID.Mil.MLn*slugs must update to the
E.QID.Pet.KPe.*names. Position-lookup consumers joining on
FEN/zobrist are unaffected.
Assets (candidate — sha256)
Regenerated against the migrated catalogue; local candidates pending
upload at tag time.
| asset | size | sha256 |
|---|---|---|
ocn-1.positions.tsv |
1,475,677 B | 0e78c315c62b1c37a7267b5df3c82f98e1af4e1ae0dbe8e9d47fc68211d89d7d |
openings.parquet |
369,663 B | a9180bfcd4fee272f0a9a76e866ffbe4ca2311ea68f373b435a5aff75209a5c2 |
_efcdb_manifest.json |
328 B | a8aa50e904328e240290c1f17c56578a3c71875629f953b901ff551ca4ede9f6 |
_efcdb_manifest.json: efcdb_version 1.3, rows 5899,
zobrist_variant polyglot-v1.0, source ocn-1.1.0-candidate-<commit>. Regenerate fresh at tag time if
the head moves; do not reuse ocn-1.0.3 checksums.
Downstream (chess-parquet)
The efcdb-cli openings producer was run against the migrated
catalogue and smoke-tested:
openings.parquetrows 5,899; schema unchanged (13 cols);
canonical_ocn1rule 0 violations;transposes_to112,
same_as34; distinct zobrist 5,765, 124 multi-row zobrist
groups (= duplicate_groups).- QID migration absorbed cleanly: 0
E.QID.Mil.MLn*, 10
E.QID.Pet.KPe.*in the parquet — no producer code change. cargo test -p efcdb-openings -p efcdb-core→ 15 + 10 passed.
Upgrade guidance (from ocn-1.0.3)
- If you pinned
ocn-1.0.3, expect the QID slug names to change
on upgrade (E.QID.Mil.MLn.* → E.QID.Pet.KPe.*); update any
hard-coded slug references. canonical_ocn1is still computed by thetransposes_torule
(canonical_ocn1 =transposes_toif set, elseocn1).same_assemantics are unchanged — symmetric co-canonical
pairs (17 groups), still joined many-to-one on zobrist downstream.- Nimzo: the depth-3 Sämisch
E.Nim.Sml.Kmois now "a3 Move Order"
(transposes toE.Nim.Sml.Bot); "Kmoch" isE.Nim.Fou(4.f3).
Open follow-ups (NOT in this release)
E.Nim.Rub.Kmo's "Kmoch" is the same artifact as the fixed Nimzo
case — a cosmetic relabel for a future pass (does not affect
resolution counts).E.Nim.Sml.Kmo.MLnparent-chain quirk (cosmetic).
Both are documented in
nimzo-botvinnik-kmoch-apply-preflight.md;
neither blocks the release.
OCN 0.2 post-cleanup release
OCN 0.2 post-cleanup release.
Source:
- Tag: ocn-1.0.3
- Commit: dd2abd3
Catalogue:
- Rows: 5,905
- Schema: 14 columns with transposes_to and same_as
- transposes_to rows: 91
- same_as rows: 12
- Duplicate FEN groups: 130
- Resolved groups: 93
- Unresolved groups: 37
- Multiple-canonical groups: 6
Assets:
- ocn-1.positions.tsv
sha256: 7b1af5a9748fe7c8a5159eb20ccf2ece94e1b39c763d5cb8f67af02b8f0f8933 - openings.parquet
sha256: 19df2a4def9646b32a27307716e738de4bf9620b87d9928177dc90728bcd54be - _efcdb_manifest.json
sha256: f310558842e240beb7fc57cfcd0942102386de4cafe311edccd1687b4713580e
Downstream contract:
- Consumers must not assume one OCN row per zobrist.
- transposes_to maps non-canonical rows to canonical_ocn1.
- same_as preserves co-canonical literary identities.
- openings.parquet was generated with chess-parquet producer compatible with OCN 0.2.