Skip to content

The audit log

The audit log records every change to Sift’s state: who or what made it, what it changed, and when. Use it to answer “who approved this threshold”, “why did this filter go back to shadow”, or “who has been trying to sign in”. Only an admin can read it, under the gear icon (Administration) › Audit log.

ColumnMeaning
WhenThe time of the change.
ActionWhat happened, as a dotted code such as filter.state.active.
ActorThe account that acted, or system when Sift acted on its own (a fall-back, a first Kindo key going live once its checks pass, an expired staged key). A failed sign-in with a username that does not exist, and any throttled sign-in, also show system; the username that was tried is stored with the row, but neither the console nor the API shows it.
TargetWhat was acted on: a type (filter, user, credential, recipe, webhook_endpoint, analysis_report, portfolio_scan) and its id.
(last column)Detail, on a row that has any, opens Before and After: the relevant fields before and after the change, including any reason or note a person wrote, and the request id.

The request id matches the request_id in Sift’s logs, so you can find the log lines of the request that made a change.

A row is recorded together with the change it describes: a change that succeeded always has its row, and a row never describes a change that did not happen.

What the rows never contain: passwords, the Kindo API key, webhook URLs, header values or secrets. They record that a key or secret changed and, where useful, its last four characters.

Rows are newest first, 50 at a time. Select Load older entries for the next page. The Target menu narrows the list to filter, user or credential, or shows everything.

Badges are colored to catch the eye: approvals stand out; rejected thresholds and stage changes, failed and throttled sign-ins, and moves to shadow or paused are marked as warnings.

The API can filter further, by any target type and by actor: GET /api/v1/admin/audit-log?target_type=webhook_endpoint&actor_id=<user id>. See API endpoints.

ActionWhen
filter.created, filter.version_createdA filter, or a new version of its spec, is saved.
filter.version_swapped, filter.version_discardedA waiting version is put in place, or dropped.
filter.state.<state>The filter moved to a state: filter.state.shadow, filter.state.active, filter.state.paused, filter.state.retired, and so on. A move Sift made on its own (drift, the trigger ceiling) has system as the actor and the cause in After.
filter.ceiling_breachedThe filter reached its trigger ceiling.
filter.delivery_stalled, filter.delivery_restoredEscalations stopped reaching the agent, and started again.
filter.budget_bound, filter.budget_releasedThe filter’s agent budget came to keep escalations back with some waiting, and later had room again. Written by system, once at each edge.
filter.queue_losing, filter.queue_recoveredThe budget’s held queue began losing escalations (aged out, or pushed out of a full queue), and an hour passed with none lost.
filter.warm_startSomeone asked for a warm start: After has the count, the gold set and the cost when priced. A training it queues at the floor is model.training_queued, by system, naming the warm start.
filter.loosened, filter.point_restoredSift moved the filter to its safer point on a drift alarm, and a person returned it to the approved point.
filter.paired, filter.agent_createdThe filter was connected to its agent, or Sift created the paired agent.
filter.cutover_acknowledgedSomeone confirmed the displaced agent is stopped.
filter.model_swapped, model.training_queuedA retrained model took over; training was started.
filter.recommendation_declinedSomeone declined a recommendation on Actions.
filter.verdict_check_switched, filter.verdict_check_paused, filter.verdict_check_resumed, filter.verdict_checkedThe verdict check was turned on or off, paused, resumed, or an item answered.
event.rescuedAn Always-escalate rule sent an event the filter would have filtered.
ActionWhen
approval.gold_set.approved, approval.gold_set.rejectedSomeone decided on a gold set.
approval.threshold_promotion.approved, approval.threshold_promotion.rejectedSomeone decided on a threshold. After holds the rationale.
approval.threshold_promotion.point_overriddenThe approval was at a frontier point other than the one the posture picked.
approval.threshold_promotion.withdrawnSift withdrew an approval, on a fall-back.
approval.threshold_promotion.reaffirmedSomeone chose Keep filtering on an alarm, so the filter went on filtering.
approval.threshold_promotion.carried_forward, approval.threshold_promotion.withdrawal_carried_forwardA new version kept the approval, or the withdrawal, of the one before.
approval.stage_change.approved, approval.stage_change.rejectedA grouping change in Shape delivery was decided. This is never a threshold approval.
alarm.acknowledgement_lapsedAn alarm acknowledgement stopped applying: the signal cleared, seven days passed, a different model or a gated change took over, or the filter fell back.
ActionWhen
gold_set.build_queued, gold_set.built, gold_set.build_failed, gold_set.createdA gold set build was started, finished or failed.
gold_set.item_labelledSomeone labelled a gold-set item.
labels.history_import_queued, labels.history_imported, labels.history_import_failed, labels.history_withdrawnLabel history was imported, or withdrawn.
analysis.requested, analysis.completed, analysis.failed, portfolio_scan.requested, portfolio_scan.finishedAn agent analysis or a scan of several agents.
ActionWhen
auth.login_succeeded, auth.logoutA sign-in or sign-out.
auth.login_failedA failed sign-in. After says why: unknown_username, bad_password or disabled.
auth.login_throttledA sign-in refused by the throttle, with the client address.
auth.password_changed, auth.password_change_failed, auth.password_change_throttledA password change, a wrong current password, or one refused by the throttle.
user.created, user.role_changed, user.disabled, user.enabledAn admin changed an account. The seeded admin’s creation has system as the actor.
ActionWhen
credential.staged, credential.pending_discardedA key was staged in the wizard, or discarded (by Cancel, or after an hour).
credential.created, credential.replacedA first key went live; a replacement went live. Before and After name both keys by label and last four characters.
credential.check_started, credential.check_finishedA connect, replace, Change model or Verify check.
credential.verified, credential.model_selectedThe tenant check recorded its result; a model was stored.
credential.deletedThe connection was removed with Disconnect.
ActionWhen
recipe.enabled, recipe.disabledAn admin turned a recipe on or off.
webhook.created, webhook.updated, webhook.deleted, webhook.secret_rotated, webhook.test_sentAn admin changed a notification endpoint.

Sift never deletes audit rows: there is no retention period, and neither the console nor the API can edit or remove them. A row keeps the actor’s username, so it still says who acted even if the account is later disabled.

The log is kept in Sift’s database. Back the database up to keep it; see Back up and restore.