be put is per-path, not aggregated (repeat banner + PUTNONE spam)
A glob (or shell-expanded multi-path) be put, e.g. be put */*/*.sh, where most matches are unchanged, emits — PER ineligible match — a fresh put: banner, a sniff: put: no eligible paths line, Error: PUTNONE, AND a redundant Error: NONE. The eligible matches DO stage; it is the unchanged ones that turn a benign "most files unchanged" put into a wall of error spam. An unchanged match in a multi-path put should be a SILENT skip, not a per-path error pair. Native be (sniff). Sibling of BE-008 (unchanged empty-put → silent no-op) and the BE-003/BE-006 error-line work. Method: Issues.
be put */*/*.sh over the beagle test dir, most .sh unchanged): / put …/tag-blobs-from-keeper.sh` (staged OK) / Error: PUTNONE / Error: NONE` (×N)be put be/test/bro/reentry/driver.js be/test/get/guard/guard.js → two put:be/test hunks (one file each), NOT one hunk listing both (the user ask).be post sub-recursion: an unchanged / empty sub-put prints put put: + Error: PUTNONE + Error: NONE per sub (seen landing this batch: subs html, beagle/abc).sniff/PUT.c:1119-1121: if (emitted==0){ if (skipped>0) fprintf(stderr, "sniff: put: no eligible paths\n"); return PUTNONE; } — a put PASS that stages nothing but skipped ≥1 unchanged path returns PUTNONE + the stderr line.sniff/PUT.c:207 / :1026 set the is unchanged skip reason; the single-file be put file.c unchanged-skip (:987) is the intended quiet case.put:beagle).Error: NONE is the dog/sniff CLI error reporter surfacing the suffix-NONE twice — the BE-003/BE-006 stacked-error class.put: banner / HUNK per invocation listing ALL staged paths — not one banner per path (the "must be one hunk" requirement).be put stages the eligible matches and SILENTLY skips the unchanged ones: NO per-match banner for a wholly-skipped match, NO per-match PUTNONE, NO Error: NONE spam.be put file.c is unchanged skip (PUT.c:987), the truly-empty bare put → PUTNONE (BE.cli.c), or -q swallowing *NONE (sniff/SNIFF.cli.c:193). Native sniff/keeper only; no JS.Error: NONE (fold into BE-003 uniform line).*/*/*.sh matches many files, ≤1 changed; assert today's per-match PUTNONE/Error: NONE spam, then a single clean result. (sniff/test/refuse.sh Scenarios 5+6, test/put/01-states)sniff/PUT.c::put_stage_named multi = nuris > 1, PUT.c:770/1029/1074/1131)-q quiet. (PUT.c:1035 is unchanged kept; PUT.c:1141 aggregate summary only for nuris>1)be internal) — the fix must handle a received PATH LIST (shell-expanded) and an internal glob alike.sniff/PUT.c::put_stage_named — a multi-path/glob put (nuris>1) silently skips unchanged matches (no per-path banner / PUTNONE / no eligible paths); one-changed → ONE put: hunk. Single-file is unchanged — skipped + bare-empty PUTNONE preserved. Tests: sniff/test/refuse.sh (PUT-003 cases), test/put/01-states. beagle 464/464 + be 65/65 green. Residual (DESIGN, not a one-liner): a wholly no-op SUB still relays a banner-only put:<sub> hunk — needs a HUNKTableAbort / defer-banner / relay-filter change to the shared HUNK contract (status/get/ls). The doubled Error: NONE 2nd line is the BE-003/BE-006 error-line class.jab log; the fix rode the untagged 25/26Jun batch (1fd33d9f/0447e4a7 "JS-065..JS-091 … beagle"). Verified in-tree at tip b0fb0ce4: PUT.c PUT-003 comments + refuse.sh cases present, wtlog shows no pending sniff/PUT.c put row since the 26Jun get.put:<sub> relay + PUTNONE/NONE stderr cascade → BE-008 (open); doubled Error: NONE → BE-003/BE-006.