Repository navigation
Description
Follow-up filed from the Phase 3b closing inventory (issue #3456, design #3455).
Problem
sanitize_name (pkgs/id/src/web/identity.rs:559-569) strips control characters plus only the bidi override/isolate subset (is_bidi_override_or_isolate: U+061C, U+200E/U+200F, U+202A-U+202E, U+2066-U+2069):
.filter(|ch| !ch.is_control() && !is_bidi_override_or_isolate(*ch))The rest of the shared Cf set passes through to collab display names and cursor frames: U+200B (zero-width space), U+FEFF (zero-width no-break space), U+00AD (soft hyphen), U+2060-U+2064, U+FFF9-U+FFFB, etc. The existing test even pins ZWJ/ZWNJ pass-through (a\u{200d}b\u{200c}c unchanged). A zero-width look-alike name renders identically to a plain one — the look-alike half of the #3455 contract.
Why not fixed in the audit branch
Extending the filter to the full shared set (crate::is_format_char, Unicode 16 Cf in id-core/src/unicode.rs) changes existing-name behavior: ZWJ/ZWNJ-joined names (family emoji sequences) that collab currently keeps would be stripped, and collab display names are user-visible persistent state. That needs a product decision (strip-all vs strip-with-joiner-exception like sanitize_chat), not an audit drive-by.
Acceptance criteria
- Decide: full shared Cf strip, or strip with the ZWJ/ZWNJ exception (
sanitize_chatprecedent inpkgs/id/src/world/util.rs:95-103). - Wire the decision to the shared
crate::is_format_charset — no local subset. - Regression tests: U+200B/U+FEFF/U+00AD stripped; joiner decision pinned; bidi behavior unchanged.
- Contract statement in
commands/text.rsmodule doc updated if the disposition adds a new surface kind.
Out of scope: #3265 (U+FE0F width mechanism — U+FE0F is Mn, not Cf).
Activity
dezren39 commentedon Nov 3, 2026
Intake review
Related: issue #3456 (Phase 3b closing inventory that filed this), issue #3455 (design contract), issue #3265 (explicitly out of scope — U+FE0F is Mn, not Cf). Notes: the issue's first acceptance item is a genuine product decision (full Cf strip vs ZWJ/ZWNJ exception) because display names are persistent user-visible state — a worker should record the decision on the issue before implementing. Risks: stripping joiners changes existing family-emoji-style names; the sanitize_chat precedent (pkgs/id/src/world/util.rs) is the consistency anchor. Suggested approach: decide on the issue, then wire the shared crate::is_format_char set with the regression tests the issue lists.
— Fleet monitor intake (protocol §5), 2026-11-03T02:29:50Z. Labels normalized and
meta/enrichedapplied; the issue already carried acceptance criteria.developing-today commentedon Nov 3, 2026
agent-note:v1
state: triaged (coverage pass)
Coverage pass 2026-11-03: reviewed in the fleet-wide per-issue pass (drift / overlap / already-handled / stale / blockers / ordering). Verdict: still live; queued in repo-health-code-pilot as triage at priority 40 (priority/normal). If this is already handled at current main, the triage closes it with evidence; if it needs splitting, the triage files the split.
Found via: coverage pass 2026-11-03
dezren39 commentedon Nov 3, 2026
🤖 Agent note · picked up
is_format_charset and thesanitize_chatprecedent, record the disposition for the strip-all vs joiner-exception decision, and route the fix.23 remaining items
dezren39 commentedon Nov 3, 2026
agent-note:v1
event: parked
task: 8766 (repo-health-code-pilot; worker repo-worker-code; OpenChamber scheduled lane 1a180ae5-384f-4e71-8d77-08f7b1652c75)
state: parked at 2026-11-03T22:14:20Z until 22:34:20Z. PR #5185 is open; park for CI and resume by checking PR state/checks fresh, then merge only if green and the diff remains scoped.
verified:
cargo test -p id --features web identityfrompkgs/idpassed (52 unit tests, including test_sanitize_name);git diff --checkpassed. CI was not polled because the scheduled lane budget elapsed.workspace: branch
queue/8766-4457-sanitize-name-cf, worktree~/git/fleet/8766, commit896bf337f.commands/text.rscontract checked; no change needed.labels: queue/parked + status/parked set; work/assigned retained.
links: #4457 · PR #5185 · task 8766
dezren39 commentedon Nov 3, 2026
🤖 Agent note · picked up
sanitize_name(pkgs/id web/identity) to the sharedis_format_charCf set, remove the local bidi subset, update the pinned joiner test, add the Cf regression cases.dezren39 commentedon Nov 3, 2026
🤖 Agent note · done
5c53272ff83b):sanitize_namenow strips the sharedis_format_charCf set, the local bidi subset is removed, the pinned joiner test asserts the full-strip outcome (a\u{200d}b\u{200c}c→abc), and regression cases cover U+200B/U+FEFF/U+00AD stripping with ordinary names unchanged.cargo test -p id --features web identity— all pass (incl.test_sanitize_name); Codex review on PR Fix #4457: strip format characters from web identity names #5185 completed with no findings. Issue auto-closed by the merge.