#~N commit-ancestor rewind unimplementedGET 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 refuses
CLEANLY 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, #~N
past 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.