How Archify Lifecycle Diagrams Represent State Machines with Wait States, Retries, and Terminal States
Archify lifecycle diagrams use a JSON-IR schema with semantic lanes (main, waiting, exceptions, terminal) and strict state type classifications to visually separate active execution flows from pauses, retry loops, and terminal exits.
The tt-a1i/archify repository provides a specialized renderer that transforms structured JSON intermediate representations into clean, horizontally-oriented state machine diagrams. By enforcing the schema defined in archify/schemas/lifecycle.schema.json, the tool creates clear visual distinctions between transient execution states, blocking wait conditions, recoverable failures, and final termination points.
The Lane-Based Schema Architecture
Archify organizes state machines into lanes—logical groupings that control horizontal positioning and semantic meaning. The schema defines lanes in an array of objects with id and label properties (lines 63-84 in archify/schemas/lifecycle.schema.json).
Standard lane configurations include:
main: Contains the primary execution rail withstart,active, anddecisionstate typeswaiting: Isolates pause states that suspend execution without ending the processexceptions: Houses recoverable failure states and retry logicterminal: Dedicated to final exit states with no outgoing transitions
Each state declares its lane assignment via the lane property, while the col property determines left-to-right ordering within the lane. The schema enforces that all lane values must reference entries in the top-level lanes array.
State semantics are controlled by the type enum, which includes start, active, waiting, decision, success, failure, neutral, and external (lines 101-113 in lifecycle.schema.json). These types govern visual styling and validation rules during rendering.
Modeling Wait States
Wait states represent execution pauses where the system awaits external input or conditions. To define a wait state, set type: "waiting" and place the state in the waiting lane, as demonstrated in archify/examples/agent-run.lifecycle.json (lines 22-24).
{
"id": "approval",
"type": "waiting",
"label": "Needs Approval",
"lane": "waiting",
"col": 0
}
The renderer visually separates these states from the main execution rail, creating a distinct track that indicates suspension without termination. Transitions from wait states typically lead back to active states in the main lane or to terminal exits, but never create cycles that bypass the wait condition.
Implementing Retry Loops and Recovery
Retry logic is modeled through failure states with type: "failure" placed in the exceptions lane. These states represent recoverable errors that can transition back to earlier active states, forming visual retry loops. The transition object supports a via property defining coordinate arrays for routing arrows and a variant property for styling distinctions.
In archify/examples/agent-run.lifecycle.json (lines 24-26), a failure state is defined as:
{
"id": "failed",
"type": "failure",
"label": "Failed",
"lane": "exceptions",
"col": 0
}
Transitions back to the main lane create recovery paths. For example, a transition from failed to planning with a via route draws a curved arrow indicating the retry flow:
{
"from": "failed",
"to": "planning",
"variant": "security",
"via": [[300, 200], [300, 100]]
}
The renderer applies "recoverable error" styling to these paths, distinguishing them from terminal failures.
Configuring Terminal States
Terminal states represent non-recoverable endings and reside exclusively in the terminal lane. They require the tag: "terminal" property and use either type: "failure" or type: "success" depending on the exit condition (lines 25-27 in agent-run.lifecycle.json).
{
"id": "cancelled",
"type": "failure",
"label": "Cancelled",
"lane": "terminal",
"col": 0,
"tag": "terminal"
}
The renderer enforces that terminal states have no outgoing edges, making them strict visual endpoints. The schema validation ensures that no transitions originate from states carrying the tag: "terminal" property, preventing invalid state machine definitions.
Rendering the Diagram
To generate the SVG visualization, execute archify/renderers/lifecycle/render-lifecycle.mjs with the JSON-IR input file and desired HTML output path:
node archify/renderers/lifecycle/render-lifecycle.mjs \
archify/examples/agent-run.lifecycle.json \
examples/lifecycle-agent-run.html
The renderer processes the lane definitions to create a phase-map layout, arranging the main execution rail horizontally while positioning waiting, exception, and terminal states in parallel tracks. This produces an uncluttered visualization that clearly differentiates the happy path from alternative flows.
Complete example combining all three concepts:
{
"schema_version": 1,
"diagram_type": "lifecycle",
"meta": {
"title": "Simple Order Lifecycle",
"viewBox": [800, 400]
},
"lanes": [
{ "id": "main", "label": "Process" },
{ "id": "waiting", "label": "Pauses" },
{ "id": "exceptions", "label": "Recovery" },
{ "id": "terminal", "label": "Exit" }
],
"states": [
{ "id": "new", "type": "start", "label": "New", "lane": "main", "col": 0 },
{ "id": "pay", "type": "active", "label": "Pay", "lane": "main", "col": 1 },
{ "id": "review", "type": "waiting", "label": "Review", "lane": "waiting", "col": 0 },
{ "id": "failed", "type": "failure", "label": "Failed", "lane": "exceptions", "col": 0 },
{ "id": "cancel", "type": "failure", "label": "Cancelled", "lane": "terminal", "col": 0, "tag": "terminal" }
],
"transitions": [
{ "from": "new", "to": "pay", "variant": "default" },
{ "from": "pay", "to": "review", "variant": "default" },
{ "from": "pay", "to": "failed", "variant": "default", "via": [[300, 200]] },
{ "from": "review", "to": "cancel", "variant": "default" }
]
}
Summary
- Archify lifecycle diagrams use a strict JSON-IR schema to model state machines with four semantic lanes:
main,waiting,exceptions, andterminal. - Wait states use
type: "waiting"and reside in thewaitinglane to visually separate execution pauses from active flow. - Retry logic is implemented via
failuretype states in theexceptionslane with transitions looping back to active states using theviarouting property. - Terminal states require
tag: "terminal"and placement in theterminallane, with the renderer enforcing zero outgoing transitions. - The
render-lifecycle.mjstool transforms these definitions into horizontal SVG diagrams with distinct visual tracks for each lane type.
Frequently Asked Questions
How does Archify distinguish between a temporary pause and a permanent failure?
Archify uses state types and lane assignment to differentiate these conditions. A temporary pause is a state with type: "waiting" placed in the waiting lane, indicating the process awaits external input. A permanent failure uses type: "failure" with tag: "terminal" in the terminal lane, signaling that no recovery transitions are permitted.
Can a terminal state transition to another state in Archify lifecycle diagrams?
No. The schema enforces that terminal states have no outgoing edges. When a state includes tag: "terminal" and resides in the terminal lane, the renderer automatically disables outgoing transitions, making it a strict endpoint. This validation prevents invalid state machine definitions where a process could exit and then resume.
What properties control the visual routing of retry arrows in Archify?
The via property in transition objects defines coordinate arrays for routing retry arrows around other states. Additionally, the variant property applies distinct styling classes (such as "security" or "default") to visually distinguish retry paths from standard transitions in the rendered SVG output.
Where is the formal schema definition for Archify lifecycle diagrams?
The formal JSON Schema is located at archify/schemas/lifecycle.schema.json in the tt-a1i/archify repository. This file defines the lanes array structure (lines 63-84), the type enum for state classifications (lines 101-113), and validation rules for transitions and state properties.
Have a question about this repo?
These articles cover the highlights, but your codebase questions are specific. Give your agent direct access to the source. Share this with your agent to get started:
curl -s "https://instagit.com/install.md" Maintain an open-source project? Get it listed too →