del for a staged delete of an UNTRACKED path — status shows 1 del, post says POSTNONE
be delete of an untracked path writes a delete row that the classifier buckets as del, so be status shows a pending deletion (139 ok, 1 del) — but the path was never in the baseline tree, so the committed tree is unchanged and be post refuses POSTNONE: no changes since base. status and post DISAGREE: a phantom del. The classifier must not bucket a delete row whose path is absent from the baseline as del (a no-op delete changes no tree). Reproduces in BOTH native be and jab — a shared classifier fault. be/ JS shared/classify.js. Spec Dirty / DELETE; method Issues.
~/todo/GET-037/test, the beagle-ext-tests sub): sub/selflink/run.sh
is UNTRACKED — absent from the baseline tree (be tree:?<tip> has no sub/selflink).
be delete sub/selflink/ unlinked it and wrote delete sub/selflink/run.sh rows.be status → del sub/selflink/run.sh / 139 ok, 1 del; jab status identical.be post '…' → POSTNONE: no changes since base (Error: POSTNONE + Error: NONE);
jab post → same POSTNONE. The deleted file was never in baseline, so the committed tree == baseline → genuinely no change.
1 del (a pending change) while post finds none — the
del is a phantom.
shared/classify.js::classifyMerge — the `if (d) { push({ bucket:
"del", … }) } branch buckets a delete row del REGARDLESS of baseline presence. A delete row whose path is NOT in the baseline (!b) is a no-op (post's tree == baseline) and must not surface as del`.
be status/be post show the SAME disagreement, so it is a sharedclassifier fault, not JS-only.
del for a delete row whose path is absent
from the baseline — status agrees with post (no phantom del, no surprise POSTNONE).
be delete of an untracked path leaves a clean status (nothing staged), matchingthat post sees no change.
be/ JS shared/classify.js. REUSE the existing base-tree lookup (b) — a delete
is real only when the path is in baseline. Keep classifyDir (ls/lsr) consistent.
be delete <untracked> → status shows del but postPOSTNONEs (RED); after the fix status is clean and matches post.
delAND commits.
classifyMerge's if (d) branch, bucket del ONLY when the path is in baseline
(b present); a delete row for a non-baseline path is dropped (no row), so status matches post's POSTNONE.
be delete <untracked> arguably should not WRITE adelete row at all (nothing tracked to stage; DELETE: "an already-absent path is an OK no-op") — but the classifier must be robust regardless.
be delete <untracked> → status 1 del but post POSTNONE. RED.classify.js:327 (classifyMerge staged-del branch) already computes
inBase: !!b — status must DROP the row when !b (today only fold-decide.js:131 consumes the flag, for unlink); keep the gitlink-del branch (:318, inBase:true) as-is.
classifyDir (classify.js:548 — the ls/lsr if (d) bucketlacks even the baseline lookup).
del + commits; phantom gone; native parity.
align the be/ JS classifier (the working scope here).
self-contained.
~/todo/GET-037/test). Deliverable:
a non-baseline delete row is never classified del; status agrees with post.
classify.js:327 pushes bucket:"del" for any
delete row (tags inBase:!!b but never gates on it); no fixing commit in the logs.