Skip to content

Phase 3b follow-up (#3456): web/identity sanitize_name strips Cc + bidi subset only, zero-width Cf passes to collab display #4457

Closed

Description

@dezren39

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_chat precedent in pkgs/id/src/world/util.rs:95-103).
  • Wire the decision to the shared crate::is_format_char set — no local subset.
  • Regression tests: U+200B/U+FEFF/U+00AD stripped; joiner decision pinned; bidi behavior unchanged.
  • Contract statement in commands/text.rs module 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

  1. dezren39 commented on Nov 3, 2026

    @dezren39
    MemberAuthor

    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/enriched applied; the issue already carried acceptance criteria.

  2. added
    kind/bugSomething isn't working (prefixed form of the classic bug label)
    priority/normalOrdinary priority (the default)
    effort/sSmall: expected under 2 hours of work
    app/idPackage/app: id (pkgs/ or apps/ in this repo)
    meta/enrichedIntake review done: acceptance criteria, links, and normalized labels added
    queue/queuedHas a queued task in the Supabase agent queue
    source/creatorFiled by the new-issue-creator job
    task/triageQueue packet kind: verify, reproduce, and route this item
    on Nov 3, 2026
  3. developing-today commented on Nov 3, 2026

    @developing-today
    Contributor

    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

  4. dezren39 commented on Nov 3, 2026

    @dezren39
    MemberAuthor

    🤖 Agent note · picked up

  5. 23 remaining items

  6. added
    queue/parkedQueue task is parked (waiting on CI, time, or an event)
    status/parkedDeliberately paused with a recorded resume condition
    and removed
    queue/claimedQueue worker lifecycle state
    on Nov 3, 2026
  7. dezren39 commented on Nov 3, 2026

    @dezren39
    MemberAuthor

    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 identity from pkgs/id passed (52 unit tests, including test_sanitize_name); git diff --check passed. CI was not polled because the scheduled lane budget elapsed.
    workspace: branch queue/8766-4457-sanitize-name-cf, worktree ~/git/fleet/8766, commit 896bf337f. commands/text.rs contract checked; no change needed.
    labels: queue/parked + status/parked set; work/assigned retained.
    links: #4457 · PR #5185 · task 8766

  8. added
    queue/claimedQueue worker lifecycle state
    and removed
    status/parkedDeliberately paused with a recorded resume condition
    queue/parkedQueue task is parked (waiting on CI, time, or an event)
    on Nov 3, 2026
  9. dezren39 commented on Nov 3, 2026

    @dezren39
    MemberAuthor

    🤖 Agent note · picked up

  10. dezren39 commented on Nov 3, 2026

    @dezren39
    MemberAuthor

    🤖 Agent note · done

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

Metadata

Metadata

Assignees

Labels

app/idPackage/app: id (pkgs/ or apps/ in this repo)effort/sSmall: expected under 2 hours of workkind/bugSomething isn't working (prefixed form of the classic bug label)meta/enrichedIntake review done: acceptance criteria, links, and normalized labels addedpriority/normalOrdinary priority (the default)source/creatorFiled by the new-issue-creator jobtask/triageQueue packet kind: verify, reproduce, and route this item

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions