How Monokulo is tested
Monokulo handles other people’s money, so it gets tested hard. Every change runs more than 2,600 automatic tests. Every night, two kinds of robot tester invent thousands of strange situations and check that no payment goes missing. This page rebuilds itself from those runs. Open any section to see the details.
6b1dcda on 16 Oct 2026·Nightly properties 17 Oct 2026·Fuzzing 16 Oct 2026·Live network 16 Oct 2026Fuzzing tests
A fuzzer throws strange inputs at the code, keeps the ones that reach code it hasn’t seen before, and mutates those to go further. It isn’t only looking for crashes. Every target is wrapped in checks: the two big ones, portfolio and history, play a whole run of payments through the real engine and compare every balance with the money model, and the smaller ones each check one specific rule. If any check fails, the fuzzer counts it as a crash and saves the input that caused it.
- Targets
- 9 passed
- Executions
- 263 M
- Corpus inputs
- 36,137
- New last night
- 937
| Target | Time | Executions | Corpus | New | Code edges |
|---|---|---|---|---|---|
| portfolioPlays out payments to several wallets at once and checks every wallet’s money against the model | 17 min | 3,021 | 1,340 | 167 | 21,408 +110 |
| historyPlays out whole chain histories through the real scanner and database and checks the money against the model | 17 min | 5,674 | 2,535 | 74 | 16,276 +26 |
| inputsFeeds junk text to the CPU-list setting and checks the result is sorted, has no repeats, and reads back the same | 7 min | 1,496,003 | 25,113 | 532 | 6,454 +0 |
| mempoolChecks the cache of unconfirmed payments: who owns each entry, what gets thrown out, and that it stays within its memory budget | 7 min | 81,812 | 4,543 | 144 | 2,445 +2 |
| notificationsChecks the engine is woken when there’s work and never waits longer than its time limits | 12 min | 3,165,165 | 1,251 | 12 | 1,115 +0 |
| statusChecks each order’s status (paid, underpaid, expired and so on) follows correctly from the payments seen | 8 min | 5,487,467 | 1,021 | 8 | 357 +0 |
| schedulerChecks scan scheduling: retries, waits and node time-outs all stay within their bounds | 8 min | 15,508,042 | 71 | 0 | 142 +0 |
| queueChecks work handed to the engine’s workers is dispatched correctly, even when queues fill up or close | 12 min | 46,130,400 | 254 | 0 | 111 +0 |
| resourcesChecks the scan budgets worked out from network speed stay inside their limits | 7 min | 191,095,245 | 9 | 0 | 62 +0 |
What the inputs reached
The targets that play out histories count the situations they land in, like the property tests. Open one to see last night’s.
portfolio3,021histories
Chain events generated
Each history is a random list of these steps. Sometimes a step can’t happen (there’s no waiting payment to drop, say), so it’s skipped. At the end the model works out what every wallet should have, and the engine has to match.
449 skipped “mine” steps had nothing to mine and extended the chain with an empty block instead.
Faults injected
Things broken on purpose in the middle of a history. After each one the engine has to report the problem, keep every balance right, and carry on.
Money rules checked
Results the model insists on. One mismatch fails the whole run.
Setups
How each history started: how many wallets and transactions, which way of scanning, and whether it used real recorded mainnet transactions.