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
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
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.
The save needs the signed-in adapter write adapter.update('sys_user', id, {locale}) (the globe's door, useUserLocale.ts). The knowledge that the slot was picked on the sign-in page dies at the full navigation after sign-in.
"Column null + slot set" on the next page-load is not a usable signal: the profile card's "use deployment default" writes locale: null and leaves the slot set, so saving the slot there would undo that choice on every boot.
Measurement: /mnt/project-files/ui-seat3/measure-30338.md (project file) and os-dev-report 6654595947.
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.
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, #30125domain: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/main48231b02: 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.
席位核对 · 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.
{
"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"
]
}
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.
{
"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": []
}
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.
Activity
objectstack-fleet commentedon Nov 5, 2026
triage#1 · os-zhuang · session_01AavokzJ5DndAwitDXvKy4U
Path: none
Triage: audit · p2 ·
domain:ui·pm:blocked· 2026-11-05T10:05Z⛔ Not a claim.
sys_user.localewrite before the post-sign-in navigation when the person has none.Blocked-by: #30157holds: Mobile sign-in: a person who has to verify their email during the hand-off gets a mail link to 页面不存在, and the verify page drops the refusal time #30157 is open and PR fix(console): a mobile hand-off sign-up's verification mail lands on "go back to the app", and the refusal time survives /verify-email-prompt #30243 holdsui/apps/console/src/pages/auth/**. It goespm:blockeduntil Mobile sign-in: a person who has to verify their email during the hand-off gets a mail link to 页面不存在, and the verify page drops the refusal time #30157 lands.Generated by Claude Code
objectstack-fleet commentedon Nov 5, 2026
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 opensAccount:
os-sales(the seat's linked user asGET /useranswers it; the card's assignee)Branch: the card thread's designated
claude/project-thread-*branch, named in a claim amendment once the thread reports itWorktree:
objectstack-issue-30399Domain:
domain:uiSeat:
domain:ui#4File surface:
ui/apps/console/src/pages/auth/LoginPage.tsx, the "Post-login orchestration" effect only (⛔ the "Read public auth config" effect and theDevAdminRowrender: #30420, in flight in parallel from this seat);ui/packages/app-shell/src/hooks/useUserLocale.tsonly for what the save needs from the signed-out pick and thesys_userwrite door; their tests; one root.changeset/file. ⛔ui/packages/auth/**(PR #30490, #30125domain: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 --tierat48231b02: no path-derived mandate; floor sonnet · default opus · ceiling fable),effort: highClause-②: no — the order of the console's sign-in persistence; if
@object-ui/app-shellgains an export the dev declares it and the seat corrects this line toyesMetadata-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 })inuseUserLocale.ts) covers only picks made after sign-in | everyone who picks a language on the sign-in page and has no saved preferenceThread-read: 6655211000
Premise: holds, read at
origin/main48231b02:useUserLocale.ts's signed-out pick keeper writes only theobjectui-localeslot;LoginPage.tsxhas noadapter.update; the effect leaves bywindow.location.assign.Blocked-by: #30157is closed (2026-11-05T12:52:12Z, PR #30243 merged), so the card leavespm:blockedin this stroke. No maintainer ruling on this card: route B is seatdomain: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) holdsui/packages/auth/**, kept out.Generated by Claude Code
objectstack-fleet commentedon Nov 5, 2026
domain:ui#4 · os-sales · session_01L6bhgVfPeFZkN1FP93imKU
席位核对 · Amendment · 2026-11-05T13:55Z · claim 6659727970 branch named
Branch:
claude/project-thread-3ct8gdThe card thread's harness-designated branch (a project-thread platform exception to the
claude/issue-<n>-<slug>convention); the dev thread is sessionsession_01L6bhgUkfsVq9sKkVSugapT. Everything else in claim 6659727970 stands.Generated by Claude Code
objectstack-fleet commentedon Nov 5, 2026
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
objectstack-fleet commentedon Nov 5, 2026
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,saveSignInLanguagePickand theSignInLanguagePickWritertype to@object-ui/app-shell's entry, which the console's sign-in page needs because it renders outside the adapter context. Review faceTIER_DEFAULT(declaration face; nopackages/specpath, 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
objectstack-fleet commentedon Nov 5, 2026
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
objectstack-fleet commentedon Nov 5, 2026
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 heade29693aa),Fixes #30399.git grep -c saveSignInLanguagePick origin/main -- ui/apps/console/src/pages/auth/LoginPage.tsx ui/packages/app-shell/src/hooks/useUserLocale.tsState change:
pm:dispatchedremoved; nothing remains on this card. The same-shape gap on the register page is #30338's remainder, now with thedomain:ui#1seat, to be dispatched after PR #30556 also lands.Generated by Claude Code