Bug: /v1/threads/resolve picks Violet (#7F00FF) over Blue (#1E90FF) for #0000FF input; alternatives limited to 3 with no way to widen #30
Labels
No labels
blocked:needs-attention
blocked:needs-decision
bug
feature-request
in-progress
needs-decompose
quickfix
triage-approved
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference
Mark/easystitch-service#30
Loading…
Add table
Add a link
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?
Summary
POST /v1/threads/resolvewith input#0000FF(pure blue) returnsbest.code=613 Violet #7F00FFat deltaE=17.13, even though the catalog containscode=405 Blue #1E90FFwhich is perceptually closer to pure blue. The resolver only returns 3 alternatives per match, so the actual Blue thread is never surfaced.Reproduction
Two distinct issues
1. Result feels wrong to users
The catalog names "Blue" the thread
#1E90FF, but resolving#0000FFreturns Violet as the best match. A designer uploading a#0000FFdesign and seeing "Violet" suggested is going to be confused.D2000 weights perceptual dimensions unevenly — RGB-Euclidean distances are equal (both candidates are 127 units from
(0,0,255)in RGB), but D2000 may legitimately choose violet. If the algorithm is correct, the catalog should add a true-blue thread (or rename Violet to acknowledge its proximity to pure blue). If the algorithm is wrong, the resolver needs tuning.2. No way to widen the alternative set
The response always returns exactly 3 alternatives. There's no
limit,max_alternatives, orincludeparameter in theResolveThreadsRequestschema (/v1/openapi.jsoncomponents.schemas.ResolveThreadsRequest only hascolors: list[str] min=1 max=256). A client that wants to see all threads within deltaE<50 has no way to ask.Suggested fix
alternatives_limit: int = 3(or similar) parameter toResolveThreadsRequest, capped at e.g. 20#1E90FFbe renamed, or should we add a#0000FF-adjacent thread?Environment
UI verification follow-up (2026-09-10)
The file upload barrier is now cracked (DataTransfer + Object.defineProperty + dispatchEvent). Confirmed via BrowserOS MCP
snapshotthat ThreadCraft's settings panel unlocks after upload but:act click/act kind=select/ PointerEvent sequence closes the dropdown without updating React state. The next snapshot re-shows the original option as[selected]. Captured React props via__reactPropsconfirmedonClickexists but does not fire under synthetic dispatch.e12or inner-modal Confirm & Edite65) sets Redux state to'digitizing'then'digitized'with a hardcoded "Auto-digitize complete!" message but never firesrunAutoDigitize()→digitize()→ POST to/v1/digitize. BrowserOS MCPhook fetchconfirmed only/healthzGETs during the click sequence. Service log shows zero digitize POSTs across the entire 2026-09-09/10 verification session.This means the UI cannot drive a digitize or export at all in the current ThreadCraft build. The API bugs (#27-31) are still the canonical surface; the UI bugs are symptom-level and tracked separately as #32 (silent no-op), #33 (combobox click swallowed), #34 (false-complete message). Those three will be closed as duplicates of this issue family once the canonical root causes land.
Visual verification (2026-09-09): All four screenshots show empty canvas state. The thread picker / palette UI is only rendered after a successful upload + digitize. BrowserOS MCP cannot drive the hidden file input to upload a pure-blue SVG, so this bug was not reproduced through the GUI. The curl probe (showing Violet #7F00FF returned for input
#0000FFwhile the catalog contains actual Blue #1E90FF) is still the primary evidence.