Pulse Event Types — M0 Overview
Generated overview of all event types declared in
telemetry/v0.1.0.yaml. Use this as a reference when writing rules, dashboards, or new events. Single source of truth — the YAML; this table is authoritative only at the moment of its last update.Synced with:
telemetry/v0.1.0.yaml(App-focused). Total: 35 event types across 3 categories.
Conventions
event_typeformat:{category}.{name}. Reserved category:pulse_internal(never leaves central).- Base fields (
subject_id,event_type,schema_hash,emitted_at,ingested_at,source,consent_token) are implicit; not declared per-event. purposereferences entries inconsent-purposes.yaml. Ingest drops events without valid consent token covering this purpose.retention_days— how long the raw event lives inpulse_runtime.eventsbefore partition drop. Aggregated metrics inpulse_runtime.feature_storepersist longer.sample_rate< 1.0 indicates client-side sampling (see spec §6.9). Metric derivations must compensate.
Category: app — Kontinuum App lifecycle + interactions
Lifecycle
| event_type | purpose | retention | sample | description |
|---|---|---|---|---|
app.install_completed | ops | 365 d | 100% | First successful key generation; emitted once per identity. Populates immutable subject.installed_at dimension. |
app.startup | analytics.usage | 90 d | 100% | Each app launch (cold or warm). |
app.tier_changed | ops | 1825 d | 100% | Billing-side; subscription state change. source=billing. |
Onboarding
| event_type | purpose | retention | sample | description |
|---|---|---|---|---|
app.onboarding_step_completed | analytics.usage | 365 d | 100% | One per completed step in onboarding flow. |
app.onboarding_finished | analytics.usage | 365 d | 100% | Terminal event per (subject, flow_id). |
Banner interactions
| event_type | purpose | retention | sample | description |
|---|---|---|---|---|
app.banner_shown | analytics.usage | 180 d | 100% | Banner actually rendered on screen. |
app.banner_dismissed | analytics.usage | 180 d | 100% | Closed (with dismiss_reason). |
app.banner_clicked | analytics.usage | 180 d | 100% | Primary CTA clicked. |
Email engagement
| event_type | purpose | retention | sample | description |
|---|---|---|---|---|
app.email_delivered | marketing.email | 365 d | 100% | Provider webhook. source=central. |
app.email_opened | marketing.email_engagement_tracking | 90 d | 100% | Pixel-based; requires separate opt-in. |
app.email_clicked | marketing.email_engagement_tracking | 90 d | 100% | Link click; link_id is hashed. |
app.email_bounced | ops | 730 d | 100% | Hard/soft/complaint. |
app.email_unsubscribed | ops | 2555 d | 100% | Mirrors consent revoke atomically. |
Pairing flow
| event_type | purpose | retention | sample | description |
|---|---|---|---|---|
app.pairing_initiated | analytics.usage | 180 d | 100% | Multi-device pairing start. |
app.pairing_completed | analytics.usage | 365 d | 100% | Successful device pairing. |
app.pairing_failed | ops | 90 d | 100% | With failure_reason + stage. |
Identity flow
| event_type | purpose | retention | sample | description |
|---|---|---|---|---|
app.identity_created | ops | 1825 d | 100% | First key generation per identity. |
app.identity_imported | ops | 1825 d | 100% | Successful recovery (mnemonic / Shamir / paired device / vault). |
app.identity_import_failed | ops | 365 d | 100% | Recovery failure with reason. |
Errors & runtime
| event_type | purpose | retention | sample | description |
|---|---|---|---|---|
app.error_occurred | ops | 90 d | 50% random | Recoverable error with category + severity. |
app.crashed | ops | 365 d | 100% | Emitted on next startup after detected crash. No stack trace. |
app.network_state_changed | ops | 30 d | 20% sticky | Online/offline transitions. |
Consent & permissions
| event_type | purpose | retention | sample | description |
|---|---|---|---|---|
app.consent_changed | ops | 2555 d | 100% | Mirrors consent_grants append; ops-purpose for regulatory evidence. |
app.permission_changed | ops | 365 d | 100% | OS-level permissions (notifications, location, …). |
Feature usage (generic)
| event_type | purpose | retention | sample | description |
|---|---|---|---|---|
app.feature_used | analytics.usage | 180 d | 10% sticky | Generic feature invocation; feature_id is namespaced. |
Category: billing — Billing system events
source=billing only. Emitted by Directus backend after billing state change confirmed.
| event_type | purpose | retention | sample | description |
|---|---|---|---|---|
billing.payment_received | ops | 2555 d | 100% | Tax/audit requirement: ~7 years. |
billing.refund_issued | ops | 2555 d | 100% | Tax/audit requirement: ~7 years. |
Category: pulse_internal — Self-телеметрия (never leaves central)
source=central only. All events use purpose meta. Not visible to GDPR access bundle (system telemetry).
Decisioning
| event_type | purpose | retention | sample | description |
|---|---|---|---|---|
pulse_internal.rule_evaluated | meta | 180 d | 100% | Per-rule evaluation (fired or not). |
pulse_internal.action_dispatched | meta | 180 d | 100% | Action dispatched to target. |
pulse_internal.decision_suppressed | meta | 180 d | 100% | Rule fired but action blocked (consent, rate-limit, guardrail). |
pulse_internal.client_event_dropped | meta | 90 d | 100% | Client SDK dropped event locally. |
Bootstrap & federation
| event_type | purpose | retention | sample | description |
|---|---|---|---|---|
pulse_internal.contract_loaded | meta | 365 d | 100% | Active contract content-hash at service startup. |
pulse_internal.federation_pointer_received | meta | 180 d | 100% | DHT channel pointer update from peer. |
Compliance & ops
| event_type | purpose | retention | sample | description |
|---|---|---|---|---|
pulse_internal.gdpr_job_completed | meta | 1825 d | 100% | GDPR worker terminal state. |
pulse_internal.rate_limit_hit | meta | 90 d | 50% random | Granular rate-limit observability. |
Notes for rule writers
subject.features.<metric>@v<n>references — seesemantic-layer/v0.1.0.yaml.- For DSL
applies_whenclauses, prefer derived metrics over raw events — events are append-only and don't reflect erasure, while metrics respect consent state. - For per-event triggers (decisioning on emit), use
on_event: <event_type>syntax (DSL grammar M1+). pulse_internal.*events are NOT available to user rules — only meta-rules withmeta_only: true.
Notes for dashboard authors
- Daily/monthly aggregates: query
pulse_runtime.eventswith date partition pruning. - Real-time counters: prefer
pulse_runtime.feature_storefor per-subject metrics;pulse_runtime.rule_statsfor rule-level stats. - Cohort sizes: query
pulse_curated.segments.definitionresolved against feature_store.
Notes for new event proposals
To add a new event:
- Add entry to
telemetry/{next_version}.yamlwithadded_in_version. - Add golden example to
test-corpus/events/valid/{event}.json. - If derived metric is needed — add to
semantic-layer/{next_version}.yaml. - Run
python3 validate.pyuntil green. - Update this overview.