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:
- Parentheses
() *,/+,-,&=,!=,>,>=,<,<=
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.335at precision 2 →33.34);precisiondefaults to0, and an unanswered argument leaves the result unknown rather than failing it. The collectionitem_sumrule (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) > 1Out 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.
DSL Agent Spec
Short-form Goldiblocks authoring DSL reference. This page is the canonical source for the bundled dsl_spec.md in each skill document folder.
Documents, Modules, and Blocks
Author's-eye view of the YAML/Markdown shape — module file layout, ingestion guidance, and pointers to the schema reference