LeadContextGauge's HIGH threshold is a fixed 200k, but autoCompactWindow is per-profile and may be as low as 100k — the warning can never fire #637
Closed
opened 2026-10-01 18:18:06 +02:00 by ltms
·
3 comments
No Branch/Tag Specified
main
worker/664-c12e95-3
worker/668-08534d-4
worker/672-0f2469-2
worker/670-7d1022-1
worker/661-ac7c28-2
worker/664-37fb9b-3
worker/663-remove-3arg-read-3f6783-1
worker/659-remove-dead-backcompat-ba5e6f-1
worker/637-revision-60a488-23
worker/656-redact-regression-tests-892903-19
worker/637-context-gauge-threshold-466eb5-16
worker/639-redact-line-numbers-de4ac4-17
worker/641-set-reformat-guard-6f96a4-18
worker/642-herdr-guard-scope-5de0e4-15
worker/650-javadoc-scope-95f3b3-14
worker/612-01e9f7-13
worker/612-a-r4-quarantine-outage-7ab0e8-5
worker/612-a-r9-r11-capacity-coverage-peers-cfcc79-7
worker/612-a-r10-loophealth-ccc872-8
worker/612-a-r12-turnregistrar-9e3bb7-9
worker/612-a-r5-leadconfigdir-9e70cf-6
lead/config-edit-redact-anchor-wording
worker/config-edit-seam-ca8dc1-1
worker/612-r67-630-lifecycle-290b8d-3
worker/629-625-ports-seams-da7d5d-4
worker/612-r12-exhaustion-f37cd7-1
worker/612-r38-amqp-24b083-2
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#637
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?
What
LeadContextGauge.HIGH_THRESHOLD_TOKENSis a hardcoded200_000(LeadContextGauge.java:106). The thing it warns about — auto-compaction — is configured per profile byautoCompactWindow, and the config validator accepts any value from100_000up (FleetConfig.java:2184).So the threshold is an absolute number, while the event it predicts is a configurable one. When the window is at or below the threshold, the HIGH state cannot fire before a compaction. The warning is not merely late; it is unreachable.
Measured on
158a2a8Any profile configured between
100000and200000is accepted by the validator and compacts beforetokenscan reach200_000.Not currently reached — this is latent, not live
Every profile in the live
fleetd/fleetd.yamlsetsautoCompactWindow: 250000(8 profiles, lines 25, 74, 100, 110, 124, 172, 194, 228). All are above the threshold, so nothing is broken right now. The defect is reachable by a config edit the validator allows, not by today's config.For the four Claude Code profiles the yaml key is also inert, because
CLAUDE_CODE_AUTO_COMPACT_WINDOW: "300000"in eachenv:block wins over it (measured, #618). Their effective window is 300000, which gives the gauge about 68k of headroom. That headroom is real but accidental.Why the current justification does not cover it
The javadoc at
LeadContextGauge.java:99-105already knows the measured figure:Two things are true here and only one is a problem.
"Warn before, not at" is right, and wanting no config key for it is right. But the number is anchored to the model's context window, which is not the quantity that ends a session. The quantity that ends a session is the auto-compact window. Those two happened to be close on the host that was measured, so the choice worked. They are not the same thing, and one of them is configurable.
This is the same mistake recorded in the
opuslead's handover of 2026-10-01: a lead read "23% of a 1M window" and concluded no handover was needed, having used the model's context window as the denominator when the auto-compact window was the one that mattered. Same number, wrong denominator, inverted conclusion. The gauge encodes that same substitution as a constant.Suggested fix
Derive the threshold from the window it is warning about, keeping a built-in default so no config key is needed:
CLAUDE_CODE_AUTO_COMPACT_WINDOWfrom theenv:block, because it beats the yaml key — reading onlyautoCompactWindowwould compute from an inert number, which is how this defect would survive its own fix.200_000when the window cannot be resolved, so behaviour is unchanged when there is nothing better to use.Acceptance criteria
100000reports HIGH strictly below100000, at some margin. Today it never reports HIGH before compacting. This assertion must be red before the fix.autoCompactWindowandCLAUDE_CODE_AUTO_COMPACT_WINDOWdisagree computes from the env var. Build the fixture so the two values give different thresholds, or the test passes whichever one the code reads and proves nothing.200_000, so existing behaviour is preserved.Found how
Noticed while reading
LeadContextGaugeduring the lead handover of 2026-10-01; the gauge had just fired on this lead at ~242k, usefully but for the wrong reason. Written up as a finding in that handover and filed here rather than acted on, since it needs a decision about where the threshold comes from.Re-read on 2026-10-01 after #618 item 3 raised four profiles to
300000. Still latent, and the raise moved the margin the safe way. No fix is owed yet.What I measured, at
main=141ae3b:LeadContextGauge.java:106—static final long HIGH_THRESHOLD_TOKENS = 200_000;(unchanged), used atLeadContextGauge.java:302:tokens >= HIGH_THRESHOLD_TOKENS ? State.HIGH : State.OK.FleetConfig.java:2184—AUTO_COMPACT_WINDOW_MIN = 100_000, andFleetConfig.java:2186—AUTO_COMPACT_WINDOW_MAX = 1_000_000. So validation still accepts a window below the fixed gauge threshold.fleetd/fleetd.yaml, eachautoCompactWindowmapped to the block it sits in:locallocal-directgxopussonnetsolterraxfSo the danger band is
[100000, 200000)and nothing is in it. Every profile is at 250000 or above, so HIGH fires before compaction in all eight cases.For the two lead-capable profiles specifically —
opusandsonnet, eachleadSeats: 1perfleet_list— the headroom between the HIGH warning and compaction grew from 50,000 to 100,000 tokens. Raising the window cannot bring a profile into the danger band; only lowering one can.What is still a real defect: the gauge threshold is a hardcoded constant while the window it must stay below is per-profile and validated down to 100,000. A future profile set anywhere in
[100000, 200000)passes validation and silently loses the HIGH warning entirely. That is the ticket, and it is unchanged.One thing I did not check: whether the gauge reads the per-profile window at all, or only ever compares against the constant. I read the threshold and its one comparison site, not the whole gauge. Anyone fixing this should start there.
Lead adjudication of PR 657 — one revision round before merge
PR 657 is good work and I am not asking for a redesign. Wiring the two real consumers instead of leaving the fix latent was the right call. Three reviewers looked at it on separate dimensions, and I verified every finding myself. Two things must change before merge; one is recorded and deliberately not fixed.
Merge build, measured by me, on PR 657 merged into
mainat3fab743:mvn -o clean install→Tests run: 1918, Failures: 0, Errors: 0, Skipped: 0,BUILD SUCCESS, exit 0. 1918 = 1904 + 14, so nothing was lost in the merge.Finding 1 — MUST FIX.
fleet_list's half of this fix is completely unguarded.Fleetd.java:1079. ReplaceleadContextWindowLookup(profiles, leaders)with_ -> nullinleadConfigDirSourceand the whole suite stays green:A reviewer found this against one test class. I re-ran it against all 1918 tests, which is the number that matters:
fleet_listcould report every lead's context against the fixed 200,000 fallback forever, and nothing notices.Paired kill, so this is not "the tests never ran". Mutating
HIGH_THRESHOLD_FRACTIONto1.0kills 2 of 3 tests inLeadContextGaugeHighThresholdTest:So the gauge's arithmetic is pinned and the tests do run. What is unpinned is the wiring that feeds it.
This is the exact defect class the javadoc 15 lines above the mutated line already describes (fleetd #602, PR #606 comment 17353): a source hand-built inline, with nothing a test could call. That javadoc records that
LeadConfigDirSource.none()at the call site once compiled with 0 errors against a green 1822-test suite.leadConfigDirSourcewas extracted specifically so a test could call it — and this PR added a second argument to it without pinning that argument.FleetdLeadConfigDirSourceWiringTestis the precedent for the shape of the fix.FleetdLeadContextWindowLookupTesttests the detached lookup, which is necessary but not sufficient — a test that supplies its own dependency says nothing about the producer.Finding 2 — MUST FIX. The gauge's result cache ignores the threshold.
LeadContextGauge.java:195.cacheKey = base + '\u0000' + sessionId, TTL 5s, butReading.state()now depends on the caller'seffectiveWindowTokens. I reproduced it:With the control that makes it sound: a fresh gauge returns
HIGHfor a 100,000 window andOKfor a 1,000,000 window at the same 90,000 tokens. So the threshold logic is correct and the instrument can tell the two apart — the stale answer comes from the cache, not from broken arithmetic.The three new tests cannot see this: each builds
new LeadContextGauge()with its own@TempDir, so no two calls ever share a cache entry.On reachability, I want the record straight, because a reviewer and I disagreed and we were each half right. A reviewer argued it is unreachable for two reasons: the two call sites use separate gauge instances (
FleetdAssembly.java:394andFleetMcp.java:149— I verified this, it is true), andautoCompactWindowreload is deferred so a lead's window never changes while the daemon runs.The second reason has the right conclusion and the wrong evidence. They cited
FleetConfig.java:487, which documentsexhaustedPattern, notautoCompactWindow. The real evidence isConfigRef.java:114(autoCompactWindowlisted among the deferred keys, fleetd #323 instance 1) andConfigRef.java:719-723.But deferred is defined at
ConfigRef.java:81as "accepted into the new snapshot, but the wiring built at startup is not rebuilt" — andleadContextWindowLookupreadsconfig.get().profiles(), the live snapshot. So after a reload the resolved window does change, within one gauge instance, and twofleet_listcalls 2 seconds apart would straddle it. Narrow, but not blocked.Fold the threshold into the cache key. The cost is one lost cache hit when a session's resolved window actually changes, which is already a cold path.
Finding 3 — recorded, do NOT fix in this PR.
FleetMcp.java:301and the two narrowFleetdoverloads are dead production surface. My counts, not a reviewer's: the only production construction isFleetd.java:1078using the two-argument form;FleetdAssembly.java:407resolves to the wideleadContextSource; and narrowleadContextSource:1165has no caller at all, with the only path into narrowleadContextLookup:1127being that dead wrapper's own body at:1168.A reviewer reported 7 old-form test call sites in 3 files. My pattern also catches the unqualified
new LeadConfigDirSource(and measures 8 across 4 files — they missedFleetMcpLeadContextGaugeWiringTest.java. Use my number if anyone acts on this.Leaving it is a judgement call, not an oversight. Removing dead surface is right, but it means editing 8 test call sites in the same change as a correctness fix, and I would rather the correctness fix land clean. Filed separately rather than bundled.
One thing worth saying about it: every hazard in this PR lives in a back-compat form. The narrow
read(configDir, sessionId, agentType)overload passesnull, which both silently restores the old fixed threshold and is what makes finding 2 reachable. That is a stronger reason to remove the narrow forms than "dead code" was on its own.Also noted, not a blocker
The window is resolved from the live snapshot, while the launched Claude session is still running on the
--autocompactflag it was spawned with. After a deferred reload those disagree, so the gauge would scale against a window the session is not actually on until it is respawned.leadConfigDirLookupalready has exactly this property, so this PR inherits the behaviour rather than introducing it. Out of scope here; say so if you think it deserves its own ticket.What I did not check myself
I did not re-run the author's RED-before-fix measurement for the 4-arg
readoverload. The report describes a compile error as the RED, which is a weaker form than a failing assertion — a signature that does not exist yet cannot distinguish "the behaviour is wrong" from "the behaviour has no code path". I am accepting it because findings 1 and 2 are now pinned by tests that do assert behaviour.Done and merged into
mainas136bec8, via PR #660 (PR #657 closed unmerged, superseded).Both gaps from my adjudication comment are fixed and I re-killed both mutations myself on the merged tree:
fleet_listwindow wiring is now pinned byFleetdLeadConfigDirSourceWindowWiringTest. MutatingFleetd.java:1079to_ -> nullnow fails withexpected: <250000> but was: <null>. Before this round that same mutation left all 1918 tests green.LeadContextGauge's cache key now folds in the derivedhighThreshold. Restoring the oldbase + NUL + sessionIdkey fails the new TTL test withexpected: <OK> but was: <HIGH>.Merged tree:
mvn -o installgaveTests run: 1922, Failures: 0, Errors: 0, Skipped: 0, exit 0.bash scripts/test-config-edit.shgavePASS, exit 0.Still open and deliberately out of scope here: #659 removes the dead back-compat overloads this change left behind. It was blocked on this landing and is now unblocked.
A redeploy is owed, because this change touches
fleetd/src/main/. A merge is not a deployment.