Skip to content

spec(ui): an action:button component accepts confirmText beside an array params, the two-dialog pair ActionSchema and InlineActionSchema refuse #29844

Closed

Description

@objectstack-fleet

domain:spec#3 · os-support-ai · session_01WGufzfgvGexKn9vLHsy89K

Ruled: 6597621758 · letter A
Ruling-ref: 6597621758

Filing gate: ② a decision the maintainer made. In the project thread "Discuss pending spec rulings", the maintainer answered 「同意」 at 2026-11-03T07:05:46Z to an A (refuse) / B (keep) question that recommended A. The question came from the CONTRACT_REVIEW_TIER review of PR #29829 (#29383), record 6597260383, which found this third door outside ruling A on #29383. The ruling text is recorded as this card's first comment. ⛔ Not a claim. Suggested-grade: p3 (same as #29383).

Business reason. A page's action:button that carries both confirmText and an array params shows the user a confirm dialog first and a param dialog second, two dialogs for one decision. After #29829, the registered door (ActionSchema) and the inline door (InlineActionSchema) both refuse that pair, but action:button would still accept it. Reader: the domain:spec seat (packages/spec/src/ui/component.zod.ts).

What the code does

ActionButtonPropsSchema (packages/spec/src/ui/component.zod.ts ≈:3947 on origin/main) carries confirmText, description (the param dialog shows it under its title) and params: z.unknown(). An array params is the list of inputs to collect and is forwarded to the same ActionRunner as actionParams, so the runner awaits the confirm and then opens the param dialog. An object params is static values and opens no dialog. The schema has no pair rule.

Wanted (ruling A)

Serial: after PR #29829 (which moves the shared refusal to module level). One S PR, not a widening of #29829.

Dedupe: searched ActionButtonProps confirmText params, action:button confirmText params refuse: only #29383 (the inline door) and its PR #29829. New.

Activity

  1. objectstack-fleet commented on Nov 3, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:spec#3 · os-support-ai · session_01WGufzfgvGexKn9vLHsy89K

    Ruling: decision thread "Discuss pending spec rulings" · letter A · maintainer 「同意」

    The maintainer was asked whether the action:button component should also refuse confirmText beside a non-empty array params (A, recommended) or keep accepting it (B). They answered 「同意」 at 2026-11-03T07:05Z = the recommendation, so this card's letter is A.

    What the ruling binds (letter A):

    • ActionButtonPropsSchema (packages/spec/src/ui/component.zod.ts) refuses confirmText beside a NON-EMPTY ARRAY params, with the same predicate and message family as ActionSchema and InlineActionSchema: the pair opens two dialogs for one decision; carry the question in description and drop confirmText.
    • An object-form params (static values) opens no param dialog, so confirmText stays allowed beside it. confirmText on a param-less button stays correct.
    • Declared as a narrowing: Clause-②: no (narrowing) · Metadata-protocol: narrowed, with an ADR-0087 disposition, after an in-repo census of action:button carriers with both keys.
    • Not taken: B (keep accepting; one of the three doors would still allow the two-dialog pair).

    Execution: the domain:spec seat dispatches one S PR after PR #29829 lands, not a widening of #29829. Origin: contract review 6597260383 on PR #29829 (#29383).

  2. objectstack-fleet commented on Nov 3, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:spec#3 · os-support-ai · session_01WGufzfgvGexKn9vLHsy89K

    Claim: PM loop round 7
    Session: session_01WGufzfgvGexKn9vLHsy89K
    Account: os-support-ai
    Branch: the card thread's own claude/project-thread-* branch, named in the dev's hand-back and restated in a later claim (a measured platform exception to claude/issue-29844-…)
    Worktree: objectstack-issue-29844
    Domain: domain:spec
    Seat: domain:spec#3
    File surface: packages/spec/src/ui/component.zod.ts (ActionButtonPropsSchema), the shared refusal in packages/spec/src/ui/action.zod.ts if a narrower predicate is needed, the pin test, generated artifacts the refusal moves, .changeset/29844-*.md.
    Container & model: S, mode:thread, model: TIER_DEFAULT, effort: high
    Clause-②: no (narrowing)
    Metadata-protocol: narrowed
    Responsibility: n/a — not a defect card (ruled narrowing)
    Thread-read: 6597621758
    Premise: holds. Ruling 6597621758 is letter A. On origin/main, ActionButtonPropsSchema (component.zod.ts ≈:3947) carries confirmText, description and params: z.unknown() with no pair rule.
    Serial constraints cleared: waiting on PR #29829 (in the merge queue). The dev starts only after it merges.

  3. objectstack-fleet commented on Nov 3, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:spec#3 · os-support-ai · session_01WGufzfgvGexKn9vLHsy89K

    Claim: PM loop round 7
    Session: session_01WGufzfgvGexKn9vLHsy89K
    Account: os-support-ai
    Branch: claude/project-thread-bg56gs (the card thread's own branch, reported by the dev; a measured platform exception to claude/issue-29844-…). This restates the seat's earlier claim (6597681847) with the branch named.
    Worktree: objectstack-issue-29844
    Domain: domain:spec
    Seat: domain:spec#3
    File surface: packages/spec/src/ui/component.zod.ts (ActionButtonPropsSchema), the shared refusal in packages/spec/src/ui/action.zod.ts if a narrower predicate is needed, the pin test, generated artifacts the refusal moves, .changeset/29844-*.md.
    Container & model: S, mode:thread, model: TIER_DEFAULT, effort: high
    Clause-②: no (narrowing)
    Metadata-protocol: narrowed
    Responsibility: n/a — not a defect card (ruled narrowing)
    Thread-read: 6597681847
    Premise: holds. Ruling 6597621758 is letter A. On origin/main, ActionButtonPropsSchema (component.zod.ts ≈:3947) carries confirmText, description and params: z.unknown() with no pair rule.
    Serial constraints cleared: PR #29829 (merged 2026-11-03).

  4. objectstack-fleet commented on Nov 3, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:spec#3 · os-support-ai · session_01WGufziDSrjZDDBZDrXMGAQ
    os-dev-report
    Stamp: 2026-11-03T08:52Z

    {
      "issue": 29844,
      "status": "done",
      "branch": "claude/project-thread-bg56gs",
      "pr": "https://github.com/objectstack-ai/objectstack/pull/29869",
      "session": "session_01WGufziDSrjZDDBZDrXMGAQ",
      "premise_still_valid": true,
      "summary": "ActionButtonPropsSchema now refuses confirmText beside a non-empty ARRAY params at ['confirmText'] with the shared predicate and refusal (message equal to ActionSchema's and InlineActionSchema's, asserted with toBe). The shared predicate already reads Array.isArray && length > 0, so object-form params and params: [] stay accepted with no narrower predicate. The predicate and refusal moved byte for byte from action.zod.ts into a sibling module ui/action-confirm-beside-params.ts (not re-exported), so component.zod.ts reads them without ui/index.ts's export * publishing them: a deviation in placement from the order's 'at module level in action.zod.ts', made to keep api-surface unchanged. Census at bb2c04e3: 0 shipped action:button carriers; 1 lint test fixture (validate-action-copy-templates.test.ts L125-126) that never parses ActionButtonPropsSchema; ADR-0087 not-required (no-migration-prescription).",
      "tests": "spec targeted 4 files 458/458 (d77dce5b); spec test+typecheck at bb8c665b: Test Files 806 passed | 1 skipped (807), Tests 24050 passed | 1 skipped | 1 todo, VERDICT command-exit 0; ablation via ablation-replace.mjs (anchor 1->0, blob c9c80b8e->f1896925): guard test 1 failed | 20 passed (21), restored blob == HEAD, git diff HEAD empty (first ablation exposed a vacuous locale-map case, dropped); lint suite 5 files 215/215 VERDICT 0; lint door probe: pair 1 component-props-invalid error at properties.confirmText, 4 controls 0 findings; ui consumers 2 files 278/278; check-action-forward-parity exit 0",
      "gates": "dispatch-gates --commands at bb8c665b: 102 families; 89 exit 0 first pass, 13 exit 3 prerequisites (stale dist, shallow fixture) all rerun exit 0 after closure build + fetch --unshallow; --ran: 102 derived, 102 run, 0 NOT-MEASURED, exit 0; check-changeset-no-major --event with the PR body: exit 0. CI check-runs: in_progress at report time.",
      "dogfood_battery": "bb8c665b · os-verify-lock: VERDICT command-exit 0 (33m58s held) · Test Files 407 passed | 3 skipped (410) · Tests 3359 passed | 28 skipped (3387) · 0 failures",
      "mcp_calls": "0",
      "api_writes": "2 — relay pr_create (PR #29869, body 12680 bytes read back identical, no assignees); this os-dev-report comment via post-stamped.mjs on #29844",
      "open_questions": [],
      "security_findings": "none",
      "out_of_scope_findings": [
        "class: b · reach: lint validateComponentProps on bb8c665b answers 0 findings for confirmText beside a non-empty array params on action:icon, and on an action:group and an action:menu member · evidence: ActionIconPropsSchema and the group/menu member rows declare both keys; action-icon.tsx L155/L199, action-group.tsx L351/L380, action-menu.tsx L274/L312 forward confirmText and actionParams to the same ActionRunner, so the same two dialogs open; ruling 6597621758 names ActionButtonPropsSchema only · dedupe words: action:icon confirmText params, action:group member confirmText params, action:menu confirmText params refuse"
      ],
      "deviations": [
        "predicate/refusal relocated to ui/action-confirm-beside-params.ts instead of exported from action.zod.ts (keeps api-surface unchanged)",
        "harness assignee/reviewer step skipped per os-dev rule 2",
        "commit trailers model-free per check:commit-card-trailers"
      ]
    }

    Generated by Claude Code

  5. objectstack-fleet commented on Nov 3, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:spec#3 · os-support-ai · session_01WGufzfgvGexKn9vLHsy89K

    ACCEPT → PR #29869 comment 6599891290 (head bb8c665b, contract review 6599507683 PASS, narrowing face). Ready + auto-merge next.

  6. objectstack-fleet commented on Nov 3, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:spec#3 · os-support-ai · session_01WGufzfgvGexKn9vLHsy89K

    Landed · PR #29869 merged as 2bf71cef · 2026-11-03T09:52Z

    Ruling A (6597621758) is in place. ActionButtonPropsSchema refuses confirmText beside a non-empty array params with the same message as the registered and inline doors. Object-form params, params: [] and no params stay accepted. Contract review 6599507683 PASS (narrowing face), ACCEPT 6599891290. The same pair on action:icon and the action:group / action:menu member row is with the maintainer as a candidate decision. Removing pm:dispatched here.

  7. objectstack-fleet commented on Nov 4, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:spec#3 · os-support-ai · session_01WGufzfgvGexKn9vLHsy89K

    Cross-reference: the two doors that the PR #29869 review (record 6599507683) found outside this card's ruling, action:icon and the action:group / action:menu member rows, were ruled A by the maintainer and filed as #30017 (ruling comment 6624208841). They are refused with the same predicate and scope limits as here.

    Posted 2026-11-04T06:25Z.

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

Metadata

Metadata

Assignees

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions