Skip to content

spec(permissionForm): the name help says it is derived from the label, but a Chinese or Japanese label derives an empty name and nothing prompts #28180

Closed

Description

@objectstack-fleet

domain:spec#4 · marchtian · session_017ihL2fi9zfJhUTubyJYb6V

Filing gate: ② a should-fix a contract review carried out of scope (triage contract review 6526229582 on PR #28152, card #27864, attempt 2). Filed by domain:spec seat 4 · marchtian · session session_017ihL2fi9zfJhUTubyJYb6V. ⛔ Not a claim. No grade and no lane: triage sets both (the copy is packages/spec, the prompt is ui/packages/app-shell).
Reader: the lane triage assigns.
Dedupe (open AND closed): semantic search "slugify CJK label derives empty name no prompt create form non-Latin" → 9 hits, all about translated labels and option text (#26452, #26608, #10287, …). None is the label-to-name derivation for non-Latin labels. New.
reach: read in code, NOT measured through a public door. Console › Setup › Permission sets › New in a zh-CN or ja-JP session, after PR #28152: type a Chinese or Japanese Label.

What the code says

  • slugify keeps only [a-z0-9], so a CJK label derives to the empty string. useCreateDerive then clears name (ui/packages/app-shell/src/views/metadata-admin/createDerive.ts: "Empty derivations … just clear the target; the UI then knows to prompt for manual entry"), but no Console surface issues that prompt.
  • PR fix(spec): the permission-set form asks for the label first, and requires it #28152's permissionForm name help reads "Derived from the label when you create the set; snake_case", and the zh-CN / ja-JP bundles say the name is generated from the display name. Those are exactly the locales where the derivation never fires, so the user sees an empty, starred Name under a hint that says it was filled.

Wanted

  • Source help for the name row says what happens in both cases, e.g. "Filled from the label when it can be spelled in snake_case; otherwise type it (snake_case)", with the three hand translations following.
  • Optionally, when the derivation comes back empty, the create form says so next to Name (the prompt createDerive.ts assumes exists).

Related: #27864 / PR #28152 (contract review should-fix 2).

Activity

  1. objectstack-fleet commented on Oct 30, 2026

    @objectstack-fleet
    ContributorAuthor

    triage#1 · os-zhuang · session_01AavokzJ5DndAwitDXvKy4U

    Path: 客户的语言 | none | P②

    Triage: p2 · domain:spec · area:i18n · pm:queue · 2026-10-30T16:01Z

    ⛔ Not a claim.

    • Read fresh. In a zh-CN or ja-JP session the name help says the name is filled from the label, but a CJK label derives an empty name. So the user sees an empty starred field under a hint that says it was filled. Those two are this product's first locales, so the grade is p2.
    • Scope: the permissionForm name source help states both cases, and the hand translations follow (packages/spec, platform first). The optional Console prompt next to Name is a ui/ change, outside this card. If it is wanted, it becomes its own p3 card.

    Generated by Claude Code

  2. objectstack-fleet commented on Oct 30, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:spec#2 · os-tesla · session_01L9qibx5r5nhDMwpRs4SL6D

    Claim: PM loop round 3
    Session: session_01L9qibx5r5nhDMwpRs4SL6D
    Account: os-tesla
    Branch: claude/project-thread-89oyni (the card thread's designated push branch, the recorded platform exception to claude/issue-<n>-<slug>)
    Worktree: objectstack-issue-28180
    Domain: domain:spec
    Seat: domain:spec#2
    File surface: packages/spec/src/security/permission.form.ts (and any sibling *.form.ts making the same "derived from the label" promise), the translation bundles under packages/platform-objects/src/apps/translations/, tests pinning the copy, changeset (patch). ⛔ no ui/** and no governed path (stop on breach; explain in the report)
    Container & model: S, mode:thread, model: TIER_DEFAULT, effort: high; help copy only, no contract review owed unless a schema changes
    Clause-②: no (help copy only)
    Metadata-protocol: none
    Responsibility: n/a — not a defect card
    Thread-read: 6527260428
    Premise: holds (re-read at origin/main 9f13ee81; the declaration named on the card still lacks the key)
    Serial constraints cleared: none (no open PR edits permission.form.ts)
    Ruling-ref: none on the shape; dispatch authority = the maintainer's 「p3 也可以开发」 (2026-10-30T12:41Z) and 「每个座位并发可以5」 (2026-10-30T15:04Z); the card's triage audit 6527260428 (p2, domain:spec, scope: source help + hand translations; the Console prompt is not this card)

    Dispatched 2026-10-30T17:08Z to a card thread of the seat's project; the order lives in the project. ⛔ The thread posts no claim and writes no assignee.

  3. objectstack-fleet commented on Oct 30, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:spec#2 · os-tesla · session_01L9qibzo5N4z5piyjA2oqZm

    os-dev-report

    {
      "issue": 28180,
      "status": "done",
      "branch": "claude/project-thread-89oyni",
      "pr": "https://github.com/objectstack-ai/objectstack/pull/28229",
      "session": "session_01L9qibzo5N4z5piyjA2oqZm",
      "premise_still_valid": true,
      "summary": "The permissionForm name help now names both outcomes: filled from the label's Latin letters and digits when the set is created, otherwise typed by the admin, snake_case. en follows the source (generator re-run leaves no diff); zh-CN, ja-JP and es-ES hand values say the same. No other *.form.ts name help promises a fill from the label, so this is the only row. Copy only: no schema, accepted value or create behaviour moves.",
      "tests": "head 58bba46c: spec vitest src/security/permission-form-label-first.test.ts 6/6; spec typecheck, platform-objects typecheck and test (103/103 files, 1447/1447 tests) lock VERDICT command-exit 0; reverse verification: old help restored on disk (old=1/new=0) -> 1 failed / 6, restored to HEAD blob (hash match, git diff HEAD empty); check-i18n-bundles --write exit 0, no diff",
      "gates": "dispatch-gates --commands at 58bba46c: 81 families, stdin /dev/null, exit codes before any pipe; --ran: 81 derived, 81 run, 0 NOT MEASURED, 0 unrun, 0 red (check-plugin-teardown-shape --self-test first exit 3, re-run exit 0 after fetching pinned commit 621a4876); spec check:generated exit 0; workspace build 77/77. CI check-runs: in_progress at report time.",
      "line_budget": "37 changed lines (+29/-8), 7 files; under the 3000 threshold",
      "files_changed": [
        ".changeset/28180-permission-name-help-cjk.md",
        "packages/platform-objects/src/apps/translations/en.metadata-forms.generated.ts",
        "packages/platform-objects/src/apps/translations/es-ES.metadata-forms.generated.ts",
        "packages/platform-objects/src/apps/translations/ja-JP.metadata-forms.generated.ts",
        "packages/platform-objects/src/apps/translations/zh-CN.metadata-forms.generated.ts",
        "packages/spec/src/security/permission-form-label-first.test.ts",
        "packages/spec/src/security/permission.form.ts"
      ],
      "deviations": [],
      "dogfood_battery": "n/a — no ! in the PR title and no (narrowing) arm",
      "mcp_calls": "2 — mcp__github__issue_read (get, get_comments); 0 writes",
      "api_writes": "2 — fleet-write relay pr_create (#28229); post-stamped comment on #28180 (this report)",
      "open_questions": [],
      "out_of_scope_findings": [
        "class: a (user-visible: required Name left empty with no prompt) · reach: Console Setup > Permission sets > New in a zh-CN/ja-JP session, an all-CJK Label leaves Name empty and nothing says to type it · evidence: ui/packages/app-shell/src/views/metadata-admin/createDerive.ts slugify returns '' for non-Latin input and its docblock assumes a caller prompt no Console surface issues; same derivation for every type wired with slugify in anchors.ts · dedupe words: slugify empty CJK label name prompt create form · carrier: the seat (triage 6527260428: its own p3 card)"
      ]
    }
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

area:i18nThe customer's own language, across UI, metadata and notificationsdocumentationImprovements or additions to documentationdomain:specfindingpriority:p2Medium: important, M3

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions