The wake file is not the store
Spice cached an observed task board by its logical revision. The revision lived in a wake file; the task rows lived in another file. Replacing the store while leaving the wake file alone could make the old cached rows look current.
The task-board observation code therefore pairs the logical revision with a store generation derived from device, inode, and change time. Between observations, a different generation requires another read even if the logical revision has not advanced.
The coherence check during an export needs a different physical witness. Exporting through the backend can itself write the store. Including change time in that comparison would make an ordinary successful read appear to have crossed a replacement. Across the export, the code compares device and inode instead.
Both witnesses come from one stat result at each boundary. Taking separate stats for the fields could combine evidence from opposite sides of a file replacement and call it one observation.
These witnesses have explicit limits. An inode can be reused, which is why change time helps between observations. Coarse timestamps can still collide. The across-export identity check cannot detect every unlink-and-recreate case that receives the same inode during that single interval.
The two comparisons serve different purposes: deciding when to rebuild a cached board, and checking whether an export crossed a store replacement. Both work alongside the logical wake revision.