Production timeouts are rarely "just call Timeout.timeout." You need a real budget, predictable expiry, and a way to pass that budget to the next service. is a small, stdlib-only gem that treats timeouts as deadlines: monotonic clocks, pluggable strategies, and one consistent API-no Rails, no ActiveSupport.
The core idea is three separate attribute layers: inputs (what comes in), internals (working state), and outputs (what goes out). Each is a distinct declaration with its own namespace and type checking. Combined with declarative make calls that define action order, the data flow through a service is visible at a glance: class Payments::Process < ApplicationService::Base input :payment, type: Payment internal :charge_result, type: Servactory::Result output :payment, type: Payment make :validate_status! make :perform_request! make :handle_response! make :assign_payment