@paul_tiplady As you've found, the limitation is documented explicitly at
https://www.stitchdata.com/docs/replication/replication-methods/key-based-incremental#limitation-3--replication-key-inclusivity, so correctly implemented taps should behave this way (and we can expect the Stitch-approved ones to actually do so), even though this is not explicitly documented in the spec.
This also means that targets that intend to support taps incremental replication (which ideally would be all of them) should use UPSERT or some other dedup method, even though this is not explicitly documented in the spec either.
So I agree that:
1. we should definitely document this ourselves in the
https://meltano.com/docs/integration.html#pipeline-state section (which we may want to rename to "Incremental replication" or something like that), and
2. Meltano should warn users when they attempt to use incremental replication with a target that doesn't actually support it correctly, which starts with specifying in our discoverable plugin definitions (
https://meltano.com/docs/contributor-guide.html#discoverable-plugins) whether a target supports incremental replication. Meltano would then detect whether incremental replication is used (read: whether we're passing a state file to the tap) and fail hard if the target doesn't support it, and suggest the user use full-table replication instead, or a different target. Meltano could also detect this and simply fall back on full-table replication, although this wouldn't actually be better with append-only formats like CSV and JSONL, or targets that wouldn't wipe the existing data before inserting new records. Some targets support
ACTIVATE_VERSION
(
https://meltano.slack.com/archives/CFG3C3C66/p1601148878022700?thread_ts=1600699540.015800&cid=CFG3C3C66) which we may also be able to pay special consideration to.
Does that sound reasonable or do you think there's more we can do at this stage? The direction this would ideally move the ecosystem into is proper support for incremental replication in both taps and targets.