Found while implementing #5916, in the same file and the same WCAG class, but needing a copy decision rather than a mechanical fix — filing rather than folding in.
What is left
#5916 gave every stage an accessible name carrying travelled / current / upcoming / lost-terminal. It deliberately did not give the won terminus a state of its own, so a won stage announces through the ordinary three.
The renderer still distinguishes it visually, and only visually:
terminal!=='lost'&&state==='upcoming'&&(terminal==='won' ? 'bg-emerald-500/30' : 'bg-muted')
The file's own comment states the intent: "an unreached won terminus stays a faint emerald so the goal is legible without being a surface you could press." That legibility is carried by hue alone. Two stages ahead of the record — say 已接受 (the successful terminus) and 已过期 — paint differently and announce identically ({{stage}}, upcoming). Same SC 1.4.1 Use of Color class as #5916, on the one distinction #5916 left behind.
classify() reaches won both from an explicit terminal: 'won' in the stage config and from the WON_TOKENS heuristic (won|success|成交|赢|完成), so this is reachable without authors opting in.
Why it was not folded into #5916
#5916's fence was travelled / upcoming / lost, and the fix here is not mechanical: it needs a decision about what a goal stage should say, which is new user-facing copy in ten packs, not a spelling correction to an existing string. Nothing in the tree pins the right wording, so it fails the bounded-in-place bar and would have been unreviewable scope creep on that PR.
Shape of a change
Probably one more key pair alongside detail.pathStage* (e.g. a won-terminus variant of the upcoming and completed states), following the composition #5916 established. Worth deciding at the same time whether a reachedwon terminus should announce differently from an ordinary completed stage — today it does not.
Related: #5916 (established the mechanism and the key namespace), #5956 (the other leftover in this file).
Generated by Claude Code
Found while implementing #5916, in the same file and the same WCAG class, but needing a copy decision rather than a mechanical fix — filing rather than folding in.
What is left
#5916 gave every stage an accessible name carrying travelled / current / upcoming / lost-terminal. It deliberately did not give the
wonterminus a state of its own, so awonstage announces through the ordinary three.The renderer still distinguishes it visually, and only visually:
The file's own comment states the intent: "an unreached
wonterminus stays a faint emerald so the goal is legible without being a surface you could press." That legibility is carried by hue alone. Two stages ahead of the record — say已接受(the successful terminus) and已过期— paint differently and announce identically ({{stage}}, upcoming). Same SC 1.4.1 Use of Color class as #5916, on the one distinction #5916 left behind.classify()reacheswonboth from an explicitterminal: 'won'in the stage config and from theWON_TOKENSheuristic (won|success|成交|赢|完成), so this is reachable without authors opting in.Why it was not folded into #5916
#5916's fence was travelled / upcoming / lost, and the fix here is not mechanical: it needs a decision about what a goal stage should say, which is new user-facing copy in ten packs, not a spelling correction to an existing string. Nothing in the tree pins the right wording, so it fails the bounded-in-place bar and would have been unreviewable scope creep on that PR.
Shape of a change
Probably one more key pair alongside
detail.pathStage*(e.g. a won-terminus variant of the upcoming and completed states), following the composition #5916 established. Worth deciding at the same time whether a reachedwonterminus should announce differently from an ordinary completed stage — today it does not.Related: #5916 (established the mechanism and the key namespace), #5956 (the other leftover in this file).
Generated by Claude Code