Skip to content

The Mappings tab

Different harnesses emit telemetry in different shapes — different attribute names, different event names, different aggregation grains. The Mappings tab is where Trove reconciles all of that onto a single normalized schema: the five Tier A metrics. It’s a visual editor with a live preview, so you can see exactly how a raw harness signal becomes a cross-harness metric before you apply anything.

How a harness’s signals reach Tier A depends on how that harness is captured (see Harness coverage). The Mappings tab exposes both paths through the same editor surface:

Native-OTel harnesses (Claude Code, Codex, Antigravity CLI, Qwen Code, OpenCode) already emit their own metrics. A synthesis rule tells the collector to additively derive a Tier A metric from one of those native signals — for example, turning Claude Code’s claude_code.session.count into a trove.harness.events data point with event.kind=chat.turn, or copying claude_code.token.usage into trove.harness.tokens.

Synthesis is implemented as a collector overlay (metricstransform plus transform/harness-tag) injected on every reload, using action: insert — so the native Tier B metric still passes through untouched. You get the cross-harness view and the vendor-native drill-down, not one or the other.

Hook rules (watcher / best-effort harnesses)

Section titled “Hook rules (watcher / best-effort harnesses)”

Best-effort harnesses (Cline, Aider, GitHub Copilot CLI) don’t emit OTel natively, so there’s no native metric to synthesize from. A hook rule instead tells the watcher how to classify a raw event into Tier A. For example: each Aider or Copilot CLI wrapper invocation becomes one chat.turn event plus a duration histogram observation, and a non-zero exit becomes a trove.harness.errors data point; Cline’s watcher classifies each ui_messages.json entry by its message type into chat.turn / tool.call / file.edit.

The editor surface is the same for both — you’re configuring which raw signal maps to which Tier A metric and attributes, not writing a query language.

Every edit is previewable before it’s real:

  • Live preview simulates the output for a sample event, so you see the resulting Tier A data point as you tune a rule — not after you’ve shipped a silent mistake into your backend.
  • Full-diff view shows exactly what will change in the generated collector config before you hit Apply.
  • Validation at the boundary. Bad rules surface as errors at the IPC boundary when you apply, not as quietly dropped telemetry later.

Apply lives. Because mappings are evaluated by the collector itself, applying changes regenerates the config and triggers a reload — a brief collector blip, no app restart and no agent to wait on.

Each harness ships with a sensible default mapping baked into its adapter. The tab’s reset to defaults affordance wipes your customizations for a harness and restores the shipped rows — useful when an experiment goes sideways and you want a known-good starting point.

Beyond the five locked Tier A built-ins, you can extend the catalog with your own metric definitions — additional counters, gauges, or histograms. Custom metrics flow through unchanged (no synthesis step); your receiving backend’s dashboards interpret them.