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.
Two kinds of rules
Section titled “Two kinds of rules”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:
Synthesis rules (native-OTel harnesses)
Section titled “Synthesis rules (native-OTel harnesses)”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.
Live diff and preview
Section titled “Live diff and preview”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.
Reset to defaults
Section titled “Reset to defaults”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.
Custom metric catalog
Section titled “Custom metric catalog”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.