kwh.sh · the unit of agent work

Count the work. Not the waiting.

One kwh is sixty seconds of active agent work: two vCPU lit, tokens in flight. Waiting counts zero. The runtime makes the power. kwh is the meter anyone installs.

example meter · mtr_01M36verified
active
42.7 min
waiting
18.2 min · 0
source
signed events
01 · active

Compute is lit.

CPU, token generation, tools and external effects add to active time.

02 · waiting

Silence is zero.

Queue, approval, user wait and idle wall-clock time never inflate the count.

03 · evidence

The count is signed.

Events, durations, source class and formula version travel with every record.

a unit, not an invoicewho does what
kwhdefines what a unit of agent work is, and signs that the count is truemeter
billingturns usage into invoicesnot kwh
payment railmoves the moneynot kwh
the constantkwh.v1
kwh = (t_active / 60) × c      c = 1
waiting → 0 · strength rides along, never changes the number
meter a run · example run kwh_run_M1

Run the work. Watch it count.

Pick what the agent is doing, then move the clock. The wall clock takes every second. The meter takes only the lit ones. Close the run to seal the record.

what the agent is doing nowtool call
move the clockopen
the meterexample
wall clock
0 s
active
0 s
waiting · counts 0
0 s
#statesecondscounts
example recordexample · not live yet
close the run to hash it locally.
example · not live yet · nothing is billed here
count strength · run kwh_7A21

Two sources. One run.

When a first-party runtime runs the work, the count comes from signed runtime events and reads VERIFIED. When the events come from someone else's stream, it reads COUNTED. Put them side by side and see where they part.

casesc1
interval by interval
intervalwhat happenedverifiedcountedmatch
verifiedsigned runtime events
countedanother system's stream

strength rides along with the number. it never changes it. every interval that differs is named with its reason.

alerts · strength.differs

They part. You hear.

For runs with both a VERIFIED and a COUNTED source, kwh compares them interval by interval. When they disagree by more than the gap you set, it sends strength.differs with the interval and the reason.

send an alert when the gap is at least0 alerts
today's runs · both sourcestap a row
rungapalertverifiedcounted
payload

example · not live yet · strength rides along with the number, it never changes it

the record · mtr_01M36

Every count carries its proof.

A meter record lists the events, the durations, the source class and the formula version. Its hash is computed in this tab. Change one second and the hash stops matching.

meter recordunchecked

try to change itthen check again
check log
press check the hash to recompute it.

example · not live yet · signatures not shown

wall clock vs the meter · three example runs

Same run. Two clocks.

Pick a run. The wall clock counts every second it was open. kwh counts only the lit ones: tool calls, tokens in flight, external effects. Queues, approvals and idle time read zero.

runwall clock
lit · countswaiting · counts 0
wall clock
0
lit
0
kwh
0
#statesecondscounts

example · not live yet · 1 kwh = 60 lit seconds · waiting counts zero

the spec · kwh.v1

The brand is a unit.

kwh is not a name with a font. It is a unit, with variables and a formula. Define work once and every system counts the same thing.

the relationstypeset in the lattice
variableswhat the product sells
E · energythe count itself, in kwh. what the meter adds up and the record proves. it only grows.kwh
P · powerthe burn rate of a lit agent. how hard the fleet is working right now.kwh/min
t · timelit seconds: 2 vCPU lit and tokens in flight. waiting reads zero.s
W · workwhat the agent got done for the energy spent. the count prices E; the product delivers W.-
what countskwh.v1
statecountswhy
tool callactivecompute is lit
tokens in flightactivegeneration is work
external effectactivethe agent is acting
queue0nothing is lit
waiting on approval0a person is deciding
idle0wall clock is not work
console · workspace acme-agents

Example meters.

this month
0
power now
0
waiting · counted 0
0
meterstap one
meteragentkwhstrength
keys

meter detail
tap a meter.

example · not live yet · prices are on the pricing page

power · P = dE/dt · workspace acme-agents

How hard is it working right now.

E is the count. P is the burn rate: kwh per minute across every lit agent. Start and park agents and watch P move. Parked agents read zero, because waiting is free.

power now0 lit
E this session
0.000 kwh
peak P
0.0
parked · counts 0
0
agentstap to start or park
agentdoingP · kwh/minE · kwh

example · not live yet · one lit agent burns at most 1 kwh per minute under kwh.v1, c = 1

pricing · workspace acme-agents

Every kwh counted. Priced at launch.

kwh prices counting, not compute. Any free allowance is set at launch. The line on the meter is an example · not live yet. Past it, counting is metered and each one is signed. Price set at launch. Tap a monthly volume on the meter.

kwh per month · example · not live yetunder the example line
under example line
0
metered
0
waiting · counts 0
0 kwh

    month recordsigned
    who does whatthe count is the product
    partjob
    kwhcounts the work and signs that the count is true
    your billing toolturns the signed count into an invoice
    your payment railmoves the money
    every volume gets
    every line, with its price
    lineprice
    Free allowanceCounted kwh each month that carry no charge. Counting, not compute.set at launch
    Counting above the allowanceEach counted kwh past the free allowance, with its signed receipt.price set at launch
    TracingEvery run traced, kept 7 days.price set at launch
    Longer retentionKeep traces and records past 7 days.price set at launch
    WaitingAn agent that is parked or waiting counts zero kwh.0 kwh

    example · not live yet

    media analytics · asset ast_4K21

    Count the watching too.

    Product-facing media analytics lives on kwh: the same discipline applied to what people watch and listen to. Counted from signed playback events, never from a guess. Waiting and buffering count zero here too.

    range7 days
    played minutes
    0
    plays
    0
    buffering · counts 0
    0
    where it was playedshare of minutes
    what the count excludeskwh.v1 discipline
    bufferingthe player waited, nobody watched0
    paused tabopen is not playing0
    bot replayunsigned events are dropped0

    example · not live yet

    integrations · where the count goes

    kwh counts. Others bill and pay.

    kwh defines the unit and signs the count. Billing turns usage into invoices. The payment rail moves the money. Follow one record through the handoff.

    the handoffexample · not live yet

    example · not live yet · nothing is billed

    payload
    press next step.
    event sourcesstrength rides along
    sourcehow it arrivesstrength
    first-party runtimesigned runtime eventsverified
    your own runtimeevents you send to the kwh apicounted
    another platform's streamforwarded event streamcounted
    kwh webhookskwh's own surface
    meter.sealeda run closed and its record was hashedevent
    meter.thresholdE crossed a level you setevent
    strength.differsverified and counted disagree on an intervalevent

    example · not live yet · kwh never holds or moves money

    docs · install the meter

    Install the meter.

    endpointstap one
    example · not live yet
    response200

    example · not live yet

    sign in

    Sign in.

    example · not live yet · nothing is sent · new to kwh? install the meter

    trace · span by span

    Each span. Lit or not.

    Open a run and read it as spans. Each span says what the agent was doing and whether it was lit. The kwh on the run is the sum of the lit spans, and nothing else.

    runwall clock
    spans
    0
    lit seconds
    0
    kwh
    0

    example · not live yet · 1 kwh = 60 lit seconds · waiting counts zero

    start

    Install the meter.

    where your runs come from

    example · not live yet · nothing is sent · already metering? sign in

    kwh.sh / customer usage

    Show your customers the count.

    One count for the customer. Work that ran is lit. Waiting stays at zero. The statement travels with its method, source and period.

    customer statementcounted
    Example StudioAugust 2026
    counted work
    Power, over time.
    statement mathkwh.v1
    active885,600 scounts
    waiting111,600 s0 kwh
    unit60 active seconds1 kwh
    sourcenamed per runbelow
    run by run3 runs
    runsourceactivewaitingcounted
    statement recordnot sealed
    source classes
    exclusions
    checkable recordkwh.v1
    local record hash
    no check yet
    kwh.sh / source-class audit

    Follow every second.

    Every run carries its source and the seconds that count. The excluded time stays visible beside it.

    audit trailAugust 2026
    counted workkwh.v1
    0 kwh
    waiting excluded0 kwh
    0 s
    source classes
    first_party + external
    runs
    run detail

    active · counted
    waiting · excluded
    count calculation60 active s = 1 kwh
    run recordkwh.v1
    period reconciliationall runs read
    kwh.sh / meter topology

    From event to kwh.

    A run arrives from a first-party runtime or an external event stream. Each interval takes a state. Active seconds enter the count. Waiting never does.

    follow a runresearch agent
    intervals / select oneexample source
    the selected interval01 / 07
    tokens in flight

    140 s

    generation is work

    sourceexample source
    classactive
    into count2.33 kwh
    run totalkwh.v1
    wall clock
    active / counted
    waiting / excluded
    active seconds ÷ 60
    local run recordsource class · kwh.v1
    404

    Zero. Nothing lit here.

    back to the meter →