Skip to content

docs(research): divergence history mixes convergence and merge scaffolding (#339) - #434

Open
tucktuck101 wants to merge 2 commits into
launchpadfrom
research/339-divergence-permanence
Open

docs(research): divergence history mixes convergence and merge scaffolding (#339)#434
tucktuck101 wants to merge 2 commits into
launchpadfrom
research/339-divergence-permanence

Conversation

@tucktuck101

Copy link
Copy Markdown
Collaborator

Summary

Answers #339 by tracing each of the nine product-code divergences to its introducing commit. None of them is a disagreement with upstream — eight are upstreamable fixes or features nobody has offered, and the ninth pair is scaffolding the merge process itself forced. That breaks the model ADR-0021 (open in #308) builds the divergence ledger on, which presumes divergence means disagreement.

Related issue

Closes #339

Issue type

Task


Agent provenance

Field Value
Harness / provider Claude Code
Model claude-opus-5[1m]
Session reference N/A - the harness exposes no shareable run id
Initiating human @tucktuck101

Objective

Add launchpad/Research/339-divergence-permanence.md classifying each of the nine product-code divergences as permanent, converging, or unknown, with the reason.

Impacted components

launchpad/Research/339-divergence-permanence.md

Approach and rejected alternatives

Grouped the nine files by introducing commit rather than reporting nine independent verdicts. Four commits produced all nine, and the clusters have genuinely different characters — a feature, two bug fixes, and a merge artefact — so a per-file table would have repeated the same answer four times while hiding the one distinction that matters.

Traced the runtime.rs line count across the history rather than accepting "refactor" at face value. That is what turned the vague "extraction, probably nothing to protect" reading into a specific causal chain: the upstream merge left the file at 1007 lines against upstream's own 1000-line ceiling.

Rejected classifying from the diffs alone without the commit messages. The cfg(unix) cluster in particular is indistinguishable from a stylistic change until you read that it is titled a fix and see which platform job denies warnings.

Verification

Command run:

MB=f8692fa9b52ddcfeb4b95fb4862109983509f131
git log --format="  %h %an | %s" $MB..launchpad/launchpad -- <each of the nine files>
git show <commit>:desktop/src-tauri/src/managed_agents/runtime.rs | wc -l   # at each commit
git log -1 --format="%h parents=%p %s" 523fb9ad9
grep -nE "MAX_LINES|maxLines" desktop/scripts/check-file-sizes.mjs
git ls-tree -r --name-only $MB | grep check-file-sizes
grep -n "not currently sending fixes upstream" launchpad/AGENTS.md

Raw output:

pack.rs, lib.rs, resolve.rs
  f36d10f9c Serina McFall | feat(launchpad): add --format json to buzz pack inspect (#239 STEP 1) (#257)
lifecycle.rs, shell.rs
  35cab546a Ben Mitchell  | fix(desktop): gate buzz-terminal's unix-only imports and const on cfg(unix)
restore.rs, runtime_commands.rs
  975e6d444 joshuavial    | dial the configured relay when spawning managed agents
runtime.rs, runtime/summary.rs
  43366affa Serina Mcfall | fix(desktop): keep managed_agents/runtime.rs under the file-size ratchet

# runtime.rs line count along the history
 996 lines  <- f8692fa9b  (merge-base, upstream)
 994 lines  <- 975e6d444  dial the configured relay
1007 lines  <- 523fb9ad9  chore: sync launchpad with upstream block/buzz main
 742 lines  <- 43366affa  keep managed_agents/runtime.rs under the file-size ratchet

$ git log -1 --format="%h parents=%p %s" 523fb9ad9
523fb9ad9 parents=115c329f5 f8692fa9b chore: sync launchpad with upstream block/buzz main

$ grep -nE "MAX_LINES" desktop/scripts/check-file-sizes.mjs
8:const MAX_LINES = 1000;
11:  { root: "src-tauri/src", extensions: new Set([".rs"]), maxLines: MAX_LINES },

$ git ls-tree -r --name-only $MB | grep check-file-sizes
desktop/scripts/check-file-sizes.mjs      # the ratchet is upstream's, not cohort-added
mobile/scripts/check-file-sizes.mjs
scripts/check-file-sizes-core.mjs
scripts/check-file-sizes-core.test.mjs
web/scripts/check-file-sizes.mjs

$ grep -n "not currently sending fixes upstream" launchpad/AGENTS.md
85:  not currently sending fixes upstream. Reasoning and the rejected alternatives are in
  • Tests or checks were run and the raw output is pasted above
  • The diff is confined to the scope of the linked issue
  • No secrets, keys, tokens or hostnames were added to tracked files

Not verified

I did not ask the authors, and #339 asked me to. It requested classification sourced from the introducing commits and from whoever wrote them; I did the first half only. Every "would converge" verdict is my reading of code and commit messages, not a stated intention. The three people who can confirm are Serina McFall (the --format json and file-split clusters), Ben Mitchell (cfg(unix)) and joshuavial (configured relay).

Whether any of these was already offered upstream. I did not search block/buzz's pull requests — the GraphQL quota was exhausted while this was written. If Ben Mitchell's cfg(unix) fix is already an open upstream PR, that cluster changes from "unoffered" to "in flight", which is a materially different answer.

Whether upstream would accept them. "Upstreamable" here means generic and not fork-specific; it is not a prediction about block/buzz's review.

The other 33 changed upstream files are out of scope — and they may well contain the genuine standing disagreements ADR-0021's model fits, the lefthook pin (ADR-0017) being exactly that shape.

Whether the ratchet problem will recur is argued structurally, not measured. I did not enumerate how many other src-tauri/src files sit near 1000 lines, which would make it a measurement.

Security implications

None from the document. Worth flagging for reviewers, carried over from #338: the restore.rs / runtime_commands.rs divergence governs which relay a managed agent dials, it is unprotected by any test, and this document concludes it is the one divergence where a regression test is unambiguously the right instrument.

Escalations

  1. ADR-0021's ledger row does not describe eight of these nine. Its row is "standing position plus enforcing mechanism", which presumes disagreement. Eight need something like offered upstream: no; would converge if accepted, and the ninth needs artefact of the merge process. Recording them all as standing positions would imply a product view the cohort has never taken. This is prd: the change agent — own the block/buzz → launchpad-26/buzz relationship, including conflict resolution #273's design decision, not mine.
  2. A prior question dominates criterion 4's cost. Eight of nine divergences would disappear if offered upstream. launchpad/AGENTS.md §3 says the cohort does not send fixes upstream, and ADR-0017 reasons about one specific case rather than setting general policy. Whether these eight should be offered is undecided, and the answer is either eight regression tests or eight pull requests to block/buzz.
  3. A merge-posture consequence ADR-0021 does not list. Any upstream file sitting near its line-count ceiling will force a fork-local split on a future drop, exactly as runtime.rs did. Worth adding to that record's consequences; not something I should edit.

…pstream (#339)

Signed-off-by: tucktuck101 <jeffreytaylorrobertson@gmail.com>

@serina-mcfall serina-mcfall left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Blocker — the provenance table maps runtime.rs to one commit; three wrote it, and the omitted content is behavioural

"Four commits produced all nine files" (lines 33-52) attributes runtime.rs to the ratchet extraction alone.

$ git log --format='%h %an | %s' f8692fa9b..origin/launchpad -- desktop/src-tauri/src/managed_agents/runtime.rs
43366affa Serina Mcfall | fix(desktop): keep managed_agents/runtime.rs under the file-size ratchet
523fb9ad9 Serina Mcfall | chore: sync launchpad with upstream block/buzz main
975e6d444 joshuavial   | dial the configured relay when spawning managed agents

Three commits, and 975e6d444 is the relay behaviour fix. (The merge 523fb9ad9 lists the file at all because its conflict resolution differs from both parents.)

The consequence is a direct self-contradiction inside the document:

  • Line 23 files runtime.rs/summary.rs as "scaffolding the merge itself forced … Would converge? no", and line 103 titles the section "the merge created this, not a design view."
  • Line 22 classifies joshuavial's change as "an upstream behaviour bug fix … yes, clearly [convergent]".

Half of runtime.rs's divergence is the same change, filed in both rows. A convergent, upstreamable, behavioural fix is recorded as permanent merge scaffolding.

That breaks the "eight convergent / one permanent" arithmetic at lines 26-31, and it breaks the conclusion at 145-147 — "which leaves, once again, restore.rs and runtime_commands.rs as the only place where criterion 4 is unambiguously right." runtime.rs belongs in that set.

This is the same defect as #433's, surfacing in a second document, and #434 cites #338's verdict as settled input at 99-101. Fixing either note alone leaves the contradiction standing. The correct downstream statement for #290's criterion 4 is three unprotected behavioural files, with runtime.rs:245 as the primary assertion target.

Medium — "none of the nine is a disagreement with upstream" has no falsifiable test

The universal rests on nine "would converge if offered" verdicts, each of which is a reading of a diff rather than a stated intention.

Rated Medium rather than High because you disclose this explicitly and specifically at 166-171 — "I did not ask the authors… Every 'would converge' verdict above is my reading of the code and commit message, not a stated intention" — and name the three people who could settle it. The claim is also about characterisation, and none of the four commit subjects frames itself as a standing position, so the commit messages do support it as far as they go.

What is right — the mechanical work is excellent

  • Exactly nine, and the list matches #433's. Confirmed.
  • All four named commits, authors and subjects are exact.
  • Every runtime.rs line count is correct, to the line: 996 at the merge-base, 994 after 975e6d444, 1007 after the sync, 742 after the extraction; summary.rs 283. The 1007-over-1000 causal story checks out precisely — that is a genuinely satisfying piece of reconstruction.
  • The ratchet: desktop/scripts/check-file-sizes.mjs:8 const MAX_LINES = 1000; and the src-tauri/src / .rs config at :11, quoted verbatim — and correctly identified as upstream's, present at the merge-base.
  • The ADR-0021 quote and the launchpad/AGENTS.md:85 "not currently sending fixes upstream" quote are both accurate.
  • The recurrence argument — upstream files near the 1000-line ceiling will re-trip on future drops — is sound, and you correctly flag it at 186-188 as an argument rather than a measurement.

The provenance defect is one row in one table. Everything the table is built on is right.


Reviewed at head 291136a22. The commit list above was produced by me directly.

🤖 Review drafted by Claude Code (claude-opus-5) for @serina-mcfall.

Signed-off-by: tucktuck101 <jeffreytaylorrobertson@gmail.com>
@tucktuck101 tucktuck101 changed the title docs(research): none of the nine divergences is a disagreement with upstream (#339) docs(research): divergence history mixes convergence and merge scaffolding (#339) Aug 23, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

by:agent Filed or authored by an AI agent, not a human

Projects

None yet

Development

Successfully merging this pull request may close these issues.

task: find out which of the nine product-code divergences are permanent and which are meant to converge

2 participants