ResearchEssay
Why every paid button carries its price
An estimate you only see after you press is one you never agreed to. How the desk prices a button, why it rounds up, and why the ceiling refuses instead of warning.
- Finding
- The chip rounds up to the cent. Past the ceiling, nothing is sent.
- Published
The claim
A paid action should say what it costs before you press it, on the thing you press. A price you find in a ledger afterwards is a receipt, not a decision. A ceiling that warns and still spends is not a ceiling.
The short answer
In Kiju, every button that spends carries its estimate in a chip, rounded up to the cent. The estimate is computed from the same parameters the request will leave with. When a model publishes no readable price, its button does not spend. When the estimate would take the project past its budget, the button refuses and says why. And once a request has gone, its cost stays counted, whether the take is kept, discarded or left uncertain.
The instrument
Instrument
The ceiling refuses
Each button replays a take the studio paid for, at its recorded cost. Set a sample ceiling and press. This page spends nothing and sends nothing.
Spent
$0.00
Sample ceiling
Left under the ceiling $2.00
Recorded takes — press one to replay its cost
Takes replayed in this sample
None yet. A take you replay lands here, with its recorded cost.
Press a few takes. When the next one would pass the ceiling, its button stops working and says why — in words, not only in grey. Discard a take: the spent total does not move, because the provider was paid when the take landed. Lower the ceiling under what is already spent: every paid button refuses.
The rules, as the desk runs them
These are the rules of Kiju’s generation runner, in the order a press meets them:
- One set of parameters. The runner settles the request once; the estimate, the record and the request all read that one object. The price shown is the price of what leaves.
- No estimate, no spending. A model without a readable price is blocked with a sentence: “publishes no readable price. Kiju does not spend without an estimate.”
- The budget refuses. If what the project has spent plus this estimate would pass its budget, the button is blocked before anything is sent: “Over the project budget … Raise it on the Channel page.”
- A paid request is sent once. The provider’s job id is saved the moment it comes back. After a restart the desk resumes tracking that job. A stopped poll is never a reason to send it again.
- A lost answer is uncertain, not failed. When the desk cannot tell whether the provider billed, the take is marked uncertain, its estimate stays counted, and nothing retries it silently.
- An agent run has a ceiling of its own. A writer’s or a director’s run reserves the most it can cost in the project’s
journal.jsonlbefore sending, and its button says “up to”.
The chip is the last step: upToCents rounds the estimate up, never down, so a button can say more than the estimate
but never less.
An estimate is not an invoice
The engine of Tin Kaiju, the studio behind Kiju — calling the same providers Kiju calls — recorded an estimate before thirteen of the fourteen takes of the seven-model run, and the provider’s bill after (the cached Hailuo take has no estimate beside its bill). Four models agree to the last digit. Wan 3.0 billed less than estimated: $0.51 against $0.60. Both Seedance models billed a little more: a chip rounded up from the estimate would still have said $1.39 for a take billed $1.3969813, under the bill.
| Model | Estimate before | Billed after | Difference | Chip from the estimate |
|---|---|---|---|---|
| Hailuo 3 Max | $0.48 | $0.48 | none | $0.48 covers the bill |
| Kling 3.0 Pro | $0.672 | $0.672 | none | $0.68 covers the bill |
| Wan 3.0 | $0.60 | $0.51 | −$0.09 | $0.60 covers the bill |
| Grok Imagine Video 1.5 | $0.85 | $0.85 | none | $0.85 covers the bill |
| Seedance 2.0 | $0.9072 | $0.9135 | +$0.0063 | $0.91 under the bill |
| FLUX.3 Video | $1.02 | $1.02 | none | $1.02 covers the bill |
| Seedance 2.5 | $1.386 | $1.3969813 | +$0.0109813 | $1.39 under the bill |
The Seedance gap is a missing frame, and it has its own study. The lesson for the button is narrower: round up, count what the provider counts, and keep the provider’s own figure when it gives one. The desk records the provider’s cost when it is reported and the estimate otherwise, and its ledger says which is which.
Limits
- The buttons replay recorded costs. A new take with the same settings can cost a little more or less, as the table above shows.
- The ceiling here is a sample you set. It is not a Kiju price: there is none.
- The desk compares the estimate with the budget, before sending. A provider that bills more than its estimate can carry the spend slightly past the budget: the ceiling bounds what is sent, not what a provider decides to bill.
- Amounts are in US dollars because the providers bill in dollars. Only the way they are written changes with the language.
What it means for Kiju
- Every paid button shows its chip. A free action — a local model — carries none.
- The budget is a number in the channel’s own
kiju.json, set on the Channel page. - The ledger counts every take that was not refused — kept, discarded or uncertain — and every agent run. Its total is what was paid, not what was liked.
- To try it on the real desk, follow the tutorial The price is on the button.
Sources
- Kiju’s engine:
core/src/runner.ts(the rules above),core/src/models.ts(upToCents),core/src/project.ts(the ledger). - The seven-model run: the studio’s records under
.studio/store/shot/and its lab log of 2026-09-28. See Seven video models, one anime frame. - The still in the instrument: the studio’s record
marque/mascotte/cartoon.json. See One character, five styles.