From 806b763d97fd355b98c814c473e7a0564cf3e1b4 Mon Sep 17 00:00:00 2001 From: mos-dt-0 Date: Wed, 5 Aug 2026 15:22:32 -0500 Subject: [PATCH] =?UTF-8?q?docs(remediation):=20D-55e=20settled=20?= =?UTF-8?q?=E2=80=94=20the=20anomaly=20was=20a=20merge=20commit,=20and=20t?= =?UTF-8?q?his=20repo=20shares=20the=20exposure?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit #1041 was never a squash. Verified on this repo: #1027, #1033 and #1032 have ONE parent and end with (#N); #1041 has TWO and begins "Merge pull request". A merge commit's author is whoever created the merge — ordinary git, not an anomaly. The rows differed by merge style, not by field, estate, path or account state, and the discriminator was one field nobody had read: parent count. Established with zero exceptions across four rows, two estates, two Gitea instances and three repos: squash merge sets author = poster and committer = merger. Of the three candidate discriminators I offered, merge path was correct and I had ranked it first. The 3-to-1 split was explicitly refused as a verdict, which is why the real answer stayed findable — a majority reported as a conclusion would have closed the question on the wrong side. And the resolution exposed a larger live problem, on THIS repo: mosaicstack/stack has default_merge_style = "merge", with both styles enabled and both in live use. The default path produces a merge commit, which attributes to the merger and loses authorship more completely than squash — squash at least keeps the poster in author, a merge commit keeps nobody. Same configuration as the USC repos, so this is not a USC problem. Merge style is itself load-bearing for attribution and must be explicit, never defaulted. Hard merge precondition for #1030: merged by the default path it becomes a merge commit and erases the poster as well as all three branch authors. It must be merged with an explicit squash style. The three prior deliveries are 1-parent only because merge-gate hardcodes {"Do":"squash"} — that fixed payload, criticised on the message-field axis, is protective on this one because it cannot silently fall to the repo default. Also confirmed here: default_delete_branch_after_merge = False, so the RM-02 branch retention is not on a timer. Co-authored-by: tl-mosaic Co-Authored-By: Claude Opus 5 (1M context) --- docs/remediation/TASKS.md | 48 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 48 insertions(+) diff --git a/docs/remediation/TASKS.md b/docs/remediation/TASKS.md index 5cb653bc..af7c89c4 100644 --- a/docs/remediation/TASKS.md +++ b/docs/remediation/TASKS.md @@ -794,6 +794,54 @@ required. > merge until `pr-merge.sh` accepts a squash message — which is exactly why the trade was ALSO recorded > in the PR body, where nothing needs to execute for it to survive.** +### D-55e — SETTLED: the anomaly was a MERGE COMMIT, and the discriminator was PARENT COUNT + +**`#1041` was never a squash.** Verified independently on this repo: + +| PR | parents | first line | author | +| --------- | ------- | -------------------------------------------------------- | ---------- | +| **#1027** | **1** | `RM-01: … (#1027)` | poster | +| **#1033** | **1** | `RM-61: … (#1033)` | poster | +| **#1032** | **1** | `fix(rm-03): … (#1032)` | poster | +| **#1041** | **2** | **`Merge pull request 'chore(sync): merge main → next`** | **merger** | + +**A merge commit's author is whoever created the merge — ordinary git, not an anomaly.** The rows +differed by **MERGE STYLE**, not by field, estate, path, or account state. **The discriminator was one +field nobody had read: parent count.** + +> **★ ESTABLISHED, ZERO EXCEPTIONS — SQUASH MERGE: `author` = POSTER · `committer` = MERGER.** +> Four rows, two estates, two Gitea instances, three repos. + +**Of the three candidate discriminators offered, MERGE PATH was correct and was ranked first** — and the +"3-to-1" was explicitly refused as a verdict, **which is why the real answer was still findable.** A +majority reported as a conclusion would have closed the question on the wrong side. + +> **★★ AND THE RESOLUTION EXPOSED A LARGER LIVE PROBLEM THAN THE ONE IT CLOSED — WHICH IS ON THIS REPO +> TOO. MEASURED:** +> +> ``` +> mosaicstack/stack default_merge_style = "merge" allow_squash_merge = True +> allow_merge_commits = True default_delete_branch_after_merge = False +> ``` +> +> **THE DEFAULT MERGE STYLE ON THIS REPO PRODUCES A MERGE COMMIT — AND A MERGE COMMIT ATTRIBUTES TO THE +> MERGER, LOSING AUTHORSHIP MORE COMPLETELY THAN SQUASH.** Squash at least keeps the poster in `author`; +> a merge commit keeps nobody. **Both styles are enabled and both are in live use here — `#1041` is the +> proof.** Same configuration as the USC repos; **this is not a USC problem.** +> +> **⇒ MERGE STYLE IS ITSELF LOAD-BEARING FOR ATTRIBUTION AND MUST BE EXPLICIT, NEVER DEFAULTED.** + +**★ DIRECT CONSEQUENCE FOR #1030 (the keystone), and it is now a hard merge precondition:** if `#1030` is +merged by the DEFAULT path it becomes a **merge commit** and attributes to the merger — erasing not only +`coder-mos1`/`coder-mos2`/`f10-coder` but the poster as well. **It MUST be merged with an EXPLICIT squash +style.** The three prior deliveries (`#1027`/`#1033`/`#1032`) are 1-parent only because `merge-gate`'s +payload hardcodes `{"Do":"squash"}` — **that fixed payload, criticised on the message-field axis, is +PROTECTIVE on this one: it cannot silently fall to the repo default.** Keep it explicit when the message +field is added. + +**Also confirmed here:** `default_delete_branch_after_merge = False`, so `feat/rm-02-gate-registry`'s +retention is **not on a timer** — consistent with the USC finding. + ### D-55b — two parties quoting a third is not corroboration The coordinator wrote _"installer-7's live-panel GREEN was the last thing before the command"_ **having