a browser probe pulled the explorer json on its own and compared it against what the page had rendered, cell by cell
that is how we found this
token_market was reading a field called holders
the explorer calls it holders_count
so that read came back undefined every single time, on every token, since the day the function was written
and undefined renders as a small dash, which is exactly what this site prints when a value could not be read
so the cell looked right
it looked like a value we honestly did not have, sitting politely in a column full of values we did have
nothing errored, nothing went red, the panel was fine
the explorer had the number the whole time
learned this one the hard way
fired eight requests at the same counters url on the explorer at once and got back 200, 200, 500, 500, 500, 500, 500, 500
waited a second, asked that same url three times slowly, 200 every time
nothing was broken, the server was telling us to calm down, and on this explorer it says that with a 500
so here a 500 earns a retry and a 404 does not, because a 404 is an answer, and retrying an answer just wastes everybody's time
token_activity stopped leaning on that one endpoint too, the token endpoint carries a holder count of its own, so when counters is refusing we still read holders from the other side and the transfer count comes back null with the reason written next to it
alchemy returns 429 to eth_chainId
eth_chainId does not read a block and does not touch state, it is the handshake, it asks a node which chain it thinks it is, and what comes back is monthly capacity limit exceeded
that is not rate limiting, you cannot wait it out, it stays that way until somebody pays the bill
and here is the part that took us longest to see
JSON RPC carries its errors inside the response body, and the body ships with HTTP 200
a node that is completely out of quota answers every method you send it with the same cheerful 200 and an error object sitting in the payload
check only the status and you have read nothing while believing you read something
which is the exact failure the agent upstairs was built to stop, one floor down, and it is why every read on the site prints the name of the machine that produced it
we asked it who the president of france is
one round, zero calls, and what came back was "I don't have any information about that from the tools available to me"
that reply is the whole product, so here is what is going on underneath it
you ask a question and it gets up to four rounds of tool calling to answer
the one i keep going back to is read_contract, because it asks an address whether it holds code at all before it believes anything the address says about itself, then reads name, symbol, decimals and supply by direct eth_call instead of trusting an index to have it right
every function is also a plain url you can hit yourself, /api/tool?name=chain_head and so on, no model anywhere near it, no key, nothing to prompt, costs nothing to call
if a function can only be reached by asking a language model nicely then it is a prompt wearing a tool's name
and when an answer comes back with nothing under it, no calls at all, the page paints a warning across the top of that answer louder than the answer is
ungrounded text still gets shown to you, it just never gets to look like a reading
ask any model how far along robinhood chain is right now and it will answer you
eight digits, no hesitation, made up
that is the mechanism doing the one thing it does, filling in the most plausible continuation, and a plausible block height is just a number with eight digits in it
the awkward part is it never gets better, robinhood chain is younger than the weights of every model that will ever be pointed at it and it stays that way forever, the weights are finished and the chain keeps going
Aocom is an agent that gets told this about itself before it is allowed to open its mouth
first thing in its system prompt is that it has never seen this chain, and that every fact it states has to come from a function call it made in that same request
it lives in a workspace laid out like a 3D application, functions down the left rail, viewport in the middle, inspector on the right, and along the bottom a timeline of every call the page has made since you loaded it
so when it tells you the head is at 47,248,352 with gas at 0.035 gwei, the call that read it is sitting right under the answer, 215 milliseconds old, naming the node that served it