On April 24, 2026, my local ben branch was 304 commits behind origin/ben, and the /sync skill had no idea.
ITEM-6843 was a clean hotfix. The CAD exchange rate had been hardcoded at 1.4 in the branch, a stale config value that needed updating to 1.31. Moving it touched four files across checkout, packages, and receipt mailers. Short diff, clear business impact. I ran /sync, the skill fetched origin, found the ticket branch clean and ready, and was about to merge.
What it did not do was fast-forward ben first.
the skip logic was reasonable and wrong
/sync treats personal branches carefully. The reasoning is that ben, my preview branch, carries custom state. Commits from David and Aaron, preview-only changes that are not ready for develop, the occasional one-off that lives there and nowhere else. Merging into ben without understanding that state could clobber work. So the skill skipped personal branches entirely, every session, and the drift it never surfaced just accumulated.
304 commits is not a lot in absolute terms. But those commits contained a substantial amount of upstream work my local clone did not have. When I started the merge, git began trying to reconcile the two histories. The merge would have replayed 71,000-plus insertions that already existed on the remote branch. It would not have failed loudly. It would have produced a merge commit that looked internally consistent and was mostly noise pointed straight at the preview.
I caught it because the diff preview was enormous. Not because the tooling stopped me.
what fast-forward instead of skip actually means
The fix was one change to /sync. Personal branches no longer get skipped. They get fast-forwarded first. If the local cannot fast-forward cleanly because the histories have genuinely diverged, the skill halts and surfaces the conflict instead of stepping around it. Fast-forward only means no merge commits get quietly created, no silent replays, no diff that looks complete but contains 71,000 lines that were never supposed to be in this changeset.
I also updated the written branch rules. The formal order is now fetch, fast-forward, then merge. The handoff path for review branches is explicit. Confirm local is current with origin/ben before anything touches it. These rules existed before in a loose way. They live in a file now, and the skill enforces them at the moment a merge is about to happen.
what compression does to drift
The HTO workflow runs across multiple hto* clones, and when Claude is doing the file edits and /sync is handling the merge path, the cycle time for a ticket compresses significantly. That is the point. It means us can close more tickets and keep the queue moving. It also means I run through sessions without the natural pauses where I used to catch things like branch currency.
Manual, slow work has informal safety checks baked into its slowness. You read the branch name twice because you typed it twice. You notice the diff is strange because you waited for it to generate. I do not want the slowness back. But the habits I built during the slow era were calibrated to that pace, and moving fast with the same habits means the habits stop catching things.
The 304-commit gap was not a recent development. The skip logic was not a bug introduced in the last sprint. It was a reasonable default that stopped being appropriate without announcing itself.
the branch model was correct and insufficient
The branch model is ben for preview, develop for the release tip, master for prod. The team understands it. But a branch model is a set of intentions, and intentions do not enforce themselves at merge time. The /sync skill enforces things at merge time. If the skill’s behavior does not match the model’s invariants, the model is documentation, not infrastructure.
Changing one behavior in /sync made that gap concrete. A skip that let stale state accumulate invisibly became a halt that surfaces the drift and requires a decision. The class of near-miss that produced a 71,000-line preview merge cannot recur silently, because the skill will not let it stay silent.
When a workflow accelerates merges, stale local state does not get cheaper to carry. The /sync skill now makes that cost visible before it lands.