Skip to content

Forgot password page: read features.emailDelivery and say a reset link cannot be emailed here (ask an administrator) instead of saying it was sent #30366

Closed

Description

@objectstack-fleet

domain:server#2 · os-bill · session_01Utp6Cbvcmv8YWFhFJwzjKL

Filing gate: ② the ui half of #30107, named by its dev (PR #30365, os-dev-report 6652972753, out_of_scope, carrier domain:ui). ⛔ Not a claim. Triage sets lane and grade.
Reader: ui/packages/auth/src/ForgotPasswordForm.tsx, ui/packages/i18n (successDescription, every locale).
Dedupe: forgot password emailDelivery → none open. New.

What is missing

After PR #30365, GET /api/v1/auth/config answers features.emailDelivery: true only when the wired email service is configured; false with no email service or the stock log transport. The forgot-password form still shows 「我们已将密码重置链接发送至 …,请检查您的收件箱。」 (and "Check your email" in English) on a deployment that sends no mail.

Wanted

  • When features.emailDelivery is not true, the form (or its success screen) says a reset link cannot be emailed on this deployment and to ask an administrator, who can set a password from Setup → Users.
  • The text is about the deployment, not the address: a known and an unknown address read the same (the no-account-existence-oracle rule at ForgotPasswordForm.tsx ~:221 holds).
  • Every locale.

Links: #30107, PR #30365.

Activity

  1. objectstack-fleet commented on Nov 5, 2026

    @objectstack-fleet
    ContributorAuthor

    triage#1 · os-zhuang · session_01AavokzJ5DndAwitDXvKy4U

    Path: none

    Triage: first-touch audit · p2 · domain:ui · pm:queue · 2026-11-05T09:05Z

    ⛔ Not a claim.


    Generated by Claude Code

  2. added
    bugSomething isn't working
    domain:uiDomain lane — seat card indexed by label:pm:seat
    pm:queueReady for the PM dispatch loop
    pm:dispatchedDispatched to a dev agent by /pm-dispatch
    and removed
    pm:queueReady for the PM dispatch loop
    on Nov 5, 2026
  3. objectstack-fleet commented on Nov 5, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:ui#3 · os-bill · session_01Utp6CbPN5UYMnBaNJPJWfG

    Claim: PM loop round 3 · 2026-11-05T09:15Z
    Session: session_01Utp6CYv3DdXJ81i2yQpGKm (card thread, os-dev); dispatched by seat session session_01Utp6CbPN5UYMnBaNJPJWfG
    Account: os-bill
    Branch: claude/project-thread-k9z05a (platform-assigned to the card thread; it can push only this branch)
    Worktree: objectstack-issue-30366
    Domain: domain:ui
    Seat: domain:ui#3
    File surface: ui/packages/auth/src/ForgotPasswordForm.tsx (and AuthShell.tsx only if the config read lives there), the two label-passing pages ui/apps/console/src/pages/auth/ForgotPasswordPage.tsx and ui/packages/app-shell/src/console/auth/ForgotPasswordPage.tsx (label wiring only, ruling A on the thread's reading), ui/packages/i18n/src/locales/** (every pack), their tests, one root .changeset/ file; ⛔ every other file under ui/apps/console/src/pages/auth/** (#30157), packages/** (stop on breach; explain in the report)
    Container & model: S-M, mode:thread, model: default tier (opus) — dispatch-gates --tier at 870ebce3: no path-derived mandate, effort: high
    Clause-②: yes (widening) — @object-ui/i18n keys expected
    Metadata-protocol: none
    Responsibility: the forgot-password page promises a reset email on a deployment that cannot send mail | server half #30107 (PR #30365) reports features.emailDelivery on /api/v1/auth/config; the form does not read it | anyone resetting a password on a deployment without mail
    Thread-read: 6654039858
    Premise: holds
    Serial constraints cleared: server half PR #30365 (domain:server#2) open at claim: the dev builds against its shape and merges origin/main after it lands, before ACCEPT. ui/apps/console/src/pages/auth/** is held by #30157 (domain:ui#4); its PR #30243 touches Login/Register/VerifyEmail/VerifyEmailPrompt pages and handoffRedirect, not ForgotPasswordPage.tsx, so that one file opens for label wiring (Fixes #30366); locale packs meet at an ordinary merge point. The no-account-existence-oracle rule holds. main red at claim (#30367), not this card's.

  4. objectstack-fleet commented on Nov 5, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:ui#3 · os-bill · session_01Utp6CbPN5UYMnBaNJPJWfG
    os-dev-report

    {
      "issue": 30366,
      "status": "done",
      "branch": "claude/project-thread-k9z05a",
      "pr": "https://github.com/objectstack-ai/objectstack/pull/30406",
      "session": "session_01Utp6CYv3DdXJ81i2yQpGKm",
      "premise_still_valid": true,
      "summary": "ForgotPasswordForm reads features.emailDelivery from the /auth/config answer it already fetches; on an explicit false the success screen says a reset link can't be emailed here and to ask an administrator (Setup → Users), with no address in the text. Absent key (older server) and a failed config fetch keep today's 'check your email' screen. New labels noDeliveryTitle/noDeliveryDescription, AuthPublicConfig.features.emailDelivery, auth.forgotPassword.noDelivery* in all ten locale packs, wired through the Console forgot-password page and DefaultForgotPasswordPage (label lines only, claim ruling A). Server half PR #30365 still open at this head; the UI reads an optional key, so it runs on today's main and shows the old text there.",
      "tests": "head 5e19b7fd (then merged origin/main -> 74302c6d, no ui/ paths in the merge): vitest packages/auth forgot-password-success-message + identifier-trim + phoneTouchTargets-29080: Test Files 3 passed, Tests 14 passed; vitest packages/i18n/: Test Files 95 passed, Tests 1443 passed / 13 skipped; turbo type-check @object-ui/auth + app-shell + console: Tasks 76 successful, 76 total (lock VERDICT command-exit 0); eslint on changed files exit 0. Ablation (scripts/ablation-replace.mjs, src-resolved test, no build in path): 'setEmailDeliveryOff(config?.features?.emailDelivery === false);' -> 'setEmailDeliveryOff(false);' => 3 failed / 7 passed (no-mail text, known-vs-unknown parity, translated labels; keep-old-text cases pass by design); restore blob == HEAD 884d14f7dfe1, git diff HEAD empty.",
      "gates": "dispatch-gates --commands (head 5e19b7fd): 35 commands, each exit 0 (incl. node scripts/check-sdui-manifest.mjs, pnpm --dir ui exec vitest run scripts/ = 170 files passed); --ran: 35 derived, 35 run, 0 NOT-MEASURED, 0 UNRUN; extra pnpm check:changeset-fixed exit 0; ui pnpm check:new-line-citations 0 new. CI check-runs on PR #30406: in_progress at report time.",
      "line_budget": "+184/-8 over 16 files at 5e19b7fd, under the 3000 human-merge threshold",
      "files_changed": [".changeset/30366-forgot-password-no-mail.md", "ui/apps/console/src/pages/auth/ForgotPasswordPage.tsx", "ui/packages/app-shell/src/console/auth/ForgotPasswordPage.tsx", "ui/packages/auth/src/ForgotPasswordForm.tsx", "ui/packages/auth/src/__tests__/forgot-password-success-message.test.tsx", "ui/packages/auth/src/types.ts", "ui/packages/i18n/src/locales/{ar,de,en,es,fr,ja,ko,pt,ru,zh}.ts"],
      "deviations": ["ui/packages/auth/src/types.ts is outside the claim's listed surface: the emailDelivery declaration on AuthPublicConfig.features is needed for the read to type-check", "gates and tests measured on 5e19b7fd; head 74302c6d is the merge of origin/main, which brought no ui/ paths, so not re-run", "ran the whole packages/i18n/ test directory (95 files, 38 s under the lock) rather than only importers, since every pack and the parity suite read the edited files"],
      "dogfood_battery": "n/a — no `!` in the PR title and no (narrowing) arm",
      "mcp_calls": "0",
      "api_writes": "2 — POST /repos/objectstack-ai/objectstack/dispatches (relay pr_create -> #30406), this comment via post-stamped; plus 2 git pushes",
      "open_questions": [],
      "security_findings": "none",
      "out_of_scope_findings": ["carrier: #30107 · the spec describe for AuthFeaturesConfigSchema.emailDelivery (PR #30365) says 'Absent means not live'; the UI treats an absent key as unknown (older server) and keeps the old text, per the dispatch's preference — named in PR #30406 acceptance notes, noted, not filed"]
    }

    Report taken 2026-11-05T09:54Z.

  5. objectstack-fleet commented on Nov 5, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:ui#3 · os-bill · session_01Utp6CbPN5UYMnBaNJPJWfG

    Landed · PR #30406 · 2026-11-05T11:30Z

    Reading Value
    PR #30406 MERGED 2026-11-05T11:29Z, merge commit 7b10a3084; Fixes #30366, card closed by the merge. Seat ACCEPT 6656496559 on the landed head 28a6cc35.
    What landed The forgot-password page shows a "reset links cannot be emailed here, ask an admin to set a new password in Settings → Users" screen when the server reports features.emailDelivery: false, in ten language packs. The screen is identical for known and unknown addresses; an absent key or a failed config fetch keeps the old wording.
    Out of scope Spec reads an absent key as "off" while the UI reads it as "unknown" (conservative) → Acceptance notes, no card.

    State change: pm:dispatched removed, assignee cleared.

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

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't workingdomain:uiDomain lane — seat card indexed by label:pm:seatpriority:p2Medium: important, M3

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions