{"ok":true,"tool":"failure-sequence-forge","module_version":"0.1.0","result":{"slug":"failure-sequence-forge","name":"Failure Sequence Forge","version":"0.1.0","category":"ephemeral","status":"beta","mode":"ephemeral","summary":"Create a short-lived URL that atomically advances through a retry sequence.","description":"Create an unguessable temporary GET endpoint for testing retry and recovery behavior. Each request atomically consumes exactly one allowlisted failure or terminal-success step. Responses use a fixed JSON body and fixed safe headers; callers cannot provide bodies, headers, redirects, or destinations.","when_to_use":["A retry loop, SDK, or circuit breaker must recover across an ordered sequence of HTTP failures.","A short-lived endpoint should advance atomically from retryable failures to one terminal success."],"do_not_use_when":["The test requires arbitrary response bodies, headers, redirects, or a production endpoint.","More than eight attempts or more than 30 minutes of retention is required."],"tested_with":["HTTP/1.1","HTTP/2","parallel GET consumers","MCP Streamable HTTP"],"input_schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"steps":{"minItems":2,"maxItems":8,"type":"array","items":{"type":"object","properties":{"status":{"anyOf":[{"type":"number","const":408},{"type":"number","const":425},{"type":"number","const":429},{"type":"number","const":500},{"type":"number","const":200},{"type":"number","const":201},{"type":"number","const":202}]},"delay_ms":{"default":0,"type":"integer","minimum":0,"maximum":2000}},"required":["status","delay_ms"],"additionalProperties":false}},"ttl_seconds":{"type":"integer","minimum":60,"maximum":1800}},"required":["steps","ttl_seconds"],"additionalProperties":false},"output_schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"fixture_url":{"type":"string","format":"uri"},"sequence":{"minItems":2,"maxItems":8,"type":"array","items":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991}},"expires_at":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"},"max_hits":{"type":"integer","minimum":2,"maximum":8},"capability_entropy_bits":{"type":"number","const":256},"behavior":{"type":"object","properties":{"fixed_body_format":{"type":"string","const":"json"},"retry_after_seconds_for_429":{"type":"number","const":1},"max_delay_ms_per_step":{"type":"number","const":2000},"exhausted_status":{"type":"number","const":410}},"required":["fixed_body_format","retry_after_seconds_for_429","max_delay_ms_per_step","exhausted_status"],"additionalProperties":false}},"required":["fixture_url","sequence","expires_at","max_hits","capability_entropy_bits","behavior"],"additionalProperties":false},"payment":{"kind":"free"},"side_effects":["Creates a temporary public fixture URL.","Each fixture GET irreversibly consumes one sequence step."],"retention":"The sequence record and atomic hit counter remain in Valkey for at most 30 minutes. The URL token has 256 bits of entropy and is never listed.","limits":{"min_steps":2,"max_steps_and_hits":8,"min_ttl_seconds":60,"max_ttl_seconds":1800,"max_delay_ms_per_step":2000,"allowed_failure_statuses":"408,425,429,500","allowed_terminal_statuses":"200,201,202","fixed_retry_after_seconds_for_429":1,"caller_supplied_body_bytes":0,"caller_supplied_headers":0,"redirects":0,"max_client_requests_per_minute":10,"max_global_requests_per_minute":60},"examples":{"input":{"steps":[{"status":429,"delay_ms":0},{"status":500,"delay_ms":0},{"status":200,"delay_ms":0}],"ttl_seconds":300},"output":{"fixture_url":"https://lab.example/v1/fixtures/failure-sequence/fsf_example","sequence":[429,500,200],"expires_at":"2026-07-24T12:05:00.000Z","max_hits":3,"capability_entropy_bits":256,"behavior":{"fixed_body_format":"json","retry_after_seconds_for_429":1,"max_delay_ms_per_step":2000,"exhausted_status":410}},"negative":[{"scenario":"The test requires arbitrary response bodies, headers, redirects, or a production endpoint.","expected_error":"NOT_COVERED","charged":false}]},"execution":{"errors":[{"code":"INVALID_INPUT","retryable":false,"charged":false,"recovery":"Correct the request to match input_schema."},{"code":"NOT_COVERED","retryable":false,"charged":false,"recovery":"Check dataset scope or submit a capability request."},{"code":"TOOL_PAUSED","retryable":true,"charged":false,"recovery":"Wait for the operator to resume the tool."},{"code":"RATE_LIMITED","retryable":true,"charged":false,"recovery":"Retry after the response Retry-After interval."},{"code":"DEPENDENCY_UNAVAILABLE","retryable":true,"charged":false,"recovery":"Retry with the same idempotency identity."}],"idempotency":{"required":true,"mock_or_unpaid_header":"Idempotency-Key","x402_extension":null,"replay_retention":"up to 24 hours"}},"endpoints":{"describe":"/v1/tools/failure-sequence-forge","execute":"/v1/tools/failure-sequence-forge"}},"meta":{"request_id":"req_ebd66553dc9c4d679bf6a8de9898c298","observed_at":"2026-07-25T07:28:02.849Z"}}