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
Setup settings: a deployment-level value has no Reset to default, and reads as inherited although the administrator set it here #30329
Filing gate: ③ the maintainer's direct order, verbatim: 「你发现的问题都立卡,安全问题总专用的安全密卡通道,需要进一步分析的进一步测试,还是没有把握的用决策卡。」 (2026-11-05). Found in a real-user browser walkthrough of Setup on main04f36b63f8, with a test app and a local test deployment.
Business reason. An administrator who changed a setting should be able to see that they changed it and put it back. Today the row reads as if it came from somewhere else, and going back to the default means knowing the default or emptying the box.
Reader. The UI lane dev, in ui/apps/console/src/pages/settings/SettingsField.tsx:105-136 and :213.
Duplicates. Searched settings reset to default global button (32 hits) and inherited from global badge (14 hits). They are QA run anchors and a seat card; none has this subject.
Measured
On Setup's 认证 page, after changing 密码最小长度 there:
The row is labelled 「继承自全局」 and 「全局」. sourceBadgeOf treats any value whose effective scope is global as inherited, including one this page wrote.
There is no 恢复默认. The button appears only for the overrides badge, so it never appears on a deployment-level value.
Expected
A value changed here says so, for example 已修改, and names the default.
Reset to default is available on it, with Save confirming it as other changes do.
Read fresh. A deployment-level Setup setting has no Reset to default, and reads as inherited although the administrator set it here (SettingsField.tsx). p3.
Claim: PM loop round 2 · 2026-11-05T10:17Z
Session: session_01Utp6Cb5R6JDdfyvtj3dPR2 (seat); dev = card thread session_01Utp6CaTSNwaf1AMz4qR7Fs
Account: os-bill
Branch: claude/project-thread-z0ygsj (harness-pinned card thread branch; the claude/issue-N-slug convention does not apply to a project card thread)
Worktree: objectstack-issue-30329
Domain: domain:ui
Seat: domain:ui#2
File surface: ui/apps/console/src/pages/settings/**, ui/packages/i18n/src/locales/** (已修改 / default wording), their tests, one root .changeset/; ⛔ packages/** (stop on breach; explain in the report)
Container & model: S-M, mode:thread, model: default tier (opus) — dispatch-gates --tier: no path-derived mandate, effort: high
Clause-②: no (yes (widening) if a published i18n key is added)
Metadata-protocol: none
Responsibility: n/a — UI defect/enhancement in ui/** owned by this lane; no platform path covers it; reached by every console/Studio user
Thread-read: 6652045048
Premise: holds (SettingsField.tsx sourceBadgeOf returns inherited for any effective scope outside default/user/tenant; Reset renders only for overrides; origin/main read 10:15Z)
Serial constraints cleared: none
{
"issue": 30329,
"status": "done",
"branch": "claude/project-thread-z0ygsj",
"pr": "https://github.com/objectstack-ai/objectstack/pull/30428",
"head": "b001f222",
"session": "session_01Utp6CaTSNwaf1AMz4qR7Fs (card thread; seat session_01Utp6Cb5R6JDdfyvtj3dPR2)",
"premise_still_valid": true,
"summary": "Premise held. SettingsView now passes each row writeScope = spec.scope ?? manifest.scope ?? 'tenant', the server's own per-key write scope (registerManifest), so no server change was needed. sourceBadgeOf returns a new 'modified' badge when the effective layer is global and the row writes global; such a row reads Modified, names the default layer's value from cascadeChain (option label, Yes/No for a boolean, never a secret or an object), and offers Reset to default through the existing draft null path. The tenant and user arms, env-locked rows and the timezone prompt (no writeScope) are unchanged. The number control now shows an empty box for an unset value: with value null React kept the last number on screen, so Reset on the card's own number row looked inert.",
"tests": "New top-level describe in SettingsView.unsetAndReset-13145.test.tsx (whole page, real ../api over a fetch stub): global number reads Modified + Default: 8, Reset, Save sends exactly {\"password_min_length\":null}, re-read shows 8 with no badge; toggle names Default: No and select Default: Lax; CONTROL env-locked, at-default and spec scope:'tenant' on a global manifest give no Reset (tenant key still Inherited), exactly 3 Resets. Red on 753defd1 (test only): Tests 3 failed | 6 passed (9). After the badge change alone: 1 failed, expected '12' to be '' (number box) -> number fix -> Tests 9 passed (9). Settings dir + packages/i18n on b001f222 (post-merge): Test Files 128 passed (128), Tests 1720 passed | 13 skipped (1733). turbo type-check --filter=@object-ui/console: Tasks 74 successful, 74 total. eslint on changed ui files: 0 errors, 4 pre-existing no-explicit-any warnings. check:new-line-citations: 0 new. The red-first leg on the parent commit is the ablation (tests import src, no build).",
"gates": "dispatch-gates --commands: 35 families, all exit 0, incl. node scripts/check-sdui-manifest.mjs :: exit 0, pnpm --dir ui exec vitest run scripts/ :: exit 0 and pnpm check:type-check-debt :: exit 0 (both under the verify lock). --ran on b001f222: 35 derived, 35 run, 0 NOT-MEASURED, 0 UNRUN. Record: /mnt/project-files/ui-seat2/30329-gates-ran.txt (project folder). CI check-runs: in_progress at report time.",
"dogfood_battery": "n/a — no ! in the PR title and no (narrowing) arm",
"line_budget": "14 files, +282 / -15 vs origin/main (source +74/-11, test +171/-4, 10 locale packs +22, changeset +15)",
"files_changed": [
".changeset/30329-deployment-setting-reset.md",
"ui/apps/console/src/pages/settings/SettingsField.tsx",
"ui/apps/console/src/pages/settings/SettingsView.tsx",
"ui/apps/console/src/pages/settings/__tests__/SettingsView.unsetAndReset-13145.test.tsx",
"ui/packages/i18n/src/locales/{ar,de,en,es,fr,ja,ko,pt,ru,zh}.ts"
],
"deviations": [
"Clause-② declared yes (widening), not the claim's no: two published i18n keys, console.settingsView.sourceBadgeModified and console.settingsView.defaultValueHint, in all ten packs (the claim's own conditional arm).",
"Number control value fix (empty box for null) is beyond the badge/reset lines but inside the claimed file surface and on the card's measured row; named in the PR body.",
"Pins added to the existing reset harness file as a top-level describe (shared-harness rule), not a new file; its serve/renderView helpers take an optional payload and namespace.",
"PR attribution link points at this card thread (session-context instruction).",
"No assignee and no reviewer on the PR (dispatch Writes line); the harness post-PR assign/review step skipped."
],
"mcp_calls": "4 — mcp__github__issue_read x4 (get x1, get_comments x3); no write tools",
"api_writes": "2 — relay pr_create (objectstack-ai/objectstack#30428, draft, read back identical 7238 bytes, assignees none), post-stamped issue comment on #30329 (this report); plus git pushes (not REST)",
"open_questions": [],
"security_findings": "none",
"out_of_scope_findings": [
"observation, not filed · organization and user pages keep 'Overrides Default' for a value set there while the deployment page reads 'Modified · Default: VALUE'; unifying the wording is a product choice · carrier: seat",
"observation, not filed · a tenant or user key whose default is null and whose own value is set shows no badge and no Reset (no upper layer carries a value); unchanged · carrier: none"
]
}
Landed · 2026-11-05T11:50Z · PR #30428 merged as ac56acf83 through the merge queue (seat ACCEPT on the merged head; landing authorized by the maintainer in the seat thread, 11:29Z). Card state: closed. pm:dispatched removed.
Activity
objectstack-fleet commentedon Nov 5, 2026
triage#1 · os-zhuang · session_01AavokzJ5DndAwitDXvKy4U
Path: none
Triage: first-touch audit · p3 ·
domain:ui·pm:queue· 2026-11-05T07:10Z⛔ Not a claim.
SettingsField.tsx). p3.Generated by Claude Code
objectstack-fleet commentedon Nov 5, 2026
domain:ui#2 · os-bill · session_01Utp6Cb5R6JDdfyvtj3dPR2
Claim: PM loop round 2 · 2026-11-05T10:17Z
Session:
session_01Utp6Cb5R6JDdfyvtj3dPR2(seat); dev = card threadsession_01Utp6CaTSNwaf1AMz4qR7FsAccount:
os-billBranch:
claude/project-thread-z0ygsj(harness-pinned card thread branch; theclaude/issue-N-slugconvention does not apply to a project card thread)Worktree:
objectstack-issue-30329Domain:
domain:uiSeat:
domain:ui#2File surface:
ui/apps/console/src/pages/settings/**,ui/packages/i18n/src/locales/**(已修改 / default wording), their tests, one root.changeset/; ⛔packages/**(stop on breach; explain in the report)Container & model:
S-M,mode:thread,model: default tier (opus) — dispatch-gates --tier: no path-derived mandate,effort: highClause-②: no (yes (widening) if a published i18n key is added)
Metadata-protocol: none
Responsibility:
n/a — UI defect/enhancement in ui/** owned by this lane; no platform path covers it; reached by every console/Studio userThread-read: 6652045048
Premise: holds (SettingsField.tsx
sourceBadgeOfreturnsinheritedfor any effective scope outside default/user/tenant; Reset renders only foroverrides; origin/main read 10:15Z)Serial constraints cleared: none
Dispatch order:
/mnt/project-files/ui-seat2/dispatch-30329.md(project files).objectstack-fleet commentedon Nov 5, 2026
domain:ui#2 · os-bill · session_01Utp6Cb5R6JDdfyvtj3dPR2
os-dev-report
{ "issue": 30329, "status": "done", "branch": "claude/project-thread-z0ygsj", "pr": "https://github.com/objectstack-ai/objectstack/pull/30428", "head": "b001f222", "session": "session_01Utp6CaTSNwaf1AMz4qR7Fs (card thread; seat session_01Utp6Cb5R6JDdfyvtj3dPR2)", "premise_still_valid": true, "summary": "Premise held. SettingsView now passes each row writeScope = spec.scope ?? manifest.scope ?? 'tenant', the server's own per-key write scope (registerManifest), so no server change was needed. sourceBadgeOf returns a new 'modified' badge when the effective layer is global and the row writes global; such a row reads Modified, names the default layer's value from cascadeChain (option label, Yes/No for a boolean, never a secret or an object), and offers Reset to default through the existing draft null path. The tenant and user arms, env-locked rows and the timezone prompt (no writeScope) are unchanged. The number control now shows an empty box for an unset value: with value null React kept the last number on screen, so Reset on the card's own number row looked inert.", "tests": "New top-level describe in SettingsView.unsetAndReset-13145.test.tsx (whole page, real ../api over a fetch stub): global number reads Modified + Default: 8, Reset, Save sends exactly {\"password_min_length\":null}, re-read shows 8 with no badge; toggle names Default: No and select Default: Lax; CONTROL env-locked, at-default and spec scope:'tenant' on a global manifest give no Reset (tenant key still Inherited), exactly 3 Resets. Red on 753defd1 (test only): Tests 3 failed | 6 passed (9). After the badge change alone: 1 failed, expected '12' to be '' (number box) -> number fix -> Tests 9 passed (9). Settings dir + packages/i18n on b001f222 (post-merge): Test Files 128 passed (128), Tests 1720 passed | 13 skipped (1733). turbo type-check --filter=@object-ui/console: Tasks 74 successful, 74 total. eslint on changed ui files: 0 errors, 4 pre-existing no-explicit-any warnings. check:new-line-citations: 0 new. The red-first leg on the parent commit is the ablation (tests import src, no build).", "gates": "dispatch-gates --commands: 35 families, all exit 0, incl. node scripts/check-sdui-manifest.mjs :: exit 0, pnpm --dir ui exec vitest run scripts/ :: exit 0 and pnpm check:type-check-debt :: exit 0 (both under the verify lock). --ran on b001f222: 35 derived, 35 run, 0 NOT-MEASURED, 0 UNRUN. Record: /mnt/project-files/ui-seat2/30329-gates-ran.txt (project folder). CI check-runs: in_progress at report time.", "dogfood_battery": "n/a — no ! in the PR title and no (narrowing) arm", "line_budget": "14 files, +282 / -15 vs origin/main (source +74/-11, test +171/-4, 10 locale packs +22, changeset +15)", "files_changed": [ ".changeset/30329-deployment-setting-reset.md", "ui/apps/console/src/pages/settings/SettingsField.tsx", "ui/apps/console/src/pages/settings/SettingsView.tsx", "ui/apps/console/src/pages/settings/__tests__/SettingsView.unsetAndReset-13145.test.tsx", "ui/packages/i18n/src/locales/{ar,de,en,es,fr,ja,ko,pt,ru,zh}.ts" ], "deviations": [ "Clause-② declared yes (widening), not the claim's no: two published i18n keys, console.settingsView.sourceBadgeModified and console.settingsView.defaultValueHint, in all ten packs (the claim's own conditional arm).", "Number control value fix (empty box for null) is beyond the badge/reset lines but inside the claimed file surface and on the card's measured row; named in the PR body.", "Pins added to the existing reset harness file as a top-level describe (shared-harness rule), not a new file; its serve/renderView helpers take an optional payload and namespace.", "PR attribution link points at this card thread (session-context instruction).", "No assignee and no reviewer on the PR (dispatch Writes line); the harness post-PR assign/review step skipped." ], "mcp_calls": "4 — mcp__github__issue_read x4 (get x1, get_comments x3); no write tools", "api_writes": "2 — relay pr_create (objectstack-ai/objectstack#30428, draft, read back identical 7238 bytes, assignees none), post-stamped issue comment on #30329 (this report); plus git pushes (not REST)", "open_questions": [], "security_findings": "none", "out_of_scope_findings": [ "observation, not filed · organization and user pages keep 'Overrides Default' for a value set there while the deployment page reads 'Modified · Default: VALUE'; unifying the wording is a product choice · carrier: seat", "observation, not filed · a tenant or user key whose default is null and whose own value is set shows no badge and no Reset (no upper layer carries a value); unchanged · carrier: none" ] }Report taken 2026-11-05T10:59Z.
objectstack-fleet commentedon Nov 5, 2026
domain:ui#2 · os-bill · session_01Utp6Cb5R6JDdfyvtj3dPR2
Landed · 2026-11-05T11:50Z · PR #30428 merged as
ac56acf83through the merge queue (seat ACCEPT on the merged head; landing authorized by the maintainer in the seat thread, 11:29Z). Card state:closed.pm:dispatchedremoved.