01 / One action, three operations.
A profile points to a submission operation, an authoritative request-status operation, and a resource read. The first binding supports one POST and two GET operations from an OpenAPI 3.1 document.
Agentic builds on existing techniques. Its proposed contribution is a consistent, testable set of rules that multiple clients can implement. It is not a new transport, a permission grant, or an exactly-once guarantee.
02 / The file.
Publish agentic.json or provide its URL directly to a supporting client. Use ordinary JSON and the versioned schema. Agents do not automatically discover or support this filename.
| Field | Purpose |
|---|---|
| agentic | The exact profile version. |
| origin | The authoritative HTTPS service origin. |
| submit / status / verify | Three operation IDs in your OpenAPI document. |
| request | Idempotency key scope and tracking window. |
| bindings | Request and resource path parameter names. |
| evidence | Resource identity, original request, state, and matching input. |
| recovery | Bounded checks and no automatic repeat writes. |
{
"$schema": "https://ruagentic.org/schemas/agentic-0.1.schema.json",
"agentic": "0.1.0-draft",
"origin": "https://support.example",
"actions": [
{
"id": "create-ticket",
"description": "Create a support ticket and verify the original result.",
"openapi": "/openapi.json",
"submit": "createTicket",
"status": "getRequestStatus",
"verify": "getTicket",
"request": {
"header": "Idempotency-Key",
"scope": "principal-action",
"retentionSeconds": 86400
},
"bindings": {
"statusRequestId": "requestId",
"verifyResourceId": "ticketId"
},
"evidence": {
"resourceIdPointer": "/id",
"requestIdPointer": "/request_id",
"statePointer": "/status",
"successValues": [
"open",
"closed"
],
"inputBindings": [
{
"inputPointer": "/subject",
"resourcePointer": "/subject"
}
]
},
"recovery": {
"maxChecks": 3,
"checkDelayMs": 100,
"timeoutMs": 3000,
"retry": "never-automatically"
}
}
]
}03 / The action lifecycle.
- Authorize the requested action using the host’s existing policy.
- Save the request ID and bind it to the origin, action, input, and profile snapshot before sending.
- Submit once. A lost response leaves the outcome unknown.
- Look up the original request. Use its resource ID to read the resulting record.
- Verify the resource ID, request ID, state, and required input evidence.
- Save a receipt. Preserve pending or unknown when completion cannot be verified.
After restart, the saved request is reconciled without automatically submitting another write. Expired tracking requires a handoff.
04 / Keep the evidence.
A receipt records the request, action, origin, outcome, observation time, and resulting resource. Successful receipts include the evidence source and checks performed.
Receipts belong in the authorized client’s storage. They can contain sensitive information and do not belong in the public manifest. A receipt records an observation; it is not a signature or a guarantee that the service is honest.
Receipt schema ↗05 / Explicit boundaries.
The service must actually implement atomic request tracking and deduplication. The client must enforce authorization, approved destinations, account isolation, timeouts, and response limits. The file cannot provide those controls on its own.
This draft supports a narrow same-origin OpenAPI binding. General workflow programming, cross-origin execution, payments, identity, and automatic mutation retries are outside its scope.
06 / A proposal to test.
The repository includes Node and Python reference clients, a loopback HTTP/SQLite service, and failure tests. Both clients share project authorship. Independent implementation and production adoption remain open goals.
This page is a reading guide. The normative draft and versioned schemas define the actual requirements.
Help test the proposal →