Skip to content

fix(console): match Chromium's break points for long Agent names - #2916

Merged
freeqaz merged 10 commits into
mainfrom
ux-fixes-126a
Oct 19, 2026
Merged

freeqaz merged 10 commits into
mainfrom
ux-fixes-126a

Conversation

@freeqaz

@freeqaz freeqaz commented Oct 19, 2026 •

Copy link
Copy Markdown
Collaborator

Problem

The Agents list marks a name with a run of 21 or more characters that cannot wrap, so the name breaks anywhere inside the width of its ID instead of setting the table's width (finding 1955, #2906). Measured in Chromium, the rule disagreed with the browser both ways (finding 1982):

  • Missed: a hyphen, dash, soft hyphen or wide space followed by closing punctuation (. , : ; ) ] } / ! ’ ” », a joiner or a word joiner) is not a break, but the rule treated it as one. "abc-.5" repeated stayed unmarked and pushed the table to 1949 px inside a 1101 px scroller in Storybook.
  • Over-marked: Chromium does break "1000-1001" after the hyphen, so the digit-group case from fix(console): badge tones, danger tone and long-name wrapping #2906 (finding 1971) and its test row were wrong. Combining marks, CJK ideographs, kana, Hangul and emoji names were also marked. Over-marking only boxes the name at 310 px, so those were harmless.

Change

  • apps/controller/src/console/agents/list.mjs: the rule is built from named parts, each one a measured Chromium break point:
    • A hyphen-minus holds the next character before closing punctuation, $, an Arabic-Indic digit, or a hyphen, figure dash or en dash. It does not hold another hyphen-minus.
    • A hyphen-minus that no letter or digit precedes holds a digit (-5). Between digits it breaks (1000-1001), so the digit-group case from fix(console): badge tones, danger tone and long-name wrapping #2906 is removed.
    • A wide space, soft hyphen or dash holds closing punctuation, a quote or a vertical bar. A combining mark between them does not change that.
    • A hyphen or dash, an em dash included, holds a following hyphen or dash other than an em dash (LB21).
    • A hyphen, figure dash or en dash that starts a word (at the start or after a space) holds a letter (LB20a). A hyphen-minus does not.
    • The hyphen or wide space a line breaks after stays on that line, so 20 letters plus a trailing hyphen are a run of 21.
    • The em-dash-run case stays: the probe confirms that 40 em dashes never break.
    • Any character but a space or an em dash holds a following word joiner or zero-width joiner (LB11, LB9), so ideographs joined by word joiners are one run (review bot P2). What follows a joiner keeps its own rules, so separate emoji family sequences still break between them.
    • Combining marks count with their letter. Ideographs, kana, Hangul syllables and emoji end a run. Thai and other dictionary-broken scripts still count per character. That can only over-mark, so there is no script-aware segmenter.
  • tests/browser/console-agents-list-return.test.mjs: one row per measured case. The digit-group row now expects unmarked. Each row is checked two ways: against the rule, and against the browser's own layout. The test measures the longest run the browser keeps on one line in the link's font, and it must be 21 or more exactly when the name is marked. The 1440 px table must still not scroll sideways.
  • Storybook (Pages/Agents): the "Long name of digit groups" description no longer claims a non-break. A new "Long name with punctuation after hyphens" story shows a name that stays marked.

UX plan finding fix (bughunt-126, finding 1982).

Verification

Media (Storybook, Pages/Agents):

  • Final revision (commit b5cf316, removed before the squash): walkthrough at 1440 and 1024, and the "after" screenshots below. They are byte-identical to the first capture (091ff87), because the later rule fixes do not change these two names.
  • Before (main), from 091ff87.
Before (main) After (final revision)
Long name with punctuation after hyphens, 1440 before after
Long name with punctuation after hyphens, 390 before after
Long name of digit groups, 1440 before after
Long name of digit groups, 390 before after

At 1440 the punctuation name scrolled the table sideways on main (scrollWidth 1949 in a 1101 px scroller) and fits after (1101/1101). The digit-group name is no longer boxed: it wraps at its hyphens. The 390 layouts are unchanged (stacked rows break names anywhere at phone width). Stories: Pages/Agents "Long name with punctuation after hyphens" (new) and "Long name of digit groups".

Risks

  • A name of digit groups joined by hyphens (or any other long hyphenated name) now wraps at its hyphens, like "nightly-build-…" always did, instead of being boxed at 310 px. Its column can be wider, and the other columns narrow to fit. The table still fits at 1440 px.
  • The rule is a measured subset of UAX fix: recover production cutovers and protect email sign-in #14, not a segmenter. Over-marking (Thai, the Hebrew maqaf) still shows the whole name in a narrower box, which is harmless. No measured case is missed; names outside the probe could still be, and would need contrived punctuation.
  • The review bot's P2 (joined ideographs lost the mark) is fixed and pinned by a row. An internal review approved with nits. All of them are applied: hyphen-minus pairs, the word-initial rules, marks before closing punctuation, the trailing break character, the U+201D row, and hanging spaces in the test's count.

The unbroken-name rule treated a hyphen, dash, soft hyphen or wide space
before closing punctuation as a break and missed word-initial hyphens, so
some names stayed unmarked and widened the table. It also kept a digit-group
case Chromium does not need (1000-1001 breaks after the hyphen) and counted
combining marks, ideographs, kana, Hangul and emoji as one run. Finding 1982.
…ints

The digit-group story described a non-break that Chromium does not make;
a new story shows a name whose hyphens sit before closing punctuation.
no-misleading-character-class flags a zero-width joiner between two
characters of a class.
@freeqaz
freeqaz requested a review from a team as a code owner October 19, 2026 07:25
@clawsweeper

clawsweeper Bot commented Oct 19, 2026 •

Copy link
Copy Markdown
Contributor

🦞👀
ClawSweeper picked this up.

Pull request received. I will update this pull request when review starts.

ClawSweeper review complete

ClawSweeper finished reviewing this revision. The review result is being finalized.

View the workflow run.

Review: a hyphen-minus pair breaks, a word-initial hyphen-minus holds a
digit but not a letter, a word-initial hyphen or dash holds a letter after
a space, a combining mark between a break character and closing punctuation
keeps the hold, and the hyphen a line breaks after stays on the line, so a
20-letter run plus its hyphen is 21. Rows for each, plus the right double
quote; the browser count skips hanging spaces.
@freeqaz-openai

Copy link
Copy Markdown
Collaborator

@freeqaz make sure you're waiting for clawsweeper feedback before landing PRs.

@clawsweeper clawsweeper Bot added clawsweeper:intake:bug Preliminary submission classification; full source review pending. clawsweeper:intake:needs-environment Preliminary submission classification; full source review pending. clawsweeper:intake:needs-repro Preliminary submission classification; full source review pending. P2 Normal priority bug or improvement with limited blast radius. and removed clawsweeper:intake:bug Preliminary submission classification; full source review pending. clawsweeper:intake:needs-environment Preliminary submission classification; full source review pending. clawsweeper:intake:needs-repro Preliminary submission classification; full source review pending. labels Oct 19, 2026
@clawsweeper clawsweeper Bot added rating: 🦪 silver shellfish Thin PR readiness signal; proof, validation, or implementation needs work. status: ⏳ waiting on author ClawSweeper has contributor-facing work open and is waiting for author action. labels Oct 19, 2026
@clawsweeper

clawsweeper Bot commented Oct 19, 2026 •

Copy link
Copy Markdown
Contributor

Codex review: needs maintainer review before merge.

What this changes

This PR refines long Agent name classification and adds browser and Storybook coverage for Chromium line breaks.

Example: An Agent has a 200-character name built from repeated abc-.5 groups at a 1440 px viewport.

  • Before: The name widens the table to 1949 px inside a 1101 px scroller, hiding other columns.
  • After: The name wraps within the existing bound and all five columns fit.

Review scores

Measure Result What it means
Overall readiness 🦐 gold shrimp (3/6) The inspected visual result and browser coverage support the focused fix; the repository's required UI attachment gate remains incomplete.
Proof confidence 🐚 platinum hermit (4/6) Real behavior proof is not required for maintainer- or bot-authored pull requests.
Patch quality 🐚 platinum hermit (4/6) No actionable review findings were identified.

Product

Kind: Bug fix · Worth it: Yes · Fix scope: Complete
User problem: Some long Agent names push the other Agents table columns off-screen.
Reason: The demonstrated failure is user-visible, the maintainer-authored direction is established, and the change stays within the existing layout mechanism.

Merge readiness

✅ Ready for maintainer review

Keep this PR open: it fixes a demonstrated layout bug still present on main, addresses the prior joined-ideograph finding, and introduces no definite code defect found in this review.

Priority: P2
Reviewed head: 29417329825ae0878e9fb87dc069035ea28fd634

Before merge

None.

Findings

None.

Tests

  • Missing end-to-end proof: Attach the existing screenshots and walkthrough natively to GitHub to satisfy the repository's UI evidence gate.
Agent review details

How this fits together

The console Agents list receives Agent names from API responses, classifies unbreakable runs, and applies an existing CSS class that bounds desktop name links.

flowchart LR
  A[Agent API response] --> B[Agents list renderer]
  B --> C[Unbroken run classifier]
  C --> D[Name link class]
  D --> E[Existing console CSS]
  E --> F[Browser table layout]
Loading

Technical review

Best possible solution:

Retain the focused correction within the existing classifier and bounded-link CSS owner.

Do we have a high-confidence way to reproduce the issue?

Current main's classifier and the supplied before screenshot establish the punctuation-name failure; no target code or tests were run during this review.

Is this the best way to solve the issue?

The change preserves the existing layout owner and threshold while correcting measured break rules, with independent browser-layout assertions rather than a copied classifier oracle.

AGENTS.md: found and applied where relevant.

Codex review notes: model internal, reasoning medium; reviewed against 5963327b74b6.

Provenance checked

  • Long-name classifier and browser expectations changes intended behavior with a stated reason (a25e598: Keep hyphenated digit groups and dash runs from widening the table; the earlier PR stated a digit-break premise contradicted by the supplied Chromium measurements.)
  • Selective bounded-name layout keeps the original intent (d717962: Bound only unusually long unbreakable names because applying a column-wide wrapping rule changed ordinary table widths and word wrapping.)
  • Digit-group Storybook description changes intended behavior with a stated reason (a25e598: Document the previously assumed non-break after a hyphen before a digit.)

Testing

Proof path: in-process harness.

Security

None.

Evidence

What I checked:

Likely related people:

  • Free Wortley: Raw commit d717962 adds apps/controller/src/console/agents/list.mjs:259 relative to its recorded parents. This identifies author metadata, not feature responsibility or a PR merger. (role: source-line author; confidence: high; commits: d7179620ea35; files: apps/controller/src/console/agents/list.mjs)

Review metrics

Metric Value Why it matters
Production and regression coverage Production +35/-8 lines; browser tests +93/-23 lines The additional coverage checks distinct Unicode break cases against browser layout and verifies the resulting table width.

Labels

Label changes:

  • add rating: 🦐 gold shrimp: Overall readiness is 🦐 gold shrimp; proof is 🐚 platinum hermit and patch quality is 🐚 platinum hermit.
  • add status: 👀 ready for maintainer look: ClawSweeper has no concrete contributor-facing blocker left for this PR.
  • remove rating: 🦪 silver shellfish: Current PR rating is rating: 🦐 gold shrimp, so this older rating label is no longer current.
  • remove status: ⏳ waiting on author: Current PR status label is status: 👀 ready for maintainer look.

Label justifications:

  • P2: Certain valid long names hide desktop table columns; this is a bounded console layout bug.
  • rating: 🦐 gold shrimp: Overall readiness is 🦐 gold shrimp; proof is 🐚 platinum hermit and patch quality is 🐚 platinum hermit.
  • status: 👀 ready for maintainer look: ClawSweeper has no concrete contributor-facing blocker left for this PR.

Rank-up moves

Optional improvements that raise the rating; they are not merge blockers.

  • Upload the existing screenshots and walkthrough as native GitHub attachments in Verification.

Rating scale

6/6 🦀 challenger crab · 5/6 🦞 diamond lobster · 4/6 🐚 platinum hermit · 3/6 🦐 gold shrimp · 2/6 🦪 silver shellfish · 1/6 🧂 unranked krab. Overall follows the weaker of proof and patch quality; ✨ marks media proof (a screenshot, video, or linked artifact) that directly shows the changed behavior.

Workflow

ClawSweeper edits this one comment on every review. Comment @clawsweeper re-review for a fresh review only. Repair and merge execution lanes are retired.

History

Review history (1 earlier review cycle)
  • reviewed 2026-10-19T07:56:00.236Z sha 682e711 :: needs changes before merge. :: [P2] Preserve no-break joins before excluding ideographic characters

Reviewed October 19, 2026, 5:00 AM ET / 09:00 UTC (Revision 2).

A word joiner or zero-width joiner forbids a break before it, so a name of
ideographs joined by word joiners is one unbreakable run; the ideograph rule
had ended the run at each one. Rows for joined ideographs and for emoji
family sequences, which still break between sequences.
@freeqaz
freeqaz deployed to integration-qa-pr October 19, 2026 08:07 — with GitHub Actions Active
@freeqaz
freeqaz deployed to integration-qa-pr October 19, 2026 08:07 — with GitHub Actions Active
@freeqaz

freeqaz commented Oct 19, 2026

Copy link
Copy Markdown
Collaborator Author

@clawsweeper re-review

@clawsweeper

clawsweeper Bot commented Oct 19, 2026 •

Copy link
Copy Markdown
Contributor

🦞👀
Exact review queued.

Re-review progress:

@clawsweeper clawsweeper Bot added clawsweeper:intake:bug Preliminary submission classification; full source review pending. clawsweeper:intake:needs-environment Preliminary submission classification; full source review pending. rating: 🦐 gold shrimp Decent PR readiness signal, but merge confidence is limited. status: 👀 ready for maintainer look ClawSweeper has no concrete contributor-facing blocker left for this PR. and removed rating: 🦪 silver shellfish Thin PR readiness signal; proof, validation, or implementation needs work. status: ⏳ waiting on author ClawSweeper has contributor-facing work open and is waiting for author action. clawsweeper:intake:bug Preliminary submission classification; full source review pending. clawsweeper:intake:needs-environment Preliminary submission classification; full source review pending. labels Oct 19, 2026
@freeqaz
freeqaz merged commit cf2cc2e into main Oct 19, 2026
57 of 58 checks passed
@freeqaz
freeqaz deleted the ux-fixes-126a branch October 19, 2026 09:27

This branch had an error being deployed

1 failed deployment
integration-qa-pr — 29417329 Deployed Oct 19, 2026 by freeqaz via QA advisory (OpenShell) #2527
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

P2 Normal priority bug or improvement with limited blast radius. rating: 🦐 gold shrimp Decent PR readiness signal, but merge confidence is limited. status: 👀 ready for maintainer look ClawSweeper has no concrete contributor-facing blocker left for this PR.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants