fleetd #474 follow-up: pin main's config wiring against M2 #476
Closed
agent
wants to merge 0 commits from
worker/474-followup-source-pin-f54a55-17 into main
pull from: worker/474-followup-source-pin-f54a55-17
merge into: fleet:main
fleet:main
fleet:worker/fleetd-612-unita-87807e-1
fleet:worker/612-b3-mcpwirings-da2b58-3
fleet:worker/612-b2-cb185-176d3a-2
fleet:worker/612-b1-completion-457459-1
fleet:worker/612-agaps-73a926-2
fleet:worker/608-sleeps-3a64ff-3
fleet:worker/621-b4520b-1
fleet:worker/618-b83894-2
fleet:worker/fleetd-615-e05481-5
fleet:worker/lead-autocompact-5f1ab2-3
fleet:worker/fleetd-613-f85deb-3
fleet:worker/fleetd-608-flaky-nudge-test-d0c2d1-3
fleet:worker/lead-context-gauge-ad404f-1
fleet:worker/gauge-wiring-9158c1-4
fleet:worker/redeploy-slowstart-ead0e5-5
fleet:worker/charter-bytes-13668c-6
fleet:worker/rollover-outcome-291483-2
fleet:worker/589-f64303-2
fleet:worker/593-1a8025-5
fleet:worker/589-fcd2aa-1
fleet:worker/568-9fdaa2-3
fleet:worker/571-attempted-outcome-5739f7-2
fleet:worker/581-completionresolver-cas-sites-0542b7-6
fleet:worker/562-loop-health-wiring-test-99611c-5
fleet:worker/562-surface-loop-health-7df5cc-4
fleet:worker/575-waiter-cleanup-sites-62ad80-1
fleet:worker/572-answer-lock-release-46a9ae-5
fleet:worker/567-probe-channel-leak-a38fc5-6
fleet:worker/551-record-before-send-7cbf56-1
fleet:worker/561-listener-fanout-survives-a-throw-61d538-2
fleet:worker/555-redeploy-main-flow-seam-65c2f5-2
fleet:worker/556-injector-owns-registration-e027a5-1
fleet:worker/552-post-restart-mktemp-abort-bc2672-4
fleet:worker/553-onstatus-completion-leak-0da881-2
fleet:worker/550-shasum-linux-196132-1
fleet:worker/538-loop-dies-on-error-4a5eeb-6
fleet:worker/426-health-coverage-ef1fd4-4
fleet:worker/504-failed-reported-clean-3cfd66-3
fleet:worker/537-capturedlog-close-e4c437-2
fleet:worker/459-broken-link-targets-cadc17-5
fleet:worker/535-appender-leak-fe74c1-1
fleet:worker/512-part2-shutdown-detection-434701-9
fleet:worker/529-logger-level-sweep-2a5533-8
fleet:worker/528-drain-gate-call-site-5de83d-7
fleet:charter/forge-mcp-vs-token
fleet:worker/521-swap-guard-unpinned-28e931-5
fleet:worker/519-probe-test-harness-d25ab8-4
fleet:worker/525-logger-level-leak-1b4eb0-6
fleet:worker/518-fleetmcp-resolver-wiring-8ef96c-1
fleet:worker/512-drain-complete-line-7edd71-3
fleet:worker/517-abort-branch-and-jar-id-41b641-2
fleet:worker/500-9e52c9-3
fleet:worker/509-4912f4-2
fleet:worker/511-9a4b23-1
fleet:worker/493-479f45-2
fleet:worker/505-03f8b2-1
fleet:worker/492-followup-detect-unclear
fleet:worker/501-a31fa0-7
fleet:worker/498-451d1c-5
fleet:worker/494-1015ce-2
fleet:worker/492-209647-1
fleet:worker/489-001902-2
fleet:worker/480-relative-handover-path-906323-1
fleet:worker/480-b-handover-skill-45bf1f-5
fleet:worker/474-charter-check-on-reload-f54a55-17
fleet:worker/466-quarantine-repeatcount-report
fleet:worker/393-opencode-skill-seeding-71854b-13
fleet:worker/469-canonical-tool-names-2a472a-16
fleet:worker/466-quarantine-escalation-5ae9c1-15
fleet:worker/446-hot-exhausted-pattern-0af580-6
fleet:worker/464-charter-tool-name-guard-a85635-12
fleet:worker/463-listfleet-default-fails-open-f1c76c-11
fleet:worker/458-invariant-5-by-purpose-862f9a-10
fleet:worker/439-coordinator-row-gate-bc032a-8
fleet:worker/449-herdr-protocol-576015-4
fleet:worker/450-abstract-spawn-599e1c-5
fleet:worker/437-ack-refuses-177d91-1
fleet:worker/444-placement-window-feb56a-2
fleet:worker/440-helddurable-derived-d462d7-13
fleet:worker/425-rework-placement-resolve-c58ba1-9
fleet:worker/421-lead-peek-held-msgs-cdbad2-10
fleet:worker/435-fixed-policy-cap-fe11de-12
fleet:worker/422-gate-state-observability-9e79d6-11
fleet:worker/431-memberregistry-live-readers-cdbad2-10
fleet:worker/424-architect-slot-hot-038b41-7
fleet:worker/422-model-gate-spawn-c29f48-6
fleet:worker/425-default-profile-live-f55534-8
fleet:worker/415-coverage-wording-2cbf9c-5
fleet:worker/416-3ad1da-1
fleet:worker/418-588283-3
fleet:worker/deterministic-stamp-race-409-3cb7b6-10
fleet:worker/armed-reads-live-config-404-ed931f-9
fleet:worker/reply-peer-refusal-391-5a34bd-7
fleet:worker/models-allowlist-aa9e9b-3
fleet:worker/ttl-stamp-race-399-f1122f-8
fleet:worker/scrub-receipt-400-316b3e-5
fleet:worker/exhaustion-detection-395-105105-6
fleet:worker/scrub-abort-394-316b3e-5
fleet:fix/scrub-uid-abort
fleet:worker/task-scrub-517574-2
fleet:worker/t386-clock-bd5b78-4
fleet:worker/t384-scrub-813790-5
fleet:worker/t381-cc-748314-2
fleet:worker/t373-336973-2
fleet:worker/t365-3920c5-3
fleet:worker/t358-6e989b-1
fleet:worker/t355-8b321c-1
fleet:worker/fleetd-369-hermetic-git-tests-e8b19a-3
fleet:worker/fleetd-368-stale-lead-binding-f5682e-2
fleet:worker/fleetd-360-deploy-units-0d3793-1
fleet:worker/359-dead-lead-tabs-f1253b-4
fleet:worker/362-worktree-skills-c03e51-3
fleet:worker/361-coord-visibility-655144-1
fleet:362-plugin-visibility-and-drift
fleet:worker/errscan-bed2ca-2
fleet:worker/amqp-log-identity-bed2ca-2
fleet:worker/withdefaults-guard-561704
fleet:worker/sleepguard-82076d-1
fleet:worker/fd334-9ee1b6-5
fleet:worker/fd348-f1ab27-4
fleet:worker/fd335-a71c35-1
fleet:worker/fd342-174a17-2
fleet:worker/fd345-490d0f-3
fleet:worker/fleetd-337-5ec7d4-21
fleet:worker/fleetd-341-af5a6b-24
fleet:worker/fleetd-339-5ca0a2-23
fleet:worker/fleetd-338-83a4a1-22
fleet:worker/fleetd-333-281f46-18
fleet:worker/fleetd-329-11bdbb-16
fleet:worker/fleetd-330-2770fb-17
fleet:worker/fix-326-50506e-15
fleet:worker/fix-324-3e9bbf-14
fleet:worker/fix-323-b8287d-13
fleet:worker/fix-316b-bd0860-11
fleet:worker/fix-318-76ca36-9
fleet:worker/fix-317-486aec-8
fleet:worker/fix-315-ce47c5-6
fleet:worker/fix-307-275890-6
fleet:worker/fix-308-b4f664-7
fleet:worker/fix-309-ec3939-8
fleet:worker/fix-310-7a3974-9
fleet:worker/fix-302-52ad0e-9
fleet:worker/fix-298-ce1acb-8
fleet:worker/fix-297-66bd11-7
fleet:worker/fix-296-104622-6
fleet:worker/fix-293-bare-closetab-eb22b5-3
fleet:worker/fix-280-gone-ask-lapse-bca98e-2
fleet:worker/fix-290-reapidle-guard-coverage-9b0dd1-1
fleet:worker/fix-285-trust-seed-8f3565-10
fleet:worker/fix-284-backend-error-seat-85912c-11
fleet:worker/fix-282-chained-ask-e6d0bb-8
fleet:worker/fix-283-teardown-leaks-f40dfa-9
fleet:worker/fix-281-pin-handler-actions-4921ac-7
fleet:worker/audit-rendezvous-lifecycle-d072ae-2
fleet:worker/audit-health-placement-1a2476-6
fleet:worker/audit-teardown-exits-e207a5-3
fleet:worker/audit-launcher-asymmetry-27e370-4
fleet:worker/audit-rest-authz-6ca53c-5
fleet:worker/investigate-275-abandon-asking-fdef52-8
fleet:worker/fix-274-worktree-leak-b0095d-7
fleet:worker/fix-273-exhausted-pattern-9665b5-6
fleet:worker/fleetd-267-model-check-bd8068-1
fleet:worker/fleetd-131-archunit-18b834-7
fleet:worker/fleetd-266-sshagent-rename-a014ff-6
fleet:worker/fleetd-184-uid-claim-8e1f31-4
fleet:worker/fleetd-184-warn-b381ee-10
fleet:worker/fleetd-184-docs-be1d12-9
fleet:worker/fleetd-257-9bf010-7
fleet:worker/fleetd-103-23a113-6
fleet:worker/fleetd-247-342356-5
fleet:worker/fleetd-116-04dea8-4
fleet:worker/fleetd-252-a830e0-3
fleet:worker/fleetd-111-7e8673-9
fleet:worker/fleetd-155c-f8ef4b-8
fleet:worker/fleetd-176-b928ca-3
fleet:worker/fleetd-249-7a7878-2
fleet:worker/cb248-composition-root-b-9acdf7-15
fleet:worker/cb148-envrc-default-fa6c82-12
fleet:worker/cb201-unit5-wiring-6c12e6-8
fleet:worker/cb241-fallback-echo-1175e9-11
fleet:worker/cb149-trust-dialog-2392a5-9
fleet:worker/cb134-148-overlay-visible-c9b986-10
fleet:worker/cb234-session-id-keyed-04e1fc-1
fleet:worker/cb201-unit3-nudge-abdf5c-6
fleet:worker/cb201-unit2-policy-c1102c-5
fleet:worker/cb201-unit4-outcome-a13bfa-7
fleet:worker/cb201-unit1-classifier-91b9b1-4
fleet:worker/cb201-227-refine-831980-3
fleet:worker/cb175-model-readback-0f085f-1
fleet:worker/cb222-charter-tmpdir-17f013-1
fleet:worker/cb226-architect-slot-race-cd3aa8-3
fleet:worker/cb224-worktree-root-group-024523-2
fleet:worker/cb-123-role-demotion-c600f7-2
fleet:worker/cb-219-opencode-roots-1f677e-1
fleet:worker/cb214-claude-session-id-b9eab4-4
fleet:worker/cb213-zdotdir-wrong-process-dd6de4-3
fleet:worker/cb211-exhaustion-classification-9546e0-2
fleet:worker/cb137-ambiguous-task-4df3d8-4
fleet:worker/cb209-agentsessionid-4dfdb6-2
fleet:worker/cb185-hostenvnames-2692b5-3
fleet:worker/cb206-opencode-sqlite-128718-2
fleet:worker/cb185-worktree-group-fc0c99-1
fleet:worker/cb-137-ask-ticket-e7760c-2
fleet:worker/cb-172-broker-uri-d36ae4-4
fleet:worker/cb-175-model-readback-76ead6-3
fleet:worker/cb-161-pane-ancestry-293510-1
fleet:worker/cb-164-rebase-885863-8
fleet:worker/cb-164-empty-scrape-false-success-1a80af-3
fleet:fix/cb-197-ticket-ttl-from-completion
fleet:worker/cb-189-remote-url-coverage-4692f3-1
fleet:worker/cb-185-blockers-027756-4
fleet:worker/cb-192-gap-log-11b631-2
fleet:worker/cb-633-fix-5f4396-3
fleet:worker/cb185-router-d6436d-3
fleet:worker/cb185-router-routing-gaps-9e9d33-3
fleet:worker/cb185-paneids-992586-2
fleet:worker/cb-633-allow-list-union-ed374b-1
fleet:worker/cb-157-credential-in-remote-url-496e44-2
fleet:worker/cb-641-health-herdr-evidence-8f1f54-6
fleet:worker/cb-640-health-msg-evidence-99c9cd-1
fleet:worker/cb-642-fleets-status-skill-bbbc40-5
fleet:cb-634-ide-mcp
fleet:worker/lead-comms-wiring-c014b9-7
fleet:worker/lead-mailbox-c19577-6
fleet:worker/autocompact-window-82bc2f-5
fleet:worker/cb-634-probe-18056f-4
fleet:worker/cb635-broker-urienv
fleet:worker/cb-632-config-retry-8e0efa-7
fleet:lead/cb-622e-claude-md
fleet:lead/cb-622-followup
fleet:worker/cb-622a-165dff-1
fleet:lead/cb-622d-opencode-mount
fleet:worker/cb-622b-717c67-2
fleet:worker/cb-622c-ab7759-3
fleet:worker/cb-617b2-20ca4b-3
fleet:worker/cb-617a-5c2f4a-1
fleet:worker/cb596-4e49ef-3
fleet:worker/cb586-10500c-1
fleet:worker/cb-606-b9343a-25
fleet:worker/cb604-1445f8-24
fleet:worker/cb582-477374-21
fleet:worker/cb584-8c2281-22
fleet:worker/cb600-e6b9a9-20
fleet:worker/cb602-ce257f-19
fleet:worker/cb601-b42837-18
fleet:worker/cb598-6c7ba7-17
fleet:worker/cb599-740fe4-16
fleet:worker/cb597-282224-15
fleet:worker/cb590fix-185e9a-10
fleet:worker/cb528-recovery-race
fleet:worker/cb594-96bead-8
fleet:worker/cb590-916766-2
fleet:worker/cb527-997d99-3
fleet:worker/cb592-env-leak-3cbf9c-1
fleet:worker/cb588-async-ticket-nudge-3218f7-5
fleet:worker/cb578b-9dcb13-6
fleet:worker/cb581-d24826-5
fleet:worker/m2-u5-ef8c42-15
fleet:worker/cb578a-516499-2
fleet:worker/cb576-01a04b-17
fleet:worker/cb579-lead-tab-acba06-20
fleet:worker/cb580-terminal-health-ed6058-21
fleet:worker/cb577-f36fdc-18
fleet:worker/cb573b-3db06f-16
fleet:worker/cb568c-f36fdc-18
fleet:worker/cb568-drop-cause-c3ac1c
fleet:worker/cb575-cancelled-notification-c3ac1c
fleet:worker/m4-sol-a2cbec-3
fleet:worker/cb574-async-ask-c3ac1c
fleet:worker/cb573-health-model-8ca857-14
fleet:worker/cb572-unknown-target-7f2e35-13
fleet:worker/u4-700706-9
fleet:worker/u3-b9fcb6-6
fleet:worker/u2-ef5b68-4
fleet:worker/u1-469dce-1-clean
fleet:worker/u1-469dce-1
fleet:worker/cb-564-health-events-70cf7e-2
fleet:worker/cb-565-recycle-drops-role-98e58f-3
fleet:worker/cb-563-missing-reply-df2866-1
fleet:worker/cb-562-readiness-gate-silent-6c23c9-3
fleet:worker/cb-560-architect-presence-da8155-1
fleet:worker/cb-561-architect-silent-off-a71cab-2
fleet:worker/cb-548-bind-architect-slot-fe1b8c-1
fleet:worker/parity-overlay-settings-5fb711-1
fleet:secrets-central-store
fleet:cb-559-hot-key-correction
fleet:cb-557-fleet-role-pools
fleet:worker/cb-553-maxload-explicit-spawn-305ee3-6
fleet:worker/cb-551-idle-lead-heartbeat-f1633c-1
fleet:worker/cb-544-drain-preserves-worktree-925fad-3
fleet:worker/cb-552-docs-sync-1cb9cf-4
fleet:worker/cb-548-rendezvous-guard-rebased
fleet:worker/cb-548-rendezvous-guard-116b53-10
fleet:worker/cb-548-authz-v2-586df6-8
fleet:worker/cb-548-authz-264363-5
fleet:salvage/cb-528b-codex-home
fleet:salvage/cb-528a-codex-launcher
fleet:CB-518-primary-flow
fleet:feature/peer-launcher-spi
fleet:cb-103-injector
No Reviewers
Labels
Clear labels
blocked
needs-live-proof
ready-to-delegate
silent-default
Cannot start until something else lands. The body says what.
Merged and green, but never shown working on the running daemon. Not the same as done.
Scope, files and acceptance criteria are written. A worker can be briefed from the body alone.
A feature that compiles, passes tests, and ships turned off. Nine recurrences and counting.
No Label
Milestone
No items
No Milestone
Projects
Clear projects
No project
Notifications
Due Date
No due date set.
Dependencies
No dependencies set.
Reference: fleet/fleetd#476
Reference in New Issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Delete Branch "worker/474-followup-source-pin-f54a55-17"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Follow-up to #474/#475 (merged as
4466ee0onmain). Your mutation battery on the merged commit found M2 survives: revertingFleetd.java:154from the three-argumentConfigRefconstructor back to the plain two-argument one compiles with 0 errors and leaves the whole suite green, becauseConfigRefTestandFleetdConfigRefCharterToolSurfaceWiringTesteach build their ownConfigRefdirectly rather than throughFleetd.main. This PR closes that hole with one new source-text test file. No production code changed.What I added
fleetd/src/test/java/dev/ltms/fleet/FleetdConfigRefWiringTest.java, following theFleetdBackendQuarantineWiringTest/FleetdLeadSeatWiringTest/FleetdCompletionResolverWiringTestpattern (Pattern 2: readFleetd.java's source text and assertmainstill contains the exact call) rather than theFleetdExhaustionDetectionArmedWiringTestpattern (Pattern 1: build the same wiring and drive it) I'd used before, which — as you pointed out — can prove the combination works but can never provemainchose it.The test:
src/main/java/dev/ltms/fleet/Fleetd.javaas a string (fleetdSource(), identical helper shape to the three precedents)."public final class Fleetd"— an anchor unrelated to this mutation — so a broken/empty read fails loudly here instead of making theassertFalsebelow pass vacuously. (Your "zero match reads as a clean pass" trap.)ConfigRef config = new ConfigRef(configPath, cfg, Fleetd::assertChartersNameOnlyRegisteredTools);.ConfigRef config = new ConfigRef(configPath, cfg);(the M2 form) at that declaration.@DisplayNamestarting[SOURCE TEXT], and a javadoc stating plainly what a green result proves and does not: the exact text is present, not that the call executes at startup, not that the gate works.Acceptance criteria
1.
mvn -B clean testis green, counts read from a file, never a piped tail.Initial run with the new test added (source untouched):
Tests run: 1634, Failures: 0, Errors: 0, Skipped: 0—BUILD SUCCESS—EXIT_CODE=0(1633 baseline + 1 new test).2. Proof the new test kills M2. Applied your exact mutation — changed
Fleetd.java:154from the 3-arg form tonew ConfigRef(configPath, cfg);— and ran the full suite:Only that one test failed — the new source-text check, by name, exactly as intended. Restored
Fleetd.java:154byte-identical (git diff --stat -- fleetd/src/main/java/dev/ltms/fleet/Fleetd.javacame back empty) and reran:Tests run: 1634, Failures: 0, Errors: 0, Skipped: 0—BUILD SUCCESS—EXIT_CODE=0.git status --porcelainat that point showed only the new test file as untracked — nothing else touched.3. Proof the new test is not vacuous. Reflowed the anchored line — same tokens, split across two lines with different whitespace, behaviour byte-identical at runtime:
Ran just the new test class:
Tests run: 1, Failures: 1—dev.ltms.fleet.FleetdConfigRefWiringTest.mainStillWiresTheThreeArgumentConfigRefConstructorfailed,EXIT_CODE=1. This is the expected/intended result, not tolerated: the test's whole value is reading the exact textmaincontains, so it must go red the moment that text moves, the same tradeFleetdBackendQuarantineWiringTest's multi-line anchor already makes. I did not add reflow-tolerance — that would reopen a gap the precedent already accepts closing this way. Restored the line byte-identical afterward (git diff --statonFleetd.javaempty again) and reran the full suite green (see acceptance criterion 1's final number below).4. What else pins
Fleetd.java:154? Nothing, checked directly:grep -rln "Fleetd::assertChartersNameOnlyRegisteredTools" fleetd/src/test/javareturns onlyFleetdConfigRefCharterToolSurfaceWiringTest.java(builds its ownConfigRefwith that reference, doesn't readmain's source) and this newFleetdConfigRefWiringTest.java.grep -rln 'Path.of("src/main/java/dev/ltms/fleet/Fleetd.java")' fleetd/src/test/javalists the other six source-text tests (FleetdFleetAppConstructionTest,FleetdCompletionResolverWiringTest,FleetdLeadSeatWiringTest,FleetdConnectionIdentityConstructionTest,FleetdHerdrControlConstructionTest,FleetdBackendQuarantineWiringTest, plus this one) — I checked the three not already discussed for any incidentalConfigRefmention (grep -n "ConfigRef"on each) and found none. So this new test is the only thing pinning this call site.Final build
mvn -B clean test, unpiped, exit code read from the log file:Tests run: 1634, Failures: 0, Errors: 0, Skipped: 0—BUILD SUCCESS—EXIT_CODE=0.Files changed
fleetd/src/test/java/dev/ltms/fleet/FleetdConfigRefWiringTest.java(new) — only file in this PR.Caveats
wiki/is uninitialized in this worker's worktree.origin/main(post-merge, at4466ee0) rather than continuing the oldworker/474-charter-check-on-reload-f54a55-17branch, since that one was already merged; noting this in case the branch name looks unfamiliar.Merged locally as
49a404dand pushed.git rev-list --count origin/main..HEAD= 0,origin/main=49a404d. Closing this PR by hand — a local--no-ffmerge does not close a Gitea PR.I re-ran the battery myself on the merge commit, not on your branch. Tree
701bf041fb19c38701a9d8eb4874b7677149053e, load{ 3.23 7.02 5.46 }, each cell a fullmvn -B clean test, every count read from a file.CONTROL 0 — the shape
The
2is mine, not yours: the path stringsrc/main/java/dev/ltms/fleet/Fleetd.javalegitimately appears twice in your file — once infleetdSource()and once inside the guard's own assertion message. My expected value was wrong; the cell still stands because every other line is independently checked. That is the third battery in a row where my own "must be N" annotation was wrong and the cell survived only because it had a second proof. Recording it here rather than quietly fixing it.CONTROL 1 — the unmutated merge
M2r — reproduce the survivor
Fleetd.java:154back tonew ConfigRef(configPath, cfg);. Mutation proved applied two ways: 3-arg form left = 0, 2-arg form present = 1.KILLED, by name, and by the negative assertion. On the previous merge this exact mutation left 1633 green with the live reload gate off. That is the whole point of this PR and it is now closed.
M3v — is the anchor real?
Reflowed the anchored call onto two lines. Same tokens, byte-identical behaviour; only the source text moves. Proved applied two ways: still calls the 3-arg ctor = 1 (behaviour unchanged), one-line form left = 0 (text moved).
Fails loudly. The test is reading the real text, not passing on a scrape that found nothing. Your criterion-3 answer — that a reflow should break it, and you would not add reflow tolerance — is the right call and I am not asking you to change it.
M4g — does the vacuity guard work?
Pointed
fleetdSource()at a path that does not exist.Read this precisely, because the result is not quite what the cell asked for. The test fails loudly and by name, which is what matters — the silent-pass case is closed. But it fails as an Error, not a Failure, and the guard's own message never printed:
Files.readStringthrewNoSuchFileExceptionbefore any assertion ran. So this cell proves a missing file cannot pass silently. It does not exercise the guard, because the guard only earns its keep when the read succeeds and returns the wrong thing — a truncated file, or a right-shaped file at a wrong path. I am not asking for another test; I am recording that the guard is still unproven against that narrower case, so nobody later reads M4g as proof that it works.Where this leaves the shape
This is the fifth
Fleetd.maincall site to survive a battery here (#446 M5/M7, #466 M1, #474 M2) and the pattern is now settled: extracting a check into a well-tested helper moves the untested surface up, into the one line that chooses to call it. Your own read of the two sibling patterns was correct and is the reason this took one small PR instead of a rediscovery — and branching fresh from4466ee0rather than reusing the merged branch gave the merge one merge base and an 80-line single-file diff.Pull request closed