orthonym.assembly.handlers.general_acyclic#

Note

Internal API. Names and behaviour may change between releases.

a phase general_acyclic catch-all handler (DECOMP-01 closure).

Per internal notes + -02 + internal notes RESEARCH: explicit catch-all (priority 99999, predicate=lambda *_: True) closing the Plan-02 fallthrough gap so dispatch_inner first-match-AND-succeeds-wins (-04) ALWAYS returns a non-None InnerDispatchResult.

LIFT SOURCE: composer.py:951-1055 chain-fallback section (verbatim, with helper calls re-routed from local composer scope to from._handler_shared import _generate_chain_parent, _generate_ring_parent, _generate_suffix, _generate_prefixes, _generate_stereodescriptors, _assemble_fragments; final return candidate_name replaced by a pool-carried NamingResult(name=best.name, tree=best.tree,...)).

IUPAC cite: + + (catch-all substitutive nomenclature).

a phase SCORE-01: emits a STRUCTURED NameTreeNode derived from its own fragment list via fragments_to_tree (Path A), attached through the CandidatePool tree= carry. The returned tree is read off the winning candidate (best.tree) so a higher-priority handler’s win is never mislabelled with a general_acyclic tree.

CRITICAL: this handler lifts ONLY the chain-fallback section. The cycloalkane stereo backstop at composer.py:1057-1097 STAYS in _assemble_name_impl (orchestrator applies it AFTER dispatch_inner returns) per internal notes.

orthonym.assembly.handlers.general_acyclic.name_general_acyclic(features, mol=None, style='pin')#

General catch-all chain/ring fallback (DECOMP-01 closure; a phase).

Verbatim lift of composer.py:951-1055 (chain-fallback section). Helper calls re-routed from composer.py local scope to _handler_shared imports. String output MUST be byte-identical per DECOMP-03 contract.

Returns NamingResult(name=…, tree=<structured NameTreeNode>, atom_to_locant_hint=None); the tree is read off the winning pool candidate (a phase SCORE-01).