m2-market/contracts/telemetry.md

62 lines
2 KiB
Markdown

# Marketplace telemetry contract v1
All shown/opened/installed/dismissed marketplace telemetry uses one envelope:
`m2.market.telemetry.v1`.
`m2.market.evidence.v1` is reserved for S6 job evidence records only. Do not write install,
proposal, Store, Scout, or CLI telemetry with the evidence schema.
## Envelope
```json
{
"schema_version": "m2.market.telemetry.v1",
"event_id": "evt_01j2telemetry",
"event_type": "market.install.succeeded",
"occurred_at": "2026-07-02T00:00:00Z",
"tenant_id": "m2",
"operator_id": "op_chris",
"agent_id": "chris-m2o",
"listing_id": "lst_mm-pdf-report",
"solution_id": "sol_mm-pdf-report",
"solution_version": "1.0.0",
"proposal_id": "prop_01j2abc",
"source": "cli",
"content_hash": "sha256:0000000000000000000000000000000000000000000000000000000000000000",
"payload": {}
}
```
Required fields: `schema_version`, `event_id`, `event_type`, `occurred_at`, `tenant_id`,
`source`, and at least one of `listing_id`, `solution_id`, or `proposal_id`.
Telemetry must contain summaries and IDs only. No raw client data, secrets, transcript bodies, or
private job artifacts.
## Event type registry
- `market.listing.shown`
- `market.listing.opened`
- `market.proposal.generated`
- `market.proposal.shown`
- `market.proposal.opened`
- `market.proposal.accepted`
- `market.proposal.dismissed`
- `market.install.started`
- `market.install.succeeded`
- `market.install.failed`
- `market.install.refunded`
- `market.uninstall.succeeded`
- `market.upgrade.succeeded`
- `market.invoke.succeeded`
- `market.invoke.failed`
Indexers may fold telemetry into `listing.stats.installs`, `listing.stats.proposals_shown`, and
`listing.stats.proposals_accepted`. Self-purchases and self-generated proposal loops are excluded
from quality statistics.
## Job evidence reservation
`m2.market.evidence.v1` records are S6 job evidence records and carry `evidence_id`, `job_id`,
`wanted`, `tools`, `contributors`, `metering`, `resources`, `outcome`, `reusable_verdict`,
`scrub_status`, and `content_hash`. They are not a general event envelope.