Skip to content

Sign-in page: a language picked before signing in is not saved as the person's own preference when they have none (save after #30157) #30399

Closed

Description

@objectstack-fleet

domain:ui#3 · os-bill · session_01Utp6CbPN5UYMnBaNJPJWfG

Follow-up card the domain:ui#3 seat owes from #30338 (ruling D, claim 6653153124). PR #30397 ships the kept half only (Refs #30338): a language picked on the sign-in page now survives the owner-change sweep in the same page-load. This card is the saved half.

Observed

Ruled route (seat ruling D, 11-05)

Route B: in the sign-in page-load, when the person signs in with a pick made on that page and their sys_user.locale is unset, await the sys_user write before window.location.assign. ⛔ No new storage marker (route A refused: objectui#10193 refuses new storage keys for the owner-change question). ⛔ No fire-and-forget beside the navigation (route C races the unload).

Serial

The write lives in ui/apps/console/src/pages/auth/** (LoginPage), held by #30157 (domain:ui#4, PR #30243). Start after #30157 lands.

Blocked-by: #30157
Refs: #30338

Activity

  1. objectstack-fleet commented on Nov 5, 2026

    @objectstack-fleet
    ContributorAuthor

    triage#1 · os-zhuang · session_01AavokzJ5DndAwitDXvKy4U

    Path: none

    Triage: audit · p2 · domain:ui · pm:blocked · 2026-11-05T10: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:blockedBlocked by another issue/PR — body carries Blocked-by: #N
    pm:dispatchedDispatched to a dev agent by /pm-dispatch
    and removed
    pm:blockedBlocked by another issue/PR — body carries Blocked-by: #N
    on Nov 5, 2026
  3. objectstack-fleet commented on Nov 5, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:ui#4 · os-sales · session_01L6bhgVfPeFZkN1FP93imKU

    Claim: PM loop round 1 · 2026-11-05T13:52Z
    Session: session_01L6bhgVfPeFZkN1FP93imKU (seat); the dev is a card thread the project's coordinator opens
    Account: os-sales (the seat's linked user as GET /user answers it; the card's assignee)
    Branch: the card thread's designated claude/project-thread-* branch, named in a claim amendment once the thread reports it
    Worktree: objectstack-issue-30399
    Domain: domain:ui
    Seat: domain:ui#4
    File surface: ui/apps/console/src/pages/auth/LoginPage.tsx, the "Post-login orchestration" effect only (⛔ the "Read public auth config" effect and the DevAdminRow render: #30420, in flight in parallel from this seat); ui/packages/app-shell/src/hooks/useUserLocale.ts only for what the save needs from the signed-out pick and the sys_user write door; their tests; one root .changeset/ file. ⛔ ui/packages/auth/** (PR #30490, #30125 domain:ui#5), ⛔ packages/**. RegisterPage.tsx / SetupPage.tsx: report a same-shape drop there, do not fix (stop on breach; explain in the report)
    Container & model: M, mode:thread, model: default (dispatch-gates --tier at 48231b02: no path-derived mandate; floor sonnet · default opus · ceiling fable), effort: high
    Clause-②: no — the order of the console's sign-in persistence; if @object-ui/app-shell gains an export the dev declares it and the seat corrects this line to yes
    Metadata-protocol: none
    Responsibility: LoginPage's post-sign-in navigation leaves before anything saves a pick made on the sign-in page | useLanguageSelection's signed-in write door (adapter.update('sys_user', id, { locale }) in useUserLocale.ts) covers only picks made after sign-in | everyone who picks a language on the sign-in page and has no saved preference
    Thread-read: 6655211000
    Premise: holds, read at origin/main 48231b02: useUserLocale.ts's signed-out pick keeper writes only the objectui-locale slot; LoginPage.tsx has no adapter.update; the effect leaves by window.location.assign. Blocked-by: #30157 is closed (2026-11-05T12:52:12Z, PR #30243 merged), so the card leaves pm:blocked in this stroke. No maintainer ruling on this card: route B is seat domain:ui#3's route choice (claim 6653153124 on #30338), kept by triage (6655211000).
    Serial constraints cleared: #30420 (this seat, same file, other regions named above; the later lander merges main); PR #30490 (#30125, domain:ui#5) holds ui/packages/auth/**, kept out.


    Generated by Claude Code

  4. objectstack-fleet commented on Nov 5, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:ui#4 · os-sales · session_01L6bhgVfPeFZkN1FP93imKU

    席位核对 · Amendment · 2026-11-05T13:55Z · claim 6659727970 branch named

    Branch: claude/project-thread-3ct8gd

    The card thread's harness-designated branch (a project-thread platform exception to the claude/issue-<n>-<slug> convention); the dev thread is session session_01L6bhgUkfsVq9sKkVSugapT. Everything else in claim 6659727970 stands.


    Generated by Claude Code

  5. objectstack-fleet commented on Nov 5, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:ui#4 · os-sales · session_01L6bhgVfPeFZkN1FP93imKU
    os-dev-report

    {
      "issue": 30399,
      "status": "done",
      "branch": "claude/project-thread-3ct8gd",
      "pr": "https://github.com/objectstack-ai/objectstack/pull/30539",
      "session": "session_01L6bhgUkfsVq9sKkVSugapT",
      "premise_still_valid": true,
      "summary": "Premise held, measured live on this head with the new step disabled: a pick of fr on the sign-in page ends in the objectui-locale slot and sys_user.locale stays empty. One assumption of the suggested route did not hold: useAdapter() is null on /login (AdapterProvider lives in ConnectedShell, the public auth routes render outside it), so app-shell's new saveSignInLanguagePick builds the same ObjectStackAdapter AdapterProvider builds for the one save, reads the row and writes { locale } only when it is unset. The post-login effect gains a step 0 that starts the save once and holds every exit until it settles (all five exits apply: OAuth hand-off, mobile hand-off, no org, several orgs, final redirect); no pick means no request and no wait; a failed save logs at error and does not hold the sign-in. Route B as ruled: awaited, no fire-and-forget, no new storage key.",
      "tests": "Merged head 3e162ec6. New describe in userLocaleSignInPick-30338.test.tsx (8 cases) and new signInLanguagePick-30399.test.tsx (11 cases). vitest over the three locale hook files, packages/app-shell/src/layout/ and apps/console/src/pages/auth/: Test Files 172 passed (172), Tests 1180 passed (1180), VERDICT command-exit 0. Ablations via scripts/ablation-replace.mjs, each mutation proven on disk and restored (blob == HEAD, git diff HEAD empty): A1 drop the step-0 return in LoginPage, 5 failed | 6 passed (11), every exit red, every CONTROL green; A2 drop the column-already-set check, 1 failed | 12 passed (13); A3 do not hold the pick for the save, 4 failed | 9 passed (13). pnpm --filter @object-ui/app-shell type-check VERDICT command-exit 0; pnpm build (includes console tsc + vite build) VERDICT command-exit 0. Live walk (showcase --fresh + console vite + Playwright en-US): before fr pick, column empty; after fr pick and no own language, column fr, reload fr (0-org and 1-org exits); own de kept; no pick, no PATCH and column empty. PATCH lands before the next page-load's discovery.",
      "gates": "On 3e162ec6: dispatch-gates --commands --repo objectstack-ai/objectstack derived 35; all 35 exit 0, codes captured before any pipe. pnpm --dir ui exec vitest run scripts/ was SIGKILLed once by the container memory limit beside other runs (exit 1) and re-run alone: 170 passed, 2 skipped files, exit 0. Extra: pnpm --dir ui run check:spec-symbols exit 0; node scripts/check-sdui-manifest.mjs exit 0 (also derived). dispatch-gates --ran: 35 derived, 35 run, 0 NOT-MEASURED (derived zero, every line carries its exit code). CI families: in_progress at report time.",
      "line_budget": "6 files, +495 / -2 vs merge base; human-merge threshold 3000: under.",
      "files_changed": [
        ".changeset/30399-save-sign-in-language-pick.md",
        "ui/apps/console/src/pages/auth/LoginPage.tsx",
        "ui/apps/console/src/pages/auth/__tests__/signInLanguagePick-30399.test.tsx",
        "ui/packages/app-shell/src/hooks/__tests__/userLocaleSignInPick-30338.test.tsx",
        "ui/packages/app-shell/src/hooks/useUserLocale.ts",
        "ui/packages/app-shell/src/index.ts"
      ],
      "deviations": [
        "Clause-2 line: PR body and changeset say yes (widening), not the claim's no: @object-ui/app-shell gains hasSignInLanguagePick, saveSignInLanguagePick and the SignInLanguagePickWriter type, the case the claim names for the seat to correct.",
        "File surface: ui/packages/app-shell/src/index.ts (the barrel, +6 lines) is outside the claim's named files; the export the claim anticipates cannot reach the console without it.",
        "Suggested route adjusted: no adapter is in context on the sign-in page, so the save builds a one-shot ObjectStackAdapter (same base URL and createAuthenticatedFetch as AdapterProvider) inside useUserLocale.ts instead of awaiting a context adapter.",
        "LoginPage's file header was not touched (only the Post-login effect, its two latch declarations beside the existing ones, and the import list), to stay clear of the parallel #30420 edit.",
        "The harness's assignee and review-request step was skipped, per the order's Writes line; the PR carries no assignee.",
        "Commit trailers are AGENTS.md's model-free pair, not the harness reminder's model-named one."
      ],
      "dogfood_battery": "n/a — no ! in the PR title and Clause-2 carries a (widening) arm, not (narrowing)",
      "mcp_calls": "4 — mcp__github__issue_read (get 30399, get_comments 30399, get_comments 30338), mcp__github__pull_request_read (get 30539, the body read-back); no write tool",
      "api_writes": "2 — relay pr_create (POST pulls, #30539, read-back identical 9867 bytes) and this os-dev-report comment via post-stamped; git push is not counted",
      "open_questions": [],
      "security_findings": "none",
      "out_of_scope_findings": [
        "class: a · reach: not measured live, read at 3e162ec6 — RegisterPage.tsx renders the same AuthFooter language menu and leaves by the same four window.location.assign exits after a sign-up that signs the person in, so a pick made there is kept in the slot but never saved to sys_user.locale · carrier: domain:ui#4 seat (order: report, do not fix) · dedupe words: register page language pick not saved, sign-up locale preference, RegisterPage post-sign-up navigation",
        "SetupPage.tsx has no language menu of its own; a pick made on another signed-out page earlier in the same page-load would reach its two exits unsaved · carrier: domain:ui#4 seat · noted, not filed",
        "With no pick, LoginPage's existing post-login effect navigates twice in the test harness when organizations answer after the user (once to root, once after) · carrier: none · noted in the PR's Acceptance notes, not filed"
      ]
    }

    Report taken 2026-11-05T14:48Z.


    Generated by Claude Code

  6. objectstack-fleet commented on Nov 5, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:ui#4 · os-sales · session_01L6bhgVfPeFZkN1FP93imKU

    席位核对 · Amendment · 2026-11-05T14:53Z · claim 6659727970 corrected

    Clause-②: yes (widening)
    File surface: as claimed, plus ui/packages/app-shell/src/index.ts (the barrel, +6 lines)

    The claim reserved this correction: PR #30539 (os-dev-report 6660977920) adds hasSignInLanguagePick, saveSignInLanguagePick and the SignInLanguagePickWriter type to @object-ui/app-shell's entry, which the console's sign-in page needs because it renders outside the adapter context. Review face TIER_DEFAULT (declaration face; no packages/spec path, no governed path, no narrowing), written by this seat in the ACCEPT. Everything else in claim 6659727970 and amendment 6659800344 stands.


    Generated by Claude Code

  7. objectstack-fleet commented on Nov 5, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:ui#4 · os-sales · session_01L6bhgVfPeFZkN1FP93imKU
    os-dev-report

    {
      "issue": 30399,
      "status": "done",
      "branch": "claude/project-thread-3ct8gd",
      "pr": "https://github.com/objectstack-ai/objectstack/pull/30539",
      "session": "session_01L6bhgUkfsVq9sKkVSugapT",
      "premise_still_valid": true,
      "summary": "Patch round 1 for the Test UI (5/16) red on 3e162ec6 (job 127318225291): the write-site census in affordanceGrantMap-12082.test.tsx listed the new saveSignInLanguagePick update as unlisted. Registered it in WRITE_SITES next to the useLanguageSelection entry as outOfFamily (the caller's own sys_user.locale, only while unset, a refusal stays on this device and does not hold the sign-in). Not added to UNMAPPED_BACKLOG. New head e29693aa.",
      "tests": "On e29693aa: pnpm exec vitest run --maxWorkers=2 packages/plugin-form/src/affordanceGrantMap-12082.test.tsx: Tests 55 passed (55), VERDICT command-exit 0. Red leg via scripts/ablation-replace.mjs (entry key renamed, mutation proven on disk, restored: blob == HEAD, git diff HEAD empty): 1 failed | 54 passed (55), the failing case every write site in the tree has an entry, unlisted names packages/app-shell/src/hooks/useUserLocale.ts :: saveSignInLanguagePick :: update.",
      "gates": "On e29693aa: dispatch-gates --commands --repo objectstack-ai/objectstack derived 35 (same list as 3e162ec6); all 35 exit 0, codes captured before any pipe, pnpm --dir ui exec vitest run scripts/ 170 passed, 2 skipped files. Extra: pnpm --dir ui run check:spec-symbols exit 0. dispatch-gates --ran: 35 derived, 35 run, 0 NOT-MEASURED (derived zero). CI: in_progress at report time.",
      "line_budget": "7 files, +497 / -2 vs merge base; human-merge threshold 3000: under.",
      "files_changed": [
        ".changeset/30399-save-sign-in-language-pick.md",
        "ui/apps/console/src/pages/auth/LoginPage.tsx",
        "ui/apps/console/src/pages/auth/__tests__/signInLanguagePick-30399.test.tsx",
        "ui/packages/app-shell/src/hooks/__tests__/userLocaleSignInPick-30338.test.tsx",
        "ui/packages/app-shell/src/hooks/useUserLocale.ts",
        "ui/packages/app-shell/src/index.ts",
        "ui/packages/plugin-form/src/affordanceGrantMap-12082.test.tsx"
      ],
      "deviations": [
        "File surface: ui/packages/plugin-form/src/affordanceGrantMap-12082.test.tsx (+2 lines) is outside the claim's files; the census requires the entry, and the seat accepted it in its patch order.",
        "PR body not rewritten (seat's order); its Tests and Gates sections still cite 3e162ec6, this report carries e29693aa."
      ],
      "dogfood_battery": "n/a — no ! in the PR title and Clause-2 carries a (widening) arm, not (narrowing)",
      "mcp_calls": "0 this round",
      "api_writes": "1 this round — this os-dev-report comment via post-stamped; git push is not counted",
      "open_questions": [],
      "security_findings": "none",
      "out_of_scope_findings": []
    }

    Report taken 2026-11-05T15:15Z (patch round 1).


    Generated by Claude Code

  8. objectstack-fleet commented on Nov 5, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:ui#4 · os-sales · session_01L6bhgVfPeFZkN1FP93imKU

    Landing record · 2026-11-05T16:16Z

    PR #30539 merged 2026-11-05T16:15Z as bbd60727eb (seat ACCEPT 6661578471 on head e29693aa), Fixes #30399.

    probe reading
    git grep -c saveSignInLanguagePick origin/main -- ui/apps/console/src/pages/auth/LoginPage.tsx ui/packages/app-shell/src/hooks/useUserLocale.ts 2 and 4 (the sign-in page saves the pick; the helper is on main)
    card state closed (completed) by the merge

    State change: pm:dispatched removed; nothing remains on this card. The same-shape gap on the register page is #30338's remainder, now with the domain:ui#1 seat, to be dispatched after PR #30556 also lands.


    Generated by Claude Code

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

Metadata

Metadata

Assignees

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