Goldie Blocks
Authoring

DSL Expressions

MVP operators and functions for deterministic authoring expressions

Goldie Blocks uses a constrained, Airtable-style expression language for deterministic template logic. Expressions appear in computed fields and flow.condition values. Template content: interpolation is narrower: it supports references and named presentation filters only, as described in DSL Syntax.

Operators are infix. Functions are prefix with parentheses. Logical composition uses functions such as AND, OR, and NOT, not infix logical operators.

Operators

Comparison:

  • =
  • !=
  • >
  • >=
  • <
  • <=

Arithmetic:

  • +
  • -
  • *
  • /

String concatenation:

  • &

Operator Precedence

Highest to lowest:

  1. Parentheses ()
  2. *, /
  3. +, -, &
  4. =, !=, >, >=, <, <=

Logical composition is via functions. Do not use infix && or ||.

MVP Functions

Logical

  • AND(arg1, arg2, ...)
  • OR(arg1, arg2, ...)
  • NOT(arg)
  • IF(condition, then_value, else_value)
  • TRUE()
  • FALSE()

Airtable-style two-argument IF(condition, then_value) is valid in computed fields. If the condition is false, the computed value resolves to blank/null.

Existence

  • BLANK() - returns the blank/null sentinel.

Blank checks should use equality against BLANK(), for example:

field = BLANK()

Do not invent separate blank-check helpers unless a later spec adds them.

Text

  • CONCATENATE(text1, text2, ...) - also expressible with &
  • UPPER(text)
  • LOWER(text)
  • TRIM(text)
  • LEN(text)

Numeric

  • ROUND(value, precision) — Target; not yet evaluated. Rounds halves away from zero (Airtable semantics: -2.5 → -3, 33.335 at precision 2 → 33.34); precision defaults to 0, and an unanswered argument leaves the result unknown rather than failing it. The collection item_sum rule (DSL spec → Collections) takes the same definition. A mention-language condition evaluator carried this until 2026-09-25, when it was retired unused; conditionality is to be designed once under GB-279.
  • MAX(n1, n2, ...) — Target; not yet evaluated.
  • MIN(n1, n2, ...) — Target; not yet evaluated.

Date

  • TODAY()
  • DATEADD(date, count, units) - units are "days", "months", and "years"
  • DATETIME_DIFF(date1, date2, units)

Full date-format expressions such as DATETIME_FORMAT(date, format_string) are not part of MVP expression evaluation. The closed @ modifier set does not include date formatting; date presentation is owned by the field type and renderer.

Count

  • COUNT(value) - count of items in a collection or object-like value.

COUNT is the MVP count function. It is used for computed count fields and conditions:

data:
  children|Collection[]:
    item:
      legal_name|PersonLegalName!:
  children_count|count: = COUNT(@data.children)

blocks:
  multiple_children_clause:
    flow:
      condition: COUNT(data.children) > 1

Out Of Scope

List-to-scalar functions are not part of MVP. For list prose, use block-level joinFor with sibling intro and outro blocks; see Template syntax.

Arbitrary JavaScript, mutation-producing expressions, regular expressions, and general collection projection helpers are also out of scope for MVP.

References

Any field mention in a computed expression uses the same @data.field (or cross-module @module.data.field) form as a flow condition. On save it binds to the field's stable fld_ identity while retaining the handle as a readable hint. Renaming a field therefore updates the expression's authored projection instead of orphaning it. Plain handles such as COUNT(children) are legacy source and do not create a binding.

On this page