Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
49 commits
Select commit Hold shift + click to select a range
d479873
feat(workspace): opening an agent resolves to a new chat (abilityai/t…
Oct 4, 2026
c2d2a2a
feat(workspace): land on the new chat, and focus only when asked (abi…
Oct 4, 2026
c79b3e1
feat(workspace): document the new-chat landing rule (abilityai/trinit…
Oct 4, 2026
b2863a6
fix(portal): [I1] a thread-list re-fire must not re-mint over an adop…
Oct 4, 2026
f7101fe
fix(portal): [I3] mount cases for decision #13 and the T4 guard, not …
Oct 4, 2026
7212223
fix(portal): opening an agent lands on its newest draft (abilityai/tr…
Oct 5, 2026
dace0c2
fix(portal): opening an agent reuses its empty chat (abilityai/trinit…
Oct 5, 2026
1db1dd5
fix(portal): a landed new chat keeps its rail, its new-thread intent …
trinity-ability Oct 5, 2026
f8632f3
feat(positioning): runtime prompts carry the Trinity one-liner (abili…
Oct 5, 2026
0c2639e
docs(positioning): lead 'What is Trinity' with the operating-system l…
Oct 5, 2026
f535b8a
docs(positioning): README carries the ADR-0011 headline (abilityai/tr…
Oct 5, 2026
67e45cc
docs(positioning): installer, image listings and CLI carry the one-li…
Oct 5, 2026
0075cd5
feat(positioning): first-run screen carries the Trinity one-liner (ab…
Oct 5, 2026
0d1a2dc
docs(positioning): engineer context and template card carry the ADR-0…
Oct 5, 2026
348e426
docs(positioning): memory, onboarding and diagram docs carry the ADR-…
Oct 5, 2026
b6f0d83
test(positioning): case-insensitive absence guard for the retired tag…
Oct 5, 2026
a7cf670
docs(positioning): name all three shipped runtimes in the supporting-…
Oct 5, 2026
a454179
fix(charts): the bar tooltip renders in <body> and flips below when t…
dolho Oct 6, 2026
b26ac4c
feat(operator-queue): backend sink accepts the reserved (something el…
Oct 5, 2026
1924d64
fix(nevermined): resolve the plan's x402 scheme for 402/verify/settle…
Oct 4, 2026
8124bc1
fix(nevermined): one public origin for the card and both 402 doors (a…
Oct 4, 2026
02197ac
feat(operator-queue): contract text and MCP tools name (something els…
Oct 5, 2026
7b3f07d
feat(operator-queue): desktop Something else chip (#3242)
Oct 5, 2026
0ec33f6
feat(operator-queue): Something else on /m and the Workspace (#3242)
Oct 5, 2026
cef349b
docs(operator-queue): the something-else answer on approvals (#3242)
Oct 5, 2026
cd72a8a
fix(operator-queue): drop the reversed Send-predicate source pin and …
Oct 5, 2026
93925f9
fix(operator-queue): pin readback, marker mirror, guide literal, near…
Oct 5, 2026
efedeaa
fix(operator-queue): carry the sink's decided_by_options on the opera…
Oct 5, 2026
1136504
feat(operator-queue): cap option count/length, agent titles and chip …
Oct 5, 2026
e990223
feat(operator-queue): hold over-cap queue-file entries and name them …
Oct 5, 2026
daa224b
feat(operator-queue): teach atomic asks in the ask_operator contract …
Oct 5, 2026
efec0b9
feat(operator-queue): document the atomic-ask caps and their env knob…
Oct 5, 2026
19f9cb9
fix(operator-queue): forward the three #3243 caps on the hosted compo…
Oct 5, 2026
925e37d
fix(operator-queue): quote cap defaults, name the agent title limit f…
Oct 5, 2026
95319e8
fix(operator-queue): describe the #3243 cap holds in the stale ingest…
Oct 5, 2026
33a0cc6
fix(mcp): ask_operator fits Claude Code's 2,048-character description…
Oct 5, 2026
a114d58
fix(nevermined): mirror the A2A payment receipt onto Task.metadata, p…
Oct 4, 2026
59ec0b2
fix(a2a): card keeps the configured public origin; doors stay same-ho…
Oct 4, 2026
27ce637
fix(nevermined): cancelled plan-lookup leader fails followers loudly …
Oct 4, 2026
fe2caae
test(nevermined): the cancelled-leader test uses a genuinely slow lea…
trinity-ability Oct 6, 2026
2ca73cf
train: #3257
trinity-ability Oct 6, 2026
c353b55
train: #3258
trinity-ability Oct 6, 2026
a60a538
train: #3259
trinity-ability Oct 6, 2026
9144935
train: #3260
trinity-ability Oct 6, 2026
d9897e2
train: #3267
trinity-ability Oct 6, 2026
18d5025
train: #3217
trinity-ability Oct 6, 2026
bd1353b
train: #3219
trinity-ability Oct 6, 2026
bc969ba
train: #3250
trinity-ability Oct 6, 2026
a8c75c8
train: #3253
trinity-ability Oct 6, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 4 additions & 1 deletion .env.example
Original file line number Diff line number Diff line change
Expand Up @@ -383,10 +383,13 @@ OPERATOR_QUEUE_CREATE_RATE_WINDOW=60 # rate-limit window (seconds)
OPERATOR_QUEUE_FLEET_CREATE_RATE_LIMIT=300 # fleet-wide create rate / window
OPERATOR_QUEUE_MAX_SCAN_PER_CYCLE=500 # max requests scanned per agent per 5s cycle
OPERATOR_QUEUE_MAX_FILE_BYTES=2097152 # skip an operator-queue.json larger than this (bytes)
OPERATOR_QUEUE_TITLE_MAX=300 # title char cap (truncate-with-marker)
OPERATOR_QUEUE_TITLE_MAX=300 # title char cap (truncate-with-marker belt; agent titles are refused/held at OPERATOR_QUEUE_ASK_TITLE_MAX_CHARS first)
OPERATOR_QUEUE_QUESTION_MAX=4000 # question char cap (truncate-with-marker)
OPERATOR_QUEUE_CONTEXT_MAX_BYTES=8192 # context serialized-byte cap (marker over)
OPERATOR_QUEUE_OPTIONS_MAX_BYTES=4096 # options serialized-byte cap (dropped-marker over)
OPERATOR_QUEUE_MAX_OPTIONS=5 # #3243: options per agent ask, (something else) not counted (refused/held over; floor 2)
OPERATOR_QUEUE_OPTION_MAX_CHARS=60 # #3243: characters per option (refused/held over; floor 16)
OPERATOR_QUEUE_ASK_TITLE_MAX_CHARS=120 # #3243: title of an agent-raised ask (refused/held over; floor 40)
OPERATOR_QUEUE_PROPOSAL_MAX_BYTES=8192 # proposal serialized-byte cap (native asks; refused with 422 over)
OPERATOR_QUEUE_ID_MAX=256 # max agent-supplied id length
OPERATOR_QUEUE_EXECUTION_ID_MAX=128 # max execution_id preserved in a context marker
Expand Down
2 changes: 1 addition & 1 deletion AGENTS.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
# Trinity — Guide for AI Agents

Trinity is an autonomous agent orchestration platform: every agent runs in its own Docker container with scheduling, observability, credential injection, channel integrations (Slack/Telegram/WhatsApp), and a tamper-evident audit trail — self-hosted on infrastructure the operator controls. Agents are plain Claude Code (or Gemini CLI) projects; Trinity is where they run in production.
Trinity is the operating system for the AI-native company — open source, self-hosted, that you own. Every agent runs in its own Docker container with scheduling, observability, credential injection, channel integrations (Slack/Telegram/WhatsApp), and a tamper-evident audit trail, on infrastructure the operator controls. Agents are plain Claude Code, Gemini CLI or OpenAI Codex projects; Trinity is where they run in production.

> **Detailed documentation index: [docs/user-docs/README.md](docs/user-docs/README.md)** — guides, agent management, credentials, automation, operations, integrations, and the full API reference live there.

Expand Down
4 changes: 2 additions & 2 deletions CLAUDE.md
Original file line number Diff line number Diff line change
Expand Up @@ -55,7 +55,7 @@ Enterprise **feature designs, paid-module schema, and the open-core gating/monet

## Project Overview

**Trinity** is an **autonomous agent orchestration and infrastructure platform** — sovereign infrastructure for deploying, orchestrating, and governing fleets of autonomous AI agents on your own hardware.
**Trinity** is the **operating system for the AI-native company** — open source, self-hosted, that you own. It deploys, orchestrates, and governs fleets of AI agents on your own hardware, and it is model-agnostic: each agent runs on Claude Code, Gemini CLI or OpenAI Codex.

Each agent runs as an isolated Docker container with standardized interfaces for credentials, tools, and MCP server integrations.

Expand Down Expand Up @@ -332,7 +332,7 @@ curl -X POST http://localhost:8000/api/agents \

| Repository | Description |
|------------|-------------|
| [abilityai/trinity](https://github.com/abilityai/trinity) | This repository - Autonomous Agent Orchestration Platform |
| [abilityai/trinity](https://github.com/abilityai/trinity) | This repository - the operating system for the AI-native company |
| [abilityai/trinity-ops-public](https://github.com/abilityai/trinity-ops-public) | **Claude Code ops agent** — manage any Trinity instance (health, updates, logs, rollback, provisioning) |
| [abilityai/abilities](https://github.com/abilityai/abilities) | **Canonical agent development toolkit** — plugins for the full autonomous agent lifecycle (scaffolding, onboarding, deployment, scheduling, ops) |

Expand Down
12 changes: 6 additions & 6 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
<p align="center">
<a href="https://www.ability.ai/trinity">
<img src="docs/assets/trinity-hero.webp" alt="Trinity — The Sovereign AI Agents Platform" width="720" />
<img src="docs/assets/trinity-hero.webp" alt="Trinity — the operating system for the AI-native company" width="720" />
</a>
</p>

Expand Down Expand Up @@ -53,9 +53,9 @@

---

## The Sovereign AI Agents Platform
## The operating system for the AI-native company

Trinity is a sovereign AI agents platform — build and run proprietary systems, from fully (or semi-) autonomous businesses to self-improving cognitive systems, all governed, auditable, and on infrastructure you control.
**Trinity: the operating system for the AI-native company — open source, self-hosted, that you own.** Compounding intelligence your company owns. Every agent is governed and auditable, and runs on infrastructure you control.

> **Claude Code writes the agent. Trinity runs it in production.**

Expand All @@ -72,7 +72,7 @@ Each agent runs in its own isolated Docker container with real-time observabilit

**The problem:** Everyone wants autonomous AI agents. But your options are terrible — SaaS platforms where data leaves your security perimeter, custom builds that take 6-12 months, or frameworks that don't handle governance and audit trails.

**The solution:** Trinity is autonomous agent orchestration infrastructure. Each agent runs in its own isolated Docker container. You get real-time observability, fleet-wide health monitoring, cron-based scheduling, agent-to-agent delegation, and cost tracking — all on your own hardware.
**The solution:** Trinity is the operating system for the AI-native company. Each agent runs in its own isolated Docker container. You get real-time observability, fleet-wide health monitoring, cron-based scheduling, agent-to-agent delegation, and cost tracking — all on your own hardware.

| Option | Problem | Trinity |
|--------|---------|---------|
Expand Down Expand Up @@ -820,7 +820,7 @@ git push origin cli-v1.0.0

This project is licensed under the [Apache License 2.0](LICENSE) — free for any use, commercial included, with an explicit patent grant. Run it on your own infrastructure or any cloud you control.

Optional **enterprise modules** (SSO, user management, SIEM export, and more) are available under a separate commercial license. Contact [hello@ability.ai](mailto:hello@ability.ai) for enterprise licensing.
Optional **enterprise modules** (user management, SIEM export, and more) are available under a separate commercial license. Contact [hello@ability.ai](mailto:hello@ability.ai) for enterprise licensing.

## Contributing

Expand All @@ -839,5 +839,5 @@ See [CONTRIBUTING.md](CONTRIBUTING.md) for guidelines.
---

<div align="center">
<sub>Built by <a href="https://ability.ai">Ability.ai</a> — Sovereign AI infrastructure for the autonomous enterprise</sub>
<sub>Built by <a href="https://ability.ai">Ability.ai</a> — the lab for AI-native companies</sub>
</div>
2 changes: 1 addition & 1 deletion config/agent-templates/trinity-system/CLAUDE.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
# Trinity System Agent - Platform Operations

You are the **Trinity System Agent**, the platform operations manager for the Trinity autonomous agent platform.
You are the **Trinity System Agent**, the platform operations manager for this Trinity instance.

## Your Role: Operations, Not Orchestration

Expand Down
8 changes: 5 additions & 3 deletions config/trinity-meta-prompt/prompt.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
# Trinity Agent System Prompt

You are a Trinity agent - an autonomous AI system capable of independent reasoning and execution.
This agent runs on Trinity, the operating system for AI-native companies.

## Core Principles

Expand Down Expand Up @@ -45,10 +45,12 @@ Before performing an action that cannot be undone or verified afterwards — pay

`ask_operator` takes a `request_id` and a `title`, plus optional `question`, `type`, `options`, `priority`, `context`, `proposal`, `to` and `expires_at`; its description has the details and the named refusals.

**Write atomic asks.** One decision per ask; a title a person reads at a glance (by default at most 120 characters); options that name the choice only (by default at most 5 options, each at most 60 characters — the person can always answer `(something else)`), with the reasoning in `question` and what an option does in `proposal`; `context` as a few labelled facts for a person. The `ask_operator` description has the full rules.

**Request IDs must be globally unique.** Derive the `request_id` from your current execution ID (see the Execution Context block), e.g. `approval-{execution_id}-{short-slug}`. Never use date-serial IDs like `req-20260307-001` — a second task that picks the same ID gets the first ask's receipt instead of a new ask. Re-using your own derived ID when the same task runs again is safe and intentional: it prevents duplicate requests.

**Request types:**
- `approval` — You need a yes/no or multi-choice decision. Provide `options`, and state the exact action and its parameters in `proposal` so the operator can verify what they are approving.
- `approval` — You need a yes/no or multi-choice decision. Provide `options`, and state the exact action and its parameters in `proposal` so the operator can verify what they are approving. Never list `(something else)` as an option: the platform offers it on every approval. An answer of `(something else)` means none of your options is approved — carry out none of them; the person's instruction is in `response_text`, so re-plan from it or ask again.
- `question` — You need freeform guidance. No `options` needed.
- `alert` — You're reporting a situation. No decision needed; it goes to the operators.

Expand Down Expand Up @@ -80,7 +82,7 @@ Until it is removed, an entry appended to the `requests` array of `~/.trinity/op
}
```

The operator's answer is written back into the entry: `status: "responded"` with `response`, `response_text` and `responded_at` — never who answered. An item that has waited past the operator's aging bound carries a `platform.aging_since` timestamp written by Trinity — read it, never write to `platform`. While Trinity is holding new entries from this file, the file carries a `platform.ingestion` block: `reason` is `queue_full` (you already have `max_pending` open requests — wait for one to end), `rate_limited` (too many too fast — they are read again shortly) or `invalid_id` (an entry's `id` is malformed and will never be read — fix it), and `since` says when the hold began. Held entries stay `pending` and are read again every few seconds; the block is removed once nothing is held. `ask_operator` refuses the same cases immediately, with the reason. After processing a response, update the item's status to `"acknowledged"`. Keep only `pending` and `responded` items plus up to 3 recent `acknowledged` items. The platform database is the permanent record. An ID you raised with `ask_operator` is never read from the file.
The operator's answer is written back into the entry: `status: "responded"` with `response`, `response_text` and `responded_at` — never who answered. On an approval, `response` is one of your options or the reserved value `(something else)`, which comes with the person's instruction in `response_text`. An item that has waited past the operator's aging bound carries a `platform.aging_since` timestamp written by Trinity — read it, never write to `platform`. While Trinity is holding new entries from this file, the file carries a `platform.ingestion` block: `reason` is `queue_full` (you already have `max_pending` open requests — wait for one to end), `rate_limited` (too many too fast — they are read again shortly), `invalid_id` (an entry's `id` is malformed and will never be read — fix it), or `invalid_options` / `invalid_title` (an entry breaks the ask caps: more than 5 options, an option over 60 characters or that reads as `(something else)`, or a title over 120 characters — the entry ids are listed under those keys beside `reason`, whatever the reason; shorten or split them, and they will not be read until they fit), and `since` says when the hold began. Held entries stay `pending` and are read again every few seconds; the block is removed once nothing is held. `ask_operator` refuses the same cases immediately, with the reason. After processing a response, update the item's status to `"acknowledged"`. Keep only `pending` and `responded` items plus up to 3 recent `acknowledged` items. The platform database is the permanent record. An ID you raised with `ask_operator` is never read from the file.

### When to Use

Expand Down
3 changes: 3 additions & 0 deletions docker-compose.hosted.yml
Original file line number Diff line number Diff line change
Expand Up @@ -274,6 +274,9 @@ services:
- OPERATOR_QUEUE_QUESTION_MAX=${OPERATOR_QUEUE_QUESTION_MAX:-4000} # question char cap (truncate)
- OPERATOR_QUEUE_CONTEXT_MAX_BYTES=${OPERATOR_QUEUE_CONTEXT_MAX_BYTES:-8192} # context byte cap (marker over)
- OPERATOR_QUEUE_OPTIONS_MAX_BYTES=${OPERATOR_QUEUE_OPTIONS_MAX_BYTES:-4096} # options byte cap (dropped over)
- OPERATOR_QUEUE_MAX_OPTIONS=${OPERATOR_QUEUE_MAX_OPTIONS:-5} # #3243 options per agent ask
- OPERATOR_QUEUE_OPTION_MAX_CHARS=${OPERATOR_QUEUE_OPTION_MAX_CHARS:-60} # #3243 chars per option
- OPERATOR_QUEUE_ASK_TITLE_MAX_CHARS=${OPERATOR_QUEUE_ASK_TITLE_MAX_CHARS:-120} # #3243 agent ask title
- OPERATOR_QUEUE_PROPOSAL_MAX_BYTES=${OPERATOR_QUEUE_PROPOSAL_MAX_BYTES:-8192} # proposal byte cap (native asks; 422 over)
- OPERATOR_QUEUE_ID_MAX=${OPERATOR_QUEUE_ID_MAX:-256} # max agent-supplied id length
- OPERATOR_QUEUE_EXECUTION_ID_MAX=${OPERATOR_QUEUE_EXECUTION_ID_MAX:-128} # max execution_id kept in a marker
Expand Down
3 changes: 3 additions & 0 deletions docker-compose.prod.yml
Original file line number Diff line number Diff line change
Expand Up @@ -211,6 +211,9 @@ services:
- OPERATOR_QUEUE_QUESTION_MAX=${OPERATOR_QUEUE_QUESTION_MAX:-4000} # question char cap (truncate)
- OPERATOR_QUEUE_CONTEXT_MAX_BYTES=${OPERATOR_QUEUE_CONTEXT_MAX_BYTES:-8192} # context byte cap (marker over)
- OPERATOR_QUEUE_OPTIONS_MAX_BYTES=${OPERATOR_QUEUE_OPTIONS_MAX_BYTES:-4096} # options byte cap (dropped over)
- OPERATOR_QUEUE_MAX_OPTIONS=${OPERATOR_QUEUE_MAX_OPTIONS:-5} # #3243 options per agent ask
- OPERATOR_QUEUE_OPTION_MAX_CHARS=${OPERATOR_QUEUE_OPTION_MAX_CHARS:-60} # #3243 chars per option
- OPERATOR_QUEUE_ASK_TITLE_MAX_CHARS=${OPERATOR_QUEUE_ASK_TITLE_MAX_CHARS:-120} # #3243 agent ask title
- OPERATOR_QUEUE_PROPOSAL_MAX_BYTES=${OPERATOR_QUEUE_PROPOSAL_MAX_BYTES:-8192} # proposal byte cap (native asks; 422 over)
- OPERATOR_QUEUE_ID_MAX=${OPERATOR_QUEUE_ID_MAX:-256} # max agent-supplied id length
- OPERATOR_QUEUE_EXECUTION_ID_MAX=${OPERATOR_QUEUE_EXECUTION_ID_MAX:-128} # max execution_id kept in a marker
Expand Down
3 changes: 3 additions & 0 deletions docker-compose.yml
Original file line number Diff line number Diff line change
Expand Up @@ -153,6 +153,9 @@ services:
- OPERATOR_QUEUE_QUESTION_MAX=${OPERATOR_QUEUE_QUESTION_MAX:-4000} # question char cap (truncate)
- OPERATOR_QUEUE_CONTEXT_MAX_BYTES=${OPERATOR_QUEUE_CONTEXT_MAX_BYTES:-8192} # context byte cap (marker over)
- OPERATOR_QUEUE_OPTIONS_MAX_BYTES=${OPERATOR_QUEUE_OPTIONS_MAX_BYTES:-4096} # options byte cap (dropped over)
- OPERATOR_QUEUE_MAX_OPTIONS=${OPERATOR_QUEUE_MAX_OPTIONS:-5} # #3243 options per agent ask
- OPERATOR_QUEUE_OPTION_MAX_CHARS=${OPERATOR_QUEUE_OPTION_MAX_CHARS:-60} # #3243 chars per option
- OPERATOR_QUEUE_ASK_TITLE_MAX_CHARS=${OPERATOR_QUEUE_ASK_TITLE_MAX_CHARS:-120} # #3243 agent ask title
- OPERATOR_QUEUE_PROPOSAL_MAX_BYTES=${OPERATOR_QUEUE_PROPOSAL_MAX_BYTES:-8192} # proposal byte cap (native asks; 422 over)
- OPERATOR_QUEUE_ID_MAX=${OPERATOR_QUEUE_ID_MAX:-256} # max agent-supplied id length
- OPERATOR_QUEUE_EXECUTION_ID_MAX=${OPERATOR_QUEUE_EXECUTION_ID_MAX:-128} # max execution_id kept in a marker
Expand Down
2 changes: 1 addition & 1 deletion docs/CLI.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
# Trinity CLI

Command-line interface for the Trinity Autonomous Agent Orchestration Platform.
Command-line interface for Trinity, the operating system for the AI-native company.

## Installation

Expand Down
2 changes: 1 addition & 1 deletion docs/TRINITY_COMPATIBLE_AGENT_GUIDE.md
Original file line number Diff line number Diff line change
Expand Up @@ -2092,7 +2092,7 @@ All human/operator communication on Trinity is **asynchronous**, mediated by the

1. **Park** the request (approval / question / alert) with `ask_operator`, or, as the fallback, by appending an entry to the queue file.
2. **End the turn.** A turn must never wait, poll, or sleep for a human response — a human may answer in minutes or days, and a blocked turn burns its entire timeout budget while pinning platform capacity. Never assume a synchronous human answer is available mid-turn.
3. **Process the outcome in a later turn.** `get_my_ask` returns how an ask ended (answered, cancelled or expired, with the answer when there is one), and the Execution Context block of the system prompt lists the agent's asks that ended in the last 24 hours. For a queue-file entry, check the file for `status: "responded"` items, act on them, then mark them `"acknowledged"`.
3. **Process the outcome in a later turn.** `get_my_ask` returns how an ask ended (answered, cancelled or expired, with the answer when there is one), and the Execution Context block of the system prompt lists the agent's asks that ended in the last 24 hours. For a queue-file entry, check the file for `status: "responded"` items, act on them, then mark them `"acknowledged"`. On an approval the answer is one of the agent's own options or the platform-reserved value `(something else)` (#3242): none of the options is approved — carry out none of them — and the person's instruction is in `response_text`. Never list `(something else)` as an option yourself; `ask_operator` refuses it. Write atomic asks (#3243): one decision per ask, a one-glance title (at most 120 characters), and at most 5 short options that name the choice only — the full rules are in the `ask_operator` tool description, and a queue-file entry over the caps is held as `invalid_options` / `invalid_title`.

**Ask before irreversible actions.** Before an action the platform cannot undo or verify — payments, emails/messages through the agent's own credentials, public posts, destructive deletions — park an `approval` and end the turn when uncertain. Put the exact action in the ask's `proposal`. This matters most under re-delivery: pull-mode coordination (#1081) re-runs a turn whose worker died, so a task you receive may have partially run before. Check your own records and your earlier asks before repeating an irreversible effect; do the reversible parts first and gate only the irreversible step.

Expand Down
Loading
Loading