Per DIS-080: conflict liveness is row-scoped, not content-scoped (resolved==posted). Provide one cheap accessor that fishes out the current conflict list — an array of paths — by scanning the wtlog backward from the tip to the most recent get/post barrier, collecting con <path> rows. Every consumer (classify/status, diff view, post's gate) reads this instead of marker-scanning bytes.
wtlog.conPaths() (shared/wtlog.js:333-341) already collects con rows but with the wrong floor for the new rule; classify then re-verifies markers on disk (classify.js:56-63, 423-427) — that liveness check dies with markers.wtlog.conflicts() (name TBD): backward scan, stop at the first get/post row, dedup, return paths. O(rows since last barrier).con bucket, quad's ! wt char, status summary tally, POST-035 gate, DIFF-016 yellow spans — all row-driven, zero byte scans.conPaths() + marker liveness path retired with the switch.wtlog.conflicts() → array of paths, oldest-first, deduped (kept conPaths() untouched for its live callers).get/post row bearing a full sha whose path is NOT wt-relative (absent, or under a scheme/authority — a seed/sub re-attach address). Both bare and scoped-branch gets and both post shapes (commit ?br#sha, FF advance) qualify: each moves the tip.patch (multi-patch stacking must accumulate con rows), put/delete (DIS-080 §4: put is not an ack), a ref-less store anchor (pins nothing), and a wt-relative path row — a scoped get <path> amnesties nothing (today restorePath writes no wtlog row at all, so the rule is a guard for the future).shared/wtlog.js conflicts() + test/wtlog_con.js (9 legs), registered as be-js-unit-wtlog_con; full suite 317/317 green.conPaths() and marker liveness untouched, so this lands as a pure addition.///be/#543269d6 (2026-07-29 20:06).