bin/put.js + bin/lib/stage.js — the staging enginebe 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.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.