Result: blocked Files: none Commit: none Fixes: none Pushed: none Tests: none run; read emit/mod.rs:873,1470,1521,1727-1860, emit/host.rs:269, check/host.rs:186-224,355, contracts/sync.rs:305, parser/mod.rs:382-446, text_tiers.rs:642-766 at 3531d7d Gate: none Deviation: steps 1 and 2 not built Found: none Needs: decision: the moved literal_expressions/hole_as_read must wrap an f”” hole (parsed.hole_wraps + text_tiers::wrap_hole, which takes NodeId::fresh ids in a mutable Rust walk) and the Rust adapter (12 callers, only &Parsed) has no host that can. Proposal: one trait EmitHolesHost in emit_holes.nika, implemented in Rust for Parsed, with hole(site, text) -> EmitHole (Expr or error text), cached_holes, cached_kept_calls and a 4th method wrapped_hole(at: u32, hole: ref Expr) -> Expr? (null where nothing is wrapped). The pure parts (interpolated_holes, the template’s (site, texts) via dsl_name/is_deferred/template::split/template_holes_bound) need no host. On the emit side, names_read in Nikaia reads EmitState.template_holes, EmitState.hole_wraps and the existing EmitHost.wrap_hole, so EmitHost gains nothing. Approve the 4th method (or name another way) and re-brief Changelog: none Owner: none Disk freed: 0