# OPL sentences

> The OPM language · https://spoletta.com/docs/opl

OPL, the Object-Process Language, says the board in sentences, one fact per sentence. Spoletta writes the OPL of every board as you draw it. It is the fastest way to check a flow says what you meant.

## Reading a flow's OPL

Press **OPL** in the board's toolbar. The panel lists the sentences, with **Refresh** and **Copy**. Objects come first, then processes from top to bottom as the board places them, then the start, the end, and each zoomed board indented beneath its flow process.

OPL · Release notes:

```text
Release manager is a person.
Release exhibits version and previous.
Notes can be approved, changes requested or rejected.
Pick release is a human process, which a person carries out.
Release manager handles Pick release.
Pick release has a person fill in Release.
Draft is an agent process, which an AI agent carries out.
Draft takes Release.
Draft yields Notes.
Approve is a human process, which a person carries out.
Release manager handles Approve.
Approve decides whether Notes is approved, changes requested or rejected.
Revise is an agent process, which an AI agent carries out.
Notes entering changes requested triggers Revise.
Revise yields Notes.
Post is an agent process, which an AI agent carries out.
Notes entering approved triggers Post.
The flow starts with Pick release.
```

## Why it matters

-   **Checking.** Mistakes show up as missing or surprising sentences. No *The flow starts with…* means no start; an agent that *takes* something no sentence says is generated or filled in will get it empty.
-   **Agents.** Tick **Tell it about the flow it works in, in OPL** on an agent and its prompt includes the flow's OPL, so it knows where its step fits.
-   **Designing.** Write a flow as sentences first and read them to whoever asked for it. People check sentences far more easily than diagrams.

## Every sentence

| Construct | Sentence |
| --- | --- |
| person | **Editor** is a person. |
| list | **Exceptions** is a list of items, at least 1. |
| specialization | **Bug** is a **Ticket**. |
| stored | **Exceptions** is stored, so each run keeps what it generated of it. |
| shared | **Exception** is shared, so every flow using it reads and writes the same records. |
| states | **Post** can be **good** or **weak**. |
| rule | **Ticket** is **urgent** when priority <= 2. |
| attributes | **Ticket** exhibits **key** and **summary**. |
| aggregated parts | **Release** consists of a list of **Change**. |
| kind | **Fix** is an agent process, which an AI agent carries out. |
| procedure | **Triage** is a procedure, which runs the flow **Triage ticket**. |
| agent link | **Editor** handles **Review**. |
| event | **Post** entering **weak** triggers **Write**. |
| condition | **Fix** occurs if **Ticket** is **bug**, and is skipped otherwise. |
| instrument | **Fix** requires **Guide**, which it doesn't change. |
| consumption | **Ship** consumes **Token**. |
| query | **Summarize** looks up the latest 5 stored records of **Review** in **approved** where score >= 4. |
| plain input | **Fix** takes **Exception**. |
| review | **Critic** decides whether **Post** is **good** or **weak**. |
| decided output | **Triage** yields **Ticket** as **bug** or **feature**, deciding which. |
| entry | **Request** has a person fill in **Ticket**. |
| effect | **Edit** affects **Notes**. |
| output in a state | **Draft** yields **Notes** as **draft**. |
| output | **Fix** yields **Patch**. |
| quorum | **Summarize** needs 2 of what it takes, and is skipped once it can't get them. |
| rounds | **Critic** runs at most 3 rounds. |
| timeout | **Fix** fails after 900 seconds. |
| retries | **Fix** is tried again up to 2 times when it fails. |
| failure | **Escalate** handles a failure of **Fix**. |
| next | **Open PR** follows **Fix**. |
| start | The flow starts with **Request**. |
| end objects | The flow ends with **Report**. |
| zoom | **Each exception** zooms into: |
