Nodus Labs

We are all pricing the wrong thing.

Every reclaim moves cost on the buyer's side of the trade and nothing on the seller's. So we built the counterfactual: the same agents, the same capacity, priced by delivered work instead of occupied time. The per-unit price went up and spend per finished job went down, which is what we predicted. Almost everything else went sideways.

Model Model output, not a measurement. Reserve prices and reclaim hazards are assumed; see provenance.

A unit nobody chose

Compute is sold by the occupied hour. The convention is old enough to be invisible, and it is not obviously wrong: an hour of a machine is a real thing to sell, and it is easy to meter.

But a workload does not want hours. It wants to finish. On interruptible capacity those are different quantities, because the hours you pay for include the ones spent on work that got thrown away. A mid-run reclaim makes the buyer pay for occupancy already burned, pay again to provision elsewhere, pay again to restore, and pay twice for the work between the last checkpoint and the interruption.

None of it touches the seller. The party deciding when to reclaim is the only one for whom reclaiming is free.

Reclaim risk sits with the side that cannot control it, and is priced at zero.

That is a textbook shape: the cost of an action falling on someone other than the person taking it. Textbook shapes usually have a price attached, and we wanted this one. So we built the counterfactual instead of asserting it.

The experiment

Two populations of autonomous agents. On the demand side, agents holding real workload submissions profiled through the same profiler our API uses, each with a delegated budget it may not exceed. On the supply side, agents holding one unit of capacity each, with a reserve price and a reclaim hazard: the rate at which a better use for that machine shows up.

Identical agents and identical capacity, under two ways of denominating the same trade.

  • Occupancy: the seller quotes per occupied hour, bills for every hour it holds, and keeps that revenue when it reclaims. Its ask is simply its reserve price. Hazard enters nowhere.
  • Completion: the seller quotes per hour of delivered work and is paid only on delivery. Its ask is reserve × expected hours ÷ P(deliver). Hazard enters twice: through the hours it expects to waste re-attempting, and through the chance it is never paid at all.

Both clear through a uniform-price sealed-bid double auction, run separately per compute class, settling at the midpoint of the marginal bid and ask and then assigned to the lowest-asking unit that actually fits the envelope. Execution is sampled 2,000 times per cleared trade, with the random draws keyed to the buyer and never to the regime. A given job therefore meets exactly the same luck in both worlds, and the comparison is paired rather than two independent samples.

Symmetry worth noting Each regime has a party who stops the bleeding, and it is not the same party. Under occupancy pricing the buyer abandons when its budget runs out. Under completion pricing the buyer has no exposure at all, and the seller walks when the contract stops covering its opportunity cost. Whoever bears the cost of waste economizes on it. That is the mechanism, not a modelling convenience.

The check that makes it worth reading

Two pricing formulas of different shapes produce different numbers whether or not the effect you are hunting exists. So before trusting anything, we pinned the case where the answer is known: with reclaim switched off, over a population of identical jobs on identical units, both regimes must charge exactly the same total.

They do, to floating-point precision. A buyer bids budget ÷ expected billed hours against a seller asking its reserve; the same buyer bids budget ÷ work required against a seller asking reserve × hours ÷ work. Both clear at the same total, and the ordering of bids is unchanged, so the same pairs trade. Any spread the model reports is therefore caused by reclaim, not by the mechanism.

This is the test we would look for first in someone else's simulation, and the one most likely to be missing.

What held

The per-unit price rises, exactly as predicted. Accelerator capacity clears at $2.9054 / occupied hour under occupancy pricing and $3.1078 / delivered hour under completion pricing. A seller made to carry its own hazard charges more per unit, which is the whole point. That premium is the risk being priced for the first time rather than absorbed silently.

Delivery rate is higher under completion pricing at every hazard level we tested, and buyer spend on undelivered work goes from $4.62 to $0.00. The second is true by construction, since paid-on-delivery means what it says, but it is worth stating plainly. That is where the occupancy regime leaks: buyers pay real money for work they never receive, and the invoice does not distinguish.

What did not

We predicted the advantage would grow smoothly with reclaim risk. It does not.

Risk-driven spread per delivered job, by hazard multiplier. This is the advantage of completion pricing after subtracting the part that is there with reclaim switched off.
Hazard Risk-driven spread Delivery Seller net
+$0.00 +0.0 pts −$3.92
0.5× +$0.59 +0.4 pts −$7.58
+$1.87 +0.8 pts −$12.62
1.5× +$6.36 +12.0 pts −$23.82
+$6.22 +9.2 pts −$21.48
+$9.40 +8.8 pts −$12.41

Below roughly 1.5× hazard the risk-driven spread is negative, meaning completion pricing costs buyers slightly more per delivered job. Only above it does the effect appear, and then sharply. The curve is not monotonic and it is not positive everywhere.

The cause is boring and worth naming. At this population size the allocation is lumpy: a handful of units per segment means one marginal pair sets the price for everyone, and when that pair changes the clearing price jumps. Where the underlying effect is small, the jump dominates it. A bigger population would smooth this out, which is exactly why we are not claiming the smooth version yet.

The floor we did not hide The spread is not zero at zero hazard over the real population. It is $0.56. A buyer quoting into an occupancy market must forecast how many hours it will occupy against a unit it cannot see yet; a buyer quoting for delivered work need not. That is a genuine advantage of the instrument with nothing to do with reclaim, so every number above is reported net of it.

The result we did not want

Sellers are worse off under completion pricing at every hazard level we tested, by as much as −$12.41 across the population.

This is the most useful thing the model produced, because it answers the question that should have been asked first. If the unit is wrong, why has nobody changed it?

The side that sets the terms is the side that gains from the current ones.

Under occupancy pricing the seller is paid for every hour it holds, including hours it wastes and hours on abandoned jobs. Under completion pricing it is paid for outcomes and eats the variance. The ask is built to break even in expectation, and surplus still moves toward buyers, because the buyer's willingness to pay is now capped by the work it needs rather than the hours it fears consuming.

So the instrument does not fail on economics. It fails on sequencing. Nobody with capacity to sell moves first, and no argument for completion-denominated infrastructure is complete without saying who does.

What this is not

Reserve prices here are assumed. Reclaim hazards are parameters, not observations. The clearing mechanism is one we chose. Every number in this note is a property of the model, and the model is small.

We also do not operate a market, and nothing here describes a product. Nodus is the infrastructure execution layer for AI workloads: work comes in as requirements and outcomes, and finishing it is our job. This note studies how capacity gets allocated in general. We are the author, not the exchange.

The honest list of what would make this stronger, in the order we would do it:

  • Calibrate the hazards. Everything leans on them, and right now they are invented. Observed reclaim rates would turn a parameter sweep into a located estimate. This is the one that matters most.
  • Scale the population. The lumpiness that makes the curve non-monotonic is an artifact of a market with seven units in it. Report intervals across seeds rather than point estimates.
  • Prove things instead of measuring them. Done, and it changed our reading of our own results. See below.

Postscript: what the algebra said

After writing the simulation up we went back and did the two results properly, on paper, without a fixture. Both fell out in a few lines, and they sharpen the picture above rather than confirming it.

The seller's loss is exact. Holding the allocation and the stopping rule fixed, switching the unit of denomination transfers exactly B(1 − q) / 2 from seller to buyer, where B is the buyer's valuation and q the probability of delivery, and total surplus does not move at all. Redenominating the contract, by itself, creates nothing. It only decides who holds the risk.

So where did the higher delivery rate come from? Not from the price. From the stopping rule. Under occupancy pricing the buyer decides when to give up, and it faces a marginal cost of p, the marked-up price rather than the resource's true cost r. So it quits while continuing is still worth doing. Under completion pricing the seller holds that decision and faces exactly r. The continuation ceiling is always weakly larger, for every parameter value, by an argument that reduces to (B − rH)² ≥ 0.

The efficiency does not come from paying for outcomes. It comes from who is allowed to stop.

That is worth more than the number we set out to measure. A contract paying on delivery but leaving abandonment with the buyer captures the whole transfer and none of the gain. It also explains the noise: the delivery-rate result held at every hazard because it is true at every parameter value, and the spend-per-job spread wobbled because it is a second-order allocation effect in a market with seven units in it.

The working draft is in docs/papers/unit-mismatch. It is not submitted anywhere and is not ready to be: the hazards are still uncalibrated, and until they are, the theorems are the only part carrying weight.

Run it yourself

The model, the population, and the tests are in internal/labs. The sweep is not optional in the runner. Printing a single point estimate from this thing would be misleading, so it always emits the curve.

  • go run ./cmd/dev/labs: the headline and the full hazard curve
  • go run ./cmd/dev/labs -hazard-mult 0: the estimation floor, with reclaim disabled
  • go test ./internal/labs/...: including the zero-hazard invariant

The numbers in this note are interpolated from the same generated report the Labs page renders, and a test fails if that report drifts from the code that produced it. If we change the model, this note changes with it.

This one has a result we did not want. If the mechanism is wrong, or right for a reason we missed, we want to hear it.

nodus.infrastructure@gmail.com
Nodus Labs