Operations and conflicts
Every proposed mutation is a persisted TargetOperation with a deterministic operation ID, feature key, source and target identity, reason, safe before/after display values, opaque provider apply/revert payloads, and a conflict key.
Grouping
Section titled “Grouping”The run UI groups operations for the same run, profile, source item, target item, and mapping segment into one card. AniList status, progress, rating, and repeat can therefore be displayed and written as one provider mutation while remaining distinct feature state internally. Letterboxd diary dates remain independent operations but are grouped by film in history.
Conflict keys
Section titled “Conflict keys”The default key includes target instance, target item, and feature. A rating and diary entry for one film do not conflict. A plugin may use a broader key when its remote API cannot safely separate fields.
Exclusive operations, such as deleting an AniList entry, suppress incompatible updates for the same target item in that run.
Outcomes
Section titled “Outcomes”Each operation returns one of:
applied— the remote state is confirmed;skipped— no safe write was required;failed— the request definitively failed;retryable— a safe retry may succeed;ambiguous— the remote result cannot be proven.
Only confirmed outcomes advance feature state. Partial or ambiguous runs retain pending information so a later read can reconcile without double-counting a rewatch or duplicating a diary entry.
Execution gate
Section titled “Execution gate”All manual, scheduled, webhook, resumed, Apply, and Revert writes share one execution gate. Two runs therefore cannot mutate connected provider accounts at the same time, while source-only analysis remains independent where safe.