Add identity tags
By default, Trove tags every signal with its source harness
(harness.id, harness.name) but not with who produced it. Identity
tagging adds user.name and user.email as resource attributes on every
span, metric, and log Trove forwards, so your backend can group activity
by person — which turns “spend by tool” into “spend by person and tool,”
and makes dead-seat detection possible.
These are resource attributes: set once per machine, attached to every signal at the source. You don’t tag individual events — Trove stamps the whole stream.
Set your identity
Section titled “Set your identity”-
Open Trove and go to the Settings tab.
-
Enter your name in the
user.namefield and your email in theuser.emailfield. Use the same email your license roster uses, so a person’s activity in Trove lines up with the seat they hold. -
Save. Trove writes the values to the single versioned
state.json, regenerates the collector config so the new resource attributes are applied, and reloads (a brief blip). From the next batch onward, every signal carries your identity.
What the tags look like at your backend
Section titled “What the tags look like at your backend”Once set, every signal Trove forwards carries the full resource-attribute set:
service.name = <harness service name>harness.id = claude-codeharness.name = Claude Codeuser.name = Ada Lovelaceuser.email = ada@example.comtrove.source = troveBecause identity is a resource attribute, it’s available on Tier A
metrics, Tier B native metrics, traces, and logs alike — so you can group
any of them by user.email in your backend.
What this unlocks
Section titled “What this unlocks”- Per-user dashboards. Group
trove.harness.events,trove.harness.tokens, ortrove.harness.cost.usdbyuser.emailto see who’s doing what, with which tool. - Team rollups across mixed harnesses. Since
user.emailis consistent regardless of which harness emitted, one panel can total a person’s activity across Claude Code, Cursor, Copilot CLI, and the rest. - Dead-seat detection. Comparing the set of active
user.emailvalues against your license roster is exactly how you find paid seats with zero activity. See Normalize costs and find dead seats.