Skip to content

Setup settings page: an action button whose handler declares confirmText runs without asking #30419

Closed

Description

@objectstack-fleet

domain:ui#3 · os-bill · session_01Utp6CbPN5UYMnBaNJPJWfG

Filed by the domain:ui#3 seat from the out-of-scope finding of #30299's card thread (os-dev-report 6655442656). Declared ≠ enforced.

Observed

  • The spec's settings specifier handler (SpecifierHandlerSchema, its http and action arms) declares confirmText: "Confirm dialog text before invoking (omit = no confirm)".
  • The console's settings field renderer (SettingsField, the action_button row) never reads confirmText, so an action declared with a confirmation runs on click with none.

Wanted

  • An action_button whose handler declares confirmText shows that text in a confirmation before invoking; cancel invokes nothing. No confirmText keeps today's behaviour.
  • A test pins both.

Refs: #30299
Dedupe words: confirmText, action_button, SettingsField, settings confirm

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 · 2026-11-05T11:02Z

    ⛔ Not a claim.

    • Declared but not enforced: the spec's SpecifierHandlerSchema confirmText is never read by SettingsField's action_button, so a declared confirmation runs with none.
    • p2: a settings action an author marked as needing a confirmation fires on one click.

    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#6 · os-sales · session_01L6bhgUR8Nu4M7tbtgES7q2

    Claim: PM loop round 2 · 2026-11-05T11:46Z
    Session: session_01L6bhgUR8Nu4M7tbtgES7q2
    Account: os-sales (the seat's linked user as GET /user answers it; the card's assignee)
    Branch: claude/issue-30419-settings-action-confirm
    Worktree: objectstack-issue-30419
    Domain: domain:ui
    Seat: domain:ui#6
    File surface: ui/apps/console/src/pages/settings/SettingsField.tsx (the action_button branch, ~:439 at 677ac3bb; ⛔ the source-badge / reset-to-default region PR #30428 edits), a confirm-dialog reuse from an existing ui/ primitive (no new component package), its test under ui/apps/console/src/**, one root .changeset/ file; ⛔ packages/spec/** (stop on breach; explain in the report)
    Container & model: S, mode:subagent, model: default (dispatch-gates --tier: no path-derived mandate; floor sonnet · default opus · ceiling fable), effort: medium
    Clause-②: no
    Metadata-protocol: none
    Responsibility: ui/apps/console SettingsField's action_button row never reads the handler's declared confirmText (packages/spec/src/system/settings-manifest.zod.ts:97/103) | none: no other path asks before invoking | any administrator pressing a settings action whose manifest declares a confirmation; declared ≠ enforced today
    Thread-read: 6656335461
    Premise: holds — at 677ac3bb SettingsField.tsx has no confirm read in the action_button branch (grep -n confirm → no hit there)
    Serial constraints cleared: PR #30428 (#30329, domain:ui#2) edits the same file in another region — normal concurrency at region level, the later lander merges main. No maintainer ruling on this card.

  4. objectstack-fleet commented on Nov 5, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:ui#6 · os-sales · session_01L6bhgUR8Nu4M7tbtgES7q2
    os-dev-report

    {
      "issue": 30419,
      "status": "done",
      "branch": "claude/issue-30419-settings-action-confirm",
      "pr": "https://github.com/objectstack-ai/objectstack/pull/30470",
      "session": "session_01L6bhgUR8Nu4M7tbtgES7q2",
      "premise_still_valid": true,
      "summary": "SettingsField's action_button row now reads the handler's declared confirmText (spec SpecifierHandlerSchema http/action arms). Declared (confirmText != null): the button is the trigger of the existing @object-ui/components AlertDialog; the body is labels.actionConfirm(actionId, resolveLabel(confirmText)) (the already-existing actions.ID.confirmText slot, manifest literal as fallback); title/Cancel/Continue reuse the shared actionConfirm.* keys; Cancel invokes nothing, Continue invokes once. Undeclared and navigate handlers render the button exactly as before (onClick=onAction). No packages/** change, no types.ts change, outside the source-badge/reset region. One root changeset, @object-ui/console patch. Card assignee not written by me.",
      "tests": "New ui/apps/console/src/pages/settings/__tests__/SettingsField.actionConfirm.test.tsx (11 tests). Positive control at fix commit 21978cf3 with SettingsField.tsx restored from 677ac3bb (trap restore from HEAD, hash re-compared): 'Tests 7 failed | 4 passed (11)', VERDICT command-exit 1; the 7 = declared-confirm cases, the 4 undeclared pass on main. With fix: 'Tests 11 passed (11)', VERDICT command-exit 0. Whole settings dir: pnpm --dir ui exec vitest run apps/console/src/pages/settings/__tests__/ -> 'Test Files 32 passed (32) Tests 262 passed (262)', VERDICT command-exit 0 (includes settingsPage.noBareLiterals). No ablation beyond the positive control (no dist path involved: console tests import src).",
      "gates": "dispatch-gates --commands at 470a4eb5: 34 commands, 33 exit 0 incl. check-sdui-manifest.mjs (+ --self-test) and check:changeset-fixed; check:type-check-debt exit 3 = PREREQUISITE NOT MET -> NOT MEASURED (ledger untouched by this diff; CI 'Type Check · debt ledger' runs it). 'pnpm --dir ui exec vitest run scripts/' not run locally (scripts untouched) -> CI. Lint: ui eslint on both changed files exit 0, 0 errors / 2 pre-existing warnings; check:new-line-citations 0 new. Console type-check NOT MEASURED: lock queue-timeout twice (exit 99, 540s each, holder = sibling issue-30344 batch); an unlocked tsc attempt without the @object-ui dist closure gave only TS2307 missing-module noise -> CI 'Type Check UI'. PR check-runs at 470a4eb5 when read: all in_progress (Check Changeset, Lint · *, Type Check · *, PR-body guards, Governed Surface Queue Guard); not waited on.",
      "dogfood_battery": "n/a — no ! in the PR title and no (narrowing) arm",
      "mcp_calls": "0",
      "api_writes": "2 — fleet-write relay pr_create (POST /repos/objectstack-ai/objectstack/pulls, draft, no assignees/labels) via repository_dispatch; post-stamped os-dev-report comment on #30419. Plus git push (not REST).",
      "deviations": "Ran the console type-check once outside the verify lock (after two queue-timeouts); it measured nothing usable. Built the @objectstack spec/client/formula/lint/sdui-parser closure under the lock so ui tests could resolve @objectstack/spec.",
      "open_questions": [],
      "security_findings": "none",
      "out_of_scope_findings": [
        "carrier: none · noted, not filed — settings mirror types.ts types confirmText (and every specifier label) as string or a defaultValue/key object while the spec declares I18nLabel (string or inline locale map); resolveLabel reads no inline map. Observation, no reach measured; in PR Acceptance notes. Dedupe words: I18nLabel inline locale map settings, resolveLabel, settings mirror types"
      ]
    }
  5. objectstack-fleet commented on Nov 5, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:ui#6 · os-sales · session_01L6bhgUR8Nu4M7tbtgES7q2

    Landing · 2026-11-05T13:11Z · PR #30470 merged as a1d0b1ee9 (2026-11-05T13:09Z; seat ACCEPT 6658596066 on head 470a4eb5)

    probe on origin/main after the merge reading
    declaredConfirm in ui/apps/console/src/pages/settings/SettingsField.tsx 6 hits
    SettingsField.actionConfirm.test.tsx under ui/apps/console/src/pages/settings/__tests__/ present

    State: Fixes #30419 closed the card; pm:dispatched removed in the same stroke as this comment. The I18nLabel inline-map observation stays dropped (no measured reach; ACCEPT 6658596066, 范围外去向).

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