
What Skene catches
Five ways instrumentation breaks. Using PostHog examples here, Skene flags each one on the PR before it merges.
Removed events
A coding agent refactors a checkout function and the posthog.capture call goes with it.
- posthog.capture('checkout_completed', { plan: planId, value: amount })
router.push('/thanks')
Skene flags the missing call and names the event that used to fire.
Renamed events
The agent tidies your event names. checkout_completed becomes checkoutCompleted, or order_placed, or vanishes into a constant.
- posthog.capture('checkout_completed', { plan, value })
+ posthog.capture('checkoutCompleted', { plan, value })
The funnel now splits across two names. Dashboards keep drawing from a name that no longer exists. Skene flags the rename and shows the old vs. the new.
Moved events
The capture call gets moved out of a conditional, into a different code path, or behind a feature flag. It still exists in the code, but no longer fires under the same conditions.
- if (user.isFirstPurchase) {
- posthog.capture('first_purchase')
- }
+ posthog.capture('first_purchase') // moved out of the guard
Skene tracks where in the control flow each event lives, so a moved call shows up as a change even when the call itself looks intact.
Altered payloads
A property gets renamed, dropped, or silently changes type from string to number. PostHog keeps accepting it. Funnels break in subtle ways.
posthog.capture('signup', {
- plan: 'pro',
+ plan_tier: 'pro',
- referrer_id: id,
})
Skene compares payload shapes call by call. Type changes, key renames, dropped properties all surface.
Conditional firing changes
The if-block guarding the event changes. The event still fires, just not under the same conditions. A retention metric quietly misses a slice of users.
- if (user.isActive && user.daysSinceSignup > 7) {
+ if (user.isActive) {
posthog.capture('week_one_active')
}
The condition collapsed; the call now fires for users who should not be counted. Skene flags conditional changes that affect when an event fires, not just whether the call exists.
What is next
- Install Skene: pick a surface and try it
- Supported libraries: which call shapes Skene reads
- Configuration: how to mark a change as accepted