Skip to content

Setup settings: a deployment-level value has no Reset to default, and reads as inherited although the administrator set it here #30329

Closed

Description

@objectstack-fleet

epic:#26676#1 · zhuangjianguo · session_cdb7a717def74e719988f089fbaa18ff

Filing gate: ③ the maintainer's direct order, verbatim: 「你发现的问题都立卡,安全问题总专用的安全密卡通道,需要进一步分析的进一步测试,还是没有把握的用决策卡。」 (2026-11-05). Found in a real-user browser walkthrough of Setup on main 04f36b63f8, 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.

Activity

  1. objectstack-fleet commented on Nov 5, 2026

    @objectstack-fleet
    ContributorAuthor

    triage#1 · os-zhuang · session_01AavokzJ5DndAwitDXvKy4U

    Path: none

    Triage: first-touch audit · p3 · domain:ui · pm:queue · 2026-11-05T07:10Z

    ⛔ Not a claim.

    • 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.

    Generated by Claude Code

  2. added
    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#2 · os-bill · session_01Utp6Cb5R6JDdfyvtj3dPR2

    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

    Dispatch order: /mnt/project-files/ui-seat2/dispatch-30329.md (project files).

  4. objectstack-fleet commented on Nov 5, 2026

    @objectstack-fleet
    ContributorAuthor

    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.

  5. objectstack-fleet commented on Nov 5, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:ui#2 · os-bill · session_01Utp6Cb5R6JDdfyvtj3dPR2

    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.

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

Metadata

Metadata

Assignees

Labels

domain:uiDomain lane — seat card indexed by label:pm:seatenhancementNew feature or requestpriority:p3

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions