Skip to content

WA multibyte alphabets render but never commit output (no text produced when steering) #70

Closed

Description

@willwade

What

Every WorldAlphabets alphabet with multi-byte symbols (Arabic, Hebrew, Amharic, Urdu, …) renders a weighted tree after the colour-token fix (da2e558) but produces no output when steered — dasher_get_output_text stays empty forever. WA ASCII alphabets (English) output fine; legacy v5 multibyte alphabets (Russian) output fine.

Evidence (engine-level probes, no fonts involved)

Identical steering program (fixed coordinates, hold, 100–1000 frames, turbo constant-time convention that reliably yields output for other alphabets):

Alphabet Output CSymbolNode::Do() calls
English with limited punctuation 'I' fires
English (WorldAlphabets) 'w' fires
Russian (v5, Cyrillic = multibyte) non-empty fires
Hebrew/Arabic/Amharic/Urdu (WA) 0 bytes never fires
  • engineError stays 0; no log messages; no crash.
  • CDasherModel::GetOffset() shows m_pLastOutput set (root path) but never advances — OutputTo(node) never receives an unseen node, so Do()/actions never run.
  • Not geometry: swept x∈{40,100,700,760} and y∈{100..500} — no coordinate commits.
  • Not RTL: Amharic (LTR) fails identically.

Pre-existing, not a #68 regression

Reproduced on pre-PR main (901e4d8, eager parsing) with the colour-fixed data — zero output there too. Nobody could see this before because these alphabets rendered invisible (#69 colour tokens) until da2e558.

Suspects

  • The distinguishing parse shape is WA node elements whose multi-byte label becomes both Display and Text (no text attr), combined with duplicate symbols (Hebrew: 27, Arabic: 36, Amharic: 282 — every WA multibyte file has dups; WA English has none). The commit path (Reparent_root/Render→OutputTo) appears to depend on something the duplicate/multibyte map breaks — likely interaction with CAlphabetMap lookups during root rebuild (RebuildFindFromOffset text→symbol round-trip).
  • Probe binaries and methodology available; DODUMP instrumentation point: CSymbolNode::Do() in AlphabetManager.cpp.

Impact

All WA-served RTL/Indic/Ethiopic/… languages are view-but-cannot-write. Combined with the 148-of-474 missing training corpora, the WA usability tail is: render ✓ (fixed), train (148 missing corpora), write ✗ (this issue).

Activity

  1. willwade commented on Aug 29, 2026

    @willwade
    Author

    Resolved — with a twist: this decomposed into two non-bugs and one real bug.

    1. RTL alphabets were never broken. The crosshair mirrors to the LEFT edge for RTL orientation; steering from the left works fine (engine probes: Hebrew 134 bytes, Arabic 100 bytes). It looked unwritable because the glyphs rendered as tofu (GTK canvas font — fixed in Dasher-GTK#71), so there was nothing meaningful to aim at.
    2. The real bug: informational warnings paused Dasher forever. FormatMessage hardwires the modal path, which pauses the input filter; the unpause path is only reachable after the model moves — impossible while paused. The trainer fires such a warning at startup for every alphabet lacking a (shipped) training corpus: Amharic, Adangbe, Azeri, and ~148 more. All rendered fine but froze on first input. Fixed in the attached PR: non-modal FormatInfoMessage for the trainer warnings (Amharic 0→81 B, Adangbe 0→44 B).
    3. Follow-up kept open here: the modal-pause deadlock itself (onUnpause unreachable while paused) remains latent for genuinely modal messages — worth its own fix eventually.
  2. willwade commented on Aug 29, 2026

    @willwade
    Author

    Decomposed and resolved: RTL was never broken (mirror steering — see GTK PR #71 for the tofu that obscured it); the real bug (modal warning pauses forever on training-less alphabets) is fixed in PR fix/wa-multibyte-output; the latent modal-unpause deadlock is noted for follow-up.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions