So these glyphs are in @DisconnectedLowercase: **o x**

And these are not: **a n**

In the sequence **o x x o** the renderer will first encounter the pair **o x** and, applying your InitForms3 lookup, will make it (say) **o x.alt**.

Then the renderer moves along not to **x x** but to **x.alt x**. Since **x.alt** is not in @DisconnectedLowercase, InitForms3 will not make a substitution for the second x. But all the other lookups are *also* consulted for **x.alt x**. So a lot depends on what is in @AllLetters, @isolDef and @initDef. For example, if **x.alt** is *not* in @AllLetters and **x** *is* in @initDef, a substitution will be made for the second **x** by your InitForms lookup.

More abstractly, remember that given a sequence

**1 2 3 4**

The renderer will (a) deal with **1 2**, sorting through the lookups till it finds one that applies, then will (b) deal with **2 3** as modified by (a), then deal with **3 4** as modified by (a) and (b), and so on.

I can’t be sure how these considerations apply without seeing all your classes, but it seems to me that everything depends on what’s in those classes.