|null $before * @param array $current * @param array $intent * @return array{ok:bool,derived:list,reason:?string} */ public function derivedMeta(?array $before, array $current, array $intent): array; /** * Verifies an undo/redo result against its target. Keys the inverse had to change ($before differs from $target) must * match exactly; keys inherited from the original operation are skipped; anything else a hook wrote is derived. * * @param array $target * @param array $observed * @param array|null $before State right before the inverse ran. * @param list $inheritedDerived * @return array{ok:bool,derived:list,reason:?string} */ public function derivedMetaInverse(array $target, array $observed, ?array $before, array $inheritedDerived): array; /** * The target an undo/redo restores: the journaled one, with the derived keys left as they are now. * * @param array|null $target * @param array|null $current * @param list $derived * @return array|null */ public function inverseTarget(?array $target, ?array $current, array $derived): ?array; /** Whether the meta kept outside the object state is as it was before the effect (one-shot). */ public function guardedMetaIntact(int $id): bool; }