Skip to content

New Permission Set form asks for the API Name before the Label and leaves Label optional (#27521 row 16) #27864

Closed

Description

@objectstack-fleet

domain:ui#2 · os-bill · session_01Utp6CY2n1JmZZKrHgtp9jC

Filing gate: ② a wrong or confusing state shown to the user. Split from #27521 row 16 by the seat; the parent's acceptance says each row is taken as its own card or answered.

Business reason

Who: every administrator creating a permission set. What happens: the form opens on Name (the API name) with Label below it and optional, so the administrator types a machine name first and can save a set with no human label. Name derivation from Label already works on main, so the order fights the derivation. Reach: every administrator creating a set.

Mechanism

  • packages/spec/src/security/permission.form.ts orders Name before Label and leaves Label optional.
  • The ui half (one message instead of three on a bad name) is the sibling card split from the same row.

Measured at main @ 561b7642, re-driven (stock examples/app-showcase --seed-admin, admin, Chromium 1440×900).

Wanted

Label first and required; Name after it, derived from the Label.

Acceptance

  • The Permission Set form lists Label before Name, and Label is required.
  • The spec form test pins the order and the required flag.

Refs #27521


Generated by Claude Code

Activity

  1. objectstack-fleet commented on Oct 30, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:spec#4 · marchtian · session_017ihL2fi9zfJhUTubyJYb6V

    Claim: PM loop round 3 · 2026-10-30T12:30Z
    Session: session_017ihL2fi9zfJhUTubyJYb6V
    Account: marchtian
    Branch: claude/issue-27864-permission-set-label-first
    Worktree: objectstack-issue-27864
    Domain: domain:spec
    Seat: domain:spec#4
    Ruling-ref: maintainer 「可以开始派发 p3」 (2026-10-30T12:23Z), lifting the p3 hold; the card's filing gate ② (split from #27521 row 16)
    File surface: packages/spec/src/security/permission.form.ts (the Identity section lists label before name, label required, the name help says it derives from the label), its form test, changeset (@objectstack/spec patch). ⛔ No change to the permission-set object's accept set or to name derivation (stop on breach; explain in the report)
    Container & model: S, mode:subagent, model: TIER_DEFAULT (opus) — the quota-exhaustion exemption (claude-fable-5-1 answered HTTP 429; maintainer 「你没有fable了,使用 opus开发完之后等契约复审」), effort: medium
    Clause-②: no
    Metadata-protocol: none
    Responsibility: the New Permission Set form opens on the API name with an optional Label below it, so an administrator types a machine name first and can save a set with no human label | Label first and required, Name after it and derived from the Label, which already works on main | every administrator creating a permission set
    Thread-read: none
    Premise: holds — on 549203d040 permission.form.ts:33–34 lists name (required) before label (not required)
    Serial constraints cleared: no open PR touches permission.form.ts (open PR file lists read just before this claim)

  2. objectstack-fleet commented on Oct 30, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:spec#4 · marchtian · session_017ihL2fi9zfJhUTubyJYb6V
    os-dev-report
    Reported: 2026-10-30T14:19Z

    {
      "issue": 27864,
      "status": "done",
      "branch": "claude/issue-27864-permission-set-label-first",
      "pr": "https://github.com/objectstack-ai/objectstack/pull/28152",
      "head": "634b6c8ab0",
      "session": "session_017ihL2fi9zfJhUTubyJYb6V",
      "premise_still_valid": true,
      "summary": "permission.form.ts Identity section now lists label first with required true, then name (still required) whose help reads 'Derived from the label when you create the set; snake_case'. New spec test pins order, required flags, help text and that PermissionSetSchema still parses a set with no label. platform-objects metadata-form bundles regenerated (key order + en name help); zh-CN/ja-JP/es-ES name help re-translated by hand. Changeset: @objectstack/spec patch + @objectstack/platform-objects patch, Clause-②: no, Metadata-protocol: none.",
      "tests": "spec: new test 6/6 green; ablation (form restored from 549203d040, test unchanged) red 4/6, restored from HEAD and hash-compared. spec full vitest: Test Files 844 passed (844), Tests 23964 passed, 1 todo (exit 0). platform-objects full vitest: Test Files 101 passed (101), Tests 1434 passed (exit 0). spec build exit 0, spec check:generated exit 0, spec typecheck exit 0. check-i18n-bundles: in sync (exit 0). Merged origin/main once (head 634b6c8ab0) before these runs.",
      "gates": "dispatch-gates --commands on 634b6c8ab0: 81 derived, 81 run, exits recorded before any pipe; --ran reconciliation: 79 run, 2 NOT-MEASURED (exit 3: check:dual-build-cjs-loads, check:type-check-debt — prerequisite, unbuilt workspace / lock queue-timeout), 0 UNRUN. check:dts-closure exit 1 = prerequisite (60 packages missing .d.ts from this worktree's own OS_SKIP_DTS closure build), NOT MEASURED. All other 78 exit 0. platform-objects typecheck NOT MEASURED locally: exit 2 on TS7016 for @objectstack/metadata-core (built without declarations), the DTS rebuild never got the shared lock (4 x 540s queue-timeout, holder issue-27908 heavy2.sh >30 min) — declared narrowing, CI TypeScript Type Check owns it. PR check-runs at report time: in_progress (Check Changeset, Lint lanes, Type Check lanes, Governed Surface Queue Guard, PR-body guards).",
      "line_budget": "118 changed lines (+100 / -18), 7 files; under the 3000 threshold",
      "dogfood_battery": "n/a — no ! in the PR title and no (narrowing) arm",
      "files_changed": [
        "packages/spec/src/security/permission.form.ts",
        "packages/spec/src/security/permission-form-label-first.test.ts",
        "packages/platform-objects/src/apps/translations/en.metadata-forms.generated.ts",
        "packages/platform-objects/src/apps/translations/zh-CN.metadata-forms.generated.ts",
        "packages/platform-objects/src/apps/translations/ja-JP.metadata-forms.generated.ts",
        "packages/platform-objects/src/apps/translations/es-ES.metadata-forms.generated.ts",
        ".changeset/27864-permission-set-form-label-first.md"
      ],
      "deviations": [
        "PM assumption refuted: no other spec form lists label before name and none words name help as derived from label (16 forms measured, all name-first); the card's Wanted was followed, not the house pattern.",
        "File surface beyond the claim: platform-objects metadata-form bundles (generated, regenerated by script) plus hand re-translation of the permission name help in zh-CN, ja-JP, es-ES; changeset therefore also bumps @objectstack/platform-objects patch.",
        "platform-objects typecheck and three derived gates NOT MEASURED locally (prerequisite / lock queue-timeout), declared narrowing; CI owns them.",
        "No Fable or other independent review run (order override)."
      ],
      "mcp_calls": "0",
      "api_writes": "2 — fleet-write relay pr_create (POST /repos/objectstack-ai/objectstack/pulls, draft, no labels, no assignees) and this comment via post-stamped (POST /repos/objectstack-ai/objectstack/issues/27864/comments); plus git push (not a REST write)",
      "open_questions": [],
      "out_of_scope_findings": [
        "carrier: none · noted, not filed — the other 16 spec forms with a label→name derive rule in the Console (action, app, view, page, dashboard, …) still list name before label; same UX shape as this card but no repro or ruling, so PR Acceptance notes only"
      ]
    }
  3. objectstack-fleet commented on Oct 30, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:spec#4 · marchtian · session_017ihL2fi9zfJhUTubyJYb6V

    Landed · 2026-10-30T16:20Z · PR #28152 merged by the queue at 2026-10-30T16:19Z as dc4755c4de; the card closed by Fixes. This seat strips pm:dispatched in the same act. The contract review was PASS on the landed head (6526229582). Its two should-fixes are filed: #28179 makes the create form's Save refuse a starred-but-optional field left empty, and #28180 fixes the name help for labels that cannot be spelled in snake_case (Chinese, Japanese).

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

Metadata

Metadata

Assignees

Labels

area:accessPermissions that actually hold — RLS/FLS, sharing model, write-path guardsbugSomething isn't workingdomain:specpriority:p3

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions