SUBS-027's first slice landed the SUBSDirty classifier + be status Advanced-detection. This ticket is the deferred half: actually WRITE the R1/R2 records, compute the Edited and coord-mismatch axes, enforce the recursive get/post return-code semantics, surface the pin axis in be head, and fill the get/post test gaps. Serialized AFTER SUBS-026 + PATCH-001 (same gitlink-bump path). See Submodules, SUBS-027.
The landed slice classifies + flags be status, but three pieces are placeholders and the verb semantics are unenforced:
SUBSDirty reads R1 as the live tree gitlink and probes R2 (usually ABSENT — your beagle case). The parent-pin reflog mirror and the ?.<parent> synth keep-alive must actually be emitted on post.sniff/POST.c + beagle/SUBS.c don't implement them. These files COLLIDE with in-flight SUBS-026 and PATCH-001.be head can't see the pin axis — graf/LOG.c computes changed as committed-tree-vs-branch-tip; it structurally cannot see wt-vs-pin (the tree still pins the old sha). Needs a sniff→graf path.post/26+post/27 are WILL_FAIL stubs already encoding the post return-code contract, gated on "SUBS-001"; get/14 gates on an unimplemented be get --dry-run.--force) recursion contract.be head.SUBSDirty (one classifier, every verb); ABC style; ragel for any parsing; no per-verb tree re-parse where R1 suffices.—
719cb085; forward-only via the SUBSDirty Advanced/stale gate in sniff/PUT.c; repro test/post/51-sub-behind-no-backward-bump.SUBSDirty now derives the sub shard from the path basename when the anchor is unbound (be get ?<sha>, the SUBS-028 blank-want), so a behind sub walks real ancestry instead of the old "assume Advanced" guess (which drove the backward bump). Truly-unresolvable shards keep the conservative-Advanced signal (never miss a real bump — verified vs post/23, post/45).?/<sub>/.<parent> keep-alive) on post — landed 0c67bea8. The committed case already posts onto the synth branch; the gap was the advanced-CLEAN bump (sub made no commit → never anchored), which now anchors R2 at the new pin via be put ?<synth> in the sub mount, gated on silent (no-commit) so it never perturbs the committed/push recursion (a broader bolt-on regressed 16 push/post tests). Repro test/post/52-sub-advanced-anchors-r2. Closes the R2 arm of SUBS-026.<sub/path>?<parent/branch>#<hash> mirror in the parent refs) + point the classifier at the records. Lower priority: a cache the classifier doesn't need yet (it reads the pin from the authoritative tree); do it together with a consumer (coord-mismatch).--force escape (today behind silently keeps the pin + warns when not -q) and refusing a real DIVERGED cousin (today bumped conservatively, since cousin vs undecidable needs object fetch); the get reapply-onto-pin path.be head: per-sub Advanced/stale mark — landed b9c6b647 ("be head flags sub advanced past pin"; beagle/BE.cli.c:1707-1801 SUBS_DIRTY_ADVANCED → "advanced" mark, tests head/04-sub-dirty + head/05-sub-parent-ahead).post/26+post/27 (the post return-code contract) when it lands; get/14 once --dry-run exists.sniff/PUT.c gate.719cb085: sniff/PUT.c forward-only gate + sniff/SUBS.c unbound-anchor basename fallback; repro test/post/51-sub-behind-no-backward-bump.0c67bea8: an advanced-clean bump now anchors ?/<sub>/.<parent> at the new pin (no synth-missing GC-orphan); repro test/post/52-sub-advanced-anchors-r2; full suite 415/415 (only network CURLtest/POLtest skipped).be head pin axis landed b9c6b647 (per-sub advanced mark in beagle/BE.cli.c) — closes the last SUBS-026 residual.--force / diverged-refusal, get reapply-onto-pin, and the GET/POST axis test matrix (post/26+27 still gated, get/14 needs --dry-run).