After determining the bug in Validate, I've been able to formulate a workaround and re-posted a new XLS and XML form, which have been tested against both Validate, Enketo, and Collect.
For those interested, I've highlighted the change in the XLS form that was necessary to 'fake out' Validate and prevent it from throwing a bogus type mismatch error when evaluating date-related XPath expressions. Specifically, I changed
dayofyear = decimal-date-time(${date}) - decimal-date-time(concat(${year}, "-01-01"))
to
dayofyear = decimal-date-time(${date}) - decimal-date-time(concat(coalesce(${year},"2019"), "-01-01"))
Replacing ${year}
with coalesce(${year},"2019")
means Validate gets a valid date string when it evaluates the decimal-date-time() argument during its (static) type checking phase; the 2019 year will be ignored as soon as you run the form and enter an actual date. This is only needed as bug workaround and is not part of the algorithm.