Traces

Every answer carries the record of how it was decided: which sources were considered, what each one scored, which attempts ran, and why one won.

A number without its reasoning is a number you have to take on faith, which is the position your agent was in before Metera existed. The trace is what makes the verification block checkable rather than merely asserted. It is written on every call, including the ones that return nothing.

What is in one

The candidate set: every source the engine considered for this type, and the score each held at that moment. Scores move continuously, so the trace captures the ranking as it was rather than as it is now.

The attempts: which sources were actually called, what each returned, how long it took, and the verdict on each response. When a source fails verification mid-request and the engine swaps to another, both appear. The caller saw one answer and slightly more latency; the trace shows the failure that was absorbed.

The checks: which ran, which passed, and which could not be run at all. Those three states are kept distinct. A check that could not run is not a check that passed, and collapsing the two is how a system starts reporting confidence it did not earn.

The outcome: the level, the reason for it in the engine's own words, the independence figure behind a consensus claim, the source that answered, and the credits charged.

The anchor block

When an answer was anchored, the trace carries the reference itself rather than the fact of it: which oracle answered, the feed address, the value it held, the timestamp of the round, how old that round was in seconds, and both limits that were applied, the maximum round age and the divergence tolerance.

It also records whether the anchor was independent of the source it agreed with, and says so in a sentence rather than a flag. If the primary reference was unreachable and a fallback answered instead, the substitution is on the record with the reason the first one failed. A fallback that leaves no trace is indistinguishable from a primary that worked.

Reading one

Every delivery returns a traceId. Pass it to get_trace and the whole record comes back.

get_trace({ traceId: "tr_6avvhd" })

It is free to call. Reading the trace of a call you have already paid for is auditing your own spending, and charging for that would be charging twice for one delivery.

You can only read traces from your own calls. An id belonging to someone else and an id that never existed return exactly the same thing, so the endpoint cannot be used to discover which ids are real.

Refusals have traces too

A refusal is as auditable as a delivery: it records what was considered, what each source scored, and why none of it qualified. A system that only explains itself when it succeeds is explaining the easy half, and the half that matters when something goes wrong is the other one.

What a trace is for

Three things, in practice. Debugging, when an agent did something you did not expect and you need to know what it was told. Cost, because the trace shows which source was paid and what the fan-out was. And accountability, when a decision has to be explained later to someone who was not there.

That third use has a limit worth stating: a trace is evidence to you and an assertion to anyone else, because we are the ones storing it. Making a record that stands up to a third party is a different problem, and it is not solved yet.