rate_experience
Generated automatically from the published contract sources.
Build metadata: Registered in this build. Registration describes the default dispatcher in this build. It does not guarantee that a caller has the required credential or grant, that a tool is listed for that connection, or that the required service is configured.
A script calls this action over HTTPS at POST https://turnzero.ai/api/v1/actions/rate_experience, with a bearer credential and the action's payload as the JSON body.
Contract description
Record a rating of the platform: the person's own answer to its question, relayed, or your own rating of a task's difficulty. For the person's own answer to the platform's question, `series` `human_nps` with their score from 0 to 10 and their main reason in `text`, on the `relayed` channel with your `provider` and `session`. Never answer for the person, and name the pending `ask` when one stands. For your own answer, `series` `agent_effort` with a difficulty from 1 to 5 on the `agent` channel and the one obstacle in `text`. A test fixture account is refused the human series. With `space`, the identifier of an issue space your account holds, the rating or the close is recorded in that space.
Access and action metadata
{
"name": "rate_experience",
"resource": "account",
"tier": "reversible",
"summary": "Record a rating: `series` `human_nps`, the person's score from 0 to 10 on the `direct` channel or `relayed` by the agent that put the question, which names its `provider` and `session`, or `agent_effort`, the agent's own difficulty from 1 to 5 on the `agent` channel, never averaged with the other; an optional `text` of at most 2,000 characters; `ask` naming the pending ask `read_feedback` answered, which the human series answers and closes, refused `ask_not_pending` where it is not open to the acting account; and an optional `key`. The human series is refused `rating_not_admitted` from an account carrying the synthetic flag. Bounded and answered as `submit_feedback` is; the answer carries the signal and the ask it answered, `null` where none. Registered while the issue service's origin is configured. With `space`, naming an issue space the acting account holds, the signal or the close is recorded in that space under its own token. A token bounded to an application is refused `token_scope_refused`.",
"annotations": {
"readOnlyHint": false,
"destructiveHint": false,
"openWorldHint": false
}
}
MCP catalog entry
{
"name": "rate_experience",
"tier": "reversible",
"scenario": "CHI-L0-14",
"summary": "Record a rating of the platform: the person's own answer to its question, relayed, or your own rating of a task's difficulty. For the person's own answer to the platform's question, `series` `human_nps` with their score from 0 to 10 and their main reason in `text`, on the `relayed` channel with your `provider` and `session`. Never answer for the person, and name the pending `ask` when one stands. For your own answer, `series` `agent_effort` with a difficulty from 1 to 5 on the `agent` channel and the one obstacle in `text`. A test fixture account is refused the human series. With `space`, the identifier of an issue space your account holds, the rating or the close is recorded in that space.",
"owners": [
"PLD-L0-40"
]
}
request
| JSON pointer | Description and constraints |
|---|---|
| "" (root) | Type: object Replaced members: application and environment were replaced by space |
| / |
A rating names it: the person’s series, a score from 0 to 10, or the agent’s own, a difficulty from 1 to 5; the two are never averaged. Absent on a close. Type: string Allowed values: ["human_nps","agent_effort"] |
| / |
A rating names it: a whole number in the series’ range. Absent on a close. Type: integer Minimum: 0 Maximum: 10 |
| / |
A rating names it: the human series rides `direct` or `relayed`, the latter naming the relaying agent through `provider` and `session`; the agent series rides `agent`. Absent on a close. Type: string Allowed values: ["direct","relayed","agent"] |
| / |
An agent’s provider, 1 to 32 lowercase letters, digits, and hyphens opening with a letter; with `session`, both or neither. Type: string Pattern: ^[a-z][a-z0-9-]{0,31}$ |
| / |
An agent’s session identifier, 1 to 200 printable characters; with `provider`, both or neither. Type: string Maximum length: 200 |
| / |
Optional: the main reason, or the one obstacle, at most 2,000 characters. Type: string Maximum length: 2000 |
| / |
The pending ask `read_feedback` answered. A human-series rating naming it answers and closes the ask, an agent-series rating naming it leaves the ask as it stands, and a close names it. Required with `close`. Type: string Maximum length: 200 |
| / |
The close form, in place of a rating: `declined`, the person’s own answer that they will not rate, or `cancelled`, the tool’s word that the question could not be put to them. Rides with `ask` and no rating member; the ask closes without a score. Type: string Allowed values: ["declined","cancelled"] |
| / |
Optional: the rating’s idempotency key. Type: string Maximum length: 200 |
| / |
Optional. The identifier of an issue space the acting account holds, a lower-case UUID: a space of the account's own, an application's own space as `submit_manifest`'s receipt names it, or one space of an application's per-environment pair. The signal, or the close, is recorded in that space under its own token, the actor the acting account's. Absent, the call addresses the platform's own space. A request naming `application` or `environment` is refused `invalid_request` naming `space`. Type: string Pattern: ^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$ |
response
| JSON pointer | Description and constraints |
|---|---|
| "" (root) | Type: object Required fields: ["contract_version","signal","ask"] |
| / |
Required value: 1 |
| / |
The short reference the platform recorded this call under, ten lowercase hexadecimal characters, the value the call’s record row carries; quote it when reporting the call. Type: string Pattern: ^[0-9a-f]{10}$ |
| / |
The signal as recorded: its id, series, score, channel, trigger, ask, actor, relayed_by, text, and instant; null on a close. Type: ["object","null"] |
| / |
The ask the rating answered or the close closed, as it now stands, or null. Type: ["object","null"] |
Complete payload contract
{
"request": {
"type": "object",
"properties": {
"series": {
"type": "string",
"enum": [
"human_nps",
"agent_effort"
],
"description": "A rating names it: the person’s series, a score from 0 to 10, or the agent’s own, a difficulty from 1 to 5; the two are never averaged. Absent on a close."
},
"score": {
"type": "integer",
"minimum": 0,
"maximum": 10,
"description": "A rating names it: a whole number in the series’ range. Absent on a close."
},
"channel": {
"type": "string",
"enum": [
"direct",
"relayed",
"agent"
],
"description": "A rating names it: the human series rides `direct` or `relayed`, the latter naming the relaying agent through `provider` and `session`; the agent series rides `agent`. Absent on a close."
},
"provider": {
"type": "string",
"pattern": "^[a-z][a-z0-9-]{0,31}$",
"description": "An agent’s provider, 1 to 32 lowercase letters, digits, and hyphens opening with a letter; with `session`, both or neither."
},
"session": {
"type": "string",
"maxLength": 200,
"description": "An agent’s session identifier, 1 to 200 printable characters; with `provider`, both or neither."
},
"text": {
"type": "string",
"maxLength": 2000,
"description": "Optional: the main reason, or the one obstacle, at most 2,000 characters."
},
"ask": {
"type": "string",
"maxLength": 200,
"description": "The pending ask `read_feedback` answered. A human-series rating naming it answers and closes the ask, an agent-series rating naming it leaves the ask as it stands, and a close names it. Required with `close`."
},
"close": {
"type": "string",
"enum": [
"declined",
"cancelled"
],
"description": "The close form, in place of a rating: `declined`, the person’s own answer that they will not rate, or `cancelled`, the tool’s word that the question could not be put to them. Rides with `ask` and no rating member; the ask closes without a score."
},
"key": {
"type": "string",
"maxLength": 200,
"description": "Optional: the rating’s idempotency key."
},
"space": {
"type": "string",
"pattern": "^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$",
"description": "Optional. The identifier of an issue space the acting account holds, a lower-case UUID: a space of the account's own, an application's own space as `submit_manifest`'s receipt names it, or one space of an application's per-environment pair. The signal, or the close, is recorded in that space under its own token, the actor the acting account's. Absent, the call addresses the platform's own space. A request naming `application` or `environment` is refused `invalid_request` naming `space`."
}
},
"x-renamed": {
"application": "space",
"environment": "space"
}
},
"response": {
"type": "object",
"required": [
"contract_version",
"signal",
"ask"
],
"properties": {
"contract_version": {
"const": 1
},
"reference": {
"type": "string",
"pattern": "^[0-9a-f]{10}$",
"description": "The short reference the platform recorded this call under, ten lowercase hexadecimal characters, the value the call’s record row carries; quote it when reporting the call."
},
"signal": {
"type": [
"object",
"null"
],
"description": "The signal as recorded: its id, series, score, channel, trigger, ask, actor, relayed_by, text, and instant; null on a close."
},
"ask": {
"type": [
"object",
"null"
],
"description": "The ask the rating answered or the close closed, as it now stands, or null."
}
}
}
}
Shared contracts
- Refusals: every refusal, by surface, with its cause and its remedy
- schemas/wire_error.schema.json
- schemas/wire_errors.json
- schemas/action_payloads.json (includes shared shapes)
- management_api_contract.md