One unmeasured candidate refuses "Complete my squad" for everyone (409 on the live app today) #35
Labels
No labels
architecture
cleanup
dependencies
enhancement
needs-info
needs-triage
performance
priority: high
priority: medium
ready-for-agent
ready-for-human
reliability
security
testing
wontfix
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set
Reference
solvreven/FPL#35
Loading…
Reference in a new issue
No description provided.
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?
Found 2026-09-13 while replaying the app's own picks against a real entry (
scripts/backtest_app_vs_entry.py,84fd8d7).optimize.autocompletecalls_require_trusted_pool(candidates), which raisesUnmeasuredValueErrorif any candidate's availability provenance is untrusted./api/autocompleteturns that into a 409 for the whole solve.POST /api/autocomplete {"locks": []}answers409: element 655: availability provenance is POSITION_PRIOR, which is not measured. That is one player (Gboho, Coventry, start_prob 0.36) in a pool of ~400.The guard is right about the player and wrong about its blast radius. It is the same shape as the 2026-08-30 armband fix in CLAUDE.md: the armband refuses; the XI is still served — ask what else a refusal takes with it. The docstring's argument ("anything in the pool can be chosen") is satisfied just as well by removing the untrusted from the pool as by refusing the pool.
Suggested direction:
excluded_unmeasured) so the Transfers/builder surface can say who was left out and why.ev.squadorfloor.squad, and the excluded list is rendered on the page (drive the real page).For scale: the best of the 102 on 21 August projected 8.7 points over six rounds, nowhere near a squad place. So excluding them changes no squad, while refusing changed every squad into none.
Fixed in
a3346e3onfeat/captaincy-board./api/autocompletenow leaves an unmeasured candidate out of the pool instead of refusing the whole solve, and serves him inexcluded_unmeasuredwith his provenance.optimize._require_trusted_poolis unchanged and still sees only trusted candidates.Verified on the live app:
POST /api/autocomplete {"locks": []}→ 200, 15-man squad, Gboho named; screenshot checked. Six cuts, six red, including a note that is computed and not rendered.Still open, same shape, not fixed here: the page sends every current pick as a lock. A squad holding one player with no projection at all (start_prob < 0.05, e.g. a 4.0 third keeper) is therefore still refused whole ("no projection for locked player(s): Palmer (301)"). Entry 6261's own squad hits this today. The likely fix mirrors this one: keep such a pick in the squad, bar him from the XI and bench credit, and name him, rather than refuse the request.
Closing this issue for the pool-wide refusal.
The part left open above is fixed too, in
aa91f71.A locked pick with no projection (start_prob < 0.05) is now kept and not valued instead of refusing the request.
evis None, never 0.0.optimize._solvebars a None from the XI and gives his bench slot no credit, so projected players come on first.kept_unprojected, and the page prints Kept as picked, not valued: … no projection.Verified on the live app with entry 6261's fifteen picks all locked: 200, a 3-5-2 XI, Palmer (Ipswich, 4.0) kept last off the bench. Six cuts, six red. Full suite green in a clean worktree (1739 passed).