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
New Permission Set form asks for the API Name before the Label and leaves Label optional (#27521 row 16) #27864
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.
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 549203d040permission.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)
{
"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"
]
}
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).
Activity
objectstack-fleet commentedon Oct 30, 2026
domain:spec#4 · marchtian · session_017ihL2fi9zfJhUTubyJYb6V
Claim: PM loop round 3 · 2026-10-30T12:30Z
Session:
session_017ihL2fi9zfJhUTubyJYb6VAccount:
marchtianBranch:
claude/issue-27864-permission-set-label-firstWorktree:
objectstack-issue-27864Domain:
domain:specSeat:
domain:spec#4Ruling-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 listslabelbeforename,labelrequired, thenamehelp says it derives from the label), its form test, changeset (@objectstack/specpatch). ⛔ 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-1answered HTTP 429; maintainer 「你没有fable了,使用 opus开发完之后等契约复审」),effort: mediumClause-②: 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
549203d040permission.form.ts:33–34listsname(required) beforelabel(not required)Serial constraints cleared: no open PR touches
permission.form.ts(open PR file lists read just before this claim)objectstack-fleet commentedon Oct 30, 2026
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" ] }objectstack-fleet commentedon Oct 30, 2026
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 byFixes. This seat stripspm:dispatchedin 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 thenamehelp for labels that cannot be spelled in snake_case (Chinese, Japanese).