Every change Wellknown observed on this MCP server, newest first, with what it was before and what it became. Tool-surface changes carry the definition diff. Nothing here is edited after the fact.
Changed the definition of "validate_integration"
⟨562 unchanged words⟩ {"additionalProperties":false,"description":"Qualified externalrequesterinput,separaterecorded separately from app execution.ZendeskRequestersupportsisathe default (Zendesk publiccommentreply).byExplicitthatexternal_operatorticket'spermitsrequester;onlyarbitraryconfiguredfinancialtwinwritesoperations,aresuchrefused.as an independent refund or new subscription between app actions. It cannot replace app execution or count as an app effect.","properties":{"expect_status":{"enum": ⟨3 unchanged words⟩ "provider_input":{"additionalProperties":false,"properties":{"actor":{"enum":["requester","external_operator"],"type":"string"},"body":{"type":"object"},"method ⟨1518 unchanged words⟩
Changed the definition of "validate_integration"
before
{"$defs":{"applicationAssertion":{"additionalProperties":false,"properties":{"absent":{"type":"boolean"},"all_of":{"items":{"$ref":"#/$defs/applicationAssertion"},"type":"array"},"contains":{"type":"string"},"count":{"minimum":0,"type":"integer"},"equals":{"type":["string","number","boolean","null"]},"repeat":{"maximum":5,"minimum":1,"type":"integer"},"required":{"type":"boolean"},"select":{"type":"string"},"set_equals":{"items":{"type":"string"},"type":"array","uniqueItems":true},"stable_under_repeat":{"type":"boolean"},"where":{"items":{"$ref":"#/$defs/applicationAssertion"},"type":"array"}},"required":[],"type":"object"}},"additionalProperties":false,"properties":{"app_base_url":{"description":"App origin when FetchSandbox must drive or observe a hosted HTTP suite. Optional for a provider-backed workflow executed by the builder through arm/probe; that path does not require a published app or webhook.","type":"string"},"application_config":{"additionalProperties":false,"description":"Frozen HTTP app drive/read-back contract: 1-30 checks, 1-20 actions per executable check, at most 300 declared actions in total, below 64 KiB. Preserve intermediate reads within these bounds; do not silently remove them. First check id=baseline must establish success. Checks require id, name, before {path,assertion}, ordinary HTTP actions [{method,path,body?,expect_status?}] or signed-event actions [{event:{provider,type,payload},expect_status?}], observe {path}, and assertion using select/equals/count/required or all_of. where and all_of must be lists of assertion objects, not field maps. equals accepts JSON strings, numbers, booleans and null; numeric/boolean literals preserve type, and null must be a present null field. Stripe event.payload is only the resource inside data.object, never a full event or a data.object wrapper: the server constructs and signs the envelope. Optional per-check observation_deadline_seconds (0-180, repeat=1 only) records bounded polling for eventual saved state; it does not drive a browser or turn a timeout into a pass. Every check first reads its declared starting-state precondition. Baseline requires count=0 on the same observed collection, with no where filter. Use {{run_id}} to scope fresh synthetic records. All paths are app-relative without query strings or fragments, including non-secret run_id queries; preserve run scoping through an inspected protected path-segment observer. Baseline permits only ordinary HTTP actions without signed events; prove signed purchase/access in later checks. Do not combine event actions with method/path/body/headers. {{step1.id}} binds a real action response to read-back. assertion.repeat (1-5) and stable_under_repeat support replay. Optional fault {provider,scenario} requires independently recorded provider refusal. For reassess/recontract include scope_review for every candidate check. Outside-scope feature proposals contain id,name,unsupported_reason only and move to separate scope_exclusions; they are not required tests. In-scope missing work uses id,name,blocker {category,reason,evidence,...}, never a free-text unsupported reason. engine_unsupported requires a capability confirmed by current backend capabilities; a missing app route or observer is not an engine gap. Unresolved policy remains unmeasured. Legacy untyped reasons remain unclassified, not engine unsupported. No user-supplied credentials, auth headers or live data. require_verifier_token=true generates an owner-only temporary Bearer token through secure handoff for protected test endpoints.","properties":{"app_version":{"type":"string"},"checks":{"items":{"oneOf":[{"additionalProperties":false,"properties":{"blocker":{"additionalProperties":false,"properties":{"capability":{"enum":["provider_lifecycle","provider_operation","independent_storage_attestation"],"type":"string"},"category":{"enum":["setup_missing","observation_missing","policy_unresolved","engine_unsupported"],"type":"string"},"evidence":{"items":{"maxLength":500,"minLength":1,"type":"string"},"maxItems":10,"minItems":1,"type":"array"},"method":{"enum":["GET","POST","PUT","PATCH","DELETE"],"type":"string"},"path":{"type":"string"},"provider":{"type":"string"},"reason":{"maxLength":1000,"minLength":1,"type":"string"}},"required":["category","reason","evidence"],"type":"object"},"id":{"maxLength":100,"minLength":1,"type":"string"},"name":{"type":"string"}},"required":["id","name","blocker"],"type":"object"},{"additionalProperties":false,"properties":{"id":{"maxLength":100,"minLength":1,"type":"string"},"name":{"type":"string"},"unsupported_reason":{"minLength":1,"type":"string"}},"required":["id","name","unsupported_reason"],"type":"object"},{"additionalProperties":false,"properties":{"actions":{"items":{"oneOf":[{"additionalProperties":false,"properties":{"body":{},"concurrency":{"maximum":8,"minimum":1,"type":"integer"},"expect_status":{"maximum":599,"minimum":200,"type":"integer"},"method":{"enum":["GET","POST","PUT","PATCH","DELETE"],"type":"string"},"path":{"type":"string"}},"required":["method","path"],"type":"object"},{"additionalProperties":false,"properties":{"concurrency":{"maximum":8,"minimum":1,"type":"integer"},"event":{"oneOf":[{"additionalProperties":false,"properties":{"payload":{"type":"object"},"provider":{"type":"string"},"type":{"type":"string"}},"required":["provider","type","payload"],"type":"object"},{"additionalProperties":false,"properties":{"provider":{"type":"string"},"replay_of":{"type":"string"}},"required":["provider","replay_of"],"type":"object"}]},"expect_status":{"maximum":599,"minimum":200,"type":"integer"}},"required":["event"],"type":"object"},{"additionalProperties":false,"properties":{"delay_seconds":{"exclusiveMinimum":0,"maximum":5,"type":"number"}},"required":["delay_seconds"],"type":"object"},{"additionalProperties":false,"properties":{"provider_control":{"additionalProperties":false,"properties":{"provider":{"type":"string"},"scenario":{"enum":["default"],"type":"string"}},"required":["provider","scenario"],"type":"object"}},"required":["provider_control"],"type":"object"},{"additionalProperties":false,"properties":{"client_lifecycle":{"additionalProperties":false,"properties":{"identity_field":{"type":"string"},"observe_path":{"type":"string"},"operation":{"enum":["restart"],"type":"string"},"timeout_seconds":{"maximum":180,"minimum":1,"type":"number"}},"required":["operation","observe_path","identity_field","timeout_seconds"],"type":"object"}},"required":["client_lifecycle"],"type":"object"}]},"maxItems":20,"minItems":1,"type":"array"},"assertion":{"$ref":"#/$defs/applicationAssertion"},"before":{"additionalProperties":false,"properties":{"assertion":{"$ref":"#/$defs/applicationAssertion"},"path":{"type":"string"}},"required":["path","assertion"],"type":"object"},"fault":{"additionalProperties":false,"properties":{"event_type":{"type":"string"},"evidence":{"enum":["refusal","accepted_response_loss","accepted_response_retry","webhook_withheld"],"type":"string"},"provider":{"type":"string"},"scenario":{"type":"string"}},"required":["provider","scenario"],"type":"object"},"id":{"maxLength":100,"minLength":1,"type":"string"},"name":{"type":"string"},"observation_deadline_seconds":{"maximum":180,"minimum":0,"type":"number"},"observe":{"additionalProperties":false,"properties":{"path":{"type":"string"}},"required":["path"],"type":"object"}},"required":["id","name","actions","before","observe","assertion"],"type":"object"}]},"maxItems":30,"minItems":1,"type":"array"},"coverage_review":{"description":"Applicability review against the returned coverage_policy. Missing dimensions remain unreviewed. Link relevant dimensions to declared checks, including explicitly unsupported checks. This is a proposed review, not execution proof.","items":{"additionalProperties":false,"properties":{"dimension":{"type":"string"},"reason":{"type":"string"},"relevance":{"enum":["relevant","not_applicable","unresolved"],"type":"string"},"rule_ids":{"items":{"type":"string"},"type":"array"}},"required":["dimension","relevance","reason","rule_ids"],"type":"object"},"maxItems":17,"type":"array"},"disposable_test_app":{"enum":[true],"type":"boolean"},"event_delivery":{"description":"provider_lifecycle registers provider-native subscriptions and requires actual app workflow actions. Optional provider_lifecycle_workflows selects catalog-owned witnesses/readback. Omitted selection preserves payment/email witnesses. direct uses verifier-signed events.","enum":["direct","provider_lifecycle"],"type":"string"},"event_destinations":{"additionalProperties":{"type":"string"},"description":"Session-provider to same-origin webhook path without query/fragment. Requires require_verifier_token=true and the isolated FETCHSANDBOX_<PROVIDER>_WEBHOOK_SECRET from secure handoff. Complete signed action shape: {event:{provider,type,payload},expect_status:200}; exact replay: {event:{provider,replay_of:'{{step2.event_id}}'},expect_status:200}. No method/path/body/headers on signed actions. Baseline uses ordinary HTTP actions; signed events belong in later checks. Existing signature checks must remain enabled.","type":"object"},"observation_seconds":{"maximum":5,"minimum":0.1,"type":"number"},"provider_lifecycle_workflows":{"additionalProperties":{"type":"string"},"description":"Optional destination-provider to returned catalog workflow id, e.g. {stripe: create_and_send_invoice}. Only declared application_lifecycle profiles are accepted. The server freezes expected events and independently reads the event resource in the workflow terminal state. Do not invent event names or substitute provider traffic for app-state assertions.","type":"object"},"require_verifier_token":{"type":"boolean"},"scope_review":{"description":"Required when reassessing/recontracting app scope. Review EVERY candidate check from inspected app behavior. Outside-app-scope entries must be non-executable proposals with inspection references; the backend excludes them from required checks and records them separately. Keep missing protection on relevant behavior in scope. A reason is an app-agent declaration, not independent source attestation. coverage_review links must name retained required checks only. Preserve failed requirements for the same app version.","items":{"additionalProperties":false,"properties":{"check_id":{"type":"string"},"classification":{"enum":["in_scope","outside_app_scope","unresolved"],"type":"string"},"evidence":{"items":{"maxLength":500,"minLength":1,"type":"string"},"maxItems":10,"minItems":1,"type":"array"},"reason":{"maxLength":1000,"minLength":1,"type":"string"}},"required":["check_id","classification","reason","evidence"],"type":"object"},"maxItems":30,"minItems":1,"type":"array"}},"required":["app_version","disposable_test_app","checks"],"type":"object"},"application_context":{"additionalProperties":false,"description":"Bounded inspected app summary, not credentials or raw code. The existing requirements model proposes rules; it cannot issue a verdict. Requires sign-in and an existing session_id: start with providers first, then send this context in a separate call using the returned session. Separate from fixtures/execution.","properties":{"app_version":{"type":"string"},"entry_points":{"items":{"type":"string"},"type":"array"},"fixture_requirements":{"items":{"type":"string"},"type":"array"},"goal":{"type":"string"},"state_store":{"type":"string"},"workflow":{"type":"string"}},"required":["goal"],"type":"object"},"arm":{"description":"Probe ID from the matrix to arm before running the app. Requires session_id.","type":"string"},"cancel":{"description":"Abort the attempt or retry failed cleanup. Requires session_id and run_id; cannot combine with arm or probe.","type":"boolean"},"execute":{"description":"Drive the configured app and evaluate the frozen receipt suite. Requires session_id/run_id; configuration acknowledgment alone is not proof. Starts the existing backend job asynchronously and returns promptly; follow status in this agent without allocating a background helper.","type":"boolean"},"fixtures":{"additionalProperties":false,"description":"Prepare session-owned twin data before app tests. Requires session_id. Stable id makes repeated calls replay-safe. Every step names spec, method and relative path. Use {{step1.id}} for dependencies. End with GET and an exact identity assertion. No live provider calls.","properties":{"id":{"maxLength":100,"minLength":1,"type":"string"},"steps":{"items":{"additionalProperties":false,"properties":{"assertion":{"additionalProperties":false,"description":"GET read-back only. Exactly four fields, e.g. {select: data.id, equals: '{{step2.id}}', required: true, count: 1} for Paddle. Use separate GET assertions for amount and currency; application all_of/where and JSON scalar predicates are not supported here.","properties":{"count":{"enum":[1],"type":"integer"},"equals":{"type":"string"},"required":{"enum":[true],"type":"boolean"},"select":{"type":"string"}},"required":["select","equals","required","count"],"type":"object"},"body":{"type":"object"},"expect_status":{"maximum":299,"minimum":200,"type":"integer"},"method":{"enum":["GET","POST","PUT","PATCH","DELETE"],"type":"string"},"name":{"type":"string"},"path":{"type":"string"},"query_params":{"type":"object"},"spec":{"type":"string"}},"required":["spec","method","path"],"type":"object"},"maxItems":40,"minItems":1,"type":"array"}},"required":["id","steps"],"type":"object"},"inspect":{"additionalProperties":false,"description":"Read fixture inputs through MCP using session_id. Prefer this MCP read to extracting a key for direct HTTP: the edge can reject a generic Python user agent even with valid ownership. This path keeps the existing MCP client authentication and headers. Do not ask for live provider keys. First resource=state returns collection counts; select collection to read real IDs and relationships with pagination. resource=operations lists provider contracts; specify both exact method and documented path to resolve one schema. Read-only, session-owned twins only, not application proof.","properties":{"collection":{"type":"string"},"limit":{"maximum":100,"minimum":1,"type":"integer"},"method":{"type":"string"},"offset":{"minimum":0,"type":"integer"},"path":{"type":"string"},"provider":{"type":"string"},"resource":{"enum":["state","operations"],"type":"string"}},"required":["provider","resource"],"type":"object"},"preflight":{"description":"Read-only public readiness check for a configured application_workflow_v1. Requires session_id/run_id. Checks frozen empty baseline and token enforcement without creating orders, injecting faults or rotating secrets. Retry same run after its exact setup blocker is repaired.","type":"boolean"},"probe":{"description":"Probe ID from the matrix to evaluate after running the app. Requires session_id and run_id.","type":"string"},"providers":{"description":"Provider slugs the app integrates, e.g. ['stripe'] or ['paddle','resend']. For provider-free HTTP workflows, omit providers and pass app_base_url.","items":{"type":"string"},"type":"array"},"reassess":{"description":"Set true when the user asks to reassess/recontract an app. Requires suite=application_workflow_v1 and application_config.scope_review for EVERY candidate check. Freeze a fresh contract scoped to inspected promised behavior. Outside-scope proposals are recorded separately; missing protection on relevant behavior remains a requirement. Never edit historical results or remove a failed requirement for the same app version.","type":"boolean"},"receipt_config":{"additionalProperties":false,"properties":{"app_version":{"description":"Declared application build identifier; not code attestation.","type":"string"},"observation_seconds":{"description":"Observation window after each checkpoint; default 2 seconds. Verdict covers only measured windows.","maximum":5,"minimum":0.1,"type":"number"},"purchase_context":{"description":"Application routing custom_data, e.g. test workspace ID. Never credentials.","type":"object"},"purchase_marker":{"additionalProperties":false,"description":"Where the normal receipt includes its Paddle transaction ID; same-record recipient/marker matching is required.","properties":{"field":{"enum":["html","text","subject","tags"],"type":"string"},"tag_name":{"type":"string"}},"required":["field"],"type":"object"},"recipient_a":{"description":"Expected test recipient for purchase A, fixed before execution.","type":"string"},"recipient_b":{"description":"Different test recipient for the different-customer case.","type":"string"},"source_lookup_required":{"description":"Whether the app reads the source provider during its normal webhook handler.","type":"boolean"},"webhook_url":{"description":"Exact normal application webhook URL, including path.","type":"string"}},"required":["webhook_url","recipient_a","recipient_b","purchase_marker","app_version","source_lookup_required"],"type":"object"},"run_id":{"description":"Attempt ID returned by arm or suite configuration. Required with probe, cancel, execute or preflight; prevents stale calls from consuming a newer attempt.","type":"string"},"session_id":{"description":"Returned by the first call. Pass it back after their app has run a flow to see what it did.","type":"string"},"suite":{"description":"Configure the declared application receipt suite on this session.","enum":["receipt_delivery_v1","receipt_recovery_v1","application_workflow_v1"],"type":"string"}},"type":"object"}Changed the definition of "validate_integration"
⟨588 unchanged words⟩ temporary settings, republish and verify disabled externally. When asked to reassess or recontract, set reassess=true and supply application_config.scope_review for every candidate check. Record outside-scope features separately, and keep relevant missing or failed behavior required. Scope is declared by the app-owning agent from its inspected code and requirements, not guessed from a provider name. For every app, inspect capabilities, coverage_policy and ⟨477 unchanged words⟩ saved order plus email effects. Keep payment andduplicate replay in separate checks: first confirm payment and poll independently saved paid order and receipt state; then GET the actual received success-event ID from app state and bind replay_of to that GET response. Never assume the payment response contains event_id or use the PaymentIntent ID as an event ID. If the app cannot expose ad
before
{"$defs":{"applicationAssertion":{"additionalProperties":false,"properties":{"absent":{"type":"boolean"},"all_of":{"items":{"$ref":"#/$defs/applicationAssertion"},"type":"array"},"contains":{"type":"string"},"count":{"minimum":0,"type":"integer"},"equals":{"type":["string","number","boolean","null"]},"repeat":{"maximum":5,"minimum":1,"type":"integer"},"required":{"type":"boolean"},"select":{"type":"string"},"set_equals":{"items":{"type":"string"},"type":"array","uniqueItems":true},"stable_under_repeat":{"type":"boolean"},"where":{"items":{"$ref":"#/$defs/applicationAssertion"},"type":"array"}},"required":[],"type":"object"}},"additionalProperties":false,"properties":{"app_base_url":{"description":"App origin when FetchSandbox must drive or observe a hosted HTTP suite. Optional for a provider-backed workflow executed by the builder through arm/probe; that path does not require a published app or webhook.","type":"string"},"application_config":{"additionalProperties":false,"description":"Frozen HTTP app drive/read-back contract: 1-30 checks, 1-20 actions per executable check, at most 300 declared actions in total, below 64 KiB. Preserve intermediate reads within these bounds; do not silently remove them. First check id=baseline must establish success. Checks require id, name, before {path,assertion}, ordinary HTTP actions [{method,path,body?,expect_status?}] or signed-event actions [{event:{provider,type,payload},expect_status?}], observe {path}, and assertion using select/equals/count/required or all_of. where and all_of must be lists of assertion objects, not field maps. equals accepts JSON strings, numbers, booleans and null; numeric/boolean literals preserve type, and null must be a present null field. Stripe event.payload is only the resource inside data.object, never a full event or a data.object wrapper: the server constructs and signs the envelope. Optional per-check observation_deadline_seconds (0-180, repeat=1 only) records bounded polling for eventual saved state; it does not drive a browser or turn a timeout into a pass. Every check first reads its declared starting-state precondition. Baseline requires count=0 on the same observed collection, with no where filter. Use {{run_id}} to scope fresh synthetic records. All paths are app-relative without query strings or fragments, including non-secret run_id queries; preserve run scoping through an inspected protected path-segment observer. Baseline permits only ordinary HTTP actions without signed events; prove signed purchase/access in later checks. Do not combine event actions with method/path/body/headers. {{step1.id}} binds a real action response to read-back. assertion.repeat (1-5) and stable_under_repeat support replay. Optional fault {provider,scenario} requires independently recorded provider refusal. Unsupported checks contain id,name,unsupported_reason only. No user-supplied credentials, auth headers or live data. require_verifier_token=true generates an owner-only temporary Bearer token through secure handoff for protected test endpoints.","properties":{"app_version":{"type":"string"},"checks":{"items":{"oneOf":[{"additionalProperties":false,"properties":{"id":{"maxLength":100,"minLength":1,"type":"string"},"name":{"type":"string"},"unsupported_reason":{"minLength":1,"type":"string"}},"required":["id","name","unsupported_reason"],"type":"object"},{"additionalProperties":false,"properties":{"actions":{"items":{"oneOf":[{"additionalProperties":false,"properties":{"body":{},"concurrency":{"maximum":8,"minimum":1,"type":"integer"},"expect_status":{"maximum":599,"minimum":200,"type":"integer"},"method":{"enum":["GET","POST","PUT","PATCH","DELETE"],"type":"string"},"path":{"type":"string"}},"required":["method","path"],"type":"object"},{"additionalProperties":false,"properties":{"concurrency":{"maximum":8,"minimum":1,"type":"integer"},"event":{"oneOf":[{"additionalProperties":false,"properties":{"payload":{"type":"object"},"provider":{"type":"string"},"type":{"type":"string"}},"required":["provider","type","payload"],"type":"object"},{"additionalProperties":false,"properties":{"provider":{"type":"string"},"replay_of":{"type":"string"}},"required":["provider","replay_of"],"type":"object"}]},"expect_status":{"maximum":599,"minimum":200,"type":"integer"}},"required":["event"],"type":"object"},{"additionalProperties":false,"properties":{"delay_seconds":{"exclusiveMinimum":0,"maximum":5,"type":"number"}},"required":["delay_seconds"],"type":"object"},{"additionalProperties":false,"properties":{"provider_control":{"additionalProperties":false,"properties":{"provider":{"type":"string"},"scenario":{"enum":["default"],"type":"string"}},"required":["provider","scenario"],"type":"object"}},"required":["provider_control"],"type":"object"},{"additionalProperties":false,"properties":{"client_lifecycle":{"additionalProperties":false,"properties":{"identity_field":{"type":"string"},"observe_path":{"type":"string"},"operation":{"enum":["restart"],"type":"string"},"timeout_seconds":{"maximum":180,"minimum":1,"type":"number"}},"required":["operation","observe_path","identity_field","timeout_seconds"],"type":"object"}},"required":["client_lifecycle"],"type":"object"}]},"maxItems":20,"minItems":1,"type":"array"},"assertion":{"$ref":"#/$defs/applicationAssertion"},"before":{"additionalProperties":false,"properties":{"assertion":{"$ref":"#/$defs/applicationAssertion"},"path":{"type":"string"}},"required":["path","assertion"],"type":"object"},"fault":{"additionalProperties":false,"properties":{"event_type":{"type":"string"},"evidence":{"enum":["refusal","accepted_response_loss","accepted_response_retry","webhook_withheld"],"type":"string"},"provider":{"type":"string"},"scenario":{"type":"string"}},"required":["provider","scenario"],"type":"object"},"id":{"maxLength":100,"minLength":1,"type":"string"},"name":{"type":"string"},"observation_deadline_seconds":{"maximum":180,"minimum":0,"type":"number"},"observe":{"additionalProperties":false,"properties":{"path":{"type":"string"}},"required":["path"],"type":"object"}},"required":["id","name","actions","before","observe","assertion"],"type":"object"}]},"maxItems":30,"minItems":1,"type":"array"},"coverage_review":{"description":"Applicability review against the returned coverage_policy. Missing dimensions remain unreviewed. Link relevant dimensions to declared checks, including explicitly unsupported checks. This is a proposed review, not execution proof.","items":{"additionalProperties":false,"properties":{"dimension":{"type":"string"},"reason":{"type":"string"},"relevance":{"enum":["relevant","not_applicable","unresolved"],"type":"string"},"rule_ids":{"items":{"type":"string"},"type":"array"}},"required":["dimension","relevance","reason","rule_ids"],"type":"object"},"maxItems":17,"type":"array"},"disposable_test_app":{"enum":[true],"type":"boolean"},"event_delivery":{"description":"provider_lifecycle registers provider-native subscriptions and requires actual app workflow actions. Optional provider_lifecycle_workflows selects catalog-owned witnesses/readback. Omitted selection preserves payment/email witnesses. direct uses verifier-signed events.","enum":["direct","provider_lifecycle"],"type":"string"},"event_destinations":{"additionalProperties":{"type":"string"},"description":"Session-provider to same-origin webhook path without query/fragment. Requires require_verifier_token=true and the isolated FETCHSANDBOX_<PROVIDER>_WEBHOOK_SECRET from secure handoff. Complete signed action shape: {event:{provider,type,payload},expect_status:200}; exact replay: {event:{provider,replay_of:'{{step2.event_id}}'},expect_status:200}. No method/path/body/headers on signed actions. Baseline uses ordinary HTTP actions; signed events belong in later checks. Existing signature checks must remain enabled.","type":"object"},"observation_seconds":{"maximum":5,"minimum":0.1,"type":"number"},"provider_lifecycle_workflows":{"additionalProperties":{"type":"string"},"description":"Optional destination-provider to returned catalog workflow id, e.g. {stripe: create_and_send_invoice}. Only declared application_lifecycle profiles are accepted. The server freezes expected events and independently reads the event resource in the workflow terminal state. Do not invent event names or substitute provider traffic for app-state assertions.","type":"object"},"require_verifier_token":{"type":"boolean"}},"required":["app_version","disposable_test_app","checks"],"type":"object"},"application_context":{"additionalProperties":false,"description":"Bounded inspected app summary, not credentials or raw code. The existing requirements model proposes rules; it cannot issue a verdict. Requires sign-in and an existing session_id: start with providers first, then send this context in a separate call using the returned session. Separate from fixtures/execution.","properties":{"app_version":{"type":"string"},"entry_points":{"items":{"type":"string"},"type":"array"},"fixture_requirements":{"items":{"type":"string"},"type":"array"},"goal":{"type":"string"},"state_store":{"type":"string"},"workflow":{"type":"string"}},"required":["goal"],"type":"object"},"arm":{"description":"Probe ID from the matrix to arm before running the app. Requires session_id.","type":"string"},"cancel":{"description":"Abort the attempt or retry failed cleanup. Requires session_id and run_id; cannot combine with arm or probe.","type":"boolean"},"execute":{"description":"Drive the configured app and evaluate the frozen receipt suite. Requires session_id/run_id; configuration acknowledgment alone is not proof. Starts the existing backend job asynchronously and returns promptly; follow status in this agent without allocating a background helper.","type":"boolean"},"fixtures":{"additionalProperties":false,"description":"Prepare session-owned twin data before app tests. Requires session_id. Stable id makes repeated calls replay-safe. Every step names spec, method and relative path. Use {{step1.id}} for dependencies. End with GET and an exact identity assertion. No live provider calls.","properties":{"id":{"maxLength":100,"minLength":1,"type":"string"},"steps":{"items":{"additionalProperties":false,"properties":{"assertion":{"additionalProperties":false,"description":"GET read-back only. Exactly four fields, e.g. {select: data.id, equals: '{{step2.id}}', required: true, count: 1} for Paddle. Use separate GET assertions for amount and currency; application all_of/where and JSON scalar predicates are not supported here.","properties":{"count":{"enum":[1],"type":"integer"},"equals":{"type":"string"},"required":{"enum":[true],"type":"boolean"},"select":{"type":"string"}},"required":["select","equals","required","count"],"type":"object"},"body":{"type":"object"},"expect_status":{"maximum":299,"minimum":200,"type":"integer"},"method":{"enum":["GET","POST","PUT","PATCH","DELETE"],"type":"string"},"name":{"type":"string"},"path":{"type":"string"},"query_params":{"type":"object"},"spec":{"type":"string"}},"required":["spec","method","path"],"type":"object"},"maxItems":40,"minItems":1,"type":"array"}},"required":["id","steps"],"type":"object"},"preflight":{"description":"Read-only public readiness check for a configured application_workflow_v1. Requires session_id/run_id. Checks frozen empty baseline and token enforcement without creating orders, injecting faults or rotating secrets. Retry same run after its exact setup blocker is repaired.","type":"boolean"},"probe":{"description":"Probe ID from the matrix to evaluate after running the app. Requires session_id and run_id.","type":"string"},"providers":{"description":"Provider slugs the app integrates, e.g. ['stripe'] or ['paddle','resend']. For provider-free HTTP workflows, omit providers and pass app_base_url.","items":{"type":"string"},"type":"array"},"receipt_config":{"additionalProperties":false,"properties":{"app_version":{"description":"Declared application build identifier; not code attestation.","type":"string"},"observation_seconds":{"description":"Observation window after each checkpoint; default 2 seconds. Verdict covers only measured windows.","maximum":5,"minimum":0.1,"type":"number"},"purchase_context":{"description":"Application routing custom_data, e.g. test workspace ID. Never credentials.","type":"object"},"purchase_marker":{"additionalProperties":false,"description":"Where the normal receipt includes its Paddle transaction ID; same-record recipient/marker matching is required.","properties":{"field":{"enum":["html","text","subject","tags"],"type":"string"},"tag_name":{"type":"string"}},"required":["field"],"type":"object"},"recipient_a":{"description":"Expected test recipient for purchase A, fixed before execution.","type":"string"},"recipient_b":{"description":"Different test recipient for the different-customer case.","type":"string"},"source_lookup_required":{"description":"Whether the app reads the source provider during its normal webhook handler.","type":"boolean"},"webhook_url":{"description":"Exact normal application webhook URL, including path.","type":"string"}},"required":["webhook_url","recipient_a","recipient_b","purchase_marker","app_version","source_lookup_required"],"type":"object"},"run_id":{"description":"Attempt ID returned by arm or suite configuration. Required with probe, cancel, execute or preflight; prevents stale calls from consuming a newer attempt.","type":"string"},"session_id":{"description":"Returned by the first call. Pass it back after their app has run a flow to see what it did.","type":"string"},"suite":{"description":"Configure the declared application receipt suite on this session.","enum":["receipt_delivery_v1","receipt_recovery_v1","application_workflow_v1"],"type":"string"}},"type":"object"}Changed the definition of "get_job" and "validate_integration"
Retrieve the SAME running find_bugs, fix_bug, prove_fix, verify_behavior orverify_behaviorvalidate_integrationjob.job (including requirements planning). Follow next_tool_call until status is done or error. Never restart the original tool to poll. A proposed plan is not execution proof; a running response is notproof;proof.onlyOnly the completed measured verdict and receipt can establish a pass.
Changed the definition of "validate_integration"
⟨992 unchanged words⟩ and fault.evidence contracts to drive recorded fault recovery. Use fault.evidence=accepted_response_retry when the app recovers a lost accepted response inside its HTTP request or a successful webhook callback. It requires an observed client disconnect before a matching provider retry and the same accepted effect ID; simultaneous sends and a slow response cannot pass. accepted_response_loss remains the failed-callback plus redelivery contract. For a declared client_lifecycle restart, follow client_checkpoint by ⟨84 unchanged words⟩ keep the existing owner browser handoff. For anormal HTTP app workflow with independently readable state, configure application_workflow_v1 and application_config. Declare a positive baseline first using ordinary HTTP app actions, no signed events, GET observations and required exact assertions. A pending order is a valid baseline; prove signed payment and access in a later check without removing those assertions. HTTP actions arenor
{"Changed the definition of "validate_integration"
⟨960 unchanged words⟩ in this mode; exact replay of a delivered or explicitly withheld run-correlated generated event is supported. Event actions accept concurrency from 1 to 8 for real overlapping deliveries. Use the returned provider_control and fault.evidence contracts to drive recorded fault recovery. For a declared client_lifecycle restart, follow client_checkpoint by restarting the real app process with the same durable storage and bindings, then retrieve the same run without another execute. Inspect webhook_subscriptions and recorded callback responses; missing delivery ⟨110 unchanged words⟩ check without removing those assertions. HTTP actions are{method,path,body?,expect_status?}; signed-event actions are ONLY {event:{provider,type,payload},expect_status?}, or {event:{provider,replay_of},expect_status?} for exact replay. Never combine event with method/path/body/headers or invent method EVENT. Webhook paths belong in event_destinations and MUST be the inspected app handler paths. Provider event names, resource envelopes, signing alg
Changed the definition of "validate_integration"
For a local app, start the actual app and call manage_tunnel with its port; use the returned app_base_url. No ngrok install is needed. The managed relay origin deliberately rejects direct browser/curl requests with 404; after configuration and credential installation, test connectivity with validate_integration preflight instead. Do not interpret that private-origin 404 as an app failure or expose relay credentials. Hosted builders use their published origin. Start with providers (and optional app_base_url), then ⟨744 unchanged words⟩ human to write routine test requirements. For anormal HTTPStripe appworkflow with independently readable state, configure application_workflow_v1 and application_config. Declareon apositive baseline first using ordinary HTTP appmanagedactions,tunnelnoorsigned
Changed the definition of "quickrun"
Run a curatedproofreference workflow against a KNOWN, bundled spec (stripe ⟨20 unchanged words⟩ do NOT need import_spec or a sandbox_id first.This is the normalUsepaththis whenthe user is testing an integration withexploringathewell-knownbundled provider contract: call `guide` on their prompt, then call ⟨23 unchanged words⟩ + flow_run_id — pass BOTH to verify_behavior toproveinspect thefix
Added "get_job" (7 tools before, 8 now)
Retrieve the SAME running find_bugs, fix_bug, prove_fix or verify_behavior job. Follow next_tool_call until status is done or error. Never restart the original tool to poll. A running response is not proof; only the completed measured verdict and receipt can establish a pass.
Changed the definition of "list_workflows" and "validate_integration"
List the named, runnable workflows for apreviously-importedknown provider slug or imported spec. Workflows are realistic multi-step API journeys (e.g. 'create customer → attach payment method → create subscription').UseKnownthisproviderafterslugsimport_specneed no import. Use this for exploration ("what can I do?", ⟨22 unchanged words⟩ pass the matching ids as `workflow_names` to run_all_workflows. Default results are summaries. Pass workflow_name with an exact returned id or name to inspect that workflow's full definition, including request bodies, assertions, outcomes and invariants; this does not execute it.
Changed the definition of "validate_integration"
⟨224 unchanged words⟩ verify disabled externally. For every app, inspect capabilities, coverage_policy and application_actions. Review every supplied coverage dimension against inspected app behavior without waiting for the user to enumerate failure tests. Supply application_config.coverage_review with relevance, reason and linked check IDs when the builder authors the plan. Missing dimensions stay unreviewed. A dimension review is not execution proof; never claim all possible invariants are known. Prepare missing test products, prices and related records ⟨50 unchanged words⟩ not replaced by a separate script or quickrun. Use the returned fixture_authoring contract, not a web search for assertion syntax. Prepare fixtures before configuring any attempt. Fixture assertions are GET-only and contain select, equals (string), required:true, count:1. Use separate asserted GET steps for each additional value; do not use application all_of or where predicates in fixture assertions. Paddle selectors include the response envelope, e.g. data.id; Stripe uses id. Read the provided Paddle one-time-price example and adapt its product and amount to the app. If fixed receipt-suite transactions cannot match the app's product, price and pending order, do not execute them as app proof or a pointless rejection diagnostic. Report that compatibility gap, cancel any unexecuted mismatched attempt, then use application_workflow_v1 for supported checks while preserving untested receipt rules.
Changed the definition of "validate_integration"
⟨60 unchanged words⟩ unchanged setup blocker. Execution has a separate deadline. Execution is already non-blocking: execute:true starts the existing backend job and returns running promptly. Use the SAME builder agent to follow status; no extra background helper or helper approval is needed. Never execute twice; retrieve status with session_id/run_id only. If the browser stops at a security challenge, immediately hand the owner the SAME run/order-verified original TEST checkout URL (livemode=false) while observation continues; never bypass the challenge, silently wait, create a replacement checkout or retry Pay. For an owner-assisted browser step, use ONE native question containing that verified URL, pause the builder for its answer while the backend job continues, and record that answer once. Do not keep working while asking for a plain chat reply that the host queues, or ask again after confirmation is recorded. Browser payments require an available browser or one ⟨199 unchanged words⟩ proposed rule IDs; omitted rules remain unmeasured. Signed callback app_response contains a sanitized acknowledgement; response remains delivery metadata. Inspect response_capture_status when the body is missing, and independently read state for the verdict. Signed provider event actions are supported through event_destinations and ⟨733 unchanged words⟩ replace app execution. A verified receipt suite covers
Changed the definition of "validate_integration"
For hosted application_workflow_v1 apps, build and publish the disabled test adapter before requesting short-lived credentials. After installing the existing handoff and republishing, call preflight:true with session_id/run_id. A setup_blocked response is not a failed application test. Its next_tool_call is null: repair its exact host-side blocker first, then call resume_tool_call for the SAME run/preflight without rotating credentials. Do not poll an unchanged setup blocker. Execution has a separate deadline. Never execute twice; retrieve status with session_id/run_id only. Browser payments require an available browser or one explicit user action, and independently observed paid state; a click is not proof. After proof, remove only temporary settings, republish and verify disabled externally. For every app, inspect capabilities and application_actions. Prepare missing ⟨1033 unchanged words⟩
⟨26 unchanged words⟩ :false,"description":"Frozen HTTP app drive/read-backcontract.contract: 1-30 checks, 1-20 actions per executable check, at most 300 declared actions in total, below 64 KiB. Preserve intermediate reads within these bounds; do not silently remove them.
Changed the definition of "validate_integration"
⟨174 unchanged words⟩ the proposed rule IDs; omitted rules remain unmeasured. Signed provider event actions are supported through event_destinations and isolated secure-handoff signing secrets; bind payload identity to actual app responses and verify saved state. No browser, signed-webhook, arbitrary auth-header or SQL execution is supported ⟨827 unchanged words⟩
⟨52 unchanged words⟩ path}, and assertion using select/equals/count/required or all_of. Optional per-check observation_deadline_seconds (0-180, repeat=1 only) records bounded polling for eventual saved state; it does not drive a browser or turn a timeout into a pass. Every check first reads its declared starting-state precondition. ⟨89 unchanged words⟩ :{"enum":[true],"type":"boolean"},"event_destinations":{"additionalProperties":{"type":"string"},"description":"Session-provider to same-origin webhook path. Requires require_verifier_token=true and the isolated FETCHSANDBOX_<PROVIDER>_WEBHOOK_SECRET from secure handoff. Actions may use event:{provider,type,payload} or event:{provider,replay_of: prior step event_id template}. Existing signature checks must remain enabled.","type":"object
Changed the definition of "coach" and "validate_integration"
⟨73 unchanged words⟩ — strict, do exactly this each turn: If next_action=act_in_app, carry out next_actions with your platform's code, configuration and test tools, then return the results to the same validation session. Do not ask the human to choose routine fault tests, supply missing fixture data you can generate, or copy tool output. Ask only for genuine access, secret-entry constraints or ambiguous business rules. Never claim unsupported checks passed. (1) Say `message_for_user` to the user (verbatim ⟨235 unchanged words⟩
For every app, inspect capabilities and application_actions. Prepare missing test products, prices and related records before failures: author fixtures using documented provider operations, include a final GET with an exact identity assertion, then configure the app with returned fixture IDs. The server uses the existing twin workflow runner and independently checks read-back. Fixture readiness is not app proof. Unsupported application checks must be reported explicitly, not replaced by a separate script or quickrun. Send application_context with the original goal and inspected workflow to obtain model-proposed rules, missing observations and fixture requirements. Proposals are not executed checks. Preserve all proposed rules in the coverage report, even when unsupported. If server_requirements_model_available is false or planning returns requirements_model_unavailable, inspect the app and author the candidate contract with your own model; label it builder-proposed, not a FetchSandbox model result. Never wait for the human to write routine test requirements. For a normal HTTP app workflow with independently readable state, configure application_workflow_v1 and application_config. Declare a positive baseline first, normal app actions, GET observations and required exact assertions. Reuse the proposed rule IDs; omitted rules remain unmeasured. No browser, signed-webhook, arbitrary auth-header or SQL execution is supported by this HTTP contract: record those gaps explicitly. Do not weaken signature or access checks to make a test pass.
Changed the definition of "validate_integration"
⟨712 unchanged words⟩ fault stays unmeasured. This application suite requires sign-in. Paddle checkout is a separate app-owned browser flow: if a transaction's `checkout.url` points to `fetchsandbox.com/checkout`, returns 404, or does not show a checkout page, do not imply FetchSandbox hosts the merchant's payment UI. Inspect the exact URL and the Paddle Sandbox default payment link or per-transaction override. Tell the builder to use a reachable app checkout page that loads Paddle.js and opens the `_ptxn` transaction, or a supported Paddle-hosted flow. Verify browser checkout/payment separately from twin API and webhook tests; transaction creation alone is not payment proof.
Changed the definition of "validate_integration"
⟨74 unchanged words⟩ it when someone wants their integration verified beforelaunch,launch.orCallwhenonceyouwithhave`providers`,justthenrunfollowathehappyreturnedpath
Changed the definition of "validate_integration"
⟨478 unchanged words⟩ check and the observation windows in your report. On an inconclusive execute result, inspect and report its `execution_diagnostics` field directly; do not ask the human to infer a cause from the public receipt page, which intentionally omits private proof. If you cannot configure the app, report that ⟨67 unchanged words⟩
Changed the definition of "validate_integration"
⟨251 unchanged words⟩ receipt rules for both same-customer and different-customer purchases.ConfigureYou are responsible for completing this setup: inspect theactualapp'sapprealwithwebhook and configuration paths, apply theissuedreturnedtwinstwin URLs and X-Flow-Run-Id to an isolated development/test/staging configuration,signingthen run the suite. The three credentials are temporary twin-only test values, not production credentials: PADDLE_API_KEY, RESEND_API_KEY, and PADDLE_WEBHOOK_SECRET. Use the platform's supported
Changed the definition of "coach" and "validate_integration"
⟨194 unchanged words⟩ (5) If `next_action=done`: end the session. For a hosted app-builder request to build or test an integration, keep the user's simple goal intact and let the server route all named providers into one validation session. When FetchSandbox returns twin bindings, treat those as temporary TEST credentials: configure them server-side in the app-builder project, never ask the user for live Paddle/Resend keys, and never claim they were applied until the builder reports the change and the verifier observes app traffic. Infer app configuration details from the project when available; ask the user only for a fact the builder cannot discover. The deterministic verifier, not this conversation, owns the verdict. The state machine is server-side — DON'T try ⟨12 unchanged words⟩
⟨180 unchanged words⟩ Changed the definition of "validate_integration" and "verify_behavior"
Prove the USER'S OWN code works againstStart aprovider,validationnotsessionthatforourthetwinuser'sdoes.integration. quickrun and run_workflow execute OUR curated workflow against ⟨36 unchanged words⟩ point their app at it, then readsourexternalownprovider
Certificate recorded, valid to 2026-12-04
Authorization not required
Added "validate_integration"; removed "find_bugs", "fix_bug", "import_spec" and 7 more (16 tools before, 7 now)
Prove the USER'S OWN code works against a provider, not that our twin does. quickrun and run_workflow execute OUR curated workflow against a twin — green there says the provider behaves as documented, and says nothing about whether their integration wired to it correctly. This instead hands back a FRESH twin per provider and asks the user to point their app at it, then reads our own request log to report what THEIR code actually called. Use it when someone wants their integration verified before launch, or when you have just run a happy path and need to say what it did and did not prove. Call…
FIRST STEP for any API-integration bug — webhooks, payments, auth, email, SMS, subscriptions. Reach for this the moment a user reports a symptom in an app that talks to a provider: 'customers charged twice', 'the webhook fires but nothing happens', 'their balance is wrong', 'we keep emailing a bounced address', 'paused but they still have access'. Packages the current project — local, uncommitted, private, no git URL needed — and audits it against a corpus of real, harvested API-integration failures (idempotency, signature verification, event ordering, pagination, rate limits, state drift) th…
FetchSandbox remediation: get a proposed fix for a specific bug in YOUR code. The 'fix' step after find_bugs. Ships the project to the FetchSandbox runtime, which authors a MINIMAL fix grounded in the known remediation for that failure class and returns a git diff — it does NOT modify your files, so review the diff and apply it yourself. IMPORTANT: the diff is a proposal, not a proof. After applying it, prove the fix (submit_proof / verify_behavior) so the buggy→fixed flip is measured, not assumed. Runs for up to a few minutes.
Changed the definition of "list_workflows"
⟨59 unchanged words⟩ the matching ids as `workflow_names` to run_all_workflows. Returns:id,thename,workflows AND the failure scenarios this spec can simulate — each with a plain description,andstepthecountexactpercallworkflow.to run it. Read the scenarios out to the user and ask which matter; do not guess scenario names.
Unknown → Live
First tool surface recorded: 16 tools (server version 0.5.6)
https://fetchsandbox.com/mcp/v1 (mcp_streamable_http) — from mcp_registry
Showing the latest 28 events. The API returns up to 500 and filters by kind: ?kind=tool_surface_changed
after
{"$defs":{"applicationAssertion":{"additionalProperties":false,"properties":{"absent":{"type":"boolean"},"all_of":{"items":{"$ref":"#/$defs/applicationAssertion"},"type":"array"},"contains":{"type":"string"},"count":{"minimum":0,"type":"integer"},"equals":{"type":["string","number","boolean","null"]},"repeat":{"maximum":5,"minimum":1,"type":"integer"},"required":{"type":"boolean"},"select":{"type":"string"},"set_equals":{"items":{"type":"string"},"type":"array","uniqueItems":true},"stable_under_repeat":{"type":"boolean"},"where":{"items":{"$ref":"#/$defs/applicationAssertion"},"type":"array"}},"required":[],"type":"object"}},"additionalProperties":false,"properties":{"app_base_url":{"description":"App origin when FetchSandbox must drive or observe a hosted HTTP suite. Optional for a provider-backed workflow executed by the builder through arm/probe; that path does not require a published app or webhook.","type":"string"},"application_config":{"additionalProperties":false,"description":"Frozen HTTP app drive/read-back contract: 1-30 checks, 1-20 actions per executable check, at most 300 declared actions in total, below 64 KiB. Preserve intermediate reads within these bounds; do not silently remove them. First check id=baseline must establish success. Checks require id, name, before {path,assertion}, ordinary HTTP actions [{method,path,body?,expect_status?}] or signed-event actions [{event:{provider,type,payload},expect_status?}], observe {path}, and assertion using select/equals/count/required or all_of. where and all_of must be lists of assertion objects, not field maps. equals accepts JSON strings, numbers, booleans and null; numeric/boolean literals preserve type, and null must be a present null field. Stripe event.payload is only the resource inside data.object, never a full event or a data.object wrapper: the server constructs and signs the envelope. Optional per-check observation_deadline_seconds (0-180, repeat=1 only) records bounded polling for eventual saved state; it does not drive a browser or turn a timeout into a pass. Every check first reads its declared starting-state precondition. Baseline requires count=0 on the same observed collection, with no where filter. Use {{run_id}} to scope fresh synthetic records. All paths are app-relative without query strings or fragments, including non-secret run_id queries; preserve run scoping through an inspected protected path-segment observer. Baseline permits only ordinary HTTP actions without signed events; prove signed purchase/access in later checks. Do not combine event actions with method/path/body/headers. {{step1.id}} binds a real action response to read-back. assertion.repeat (1-5) and stable_under_repeat support replay. Optional fault {provider,scenario} requires independently recorded provider refusal. For reassess/recontract include scope_review for every candidate check. Outside-scope feature proposals contain id,name,unsupported_reason only and move to separate scope_exclusions; they are not required tests. In-scope missing work uses id,name,blocker {category,reason,evidence,...}, never a free-text unsupported reason. engine_unsupported requires a capability confirmed by current backend capabilities; a missing app route or observer is not an engine gap. Unresolved policy remains unmeasured. Legacy untyped reasons remain unclassified, not engine unsupported. No user-supplied credentials, auth headers or live data. require_verifier_token=true generates an owner-only temporary Bearer token through secure handoff for protected test endpoints.","properties":{"app_version":{"type":"string"},"checks":{"items":{"oneOf":[{"additionalProperties":false,"properties":{"blocker":{"additionalProperties":false,"properties":{"capability":{"enum":["provider_lifecycle","provider_operation","independent_storage_attestation"],"type":"string"},"category":{"enum":["setup_missing","observation_missing","policy_unresolved","engine_unsupported"],"type":"string"},"evidence":{"items":{"maxLength":500,"minLength":1,"type":"string"},"maxItems":10,"minItems":1,"type":"array"},"method":{"enum":["GET","POST","PUT","PATCH","DELETE"],"type":"string"},"path":{"type":"string"},"provider":{"type":"string"},"reason":{"maxLength":1000,"minLength":1,"type":"string"}},"required":["category","reason","evidence"],"type":"object"},"id":{"maxLength":100,"minLength":1,"type":"string"},"name":{"type":"string"}},"required":["id","name","blocker"],"type":"object"},{"additionalProperties":false,"properties":{"id":{"maxLength":100,"minLength":1,"type":"string"},"name":{"type":"string"},"unsupported_reason":{"minLength":1,"type":"string"}},"required":["id","name","unsupported_reason"],"type":"object"},{"additionalProperties":false,"properties":{"actions":{"items":{"oneOf":[{"additionalProperties":false,"description":"Qualified external requester input, separate from app execution. Zendesk supports a public comment by that ticket's requester; arbitrary financial writes are refused.","properties":{"expect_status":{"enum":[200],"type":"integer"},"provider_input":{"additionalProperties":false,"properties":{"body":{"type":"object"},"method":{"type":"string"},"path":{"type":"string"},"provider":{"type":"string"}},"required":["provider","method","path","body"],"type":"object"}},"required":["provider_input"],"type":"object"},{"additionalProperties":false,"properties":{"body":{},"concurrency":{"maximum":8,"minimum":1,"type":"integer"},"expect_status":{"maximum":599,"minimum":200,"type":"integer"},"method":{"enum":["GET","POST","PUT","PATCH","DELETE"],"type":"string"},"path":{"type":"string"}},"required":["method","path"],"type":"object"},{"additionalProperties":false,"properties":{"concurrency":{"maximum":8,"minimum":1,"type":"integer"},"event":{"oneOf":[{"additionalProperties":false,"properties":{"payload":{"type":"object"},"provider":{"type":"string"},"type":{"type":"string"}},"required":["provider","type","payload"],"type":"object"},{"additionalProperties":false,"properties":{"provider":{"type":"string"},"replay_of":{"type":"string"}},"required":["provider","replay_of"],"type":"object"}]},"expect_status":{"maximum":599,"minimum":200,"type":"integer"}},"required":["event"],"type":"object"},{"additionalProperties":false,"properties":{"delay_seconds":{"exclusiveMinimum":0,"maximum":5,"type":"number"}},"required":["delay_seconds"],"type":"object"},{"additionalProperties":false,"properties":{"provider_control":{"additionalProperties":false,"properties":{"provider":{"type":"string"},"scenario":{"enum":["default"],"type":"string"}},"required":["provider","scenario"],"type":"object"}},"required":["provider_control"],"type":"object"},{"additionalProperties":false,"properties":{"client_lifecycle":{"additionalProperties":false,"properties":{"identity_field":{"type":"string"},"observe_path":{"type":"string"},"operation":{"enum":["restart"],"type":"string"},"timeout_seconds":{"maximum":180,"minimum":1,"type":"number"}},"required":["operation","observe_path","identity_field","timeout_seconds"],"type":"object"}},"required":["client_lifecycle"],"type":"object"}]},"maxItems":20,"minItems":1,"type":"array"},"assertion":{"$ref":"#/$defs/applicationAssertion"},"before":{"additionalProperties":false,"properties":{"assertion":{"$ref":"#/$defs/applicationAssertion"},"path":{"type":"string"}},"required":["path","assertion"],"type":"object"},"fault":{"additionalProperties":false,"properties":{"event_type":{"type":"string"},"evidence":{"enum":["refusal","accepted_response_loss","accepted_response_retry","webhook_withheld"],"type":"string"},"provider":{"type":"string"},"scenario":{"type":"string"}},"required":["provider","scenario"],"type":"object"},"id":{"maxLength":100,"minLength":1,"type":"string"},"name":{"type":"string"},"observation_deadline_seconds":{"maximum":180,"minimum":0,"type":"number"},"observe":{"additionalProperties":false,"properties":{"path":{"type":"string"}},"required":["path"],"type":"object"},"provider_assertions":{"description":"Additional independent state assertions against this session's provider twins. Select records[*] from a public collection; readbacks are recorded separately from app-reported state. This is simulated provider state, not live-provider delivery.","items":{"additionalProperties":false,"properties":{"assertion":{"type":"object"},"collection":{"type":"string"},"provider":{"type":"string"}},"required":["provider","collection","assertion"],"type":"object"},"maxItems":8,"type":"array"}},"required":["id","name","actions","before","observe","assertion"],"type":"object"}]},"maxItems":30,"minItems":1,"type":"array"},"coverage_review":{"description":"Applicability review against the returned coverage_policy. Missing dimensions remain unreviewed. Link relevant dimensions to declared checks, including explicitly unsupported checks. This is a proposed review, not execution proof.","items":{"additionalProperties":false,"properties":{"dimension":{"type":"string"},"reason":{"type":"string"},"relevance":{"enum":["relevant","not_applicable","unresolved"],"type":"string"},"rule_ids":{"items":{"type":"string"},"type":"array"}},"required":["dimension","relevance","reason","rule_ids"],"type":"object"},"maxItems":17,"type":"array"},"disposable_test_app":{"enum":[true],"type":"boolean"},"event_delivery":{"description":"provider_lifecycle registers provider-native subscriptions and requires actual app workflow actions. Optional provider_lifecycle_workflows selects catalog-owned witnesses/readback. Omitted selection preserves payment/email witnesses. direct uses verifier-signed events.","enum":["direct","provider_lifecycle"],"type":"string"},"event_destinations":{"additionalProperties":{"type":"string"},"description":"Session-provider to same-origin webhook path without query/fragment. Requires require_verifier_token=true and the isolated FETCHSANDBOX_<PROVIDER>_WEBHOOK_SECRET from secure handoff. Complete signed action shape: {event:{provider,type,payload},expect_status:200}; exact replay: {event:{provider,replay_of:'{{step2.event_id}}'},expect_status:200}. No method/path/body/headers on signed actions. Baseline uses ordinary HTTP actions; signed events belong in later checks. Existing signature checks must remain enabled.","type":"object"},"observation_seconds":{"maximum":5,"minimum":0.1,"type":"number"},"provider_lifecycle_workflows":{"additionalProperties":{"type":"string"},"description":"Optional destination-provider to returned catalog workflow id, e.g. {stripe: create_and_send_invoice}. Only declared application_lifecycle profiles are accepted. The server freezes expected events and independently reads the event resource in the workflow terminal state. Do not invent event names or substitute provider traffic for app-state assertions.","type":"object"},"require_verifier_token":{"type":"boolean"},"scope_review":{"description":"Required when reassessing/recontracting app scope. Review EVERY candidate check from inspected app behavior. Outside-app-scope entries must be non-executable proposals with inspection references; the backend excludes them from required checks and records them separately. Keep missing protection on relevant behavior in scope. A reason is an app-agent declaration, not independent source attestation. coverage_review links must name retained required checks only. Preserve failed requirements for the same app version.","items":{"additionalProperties":false,"properties":{"check_id":{"type":"string"},"classification":{"enum":["in_scope","outside_app_scope","unresolved"],"type":"string"},"evidence":{"items":{"maxLength":500,"minLength":1,"type":"string"},"maxItems":10,"minItems":1,"type":"array"},"reason":{"maxLength":1000,"minLength":1,"type":"string"}},"required":["check_id","classification","reason","evidence"],"type":"object"},"maxItems":30,"minItems":1,"type":"array"}},"required":["app_version","disposable_test_app","checks"],"type":"object"},"application_context":{"additionalProperties":false,"description":"Bounded inspected app summary, not credentials or raw code. The existing requirements model proposes rules; it cannot issue a verdict. Requires sign-in and an existing session_id: start with providers first, then send this context in a separate call using the returned session. Separate from fixtures/execution.","properties":{"app_version":{"type":"string"},"entry_points":{"items":{"type":"string"},"type":"array"},"fixture_requirements":{"items":{"type":"string"},"type":"array"},"goal":{"type":"string"},"state_store":{"type":"string"},"workflow":{"type":"string"}},"required":["goal"],"type":"object"},"arm":{"description":"Probe ID from the matrix to arm before running the app. Requires session_id.","type":"string"},"cancel":{"description":"Abort the attempt or retry failed cleanup. Requires session_id and run_id; cannot combine with arm or probe.","type":"boolean"},"execute":{"description":"Drive the configured app and evaluate the frozen receipt suite. Requires session_id/run_id; configuration acknowledgment alone is not proof. Starts the existing backend job asynchronously and returns promptly; follow status in this agent without allocating a background helper.","type":"boolean"},"fixtures":{"additionalProperties":false,"description":"Prepare session-owned twin data before app tests. Requires session_id. Stable id makes repeated calls replay-safe. Every step names spec, method and relative path. Use {{step1.id}} for dependencies. End with GET and an exact identity assertion. No live provider calls. An explicitly advertised /__fetchsandbox/fixtures/time step is an owner-only synthetic clock control, not a provider API; it is unavailable during active attempts and requires normal provider GET readback.","properties":{"id":{"maxLength":100,"minLength":1,"type":"string"},"steps":{"items":{"additionalProperties":false,"properties":{"assertion":{"additionalProperties":false,"description":"GET read-back only. Exactly four fields, e.g. {select: data.id, equals: '{{step2.id}}', required: true, count: 1} for Paddle. Use separate GET assertions for amount and currency; application all_of/where and JSON scalar predicates are not supported here.","properties":{"count":{"enum":[1],"type":"integer"},"equals":{"type":"string"},"required":{"enum":[true],"type":"boolean"},"select":{"type":"string"}},"required":["select","equals","required","count"],"type":"object"},"body":{"type":"object"},"expect_status":{"maximum":299,"minimum":200,"type":"integer"},"method":{"enum":["GET","POST","PUT","PATCH","DELETE"],"type":"string"},"name":{"type":"string"},"path":{"type":"string"},"query_params":{"type":"object"},"spec":{"type":"string"}},"required":["spec","method","path"],"type":"object"},"maxItems":40,"minItems":1,"type":"array"}},"required":["id","steps"],"type":"object"},"inspect":{"additionalProperties":false,"description":"Read fixture inputs through MCP using session_id. Prefer this MCP read to extracting a key for direct HTTP: the edge can reject a generic Python user agent even with valid ownership. This path keeps the existing MCP client authentication and headers. Do not ask for live provider keys. First resource=state returns collection counts; select collection to read real IDs and relationships with pagination. resource=operations lists provider contracts; specify both exact method and documented path to resolve one schema. Read-only, session-owned twins only, not application proof.","properties":{"collection":{"type":"string"},"limit":{"maximum":100,"minimum":1,"type":"integer"},"method":{"type":"string"},"offset":{"minimum":0,"type":"integer"},"path":{"type":"string"},"provider":{"type":"string"},"resource":{"enum":["state","operations"],"type":"string"}},"required":["provider","resource"],"type":"object"},"preflight":{"description":"Read-only public readiness check for a configured application_workflow_v1. Requires session_id/run_id. Checks frozen empty baseline and token enforcement without creating orders, injecting faults or rotating secrets. Retry same run after its exact setup blocker is repaired.","type":"boolean"},"probe":{"description":"Probe ID from the matrix to evaluate after running the app. Requires session_id and run_id.","type":"string"},"providers":{"description":"Provider slugs the app integrates, e.g. ['stripe'] or ['paddle','resend']. For provider-free HTTP workflows, omit providers and pass app_base_url.","items":{"type":"string"},"type":"array"},"reassess":{"description":"Set true when the user asks to reassess/recontract an app. Requires suite=application_workflow_v1 and application_config.scope_review for EVERY candidate check. Freeze a fresh contract scoped to inspected promised behavior. Outside-scope proposals are recorded separately; missing protection on relevant behavior remains a requirement. Never edit historical results or remove a failed requirement for the same app version.","type":"boolean"},"receipt_config":{"additionalProperties":false,"properties":{"app_version":{"description":"Declared application build identifier; not code attestation.","type":"string"},"observation_seconds":{"description":"Observation window after each checkpoint; default 2 seconds. Verdict covers only measured windows.","maximum":5,"minimum":0.1,"type":"number"},"purchase_context":{"description":"Application routing custom_data, e.g. test workspace ID. Never credentials.","type":"object"},"purchase_marker":{"additionalProperties":false,"description":"Where the normal receipt includes its Paddle transaction ID; same-record recipient/marker matching is required.","properties":{"field":{"enum":["html","text","subject","tags"],"type":"string"},"tag_name":{"type":"string"}},"required":["field"],"type":"object"},"recipient_a":{"description":"Expected test recipient for purchase A, fixed before execution.","type":"string"},"recipient_b":{"description":"Different test recipient for the different-customer case.","type":"string"},"source_lookup_required":{"description":"Whether the app reads the source provider during its normal webhook handler.","type":"boolean"},"webhook_url":{"description":"Exact normal application webhook URL, including path.","type":"string"}},"required":["webhook_url","recipient_a","recipient_b","purchase_marker","app_version","source_lookup_required"],"type":"object"},"run_id":{"description":"Attempt ID returned by arm or suite configuration. Required with probe, cancel, execute or preflight; prevents stale calls from consuming a newer attempt.","type":"string"},"session_id":{"description":"Returned by the first call. Pass it back after their app has run a flow to see what it did.","type":"string"},"suite":{"description":"Configure the declared application receipt suite on this session.","enum":["receipt_delivery_v1","receipt_recovery_v1","application_workflow_v1"],"type":"string"}},"type":"object"}after
{"$defs":{"applicationAssertion":{"additionalProperties":false,"properties":{"absent":{"type":"boolean"},"all_of":{"items":{"$ref":"#/$defs/applicationAssertion"},"type":"array"},"contains":{"type":"string"},"count":{"minimum":0,"type":"integer"},"equals":{"type":["string","number","boolean","null"]},"repeat":{"maximum":5,"minimum":1,"type":"integer"},"required":{"type":"boolean"},"select":{"type":"string"},"set_equals":{"items":{"type":"string"},"type":"array","uniqueItems":true},"stable_under_repeat":{"type":"boolean"},"where":{"items":{"$ref":"#/$defs/applicationAssertion"},"type":"array"}},"required":[],"type":"object"}},"additionalProperties":false,"properties":{"app_base_url":{"description":"App origin when FetchSandbox must drive or observe a hosted HTTP suite. Optional for a provider-backed workflow executed by the builder through arm/probe; that path does not require a published app or webhook.","type":"string"},"application_config":{"additionalProperties":false,"description":"Frozen HTTP app drive/read-back contract: 1-30 checks, 1-20 actions per executable check, at most 300 declared actions in total, below 64 KiB. Preserve intermediate reads within these bounds; do not silently remove them. First check id=baseline must establish success. Checks require id, name, before {path,assertion}, ordinary HTTP actions [{method,path,body?,expect_status?}] or signed-event actions [{event:{provider,type,payload},expect_status?}], observe {path}, and assertion using select/equals/count/required or all_of. where and all_of must be lists of assertion objects, not field maps. equals accepts JSON strings, numbers, booleans and null; numeric/boolean literals preserve type, and null must be a present null field. Stripe event.payload is only the resource inside data.object, never a full event or a data.object wrapper: the server constructs and signs the envelope. Optional per-check observation_deadline_seconds (0-180, repeat=1 only) records bounded polling for eventual saved state; it does not drive a browser or turn a timeout into a pass. Every check first reads its declared starting-state precondition. Baseline requires count=0 on the same observed collection, with no where filter. Use {{run_id}} to scope fresh synthetic records. All paths are app-relative without query strings or fragments, including non-secret run_id queries; preserve run scoping through an inspected protected path-segment observer. Baseline permits only ordinary HTTP actions without signed events; prove signed purchase/access in later checks. Do not combine event actions with method/path/body/headers. {{step1.id}} binds a real action response to read-back. assertion.repeat (1-5) and stable_under_repeat support replay. Optional fault {provider,scenario} requires independently recorded provider refusal. For reassess/recontract include scope_review for every candidate check. Outside-scope feature proposals contain id,name,unsupported_reason only and move to separate scope_exclusions; they are not required tests. In-scope missing work uses id,name,blocker {category,reason,evidence,...}, never a free-text unsupported reason. engine_unsupported requires a capability confirmed by current backend capabilities; a missing app route or observer is not an engine gap. Unresolved policy remains unmeasured. Legacy untyped reasons remain unclassified, not engine unsupported. No user-supplied credentials, auth headers or live data. require_verifier_token=true generates an owner-only temporary Bearer token through secure handoff for protected test endpoints.","properties":{"app_version":{"type":"string"},"checks":{"items":{"oneOf":[{"additionalProperties":false,"properties":{"blocker":{"additionalProperties":false,"properties":{"capability":{"enum":["provider_lifecycle","provider_operation","independent_storage_attestation"],"type":"string"},"category":{"enum":["setup_missing","observation_missing","policy_unresolved","engine_unsupported"],"type":"string"},"evidence":{"items":{"maxLength":500,"minLength":1,"type":"string"},"maxItems":10,"minItems":1,"type":"array"},"method":{"enum":["GET","POST","PUT","PATCH","DELETE"],"type":"string"},"path":{"type":"string"},"provider":{"type":"string"},"reason":{"maxLength":1000,"minLength":1,"type":"string"}},"required":["category","reason","evidence"],"type":"object"},"id":{"maxLength":100,"minLength":1,"type":"string"},"name":{"type":"string"}},"required":["id","name","blocker"],"type":"object"},{"additionalProperties":false,"properties":{"id":{"maxLength":100,"minLength":1,"type":"string"},"name":{"type":"string"},"unsupported_reason":{"minLength":1,"type":"string"}},"required":["id","name","unsupported_reason"],"type":"object"},{"additionalProperties":false,"properties":{"actions":{"items":{"oneOf":[{"additionalProperties":false,"properties":{"body":{},"concurrency":{"maximum":8,"minimum":1,"type":"integer"},"expect_status":{"maximum":599,"minimum":200,"type":"integer"},"method":{"enum":["GET","POST","PUT","PATCH","DELETE"],"type":"string"},"path":{"type":"string"}},"required":["method","path"],"type":"object"},{"additionalProperties":false,"properties":{"concurrency":{"maximum":8,"minimum":1,"type":"integer"},"event":{"oneOf":[{"additionalProperties":false,"properties":{"payload":{"type":"object"},"provider":{"type":"string"},"type":{"type":"string"}},"required":["provider","type","payload"],"type":"object"},{"additionalProperties":false,"properties":{"provider":{"type":"string"},"replay_of":{"type":"string"}},"required":["provider","replay_of"],"type":"object"}]},"expect_status":{"maximum":599,"minimum":200,"type":"integer"}},"required":["event"],"type":"object"},{"additionalProperties":false,"properties":{"delay_seconds":{"exclusiveMinimum":0,"maximum":5,"type":"number"}},"required":["delay_seconds"],"type":"object"},{"additionalProperties":false,"properties":{"provider_control":{"additionalProperties":false,"properties":{"provider":{"type":"string"},"scenario":{"enum":["default"],"type":"string"}},"required":["provider","scenario"],"type":"object"}},"required":["provider_control"],"type":"object"},{"additionalProperties":false,"properties":{"client_lifecycle":{"additionalProperties":false,"properties":{"identity_field":{"type":"string"},"observe_path":{"type":"string"},"operation":{"enum":["restart"],"type":"string"},"timeout_seconds":{"maximum":180,"minimum":1,"type":"number"}},"required":["operation","observe_path","identity_field","timeout_seconds"],"type":"object"}},"required":["client_lifecycle"],"type":"object"}]},"maxItems":20,"minItems":1,"type":"array"},"assertion":{"$ref":"#/$defs/applicationAssertion"},"before":{"additionalProperties":false,"properties":{"assertion":{"$ref":"#/$defs/applicationAssertion"},"path":{"type":"string"}},"required":["path","assertion"],"type":"object"},"fault":{"additionalProperties":false,"properties":{"event_type":{"type":"string"},"evidence":{"enum":["refusal","accepted_response_loss","accepted_response_retry","webhook_withheld"],"type":"string"},"provider":{"type":"string"},"scenario":{"type":"string"}},"required":["provider","scenario"],"type":"object"},"id":{"maxLength":100,"minLength":1,"type":"string"},"name":{"type":"string"},"observation_deadline_seconds":{"maximum":180,"minimum":0,"type":"number"},"observe":{"additionalProperties":false,"properties":{"path":{"type":"string"}},"required":["path"],"type":"object"}},"required":["id","name","actions","before","observe","assertion"],"type":"object"}]},"maxItems":30,"minItems":1,"type":"array"},"coverage_review":{"description":"Applicability review against the returned coverage_policy. Missing dimensions remain unreviewed. Link relevant dimensions to declared checks, including explicitly unsupported checks. This is a proposed review, not execution proof.","items":{"additionalProperties":false,"properties":{"dimension":{"type":"string"},"reason":{"type":"string"},"relevance":{"enum":["relevant","not_applicable","unresolved"],"type":"string"},"rule_ids":{"items":{"type":"string"},"type":"array"}},"required":["dimension","relevance","reason","rule_ids"],"type":"object"},"maxItems":17,"type":"array"},"disposable_test_app":{"enum":[true],"type":"boolean"},"event_delivery":{"description":"provider_lifecycle registers provider-native subscriptions and requires actual app workflow actions. Optional provider_lifecycle_workflows selects catalog-owned witnesses/readback. Omitted selection preserves payment/email witnesses. direct uses verifier-signed events.","enum":["direct","provider_lifecycle"],"type":"string"},"event_destinations":{"additionalProperties":{"type":"string"},"description":"Session-provider to same-origin webhook path without query/fragment. Requires require_verifier_token=true and the isolated FETCHSANDBOX_<PROVIDER>_WEBHOOK_SECRET from secure handoff. Complete signed action shape: {event:{provider,type,payload},expect_status:200}; exact replay: {event:{provider,replay_of:'{{step2.event_id}}'},expect_status:200}. No method/path/body/headers on signed actions. Baseline uses ordinary HTTP actions; signed events belong in later checks. Existing signature checks must remain enabled.","type":"object"},"observation_seconds":{"maximum":5,"minimum":0.1,"type":"number"},"provider_lifecycle_workflows":{"additionalProperties":{"type":"string"},"description":"Optional destination-provider to returned catalog workflow id, e.g. {stripe: create_and_send_invoice}. Only declared application_lifecycle profiles are accepted. The server freezes expected events and independently reads the event resource in the workflow terminal state. Do not invent event names or substitute provider traffic for app-state assertions.","type":"object"},"require_verifier_token":{"type":"boolean"},"scope_review":{"description":"Required when reassessing/recontracting app scope. Review EVERY candidate check from inspected app behavior. Outside-app-scope entries must be non-executable proposals with inspection references; the backend excludes them from required checks and records them separately. Keep missing protection on relevant behavior in scope. A reason is an app-agent declaration, not independent source attestation. coverage_review links must name retained required checks only. Preserve failed requirements for the same app version.","items":{"additionalProperties":false,"properties":{"check_id":{"type":"string"},"classification":{"enum":["in_scope","outside_app_scope","unresolved"],"type":"string"},"evidence":{"items":{"maxLength":500,"minLength":1,"type":"string"},"maxItems":10,"minItems":1,"type":"array"},"reason":{"maxLength":1000,"minLength":1,"type":"string"}},"required":["check_id","classification","reason","evidence"],"type":"object"},"maxItems":30,"minItems":1,"type":"array"}},"required":["app_version","disposable_test_app","checks"],"type":"object"},"application_context":{"additionalProperties":false,"description":"Bounded inspected app summary, not credentials or raw code. The existing requirements model proposes rules; it cannot issue a verdict. Requires sign-in and an existing session_id: start with providers first, then send this context in a separate call using the returned session. Separate from fixtures/execution.","properties":{"app_version":{"type":"string"},"entry_points":{"items":{"type":"string"},"type":"array"},"fixture_requirements":{"items":{"type":"string"},"type":"array"},"goal":{"type":"string"},"state_store":{"type":"string"},"workflow":{"type":"string"}},"required":["goal"],"type":"object"},"arm":{"description":"Probe ID from the matrix to arm before running the app. Requires session_id.","type":"string"},"cancel":{"description":"Abort the attempt or retry failed cleanup. Requires session_id and run_id; cannot combine with arm or probe.","type":"boolean"},"execute":{"description":"Drive the configured app and evaluate the frozen receipt suite. Requires session_id/run_id; configuration acknowledgment alone is not proof. Starts the existing backend job asynchronously and returns promptly; follow status in this agent without allocating a background helper.","type":"boolean"},"fixtures":{"additionalProperties":false,"description":"Prepare session-owned twin data before app tests. Requires session_id. Stable id makes repeated calls replay-safe. Every step names spec, method and relative path. Use {{step1.id}} for dependencies. End with GET and an exact identity assertion. No live provider calls.","properties":{"id":{"maxLength":100,"minLength":1,"type":"string"},"steps":{"items":{"additionalProperties":false,"properties":{"assertion":{"additionalProperties":false,"description":"GET read-back only. Exactly four fields, e.g. {select: data.id, equals: '{{step2.id}}', required: true, count: 1} for Paddle. Use separate GET assertions for amount and currency; application all_of/where and JSON scalar predicates are not supported here.","properties":{"count":{"enum":[1],"type":"integer"},"equals":{"type":"string"},"required":{"enum":[true],"type":"boolean"},"select":{"type":"string"}},"required":["select","equals","required","count"],"type":"object"},"body":{"type":"object"},"expect_status":{"maximum":299,"minimum":200,"type":"integer"},"method":{"enum":["GET","POST","PUT","PATCH","DELETE"],"type":"string"},"name":{"type":"string"},"path":{"type":"string"},"query_params":{"type":"object"},"spec":{"type":"string"}},"required":["spec","method","path"],"type":"object"},"maxItems":40,"minItems":1,"type":"array"}},"required":["id","steps"],"type":"object"},"inspect":{"additionalProperties":false,"description":"Read fixture inputs through MCP using session_id. Prefer this MCP read to extracting a key for direct HTTP: the edge can reject a generic Python user agent even with valid ownership. This path keeps the existing MCP client authentication and headers. Do not ask for live provider keys. First resource=state returns collection counts; select collection to read real IDs and relationships with pagination. resource=operations lists provider contracts; specify both exact method and documented path to resolve one schema. Read-only, session-owned twins only, not application proof.","properties":{"collection":{"type":"string"},"limit":{"maximum":100,"minimum":1,"type":"integer"},"method":{"type":"string"},"offset":{"minimum":0,"type":"integer"},"path":{"type":"string"},"provider":{"type":"string"},"resource":{"enum":["state","operations"],"type":"string"}},"required":["provider","resource"],"type":"object"},"preflight":{"description":"Read-only public readiness check for a configured application_workflow_v1. Requires session_id/run_id. Checks frozen empty baseline and token enforcement without creating orders, injecting faults or rotating secrets. Retry same run after its exact setup blocker is repaired.","type":"boolean"},"probe":{"description":"Probe ID from the matrix to evaluate after running the app. Requires session_id and run_id.","type":"string"},"providers":{"description":"Provider slugs the app integrates, e.g. ['stripe'] or ['paddle','resend']. For provider-free HTTP workflows, omit providers and pass app_base_url.","items":{"type":"string"},"type":"array"},"reassess":{"description":"Set true when the user asks to reassess/recontract an app. Requires suite=application_workflow_v1 and application_config.scope_review for EVERY candidate check. Freeze a fresh contract scoped to inspected promised behavior. Outside-scope proposals are recorded separately; missing protection on relevant behavior remains a requirement. Never edit historical results or remove a failed requirement for the same app version.","type":"boolean"},"receipt_config":{"additionalProperties":false,"properties":{"app_version":{"description":"Declared application build identifier; not code attestation.","type":"string"},"observation_seconds":{"description":"Observation window after each checkpoint; default 2 seconds. Verdict covers only measured windows.","maximum":5,"minimum":0.1,"type":"number"},"purchase_context":{"description":"Application routing custom_data, e.g. test workspace ID. Never credentials.","type":"object"},"purchase_marker":{"additionalProperties":false,"description":"Where the normal receipt includes its Paddle transaction ID; same-record recipient/marker matching is required.","properties":{"field":{"enum":["html","text","subject","tags"],"type":"string"},"tag_name":{"type":"string"}},"required":["field"],"type":"object"},"recipient_a":{"description":"Expected test recipient for purchase A, fixed before execution.","type":"string"},"recipient_b":{"description":"Different test recipient for the different-customer case.","type":"string"},"source_lookup_required":{"description":"Whether the app reads the source provider during its normal webhook handler.","type":"boolean"},"webhook_url":{"description":"Exact normal application webhook URL, including path.","type":"string"}},"required":["webhook_url","recipient_a","recipient_b","purchase_marker","app_version","source_lookup_required"],"type":"object"},"run_id":{"description":"Attempt ID returned by arm or suite configuration. Required with probe, cancel, execute or preflight; prevents stale calls from consuming a newer attempt.","type":"string"},"session_id":{"description":"Returned by the first call. Pass it back after their app has run a flow to see what it did.","type":"string"},"suite":{"description":"Configure the declared application receipt suite on this session.","enum":["receipt_delivery_v1","receipt_recovery_v1","application_workflow_v1"],"type":"string"}},"type":"object"}Completion rule: a request to verify an app includes its applicable failure checks without another user prompt. When verification_continuation.required is true, continue in this agent: inspect pending_checks, preserve every declared check and its assertions, implement supported actions, and rerun a fresh attempt. Stop only with measured results or concrete blockers showing the missing capability and attempted evidence. Not run, not armed, and no observer yet are work to finish, not unsupported features. Do not clean up the session or present a final proof while actionable checks remain. Ask the owner only for genuinely missing business decisions, credentials or actions you cannot perform. For a local app, start the actual app ⟨757 unchanged words⟩ action requires sign-in. Proposals are not executed checks.Preserve allTheproposedapp-owningrulesagentinauthors the executable contract from inspected code and business scope. Server suggestions are advisory. Review every coveragereport,dimension;evendeclarewhenrelevantunsupported.unsupported behavior explicitly and explain genuinely unrelated features as not_applicable. Omitted suggestions are retained separately and cannot add required checks. If server_requirements_model_available is false or planning returns requirements_model_unavailable, ⟨65 unchanged words⟩ the protected handoff supplies its returned signing secret.Drive the actual app purchase/payment entry point, confirm/captureSelectitsa returnedPaymentIntent, and observe saved order plus email effects. Keep paymentcatalogandlifecycleduplicateprofilereplaywithinapplication_config.provider_lifecycle_workflows,separatee.g.checks{stripe:first confirm payment and poll independently saved paid order and receipt state; then GET the actual received success-event ID from app state and bind replay_of to that GET response. Never assume the payment response'create_and_send_invoice'}containsforevent_idinvoice.sent oruse the PaymentIntent ID{stripe:'accept_payment'}asforanpayment_intent.succeeded.eventTheID.serverIffreezes theapp cannot expose a receivedworkflow'seventsubscriptionidentityevents,retain replay aswitnessunmeasuredtypes andexplainproviderthereadback; missingobservation. Synthetic event type/payload actions are refused in this mode; exact replay of a delivereddelivery orexplicitly withheld run-correlated generated event is supported. Event actions accept concurrency frommismatched1providertostate8cannotforpass.realDriveoverlappingthatdeliveries.workflowUsethrough thereturned provider_control and fault.evidence contracts to drive recorded faultinspectedrecovery.app'sUseactualfault.evidence=accepted_response_retryentrywhenpoint.theDoappnotrecoversmanufacture alost accepted response insidepaymentitsforHTTPanrequestinvoice ora successful webhook callback. It requires an observedanotherclientnon-paymentdisconnectworkflow.beforeWithout amatching provider retry andselection, thesame accepted effect ID; simultaneous sends and a slow response cannot pass. accepted_response_loss remains thelegacyfailed-callbackpayment/emailpluswitnessesredeliveryremaincontract.unchanged. Fora declared client_lifecycle restart, follow client_checkpoint by restartingthereal apppaymentprocessprofile,withconfirm/capture thesameapp'sdurablereturnedstoragePaymentIntent andbindings, then retrieve theobservesamesavedrunorderwithoutplusanotheremailexecute.effects.InspectKeepwebhook_subscriptionspayment andrecorded callback responses; missing deliveryduplicateisreplayinconclusive,inneverseparateachecks:pass.firstOtherconfirmproviderpaymentlifecycleandregistrationspollareindependentlynotsavedyetpaidsupportedorderbyandthisreceiptmode;state;existingthenhostedGETsuitestheareactualunchanged.receivedLocalsuccess-eventcodingIDagentsfromshouldappcallstateinstall_test_credentialsandafterbindconfigurationreplay_of tosecurelythatinstallGETtemporaryresponse.secretsNeverusingassumetheirtheMCPpaymentaccountresponsekey;containsdoevent_idnotorcalluse thebrowser receipt_secretsPaymentIntentendpointIDwithas anAPI key or print secret values. HostedeventbuildersID.keepIf theexisting owner browserapphandoff.cannotForexpose anor
⟨740 unchanged words⟩ boolean"},"event_delivery":{"description":"provider_lifecycledrives theregistersactualprovider-nativeStripesubscriptionssubscriptionandthroughrequirestheactual apppaymentworkflowentryactions.pointOptionalandprovider_lifecycle_workflowsrequiresselectsexactlycatalog-ownedonewitnesses/readback.StripeOmitted
⟨37 unchanged words⟩ one up first.","type":"string"},"workflow_name":{"description":"Exact workflow id or name returned by this catalog. Returns its full definition, including steps and outcome rules, without executing it; omit for summaries.","type":"string"}},"type":"object"}
Start with providers (and optional app_base_url), then reuse the returned session_id for application_context, fixtures and attempts. Do not include application_context in the initial session call. Inspect how the actual app or workflow executes before choosing a verification path. If the builder can run that workflow locally, bind its real provider clients to every returned twin URL and the supplied test authentication. Use the returned provider operation contracts to implement those clients; a missing canned workflow does not mean the provider lacks an API operation. The existing arm/probe path does not require a published app or webhook: select a probe from the returned matrix, call arm with session_id, send its request_headers on EVERY provider request across the session, execute the actual workflow entry point, then call probe with the same session_id and returned run_id. Independently assert saved app state in the host and report that evidence separately. Provider traffic alone remains app_verified:false; it does not establish application execution or state. Do not substitute a standalone simulation, direct twin calls or a curated workflow for the user's implementation. A public origin is required when FetchSandbox must drive or observe an HTTP application suite; the hosted setup instructions below apply to that path. For hosted application_workflow_v1 apps, build and publish the ⟨458 unchanged words⟩ for supported checks while preserving untested receipt rules.SendAfter session creation, send session_id and application_context with the original goal and inspected workflow to obtain model-proposed rules, missing observations and fixture requirements. This planning action requires sign-in. Proposals are not executed checks. Preserve all proposed ⟨455 unchanged words⟩ production readiness. For a supported payment-to-receipt integration,follow the structured `next_action`; call `next_tool_call` only when it is non-null and its arguments are complete. Never execute while host-side setup is pending. Do not substitute guide, quickrun, list_workflows, or reference probes for application verification. Use the widest suite the server recommends. receipt_recovery_v1 includes R1-R4 and adds checks R5-R8 for accepted-send response loss, concurrent redelivery, source/email transient failures and delayed redelivery. Pass suite plus receipt_config with the app's exact webhook URL, test recipients and observable purchase marker. FetchSandbox freezes all four receipt rules for both same-customer and different-customer purchases. You are responsible for completing this setup: treat the target as a disposable test app, not the user's live production service, until its declared suite passes. For a greenfield app, keep live billing disabled and publish a temporary test build first to obtain its stable public origin. Use the published webhook URL, not a private preview URL. Inspect the app and identify the exact webhook route before suite configuration. Before requesting or applying test secrets, send an unsigned POST to that exact URL from outside the workspace; a 400 signature rejection is expected, while a 307/login redirect is a blocker. Keep signature validation enabled. After the successful preflight, configure the suite with its complete receip
{"additionalProperties":false,"properties":{"app_base_url":{"description":"WhereApptheiroriginappwhenisFetchSandboxdeployed,mustifdriveknown.orRecordedobservesoa hosted HTTP suite. Optional for alaterprovider-backedstepworkflowcanexecuteddeliverbywebhooksthe
⟨69 unchanged words⟩ id, name, before {path,assertion}, ordinary HTTP actions [{method,path,body?,expect_status?}] or signed-event actions [{event:{provider,type,payload},expect_status?}], observe {path}, and assertion using select/equals/count/required ⟨104 unchanged words⟩ {{run_id}} to scope fresh synthetic records.PathsAll paths areapp-relative.app-relative without query strings or fragments, including non-secret run_id queries; preserve run scoping through an inspected protected path-segment observer. Baseline permits only ordinary HTTP actions without signed events; prove signed purchase/access in later checks. Do not combine event actions with method/path/body/headers. {{step1.id}} binds a real action response ⟨56 unchanged words⟩ "minItems":1,"type":"array"},"coverage_review":{"description":"Applicability review against the returned coverage_policy. Missing dimensions remain unreviewed. Link relevant dimensions to declared checks, including explicitly unsupported checks. This is a proposed review, not execution proof.","items":{"additionalProperties":false,"properties":{"dimension":{"type":"string"},"reason":{"type":"string"},"relevance":{"enum":["relevant","not_applicable","unresolved"],"type":"string"},"rule_ids":{"items":{"type":"string"},"type":"array"}},"required":["dimension","relevance","reason","rule_ids"],"type":"object"},"maxItems":17,"type":"array"},"disposable_test_app":{"enum":[true],"type": ⟨5 unchanged words⟩ "},"description":"Session-provider to same-origin webhookpath.path without query/fragment. Requires require_verifier_token=true and the isolated FETCHSANDBOX_<PROVIDER>_WEBHOOK_SECRET from secure handoff.ActionsCompletemaysigneduseaction shape: {event:{provider,type,payload},expect_status:200};orexact replay: {event:{provider,replay_of:'{{step2.event_id}}'},expect_status:200}.priorNostepmethod/path/body/headersevent_idontemplate}.signed actions. Baseline uses ordinary HTTP actions; signed events belong in later checks. Existing signature checks must remain enabled.","type" ⟨209 unchanged words⟩ ,"properties":{"assertion":{"additionalProperties":false,"description":"GET read-back only. Exactly four fields, e.g. {select: data.id, equals: '{{step2.id}}', required: true, count: 1} for Paddle. Use separate GET assertions for amount and currency; application all_of/where and JSON scalar predicates are not supported here.","properties":{"count":{"enum":[ ⟨362 unchanged words⟩
⟨436 unchanged words⟩ Requires session_id/run_id; configuration acknowledgment alone is not proof. Starts the existing backend job asynchronously and returns promptly; follow status in this agent without allocating a background helper.","type":"boolean"},"fixtures":{ ⟨423 unchanged words⟩
⟨20 unchanged words⟩ to it.","type":"string"},"application_config":{"additionalProperties":false,"description":"Frozen HTTP app drive/read-back contract. First check id=baseline must establish success. Checks require id, name, before {path,assertion}, actions [{method,path,body?,expect_status?}], observe {path}, and assertion using select/equals/count/required or all_of. Every check first reads its declared starting-state precondition. Baseline requires count=0 on the same observed collection, with no where filter. Use {{run_id}} to scope fresh synthetic records. Paths are app-relative. {{step1.id}} binds a real action response to read-back. assertion.repeat (1-5) and stable_under_repeat support replay. Optional fault {provider,scenario} requires independently recorded provider refusal. Unsupported checks contain id,name,unsupported_reason only. No user-supplied credentials, auth headers or live data. require_verifier_token=true generates an owner-only temporary Bearer token through secure handoff for protected test endpoints.","properties":{"app_version":{"type":"string"},"checks":{"items":{"type":"object"},"maxItems":30,"minItems":1,"type":"array"},"disposable_test_app":{"enum":[true],"type":"boolean"},"observation_seconds":{"maximum":5,"minimum":0.1,"type":"number"},"require_verifier_token":{"type":"boolean"}},"required":["app_version","disposable_test_app","checks"],"type":"object"},"application_context":{"additionalProperties":false,"description":"Bounded inspected app summary, not credentials or raw code. The existing requirements model proposes rules; it cannot issue a verdict. Requires session_id; separate from fixtures/execution.","properties":{"app_version":{"type":"string"},"entry_points":{"items":{"type":"string"},"type":"array"},"fixture_requirements":{"items":{"type":"string"},"type":"array"},"goal":{"type":"string"},"state_store":{"type":"string"},"workflow":{"type":"string"}},"required":["goal"],"type":"object"},"arm":{"description":"Probe ID from the ⟨50 unchanged words⟩ not proof.","type":"boolean"},"fixtures":{"additionalProperties":false,"description":"Prepare session-owned twin data before app tests. Requires session_id. Stable id makes repeated calls replay-safe. Every step names spec, method and relative path. Use {{step1.id}} for dependencies. End with GET and an exact identity assertion. No live provider calls.","properties":{"id":{"maxLength":100,"minLength":1,"type":"string"},"steps":{"items":{"additionalProperties":false,"properties":{"assertion":{"additionalProperties":false,"properties":{"count":{"enum":[1],"type":"integer"},"equals":{"type":"string"},"required":{"enum":[true],"type":"boolean"},"select":{"type":"string"}},"required":["select","equals","required","count"],"type":"object"},"body":{"type":"object"},"expect_status":{"maximum":299,"minimum":200,"type":"integer"},"method":{"enum":["GET","POST","PUT","PATCH","DELETE"],"type":"string"},"name":{"type":"string"},"path":{"type":"string"},"query_params":{"type":"object"},"spec":{"type":"string"}},"required":["spec","method","path"],"type":"object"},"maxItems":40,"minItems":1,"type":"array"}},"required":["id","steps"],"type":"object"},"probe":{"description":"Probe ID from the ⟨20 unchanged words⟩ e.g. ['stripe'] or ['paddle','resend'].RequiredFortoprovider-freestartHTTPaworkflows,session.omit providers and pass app_base_url.","items":{"type":"string"}, ⟨200 unchanged words⟩ this session.","enum":["receipt_delivery_v1","receipt_recovery_v1","application_workflow_v1"],"type":"string"}},"type":"object"}
⟨311 unchanged words⟩ it did.","type":"string"},"setup_confirmed":{"description":"Required with execute:true. Set true only after the human confirms the three temporary secrets and twin settings are installed in the isolated development/test/staging app configuration. This acknowledgement is not proof; the receipt suite verifies actual behavior.","type":"boolean"},"suite":{"description":"Configure the declared application ⟨12 unchanged words⟩
⟨311 unchanged words⟩ it did.","type":"string"},"setup_confirmed":{"description":"Required with execute:true. Set true only after the human confirms the three temporary secrets and twin settings are installed in the isolated development/test/staging app configuration. This acknowledgement is not proof; the receipt suite verifies actual behavior.","type":"boolean"},"suite":{"description":"Configure the declared application ⟨12 unchanged words⟩
⟨323 unchanged words⟩ on this session.","enum":["receipt_delivery_v1","receipt_recovery_v1"],"type":"string"}},"type":"object"}
⟨20 unchanged words⟩ to it.","type":"string"},"arm":{"description":"Probe ID from the matrix to arm before running the app. Requires session_id.","type":"string"},"cancel":{"description":"Abort the attempt or retry failed cleanup. Requires session_id and run_id; cannot combine with arm or probe.","type":"boolean"},"execute":{"description":"Drive the configured app and evaluate the frozen receipt suite. Requires session_id/run_id; configuration acknowledgment alone is not proof.","type":"boolean"},"probe":{"description":"Probe ID from the matrix to evaluate after running the app. Requires session_id and run_id.","type":"string"},"providers":{"description":"Provider slugs the app ⟨14 unchanged words⟩ :"string"},"type":"array"},"receipt_config":{"additionalProperties":false,"properties":{"app_version":{"description":"Declared application build identifier; not code attestation.","type":"string"},"observation_seconds":{"description":"Observation window after each checkpoint; default 2 seconds. Verdict covers only measured windows.","maximum":5,"minimum":0.1,"type":"number"},"purchase_context":{"description":"Application routing custom_data, e.g. test workspace ID. Never credentials.","type":"object"},"purchase_marker":{"additionalProperties":false,"description":"Where the normal receipt includes its Paddle transaction ID; same-record recipient/marker matching is required.","properties":{"field":{"enum":["html","text","subject","tags"],"type":"string"},"tag_name":{"type":"string"}},"required":["field"],"type":"object"},"recipient_a":{"description":"Expected test recipient for purchase A, fixed before execution.","type":"string"},"recipient_b":{"description":"Different test recipient for the different-customer case.","type":"string"},"source_lookup_required":{"description":"Whether the app reads the source provider during its normal webhook handler.","type":"boolean"},"webhook_url":{"description":"Exact normal application webhook URL, including path.","type":"string"}},"required":["webhook_url","recipient_a","recipient_b","purchase_marker","app_version","source_lookup_required"],"type":"object"},"run_id":{"description":"Attempt ID returned by arm. Required with probe or cancel; prevents stale calls from consuming a newer attempt.","type":"string"},"session_id":{"description":"Returned by the first ⟨8 unchanged words⟩ run a flow to see what it did.","type":"string"},"suite":{"description":"Configure the declared application receipt suite on this session.","enum":["receipt_delivery_v1"],"type":"string"}},"type":"object"}
⟨101 unchanged words⟩ are FetchSandbox reference implementations, NOT the user'scodecode.—Aapplyconfirmed reference result does not verify thebrain'suser'sfix_patternapp or show that it is ready toinheritship. Keep theprovenreturnedbehavior.provider and evidence scope with any reported result.
⟨89 unchanged words⟩ to save the diff onto that run's receipt. This binds the pattern to that sandbox's provider; provide it when verifying a provider integration.","type":"string"}},"required": ⟨3 unchanged words⟩
Ingest an OpenAPI spec and get a working sandbox you can call immediately. REQUIRED: pass EITHER `url` OR `content` — never just `name` alone (name is a display label, not a lookup). If the user mentions a popular API by name (Stripe, GitHub, Twilio, Notion, OpenAI, etc.), FIRST call `list_specs` with a filter to confirm it's in the catalog, then call import_spec with that vendor's public OpenAPI URL (e.g. Stripe: https://raw.githubusercontent.com/stripe/openapi/master/openapi/spec3.json). The backend content-hashes the spec and auto-matches to the bundled sandbox when applicable. Returns san…
List recent workflow runs (and ad-hoc traffic) for a sandbox, newest first. Use when the user asks 'what did I run', 'show me recent validation runs', 'did the stripe test pass earlier', or wants to find a previous run to share or re-inspect. Each run includes its shareable timeline URL (fetchsandbox.com/runs/<sandbox_id>) so the user can open the visual trace in a browser or drop it in Slack / a PR comment. Requires sandbox_id (from import_spec).
List the FAILURE SCENARIOS this sandbox can inject on demand — the specific ways the real provider misbehaves in production. Call this BEFORE claiming an integration works. A checkout that passes on the happy path tells you almost nothing; the bugs that reach customers are declined cards, webhooks delivered twice or out of order, expired tokens, rate limits and slow networks. Typical names: payment_declined, insufficient_funds, webhook_retries, flaky_webhooks, replayed_old_signed_event, signed_event_with_mutated_body, auth_failure, rate_limited, slow_network — but they differ per provider, wh…
Browse the FetchSandbox spec catalog — every API (Stripe, GitHub, Twilio, Notion, OpenAI, Polar, GitLab, and 40+ more) that has a ready-to-use sandbox with curated workflows. Use when the user asks 'what APIs do you support?', 'what specs are available?', 'show me the catalog', 'do you have <X>?', or wants to explore before committing to one. Returns each spec's slug (use as `name` arg to import_spec), description, endpoint count, and tags. Pass `filter` to narrow by substring (e.g., filter='pay' returns Stripe, Paddle, Polar).
THE PROOF STEP. The only way to establish that a fix actually works, and the only thing that produces a shareable receipt. Ship the STILL-BUGGY project plus your proposed diff: FetchSandbox applies the diff to a copy and runs the SAME failure probe against the buggy and the fixed tree, against real provider behaviour. Green ONLY on a measured flip — the bug demonstrably present before, demonstrably gone after. CALL THIS BEFORE YOU WRITE THE FIX TO DISK. prove_fix needs the broken tree to reproduce against; applying the diff first makes a measured proof impossible. DO NOT SUBSTITUTE YOUR OWN T…
Execute EVERY workflow (or a scoped subset) for a sandbox in ONE call. Use this — NOT a loop of run_workflow — for any validation-style request: "validate this integration", "run all workflows", "check coverage", "test stripe checkout", "fs validate". IDEs (Cursor, Claude Code) approve each MCP call individually, so 18 workflows via run_workflow = 18 clicks. This tool = 1 click, total. Scope via `workflow_names`: pass an array of workflow ids to run a subset (e.g., user says "validate stripe CHECKOUT" → pass ["create_checkout_session", "checkout_complete"]). Names are case-insensitive; dashes…
ARM a failure scenario on a sandbox, so the next requests hit the provider misbehaving instead of the happy path. This is how you find out whether the integration you just wrote actually survives production. Use it like this: run the flow once on 'default' and confirm it works, call set_scenario with a failure from list_scenarios, run the SAME flow again, then check the end state is still correct — not that the call merely returned. A declined payment must not produce a confirmed order; a webhook delivered twice must not charge twice or send two emails. Set scenario to 'default' to return the…
Receipts are readable by anyone with the link — do not attach bodies the user would not paste into a public PR. Attach REAL before/after evidence from the USER's actual app to the run receipt. Use this AFTER you've fixed the bug and re-run the app: it makes the receipt show their own code's behavior (before your fix vs after), which is far stronger proof than a reference simulation. Provide one `proofs` entry per probe you fired — the request you sent, the response BEFORE the fix (bug reproduces), and the response AFTER the fix (bug gone) — keyed to the run's sandbox_id + flow_run_id (from ru…
⟨7 unchanged words⟩ returned by import_spec.","type":"string"}},"requiredspec_slug":[{"description":"A human name like 'resend' or 'stripe'. Use this when you do not have a spec_id — you do not need to look one up first."],"type":"string"}},"type":"object"}