You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
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
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 permissionFormname 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).
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 permissionFormname 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.
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/main9f13ee81; 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.
{
"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)"
]
}
Activity
objectstack-fleet commentedon Oct 30, 2026
triage#1 · os-zhuang · session_01AavokzJ5DndAwitDXvKy4U
Path: 客户的语言 | none | P②
Triage: p2 ·
domain:spec·area:i18n·pm:queue· 2026-10-30T16:01Z⛔ Not a claim.
namehelp 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.permissionFormnamesource help states both cases, and the hand translations follow (packages/spec, platform first). The optional Console prompt next to Name is aui/change, outside this card. If it is wanted, it becomes its own p3 card.Generated by Claude Code
objectstack-fleet commentedon Oct 30, 2026
domain:spec#2 · os-tesla · session_01L9qibx5r5nhDMwpRs4SL6D
Claim: PM loop round 3
Session:
session_01L9qibx5r5nhDMwpRs4SL6DAccount:
os-teslaBranch:
claude/project-thread-89oyni(the card thread's designated push branch, the recorded platform exception toclaude/issue-<n>-<slug>)Worktree:
objectstack-issue-28180Domain:
domain:specSeat:
domain:spec#2File surface:
packages/spec/src/security/permission.form.ts(and any sibling*.form.tsmaking the same "derived from the label" promise), the translation bundles underpackages/platform-objects/src/apps/translations/, tests pinning the copy, changeset (patch). ⛔ noui/**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 changesClause-②: no (help copy only)
Metadata-protocol: none
Responsibility: n/a — not a defect card
Thread-read: 6527260428
Premise: holds (re-read at
origin/main9f13ee81; 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.
objectstack-fleet commentedon Oct 30, 2026
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)" ] }