The dependencies are collected by running the function, so a conditional branch that was not taken on the first run is not tracked.
watchEffect(() => {
if (enabled.value) {
console.log(payload.value) // tracked only when enabled
}
})
// enabled starts false → payload is not a dependency.
// enabled becomes true → the effect runs, and NOW payload
// is tracked. the first change to payload while disabled
// is silently missed.
// watch() with an explicit source has no such surprise
watch([enabled, payload], () => { /* ... */ })
Automatic tracking is convenient and makes the dependency set dynamic, which is a property nobody expects from something that looks like a subscription. Using explicit sources for anything with a conditional read removes the whole class, and the extra verbosity is a fair price for a dependency set that can be read from the code.