#~N commit-ancestor rewind unimplemented
GET documents be get '#~1' as "rewinds cur's ref by one commit and resets the wt, staying attached to cur", but no ~N ancestor operator exists in fragment handling — the ~1 is resolved as an ordinary ref/hex and fails. The goal is the documented relative-ancestor rewind. See GET, URI.
~N is verb payload INSIDE the #fragment (free-form per URI), not
URI structure — parsed by a tiny DOGFragRewind predicate (typed u64decdrain, no hand-rolled scanner), NOT the URI grammar.
(GITu8sDrainCommit + GIT_FIELD_PARENT) as a new KEEPResolveAncestor in keeper/RESOLVE.c — works on unindexed history (no DAG needed).
?<cur_branch> (empty =>
trunk ?): GETCheckout already derives both the recorded row shape AND the REFS tip advance from source, so the ref rewinds in place.
KEEPResolveAncestor returns RESLVNONE → GET refusesCLEANLY before any wt mutation (the wt is left untouched).
#~N (default N=1) on the GET fragment path; reject ~0/junk.#~1 parent, #~2 two back, ?#~1 spelling, #~Npast root refuses (test/get/65 + DOGtest FragRewind table).
None — the first-parent walk-back is now exposed via KEEPResolveAncestor.
LANDED (audited 2026-07-07): 25851a5a (beagle) + dd0a8f4b (dog) "DIS-008 be get #~N ancestor rewind", 26Jun.
~N was never recognised — #~1 fell through to the bare
resume (silently re-checked-out cur tip, no rewind); ?#~1 hit GET's "not a valid commit ref" refusal. No first-parent walk was wired in.
DOGFragRewind (+ dog/DOG.h decl);
keeper/RESOLVE.c:301 KEEPResolveAncestor (+ RESOLVE.h decl); sniff/GET.c:2076 SNIFFGetURI rewind arm (detect → resolve → attached GETCheckout).
#~1/#~2/?#~1
rewind + attached-post, past-root refuses cleanly; dog/test/DOG.c DOGTestFragRewind table. Full ctest 377/377 green.