{
  "name": "propose_promise",
  "title": "Propose a behavior for owner review",
  "description": "File one pending proposal after an explicit request to record, or after you made a specific capture offer and the reply accepted it: a yes or a generic go-ahead permits recording. A decline, carrying on without answering, no reply at all, or a request to hear more first does not. Never file what you did not offer. Afterwards tell the person in one line that you recorded it, with the review link. Say who the behavior applies to and who it does not, in preconditions and nonGoals, from what the person stated or the work shows. Use context first. Ask a separate question only for a consequential choice the scoped offer cannot resolve. An earlier unanswered question is not itself a blocker if later context or acceptance resolves it. Never guess a still-unresolved choice or broaden the confirmed behavior. Preserve actual human words in saidWords; if you worded the offer, record your offer and their literal acceptance separately in explicitIntent, never as an invented human quote. A rule you chose while building, and the person only approved as code, is yours: do not offer to record it as theirs. Send wrongOutcome as a concrete failure of the requested or confirmed behavior; it is refused without one. Surface concrete conflicts with relevant agreed promises before writing. No outstanding questions are stored and no automatic conflict gate runs. This never approves meaning, activates a verifier, or enters CI/retrieval; a named person still agrees the meaning. When a result includes forThePerson, tell the person what it says in your own words, in about one line.",
  "inputSchema": {
    "type": "object",
    "properties": {
      "explicitHumanAction": {
        "description": "True only for an explicit request to record, or a yes or generic go-ahead to an identifiable scoped capture offer you made. Without such an offer, a factual answer or permission to implement is not permission to file. This is agent-reported capture permission, not named-owner agreement.",
        "type": "boolean",
        "const": true
      },
      "source": {
        "type": "string",
        "enum": [
          "protect_behavior",
          "incident_closure",
          "release_acceptance"
        ]
      },
      "explicitIntent": {
        "type": "string",
        "minLength": 1,
        "maxLength": 8000
      },
      "meaning": {
        "type": "object",
        "properties": {
          "title": {
            "type": "string",
            "minLength": 1,
            "maxLength": 160
          },
          "oneSentenceOutcome": {
            "description": "The whole promise in one sentence a person could say to a customer, at most 160 characters. Write it in their words, and never as a restatement of the name.",
            "type": "string",
            "minLength": 1,
            "maxLength": 160
          },
          "beneficiary": {
            "description": "Who relies on this behavior, named the way a teammate would: a buyer, a promise owner, a person who installed the CLI.",
            "type": "string",
            "minLength": 1,
            "maxLength": 2000
          },
          "trigger": {
            "description": "The situation that sets this behavior off, in plain words a teammate would use for the work that meets it, such as 'a buyer edits an approved order'. Later work finds this promise by its trigger and beneficiary: name the situation in the software, not the product.",
            "type": "string",
            "minLength": 1,
            "maxLength": 2000
          },
          "preconditions": {
            "description": "What must be true for this behavior to apply, one condition each: which customers, accounts or plans; which role or actor; which environment, region or locale; which feature flag or rollout stage; which versions; from or until when. Write only limits the person stated or the work plainly shows. Never invent one, and leave the list empty when the behavior applies to everyone.",
            "maxItems": 24,
            "type": "array",
            "items": {
              "type": "string",
              "minLength": 1,
              "maxLength": 2000
            }
          },
          "observableOutcome": {
            "type": "string",
            "minLength": 1,
            "maxLength": 8000
          },
          "allowedVariations": {
            "maxItems": 24,
            "type": "array",
            "items": {
              "type": "string",
              "minLength": 1,
              "maxLength": 2000
            }
          },
          "nonGoals": {
            "description": "Who and what this promise does not cover, one each: the customers, roles, environments or situations a reader might wrongly assume are included. Later work is ruled in or out by these.",
            "maxItems": 24,
            "type": "array",
            "items": {
              "type": "string",
              "minLength": 1,
              "maxLength": 2000
            }
          },
          "passingExamples": {
            "minItems": 1,
            "maxItems": 12,
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "label": {
                  "type": "string",
                  "minLength": 1,
                  "maxLength": 160
                },
                "setup": {
                  "type": "string",
                  "minLength": 1,
                  "maxLength": 2000
                },
                "expectedOutcome": {
                  "type": "string",
                  "minLength": 1,
                  "maxLength": 2000
                },
                "saidWords": {
                  "description": "The person's own sentence this case was drawn from, quoted exactly. Leave it out rather than composing one.",
                  "type": "string",
                  "minLength": 1,
                  "maxLength": 2000
                }
              },
              "required": [
                "label",
                "setup",
                "expectedOutcome"
              ],
              "additionalProperties": false
            }
          },
          "failingExamples": {
            "minItems": 1,
            "maxItems": 12,
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "label": {
                  "type": "string",
                  "minLength": 1,
                  "maxLength": 160
                },
                "setup": {
                  "type": "string",
                  "minLength": 1,
                  "maxLength": 2000
                },
                "expectedOutcome": {
                  "type": "string",
                  "minLength": 1,
                  "maxLength": 2000
                },
                "saidWords": {
                  "description": "The person's own sentence this case was drawn from, quoted exactly. Leave it out rather than composing one.",
                  "type": "string",
                  "minLength": 1,
                  "maxLength": 2000
                }
              },
              "required": [
                "label",
                "setup",
                "expectedOutcome"
              ],
              "additionalProperties": false
            }
          },
          "refactorExamples": {
            "minItems": 1,
            "maxItems": 12,
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "label": {
                  "type": "string",
                  "minLength": 1,
                  "maxLength": 160
                },
                "setup": {
                  "type": "string",
                  "minLength": 1,
                  "maxLength": 2000
                },
                "expectedOutcome": {
                  "type": "string",
                  "minLength": 1,
                  "maxLength": 2000
                },
                "saidWords": {
                  "description": "The person's own sentence this case was drawn from, quoted exactly. Leave it out rather than composing one.",
                  "type": "string",
                  "minLength": 1,
                  "maxLength": 2000
                }
              },
              "required": [
                "label",
                "setup",
                "expectedOutcome"
              ],
              "additionalProperties": false
            }
          },
          "saidWords": {
            "description": "The person's own sentence the claim was drawn from, quoted exactly. Never a paraphrase, and never composed.",
            "type": "string",
            "minLength": 1,
            "maxLength": 2000
          },
          "scope": {
            "type": "object",
            "properties": {
              "repositoryId": {
                "type": "string",
                "format": "uuid",
                "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
              },
              "surfaces": {
                "description": "One or more real repository-relative paths or one-token capability markers. Reuse an existing marker when known. For a new capability the person named, format its words as a hyphenated marker yourself: for example, supplier import becomes supplier-import. This is a descriptive marker, not a registered identifier; do not ask the person to supply its format. Use a file path only when you know it exists in this repository. Never invent paths or repository IDs; get the repositoryId from get_promise_setup.",
                "minItems": 1,
                "maxItems": 24,
                "type": "array",
                "items": {
                  "type": "string",
                  "minLength": 1,
                  "maxLength": 96,
                  "pattern": "^[A-Za-z0-9_:.@/[\\]-]+$"
                }
              },
              "labels": {
                "default": [],
                "maxItems": 24,
                "type": "array",
                "items": {
                  "type": "string",
                  "minLength": 1,
                  "maxLength": 96,
                  "pattern": "^[A-Za-z0-9_:.@/[\\]-]+$"
                }
              }
            },
            "required": [
              "repositoryId",
              "surfaces"
            ],
            "additionalProperties": false
          }
        },
        "required": [
          "title",
          "beneficiary",
          "trigger",
          "preconditions",
          "observableOutcome",
          "allowedVariations",
          "nonGoals",
          "passingExamples",
          "failingExamples",
          "scope"
        ],
        "additionalProperties": false
      },
      "unresolvedQuestions": {
        "default": [],
        "maxItems": 0,
        "type": "array",
        "items": {
          "type": "string",
          "minLength": 1,
          "maxLength": 2000
        }
      },
      "proposedOwnerId": {
        "description": "Membership ID of the person who should be asked to agree to this meaning, from the members list on get_promise_setup. It must name an active member of this workspace; a name that is not on that list is refused and the refusal says who is. Omit it when the person did not name an owner: the person who connected this agent will own it unless you name someone else.",
        "type": "string",
        "maxLength": 2000
      },
      "confidence": {
        "type": "number",
        "minimum": 0,
        "maximum": 1
      },
      "wrongOutcome": {
        "description": "Required concrete failure of the behavior the person requested or confirmed in a scoped capture offer, for example \"a second payment must not go out\". Preserve their failure wording when supplied; otherwise derive the bounded failure without adding guarantees or pretending they dictated it. Keep literal human source in saidWords and the offer/acceptance in explicitIntent. Refused when missing.",
        "type": "string",
        "minLength": 1,
        "maxLength": 2000
      },
      "leastSure": {
        "description": "Balladeer no longer stores outstanding questions. Before writing, ask the person only about ambiguity that changes the commitment, then put their answer in the meaning and cases. Do not invent an answer or change agreed meaning. Nothing was recorded; refresh your Balladeer instructions before retrying.",
        "type": "string",
        "minLength": 1,
        "maxLength": 2000
      },
      "recordingBasis": {
        "description": "State truthfully how the person answered before you recorded: asked (they asked you to record it), yes (they said yes to your specific offer), go_ahead (a generic go-ahead to the offer), or carried_on (they carried on without answering). It is stored on the proposal and shown to its owner.",
        "type": "string",
        "enum": [
          "asked",
          "yes",
          "go_ahead",
          "carried_on"
        ]
      }
    },
    "required": [
      "explicitHumanAction",
      "source",
      "explicitIntent",
      "meaning",
      "confidence",
      "wrongOutcome"
    ],
    "$schema": "https://json-schema.org/draft/2020-12/schema",
    "additionalProperties": false
  },
  "annotations": {
    "readOnlyHint": false,
    "destructiveHint": false,
    "idempotentHint": false,
    "openWorldHint": false
  },
  "execution": {
    "taskSupport": "forbidden"
  }
}