You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
The opaque context.operation_id correlates one recovery attempt across rows. The values are aggregate/typed and intentionally omit raw account IDs, group IDs, event IDs, relay URLs, credentials, and payload data. Group-scoped rows use the audit schema's existing privacy-safe group_ref projection rather than adding a raw group identifier.
Goggles currently preserves unknown kinds in raw evidence, but its copied v2 schema, ingest normalization, fixtures, and agent-state export tests do not explicitly cover these lifecycle rows or prove that every field survives export.
Add ingest fixtures/tests for all five lifecycle kinds, including context.operation_id, applicable top-level group_ref, and every kind-specific field listed above.
Prove the rows ingest as valid and the agent-state export preserves every field without exposing additional identifying data.
Normalize/persist fields only where Goggles queries need them; do not duplicate raw kind/context evidence without a concrete query/export need.
Keep the fixture and schema change compatible with existing v2 uploads.
Dependency
The wire shape is pinned above from marmot-protocol/mdk#1386. MDK #1183 must remain open until this Goggles ingest/export coverage lands; PR #1386 should not carry a closing reference while this dependency is outstanding.
Context
MDK issue marmot-protocol/mdk#1183 and draft PR marmot-protocol/mdk#1386 define explicit
marmot-forensics-audit/v2evidence for epoch-stall recovery. The final producer wire contract is:epoch_stall_backfill_armed(group-scoped): top-levelgroup_ref;context.operation_id; kind fieldsstalled_epoch,threshold, optionaltrigger(undecryptable_thresholdorresource_refusal).epoch_stall_backfill_started(account-scoped):context.operation_id; kind fieldsseam(startup,receive,explicit_catch_up, ormaintenance),replay_scope(account_full_history), andretry_ordinal.epoch_stall_backfill_deferred(account-scoped):context.operation_id; kind fieldsreason(group_epoch_unavailable) andretry_ordinal.epoch_stall_backfill_completed(group-scoped): top-levelgroup_ref;context.operation_id; kind fieldsretry_ordinal,duration_ms,activation_outcome(succeeded),deliveries,local_epoch_before,local_epoch_after, andgroup_advanced.epoch_stall_backfill_failed(group-scoped): top-levelgroup_ref;context.operation_id; kind fieldsretry_ordinal,duration_ms,activation_outcome(succeededorfailed), optional privacy-safeerror_kind,deliveries,local_epoch_before,local_epoch_after, andgroup_advanced.The opaque
context.operation_idcorrelates one recovery attempt across rows. The values are aggregate/typed and intentionally omit raw account IDs, group IDs, event IDs, relay URLs, credentials, and payload data. Group-scoped rows use the audit schema's existing privacy-safegroup_refprojection rather than adding a raw group identifier.Goggles currently preserves unknown kinds in raw evidence, but its copied v2 schema, ingest normalization, fixtures, and agent-state export tests do not explicitly cover these lifecycle rows or prove that every field survives export.
Acceptance criteria
docs/schemas/audit-log-event.v2.schema.jsonexactly with the producer schema from fix(marmot-app): audit epoch backfill lifecycle mdk#1386 after its lifecycle review fixes settle.context.operation_id, applicable top-levelgroup_ref, and every kind-specific field listed above.Dependency
The wire shape is pinned above from marmot-protocol/mdk#1386. MDK #1183 must remain open until this Goggles ingest/export coverage lands; PR #1386 should not carry a closing reference while this dependency is outstanding.