Review threads detach
A comment anchored to a commit hash is orphaned the moment the author cleans up the branch. The reviewer's context is real work that the tooling then throws away.
The model · change identity
A commit hash identifies a snapshot of a tree. Teams use it to identify a unit of work — and then rewrite history, which is exactly the operation that replaces the hash. Everything anchored to it detaches. That is not a tooling gap; it is the wrong noun.
The trace
TOVIO keeps both. The commit ID stays a content hash and keeps doing what a content hash is good at. The change ID names the work.
tovio committhe work is first recordedblake3:8c14f0a2…chg:4E1A08KQtovio commit --amenda typo in the same workblake3:2b90dd71…chg:4E1A08KQtovio rebasemoved onto a newer baseblake3:f5027cc9…chg:4E1A08KQtovio change absorba fixup folded into the change that owns itblake3:a71b3e40…chg:4E1A08KQtovio landadvances the shared laneblake3:d0c6819b…chg:4E1A08KQIllustrative identifiers. A change ID is a random 128-bit value rendered as chg:<base32> — deliberately not derived from content, so content can change without the identity moving. It stays stable across the supported rewrite operations.
Why it matters
A comment anchored to a commit hash is orphaned the moment the author cleans up the branch. The reviewer's context is real work that the tooling then throws away.
CI results, risk scores, approvals, and agent provenance are keyed to something that history is expected to replace. Every rewrite is a cache invalidation nobody asked for.
Cherry-picks, backports, and stacked work are matched by patch text, subject line, or a trailer someone remembered to keep. All three are heuristics.
Teams ban rebasing to protect review continuity, then live with the merge noise instead. The rule exists because identity was attached to the wrong thing.
What it buys
Once identity survives rewriting, a set of features stop being hard:
undo and redo.Read this precisely