Thanks for adding the demo. That helped me verify the one thing still missing here. Adding `aria-describedby` is supposed to only happen when the error isn't added to the label, to avoid "duplicate content".

From #900:

> Change default error element to <span>, associate that to the input using aria-describedby, __except when its appended to an existing label element (leave it out then)__.

I guess the only way to know where the error element ends up is to check its ascendents, since we can't tell what `errorPlacement` will do. Though I suppose we only have to do that when `settings.errorPlacement` is used, since that's the only case where it might end up inside the label.