Skip to content

spec(ui): action:icon and action:group/menu members refuse confirmText beside an array params (ruling A) #30017

Closed

Description

@objectstack-fleet

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

Ruled: 6624208841 · letter A
Ruling-ref: 6624208841

Filing gate: ② a decision the maintainer made. In the project thread "Discuss pending spec rulings", the maintainer answered 「以上同意」 at 2026-11-04T06:22:07Z to an A (refuse) / B (keep) question that recommended A. The question came from the review of PR #29869 (#29844), record 6599507683, which found two more doors outside the #29844 ruling: action:icon and the action:group / action:menu member rows. The ruling text is recorded as this card's first comment. ⛔ Not a claim. Suggested-grade: p3 (the same family as #29844 and #29383).

Business reason. A page action 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. ActionSchema, InlineActionSchema and, since PR #29869, action:button refuse that pair. action:icon and the members of action:group / action:menu still accept it. Reader: the domain:spec seat (packages/spec/src/ui/component.zod.ts).

What the code does (at origin/main eee41490)

  • ActionIconPropsSchema (packages/spec/src/ui/component.zod.ts ≈:4055) carries description, params: z.unknown() and confirmText, with no pair rule.
  • actionContainerMemberShape() (≈:4212), shared by the action:group member (≈:4328) and the action:menu member (≈:4349), carries params (an array is the inputs to collect; a non-array is refused except on a type: 'api' member, where it is the request payload) and confirmText, with no pair rule.
  • The shared predicate and message are declaresConfirmBesideParams / CONFIRM_BESIDE_PARAMS_REFUSAL in packages/spec/src/ui/action-confirm-beside-params.ts, already used by action:button (≈:4010).

Wanted (ruling A)

  • ActionIconPropsSchema and the action:group / action:menu member rows refuse confirmText beside a NON-EMPTY ARRAY params, at path ['confirmText'], with the same predicate and message family. On the members, refine once on the shared shape's consumers so both containers carry it, with the item index in the path.
  • Still accepted: confirmText with no params, beside params: [], and beside an object-form params (a type: 'api' member's payload).
  • Before building, census in-repo carriers with both keys: examples/, packages/**, ui/**, skills/**, templates, cloud fixtures. Zero shipped carriers were known at ruling time.
  • Declarations: Clause-②: no (narrowing), Metadata-protocol: narrowed, @objectstack/spec minor, and an ADR-0087 disposition (precedent: PR fix(spec)!: an action:button refuses confirmText beside a non-empty array params, as the two action doors do #29869).

Serial: after PR #29869 (merged). One S PR.

Cross-references: #29844 (the action:button door), #29383 (the inline door), PR #29869 review record 6599507683.

Dedupe: searched action:icon confirmText params and action:menu confirmText params. The only hits are #29844 and #29383. New.

Body updated by the seat with the ruling line: 2026-11-04T06:27Z

Activity

  1. objectstack-fleet commented on Nov 4, 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 action:icon and the action:group / action:menu member rows should also refuse confirmText beside a non-empty array params (A, recommended) or keep accepting it (B). They answered 「以上同意」 at 2026-11-04T06:22Z, which covers this item among three, all taken as recommended. This card's letter is A.

    What the ruling binds (letter A):

    Recorded 2026-11-04T06:24Z.

  2. objectstack-fleet commented on Nov 4, 2026

    @objectstack-fleet
    ContributorAuthor

    triage#1 · os-zhuang · session_01AavokzJ5DndAwitDXvKy4U

    Path: none

    Triage: first-touch audit · p3 kept · domain:spec kept · pm:queue kept · 2026-11-04T06:55Z

    ⛔ Not a claim.


    Generated by Claude Code

  3. added
    pm:dispatchedDispatched to a dev agent by /pm-dispatch
    and removed
    pm:queueReady for the PM dispatch loop
    on Nov 5, 2026
  4. objectstack-fleet commented on Nov 5, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:spec#2 · os-sales · session_01L6bhgVugtCCwBs98FeR27P

    Claim: PM loop round 1 · 2026-11-05T16:55Z
    Session: session_01L6bhgVugtCCwBs98FeR27P (seat; mode:subagent, so the dev shares this session id and is identified by the branch)
    Account: os-sales (the seat's linked user as GET /user answers it; the card's assignee)
    Branch: claude/issue-30017-confirm-beside-params-icon-members
    Worktree: objectstack-issue-30017
    Domain: domain:spec
    Seat: domain:spec#2
    File surface: packages/spec/src/ui/component.zod.ts (ActionIconPropsSchema and the consumers of actionContainerMemberShape(): the action:group and action:menu member rows), packages/spec/src/ui/action-confirm-beside-params.ts only if the message family needs a member-path variant, their tests, the regenerated spec artifacts, any in-repo carrier the census finds (report first: zero were known at ruling time), one changeset with its ADR-0087 disposition. ⛔ ui/** renderers, skills/**, docs/adr/**, .claude/**, AGENTS.md (stop on breach; explain in the report)
    Container & model: S (ruled A; the shared predicate already exists on action:button), mode:subagent, model: default (no path-derived mandate; narrowing ⇒ the seat runs a CONTRACT_REVIEW_TIER review before the queue), effort: medium
    Clause-②: no (narrowing)
    Metadata-protocol: narrowed
    Responsibility: packages/spec (action:icon and the action:group / action:menu members accept confirmText beside an array params, the two-dialog pair the four other action doors refuse) | declaresConfirmBesideParams / CONFIRM_BESIDE_PARAMS_REFUSAL already judge action:button, ActionSchema and InlineActionSchema | any page author or AI writing an icon or a group/menu member action; zero shipped carriers at ruling time
    Thread-read: 6624670416
    Premise: holds, read at origin/main 2ffdb649: component.zod.ts L4083 refines action:button with declaresConfirmBesideParams; ActionIconPropsSchema (L4128) and actionContainerMemberShape() (L4285) carry params and confirmText with no such refine. Maintainer ruling 6624208841, letter A (「以上同意」): refuse beside a non-empty array params; still allowed: no params, params: [], an object-form params.
    Serial constraints cleared: PR #29869 merged (the card's serial predecessor); no open pm:dispatched claim names component.zod.ts or action-confirm-beside-params.ts (read of every open claim's File surface:)

  5. objectstack-fleet commented on Nov 5, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:spec#2 · os-sales · session_01L6bhgVugtCCwBs98FeR27P
    os-dev-report

    {
      "issue": 30017,
      "status": "done",
      "branch": "claude/issue-30017-confirm-beside-params-icon-members",
      "pr": "https://github.com/objectstack-ai/objectstack/pull/30624",
      "session": "session_01L6bhgVugtCCwBs98FeR27P",
      "premise_still_valid": true,
      "summary": "ActionIconPropsSchema and the action:group / action:menu member rows (buildActionGroupMember, buildActionMenuMember, the two consumers of actionContainerMemberShape) now end with .refine(!declaresConfirmBesideParams, CONFIRM_BESIDE_PARAMS_REFUSAL), the one predicate and message action:button uses; the member issue lands at actions.N.confirmText. params: [], an object params (icon static values; a type api member's payload) and a param-less confirmText stay accepted. Census at origin/main 2ffdb649: 0 shipped carriers, 1 test fixture (component-report-items-action-members-typed.pin.test.ts L217, an action:menu member) repaired. Changeset @objectstack/spec minor with the not-required (no-migration-prescription) ADR-0087 marker, in PR 29869's form. Head 0446795a12 (merged origin/main 5b748dfede).",
      "tests": "spec test at 0446795a12: 816 files, 25669 passed, 1 todo; spec typecheck 0. Lint (closure built) 195 files 8087 passed; ui types 387 files 10464 passed; ui components spec-symbol + renderers/action 38 files 616 passed (at 34eb15a15d). Ablation from committed state via ablation-replace.mjs, src-resolved: icon refine removed: 1 failed (icon refusal); group: 2 failed (refusal + envelope); menu: 2 failed; each restored blob == HEAD, git diff HEAD empty; then 29/29 green. Authoring-door probe (validateComponentProps): the pair gives 1 component-props-invalid error at properties.confirmText (icon) and properties.actions.0.confirmText (group, menu); remedy, params: [], api object params, param-less: 0 findings.",
      "gates": "dispatch-gates --commands at 0446795a12: 102 families, all exit 0 (captured before any pipe); --ran: 102 derived, 102 run, 0 NOT-MEASURED, 0 UNRUN, derived zero. check:generated 0 after one --fix (check:docs only, component.mdx). check:adr-0087-registration 0, check:doc-authoring 0, check:skill-frame-freshness 0, eslint on changed files 0. check:dev-prereqs 1: 35 ui packages without dist (no full pnpm build in this worktree), machine state, not the diff. PR check-runs at report time: 20 in_progress, 3 skipped.",
      "dogfood_battery": "34eb15a15d (pre-merge head; merge brought no change to the branch's files) · os-verify-lock VERDICT command-exit 0 · Test Files 420 passed, 3 skipped · Tests 3496 passed, 36 skipped · no failures",
      "mcp_calls": "0",
      "api_writes": "2: 1 fleet-write relay stroke (POST /repos/objectstack-ai/objectstack/dispatches, carrying pr_create = POST /repos/objectstack-ai/objectstack/pulls); this os-dev-report comment via post-stamped (POST /repos/objectstack-ai/objectstack/issues/30017/comments). git push is not a REST write.",
      "open_questions": [],
      "security_findings": "none",
      "out_of_scope_findings": [
        "carrier: domain:spec#2 seat · noted, not filed: packages/spec/src/ui/action-confirm-beside-params.ts docblock still says read by the three doors; outside the file surface (no message variant was needed), so left as is"
      ]
    }
  6. objectstack-fleet commented on Nov 5, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:spec#2 · os-sales · session_01L6bhgVugtCCwBs98FeR27P

    席位核对 · Amendment · 2026-11-05T18:44Z · claim 6663933383 file surface widened

    File surface (added):

    • packages/spec/src/migrations/entries/semantic/18.ui-page-action-row-confirm-text-beside-params-refused.ts: one D3 semantic entry, shaped like 18.ui-page-action-row-on-success-beside-executor-refused.ts. Its surface names all four page action rows (action:button, action:icon, and each action:group / action:menu member), so it also covers the action:button refusal PR fix(spec)!: an action:button refuses confirmText beside a non-empty array params, as the two action doors do #29869 shipped without an entry.
    • packages/spec/src/ui/action-confirm-beside-params.ts: the docblock only, where it counts "three doors" and "three messages equal" (five rows read it now). ⛔ No change to the predicate or the message.

    Why: contract review 6666209629 (FAIL, one must-fix) found the changeset's adr-0087: not-required (no-migration-prescription) dishonest for this refusal. The body prescribes a rewrite ("move the confirm sentence to description and drop confirmText"), and ADR-0087 D3 owes an entry for a refusal that is not mechanically convertible. The marker becomes registered ui-page-action-row-confirm-text-beside-params-refused. The rest of the claim stands, the declaration lines included.


    Generated by Claude Code

  7. objectstack-fleet commented on Nov 5, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:spec#2 · os-sales · session_01L6bhgVugtCCwBs98FeR27P
    os-dev-report

    {
      "issue": 30017,
      "status": "done",
      "round": "patch round 1, answering contract review 6666209629 (FAIL, one must-fix) under amendment 6666273551",
      "branch": "claude/issue-30017-confirm-beside-params-icon-members",
      "pr": "https://github.com/objectstack-ai/objectstack/pull/30624",
      "head": "9d69f747cd545a5e11690329ea16436a77d8a49a",
      "previous_head": "0446795a1283e93773b8eb760cac30fa14b1fccf",
      "session": "session_01L6bhgVugtCCwBs98FeR27P",
      "premise_still_valid": true,
      "summary": "Must-fix: added packages/spec/src/migrations/entries/semantic/18.ui-page-action-row-confirm-text-beside-params-refused.ts, one D3 SemanticMigration in the shape of the on-success-beside-executor entry, naming all four page action rows (action:button / action:icon properties.confirmText beside a non-empty array properties.params; each action:group / action:menu member's confirmText beside a non-empty array params), replacement = the question on description and no confirmText, NOT mechanically convertible, reason with the runner's confirm-then-param-dialog order, the label-less icon tooltip note, and the load-path / save-door read; acceptance as os validate reporting no component-props-invalid at properties.confirmText / properties.actions.N.confirmText. No tracker id in any field. Changeset marker is now registered ui-page-action-row-confirm-text-beside-params-refused; the remedy paragraph became the one-line fix naming the D3 entry, the no-rewrite claim is gone; level and both declaration lines unchanged. Should-fix: action-confirm-beside-params.ts docblock counts the five doors; predicate and message unchanged. Optional icon describe note left out. PR body patched through the relay (5 sentences that had become false; signed trailer last line; read-back identical). No merge: the PR was not dirty.",
      "tests": "gen:migration-registry 0 (552 semantic entries written); spec build + check:generated 0, all 14 artifacts up to date; migrations.test.ts + semantic-relevance.test.ts + action-confirm-params-guard.test.ts: 3 files, 208 passed; eslint on the two changed .ts files 0; check:doc-authoring 0.",
      "gates": "node scripts/check-adr-0087-registration.mjs --base origin/main: 0, reads registered ui-page-action-row-confirm-text-beside-params-refused, new here. dispatch-gates --commands at 9d69f747cd: 104 families (the 102 before plus spec check:spec-changes and check:upgrade-guide, derived by the new entry), all exit 0 after the packages/ closure build; check:type-check-debt first exited 3 on a lock queue-timeout behind another seat's dogfood run, rerun under the lock with the kept slot: 0. --ran: 104 derived, 104 run, 0 NOT-MEASURED, 0 UNRUN, derived zero.",
      "dogfood_battery": "not rerun this round: the patch adds a D3 entry, a docblock and changeset prose, no schema behaviour; last run 34eb15a15d green (420 files, 3496 tests)",
      "mcp_calls": "0",
      "api_writes": "2: one relay issue_patch on pull 30624 (PR body), this comment via post-stamped. git push is not a REST write.",
      "open_questions": [],
      "security_findings": "none",
      "out_of_scope_findings": []
    }
  8. objectstack-fleet commented on Nov 5, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:spec#2 · os-sales · session_01L6bhgVugtCCwBs98FeR27P

    ACCEPT → PR #30624 comment 6667984372 · head 9d69f747cd545a5e11690329ea16436a77d8a49a · contract review PASS 6667945270 (re-review after FAIL 6666209629) · 2026-11-05T20:03Z

  9. objectstack-fleet commented on Nov 5, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:spec#2 · os-sales · session_01L6bhgVugtCCwBs98FeR27P

    Landed · PR #30624 · merge f3a52d38ffbace266347267bbb0dd0130bb35b9d · 2026-11-05T20:36Z

    Reading Probe Answer
    Queue membership GET /repos/objectstack-ai/objectstack/issues/30624/timeline added_to_merge_queue 20:05:48Z → merged 20:34:16Z, removed_from_merge_queue 20:34:16Z
    origin/main by content git grep -c declaresConfirmBesideParams origin/main -- packages/spec/src/ui/component.zod.ts 5
    Upgrade-guide entry git cat-file -e origin/main:packages/spec/src/migrations/entries/semantic/18.ui-page-action-row-confirm-text-beside-params-refused.ts present

    State: the card is closed completed by Fixes #30017, and pm:dispatched is removed in this stroke. Nothing is owed here: the docs-drift note was advisory and its gate is green, and the optional icon describe addition was waived by the re-review (6667945270).


    Generated by Claude Code

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

Metadata

Metadata

Assignees

Labels

domain:specDomain 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