How each modifications source is read (grammar and limits: GET /capabilities nested_variables). Missing, null or {} means every source is text, literal. template: {name} inserts that variable's value, {{ and }} print one brace. formula: exact decimal arithmetic (+ - * /, unary signs, parentheses, round(x[, decimals]), min(a,b,...), max(a,b,...), abs(x)) over numbers and {name}; additive grammar 3 adds count({items}) and sum({items},{amount}) over the effective whole rows source. Aggregate brace arguments are source/field handles, not variable edges. Empty count/sum is zero; every needed sum cell must be decimal, with a private one-based row/field refusal before charge. Unused, hidden and overridden aggregates read nothing; table and aggregate sources share the fetch cache/budget. Aggregate-dependent visible_if inside link_dest/follows refuses before reads; a literal controller override is allowed; a terminating result prints in full, a repeating one is rounded to nested_variables.projection_digits significant digits. A mode needs a source under the same name; page and pages are engine facts and take no mode; row.* names take none. A save refuses a schema problem (VariableDiagnosticCode invalid_mode, invalid_name, reserved_name, unsupported_row_scope, source_limit) and writes nothing; a definition that does not resolve from the saved values is saved and named in warnings, and a render refuses it before any charge unless dynamic_data supplies a literal for it. dynamic_data is always literal: a supplied value replaces the definition of that name for the call and is never parsed as a template or a formula. What a caller sends and what the template computes is told apart by InputDescriptor.