Repository navigation
fix(console): long-name rule keeps -digit, emoji and opening quotes with their neighbours - #2935
Conversation
…ith their neighbours The long-name rule missed runs Chromium keeps on one line, so such names widened the Agents table: - a hyphen-minus before a digit holds unless an ASCII letter or digit comes before and an ASCII digit after, or the digit is fullwidth (finding 2000: Cyrillic, Devanagari, Arabic-Indic); - 93 emoji whose line-break class is AL hold like letters, and opening quotes and the like hold after a hyphen, dash or wide space (2001); - a dash that starts a word after a no-break space or non-breaking hyphen holds its letter, and no-break characters keep a run (2002). 45 new rows, each measured against Chromium's layout; 17 fail on main. The alternatives still never overlap, so the check stays linear; new timing payloads cover letter emoji, Devanagari digits and quotes.
|
🦞👀 Pull request received. I will update this pull request when review starts. ClawSweeper review completeClawSweeper finished reviewing this revision. The review result is being finalized. |
|
ClawSweeper status: review started. I am starting a fresh review of this pull request: fix(console): long-name rule keeps -digit, emoji and opening quotes with their neighbours This is item 1/1 in the current shard. Shard 0/1. This temporary status tracks the active review worker. The completed review will appear in the durable ClawSweeper review comment. Crustacean status: shell secured, claws on keyboard, evidence pebbles being sorted. |
Internal review: main held '-' plus a combining mark before an
Arabic-Indic digit, and the split hyphen-minus rules required the digit
right after the hyphen. Chromium holds a marked hyphen before any digit
but a fullwidth one, even after an ASCII letter ('a-' + U+0301 + '1').
Four measured rows pin it. Comments now say the infix separators and
U+FEFF sit in OPENING, and that only ASCII digits break after '-'.
|
Free's clanker here. The head moved to bc5a98e after the review started on ad1c641 (internal-review nits: a combining mark on a hyphen-minus holds the digit after it, with four rows measured against Chromium, plus comment fixes). Asking for a review of the current head. @clawsweeper re-review |
|
🦞👀 Re-review progress:
|
|
Codex review: needs maintainer review before merge. What this changesThis PR extends the Agents list’s long-name rule to recognize additional digit, emoji, quote, and no-break-space combinations. Example: At 1440 px, an Agent has a 200-character name repeating отчёт-2026-«build»⚡deploy⚡.
Review scores
ProductKind: Bug fix · Worth it: Yes · Fix scope: Complete Merge readiness✅ Ready for maintainer review Keep open: this maintainer-authored PR addresses demonstrated Agent-name wrapping failures that remain on main; no introduced correctness defect was found. Priority: P2 Before mergeNone. FindingsNone. Tests
Agent review detailsHow this fits togetherThe console renders Agent names from list results, classifies long unbroken runs, and applies the existing CSS wrapping class to keep those names from widening the table. flowchart TB
A[Agent list results] --> B[Agent name link]
B --> C[Unbroken run rule]
C --> D[Wrapping class]
D --> E[Console table layout]
Technical reviewBest possible solution: Retain the focused classifier repair and its independent browser-layout coverage within the existing selective wrapping design. Do we have a high-confidence way to reproduce the issue? Current-main source exposes the missed character combinations, and the inspected desktop before/after screenshots demonstrate the reported overflow; no target code was executed during this review. Is this the best way to solve the issue? The patch extends the established owner, preserves the threshold and CSS behavior, and checks classifications against Chromium layout while retaining timing coverage against backtracking. AGENTS.md: found but not applied because it conflicted with ClawSweeper's review contract. Codex review notes: model internal, reasoning medium; reviewed against acc8257ba1ca. Provenance checked
TestingProof path: in-process harness. SecurityNone. EvidenceWhat I checked:
LabelsLabel changes:
Label justifications:
Rank-up movesOptional improvements that raise the rating; they are not merge blockers.
Rating scale6/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. WorkflowClawSweeper edits this one comment on every review. Comment Reviewed October 19, 2026, 8:39 AM ET / 12:39 UTC. |
Problem
The long-name rule (
UNBROKEN_RUNinapps/controller/src/console/agents/list.mjs) decides which Agent names may break anywhere. It missed several runs that Chromium keeps on one line, so those names stayed unmarked and widened the Agents table (bughunt-127 findings 2000, 2001 and 2002):a-1,1000-1001), or when the digit is fullwidth.отчёт-2026,é-1and Devanagari or Arabic-Indic dates (-२०२६) do not break. The rule treated all of them as breaks.Change
LETTER_EMOJIclass: the AL-class emoji, counted like letters. The ideograph-before-joiner alternative skips them (and combining marks), so no character matches two alternatives.OPENINGclass, held after a hyphen-minus and after a wide space, soft hyphen or dash, next toCLOSING.The check stays linear: a scan of every code point, with each neighbour shape the rule looks at, finds no character that matches two alternatives and no combining mark that starts one. New timing payloads cover letter emoji before word joiners, Devanagari digits after letters, and word joiners before opening quotes. Each takes under 5 ms.
Verification
console-agents-list-return.test.mjs, "Agents list marks names with no break opportunity...": 49 new rows. Each is measured again against Chromium's own layout in the test. 18 of them fail on main (first failure: the AL-emoji row is unmarked on main). All 34 existing rows still pass.Pinned at 2 CPUs (
taskset -c 12,13) on bc5a98e: that test 20/20, andtests/conformance/console-agent-name-runs.test.mjs20/20. The fullconsole-agents-list-return.test.mjspasses 19/19.Mutation check of the rule against the row table: 164 mutants, each dropping one class element, lookaround or alternative. All are killed (two of them by the conformance timing test) except two, and both are overlap-only (equivalent in what they mark):
(?<=[A-Za-z0-9])lookbehind;LETTER_EMOJIfrom the joiner alternative's lookahead.Each would let one character match two alternatives. That cannot change the result, but it adds backtracking. Here the backtracking is bounded at about 2^10 per run start, because the overlapping character must alternate with a digit or a joiner, so it costs 4-7 ms on the conformance payloads and stays under its 50 ms bound. Dropping
\p{M}from that lookahead is the U+16FE4 case from fix(console): bound the long-name check so joiner runs can't hang the Agents list #2926, and the conformance test catches it (7.2 s).Measured against Chromium on generated sets (random mixes over the rule's special characters, character pairs, digit shapes):
?, at/before non-ASCII, at.before some characters, after U+3001, U+3002 and U+FF0C, between fullwidth letters, and at an em dash before-. These can only over-mark, so they are left for a follow-up.Internal review found no blockers. Its nits were applied: the marked-hyphen case above, and comment accuracy.
Prettier and ESLint are clean on the touched files, and
run-tests.mjs auditreports no issues.Conflicts with open PRs (3-way
git merge-treeagainst this head, compared withorigin/main): no new conflict hunk. feat(console): stop and delete Agents from the Agents list #2524, fix(console): distinguish stale runtime status from loss of access #2505, fix(console): keep followed logs steady and report the first output #2502, Add OCE policy simulation and tester for network and plugin actions #2445, fix: preserve native plugin permissions across Harness selection and admission #2258, fix(console): grant Agent access to accepted Configuration Secrets #2255, Support custom Installation profiles and readable Preset starters #2253, feat: add per-agent sandbox network policies and denial review #2599, feat(auth): sign people in to occ with a device code (rfc-0019) #1619, feat: assign configured OpenClaw roles to Agent users #906 and docs(specs): propose rfc-0019 for repository options without a repository driver #878 have the same hunks as against main. fix(console): secret picker errors name the field and stay visible #2922, fix(console): announce danger feedback lines as alerts and pin the form refusals #2931, fix(console): let the create preflight carry any configuration both creates accept #2833, feat(console): show the authorized native Gateway people roster #2596 and Draft implementation: managed outbound HTTPS for dedicated Gateways #2518 merge cleanly.Storybook: new story Pages/Agents → Long name held by emoji, quotes and digits (
agentsLongNameMixed). It shows a 200-character name of Cyrillic words, digits after hyphens, quoted words and ⚡ that Chromium cannot break.Before, at 1440 the name is unmarked, so it widens the table and pushes every other column out of view. After, it wraps within the width of its ID and all columns show. At 390 the stacked row wraps either way. The media was committed in a0a681a and dropped in the next commit, so the squash carries none.
Risks
Low. This changes presentation only. It decides which names get
agent-name-unbroken, which lets a long name break anywhere instead of widening the table. A wrong "marked" costs a narrower box. A wrong "unmarked" is the pre-existing behaviour.