bin/put.js + bin/lib/stage.js — the staging engine
be put as JS: stage files for the next commit (write put rows + restamp) and the ref-write forms (?br create, ?br#sha set). The shared staging engine stage.js (bare-walk / named-classify / dir-expand / move-pair) backs both put and JS-050 delete. ← JS-047+JS-048. Part of JS-046. Method: Issues.
sniff/PUT.c: bare put walks the baseline tree, stages every tracked
file whose mtime ∉ stamp-set AND on-disk sha ≠ baseline (put_visit_tracked :69); named put drives SNIFFClassify (put_classify_step :189); dir-form expands per-file; move-form <old>#<new> renames on disk, row frag = dst.
SNIFF.exe.c:1021): ?br→create-at-cur (PUTDUP if exists),
?br#sha/?#sha/?<40hex>→set OUTRIGHT (non-FF, the reflog escape hatch).
bin/lib/stage.js: bare-walk, named-classify (reuse classify.js), dir-expand,
move auto-pair (put_detect_moves, PUTAMBIG on non-1:1) + explicit move.
bin/put.js: slot dispatch; stage → put rows (JS-048) + io.setMtime
(JS-047); refs via JS-048; the put: banner (render.js). Skip meta paths.
be put: wtlog rows + file
mtimes + REFS. No push (//remote deferred). No patch interaction.
shared core (JS-050 delete adds unlink + the dirty-gate).
test/js/put/* (fixtures from test/put/): stage one
file / dir / move / bare-all; ref create + set — JS put vs native be put: same wtlog rows, same file mtimes, same REFS. (Now be/test/put/*, 10 cases incl. bare/dir/move/ref-create/ref-set/ref-set-sha.)
e6e47128.)e6e47128 (bin/put.js + stage.js, be put as JS). Today at
be/verbs/put/put.js + be/shared/stage.js (beagle-ext shard; 08a58be0 dropped the beagle bin/ dup); parity suite be/test/put/*. Audited 2026-07-07.