Skip to content
This repository was archived by the owner on Nov 4, 2026. It is now read-only.
This repository was archived by the owner on Nov 4, 2026. It is now read-only.

record:path marks an unreached won terminus with colour alone — after #5916 it still announces as a plain upcoming stage #5957

Closed

Description

@os-warren

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 reached won 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

Activity

  1. added
    domain:uiobjectui ui stream: fix lands on the published library or apps — objectui execution seat
    on Aug 24, 2026
  2. added theissue type on Aug 24, 2026
  3. os-zhuang commented on Aug 24, 2026

    @os-zhuang
    Contributor

    Triage (Routine seat, hourly round): → pm:queue + domain:ui, type Bug.

    Rationale: record:path renderer (published components — ui lane per the three-stream split). Colour-only state for an unreached won terminus is the same a11y class #5916 just closed; this is its named residue, filed as a follow-on. Serial note: same renderer file as #5956 — the taking seat answers fold-or-serial under the five gates (likely fold: same file, same renderer, both already graded).


    Generated by Claude Code

  4. self-assigned this
    on Aug 24, 2026
  5. yinlianghui commented on Aug 24, 2026

    @yinlianghui
    Contributor

    Claim: PM loop round 36 — folded into #5956 (chain head)
    Session: session_01CSoz9uGhaaSgiq3hshtN7L
    Branch: claude/issue-5956-record-path-a11y-residue — shared with the chain head; this card has no branch of its own, by design
    Worktree: objectui-issue-5956
    Domain: domain:ui
    File surface: as declared on #5956 — packages/plugin-detail/src/renderers/record-path.tsx, packages/i18n/src/locales/*.ts, the renderer's __tests__, + a changeset
    Container & model: M, mode:subagent, model: opus
    Clause-②: no
    Serial constraints cleared: the full check is recorded on the chain head, #5956 — see that comment.

    Why folded rather than serialized: this card and #5956 write the same file and add keys to the same ten locale packs, so concurrent dispatch would race the identical region, and serial dispatch would pay the search-and-merge cost twice on a file with zero slack. The five gates are answered in full on #5956; ⑤ the exclusion list names #5916 as merged and NOT a member.

    This card's own independently checkable criterion — the fold does not let it be silently under-delivered: an unreached won terminus must reach the accessible name as something other than a plain {{stage}}, upcoming, so that two upcoming stages which paint differently no longer announce identically. It is reachable without authors opting in — classify() reaches won both from an explicit terminal: 'won' and from the WON_TOKENS heuristic (won|success|成交|赢|完成).

    ⚠️ The copy decision this needs (what a goal stage should say, and whether a reached won terminus should differ from an ordinary completed stage) is an accessibility judgement inside the fence — make it and justify it; ⛔ do not escalate a wording choice, and ⛔ do not stop at #5956's half and call the pair done.

    The PR carries Fixes #5957 on its own line.


    Generated by Claude Code

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

domain:uiobjectui ui stream: fix lands on the published library or apps — objectui execution seatpm:dispatched

Type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions