Skip to main content
Every instrument in basset menu, and on its own page in this section, carries the same handful of fields below its Reveals list. Reveals says what a reading contains. The fields below say how it arrives — which is what decides whether you read one reading or a hundred, and whether it shows up the moment you ask or only when something happens.

Delivery

The mechanical shape a reading is produced by. fault instruments are triggered by one of three kinds: hang, termination, or memoryPressure. Today only runtime.threadSnapshot is fault-delivered — it fires when concurrency.mainThreadHang crosses its threshold or memory.pressure crosses into critical, and shares a faultId with the reading that triggered it.

Cadence

The rhythm within that delivery shape. Every interval instrument shares one construct on the device — a timer that fires on a fixed period and hands the window’s own instrument a chance to report. Whether that instrument then always reports (even an empty window) or only when there’s something to say is a choice each instrument makes internally, not a distinction this catalog tracks — both read as interval here, since the wire shape and the timing are identical either way. Delivery and cadence are independent. stream instruments are usually onChange or interval — but camera.device.inventory is stream, once: it observes for changes the same way the rest of the camera domain does, and simply never sees one during an ordinary run, since the hardware a phone exposes doesn’t change while the app is open. basset menu and each instrument’s own page print delivery and cadence together, as one field: stream, interval.

Mechanism

What the instrument hooks to produce a reading. This names what triggers a reading, not just how its values are fetched once triggered. network.session.configuration reads a URLSessionConfiguration’s properties directly, but it only learns a session exists by riding the same swizzled factory network.urlSession.taskMetrics installs — so it’s swizzle, not statusRead. statusRead is reserved for an instrument with nothing watching at all: once delivery, or a stream instrument like camera.device.inventory whose only “watching” is the dispatch shape itself, never an installed hook.

Overhead

A coarse cost rating, from negligible to high. Instruments in this catalog today run negligible, low, or medium — nothing currently ships at high.

Requires

The floor an instrument needs to run: a minimum iOS version, whether it needs real hardware, and the earliest basset SDK release that shipped it. An instrument that reads camera or Bluetooth state, for example, reports nothing useful in a simulator and says so here. Most of the catalog has shipped since 0.1.1, the first tagged release — an instrument added later carries the version it arrived in, so integrating against an older pinned SDK tells you up front which instruments aren’t there yet, rather than a request that silently activates nothing.

Config

Most instruments take no configuration — activating one by name is enough. The few that expose a tuning knob list it here, as a key, a type, and a default. Set one on activation with name:key=value,...:
An instrument with no config fields listed accepts no :key=value at all — sending one is refused rather than silently ignored. Other instruments that answer an adjacent question — read together when one alone doesn’t explain what happened.

Describes

Almost every instrument describes the run that’s capturing it right now. A few describe a run that already ended — this field says which, so a reading about a crash three launches ago isn’t mistaken for one about the current session.