Per DIS-080: dirty stays wt != base — patched-in changes are still dirt, they must be posted. EXPECTED (base + in-scope patch-ins, weave reading) only splits the dirt into kinds: wt==EXPECTED → patched-in kind (posts as the merge commit); wt!=EXPECTED on a patched path → local edit on top; ok remains wt==base only. The con bucket is driven by the ULOG-004 accessor alone — no marker scan, no mtime cnf slot; a conflict stays con until the next post (resolution is not detected, it is the post).
cnf slot die.con bucket := path ∈ ULOG-004 accessor result. Quad !, red SGR, summary tally unchanged in look; a con path stays con even after edits, until post.cnf slot retired.test/status/conflict (marker-degrade-to-mod golden) is overturned — regold to row-based liveness.expectedSha() local to classify.js (DIFF-016 owns any shared helper): weave.build of curTip + each patchTheirs() tip, one N-way weave.merge, read by weave.mergedLive (no WT layer), framed as a blob sha — wt/base/theirs compares are all sha-vs-sha, one wt read (wtBlobSha).theirs[path] && (!inBase || t.sha !== b.sha); a touched path is decided on BYTES (never the mtime stamp-set), an untouched one keeps the plain base comparison verbatim.ok; wt==EXPECTED==theirs → pat; wt==EXPECTED!=theirs → mrg; wt!=EXPECTED → mod (wt-only variant: unk).cnf slot dropped; the get band's ceil-2ms con slot dropped too (both are conflict signals — now rows), ceil-1ms mod kept (GET-050 false-clean guard).WT_BUCKET.con already carries the red/! flag and reads the classify bucket — only its source (rows, not markers) changed.test/patchband.js:94 asserts the cnf slot resolves to cnf (retired by Goal 3).test/statusfast.js:145 scenario C asserts a cnf-slot mtime routes con (same retirement; live conflicts now carry a con row).test/patch/stampband/assert.js asserts a clean apply is io.open-FREE — the EXPECTED consult reads bytes by construction; its bucket asserts (pat/mrg/con) still pass.get/conf-state, get/confdrop, get/dirty, post/conf-state, post/patch-absorb.test/wtlog_con.js.STATUS-017: row-based con, EXPECTED kinds//STATUS-017 (jab put): shared/classify.js + new test/status/edited-conflict, test/status/expected-kinds, regolded test/status/conflict.//PATCH-025 (dependency, not this ticket's work): shared/weave.js, verbs/patch/patch.js, verbs/get/get.js, test/patch/{conflict,dirty-overlap,same-anchor-conflict,stacked-conflict}.ctest -j16: 312/320 (base 543269d6 + import was 313/318; the 3 new reds are the contradicted band tests above).///be/#4b044ea6: the 7 PATCH-025 imports ABSORBED (now trunk bytes — landed via DIFF-016/PATCH-025); weave.js/get.js conflict-salad reset to trunk; test/status/conflict/run.sh salad (ours row-scoped regold vs the landed PATCH-025 regold) rebuilt by worker-transcript replay onto trunk's version; the 3 new-test files survived as demoted o rows. All re-put: classify.js, weave.js, get.js (con acks), 4 status test files. Suite 320/323 — the sole reds are the 3 declared contradicted band tests; amending them needs gritzko's approval.