CanvasDataBinder
Resolves one canvas's <c>data</c> bindings. Owned by a <c>DrylCanvas</c> instance, never by the application — two canvases on a page share nothing. <para>Bindings are keyed by <c>source</c> plus their <em>resolved</em> parameters, so three stat nodes on <c>orders.open</c> are one key and one handler call. Four things trigger a load: the first render of a binding, a change to a form field a parameter references (debounced), the interval timer, and a host <c>Invalidate</c>. Per key at most one load runs; a newer one cancels the older, and a late result carrying a stale sequence number is dropped.</para><para>A refresh that produces the same value is silent — no pulse, no render. A refresh with a new value stamps the pulse tracker, which is exactly what an AI <c>setProps</c> does: one language for "something changed here", whoever changed it (A8).</para>