Skip to content

The placement caller passes a parameter #9555 removed: drop it, and let the field go with it - #9650

Merged
briansrls merged 1 commit into
mainfrom
fix/convergence-placement-primary-path
Aug 28, 2026
Merged

briansrls merged 1 commit into
mainfrom
fix/convergence-placement-primary-path

Conversation

@gunbai-bot

@gunbai-bot gunbai-bot Bot commented Aug 28, 2026

Copy link
Copy Markdown
Contributor

repository_convergence_placement calls repository_converge_wet with five arguments. The callee has declared four since #9555. main has refused on this ever since, and it is one of the thirteen .dag diagnostics keeping the required floor from reaching its fold.

dag/gunbc/live_deploy/repository_convergence_placement.dag:637:9: error: call shape mismatch
calling 'repository_converge_wet': no parameter named 'primary_path'
(declared: [repo, remote, base_ref, candidate])

Nobody was careless, and no review could have caught it

Two squash merges, eighteen seconds apart:

deb0db89bf 14:20:43 #9555 removed primary_path — the callee now derives the primary from git's own roster
15aa14b4d5 14:21:01 #9563 added this caller, as a new 775-line file, passing it

git merge-base --is-ancestor deb0db89bf 15aa14b4d5 confirms #9555 is an ancestor of #9563 — so #9563's branch was built on a base that still carried the five-parameter signature, and the file did not exist on the base where the signature changed. There was never a diff containing both halves. Both PRs were green on their own bases; main is red from their composition.

Why the field goes too, not just the argument

Deleting only the call-site argument would leave ConvergencePlacementOperands.primary_path constructed at line 215, asserted by a witness, and read by no production code — dead data in a typed carrier, whose entire purpose was to protect a callee parameter that no longer exists.

The witness conjunct goes with it and loses no coverage. The construction sets primary_path: repo, so o.primary_path == srv1_repo_root() only restated o.repo == srv1_repo_root() on the line directly above. It could never have failed independently of its neighbour, which makes it the decoration-cited-as-coverage shape rather than a consumer worth preserving the field for.

Both annotation blocks are rewritten, not renumbered

The first asserted a five-string signature. Changing "five" to "four" would have left the surrounding rationale still describing a derivation this module no longer performs.

The second block is the interesting one: it had already named git's roster as the stronger construction, belonging to the module that owns the adjudication — which is exactly what #9555 implemented. It now records that the responsibility moved, rather than explaining a field that is gone. Per DESIGN §4c an annotation may preserve irreducible rationale and may not assert a shape the body no longer has.

Verification standing

Stated honestly rather than claimed. This rests on reading plus CI. My local discriminating pair — the fix as arm A, the argument re-injected as arm B — has not reported: the first attempt produced no result (the run exited before printing either arm, and main moved mid-dispatch so the harness patched the whole tree rather than these two files), and the re-run is still in flight. Two arms that agree because the harness never exercised its subject is a null instrument, not evidence, so I am not reporting one until it discriminates. CI on this PR is the authoritative measurement either way.

This closes one of the thirteen. It is not a partial restoration of the fold: the floor resumes only at zero blocking diagnostics, so main stays red on the remaining twelve after this lands.

Two notes for whoever merges

…et the field go with it

repository_convergence_placement calls repository_converge_wet with five
arguments; the callee has declared four since #9555. main has refused on
this since both landed.

Neither PR was wrong and no review could have caught it. #9555 (deb0db8,
14:20:43) removed primary_path because the callee now derives the primary
from git's own roster. #9563 (15aa14b, 14:21:01) ADDED this caller as a
new file eighteen seconds later, built on a base that still carried the
five-parameter signature. There was never a diff containing both halves.

The field goes with the argument. Its only production read was the call
site; deleting just the argument would leave primary_path derived at
construction, asserted by a witness, and read by nobody -- dead data in a
typed carrier. Its purpose was to protect a callee parameter that no
longer exists.

The witness conjunct goes too and loses no coverage: the construction set
primary_path from repo, so the assertion that primary_path equals the srv1
repo root only restated the assertion that repo equals it, one line above.

Both annotation blocks are rewritten rather than renumbered. The first
asserted a five-string signature. The second explained a derivation this
module no longer performs, and had already named git's roster as the
stronger construction belonging to the module that owns the adjudication --
which is exactly what #9555 implemented.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
@gunbai-bot

gunbai-bot Bot commented Aug 28, 2026

Copy link
Copy Markdown
Contributor Author

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant