MEMORY: block for managing session and persistent state, and the CONSTRAINTS: block for enforcing business rules.
MEMORY
Memory in ABL defines how an agent stores, retrieves, and persists information across conversation turns, sessions, and users. TheMEMORY: block declares four categories: session variables, persistent variables, remember triggers, and recall instructions.
Overview
Every agent has access to a memory configuration that controls data lifecycle:- Session variables exist for the duration of a single conversation session.
- Persistent variables survive across sessions, scoped to a user or project.
- Remember triggers automatically store values when conditions are met.
- Recall instructions load stored facts at specific lifecycle events.
Session variables
Session variables hold data that is relevant only during a single conversation. They are created when the session starts and discarded when the session ends (unlessRESET: never is specified).
Syntax
Properties
| Property | Type | Required | Default | Description | | ------------- | ------------- | ---------- | --------- | ----------------------------------------------------- | ------------- | ------------------------------------------------------------------ | --- | --- | ------------------------------------------------------- | |name | string | Yes | — | Variable name, used as the key in session context. |
| TYPE | string | number | boolean | date | array | object | No | — | Value type for runtime validation and field resolution. |
| DESCRIPTION | string | No | — | Human-readable description of the variable’s purpose. |
| INITIAL | any | No | null | Initial value assigned when the session starts. |
| RESET | per_session | per_step | never | No | per_session | When to reset the variable. See Reset behavior. |
Reset behavior
| Value | Behavior |
|---|---|
per_session | Variable is initialized at session start and cleared when the session ends. This is the default. |
per_step | Variable is reset to its initial value at the start of each flow step. Useful for step-scoped accumulators. |
never | Variable persists for the lifetime of the runtime process. Use sparingly; prefer persistent memory instead. |
Example: typed session variables
Persistent variables
Persistent variables survive across sessions. They are stored in a fact store and scoped to either a specific user or to the entire project.Syntax
user.* or project.*), but you can override this with the SCOPE property.
Properties
| Property | Type | Required | Default | Description | | ------------- | -------- | --------- | ----------- | -------------------------------------------------------------------------- | -------------------------------------------------------------------------- | ------------------------------------------------------------------------ | --- | --- | ---------------------------------- | |path | string | Yes | — | Dot-notation path (e.g., user.preferred_chains). |
| SCOPE | user | project | No | user | Ownership scope. user is per-user; project is shared across all users. |
| ACCESS | read | write | readwrite | No | readwrite | Access direction. Constrains whether the agent can read, write, or both. |
| TYPE | string | number | boolean | date | array | object | No | — | Value type for runtime validation. |
| UNIT | string | No | — | Unit of the stored value (e.g., USD, km). Informational metadata only. |
| DEFAULT | any | No | null | Default value when no fact exists in the store. |
| DESCRIPTION | string | No | — | Human-readable description. |
Scoping rules
- User scope (
SCOPE: user): Values are unique per authenticated user. Two users in the same project see different values for the same path. - Project scope (
SCOPE: project): Values are shared across all users within the project. Useful for reference data, feature flags, or global configuration.
Remember triggers
Remember triggers define rules for automatically storing values into persistent memory when a condition is met during conversation.Syntax
Properties
| Property | Type | Required | Default | Description |
|---|---|---|---|---|
WHEN | string | Yes | — | Condition expression that triggers the store operation. Evaluated after each turn. |
STORE | object | Yes | — | Defines the value expression and the target persistent path. Syntax: value_expr -> target_path. |
TTL | string | No | — | Time-to-live for the stored fact. After expiration, the value is deleted. Examples: "30d", "24h". |
TTL format
TTL values use a duration string:| Suffix | Meaning |
|---|---|
s | Seconds |
m | Minutes |
h | Hours |
d | Days |
"90d" means the stored fact expires 90 days after it was written.
Recall instructions
Recall instructions define when and how to load persistent facts back into the session context. They execute at specific lifecycle events.Syntax
Properties
| Property | Type | Required | Default | Description |
|---|---|---|---|---|
ON | string | Yes | — | Lifecycle event that triggers the recall. See Events. |
ACTION | string | No | — | The concrete action to execute. See Actions. |
INSTRUCTION | string | Yes | — | Human-readable instruction for the recall behavior. |
PATHS | array | No | — | Persistent paths to inject (for inject_context action). |
DOMAIN | string | No | — | Memory domain filter (for load_memory action). |
Recall events
| Event | When it fires |
|---|---|
session:start | When a new session initializes, before any user input. |
search:before | Before a search or retrieval operation. |
Recall actions
| Action | Behavior |
|---|---|
inject_context | Loads specified persistent paths directly into the session context as variables. |
load_memory | Loads all facts in the specified domain into context. |
prompt_llm | Passes the instruction text to the LLM as additional context. This is the default action. |
Accessing memory in expressions
Session variables are accessed by name in expressions and template strings:SET assignments in flow steps, ON_START, or hooks are written to session memory and available for the remainder of the session.
CONSTRAINTS
Constraints are deterministic business rules that the runtime evaluates against the current session state. Authors can still group constraints under named phases for readability, but phase names are currently labels only: the compiler flattens constraints into a single runtime list unless a constraint explicitly gates itself withWHEN or a structural checkpoint construct.
Overview
Constraints enforce guardrails on agent behavior that are separate from LLM instructions. They are deterministic checks evaluated by the runtime, not suggestions to the model. A constraint that fails blocks the current operation and triggers anON_FAIL action.
Phases
Named phases are retained as authoring labels for readability, review, and organization. They do not currently create separate runtime execution phases by themselves.Syntax
always, pre_booking, or eligibility_check when they help readers understand intent, but use WHEN to gate applicability and BEFORE only for explicit structural checkpoint targets.
Requirement rules
Each requirement within a phase uses one of three keywords:REQUIRE, LIMIT, or RESTRICT.
REQUIRE
The most common form. Asserts that a condition must be true. If the condition evaluates to false, theON_FAIL action is triggered.
LIMIT
Expresses a numeric boundary. Semantically equivalent toREQUIRE with a comparison, but communicates intent more clearly.
RESTRICT
Expresses a prohibition. The condition describes what is forbidden; when it evaluates to true, the constraint fails.WHEN
UseWHEN: to make a constraint apply only in a specific context without overloading the phase label.
BEFORE
UseBEFORE for structural checkpoints that the runtime knows how to activate.
BEFORE calling <tool_name>BEFORE returning results
BEFORE targets are retained for compatibility, but they are warning-only and have no runtime effect. Prefer IMPLIES or WHEN for that form.
Constraint properties
| Property | Type | Required | Default | Description |
|---|---|---|---|---|
condition | string | Yes | — | Expression to evaluate. See Expressions & functions. |
WHEN | string | No | — | Optional applicability gate. The compiler lowers it to implication semantics so the constraint only applies when the gate is true. |
ON_FAIL | string or action | Yes | respond | Action when the condition fails. See ON_FAIL actions. |
severity | error or warning | No | error | error blocks execution; warning emits a warning but continues. In text ABL, use the WARN keyword instead of a severity: line. |
ON_FAIL actions
TheON_FAIL value determines what happens when a constraint fails.
String message (respond)
The most common form. Sends a message to the user and halts the current operation.HANDOFF
Transfers control to another agent. Active flow and reasoning runtime checkpoints execute the handoff immediately when the constraint fails.ESCALATE
Triggers human escalation.Block
Silently blocks the operation without a user-facing message.Structured ON_FAIL block
For more control, use a structured block that combines multiple actions.Structured ON_FAIL properties
| Property | Type | Required | Default | Description |
|---|---|---|---|---|
RESPOND | string | No | — | Message to send to the user. |
COLLECT | string[] | No | — | Fields to collect from the user before re-evaluating. |
GOTO | string | No | — | Flow step to jump to. |
RETRY | boolean | No | false | Retry the current step after handling the constraint. |
THEN | continue or retry | No | — | What to do after collection: continue proceeds, retry re-checks. |
Collect and retry example
GOTO example
Severity levels
| Severity | Behavior |
|---|---|
error | Blocks the current operation. The ON_FAIL action executes. This is the default. |
warning | Emits a warning event and continues execution. The ON_FAIL message is logged, not sent. |
Constraint evaluation order
- Constraint phase names such as
alwaysorpre_bookingare labels only; the compiler flattens all constraints into one runtime list. WHENgates a constraint to a specific context, and structuralBEFOREgates it to supported checkpoints such as tool calls or final responses.- Inline flow-step
CHECKexpressions are separate fromCONSTRAINTSand evaluate directly againststep.check. - Declaration order is preserved in the flattened list.
- Evaluation stops at the first
error-severity failure. Warnings do not halt evaluation.
Template interpolation in messages
ON_FAIL message strings support {{variable}} interpolation using the current session context:
Related pages
- Guardrails — input/output safety checks (distinct from business rule constraints)
- Expressions & functions — condition expression syntax
- Multi-Agent & Supervisor — HANDOFF and ESCALATE actions referenced in ON_FAIL
- Lifecycle & hooks —
ON_STARThandler where initial memory setup occurs - Data types — type definitions used in
TYPEdeclarations