Docs/Protocol/The Scheduler
Memos and verification
Where each memo is served, and how to check its hash against the registry.
- Format
- kyzen-memo/1
- Hash
- keccak-256
- Record
- Weight registry
#Where memos live
Each rotation’s memo is a JSON document in the kyzen-memo/1 format. It is served read-only, byte for byte, at docs.kyzen.network/memos/<n>.json, where n is the rotation’s number in the registry, from 0. Testnet memos sit under /memos/testnet/.
The weight registry records each rotation for good. A memo is served before the registry records it: publishing stops unless the link serves the memo’s exact bytes.
| Field | Holds |
|---|---|
weights | Five weights in basis points: design, memory, fab, equipment, power |
memoHash | The keccak-256 hash of the memo’s exact bytes |
memoURI | The memo’s link |
executesAt | When the rotation executes, in unix seconds |
publishedAt | When the registry recorded it |
| Field | Holds |
|---|---|
schema | kyzen-memo/1 |
rotation | The registry’s number for the rotation, from 0; posts and these docs count from 1 |
month | The month the scorecard reads, YYYY-MM |
executesAt | 14:30 UTC on the execution date, in unix seconds |
bottleneck | The stage the rulebook names |
bottleneckLabel | The constraint the memo names, such as HBM |
weightsBps | The five weights, in basis points |
rulebook | The rulebook version, v1 |
scorecard | Whether it is a dry run, and every reading with its note and sources |
writer | rulebook, or model:<id> for a text a model wrote |
text | The memo itself, in paragraphs and lists |
The bytes are canonical: the fields in this order, the weights in the registry’s order, the readings in the input table’s order, two-space indentation, one final newline, UTF-8. The same memo always gives the same bytes, and so the same hash.
On mainnet the owner wallet records each rotation. Before it does, the memo passes the server’s own checks: its canonical form, the copy rules, rulebook v1 run again on its own scorecard (Rulebook v1), the registry’s caps and dates, and its link. A dry-run memo is refused.
The weight registry is 0x9960eb·227d09.
#Check a memo's hash
The Scheduler page shows a memo, and the dashboard its bottleneck, only when the memo’s bytes hash to the registry’s memoHash. Anyone can make the same check.
- 01Read the rotationRead the weight registry on the explorer, or with the first commands below:
latest()for the newest rotation,rotation(n)for any other. NotememoHashandmemoURI. With no rotation recorded,latest()reverts withNoRotation. - 02Download the memoSave the file at
memoURIexactly as served. Any change, even a space or the final newline, changes the hash. - 03Hash its bytesHash the file’s bytes with keccak-256, with one of the commands below.
- 04CompareThe result equals
memoHash. A memo whose hash differs is not the memo the registry recorded.
cast call 0x9960eb28D2fb78A901E310dd2aB99Ba4ea227d09 "latest()((uint16[5],bytes32,string,uint64,uint64))" --rpc-url https://rpc.mainnet.chain.robinhood.com
cast call 0x9960eb28D2fb78A901E310dd2aB99Ba4ea227d09 "rotation(uint256)((uint16[5],bytes32,string,uint64,uint64))" <n> --rpc-url https://rpc.mainnet.chain.robinhood.comcurl -s https://docs.kyzen.network/memos/<n>.json -o memo.json
cast keccak "0x$(xxd -p memo.json | tr -d '\n')"The testnet dry run shows the whole check: the testnet registry’s rotation 0 (Rotation 1 in posts and these docs), a memo of test readings, and the hash both sides give.
cast call 0xd0f9B82095186Ec1E8568ECB8B7C85C8D77534A2 "rotation(uint256)((uint16[5],bytes32,string,uint64,uint64))" 0 --rpc-url https://rpc.testnet.chain.robinhood.com
# ([1548, 2903, 2065, 1548, 1936], 0xfaf30ce57c54e5dfe4fd3f58df73cfe200ab87d1adb40ddf114c5e0095b2e268, "https://docs.kyzen.network/memos/testnet/0.json", 1793629800 [1.793e9], 1791024111 [1.791e9])
curl -s https://docs.kyzen.network/memos/testnet/0.json -o memo.json
cast keccak "0x$(xxd -p memo.json | tr -d '\n')"
# 0xfaf30ce57c54e5dfe4fd3f58df73cfe200ab87d1adb40ddf114c5e0095b2e268