
What Skene catches
Five ways an event write breaks. Skene flags each one on the PR before it merges.
Removed events
A coding agent refactors a checkout function and the insert that records the event goes with it.
- await supabase.from('events').insert({ name: 'checkout_completed', plan_tier: planId, value: amount })
router.push('/thanks')
Skene flags the missing write and names the event that used to land in the table.
Renamed columns
The agent tidies your payload. plan becomes plan_tier, or a key vanishes into a constant. The column the table expects no longer gets set.
await supabase.from('events').insert({
name: 'checkout_completed',
- plan: planId,
+ plan_tier: planId,
})
The table still has a plan column; nothing fills it anymore. Skene flags the rename and shows the old key vs. the new.
Moved events
The insert gets moved out of a conditional, into a different code path, or behind a feature flag. It still exists, but no longer runs under the same conditions.
- if (user.isFirstPurchase) {
- await supabase.from('events').insert({ name: 'first_purchase' })
- }
+ await supabase.from('events').insert({ name: 'first_purchase' }) // moved out of the guard
Skene tracks where in the control flow each write lives, so a moved insert shows up as a change even when the call itself looks intact.
Altered payloads
A column gets dropped, renamed, or its value silently changes type from string to number. Postgres rejects some of these and coerces others. Either way the data you wanted is gone.
await supabase.from('events').insert({
name: 'signup',
- referrer_id: id,
plan_tier: 'pro',
})
Skene compares each write against the schema. Dropped columns, type drift, and key renames all surface.
Conditional firing changes
The if-block guarding the write changes. The event still fires, just not for the same users. A retention metric quietly misses a slice.
- if (user.isActive && user.daysSinceSignup > 7) {
+ if (user.isActive) {
await supabase.from('events').insert({ name: 'week_one_active' })
}
The condition collapsed; the write now runs for users who should not be counted. Skene flags conditional changes that affect when an event lands, not just whether the write exists.
What is next
- Install Skene: pick a surface and try it
- What Skene reads: the Supabase writes Skene tracks
- Configuration: how to mark a change as accepted