Alright, just woke up. A bunch to reply to, so here it goes. First, the exception.
So i just woke up and tried your new version, added leatherworker under enabled classes as Leatherworker: 3 and tried making something and i got this errror
09:46:41.765 D] System.ArgumentNullException: Value cannot be null.
Parameter name: key
at System.Collections.Generic.Dictionary`2.FindEntry( TKey key)
at System.Collections.Generic.Dictionary`2.TryGetValu e(TKey key, TValue& value)
at TreeSharp.Switch`1.RunSwitch(Object context)
at TreeSharp.Switch`1.<Execute>d__2.MoveNext()
at TreeSharp.Composite.Tick(Object context)
at TreeSharp.Decorator.<Execute>d__0.MoveNext()
at TreeSharp.Composite.Tick(Object context)
at TreeSharp.PrioritySelector.<Execute>d__0.MoveNext( )
at TreeSharp.Composite.Tick(Object context)
at ff14bot.TreeRoot.()
Did your Orders have a "Strategy: Hasty And Kinky" field? Seems like that field was left blank so it deserialized into null. I'm going to fix this today so if you leave it blank it'll use "Hasty And Kinky" as default. This was a new addition yesterday, it let's you specify the strategy on a per order basis. For now, if you make the field on the order it shouldn't throw the exception.
@ChuChu don't worry about linking code, everything one does here is basically open source

The way the bot knows when an order is done, as you noticed, is it checks how many items with the order's ID you already have on your inventory when the order starts. So when she says "I'm going to craft XXX now." on the log, it makes the check, and then adds the Amount to it to know how many items you should end up at the end of the order. So Current + Amount = Total, then after each craft it checks if Current == Total. You can think of orders as "I want to make sure I have X of this when you're done." rather than "I want to craft this X times". The two are the same for recipes with a Yield of 1. But as you saw, if the Yield is > 1 then a fewer amount of crafts would result in the amount.
I'm not sure I want to change this, here's my reasoning: usually it's the case that when you craft, what you want is to end up with X of an item. Your quest asks for one of X, so you make the order for one of X. If I changed this it would happen that, say, your quest asks you for 5 Knight's Bread, so you make the order for 5 Knight's Bread, but end up with 30 or whatever due to its yield. The bot made 5 crafts, not 5 Knight's Bread. That would be confusing, I think. On the other hand, I can see where you'd want that: leveling purposes. In that case you do want to make 5 crafts and not really 5 of the item. The only option I'd consider is implementing both ways, but that means changing quite a bit of the "is this order done?" logic, which will take me time since I got other priorities for now, like class switching and making plugins work with the bot. I like that you noticed this, though lol.
@ZCW I see. Well, right now when Lisbeth crafts it asks "How can I get the most HQ out of this item?", what you're asking is to also add the question "In the fastest way possible?". That makes the problem a much harder one to solve. It's basically adding another constraint to an optimization problem with randomness in it already. In order to cheat, I could add a simple check like: If 3 Advanced Touches give you 100HQ, then just do that and careful synth at the end; else, use Hasty And Kinky's default behavior. The problem is that this requires the use of a quality formula to predict how much an Advanced Touch produces with your stats / recipe level / etc. Lisbeth does this for progress, and the formula took me a bit to get right. But I'll try find a good formula out there for quality.
@Miku_ Thanks! Next update, you won't have to teach her recipes anymore she'll know all recipes in the game out of the box. I'll also test class switching, it's almost done.