Repository navigation
fix(platform-objects): Create User result dialog reads true for a typed password - #25081
Conversation
…ed password Claude-Session: https://claude.ai/code/session_01MZw2Leqg5M8ZH9pKpMh9jS Co-authored-by: Claude <noreply@anthropic.com>
…he create_user dialog copy Claude-Session: https://claude.ai/code/session_01MZw2Leqg5M8ZH9pKpMh9jS Co-authored-by: Claude <noreply@anthropic.com>
📓 Docs Drift CheckNothing in this diff resolved to a documentable surface (no symbol, route or SDK anchor derived from 1 changed package(s)), so this run has no opinion about the docs. What this run could not see
Coarse fallback — 3 page(s) merely mention a changed package (the pre-#9192 predicate, kept for the deliberately-wide backstop): |
Contract reviewServed-tier: Scope: the net diff against the merge base (7 files, +92/−10):
Read with them:
① Derived judgments
② Semver level
③ Boundary flags
Implemented-by: VERDICT: PASS Generated by Claude Code |
席位核对 ·
|
| Item | Reading |
|---|---|
| Shape | Draft PR → main. The body opens Fixes #24936. 7 files, +92/−10. Not governed: check-governed-merges matched 0 of 7 paths; 102 changed lines. |
| Scope | Create User's result dialog says "If a temporary password was generated, copy it now — it is shown only once and never stored." with a "Done" button, in place of "Copy the temporary password now…" / "I have saved this password". It reads true whether the administrator typed the password or let the server generate one. |
| Seat's own read | It is the same sentence and button as set_user_password, whose response has the same two outcomes. objectui's ActionResultDialog.tsx drops a field whose value is undefined, so a typed password shows the email and the hedged sentence, and a generated one also shows the password. The params, handler, response and listed fields are untouched. |
| Review | TIER_DEFAULT. Record 6311080671 is PASS on this head. |
| Declaration | One changeset, @objectstack/platform-objects patch, with Clause-②: no (text only: …) at a line start, as on the claim and the PR body. |
| Cross-lane | None. The cli and spec i18n fixtures carry their own copies and did not move. |
| Gates | Dev at 4fdd4999b: 66 derived, 66 run, all exit 0, after a full build for the one that first exited 3. platform-objects passed 1243 tests and its typecheck exited 0; core test:repo passed 82. The new pins pass 4/4. Ablation of the source: 2 red. Ablation of the zh-CN leaves: 1 red. Both were restored to HEAD. |
| CI | At this read on 4fdd4999b9: ci-failure GREEN, all 41 check-runs completed, none failed. git merge-tree against today's origin/main (f46ef4d70e) is clean. |
Disposition:
open_questions: A, as the dev settled it: reuseset_user_password's sentence and button, with no new translation.deviations: all accepted: no pin in another lane moved; the model-free trailers; the renderer unread by the dev, read by the seat; the worktree cleanup.out_of_scope_findings: none.
Landing: ordinary queue (pr_ready + automerge_enable through the relay). Fixes #24936 then closes the card.
Generated by Claude Code
Fixes #24936
Clause-②: no (text only: the create-user result dialog's sentence and button; no param, response, status, outcome or export moves)
What changed
sys_user.create_user's result dialog said "Copy the temporary password now — it is shown only once and never stored." with an "I have saved this password" button. It said that in both outcomes. The endpoint (plugin-authadmin-user-endpoints.ts,...(resolved.generated ? { temporaryPassword } : {})) returnstemporaryPasswordonly when it generated one. The dialog skips a field whose path is absent from the response, so after a typed password it showed the email alone and still asked the admin to save a password.packages/platform-objects/src/identity/sys-user.object.ts: thecreate_userresultDialognow reads "If a temporary password was generated, copy it now — it is shown only once and never stored." with a "Done" button. That is the same sentence and button asset_user_passwordin the same file, whose dialog has the same two outcomes. The title, params,bodyExtra, handler, response and dialog fields are unchanged.en.objects.generated.ts: regenerated withnode scripts/check-i18n-bundles.mjs --write(exit 0), not edited by hand.zh-CN/ja-JP/es-ESobjects.generated.ts: the two hand-written leaves now reuseset_user_password's existing translations (如果生成了临时密码… / 完成, 一時パスワードが生成された場合は… / 完了, Si se generó una contraseña temporal… / Hecho). The merge-mode regeneration kept them. None of these leaves has a source-hash entry.packages/platform-objects/src/identity/create-user-result-dialog-copy.test.ts. It checks the source sentence and button (the button must not mention a saved password), the three dialog fields, and, in all four locales, that thecreate_userdialog's description and button equalset_user_password's.patchfor@objectstack/platform-objects.Wording choice
ActionSchema.resultDialoghas no per-outcome copy, so one sentence must hold for both outcomes. I reusedset_user_password's sentence and button rather than writing new copy:domain:spec's.Pins and fixtures
packages/cli/test/i18n-extract.test.tshas its ownset_passwordfixture with different text ("…shown only once."). It does not quote this object and does not move.packages/spec/src/system/i18n-resolver.test.tshas its own inlinecreateUserobject and inline zh-CN bundle. It imports nothing fromplatform-objectsand does not move.Verification (head
4fdd4999b, baseorigin/main2b1382a5b;origin/mainre-fetched before opening and already merged, no new commits)pnpm exec turbo run build --concurrency=2(full build, under the verify lock): VERDICT command-exit 0.pnpm --filter @objectstack/platform-objects typecheck: exit 0.pnpm --filter @objectstack/platform-objects test: exit 0, Test Files 84 passed (84), Tests 1243 passed (1243).pnpm --filter @objectstack/core test:repo: exit 0, Test Files 6 passed (6), Tests 82 passed (82).node scripts/check-i18n-bundles.mjs --write: exit 0 after building its prerequisite closure. The first run exited 3 (CLI not built).scripts/ablation-replace.mjsput the old sentence and button back insys-user.object.ts(anchor 1 → 0, blobbc6b1792→3f5199d7). 2 of the 4 pin tests went red ("the source sentence is conditional…" and "the button claims no saved password…"). Restored: blob == HEADbc6b1792,git diff HEADempty.c6d8953c→5326f33a). 1 of 4 went red ("every locale says the same thing as set_user_password…"). Restored: blob == HEAD,git diff HEADempty.node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstackderived 66 families. All 66 were run with each exit code captured before any pipe. 65 exited 0 on the first run.pnpm check:dual-build-cjs-loadsexited 3 (PREREQUISITE NOT MET, nodist/), was re-run after the full build, and exited 0.--ranreconciliation: "66 derived famil(ies) accounted for — 66 run, 0 NOT-MEASURED (a DERIVED zero — all 66 recorded an exit code and none of them is 3)".Acceptance notes
temporaryPasswordcomes from the card's seat review and the existing code comment on thefieldslist. The renderer is unchanged here.Generated by Claude Code