You don't need to mention the Case object in your formula:
IF ($RecordType.Name = 'Account',
IF ($RecordType.Name = 'Finance',
You can use CASE function as well:
In hindsight, this question is fairly dumb and I've figured out the problem. In a trigger that is set to before insert I was calling insert on the triggering item after having added the contact to the case. That seems like something that shouldn't work, and simply commenting out that line allows the code to function.
The Business Processes are tied to extra metadata that can drive your business logic.
For Leads, the Status is used to indicate lead-to-opportunity conversion.
For Opportunities, the Stage is used for Forecasting, and is related to Quotas and other sales-related functionality.
For Cases, the Status is used to track SLA compliance, Milestones, and to ...
By the look of it, your Map is a Map<Case, Contact>
when you modify thisCase with
thisCase.ContactId = caseExistingContactMap.get(thisCase).Id;
you make a modification on thisCase, so the next caseExistingContactMap.get(thisCase) you do, thisCase is different than the original and it does find the contact anymore.
Have you tried doing a Map</*...
I'm not sure where, or if, this is documented, but I do know that this is normal behavior. The Contact and Account will not be resolved until the after-insert phase of the trigger process. In fact, the OwnerId field will be "wrong" in the after-insert trigger phase as well, because assignment rules don't run until later. You could use a Process Builder/...
In the criteria for your rule entries, set "Run this rule if the" to "formula evaluates to true". Then add "ISNEW()" to the formula (alongside possible other criteria). Do that for all rule entries, then they will only fire when the case is newly created.