Simple builders currently save a list of additions and removals, both in id and string form (depending on how they come in), and process these lists at commit time to figure out what actually needs to happen.
In terminusdb, we're currently implementing a type of object whose identity is entirely dependent on their inner values - their id becomes a hash of those values. Multiple documents that point to this value will be pointing at the same object. This introduces a garbage collection problem where we'd like to delete this value object when the last reference to it is deleted. However, the way things are now, we can only figure out that the last reference got deleted after we have already done the commit.
We need some sort of inbetween phase, where the builder is not yet committed (we can still add extra additions/removals to it), but we do know exactly what would happen if it were to commit.