DIS-057: be/ JS — unify status+post on ONE ULOG-merge dirtiness classifier (base ⊕ put ⊕ wt ⊕ theirs ulogs → a classification ulog), per Dirty.mkd

Today status and post classify dirtiness through TWO separate ladders over shared primitives: status/ls:/spot use shared/classify.js (classify/classifyDir, the JS twin of sniff/SNIFF.exe.c::status_step), while post uses verbs/post/fold-decide.js (decide, the JS twin of sniff/POST.c::post_classify_step). Both re-run their own base ⊕ wt ⊕ put ⊕ del merge and emit different vocabularies (display buckets vs keep/unlink/add), so they can drift — and fold-decide THROWS on an in-scope patch row (POST-005 / JS-051 "theirs" 5th input), so the pat/mrg/cnf states Dirty requires aren't even commit-able. The rework: ONE classifier built as an N-way merge of four ulogs — the *base tree, the put list* (wtlog), the *work-tree* scan, and any *patched-in (theirs) trees* — whose OUTPUT is itself a ulog (per-path bucket + resolved sha/mode). status renders that output ulog; post consumes it (bucket → keep/unlink/add). Folds in the Dirty deltas: the rmv/mov move pair, pat/mrg/cnf (theirs ulogs + a patch-written stamp offset), and confcnf. ULOG is already the substrate (JS-031 classify; shared/ulog.js each/drain/write). Scope be/ only. See Dirty, STATUS-002, POST-005; method Issues.

Input

Context

Goals

Constraints

WIP

Design decisions

TODOs

Blockers and bummers

Outcome