Skip to content

v0.4.0

Choose a tag to compare

@Kohulan Kohulan released this 01 Oct 09:06
6c40284

0.4.0 (2026-10-01)

Features

  • explain-ui: node helpers and smallest-node hover map (b06aaa9)
  • explain-ui: render the v2 node list (5167f5e)
  • explain: build the flat node list; stereo by written scope, checked against real stereocentres (58965ee)
  • explain: explain every name OPSIN can read, from one OPSIN trace (ef29535)
  • explain: token ownership from OPSIN placement and written brackets; token-kind table (130eba9)
  • explain: trace OPSIN once for atoms, written tokens and owners (5d7a10c)
  • explain: v2 response with flat nodes, per-node honesty and span alignment (edad59a)

Bug Fixes

  • about: the fallback example is galantamine, a real molecule (b42c267)
  • about: the fallback example is galantamine, a real molecule (5fd244f)
  • about: the refusal example is cisplatin (4f78e50)
  • about: the refusal example is cisplatin (e3b95fc)
  • batch: nameless rows stay last on a Z-A name sort (df97919)
  • examples: the fallback example is ellipticine (9f519c0)
  • explain-ui: honest labels and notes, failure as one message, real-response tests (8ee2254)
  • explain-ui: the failure sentence is set in sentence case, not the uppercase caption style (6b8b2ad)
  • explain: a bracketed "n-O-(...)" pair names the parent's oxygen and carbon too; an element symbol never pairs across a bracket (ea26120)
  • explain: a bridge prefix is its own child of the root; census class PART_CONTAINS_PART (13cc4ef)
  • explain: a chained substituent's leading locant names the parent position (3f6c333)
  • explain: a chained substituent's locant names the atom its chain hangs on (ae117df)
  • explain: a fusion component's own numbers light only what the element and rings prove (44a3088)
  • explain: a glycosyl substituent's anomer mark lights its anomeric carbon (781c329)
  • explain: a leading locant before a chain of substituents names the atom it hangs on; the gate accepts a later chain member's atom (N-5a) (d76608c)
  • explain: a leading locant before an unbracketed chain names the parent position (4ce5a2f)
  • explain: a locant lights only atoms it can name; lit-atom gate (3c65925)
  • explain: a repeated suffix is labelled the way the name spells it (04303f2)
  • explain: a repeated suffix is labelled the way the name spells it (e3bf50c)
  • explain: a soft time limit inside node building propagates instead of becoming a defect message (3f5a8b9)
  • explain: a spiro skeleton OPSIN keeps no token of owns its tokens, and its second component's locants are primed (b143d22)
  • explain: an engine or drawing exception is one failure message, not a 500 (d83e420)
  • explain: every fusion component's numbers are proven or dark; a split-out number follows the token it was written for; the gate reads tokens, not wording (9d65478)
  • explain: final-review classes the gates were blind to (n-O- locants, functional-class words, false suffix lines, isotopic H, oxidation numbers) (b039bad)
  • explain: glossary states no false chemistry (7b801f8)
  • explain: oxalic keeps all four O, amino-acid esters keep alpha N/C, ring substituents keep their own locant (517d457)
  • explain: refuse a trace when any written token cannot be placed (5cf6467)
  • explain: refuse traces OPSIN reordered (CAS index names); stale-fixture guard (00ed9f1)
  • explain: root split gives the suffix only its own atoms (cc1afde)
  • explain: root split keeps side-chain groups and infix suffixes right (a59451e)
  • explain: root split takes suffix atoms from the group's own carbon (45b3555)
  • explain: spiro primes restart at each spiro system in the hydro gate (244a4a7)
  • explain: spiro primes stop at the bracket; census sees a wrong atom of the right part; position numbers before ring chains (c7b7356)
  • explain: the hydro gate reads OPSIN's primed numbering of later spiro components (2a070bf)
  • explain: trace the candidate parse OPSIN itself returns (the first built without a warning) (2abbf58)
  • the hero light no longer flashes black or overworks tablet GPUs (2650d77)

Refactoring

  • explain-ui: one hover-handler helper, one id map, one GET helper; comments state why, not history (e05c21b)
  • explain: drop dead parameters and an unused glossary helper (186e287)
  • explain: key glossary lines on OPSIN parse-tree kinds (c34afe5)
  • explain: one helper each for the hydro modifier, the oxy pair line, the generic token line and the guarded drawing; explain_molecule no longer draws OPSIN's molecule (8bbe19b)
  • explain: one home for bracket_end, locant-shape regexes and token walkers; census imports at module top (42c27a9)
  • explain: parse the traced SMILES once, build the part and ring tables once, skip the second parse when OPSIN's two SMILES agree (14c3e44)
  • explain: split root atoms from a Trace (dc9518f)
  • explain: the test and census gate lives in app/explain_gate.py, apart from the builder it checks (5377768)
  • one failure path for the hero light (8638579)
  • one failure path for the hero light (f1f0add)

Documentation

  • cite Orthonym-Web through its Zenodo DOI (9c0c8fa)
  • explain: CLAUDE.md corpus numbers follow the CURATED additions (670 names, CLEAN 668) (f54fff3)
  • explain: CLAUDE.md states the measured corpus and census numbers (665 / 663, ChEMBL 9998, 2026-10-01) (2dc6e83)
  • explain: correct the stereo rule, add the anomer rule and trace details (7e2bee1)