Skip to content

Releases: escacsfigueres/ocn

OCN 1.3.0 — the chronicle layer: openings that carry their history

Choose a tag to compare

@github-actions github-actions released this 30 Jul 23:01

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

Choose a tag to compare

@github-actions github-actions released this 29 Jul 08:36

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

Choose a tag to compare

@escacsfigueres escacsfigueres released this 11 Jun 11:20

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 against lichess-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 in docs/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-eco sweep 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 in docs/manifests/), each with a
    committed dry-run record.
  • Schema unchanged — 14-column catalogue; transposes_to/same_as
    layer untouched (unresolved_groups=0 reconfirmed).

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_name feeds the parquet's
    name column; 683 values changed.
  • Join keys are safe: zero ocn1 changes — 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)

  1. 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
    account escacsfigueres and tags ocn-1.0.2/1.0.3/1.1.0 intact.
  2. GO tag — annotated tag ocn-1.2.0 at the head; tags are
    immutable once pushed.
  3. GO push — push main + the tag.
  4. GO regen — coordinate chess-parquet: regenerate, run the
    downstream gate above, record checksums in a
    release-ocn-1.2.0-downstream-verification.md.
  5. Record — mark this document released (replace the draft header),
    update post-1.1-roadmap.md.

OCN 1.1.0 — fully resolved transposition catalogue

Choose a tag to compare

@escacsfigueres escacsfigueres released this 26 May 20:08

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 fixedE.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_to contract 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

⚠️ This is OCN's first slug-rename. Slug identity is not
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
    duplicate E.QID.Mil.MLn was deleted.
  • No FEN / moves_uci / zobrist / schema change for those
    positions — only the slug identity (and canonical_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.parquet rows 5,899; schema unchanged (13 cols);
    canonical_ocn1 rule 0 violations; transposes_to 112,
    same_as 34; 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_ocn1 is still computed by the transposes_to rule
    (canonical_ocn1 = transposes_to if set, else ocn1).
  • same_as semantics 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.Kmo is now "a3 Move Order"
    (transposes to E.Nim.Sml.Bot); "Kmoch" is E.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.MLn parent-chain quirk (cosmetic).

Both are documented in
nimzo-botvinnik-kmoch-apply-preflight.md;
neither blocks the release.

OCN 0.2 post-cleanup release

Choose a tag to compare

@escacsfigueres escacsfigueres released this 24 May 01:32

OCN 0.2 post-cleanup release.

Source:

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.