Skip to content

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_type format: {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.
  • purpose references entries in consent-purposes.yaml. Ingest drops events without valid consent token covering this purpose.
  • retention_days — how long the raw event lives in pulse_runtime.events before partition drop. Aggregated metrics in pulse_runtime.feature_store persist 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_typepurposeretentionsampledescription
app.install_completedops365 d100%First successful key generation; emitted once per identity. Populates immutable subject.installed_at dimension.
app.startupanalytics.usage90 d100%Each app launch (cold or warm).
app.tier_changedops1825 d100%Billing-side; subscription state change. source=billing.

Onboarding

event_typepurposeretentionsampledescription
app.onboarding_step_completedanalytics.usage365 d100%One per completed step in onboarding flow.
app.onboarding_finishedanalytics.usage365 d100%Terminal event per (subject, flow_id).
event_typepurposeretentionsampledescription
app.banner_shownanalytics.usage180 d100%Banner actually rendered on screen.
app.banner_dismissedanalytics.usage180 d100%Closed (with dismiss_reason).
app.banner_clickedanalytics.usage180 d100%Primary CTA clicked.

Email engagement

event_typepurposeretentionsampledescription
app.email_deliveredmarketing.email365 d100%Provider webhook. source=central.
app.email_openedmarketing.email_engagement_tracking90 d100%Pixel-based; requires separate opt-in.
app.email_clickedmarketing.email_engagement_tracking90 d100%Link click; link_id is hashed.
app.email_bouncedops730 d100%Hard/soft/complaint.
app.email_unsubscribedops2555 d100%Mirrors consent revoke atomically.

Pairing flow

event_typepurposeretentionsampledescription
app.pairing_initiatedanalytics.usage180 d100%Multi-device pairing start.
app.pairing_completedanalytics.usage365 d100%Successful device pairing.
app.pairing_failedops90 d100%With failure_reason + stage.

Identity flow

event_typepurposeretentionsampledescription
app.identity_createdops1825 d100%First key generation per identity.
app.identity_importedops1825 d100%Successful recovery (mnemonic / Shamir / paired device / vault).
app.identity_import_failedops365 d100%Recovery failure with reason.

Errors & runtime

event_typepurposeretentionsampledescription
app.error_occurredops90 d50% randomRecoverable error with category + severity.
app.crashedops365 d100%Emitted on next startup after detected crash. No stack trace.
app.network_state_changedops30 d20% stickyOnline/offline transitions.
event_typepurposeretentionsampledescription
app.consent_changedops2555 d100%Mirrors consent_grants append; ops-purpose for regulatory evidence.
app.permission_changedops365 d100%OS-level permissions (notifications, location, …).

Feature usage (generic)

event_typepurposeretentionsampledescription
app.feature_usedanalytics.usage180 d10% stickyGeneric feature invocation; feature_id is namespaced.

Category: billing — Billing system events

source=billing only. Emitted by Directus backend after billing state change confirmed.

event_typepurposeretentionsampledescription
billing.payment_receivedops2555 d100%Tax/audit requirement: ~7 years.
billing.refund_issuedops2555 d100%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_typepurposeretentionsampledescription
pulse_internal.rule_evaluatedmeta180 d100%Per-rule evaluation (fired or not).
pulse_internal.action_dispatchedmeta180 d100%Action dispatched to target.
pulse_internal.decision_suppressedmeta180 d100%Rule fired but action blocked (consent, rate-limit, guardrail).
pulse_internal.client_event_droppedmeta90 d100%Client SDK dropped event locally.

Bootstrap & federation

event_typepurposeretentionsampledescription
pulse_internal.contract_loadedmeta365 d100%Active contract content-hash at service startup.
pulse_internal.federation_pointer_receivedmeta180 d100%DHT channel pointer update from peer.

Compliance & ops

event_typepurposeretentionsampledescription
pulse_internal.gdpr_job_completedmeta1825 d100%GDPR worker terminal state.
pulse_internal.rate_limit_hitmeta90 d50% randomGranular rate-limit observability.

Notes for rule writers

  • subject.features.<metric>@v<n> references — see semantic-layer/v0.1.0.yaml.
  • For DSL applies_when clauses, 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 with meta_only: true.

Notes for dashboard authors

  • Daily/monthly aggregates: query pulse_runtime.events with date partition pruning.
  • Real-time counters: prefer pulse_runtime.feature_store for per-subject metrics; pulse_runtime.rule_stats for rule-level stats.
  • Cohort sizes: query pulse_curated.segments.definition resolved against feature_store.

Notes for new event proposals

To add a new event:

  1. Add entry to telemetry/{next_version}.yaml with added_in_version.
  2. Add golden example to test-corpus/events/valid/{event}.json.
  3. If derived metric is needed — add to semantic-layer/{next_version}.yaml.
  4. Run python3 validate.py until green.
  5. Update this overview.