Repository navigation
Description
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) carriesdescription,params: z.unknown()andconfirmText, with no pair rule.actionContainerMemberShape()(≈:4212), shared by theaction:groupmember (≈:4328) and theaction:menumember (≈:4349), carriesparams(an array is the inputs to collect; a non-array is refused except on atype: 'api'member, where it is the request payload) andconfirmText, with no pair rule.- The shared predicate and message are
declaresConfirmBesideParams/CONFIRM_BESIDE_PARAMS_REFUSALinpackages/spec/src/ui/action-confirm-beside-params.ts, already used byaction:button(≈:4010).
Wanted (ruling A)
ActionIconPropsSchemaand theaction:group/action:menumember rows refuseconfirmTextbeside a NON-EMPTY ARRAYparams, 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:
confirmTextwith noparams, besideparams: [], and beside an object-formparams(atype: '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/specminor, and an ADR-0087 disposition (precedent: PR fix(spec)!: anaction:buttonrefusesconfirmTextbeside a non-empty arrayparams, 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
objectstack-fleet commentedon Nov 4, 2026
domain:spec#3 · os-support-ai · session_01WGufzfgvGexKn9vLHsy89K
Ruling: decision thread "Discuss pending spec rulings" · letter A · maintainer 「以上同意」
The maintainer was asked whether
action:iconand theaction:group/action:menumember rows should also refuseconfirmTextbeside a non-empty arrayparams(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):
ActionIconPropsSchemaand theaction:group/action:menumember row (packages/spec/src/ui/component.zod.ts,actionContainerMemberShape) refuseconfirmTextbeside a NON-EMPTY ARRAYparams, with the same predicate, message family and scope limits as spec(ui): an action:button component accepts confirmText beside an array params, the two-dialog pair ActionSchema and InlineActionSchema refuse #29844.paramsandparams: [].confirmTexton a param-less row stays correct.Recorded 2026-11-04T06:24Z.
objectstack-fleet commentedon Nov 4, 2026
triage#1 · os-zhuang · session_01AavokzJ5DndAwitDXvKy4U
Path: none
Triage: first-touch audit · p3 kept ·
domain:speckept ·pm:queuekept · 2026-11-04T06:55Z⛔ Not a claim.
action:iconand theaction:group/action:menumember rows refuseconfirmTextbeside a non-empty arrayparams, asaction:buttonalready does. A two-dialog UX rule on doors no shipped carrier uses, so p3 kept, as spec(ui): an action:button component accepts confirmText beside an array params, the two-dialog pair ActionSchema and InlineActionSchema refuse #29844.Generated by Claude Code
objectstack-fleet commentedon Nov 5, 2026
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 asGET /useranswers it; the card's assignee)Branch:
claude/issue-30017-confirm-beside-params-icon-membersWorktree:
objectstack-issue-30017Domain:
domain:specSeat:
domain:spec#2File surface:
packages/spec/src/ui/component.zod.ts(ActionIconPropsSchemaand the consumers ofactionContainerMemberShape(): theaction:groupandaction:menumember rows),packages/spec/src/ui/action-confirm-beside-params.tsonly 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 onaction:button),mode:subagent,model: default(no path-derived mandate; narrowing ⇒ the seat runs a CONTRACT_REVIEW_TIER review before the queue),effort: mediumClause-②: no (narrowing)
Metadata-protocol: narrowed
Responsibility:
packages/spec(action:iconand theaction:group/action:menumembers acceptconfirmTextbeside an arrayparams, the two-dialog pair the four other action doors refuse) |declaresConfirmBesideParams/CONFIRM_BESIDE_PARAMS_REFUSALalready judgeaction:button,ActionSchemaandInlineActionSchema| any page author or AI writing an icon or a group/menu member action; zero shipped carriers at ruling timeThread-read: 6624670416
Premise: holds, read at
origin/main2ffdb649:component.zod.tsL4083 refinesaction:buttonwithdeclaresConfirmBesideParams;ActionIconPropsSchema(L4128) andactionContainerMemberShape()(L4285) carryparamsandconfirmTextwith no such refine. Maintainer ruling 6624208841, letter A (「以上同意」): refuse beside a non-empty arrayparams; still allowed: noparams,params: [], an object-formparams.Serial constraints cleared: PR #29869 merged (the card's serial predecessor); no open
pm:dispatchedclaim namescomponent.zod.tsoraction-confirm-beside-params.ts(read of every open claim'sFile surface:)objectstack-fleet commentedon Nov 5, 2026
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" ] }objectstack-fleet commentedon Nov 5, 2026
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 like18.ui-page-action-row-on-success-beside-executor-refused.ts. Its surface names all four page action rows (action:button,action:icon, and eachaction:group/action:menumember), so it also covers theaction:buttonrefusal PR fix(spec)!: anaction:buttonrefusesconfirmTextbeside a non-empty arrayparams, 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 todescriptionand dropconfirmText"), and ADR-0087 D3 owes an entry for a refusal that is not mechanically convertible. The marker becomesregistered ui-page-action-row-confirm-text-beside-params-refused. The rest of the claim stands, the declaration lines included.Generated by Claude Code
objectstack-fleet commentedon Nov 5, 2026
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": [] }objectstack-fleet commentedon Nov 5, 2026
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:03Zobjectstack-fleet commentedon Nov 5, 2026
domain:spec#2 · os-sales · session_01L6bhgVugtCCwBs98FeR27P
Landed · PR #30624 · merge
f3a52d38ffbace266347267bbb0dd0130bb35b9d· 2026-11-05T20:36ZGET /repos/objectstack-ai/objectstack/issues/30624/timelineadded_to_merge_queue20:05:48Z →merged20:34:16Z,removed_from_merge_queue20:34:16Zorigin/mainby contentgit grep -c declaresConfirmBesideParams origin/main -- packages/spec/src/ui/component.zod.tsgit cat-file -e origin/main:packages/spec/src/migrations/entries/semantic/18.ui-page-action-row-confirm-text-beside-params-refused.tsState: the card is closed
completedbyFixes #30017, andpm:dispatchedis 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