One language for column, row, business and display rules, with functions and examples.
columnone value: iban_valid(iban) · matches(postcode, country_pattern(country)) · in_list(uom, 'UOM')rowone record: address.country = region.country · has(screening) when has(bank)businessacross rows and tables: sum(open_po.value where supplier = this) <= credit_limitdisplayper cell: late_rate > 0.05 → style(amber, icon: warning, note: late_count)rule R-118 "open POs under credit limit" on golden.supplier when sum(bed.purchase_order_line.open_value where supplier_source_key in xref(this)) > this.credit_limit severity block_payment action task(owner: this.buyer, reason: "over cap by " + format(over)) schedule daily 08:00; on change of credit_limit
A rule shows the rows it would flag before it is saved; the tester's rows are kept with the rule version. Rules run on save, on schedule, on demand and as gates; results are stored with the rule version and the rows judged.