Generated from the shipped JSON Schemas — the ones the loader, the editors, and the linter share — on every refresh, so this page cannot drift from what the framework accepts. One document = one file in the app tree, and each kind has its own schema: routes under web/ and consume/, jobs under batch/, views beside the route they serve.
Schema for TesseraQL route documents: web//.yml, queue consumers under consume/, and the mcp/ kinds, which reuse the route model.
| Property |
Type |
Description |
version * |
const tesseraql/v1 |
The document format version. Always tesseraql/v1. |
id * |
string, min length 1 |
Unique document id, e.g. products.page; referenced by tests, coverage, governance approvals, and logs. |
kind * |
enum: route | tool | resource | ui | prompt |
route (web/, consume/) and the mcp/ kinds tool/resource/ui/prompt, which reuse the route model. |
recipe |
enum: query-json | command-json | query-html | page | query-export | file-import | file-export | webhook | queue-consume | prompt-text |
What the route does: query-json/command-json (JSON APIs), query-html/page (HTML pages), query-export/file-import/file-export (file transfers), webhook (inbound webhooks), queue-consume (consume/** documents), and prompt-text (an mcp/ prompt document, which renders its message from a route like every other mcp kind). |
input |
map of inputField |
Declared input fields - one contract for routes and jobs alike (a job’s parameters bind and validate exactly like a route’s). Documented in app-layout.md and jobs.md. |
inputPolicy |
object |
Route-level input handling policy (e.g. unknown-field behavior) layered over the deny-by-default input: contract. |
security |
object |
How this document authenticates and authorizes. Routes are deny-by-default: one that declares no security is unreachable. Documented in authentication.md. |
idempotency |
object |
Idempotent replay for commands. A replayed key returns the stored response; a reused key with a different body is TQL-IDEM-4221 (422), and a reuse while the first request runs is TQL-IDEM-4090 (409). Documented in transactional-writes.md. |
lock |
any |
Optimistic locking for this command route: the column whose value the caller must send back unchanged for the write to apply. Written as the bare column (lock: version) or as a block naming its type (lock: { column: version, type: integer }) - a form value always arrives as a string, so an untyped lock on a numeric column cannot be compared. The framework only compares it, through the lock directive the authored statement carries in its WHERE, and never advances it: the statement’s own SET list does that. A stale save is TQL-SQL-4094 (409); a request carrying neither _lock nor _overwrite is TQL-FIELD-2011 (400). |
admission |
object |
Admission policy for this route: concurrency, rate limiting, and the execution lane. Documented in productivity.md (admission) and jobs.md (lanes). |
outbox |
object |
Transactional outbox event recorded with the command and delivered at-least-once after commit. Documented in notifications.md and messaging.md. |
steps |
array of object |
The command’s ordered statements, executed inside one transaction (command recipes). Each item carries an id: and one binding arm; each result binds under steps.<id>. Documented in transactional-writes.md. |
sources |
map of binding |
Every named read acquisition, in authored order: each entry names its own mechanism (sql | contract | service | http) and publishes rows/rowCount/first under its name, so a response, a view or a later source refers to one without knowing how it was fetched. Documented in unified-sources.md. |
validate |
map of object |
Declarative validation rules keyed by rule id. A rule declares exactly one of rule: (a cross-field expression), file: (validation SQL), or use: (a shared rule declared under rules/). Honored on command-json, query-json and webhook routes, on queue consumers, and on MCP tools. |
decide |
map of object |
Decision-table references keyed by alias, evaluated once per operation before the validate: rules; outputs publish as decision.. |
notify |
map of notification |
Notifications enqueued with the command on the transactional outbox, keyed by notification id; each entry names its channel: (a workflow reminder is the separate reminders: key). Documented in notifications.md. |
errors |
object |
Per-route error mapping: constraint codes and statuses onto response fields and messages. Documented in declarative-validation.md. |
import |
object |
file-import parsing and column-to-bind mapping (headerRow, startRow, columns, onError: rollback|skip). It says how to parse, never what to write: the per-row statement is the document’s one steps:/pipeline: entry. Documented in file-transfers.md. |
export |
object |
query-export / file-export output: format (csv, excel, pdf), filename, columns with headers and format patterns, locale/timezone. It says how the rows are written and never what to read - the rows come from sources.main on a route, or the step’s own arm in a pipeline. Documented in file-transfers.md. |
webhook |
object |
Inbound webhook verification and payload mapping for a webhook route. Documented in connectors.md. |
publish |
object |
The domain event this command publishes on a messaging channel after commit, on the same transactional outbox as notify:. Documented in messaging.md. |
consume |
object |
What a consume/** document subscribes to. Documented in messaging.md. |
response |
object |
How the result becomes an HTTP response: JSON, HTML, a redirect, a stream, or a rendered file. Documented in response-shaping.md. |
pagination |
object |
Declarative pagination: the framework appends the dialect clause; authored SQL carries no LIMIT/FETCH. |
datasource |
string |
The named connector under tesseraql.datasources the route’s SQL runs on, defaulting to main. The name must be declared (TQL-YAML-1035); a non-main route cannot declare notify:/publish:/outbox: or sequence allocation - they ride the main connector (TQL-YAML-1036). |
cache |
object |
Declarative HTTP caching for query responses (docs/response-shaping.md): Cache-Control from maxAge/visibility (private default; public lints onto auth: public only) and a content ETag answering If-None-Match with 304. Query recipes only (TQL-YAML-1025). |
emit |
any |
Topic(s) broadcast to live views after this route’s write commits (docs/realtime.md): a command-json command at its commit, a file-import when its background import’s transaction commits. A name is lowercase dot/dash-separated segments; the event carries the topic name only, never data. |
invalidates |
any |
Source table(s) whose code catalogs this command’s write makes stale (docs/lookups.md). Named by table, not by catalog: a maintenance screen for a shared code master writes a row whose kind is request data, so which catalog is affected is not known until the write happens. Dropped after the commit, so a rollback invalidates nothing. |
Route-level input handling policy (e.g. unknown-field behavior) layered over the deny-by-default input: contract.
| Property |
Type |
Description |
unknownFields |
enum: reject | ignore |
How to treat request fields with no declared input: reject (default) or ignore. |
readOnlyFieldBehavior |
enum: reject | ignore | warn |
How to treat declared but non-writable fields when present: reject (default), ignore, or warn. |
How this document authenticates and authorizes. Routes are deny-by-default: one that declares no security is unreachable. Documented in authentication.md.
| Property |
Type |
Description |
auth |
enum: bearer | browser | api-key | mtls | public |
bearer | browser | api-key | mtls | public (deny-by-default: no auth means no access to protected data). |
policy |
string |
A policy id under tesseraql.security.policies. |
csrf |
enum: auto | required | off |
CSRF posture: auto (browser state-changing routes are protected), required, or off - one enum here and in security.defaults rules alike. |
Idempotent replay for commands. A replayed key returns the stored response; a reused key with a different body is TQL-IDEM-4221 (422), and a reuse while the first request runs is TQL-IDEM-4090 (409). Documented in transactional-writes.md.
| Property |
Type |
Description |
required |
boolean |
Whether a key is required on this command - the Idempotency-Key header, or the _idempotency hidden field a rendered form echoes. |
scope |
string |
The replay scope key (default: the route id). |
ttl |
string |
How long a stored response replays (duration string, default 24h). |
Admission policy for this route: concurrency, rate limiting, and the execution lane. Documented in productivity.md (admission) and jobs.md (lanes).
| Property |
Type |
Description |
concurrency |
object |
Bound on how many of this route’s requests run at once. |
rateLimit |
object |
Token-bucket rate limit for this route. |
lane |
string |
The execution lane this route runs on (tesseraql.lanes). |
Bound on how many of this route’s requests run at once.
| Property |
Type |
Description |
maxInFlight |
integer |
Maximum requests of this route in flight at once; excess is rejected. |
Token-bucket rate limit for this route.
| Property |
Type |
Description |
requestsPerSecond |
integer |
Sustained requests per second allowed; excess is refused with 429. |
burst |
integer |
Burst capacity (default: requestsPerSecond). |
scope |
enum: node | cluster |
node (default) limits per runtime node; cluster coordinates through the shared lease store (TQL-YAML-1023). |
Transactional outbox event recorded with the command and delivered at-least-once after commit. Documented in notifications.md and messaging.md.
| Property |
Type |
Description |
eventType |
string |
The event’s type, e.g. USER_DISABLED — what a consumer subscribes by. |
aggregateType |
string |
The kind of thing the event is about, e.g. User. |
aggregateId |
string |
A bindable path resolving to the id of the thing the event is about, e.g. body.name. |
payload |
map of string |
Each payload key to the bindable path supplying its value. A dotted key builds a nested object (name.givenName) and a [] key builds an array — of scalars (members[]), or, zipped by index, of objects (members[].value). |
delay |
string |
Hold this entry back this long after the commit, e.g. 72h. Exclusive with deliverAt: (TQL-BATCH-5317). Documented in notifications.md. |
deliverAt |
string |
Hold this entry back until the instant this bindable path resolves to. Exclusive with delay: (TQL-BATCH-5317). Documented in notifications.md. |
| Property |
Type |
Description |
sql |
object |
The SQL arm: a colocated 2-way SQL file and how it is run. The keys of the mechanism nest inside the arm that owns them, so there is nowhere to write a call’s select: on a statement and no lint has to say it is wrong. |
contract |
object |
The contract arm: a statement the identity schema owns, called by name. It reads or writes like any other statement, so it carries the same mode, params and expect. |
service |
object |
The service arm: a runtime provider answering rows from process state. It takes only its arguments — there is no statement to run, so no mode and no row-count expectation. |
http |
object |
The http arm: an outbound call whose response becomes this binding’s rows, in the vocabulary every outbound call shares. Rides the outbound gateway — allow-listed hosts, named credentials, timeouts, and a per-host circuit breaker. |
sequence |
string |
Allocate the next value of a managed document-number sequence instead of running a statement; it binds as steps.<id>.value. It has no body beyond its name, which is why it sits beside the arms rather than being one. Documented in transactional-writes.md. |
spool |
string |
A context path resolving to an earlier step’s spool reference (steps.<id>.spool), read as this binding’s rows. A chunk reader declares it instead of sql: to load what another step extracted — from another connector, or from an API — because a spool is a spool whoever filled it. Documented in jobs.md. |
when |
string |
Guard expression on a step: a falsy guard skips it, recording steps.<id>.skipped instead of a result. A guard is about whether the step runs at all, not a question for the mechanism, so it sits beside the arm. The declared branch point for decision.* outputs (docs decision-tables). |
enrich |
map of enrichment |
Keyed references folded into this binding’s rows before anything reads them (docs/lookups.md), keyed by enrichment name and applied in authored order. An enrichment nests under the source it transforms, so any arm’s rows can be enriched. Each entry names one reference — sql: (fetch by key), http: (call by key), or source: (a result already in the context, joined without a fetch, named by its context path: a route source by name, a job step as steps.<id>) — plus the on: join and one of as:/merge:. Only a binding that holds rows can carry one: a write publishes affectedRows, and a query-spool extract never held its rows. |
id * |
string |
The step’s name: what later steps and the response bind against (steps.<id>). |
The SQL arm: a colocated 2-way SQL file and how it is run. The keys of the mechanism nest inside the arm that owns them, so there is nowhere to write a call’s select: on a statement and no lint has to say it is wrong.
| Property |
Type |
Description |
file |
string |
A colocated 2-way SQL file, relative to the declaring document (must exist; TQL-SQL-2103). This arm’s acquisition target, the role url plays for http. |
mode |
string |
How the statement runs and what it binds: query (rows), query-one (a single row), update (an affected-row count), query-spool (rows streamed to a spool a later chunk: step reads, never held), or call (a stored call on a command step, its OUT parameters declared under out:). |
params |
map of string |
Each bind name to the bindable path supplying its value, such as path.id, params.unit or principal.claim.tenant_id. |
keys |
array of string |
Columns whose database-generated values are captured after an insert; they bind as steps.<id>.keys.<column>. |
out |
map of string |
The OUT parameters of a mode: call statement on a command step: each name to its JDBC type keyword (varchar, numeric, integer, bigint, boolean, date, timestamp, double). The statement binds them as out.<name> bind sites and the values publish as steps.<id>.out.<name>. Documented in transactional-writes.md. |
timeoutSeconds |
integer ≥ 0 |
Per-binding SQL statement timeout override; 0 disables. Default: tesseraql.sql.timeoutSeconds, else 30s. |
datasource |
string |
The named connector this read runs on, overriding the document’s. Legal on a read only: a batch step owns its own transaction so an extract elsewhere splits nothing, while a write on another connector would be a second transaction nothing owns (TQL-YAML-1037). |
materialize |
object |
Bounds on how much of the result is held in memory. |
expect |
object |
The row count this statement must affect, and what happens when it does not — the declarative optimistic-locking check on an update or delete. |
Bounds on how much of the result is held in memory.
| Property |
Type |
Description |
maxRows |
integer |
Largest number of rows materialized. Default: tesseraql.resultMaterialization.maxRows. |
onOverflow |
string |
fail (the default) refuses a result past maxRows; warn truncates it and logs. |
The row count this statement must affect, and what happens when it does not — the declarative optimistic-locking check on an update or delete.
| Property |
Type |
Description |
rowCount |
integer |
The exact number of rows the statement must affect (rows is a list of records everywhere else). |
onMismatch |
string |
conflict (the default) answers 409, so a stale edit is refused honestly; error answers 500. |
The contract arm: a statement the identity schema owns, called by name. It reads or writes like any other statement, so it carries the same mode, params and expect.
| Property |
Type |
Description |
name |
string |
The named IAM SQL contract to execute instead of a colocated file, so an app reuses the identity schema’s statements. Documented in authentication.md. |
mode |
string |
How the contract runs and what it binds, exactly as it means on the sql arm. |
params |
map of string |
Each bind name to the bindable path supplying its value, such as path.id, params.unit or principal.claim.tenant_id. |
expect |
object |
The row count this statement must affect, and what happens when it does not — the declarative optimistic-locking check on an update or delete. |
materialize |
object |
Bounds on how much of the result is held in memory. Declared here so a contract that legitimately returns more than the app-wide budget says so on the binding, rather than an application raising the budget for every route, command and export at once. |
timeoutSeconds |
integer ≥ 0 |
Per-binding SQL statement timeout override; 0 disables. Default: tesseraql.sql.timeoutSeconds, else 30s. |
The row count this statement must affect, and what happens when it does not — the declarative optimistic-locking check on an update or delete.
| Property |
Type |
Description |
rowCount |
integer |
The exact number of rows the statement must affect (rows is a list of records everywhere else). |
onMismatch |
string |
conflict (the default) answers 409, so a stale edit is refused honestly; error answers 500. |
Bounds on how much of the result is held in memory. Declared here so a contract that legitimately returns more than the app-wide budget says so on the binding, rather than an application raising the budget for every route, command and export at once.
| Property |
Type |
Description |
maxRows |
integer |
Largest number of rows materialized. Default: tesseraql.resultMaterialization.maxRows. |
onOverflow |
string |
fail (the default) refuses a result past maxRows; warn truncates it and logs. |
The service arm: a runtime provider answering rows from process state. It takes only its arguments — there is no statement to run, so no mode and no row-count expectation.
| Property |
Type |
Description |
name |
string |
The named runtime service provider to call instead of running SQL (docs/extending.md): non-SQL runtime state (lanes, traces, file trees, …) read as rows. |
params |
map of string |
Each bind name to the bindable path supplying its value, such as path.id, params.unit or principal.claim.tenant_id. |
The http arm: an outbound call whose response becomes this binding’s rows, in the vocabulary every outbound call shares. Rides the outbound gateway — allow-listed hosts, named credentials, timeouts, and a per-host circuit breaker.
| Property |
Type |
Description |
method |
string |
The HTTP method. Default GET; a source is not restricted to GET, because JSON-RPC, GraphQL and POST …/search batch lookups are reads. |
url |
string |
The absolute http/https URL. Its host must be allow-listed under tesseraql.http.outbound.allowedHosts — egress is deny by default (TQL-SEC-4070). |
headers |
map of string |
Static request headers; values may carry ${…} config or secret placeholders, resolved on send. |
query |
map of string |
Query-string parameters, each a bindable path resolved against the execution context. |
credential |
string |
A named credential the SecretResolver supplies at call time, so a document never carries a secret. |
body |
string |
A bindable path whose value is serialized as the request body. |
expectStatus |
integer |
The exact status that counts as success; the default is any 2xx. A mismatch fails the call without tripping the circuit breaker — it is a deterministic rejection, not a sign the dependency is down. |
connectTimeout |
string |
Connect timeout for this call (e.g. 2s), overriding tesseraql.http.outbound.connectTimeout. |
requestTimeout |
string |
Request timeout for this call (e.g. 10s), overriding tesseraql.http.outbound.requestTimeout. |
retry |
object |
Opt-in retry for transient faults: connect failures, timeouts and 5xx are repeated; a 4xx and an expectStatus mismatch never are. Unstated numbers come from tesseraql.http.outbound.retry. Every repeated attempt counts against the circuit breaker, the sequence ends the moment the host’s circuit opens, and it lives inside a budget of attempts x requestTimeout. Documented in connectors.md. |
select |
string |
A dotted path into the response JSON naming the part that becomes rows. Default: the whole body. |
onError |
string |
fail (default) fails the request or step; empty degrades to zero rows and an error entry, and the page still renders. The degradation is logged and metered — it is not silent. |
readOnly |
boolean |
The author’s assertion that the call has no side effect, required on a command route: the write can roll back and the request cannot. |
mode |
string |
How the acquired rows are delivered: query (default — held and published as rows) or query-spool (streamed to a spool a later chunk: step loads, so an API result can be written to the database without holding it). A call reads, so the SQL write modes are not modes it has. |
Opt-in retry for transient faults: connect failures, timeouts and 5xx are repeated; a 4xx and an expectStatus mismatch never are. Unstated numbers come from tesseraql.http.outbound.retry. Every repeated attempt counts against the circuit breaker, the sequence ends the moment the host’s circuit opens, and it lives inside a budget of attempts x requestTimeout. Documented in connectors.md.
| Property |
Type |
Description |
attempts |
integer ≥ 1 ≤ 10 |
Total attempts including the first (TQL-YAML-1058 outside 1..10). |
backoff |
string |
The wait before the second attempt, e.g. 200ms. |
multiplier |
number ≥ 1 |
The factor the wait grows by before each further attempt. |
| Property |
Type |
Description |
rule |
string |
A cross-field expression that must hold. |
file |
string |
Validation SQL returning one row per violation; must be a SELECT, and runs inside the command’s transaction. |
use |
string |
Name of a shared rule declared under rules/. The reference supplies params: matching the rule’s binds: contract, plus its own field:/when:/code:/message:. |
params |
map of string |
Binds for a SQL rule, as dotted source expressions. |
field |
string |
The input the violation is reported against. |
when |
string |
Guard expression; the rule is skipped when it is falsy. |
code |
string |
Machine-readable violation code. |
message |
string |
Message catalog key. |
| Property |
Type |
Description |
use * |
string |
Name of a decision declared under decisions/. |
params * |
map of string |
Wiring of each decision input to a request-context expression (params.total, principal.orgUnit, “principal.role == ‘officer’”). |
effectiveAt |
string |
Reference instant of a dated table-backed decision’s effective: window - audit.now unless wired to a document date (params.postingDate). |
Per-route error mapping: constraint codes and statuses onto response fields and messages. Documented in declarative-validation.md.
| Property |
Type |
Description |
constraints |
map of object |
Database constraint name, as declared in the schema, to the field-level error a violation of it becomes. |
How one constraint violation is reported.
| Property |
Type |
Description |
field |
string |
The input field the violation is reported against, so the caller sees a field error rather than a 500. |
code |
string |
A stable application error code, defaulting to the violation kind (duplicate for a unique violation). |
message |
string |
A message key resolved through the app bundles; unset, the framework’s tql.constraint.<code> texts apply. |
file-import parsing and column-to-bind mapping (headerRow, startRow, columns, onError: rollback|skip). It says how to parse, never what to write: the per-row statement is the document’s one steps:/pipeline: entry. Documented in file-transfers.md.
| Property |
Type |
Description |
format |
string |
The tabular format the uploaded file is parsed as. csv is built in; excel needs the tesseraql-excel module (TQL-LD-2801 when the codec is absent). |
columns |
array of fileColumn |
How the file’s columns map to the per-row statement’s bind names. Omit it to use the header labels as bind names. |
headerRow |
boolean |
Whether the table starts with a header row (default true). With a header, simple-form columns match by label rather than by position. |
startRow |
integer ≥ 1 |
The 1-based row the table starts at, for files carrying title rows above the data (default 1). |
sheet |
string |
For workbook formats, the sheet to read (default: the first). |
locale |
string |
The locale type:/format: columns parse dates and numbers in. A literal, or a request source such as principal.claim.locale; unset, tesseraql.files.locale applies. |
onError |
string |
What a failing row does: rollback (default) fails the whole import, skip records the row and commits the rest. Either way the rejected rows are reported with their row numbers. |
review |
enum: required |
required splits the import in two (docs/csv-import.md): the upload parses, validates and parks the batch without writing anything, answering a report and a confirm token, and a second request commits exactly what was reviewed. Absent means the one-shot import. Only a route may declare it — a poll-driven import job has nobody to confirm (TQL-YAML-1060). |
query-export / file-export output: format (csv, excel, pdf), filename, columns with headers and format patterns, locale/timezone. It says how the rows are written and never what to read - the rows come from sources.main on a route, or the step’s own arm in a pipeline. Documented in file-transfers.md.
| Property |
Type |
Description |
format |
string |
The format the rows are written as. csv is built in; excel and pdf need their modules (TQL-LD-2801 when the codec is absent). |
filename |
string |
The download filename, defaulting to the document id plus the format’s extension. {dotted.path} interpolates a context value, and a splitBy: export must carry {key}. |
template |
string |
A workbook or print template colocated with the document: an .xlsx for excel, an .html for pdf. A path that does not exist fails the build rather than quietly writing a plain grid. |
sheet |
string |
For workbook formats, the sheet to write. |
startCell |
string |
Placement mode: where data rows start in the template, e.g. B5. Refused without a template (TQL-YAML-1041), and refused on pdf (TQL-YAML-1005) — a page lays out through its template, not through cell positions. |
columns |
array of fileColumn |
The columns written, in order, with their headings and format patterns. Omit it to write every column the rows carry, under its own name. |
locale |
string |
The locale date and number patterns render in. A literal, or a request source such as principal.claim.locale, so the requesting user decides; unset, tesseraql.files.locale applies. A job has no request, so a step’s is a literal. |
timezone |
string |
The zone date and time values render in, with the same literal / request-source / tesseraql.files.timezone fallback as locale. |
after |
object |
A statement run once after the extraction, typically to mark the extracted rows. file-export only: on query-export it is a build error (TQL-CAMEL-3101), because a synchronous download has no transaction to hang it on. |
maxRows |
integer |
The ceiling for a format that holds every row before it writes (pdf, and the workbook template modes), defaulting to tesseraql.resultMaterialization.maxRows; a negative value opts out. A streaming format is never capped. |
onOverflow |
string |
fail (default) refuses an export past maxRows (TQL-LD-2850); warn truncates it at the cap and logs. |
groupBy |
string |
A column the rows are read as ordered groups by, each exposed to the template as a key and its own rows. The rows must be ordered by it (TQL-LD-2851). |
splitBy |
string |
A column that splits the export into one document per value, delivered as a single ZIP; filename: must carry {key}. The rows must be ordered by it (TQL-LD-2851). |
A statement run once after the extraction, typically to mark the extracted rows. file-export only: on query-export it is a build error (TQL-CAMEL-3101), because a synchronous download has no transaction to hang it on.
| Property |
Type |
Description |
timing |
string |
extract (default) runs the statement in the extraction’s transaction, so rows are marked exactly when they are extracted; download runs it once on the first successful file fetch. A job’s export step supports extract only (TQL-YAML-1041). |
sql |
object |
The follow-up statement, written as a source’s sql: arm is — file:, params:, and the rest of the arm’s keys. |
Inbound webhook verification and payload mapping for a webhook route. Documented in connectors.md.
| Property |
Type |
Description |
provider |
string |
A verifier under tesseraql.connectors.webhooks (an unknown provider fails the build). |
The domain event this command publishes on a messaging channel after commit, on the same transactional outbox as notify:. Documented in messaging.md.
| Property |
Type |
Description |
channel |
string |
The declared messaging channel to publish on. |
topic |
string |
The topic the event is published under. |
key |
string |
Ordering key for the event, as a bindable path; messages sharing a key keep their relative order. |
payload |
map of string |
The event body: each property name to the bindable path supplying its value. |
delay |
string |
Hold this entry back this long after the commit, e.g. 72h. Exclusive with deliverAt: (TQL-BATCH-5317). Documented in notifications.md. |
deliverAt |
string |
Hold this entry back until the instant this bindable path resolves to. Exclusive with delay: (TQL-BATCH-5317). Documented in notifications.md. |
What a consume/** document subscribes to. Documented in messaging.md.
| Property |
Type |
Description |
channel |
string |
The declared messaging channel to consume from. |
topic |
string |
The topic this consumer subscribes to. |
idempotencyKey |
string |
A bindable path over the message whose value de-duplicates redeliveries, so an at-least-once channel applies each message once. |
How the result becomes an HTTP response: JSON, HTML, a redirect, a stream, or a rendered file. Documented in response-shaping.md.
| Property |
Type |
Description |
json |
object |
The JSON response: status, body, per-field policy, and nested composition. |
html |
object |
The HTML response: a template or a view, its model, the status, and headers. |
stream |
object |
Stream the generated file back as the response body (query-export). Documented in file-transfers.md. |
redirect |
object |
Answer with a redirect instead of a body — the usual close of a browser form post. |
file |
object |
Render a template into a file and answer with it as a download. |
text |
object |
Render a template and answer with the text itself — the message a prompt-text recipe returns from prompts/get. It is file: without filename:/contentType:, which a message has nowhere to put. Documented in app-mcp.md. |
onError |
object |
How an error response reaches htmx, so a failed submit lands in the right place instead of replacing the page. Documented in response-shaping.md. |
session |
object |
Browser-session handling for the response (docs/authentication.md). |
The JSON response: status, body, per-field policy, and nested composition.
| Property |
Type |
Description |
status |
integer ≥ 100 ≤ 599 |
The status answered on success (default 200; a create conventionally declares 201). |
body |
any |
What the response body is: a bindable path such as rows or steps.<name>, or a literal shape composing several. |
fields |
map of fieldPolicy |
Per-field visibility, masking, and classification applied to the body. Documented in data-scoping.md. |
statusWhen |
statusWhen |
Conditional statuses: the first entry whose expression matches decides the status. |
The HTML response: a template or a view, its model, the status, and headers.
| Property |
Type |
Description |
status |
integer ≥ 100 ≤ 599 |
The status answered on success (default 200). |
template |
string |
The Thymeleaf template to render, relative to the app template root (exclusive with view:). |
view |
string |
The id of a *.view.yml document (exclusive with template:). |
shell |
enum: auto | always | never |
Shell negotiation: auto (default) serves the bare #page-content region to htmx requests and the shell-wrapped page to direct navigation; always wraps unconditionally; never declares an htmx-only region endpoint. |
views |
array of string |
View ids whose models a template: route binds; each renders into views[‘’] for the template to insert (illegal alongside view:). |
model |
object |
Extra model entries for the template: each name to the bindable path supplying it. |
headers |
object |
Response headers to set, merged over the app-wide responseHeaders defaults. |
headersWhen |
map of string |
Conditional response headers: the first entry whose expression matches decides the headers. |
statusWhen |
statusWhen |
Conditional statuses: the first entry whose expression matches decides the status. |
Stream the generated file back as the response body (query-export). Documented in file-transfers.md.
| Property |
Type |
Description |
filename |
string |
The download filename offered to the client, as a literal or a bindable path. |
Answer with a redirect instead of a body — the usual close of a browser form post.
| Property |
Type |
Description |
status |
integer ≥ 300 ≤ 399 |
The redirect status; declare 303 after a command so the browser follows with GET. |
location * |
string |
Where to redirect, as a literal path or a bindable path. The sentinel back follows the request’s validated _return field - the list a page-frame row link came from - falling back to the application root. |
Render a template into a file and answer with it as a download.
| Property |
Type |
Description |
status |
integer |
The status answered on success (default 200). |
template * |
string |
The template rendered into the file. |
contentType |
string |
The Content-Type of the produced file. |
filename |
string |
The download filename offered to the client, as a literal or a bindable path. |
model |
object |
Extra model entries for the template: each name to the bindable path supplying it. |
Render a template and answer with the text itself — the message a prompt-text recipe returns from prompts/get. It is file: without filename:/contentType:, which a message has nowhere to put. Documented in app-mcp.md.
| Property |
Type |
Description |
status |
integer |
The status answered on success (default 200). |
template * |
string |
The template rendered into the message, in Thymeleaf TEXT mode. |
model |
object |
Extra model entries for the template: each name to the bindable path supplying it. |
How an error response reaches htmx, so a failed submit lands in the right place instead of replacing the page. Documented in response-shaping.md.
| Property |
Type |
Description |
retarget |
string |
The element an error response replaces, instead of the request target. |
reswap |
string |
The htmx swap style an error response uses (for example outerHTML). |
Browser-session handling for the response (docs/authentication.md).
| Property |
Type |
Description |
rotate |
boolean |
Re-issue the caller’s session cookie in place on success: a fresh id and CSRF token, the old id invalidated before the response leaves. Declare on routes that elevate the session (confirming an MFA enrollment); bearer or public callers are untouched. |
Declarative pagination: the framework appends the dialect clause; authored SQL carries no LIMIT/FETCH.
| Property |
Type |
Description |
strategy |
enum: offset | keyset | snapshot |
offset (the default) pages by row offset; keyset pages by the by: cursor column and stays stable while rows are inserted; snapshot freezes a work queue’s membership at search time as row tokens the page carries - requires the view’s key:, and the authored SQL binds the page’s keys IN-list. |
cap |
integer ≥ 1 |
The snapshot membership cap (default 500): a search whose hits exceed it answers 422 rather than truncating. Only legal on strategy: snapshot. |
size |
integer ≥ 1 |
Page size used when the request does not ask for one. |
maxSize |
integer ≥ 1 |
Largest page size a request may ask for; a larger request is clamped. |
count |
boolean |
Also run a count query so the response carries the total row count. |
by |
any |
The keyset cursor column, or an ordered list for a composite cursor: the next cursor becomes one opaque row token, decoded back into params.after. parts for the authored tuple predicate. |
Declarative HTTP caching for query responses (docs/response-shaping.md): Cache-Control from maxAge/visibility (private default; public lints onto auth: public only) and a content ETag answering If-None-Match with 304. Query recipes only (TQL-YAML-1025).
| Property |
Type |
Description |
maxAge |
string |
How long a client may reuse the response (duration string such as 30s or 5m). |
visibility |
enum: private | public |
private (the default) lets only the client cache the response; public permits shared caches and lints onto auth: public routes only. |
etag |
boolean |
Hash the rendered body and answer If-None-Match with 304 (default true). |
staleWhileRevalidate |
string |
How long a stale response may still be served while it revalidates (duration string). |
Schema for TesseraQL batch job documents (batch/**/job.yml): how the job is triggered, what it runs, and the deadlines it is watched against.
| Property |
Type |
Description |
version * |
const tesseraql/v1 |
The document format version. Always tesseraql/v1. |
id * |
string, min length 1 |
Unique document id, e.g. products.page; referenced by tests, coverage, governance approvals, and logs. |
kind * |
const job |
Batch job documents (batch/**/job.yml). |
recipe |
enum: batch-pipeline |
What the job does: batch-pipeline runs an ordered pipeline: of steps. |
datasource |
string |
The named connector under tesseraql.datasources the route’s SQL runs on, defaulting to main. The name must be declared (TQL-YAML-1035); a non-main route cannot declare notify:/publish:/outbox: or sequence allocation - they ride the main connector (TQL-YAML-1036). |
trigger |
object |
How a job starts (kind: job): a schedule, or a directory/SFTP/FTPS poll source feeding the import: pipeline. Documented in jobs.md and connectors.md. |
input |
map of inputField |
Declared input fields - one contract for routes and jobs alike (a job’s parameters bind and validate exactly like a route’s). Documented in app-layout.md and jobs.md. |
pipeline |
array of object |
The job’s ordered steps. A step is a binding with an id (sql: or http:) plus its output blocks (export:, push:, notify:) or a chunk:, each publishing its result to the step context. Documented in jobs.md. |
perTenant |
boolean |
Run this job once per configured tenant, each on its own datasource and tenant context (kind: job). Documented in multi-tenancy.md. |
import |
object |
file-import parsing and column-to-bind mapping (headerRow, startRow, columns, onError: rollback|skip). It says how to parse, never what to write: the per-row statement is the document’s one steps:/pipeline: entry. Documented in file-transfers.md. |
overlap |
enum: skip | concurrent |
What a firing does while the previous execution still runs (kind: job): skip (default) records a SKIPPED execution naming the running one; concurrent runs anyway - declare it only for jobs that are safe to overlap. Documented in jobs.md. |
sla |
object |
Deadline expectations a periodic managed check alerts on through the alerts channel (kind: job) - alert-only, nothing is killed. Documented in jobs.md. |
How a job starts (kind: job): a schedule, or a directory/SFTP/FTPS poll source feeding the import: pipeline. Documented in jobs.md and connectors.md.
| Property |
Type |
Description |
schedule |
object |
Fire the job on a clock: a cron expression or a fixed delay, optionally filtered by a business-day calendar. |
poll |
object |
Fire the job when files arrive: a local directory, SFTP, or FTPS source feeding the job’s import pipeline. |
after |
string |
Light chaining: fire when the named job’s execution completes successfully in the same app, carrying its business date. Documented in jobs.md. |
Fire the job on a clock: a cron expression or a fixed delay, optionally filtered by a business-day calendar.
| Property |
Type |
Description |
cron |
string |
A Quartz cron expression; firings are claimed cluster-wide so one node runs each. |
fixedDelay |
string |
A period (duration string, e.g. 5m); mutually exclusive with cron. |
calendar |
string |
A business-day calendar declared under calendars/ - the cron says when to consider a firing, the calendar says whether it counts. Documented in jobs.md. |
runOn |
enum: business-day | first-business-day-of-month | last-business-day-of-month |
Which considered firings count under the calendar (default business-day); mutually exclusive with dayOfMonth. |
dayOfMonth |
integer ≥ 1 ≤ 31 |
The shifted nominal-day rule: fire on this day of month, or its shifted business day when it is not one - and the run’s business date is the nominal date. Rounds down to the month’s last day. Documented in jobs.md. |
shift |
enum: next-business-day | previous-business-day |
Where a non-business nominal day moves (default next-business-day); requires dayOfMonth. |
Fire the job when files arrive: a local directory, SFTP, or FTPS source feeding the job’s import pipeline.
| Property |
Type |
Description |
transport |
enum: local | sftp | ftps |
local (default) polls a directory under connectors.poll.allowedPaths; sftp/ftps poll a remote host in connectors.poll.allowedHosts. |
host |
string |
The remote host to poll; required for sftp and ftps, and it must be listed in connectors.poll.allowedHosts. |
port |
integer |
The remote port; defaults to the transport’s standard port. |
path |
string |
The polled directory. A local path must sit under a declared allowedPaths root. A remote path with a leading slash is absolute on the server; without one it resolves against the credential’s login home. |
credential |
string |
A named credential under tesseraql.connectors.poll.credentials (required for remote sources). |
include |
string |
An ant-style filename filter, e.g. *.csv. |
delay |
string |
Poll interval (duration string). |
move |
string |
Relative directory for processed files (default .done). Plain names only - no paths or placeholders. |
moveFailed |
string |
Relative directory for failed files (default .error). Plain names only. |
consumeOnce |
boolean |
Consume each file once across every replica, arbitrated through a shared store. Off by default. The read lock a poll consumer carries is a write-stability check, and on sftp/ftps there is no server-side exclusion at all, so without this every replica imports every file. Turning it on also means a partner re-sending a byte-identical file is skipped while connectors.poll.consumedRetention has not lapsed. |
| Property |
Type |
Description |
sql |
object |
The SQL arm: a colocated 2-way SQL file and how it is run. The keys of the mechanism nest inside the arm that owns them, so there is nowhere to write a call’s select: on a statement and no lint has to say it is wrong. |
contract |
object |
The contract arm: a statement the identity schema owns, called by name. It reads or writes like any other statement, so it carries the same mode, params and expect. |
service |
object |
The service arm: a runtime provider answering rows from process state. It takes only its arguments — there is no statement to run, so no mode and no row-count expectation. |
http |
object |
The http arm: an outbound call whose response becomes this binding’s rows, in the vocabulary every outbound call shares. Rides the outbound gateway — allow-listed hosts, named credentials, timeouts, and a per-host circuit breaker. |
sequence |
string |
Allocate the next value of a managed document-number sequence instead of running a statement; it binds as steps.<id>.value. It has no body beyond its name, which is why it sits beside the arms rather than being one. Documented in transactional-writes.md. |
spool |
string |
A context path resolving to an earlier step’s spool reference (steps.<id>.spool), read as this binding’s rows. A chunk reader declares it instead of sql: to load what another step extracted — from another connector, or from an API — because a spool is a spool whoever filled it. Documented in jobs.md. |
when |
string |
Guard expression on a step: a falsy guard skips it, recording steps.<id>.skipped instead of a result. A guard is about whether the step runs at all, not a question for the mechanism, so it sits beside the arm. The declared branch point for decision.* outputs (docs decision-tables). |
enrich |
map of enrichment |
Keyed references folded into this binding’s rows before anything reads them (docs/lookups.md), keyed by enrichment name and applied in authored order. An enrichment nests under the source it transforms, so any arm’s rows can be enriched. Each entry names one reference — sql: (fetch by key), http: (call by key), or source: (a result already in the context, joined without a fetch, named by its context path: a route source by name, a job step as steps.<id>) — plus the on: join and one of as:/merge:. Only a binding that holds rows can carry one: a write publishes affectedRows, and a query-spool extract never held its rows. |
id * |
string |
The step’s name: what later steps bind against (steps.<id>) and what the execution record reports. |
notify |
notification |
One notification enqueued on the transactional outbox, so it is sent if and only if the write commits. Documented in notifications.md. |
chunk |
chunk |
Restartable per-row processing: a reader, a writer, and committed checkpoints, so a job that stops resumes where it left off instead of starting over. Documented in jobs.md. |
export |
object |
query-export / file-export output: format (csv, excel, pdf), filename, columns with headers and format patterns, locale/timezone. It says how the rows are written and never what to read - the rows come from sources.main on a route, or the step’s own arm in a pipeline. Documented in file-transfers.md. |
push |
push |
Delivery of a produced transfer to a local or remote drop — the outbound mirror of the poll trigger, under the same policy block. Documented in file-transfers.md. |
The SQL arm: a colocated 2-way SQL file and how it is run. The keys of the mechanism nest inside the arm that owns them, so there is nowhere to write a call’s select: on a statement and no lint has to say it is wrong.
| Property |
Type |
Description |
file |
string |
A colocated 2-way SQL file, relative to the declaring document (must exist; TQL-SQL-2103). This arm’s acquisition target, the role url plays for http. |
mode |
string |
How the statement runs and what it binds: query (rows), query-one (a single row), update (an affected-row count), query-spool (rows streamed to a spool a later chunk: step reads, never held), or call (a stored call on a command step, its OUT parameters declared under out:). |
params |
map of string |
Each bind name to the bindable path supplying its value, such as path.id, params.unit or principal.claim.tenant_id. |
keys |
array of string |
Columns whose database-generated values are captured after an insert; they bind as steps.<id>.keys.<column>. |
out |
map of string |
The OUT parameters of a mode: call statement on a command step: each name to its JDBC type keyword (varchar, numeric, integer, bigint, boolean, date, timestamp, double). The statement binds them as out.<name> bind sites and the values publish as steps.<id>.out.<name>. Documented in transactional-writes.md. |
timeoutSeconds |
integer ≥ 0 |
Per-binding SQL statement timeout override; 0 disables. Default: tesseraql.sql.timeoutSeconds, else 30s. |
datasource |
string |
The named connector this read runs on, overriding the document’s. Legal on a read only: a batch step owns its own transaction so an extract elsewhere splits nothing, while a write on another connector would be a second transaction nothing owns (TQL-YAML-1037). |
materialize |
object |
Bounds on how much of the result is held in memory. |
expect |
object |
The row count this statement must affect, and what happens when it does not — the declarative optimistic-locking check on an update or delete. |
Bounds on how much of the result is held in memory.
| Property |
Type |
Description |
maxRows |
integer |
Largest number of rows materialized. Default: tesseraql.resultMaterialization.maxRows. |
onOverflow |
string |
fail (the default) refuses a result past maxRows; warn truncates it and logs. |
The row count this statement must affect, and what happens when it does not — the declarative optimistic-locking check on an update or delete.
| Property |
Type |
Description |
rowCount |
integer |
The exact number of rows the statement must affect (rows is a list of records everywhere else). |
onMismatch |
string |
conflict (the default) answers 409, so a stale edit is refused honestly; error answers 500. |
The contract arm: a statement the identity schema owns, called by name. It reads or writes like any other statement, so it carries the same mode, params and expect.
| Property |
Type |
Description |
name |
string |
The named IAM SQL contract to execute instead of a colocated file, so an app reuses the identity schema’s statements. Documented in authentication.md. |
mode |
string |
How the contract runs and what it binds, exactly as it means on the sql arm. |
params |
map of string |
Each bind name to the bindable path supplying its value, such as path.id, params.unit or principal.claim.tenant_id. |
expect |
object |
The row count this statement must affect, and what happens when it does not — the declarative optimistic-locking check on an update or delete. |
materialize |
object |
Bounds on how much of the result is held in memory. Declared here so a contract that legitimately returns more than the app-wide budget says so on the binding, rather than an application raising the budget for every route, command and export at once. |
timeoutSeconds |
integer ≥ 0 |
Per-binding SQL statement timeout override; 0 disables. Default: tesseraql.sql.timeoutSeconds, else 30s. |
The row count this statement must affect, and what happens when it does not — the declarative optimistic-locking check on an update or delete.
| Property |
Type |
Description |
rowCount |
integer |
The exact number of rows the statement must affect (rows is a list of records everywhere else). |
onMismatch |
string |
conflict (the default) answers 409, so a stale edit is refused honestly; error answers 500. |
Bounds on how much of the result is held in memory. Declared here so a contract that legitimately returns more than the app-wide budget says so on the binding, rather than an application raising the budget for every route, command and export at once.
| Property |
Type |
Description |
maxRows |
integer |
Largest number of rows materialized. Default: tesseraql.resultMaterialization.maxRows. |
onOverflow |
string |
fail (the default) refuses a result past maxRows; warn truncates it and logs. |
The service arm: a runtime provider answering rows from process state. It takes only its arguments — there is no statement to run, so no mode and no row-count expectation.
| Property |
Type |
Description |
name |
string |
The named runtime service provider to call instead of running SQL (docs/extending.md): non-SQL runtime state (lanes, traces, file trees, …) read as rows. |
params |
map of string |
Each bind name to the bindable path supplying its value, such as path.id, params.unit or principal.claim.tenant_id. |
The http arm: an outbound call whose response becomes this binding’s rows, in the vocabulary every outbound call shares. Rides the outbound gateway — allow-listed hosts, named credentials, timeouts, and a per-host circuit breaker.
| Property |
Type |
Description |
method |
string |
The HTTP method. Default GET; a source is not restricted to GET, because JSON-RPC, GraphQL and POST …/search batch lookups are reads. |
url |
string |
The absolute http/https URL. Its host must be allow-listed under tesseraql.http.outbound.allowedHosts — egress is deny by default (TQL-SEC-4070). |
headers |
map of string |
Static request headers; values may carry ${…} config or secret placeholders, resolved on send. |
query |
map of string |
Query-string parameters, each a bindable path resolved against the execution context. |
credential |
string |
A named credential the SecretResolver supplies at call time, so a document never carries a secret. |
body |
string |
A bindable path whose value is serialized as the request body. |
expectStatus |
integer |
The exact status that counts as success; the default is any 2xx. A mismatch fails the call without tripping the circuit breaker — it is a deterministic rejection, not a sign the dependency is down. |
connectTimeout |
string |
Connect timeout for this call (e.g. 2s), overriding tesseraql.http.outbound.connectTimeout. |
requestTimeout |
string |
Request timeout for this call (e.g. 10s), overriding tesseraql.http.outbound.requestTimeout. |
retry |
object |
Opt-in retry for transient faults: connect failures, timeouts and 5xx are repeated; a 4xx and an expectStatus mismatch never are. Unstated numbers come from tesseraql.http.outbound.retry. Every repeated attempt counts against the circuit breaker, the sequence ends the moment the host’s circuit opens, and it lives inside a budget of attempts x requestTimeout. Documented in connectors.md. |
select |
string |
A dotted path into the response JSON naming the part that becomes rows. Default: the whole body. |
onError |
string |
fail (default) fails the request or step; empty degrades to zero rows and an error entry, and the page still renders. The degradation is logged and metered — it is not silent. |
readOnly |
boolean |
The author’s assertion that the call has no side effect, required on a command route: the write can roll back and the request cannot. |
mode |
string |
How the acquired rows are delivered: query (default — held and published as rows) or query-spool (streamed to a spool a later chunk: step loads, so an API result can be written to the database without holding it). A call reads, so the SQL write modes are not modes it has. |
Opt-in retry for transient faults: connect failures, timeouts and 5xx are repeated; a 4xx and an expectStatus mismatch never are. Unstated numbers come from tesseraql.http.outbound.retry. Every repeated attempt counts against the circuit breaker, the sequence ends the moment the host’s circuit opens, and it lives inside a budget of attempts x requestTimeout. Documented in connectors.md.
| Property |
Type |
Description |
attempts |
integer ≥ 1 ≤ 10 |
Total attempts including the first (TQL-YAML-1058 outside 1..10). |
backoff |
string |
The wait before the second attempt, e.g. 200ms. |
multiplier |
number ≥ 1 |
The factor the wait grows by before each further attempt. |
query-export / file-export output: format (csv, excel, pdf), filename, columns with headers and format patterns, locale/timezone. It says how the rows are written and never what to read - the rows come from sources.main on a route, or the step’s own arm in a pipeline. Documented in file-transfers.md.
| Property |
Type |
Description |
format |
string |
The format the rows are written as. csv is built in; excel and pdf need their modules (TQL-LD-2801 when the codec is absent). |
filename |
string |
The download filename, defaulting to the document id plus the format’s extension. {dotted.path} interpolates a context value, and a splitBy: export must carry {key}. |
template |
string |
A workbook or print template colocated with the document: an .xlsx for excel, an .html for pdf. A path that does not exist fails the build rather than quietly writing a plain grid. |
sheet |
string |
For workbook formats, the sheet to write. |
startCell |
string |
Placement mode: where data rows start in the template, e.g. B5. Refused without a template (TQL-YAML-1041), and refused on pdf (TQL-YAML-1005) — a page lays out through its template, not through cell positions. |
columns |
array of fileColumn |
The columns written, in order, with their headings and format patterns. Omit it to write every column the rows carry, under its own name. |
locale |
string |
The locale date and number patterns render in. A literal, or a request source such as principal.claim.locale, so the requesting user decides; unset, tesseraql.files.locale applies. A job has no request, so a step’s is a literal. |
timezone |
string |
The zone date and time values render in, with the same literal / request-source / tesseraql.files.timezone fallback as locale. |
after |
object |
A statement run once after the extraction, typically to mark the extracted rows. file-export only: on query-export it is a build error (TQL-CAMEL-3101), because a synchronous download has no transaction to hang it on. |
maxRows |
integer |
The ceiling for a format that holds every row before it writes (pdf, and the workbook template modes), defaulting to tesseraql.resultMaterialization.maxRows; a negative value opts out. A streaming format is never capped. |
onOverflow |
string |
fail (default) refuses an export past maxRows (TQL-LD-2850); warn truncates it at the cap and logs. |
groupBy |
string |
A column the rows are read as ordered groups by, each exposed to the template as a key and its own rows. The rows must be ordered by it (TQL-LD-2851). |
splitBy |
string |
A column that splits the export into one document per value, delivered as a single ZIP; filename: must carry {key}. The rows must be ordered by it (TQL-LD-2851). |
A statement run once after the extraction, typically to mark the extracted rows. file-export only: on query-export it is a build error (TQL-CAMEL-3101), because a synchronous download has no transaction to hang it on.
| Property |
Type |
Description |
timing |
string |
extract (default) runs the statement in the extraction’s transaction, so rows are marked exactly when they are extracted; download runs it once on the first successful file fetch. A job’s export step supports extract only (TQL-YAML-1041). |
sql |
object |
The follow-up statement, written as a source’s sql: arm is — file:, params:, and the rest of the arm’s keys. |
file-import parsing and column-to-bind mapping (headerRow, startRow, columns, onError: rollback|skip). It says how to parse, never what to write: the per-row statement is the document’s one steps:/pipeline: entry. Documented in file-transfers.md.
| Property |
Type |
Description |
format |
string |
The tabular format the uploaded file is parsed as. csv is built in; excel needs the tesseraql-excel module (TQL-LD-2801 when the codec is absent). |
columns |
array of fileColumn |
How the file’s columns map to the per-row statement’s bind names. Omit it to use the header labels as bind names. |
headerRow |
boolean |
Whether the table starts with a header row (default true). With a header, simple-form columns match by label rather than by position. |
startRow |
integer ≥ 1 |
The 1-based row the table starts at, for files carrying title rows above the data (default 1). |
sheet |
string |
For workbook formats, the sheet to read (default: the first). |
locale |
string |
The locale type:/format: columns parse dates and numbers in. A literal, or a request source such as principal.claim.locale; unset, tesseraql.files.locale applies. |
onError |
string |
What a failing row does: rollback (default) fails the whole import, skip records the row and commits the rest. Either way the rejected rows are reported with their row numbers. |
review |
enum: required |
required splits the import in two (docs/csv-import.md): the upload parses, validates and parks the batch without writing anything, answering a report and a confirm token, and a second request commits exactly what was reviewed. Absent means the one-shot import. Only a route may declare it — a poll-driven import job has nobody to confirm (TQL-YAML-1060). |
Deadline expectations a periodic managed check alerts on through the alerts channel (kind: job) - alert-only, nothing is killed. Documented in jobs.md.
| Property |
Type |
Description |
completeBy |
string |
Wall-clock time (HH:mm) by which a day’s run must have completed for that business date. |
runningLongerThan |
string |
A duration (e.g. 2h) beyond which a still-running execution raises the alert. |
Schema for TesseraQL declarative view documents (.view.yml): what a route renders through the framework’s tql/view/ patterns instead of a hand-written template. Documented in declarative-views.md.
| Property |
Type |
Description |
version * |
const tesseraql/v1 |
The document format version. Always tesseraql/v1. |
id * |
string, min length 1 |
Unique document id, e.g. products.page; referenced by tests, coverage, governance approvals, and logs. |
kind * |
const view |
Declarative view documents (the *.view.yml convention). |
recipe |
enum: list | form | detail | dashboard | import |
Which view this document is: list | form | detail | dashboard | import. A form derives its fields from the action: route’s input: block; a dashboard composes panels:; an import renders the upload form, the validation report and the confirm form of its action: file-import route. |
title |
string |
The heading this view renders. A message key resolves through the app bundles; anything else renders literally. |
template |
string |
The pattern override this view renders through instead of its bundled tql/view/* pattern (customization ladder L2). Resolved beside the view document, then under the app template root. Documented in declarative-views.md. |
action |
string |
The id of the command route a form view submits to; its input: block is where the form’s fields come from. |
source |
string |
The model key a view reads its rows from - a name in the route’s sources:, whatever arm it declares, defaulting to main. |
search |
string |
The route input a list view binds its search box to; it must be declared on the route. |
fields |
array of any |
The fields a form or detail view renders, in order. Documented in declarative-views.md. |
columns |
array of any |
The columns a list view renders, in order. Documented in declarative-views.md. |
children |
object |
Views embedded inside this one, keyed by the slot each fills. Documented in declarative-views.md. |
panels |
array of any |
The panels a dashboard view composes, in order. Documented in declarative-views.md. |
slots |
map of string |
Named regions this view exposes for a composing parent to fill. Documented in declarative-views.md. |
refreshOn |
string |
Refetch this view’s refresh region whenever a command emits this topic (docs/realtime.md). List, detail and dashboard views only - not forms. |
workflow |
string |
The workflow whose transitions region and lifecycle stepper this page renders (docs/workflow-surface.md): the server shows only the transitions legal for this user on the row’s current state. Detail views only; the id must name a declared kind: workflow document. |
key |
any |
The result columns that identify one row (docs/declarative-views.md): a column name, or an ordered list for a composite key. Rows gain a stable anchor and an opaque row token; every key column must be present and non-null in each row. List views only. |
filters |
array of any |
The grid page’s declared filters (docs/declarative-views.md): route inputs rendered as condition chips and a filter dialog. Each entry is an input name, or a name/label mapping. List views only. |
presets |
array of object |
Named view presets (docs/declarative-views.md): contract-declared param sets the grid page renders as real links - the active one is marked, re-clicking it resets, and no storage is involved. List views only. |
actions |
array of object |
Bulk actions over the grid page’s row selection (docs/declarative-views.md): declaring any renders the selection column and bar. Requires key:; list views only. |
| Property |
Type |
Description |
name * |
string |
The link’s label; a message key resolves through the catalog. |
params * |
map of |
The query state the link applies - declared route inputs plus the framework sort/dir/size params. |
| Property |
Type |
Description |
label * |
string |
The button’s label; a message key resolves through the catalog. |
action * |
string |
The POST route the selection submits the checked rows’ tokens to (repeated ids fields). |
confirm |
string |
A confirmation prompt gating the action (the kit’s confirm dialog). |
Shared definitions live in their own documents, referenced from routes rather than repeated in them. Each has its own schema and its own file association.
Schema for TesseraQL field domain documents (domains/*.yml): named field knowledge referenced from input fields with ‘domain:’, plus the app-level constraint catalog. Documented in field-domains.md.
| Property |
Type |
Description |
version * |
const tesseraql/v1 |
The DSL version. Always tesseraql/v1. |
domains |
map of inputField |
Named field domains. A route’s input field references one with ‘domain: ’ and may override any individual key locally. |
constraints |
map of object |
Database constraint names mapped once for the whole app, so a violation of a shared unique index reports the same field, code and message on every route that can raise it. |
| Property |
Type |
Description |
field |
string |
The input field the violation is reported against. |
code |
string |
Stable machine-readable code for the violation. |
message |
string |
Message key resolved through the app’s i18n bundles. |
Schema for TesseraQL shared validation rule documents (rules/*.yml): named rules a route references from its ‘validate:’ block with ‘use:’. Documented in validation-rule-sets.md.
| Property |
Type |
Description |
version * |
const tesseraql/v1 |
The DSL version. Always tesseraql/v1. |
rules |
map of object |
Named validation rules. Each declares what the rule is; how a route uses it (params:, field:, when:) stays at the reference. |
| Property |
Type |
Description |
rule |
string |
Cross-field expression. Exactly one of rule: or file:. |
file |
string |
Validation SQL, resolved relative to this document. Exactly one of rule: or file:. |
binds |
map of string |
The typed bind contract a reference’s params: must satisfy exactly - bind name to declared type, checked against the referencing route’s input types at load. Ambient binds (principal., audit.) are supplied by the framework and never listed here. |
code |
string |
Default stable rule code, overridable at the reference. |
message |
string |
Default message key, overridable at the reference. |
Schema for TesseraQL shared decision documents (decisions/*.yml): named decision tables a route references from its ‘decide:’ block with ‘use:’. Documented in decision-tables.md.
| Property |
Type |
Description |
version * |
const tesseraql/v1 |
The DSL version. Always tesseraql/v1. |
decisions |
map of object |
Named decision tables. Each declares its contract (typed inputs and outputs, hit and miss policies) and rows; how a route wires the inputs (params:) stays at the reference. |
| Property |
Type |
Description |
inputs * |
map of object |
Typed inputs by name; each row cell constrains one of these. |
outputs * |
map of object |
Typed outputs by name; every row sets all of them. |
hitPolicy |
enum: first | unique |
first (default): authored order resolves. unique: more than one conditional match is an error, and overlapping rows fail the build. |
onMiss |
enum: error | default |
error (default): a lookup no row matches raises TQL-DECISION-4721. default: the trailing row without when: answers. |
source |
object |
The app-owned table carrying the rows (exactly one of rows:/source:): business users maintain them at runtime, and the decision evaluates as one generated SELECT in the operation’s transaction. A NULL cell in any mapped column is the wildcard. |
default |
object |
The outputs answering a miss of a table-backed decision. A YAML-backed decision declares its default as a trailing row without when: instead. |
rows |
array of object |
The authored rows, resolved in order. A row is the conjunction of its when: cells (absent cell = wildcard); a trailing row without when: is the default. |
| Property |
Type |
Description |
type |
string |
Inline type of the input. |
domain |
string |
Field domain reference declaring the input’s type. |
match |
enum: eq | between | in | bool | subtree |
How row cells compare against this input: eq (default, equality; empty cell = wildcard), between (inclusive range), in (membership in a small fixed set), bool, subtree (the bound org unit is in the cell’s subtree; table sources only, resolved through the managed org closure). |
| Property |
Type |
Description |
type |
string |
Inline type of the output. |
domain |
string |
Field domain reference declaring the output’s type. |
enum |
array of any |
The output’s full value space, enabling consumption-side exhaustiveness lints. |
The app-owned table carrying the rows (exactly one of rows:/source:): business users maintain them at runtime, and the decision evaluates as one generated SELECT in the operation’s transaction. A NULL cell in any mapped column is the wildcard.
| Property |
Type |
Description |
table * |
string |
The rule table. |
keyColumn |
string |
The rule table’s key column joining set: child tables. Default id. |
match * |
map of object |
Column realization per input (all but in): exactly one shape per entry. |
set |
map of object |
Child-table realization of each in input: no child rows = wildcard, membership otherwise. |
priority |
string |
The resolution-order column; required for hitPolicy: first. |
effective |
array of string |
Optional dated-row window: the [from, to] column pair matched against the reference’s effectiveAt: (default audit.now). |
outputs * |
map of string |
Output name to column. |
| Property |
Type |
Description |
eq |
string |
One nullable column for an eq/bool input. |
between |
array of string |
The nullable [min, max] column pair of a between input. |
subtree |
string |
The nullable unit-id column of an subtree input, matched through the managed org closure. |
| Property |
Type |
Description |
table * |
string |
The child table. |
key * |
string |
The child column referencing the rule row’s id. |
value * |
string |
The child column carrying one member per row. |
| Property |
Type |
Description |
when |
object |
Cells by input name: a scalar (eq/bool), a range (‘>= 10000’, ‘5..10’, a number), or a list (in). |
outputs * |
object |
The outputs this row sets — exactly the declared outputs. |
One keyed reference folded into a binding’s rows: where the keys are (on:), what answers them (sql:, http: or source: — exactly one), and how the answer lands (as: or merge:). Documented in lookups.md.
| Property |
Type |
Description |
on |
map of string |
The join: each column of the rows being enriched to the column of the reference it matches. Several pairs make a composite key, compared by the framework’s canonical normalization (INTEGER 1 matches BIGINT 1). |
sql |
object |
Fetch the reference by key, written as a source’s sql: arm is. The statement must bind keys — one that never mentions it reads the whole table once per batch and still returns the right answer, which is why only the build can catch it (TQL-YAML-1048). |
http |
object |
Call the reference by key, written as a source’s http: arm is, plus select: and onError:. How the keys reach it is mode:. |
source |
string |
A result already in the context, joined without a fetch, named by its context path: a route source by name, a job step as steps.<id>. A spooled sibling is refused (TQL-CAMEL-3114) — load it into a table and enrich from there. |
mode |
string |
For an http: reference: perRow (default) makes one request per distinct key, batch one request per batchSize keys. A sql: reference is always batched — a statement takes a key list by construction. |
as |
string |
Attach the matched rows as a list under this name. Exactly one of as: or merge: (TQL-YAML-1047). |
merge |
array of string |
Copy these columns of the matched row onto each row instead of attaching a list. Exactly one of as: or merge: (TQL-YAML-1047). |
batchSize |
integer ≥ 1 |
How many distinct keys one fetch carries. |
maxKeys |
integer ≥ 1 |
The ceiling on distinct keys collected for one enrichment, past which the reference is refused rather than read unboundedly. |
One notification enqueued on the transactional outbox, so it is sent if and only if the write commits. Documented in notifications.md.
| Property |
Type |
Description |
channel |
string |
The declared channel this notification is enqueued on, which decides the transport (mail, webhook, queue) and its configuration. It must exist (TQL-FIELD-2004). |
when |
string |
A core expression over the result context; the notification is enqueued only when it holds, so a conditional send is a declaration rather than a branch. |
recipient |
string |
A bindable path resolving to the address this notification goes to, overriding the channel’s configured recipients. |
attach |
string |
A bindable path resolving to a transfer id — typically an export step’s steps.<id>.transferId — whose file rides along. Mail channels only (TQL-FIELD-2004). |
payload |
map of string |
Each payload key to the bindable path supplying its value; the template or transport reads them by name. |
delay |
string |
Hold this entry back this long after the commit, e.g. 72h. Exclusive with deliverAt: (TQL-BATCH-5317). Documented in notifications.md. |
deliverAt |
string |
Hold this entry back until the instant this bindable path resolves to. Exclusive with delay: (TQL-BATCH-5317). Documented in notifications.md. |
cancelKey |
string |
A bindable path whose value this entry is filed under, so a later command can withdraw it while it is still undelivered. Documented in notifications.md. |
cancel |
string |
A bindable path naming the cancelKey to withdraw: this block withdraws undelivered entries instead of writing one, in the withdrawing command’s own transaction. Declared instead of channel:, never beside it. |
Delivery of a produced transfer to a local or remote drop — the outbound mirror of the poll trigger, under the same policy block. Documented in file-transfers.md.
| Property |
Type |
Description |
transport |
string |
Where the file goes: local writes under the work directory, sftp/ftps reach an allow-listed remote host. |
host |
string |
The remote server, which must be allow-listed under tesseraql.connectors.push.hosts. Required on a remote transport (TQL-YAML-1042). |
port |
integer ≥ 1 |
The remote port, defaulting to the transport’s. |
path |
string |
The destination directory. The file is staged and renamed into place, so a poller on the far side never reads a partial file. |
credential |
string |
The named credential under tesseraql.connectors.push.credentials. Required on a remote transport (TQL-YAML-1042). |
file |
string |
A bindable path resolving to the transfer id of the file to deliver, typically an earlier export step’s steps.<id>.transferId. |
as |
string |
The name the file lands under, defaulting to the transfer’s own filename. {dotted.path} interpolates a context value. |
Restartable per-row processing: a reader, a writer, and committed checkpoints, so a job that stops resumes where it left off instead of starting over. Documented in jobs.md.
| Property |
Type |
Description |
reader |
binding |
What the loop reads, a window at a time: its own sql:, or spool: naming an earlier step’s spool. A chunk step’s work is its reader and writer, so the step declares no arm of its own (TQL-FIELD-2004). |
writer |
binding |
What runs for each row the reader produced, binding that row’s columns. |
key |
string |
The reader column checkpoints track, defaulting to id. A restart resumes after the last committed key, which is why the reader must be ordered by it. |
commitEvery |
integer ≥ 1 |
How many rows one committed slice holds. A checkpoint lands with each commit, so this is also how much a restart repeats. |
onError |
string |
fail (default) fails the step on the first writer error; skip records the row in tql_job_skips and continues, up to skipLimit. |
skipLimit |
integer ≥ 0 |
How many skipped rows the step tolerates before failing anyway, so a systematically broken load does not run to completion looking fine. |
enrich |
map of enrichment |
Keyed references folded into each window before the writer sees it, so a writer may bind a column the reader’s query never selected. A reference failure fails the window, not the row. |
batch |
boolean |
true executes the writer in JDBC batches of commitEvery rows — one round trip per committed slice instead of one per row. Requires the default onError: fail: a batch cannot attribute a member failure to one row, so a failure fails the chunk, which reruns from its last checkpoint. Documented in jobs.md. |
One column of a file transfer, in either form: the bare name, or an object adding the file-side heading, an explicit position, and a type with its pattern. Documented in file-transfers.md.
| Property |
Type |
Description |
name |
string |
The bind name on import, the row column on export. The simple form - name is this key and nothing else. |
label |
string |
The heading in the file — the same word a view column uses, and a message key resolves through the app bundles. Defaults to name. |
column |
string |
An explicit position instead of matching by header: a column letter (D) or a 1-based number. |
type |
string |
Parses the file’s text into a typed bind on import, and writes a typed cell on export. Omit it for plain text. |
format |
string |
The parse/render pattern the type: uses, e.g. yyyy/MM/dd or #,##0.00 — and, for workbooks, the matching cell format. |
| Property |
Type |
Description |
domain |
string |
Name of a field domain declared under domains/; its type, bounds, pattern, format, enum, classification and mask merge in, and the keys declared here win. Operational keys (required, requiredWhen, default, writable) stay route-local. |
description |
string |
What this field is, in the words a caller reads. A wire field on both MCP surfaces derived from input: an mcp/ prompt’s argument carries it in prompts/list, and an mcp/ tool’s inputSchema carries it as the JSON Schema description a model follows. Declarable on a domain, and inherited from one. |
type |
enum: string | integer | number | boolean | date | array | sort |
The declared type. A supplied value is coerced to it and refused when it does not fit. sort is an ordered sort set (-ship,order - a leading - for descending) validated against columns:; the bound params.<name>Sql sibling carries the safe ORDER BY fragment. |
required |
boolean |
Refuse the request when this field is absent. |
default |
any |
The value bound when the request omits the field. |
min |
number |
Smallest accepted numeric value. |
max |
number |
Largest accepted numeric value. |
maxLength |
integer ≥ 0 |
Longest accepted string, in characters. |
minLength |
integer ≥ 0 |
Shortest accepted string, in characters. |
pattern |
string |
Anchored regular expression (TQL-YAML-1012 when it does not compile). |
columns |
array of string |
The sortable-column allowlist a type: sort input validates its keys against; required for that type and legal on no other. |
format |
string |
string: email|uuid|url; date/number: a parse pattern. |
requiredWhen |
string |
A core expression over params./path./body. (TQL-YAML-1014). |
enum |
array of string |
The accepted values; anything else is refused. |
writable |
boolean |
false makes the field read-only: it renders in a derived form but is never bound from the request. |
classification |
string |
Data classification label carried into masking and audit. Documented in data-scoping.md. |
mask |
string |
The masking rule applied when the principal may not see the value. |
widget |
enum: text | textarea | number | date | datetime-local | checkbox | select | hidden | lookup |
Presentation hint (docs/declarative-views.md): the form widget this field renders as, declared once on a domain; a per-view fields: override wins. Never part of the HTTP contract. |
codes |
string |
The code catalog this field’s values come from (docs/lookups.md): the binder accepts only that catalog’s active codes, and the violation is the enum field error. Declared on a domain, so the value set has one home instead of an enum that drifts from the master. |
lookup |
object |
The master reference this field holds a key of (docs/reference-lookup.md): direct code entry resolved through a synthesized companion route, existence-checked again at submit. Declarable on a domain, like codes:. |
policy |
string |
Write authorization (docs/declarative-views.md): a security policy the principal must satisfy to supply this field; a failing principal’s value follows the route’s readOnly behavior, and the derived form omits the field. Operational — never accepted inside a domain. |
items |
object |
Element constraints for type: array: type:/enum: for scalar elements, fields: for object elements. |
The master reference this field holds a key of (docs/reference-lookup.md): direct code entry resolved through a synthesized companion route, existence-checked again at submit. Declarable on a domain, like codes:.
| Property |
Type |
Description |
source * |
string |
URL path of the GET query route that searches the master — an ordinary route with its own security: and SQL, resolved the way a form’s action: is. Its rows must carry this field’s column (the id), code: and label:. |
code * |
string |
The row column holding the code users type — the visible half of the field; the hidden id is what submits. |
label * |
string |
The row column holding the display name the field’s hint shows. Presentation only, never submitted. |
Element constraints for type: array: type:/enum: for scalar elements, fields: for object elements.
| Property |
Type |
Description |
type |
string |
The element type, for an array of scalars. Mutually exclusive with fields: (TQL-YAML-1027). |
enum |
array of string |
The accepted element values; anything else is refused. |
fields |
map of inputField |
The element’s own fields, for an array of objects — the header-plus-lines shape a business form submits. Elements bind, coerce and validate exactly as top-level fields do, and a violation addresses itself by index (lines[2].qty). One level deep: an array inside an element is refused (TQL-YAML-1027). Documented in declarative-validation.md. |
| Property |
Type |
Description |
visible |
boolean |
false removes the field from the response entirely, for every caller. |
policy |
string |
The security policy a principal must satisfy to see the value unmasked. |
mask |
string |
The masking rule applied when the policy is not satisfied, such as showing only the last four characters. |
classification |
string |
Data classification label carried into audit. Documented in data-scoping.md. |
unmaskWhen |
string |
An expression that, when it matches, reveals the value despite the mask. |
| Property |
Type |
Description |
when * |
string |
A whitelist-only expression over the execution context; the first matching entry wins. |
status * |
integer ≥ 100 ≤ 599 |
The HTTP status to answer when the expression is truthy. |
One acquisition or one statement. Exactly one mechanism arm names the means — sql (a colocated 2-way SQL file), contract (a named identity contract), service (a runtime provider), http (an outbound call) — or the write-side sequence, and that arm nests the keys the mechanism owns. Beside the arms sit the three questions no mechanism answers: the when: guard, the enrich: folded into the rows, and the spool: another step filled. Documented in unified-sources.md.
| Property |
Type |
Description |
sql |
object |
The SQL arm: a colocated 2-way SQL file and how it is run. The keys of the mechanism nest inside the arm that owns them, so there is nowhere to write a call’s select: on a statement and no lint has to say it is wrong. |
contract |
object |
The contract arm: a statement the identity schema owns, called by name. It reads or writes like any other statement, so it carries the same mode, params and expect. |
service |
object |
The service arm: a runtime provider answering rows from process state. It takes only its arguments — there is no statement to run, so no mode and no row-count expectation. |
http |
object |
The http arm: an outbound call whose response becomes this binding’s rows, in the vocabulary every outbound call shares. Rides the outbound gateway — allow-listed hosts, named credentials, timeouts, and a per-host circuit breaker. |
sequence |
string |
Allocate the next value of a managed document-number sequence instead of running a statement; it binds as steps.<id>.value. It has no body beyond its name, which is why it sits beside the arms rather than being one. Documented in transactional-writes.md. |
spool |
string |
A context path resolving to an earlier step’s spool reference (steps.<id>.spool), read as this binding’s rows. A chunk reader declares it instead of sql: to load what another step extracted — from another connector, or from an API — because a spool is a spool whoever filled it. Documented in jobs.md. |
when |
string |
Guard expression on a step: a falsy guard skips it, recording steps.<id>.skipped instead of a result. A guard is about whether the step runs at all, not a question for the mechanism, so it sits beside the arm. The declared branch point for decision.* outputs (docs decision-tables). |
enrich |
map of enrichment |
Keyed references folded into this binding’s rows before anything reads them (docs/lookups.md), keyed by enrichment name and applied in authored order. An enrichment nests under the source it transforms, so any arm’s rows can be enriched. Each entry names one reference — sql: (fetch by key), http: (call by key), or source: (a result already in the context, joined without a fetch, named by its context path: a route source by name, a job step as steps.<id>) — plus the on: join and one of as:/merge:. Only a binding that holds rows can carry one: a write publishes affectedRows, and a query-spool extract never held its rows. |
The SQL arm: a colocated 2-way SQL file and how it is run. The keys of the mechanism nest inside the arm that owns them, so there is nowhere to write a call’s select: on a statement and no lint has to say it is wrong.
| Property |
Type |
Description |
file |
string |
A colocated 2-way SQL file, relative to the declaring document (must exist; TQL-SQL-2103). This arm’s acquisition target, the role url plays for http. |
mode |
string |
How the statement runs and what it binds: query (rows), query-one (a single row), update (an affected-row count), query-spool (rows streamed to a spool a later chunk: step reads, never held), or call (a stored call on a command step, its OUT parameters declared under out:). |
params |
map of string |
Each bind name to the bindable path supplying its value, such as path.id, params.unit or principal.claim.tenant_id. |
keys |
array of string |
Columns whose database-generated values are captured after an insert; they bind as steps.<id>.keys.<column>. |
out |
map of string |
The OUT parameters of a mode: call statement on a command step: each name to its JDBC type keyword (varchar, numeric, integer, bigint, boolean, date, timestamp, double). The statement binds them as out.<name> bind sites and the values publish as steps.<id>.out.<name>. Documented in transactional-writes.md. |
timeoutSeconds |
integer ≥ 0 |
Per-binding SQL statement timeout override; 0 disables. Default: tesseraql.sql.timeoutSeconds, else 30s. |
datasource |
string |
The named connector this read runs on, overriding the document’s. Legal on a read only: a batch step owns its own transaction so an extract elsewhere splits nothing, while a write on another connector would be a second transaction nothing owns (TQL-YAML-1037). |
materialize |
object |
Bounds on how much of the result is held in memory. |
expect |
object |
The row count this statement must affect, and what happens when it does not — the declarative optimistic-locking check on an update or delete. |
Bounds on how much of the result is held in memory.
| Property |
Type |
Description |
maxRows |
integer |
Largest number of rows materialized. Default: tesseraql.resultMaterialization.maxRows. |
onOverflow |
string |
fail (the default) refuses a result past maxRows; warn truncates it and logs. |
The row count this statement must affect, and what happens when it does not — the declarative optimistic-locking check on an update or delete.
| Property |
Type |
Description |
rowCount |
integer |
The exact number of rows the statement must affect (rows is a list of records everywhere else). |
onMismatch |
string |
conflict (the default) answers 409, so a stale edit is refused honestly; error answers 500. |
The contract arm: a statement the identity schema owns, called by name. It reads or writes like any other statement, so it carries the same mode, params and expect.
| Property |
Type |
Description |
name |
string |
The named IAM SQL contract to execute instead of a colocated file, so an app reuses the identity schema’s statements. Documented in authentication.md. |
mode |
string |
How the contract runs and what it binds, exactly as it means on the sql arm. |
params |
map of string |
Each bind name to the bindable path supplying its value, such as path.id, params.unit or principal.claim.tenant_id. |
expect |
object |
The row count this statement must affect, and what happens when it does not — the declarative optimistic-locking check on an update or delete. |
materialize |
object |
Bounds on how much of the result is held in memory. Declared here so a contract that legitimately returns more than the app-wide budget says so on the binding, rather than an application raising the budget for every route, command and export at once. |
timeoutSeconds |
integer ≥ 0 |
Per-binding SQL statement timeout override; 0 disables. Default: tesseraql.sql.timeoutSeconds, else 30s. |
The row count this statement must affect, and what happens when it does not — the declarative optimistic-locking check on an update or delete.
| Property |
Type |
Description |
rowCount |
integer |
The exact number of rows the statement must affect (rows is a list of records everywhere else). |
onMismatch |
string |
conflict (the default) answers 409, so a stale edit is refused honestly; error answers 500. |
Bounds on how much of the result is held in memory. Declared here so a contract that legitimately returns more than the app-wide budget says so on the binding, rather than an application raising the budget for every route, command and export at once.
| Property |
Type |
Description |
maxRows |
integer |
Largest number of rows materialized. Default: tesseraql.resultMaterialization.maxRows. |
onOverflow |
string |
fail (the default) refuses a result past maxRows; warn truncates it and logs. |
The service arm: a runtime provider answering rows from process state. It takes only its arguments — there is no statement to run, so no mode and no row-count expectation.
| Property |
Type |
Description |
name |
string |
The named runtime service provider to call instead of running SQL (docs/extending.md): non-SQL runtime state (lanes, traces, file trees, …) read as rows. |
params |
map of string |
Each bind name to the bindable path supplying its value, such as path.id, params.unit or principal.claim.tenant_id. |
The http arm: an outbound call whose response becomes this binding’s rows, in the vocabulary every outbound call shares. Rides the outbound gateway — allow-listed hosts, named credentials, timeouts, and a per-host circuit breaker.
| Property |
Type |
Description |
method |
string |
The HTTP method. Default GET; a source is not restricted to GET, because JSON-RPC, GraphQL and POST …/search batch lookups are reads. |
url |
string |
The absolute http/https URL. Its host must be allow-listed under tesseraql.http.outbound.allowedHosts — egress is deny by default (TQL-SEC-4070). |
headers |
map of string |
Static request headers; values may carry ${…} config or secret placeholders, resolved on send. |
query |
map of string |
Query-string parameters, each a bindable path resolved against the execution context. |
credential |
string |
A named credential the SecretResolver supplies at call time, so a document never carries a secret. |
body |
string |
A bindable path whose value is serialized as the request body. |
expectStatus |
integer |
The exact status that counts as success; the default is any 2xx. A mismatch fails the call without tripping the circuit breaker — it is a deterministic rejection, not a sign the dependency is down. |
connectTimeout |
string |
Connect timeout for this call (e.g. 2s), overriding tesseraql.http.outbound.connectTimeout. |
requestTimeout |
string |
Request timeout for this call (e.g. 10s), overriding tesseraql.http.outbound.requestTimeout. |
retry |
object |
Opt-in retry for transient faults: connect failures, timeouts and 5xx are repeated; a 4xx and an expectStatus mismatch never are. Unstated numbers come from tesseraql.http.outbound.retry. Every repeated attempt counts against the circuit breaker, the sequence ends the moment the host’s circuit opens, and it lives inside a budget of attempts x requestTimeout. Documented in connectors.md. |
select |
string |
A dotted path into the response JSON naming the part that becomes rows. Default: the whole body. |
onError |
string |
fail (default) fails the request or step; empty degrades to zero rows and an error entry, and the page still renders. The degradation is logged and metered — it is not silent. |
readOnly |
boolean |
The author’s assertion that the call has no side effect, required on a command route: the write can roll back and the request cannot. |
mode |
string |
How the acquired rows are delivered: query (default — held and published as rows) or query-spool (streamed to a spool a later chunk: step loads, so an API result can be written to the database without holding it). A call reads, so the SQL write modes are not modes it has. |
Opt-in retry for transient faults: connect failures, timeouts and 5xx are repeated; a 4xx and an expectStatus mismatch never are. Unstated numbers come from tesseraql.http.outbound.retry. Every repeated attempt counts against the circuit breaker, the sequence ends the moment the host’s circuit opens, and it lives inside a budget of attempts x requestTimeout. Documented in connectors.md.
| Property |
Type |
Description |
attempts |
integer ≥ 1 ≤ 10 |
Total attempts including the first (TQL-YAML-1058 outside 1..10). |
backoff |
string |
The wait before the second attempt, e.g. 200ms. |
multiplier |
number ≥ 1 |
The factor the wait grows by before each further attempt. |