* fix(engine): actionable error when a Jinja field is missing/None/empty
Empty-render and missing-attribute failures used to surface as the
generic "User provided prompt generation template is invalid." either
because `sanitize_user_exceptions` stripped the detail or because
Jinja's raw `UndefinedError` leaked through. Both now raise a new
`EmptyTemplateRenderError` carrying a row-level diagnostic that names
the offending chain and includes copy-pasteable Jinja conditional and
SkipConfig fix patterns.
Closes#629.
* fix(engine): address PR review feedback on EmptyTemplateRenderError
Addresses the open review comments on #633:
1. (Greptile P1) Gate expression in the suggested remediation template
was one accessor too deep when the root variable was entirely absent
from the record, causing the suggested fix to itself raise
UndefinedError. Fall back to gating on the root name alone when
sample_name is not in record.
2. (andreatgretel) The AST walker reported loop-local names as missing
culprits (e.g. ``person`` in ``{% for person in people %}...{% endfor %}``).
Filter extracted chains through ``meta.find_undeclared_variables`` to
defer to Jinja's canonical scope tracking.
3. (andreatgretel follow-up) Empty collections used as loop iterables
(``items=[]``) fell through to the no-culprit fallback. Add a new
``_CULPRIT_EMPTY_COLLECTION`` classification so they're surfaced.
4. Minor: add ``from exception`` to ``safe_render``'s UndefinedError
re-raise for traceback consistency with the native engine path, and
add a note on the load-bearing exception ordering in
``sanitize_user_exceptions``.