"A plan you can edit while it runs is not a plan. It's a rumor."
What the Plan Freezes
An OperationPlan is a frozen snapshot of intent. It captures the source and destination references, the expected resource identities and metadata, the collision decision, the package-and-symlink policy, and a deterministic hash computed over all of it. Once created, it never changes. The engine reads it, journals it, and executes it — but nothing, including the engine, edits it in place while it's running.
Change Means a New Plan
So what happens when reality shifts — a collision appears that the plan didn't anticipate, or the user revises a decision? You don't mutate the running plan; that would make its hash a lie and its journal record meaningless. You create a new plan (or a revision), with its own hash and its own journal identity. The old plan is superseded, not secretly rewritten. Immutability is what makes 'what exactly did the app intend?' a question with a permanent, checkable answer.
Why the Hash Matters
The deterministic hash turns the plan into something verifiable. The journal records the hash; recovery can confirm the plan it's resuming is byte-for-byte the plan that was committed. Two runs of the same intent produce the same hash, so the system can recognize identity without guessing. Frozen intent plus a hash is what makes both recovery and auditing deterministic rather than best-effort.