Fleetd.java: sweep every constructor-arg wiring site and report which ones no test would notice being rewired #587
Open
opened 2026-09-12 15:57:01 +02:00 by ltms
·
2 comments
No Branch/Tag Specified
main
worker/fleetd-612-unita-87807e-1
worker/612-b3-mcpwirings-da2b58-3
worker/612-b2-cb185-176d3a-2
worker/612-b1-completion-457459-1
worker/612-agaps-73a926-2
worker/608-sleeps-3a64ff-3
worker/621-b4520b-1
worker/618-b83894-2
worker/fleetd-615-e05481-5
worker/lead-autocompact-5f1ab2-3
worker/fleetd-613-f85deb-3
worker/fleetd-608-flaky-nudge-test-d0c2d1-3
worker/lead-context-gauge-ad404f-1
worker/gauge-wiring-9158c1-4
worker/redeploy-slowstart-ead0e5-5
worker/charter-bytes-13668c-6
worker/rollover-outcome-291483-2
worker/589-f64303-2
worker/593-1a8025-5
worker/589-fcd2aa-1
worker/568-9fdaa2-3
worker/571-attempted-outcome-5739f7-2
worker/581-completionresolver-cas-sites-0542b7-6
worker/562-loop-health-wiring-test-99611c-5
worker/562-surface-loop-health-7df5cc-4
worker/575-waiter-cleanup-sites-62ad80-1
worker/572-answer-lock-release-46a9ae-5
worker/567-probe-channel-leak-a38fc5-6
worker/551-record-before-send-7cbf56-1
worker/561-listener-fanout-survives-a-throw-61d538-2
worker/555-redeploy-main-flow-seam-65c2f5-2
worker/556-injector-owns-registration-e027a5-1
worker/552-post-restart-mktemp-abort-bc2672-4
worker/553-onstatus-completion-leak-0da881-2
worker/550-shasum-linux-196132-1
worker/538-loop-dies-on-error-4a5eeb-6
worker/426-health-coverage-ef1fd4-4
worker/504-failed-reported-clean-3cfd66-3
worker/537-capturedlog-close-e4c437-2
worker/459-broken-link-targets-cadc17-5
worker/535-appender-leak-fe74c1-1
worker/512-part2-shutdown-detection-434701-9
worker/529-logger-level-sweep-2a5533-8
worker/528-drain-gate-call-site-5de83d-7
charter/forge-mcp-vs-token
worker/521-swap-guard-unpinned-28e931-5
worker/519-probe-test-harness-d25ab8-4
worker/525-logger-level-leak-1b4eb0-6
worker/518-fleetmcp-resolver-wiring-8ef96c-1
worker/512-drain-complete-line-7edd71-3
worker/517-abort-branch-and-jar-id-41b641-2
worker/500-9e52c9-3
worker/509-4912f4-2
worker/511-9a4b23-1
worker/493-479f45-2
worker/505-03f8b2-1
worker/492-followup-detect-unclear
worker/501-a31fa0-7
worker/498-451d1c-5
worker/494-1015ce-2
worker/492-209647-1
worker/489-001902-2
worker/480-relative-handover-path-906323-1
worker/480-b-handover-skill-45bf1f-5
worker/474-followup-source-pin-f54a55-17
worker/474-charter-check-on-reload-f54a55-17
worker/466-quarantine-repeatcount-report
worker/393-opencode-skill-seeding-71854b-13
worker/469-canonical-tool-names-2a472a-16
worker/466-quarantine-escalation-5ae9c1-15
worker/446-hot-exhausted-pattern-0af580-6
worker/464-charter-tool-name-guard-a85635-12
worker/463-listfleet-default-fails-open-f1c76c-11
worker/458-invariant-5-by-purpose-862f9a-10
worker/439-coordinator-row-gate-bc032a-8
worker/449-herdr-protocol-576015-4
worker/450-abstract-spawn-599e1c-5
worker/437-ack-refuses-177d91-1
worker/444-placement-window-feb56a-2
worker/440-helddurable-derived-d462d7-13
worker/425-rework-placement-resolve-c58ba1-9
worker/421-lead-peek-held-msgs-cdbad2-10
worker/435-fixed-policy-cap-fe11de-12
worker/422-gate-state-observability-9e79d6-11
worker/431-memberregistry-live-readers-cdbad2-10
worker/424-architect-slot-hot-038b41-7
worker/422-model-gate-spawn-c29f48-6
worker/425-default-profile-live-f55534-8
worker/415-coverage-wording-2cbf9c-5
worker/416-3ad1da-1
worker/418-588283-3
worker/deterministic-stamp-race-409-3cb7b6-10
worker/armed-reads-live-config-404-ed931f-9
worker/reply-peer-refusal-391-5a34bd-7
worker/models-allowlist-aa9e9b-3
worker/ttl-stamp-race-399-f1122f-8
worker/scrub-receipt-400-316b3e-5
worker/exhaustion-detection-395-105105-6
worker/scrub-abort-394-316b3e-5
fix/scrub-uid-abort
worker/task-scrub-517574-2
worker/t386-clock-bd5b78-4
worker/t384-scrub-813790-5
worker/t381-cc-748314-2
worker/t373-336973-2
worker/t365-3920c5-3
worker/t358-6e989b-1
worker/t355-8b321c-1
worker/fleetd-369-hermetic-git-tests-e8b19a-3
worker/fleetd-368-stale-lead-binding-f5682e-2
worker/fleetd-360-deploy-units-0d3793-1
worker/359-dead-lead-tabs-f1253b-4
worker/362-worktree-skills-c03e51-3
worker/361-coord-visibility-655144-1
362-plugin-visibility-and-drift
worker/errscan-bed2ca-2
worker/amqp-log-identity-bed2ca-2
worker/withdefaults-guard-561704
worker/sleepguard-82076d-1
worker/fd334-9ee1b6-5
worker/fd348-f1ab27-4
worker/fd335-a71c35-1
worker/fd342-174a17-2
worker/fd345-490d0f-3
worker/fleetd-337-5ec7d4-21
worker/fleetd-341-af5a6b-24
worker/fleetd-339-5ca0a2-23
worker/fleetd-338-83a4a1-22
worker/fleetd-333-281f46-18
worker/fleetd-329-11bdbb-16
worker/fleetd-330-2770fb-17
worker/fix-326-50506e-15
worker/fix-324-3e9bbf-14
worker/fix-323-b8287d-13
worker/fix-316b-bd0860-11
worker/fix-318-76ca36-9
worker/fix-317-486aec-8
worker/fix-315-ce47c5-6
worker/fix-307-275890-6
worker/fix-308-b4f664-7
worker/fix-309-ec3939-8
worker/fix-310-7a3974-9
worker/fix-302-52ad0e-9
worker/fix-298-ce1acb-8
worker/fix-297-66bd11-7
worker/fix-296-104622-6
worker/fix-293-bare-closetab-eb22b5-3
worker/fix-280-gone-ask-lapse-bca98e-2
worker/fix-290-reapidle-guard-coverage-9b0dd1-1
worker/fix-285-trust-seed-8f3565-10
worker/fix-284-backend-error-seat-85912c-11
worker/fix-282-chained-ask-e6d0bb-8
worker/fix-283-teardown-leaks-f40dfa-9
worker/fix-281-pin-handler-actions-4921ac-7
worker/audit-rendezvous-lifecycle-d072ae-2
worker/audit-health-placement-1a2476-6
worker/audit-teardown-exits-e207a5-3
worker/audit-launcher-asymmetry-27e370-4
worker/audit-rest-authz-6ca53c-5
worker/investigate-275-abandon-asking-fdef52-8
worker/fix-274-worktree-leak-b0095d-7
worker/fix-273-exhausted-pattern-9665b5-6
worker/fleetd-267-model-check-bd8068-1
worker/fleetd-131-archunit-18b834-7
worker/fleetd-266-sshagent-rename-a014ff-6
worker/fleetd-184-uid-claim-8e1f31-4
worker/fleetd-184-warn-b381ee-10
worker/fleetd-184-docs-be1d12-9
worker/fleetd-257-9bf010-7
worker/fleetd-103-23a113-6
worker/fleetd-247-342356-5
worker/fleetd-116-04dea8-4
worker/fleetd-252-a830e0-3
worker/fleetd-111-7e8673-9
worker/fleetd-155c-f8ef4b-8
worker/fleetd-176-b928ca-3
worker/fleetd-249-7a7878-2
worker/cb248-composition-root-b-9acdf7-15
worker/cb148-envrc-default-fa6c82-12
worker/cb201-unit5-wiring-6c12e6-8
worker/cb241-fallback-echo-1175e9-11
worker/cb149-trust-dialog-2392a5-9
worker/cb134-148-overlay-visible-c9b986-10
worker/cb234-session-id-keyed-04e1fc-1
worker/cb201-unit3-nudge-abdf5c-6
worker/cb201-unit2-policy-c1102c-5
worker/cb201-unit4-outcome-a13bfa-7
worker/cb201-unit1-classifier-91b9b1-4
worker/cb201-227-refine-831980-3
worker/cb175-model-readback-0f085f-1
worker/cb222-charter-tmpdir-17f013-1
worker/cb226-architect-slot-race-cd3aa8-3
worker/cb224-worktree-root-group-024523-2
worker/cb-123-role-demotion-c600f7-2
worker/cb-219-opencode-roots-1f677e-1
worker/cb214-claude-session-id-b9eab4-4
worker/cb213-zdotdir-wrong-process-dd6de4-3
worker/cb211-exhaustion-classification-9546e0-2
worker/cb137-ambiguous-task-4df3d8-4
worker/cb209-agentsessionid-4dfdb6-2
worker/cb185-hostenvnames-2692b5-3
worker/cb206-opencode-sqlite-128718-2
worker/cb185-worktree-group-fc0c99-1
worker/cb-137-ask-ticket-e7760c-2
worker/cb-172-broker-uri-d36ae4-4
worker/cb-175-model-readback-76ead6-3
worker/cb-161-pane-ancestry-293510-1
worker/cb-164-rebase-885863-8
worker/cb-164-empty-scrape-false-success-1a80af-3
fix/cb-197-ticket-ttl-from-completion
worker/cb-189-remote-url-coverage-4692f3-1
worker/cb-185-blockers-027756-4
worker/cb-192-gap-log-11b631-2
worker/cb-633-fix-5f4396-3
worker/cb185-router-d6436d-3
worker/cb185-router-routing-gaps-9e9d33-3
worker/cb185-paneids-992586-2
worker/cb-633-allow-list-union-ed374b-1
worker/cb-157-credential-in-remote-url-496e44-2
worker/cb-641-health-herdr-evidence-8f1f54-6
worker/cb-640-health-msg-evidence-99c9cd-1
worker/cb-642-fleets-status-skill-bbbc40-5
cb-634-ide-mcp
worker/lead-comms-wiring-c014b9-7
worker/lead-mailbox-c19577-6
worker/autocompact-window-82bc2f-5
worker/cb-634-probe-18056f-4
worker/cb635-broker-urienv
worker/cb-632-config-retry-8e0efa-7
lead/cb-622e-claude-md
lead/cb-622-followup
worker/cb-622a-165dff-1
lead/cb-622d-opencode-mount
worker/cb-622b-717c67-2
worker/cb-622c-ab7759-3
worker/cb-617b2-20ca4b-3
worker/cb-617a-5c2f4a-1
worker/cb596-4e49ef-3
worker/cb586-10500c-1
worker/cb-606-b9343a-25
worker/cb604-1445f8-24
worker/cb582-477374-21
worker/cb584-8c2281-22
worker/cb600-e6b9a9-20
worker/cb602-ce257f-19
worker/cb601-b42837-18
worker/cb598-6c7ba7-17
worker/cb599-740fe4-16
worker/cb597-282224-15
worker/cb590fix-185e9a-10
worker/cb528-recovery-race
worker/cb594-96bead-8
worker/cb590-916766-2
worker/cb527-997d99-3
worker/cb592-env-leak-3cbf9c-1
worker/cb588-async-ticket-nudge-3218f7-5
worker/cb578b-9dcb13-6
worker/cb581-d24826-5
worker/m2-u5-ef8c42-15
worker/cb578a-516499-2
worker/cb576-01a04b-17
worker/cb579-lead-tab-acba06-20
worker/cb580-terminal-health-ed6058-21
worker/cb577-f36fdc-18
worker/cb573b-3db06f-16
worker/cb568c-f36fdc-18
worker/cb568-drop-cause-c3ac1c
worker/cb575-cancelled-notification-c3ac1c
worker/m4-sol-a2cbec-3
worker/cb574-async-ask-c3ac1c
worker/cb573-health-model-8ca857-14
worker/cb572-unknown-target-7f2e35-13
worker/u4-700706-9
worker/u3-b9fcb6-6
worker/u2-ef5b68-4
worker/u1-469dce-1-clean
worker/u1-469dce-1
worker/cb-564-health-events-70cf7e-2
worker/cb-565-recycle-drops-role-98e58f-3
worker/cb-563-missing-reply-df2866-1
worker/cb-562-readiness-gate-silent-6c23c9-3
worker/cb-560-architect-presence-da8155-1
worker/cb-561-architect-silent-off-a71cab-2
worker/cb-548-bind-architect-slot-fe1b8c-1
worker/parity-overlay-settings-5fb711-1
secrets-central-store
cb-559-hot-key-correction
cb-557-fleet-role-pools
worker/cb-553-maxload-explicit-spawn-305ee3-6
worker/cb-551-idle-lead-heartbeat-f1633c-1
worker/cb-544-drain-preserves-worktree-925fad-3
worker/cb-552-docs-sync-1cb9cf-4
worker/cb-548-rendezvous-guard-rebased
worker/cb-548-rendezvous-guard-116b53-10
worker/cb-548-authz-v2-586df6-8
worker/cb-548-authz-264363-5
salvage/cb-528b-codex-home
salvage/cb-528a-codex-launcher
CB-518-primary-flow
feature/peer-launcher-spi
cb-103-injector
v1.1.0
v1.0.0
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#587
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 "%!s()"
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?
Read-only sweep. Change nothing. Follow-up to #562, where a merged PR shipped five green tests
that proved nothing about
Fleetd.java's own wiring, and to a finding from the fleet01 lead.Why this exists
Fleetd.javabuilds the whole daemon by passing method references into constructors. Each suchargument is a wiring decision: this collaborator's method is what that component will call. Point it
at the wrong object, or at a constant, and the daemon still compiles, still starts, and still passes
almost every test — because most tests build their own object graph instead of using the one
Fleetd.javabuilds.#562 is the worked example. Five tests covered
LoopHealthSource. All five constructed their ownLoopHealthSource, so replacingpoller::healthinFleetd.javawith a constant left all fivegreen. The fix was to extract a package-private factory that
Fleetd.javaactually calls, and testthat.
A TEST THAT SUPPLIES ITS OWN DEPENDENCY IS STRUCTURALLY ZERO EVIDENCE ABOUT THE PRODUCER. It
tests the consumer. That is not a weak test — it is a test of a different thing, and it looks
identical in a coverage report.
Measured starting point (
main49a5875)Wiring-style tests that exist today — 10 for
Fleetd, plus 2 elsewhere:FleetdBackendQuarantine,FleetdCapacitySource,FleetdCompletionResolver,FleetdConfigRefCharterToolSurface,FleetdConfigRef,FleetdExhaustionDetectionArmed,FleetdHealthCoverageSource,FleetdLeadRollover,FleetdLeadSeat,FleetdLoopHealthSource(+
HerdrPeerLauncherAllowList,IdleSleepGuard).Method references passed inside
Fleetd.java, JDK and stream-plumbing ones removed(
System::nanoTime×12,System::getenv×2,Map::of,LinkedHashSet::new,Entry::getKey,MemberSession::profile,Profile::profile):16 distinct references, 23 occurrences. These counts are a starting point, not the answer. Re-run
the greps yourself — a reference can also be wired as a lambda (
() -> x.y()) or a constructorargument that is not a method reference at all, and those are wiring sites too. Say in your report
what your sweep could not see.
The work
For every wiring site in
Fleetd.java, answer one question:Answer it by doing it, not by reading test names.
::references.Fleetd.javain place so the wiring is wrong but the code stillcompiles. The cheapest reliable form is replacing the reference with a constant or a no-op
(
() -> LoopWatchdog.State.RUNNING,_ -> null, and so on).SURVIVED.shasum -a 256must match the pristine value you captured first.Acceptance
you applied, and either the named test that went red or
SURVIVED.SURVIVEDrow is a finding. For each, say in one sentence what would break inproduction if that wiring were wrong, so the lead can rank them.
mvn -o -B -q compilebefore reading any test output. A build that fails tocompile is not a survivor and not a kill — it proves nothing, and
BUILD FAILURElooks like akill if you do not check.
shasum -a 256ofFleetd.javaand the same value after your last restore.git status --shortmust be clean at the end.profile is 1789 on
main49a5875.fixes are separate tickets the lead will file from your table.
as measured is worse than no report. A partial table with an honest gap list is a good result.
Notes for whoever takes this
FleetdCapacitySourceWiringTestmay or may not pinFleetd.java's ownwiring; that is exactly what this sweep is for. #562's five tests were named perfectly and proved
nothing.
less, because you cannot tell which test was actually pinning that site.
sessions::rosterappears 6 times andpoller::healthtwice. Those are separate sites and eachneeds its own row — one invariant maintained at N places needs N assertions.
Delegated, split in two. Both workers are read-only and must open no PR.
Pristine
Fleetd.javaonmain49a5875— both workers must restore to this exact value:The split
Part A — lines 158 to 505 (ticket
587a, branchworker/587a-85090a-1)new ConfigRef(configPath, cfg, Fleetd::assertChartersNameOnlyRegisteredTools)ExhaustionSink.forwardingTo(exhaustionSinkRef::get)() -> config.get().memberCredentials(),null,config::get() -> config.get().memberCredentials(),config::get,forwardingExhaustionSinknew IdleSleepGuard(new CaffeinateSleepAssertionMechanism(), sessions::size)backendErrorPatternLookup(sessions::roster, …)outagePolicy, pushLoopRef::getworktreeBranchLookup(sessions::roster)presence::forgetandcompletion::register— two rows, one linePart B — lines 512 to 888 (ticket
587b, branchworker/587b-28851f-2)selectReplyInbox(cfg.broker(), System.getenv(), AmqpReplyInbox::open)openLeadMailbox(cfg.coordinator(), System.getenv(), LeadMailbox::open)new LeadHeartbeatLoop(…, sessions::roster, …)new FleetHealthMonitor(agents, sessions::roster, messages, healthScheduler, …)messages::abandonsessions.onAcquire(replyInbox::own)exhaustedPatterns::armedand theprofile -> {…}lambda — two rows, one linereasonByCredential::getLines 1049, 1085 and 1380 are javadoc mentions, not wiring. Line 1065 is inside
loopHealthSource(StatusPoller, SessionReaper), the factory #562 extracted and already pinned byFleetdLoopHealthSourceWiringTest; both workers are told to skip it.Why the split is by line range and not by component
The two workers share one file. Line ranges are the only boundary that cannot overlap, and each
mutates in its own provisioned worktree, so neither can see the other's edit. Splitting by component
would have put
sessions::roster— six occurrences spread from 444 to 588 — on both sides of theboundary.
One instruction added to Part B that is not in Part A
Lines 512 and 518 wire broker openers and 556/588 wire live loops. If a mutation there makes a test
hang rather than fail, the worker records
INCONCLUSIVE — mutation hangswith the mutation textand moves on. A hang is a third outcome. Counting it as
SURVIVEDwould invent a finding, andwaiting it out spends the whole turn on one row.
Both briefs also carry the compile gate:
mvn -o -B -q compilebefore any test run, because a buildthat fails to compile produces no test results at all — and
BUILD FAILUREreads as a kill if youwere hoping for one.
Result: 44 sites measured, and the headline is not the one either half reported
Both halves are in. Part A swept lines 158–505 (27 sites), Part B swept 512–888 (17 sites). One
mutation per build, full suite each time, file restored and sha-verified after every one — 17
restores checked individually in Part B, every restore checked in Part A.
Both reported the same baseline on
main49a5875: 1789 tests, 0 failures. I re-measured itmyself in a scratch worktree at
origin/main:Tests run: 1789, Failures: 0, Errors: 0, Skipped: 0,BUILD SUCCESS. Both worktrees ended at the pristined3c693e9e595228f5b41b185e94a49d86f1cb9ddd50ff9ddc6be2b73918659eawith a cleangit status, whichI confirmed independently in both before collecting.
Raw totals: 44 sites, 6 killed, 38 survived.
The correction: "6 killed" is really "1 killed"
I classified each killing test by what it actually does. Five of the six kills are source-text
assertions —
Files.readStringonFleetd.javafollowed bysource.contains("…"). They neverconstruct anything and never run
main.:885exhaustedPatterns::armed, killed byaProfileWithNoPatternIsUnarmed,reloadedPatternArmsDetectionWithNoRestart,reloadedPatternRemovalDisarmsDetectionWithNoRestartinFleetdExhaustionDetectionArmedWiringTest:158(FleetdConfigRefWiringTest.mainStillWiresTheThreeArgumentConfigRefConstructor),:444+:479+:492(FleetdCompletionResolverWiringTest),:678(FleetdLeadSeatWiringTest.fleetMcpConstructionStillWiresLeadSeatLookup)So the behavioural coverage of this file's wiring is 1 of 44, not 6 of 44.
To be fair to those tests: they are honest about themselves. Every one carries
[SOURCE TEXT]inits
@DisplayNameand says so in its javadoc —FleetdLeadSeatWiringTest's reads "This testchecks source text, not runtime behaviour. It never constructs a
FleetMcpand never runsmain." And they do guard the actual hazard those tickets were written for: silent deletion orin-place substitution of an argument. The defect is in how my ticket's table reads them, not in how
they were written.
But a source-text test fails in both directions, which matters for what we do next:
itself be broken, or two arguments of the same type can be swapped;
lambda parameter, and correct code fails;
(the normal fix here, and what #584 just did for
loopHealthSource) and the string disappearswhile the wiring is perfect.
Credit where due: Part B spotted this for its own single row and quoted the javadoc. Neither half
noticed it held for every kill in the sweep — that only shows up reading down the column, which
is my job, not theirs.
Two survivors I verified myself, rather than relaying
Both in a scratch worktree at
origin/main, compile-gated before reading any test output, filerestored and sha-checked after each.
1.
:611-631— the wholesessions.onRelease(...)release-cleanup lambda →detail -> { }SURVIVED, and the total is unchanged — no crowd effect, nothing perturbed. That single empty
lambda removes all three of
messages.abandon(...),replyInbox.release(...)andprimaryRegistry.forgetDelegation(...).This is the worst one in the sweep, and
MessageService.abandon's own javadoc at:668says why:So if this lambda regressed, every
fleet_stopand every idle-reap would hang its lead's ticket forthe full thirty minutes. That is the same thirty minutes as #588, which I filed today after
measuring 41 ticket timeouts landing at exactly 1800 s.
And the shape is the familiar one — each collaborator is tested, the caller is not:
Three collaborators individually pinned, and the lambda in
Fleetd.mainthat calls all three isunpinned.
ReplyPushLoopTest:215even documents the wiring as load-bearing in prose — which, inthis tree, has reliably marked an untested invariant rather than a tested one.
2.
:468—exhaustionSinkRef.set(exhaustionSink)→exhaustionSinkRef.set(ExhaustionSink.none())SURVIVED. This is the widest blast radius of anything in the sweep, because of the construction
order around it:
The ref starts as a no-op, both launchers are handed the forwarding sink that reads it, and
:468is the single line that ever makes it real. Change that one line and every exhaustion signal
from every member on both adapters goes nowhere: CB-578 stage B quarantine never fires for
any profile, fleet-wide, and the daemon keeps spawning onto a dead credential. One line, compiles
clean, 1789 tests green.
Fix priority — the 38 survivors, ranked by what silently turns off
Not all 38 are worth a test. Ranked by blast radius:
Tier 1 — a control turns off fleet-wide, silently.
:468(quarantine never fires for anyprofile),
:221(the forwarding sink upstream of it),:411(no profile'sexhaustedPatternisseen after boot),
:412-416(a usage-limit refusal is handed back as a real completion, so a leadacts on an exhausted account's "answer" as real work).
Tier 2 — a credential policy stops gating.
:230and:237memberCredentials— per Part A,this reopens the CB-592 credential-exposure gap that CB-596's policy closed, for claude-code and
opencode respectively. This is the security-relevant pair.
Tier 3 — a lead waits on work that can never arrive (all of these end in #588's thirty
minutes).
:611-631(verified above),:591messages::abandonon the health path,:505completion::register(a delivered turn never registered, so a completion can never resolve theblocked send — the gap #556 closed),
:518LeadMailbox::open(lead-to-lead coordinationpermanently off with
coordinator:fully configured),:512AmqpReplyInbox::open(durablecross-restart reply delivery silently replaced by in-memory).
Tier 4 — live config goes stale.
:230/:237config::get,:229/:236fleet supplier,:393MemberRegistry.live— afleetd.yamlreload silently stops reaching that consumer, whichis exactly the regression #424 fixed once already.
Tier 5 — host resource and diagnostics.
:311/:312/:313(IdleSleepGuard: the host canidle-sleep under a long turn, or stay awake forever),
:589(the #386 wall-clock correction, sostall detection breaks after the host wakes),
:276(busy-spin),:537-538and the thread-factorynames (names in thread dumps only).
Gaps both halves reported honestly, and I am not treating as measured
:260—configpassed intoCompositePeerLauncher. Same shape as the otherconfig::getsites; explicitly reported as "not measured — a genuine gap in my sweep, not ajudgment exclusion."
:552,:580,:696— thebridge-heartbeat-/bridge-health-/bridge-leadcoord-virtual-thread factories, textually identical to
:537-538which did survive. Part B declined toreport an expected result as a measured one. Tier 5, so low value.
:638-639,:644-656,:698,:711), and theexhaustionSink(...)/deliverableTo(...)factory bodiestreated as covered by direct factory tests on a reading of their javadoc, not by mutation.
inject a collaborator (
:202-208,:420-423,:435-440), and JDK refs (System::nanoTime,System::getenv) per this ticket's own exclusion list.Both halves flagged that their search for "sites the
::grep could not see" was itself textual(
awkfor->or::), so neither can prove a wiring decision does not exist on a line carryingneither token.
What I got wrong in this ticket
The
KILLED/SURVIVEDcolumn I asked for merges two kinds of evidence that need oppositetreatment, and it presents the weaker kind in the more confident-looking cell. The brief should
have asked for the kill kind, not just the kill. That is on me, not on either worker — neither
reported a single cell incorrectly.
Follow-up work is filed as #589; leaving this ticket open until those tests land.