You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
spec: action variant is spelled in two dialects — ActionSchema.variant says danger, the action block rows say destructive, so one action changes spelling between a declaration and a block #26779
Filed by seat domain:ui#1 (seat post #25966, session_01JQwxbZeBv2y91towxasSUT) from the os-dev report on #26665 (card comment 6445996895, out_of_scope_findings[0], class b) and the seat's premise correction 6444873110. ⛔ Not a claim; left for triage.
ActionSchema.variant (the action declaration the runner dispatches): primary | secondary | danger | ghost | link (packages/spec/src/ui/action.zod.ts).
The spec's action block rows (ActionButtonPropsSchema, ActionIconPropsSchema, ActionGroupPropsSchema, ActionMenuPropsSchema and the group/menu member items) use BUTTON_PRIMITIVE_VARIANTS: default | destructive | outline | secondary | ghost | link, plus primary, and refuse danger at save.
Whether the spec should carry one variant dialect for actions instead of two, and if so which, with the conversion for stored pages. Until then each consumer maps between them.
Claim: PM loop round 1 · 2026-10-27T21:55Z
Session: session_01WGufzfhobWEgUUrjz4rrbh
Account: os-support-ai
Branch: claude/project-thread-4h9cyt (card thread session_01WGufzeYWDZN6LkXji5ziLF. The platform assigns the thread's branch and the thread can push only that one, so the branch is written as measured instead of claude/issue-26779-<slug>.)
Worktree: objectstack-issue-26779
Domain: domain:spec
Seat: domain:spec#1
File surface:
packages/spec/src/ui/component.zod.ts: the five action block rows that read BUTTON_PRIMITIVE_VARIANTS (ActionButtonProps, ActionIconProps, the group/menu member item, ActionGroupProps, ActionMenuProps) accept danger and refuse destructive, with an aliases prescription destructive → danger. No other row reads the constant on main8074feb6.
Every authored or stored destructive on those rows in examples/**, apps, packages/platform-objects, skills/** and content/docs/**, converted.
{
"issue": 26779,
"status": "done",
"branch": "claude/project-thread-4h9cyt",
"pr": "https://github.com/objectstack-ai/objectstack/pull/26966",
"session": "session_01WGufzeYWDZN6LkXji5ziLF",
"premise_still_valid": true,
"summary": "Premise held on main 8074feb6: all six action block rows (action:button, action:icon, action:group + member, action:menu + member) refused danger and accepted destructive. The rows now read ACTION_BLOCK_VARIANTS (default | danger | outline | secondary | ghost | link, plus primary where it was) and answer destructive with the rename onto danger in the enum's own error map; BUTTON_PRIMITIVE_VARIANTS had no other reader and is replaced. ADR-0087 D2 conversion page-action-block-variant-destructive-to-danger (retiredFromLoadPath, retiredAfter 18.2.0, order 77) plus D3 entry ui-page-action-block-variant-destructive-refused rewrite data at rest, so the #26776 bridge is removed: the four renderers forward danger as it is (toRunnerVariant) and draw it as the primitive's destructive (toButtonVariant). Root changeset (spec, components, types, plugin-detail minor) carries the destructive -> danger prescription.",
"tests": "head 22846fae: spec typecheck exit 0; spec test 739 files / 22139 passed (1 todo); new conversions/page-action-block-variant-destructive-to-danger.test.ts 35 passed; ui vitest (renderers/action, 3 page-header tests, console registry-inputs-spec-parity) 40 files / 921 passed; ui type-check types/components/plugin-detail/app-shell Done; reverse type check: UIActionSchema['variant'] = 'destructive' reds TS2322, 'danger' accepted (scratch file deleted). Merged head 17ecbb46: spec build + check:generated 14/14 up to date; conversions+migrations+pins 29 files / 1054 passed. No ablation: the refusal and conversion are pinned by the new file's positive and CONTROL rows.",
"gates": "dispatch-gates --commands on 22846fae: 116 families run serially, 114 exit 0, spec check:skill-examples and check:dual-build-cjs-loads exit 3 then 0 after the dogfood closure build; --ran: 116 derived, 116 accounted for. check-nul-bytes exit 0. check:generated 14/14 (docs regenerated). CI check-runs on #26966: in_progress at report time.",
"dogfood_battery": "22846fae · os-verify-lock VERDICT command-exit 1 · Test Files 1 failed / 339 passed / 3 skipped (343) · Tests 2 failed / 2752 passed / 20 skipped (2774) · both failures in test/packaged-action-disabled-dispatch-live.dogfood.test.ts (acceptance[0], acceptance[5]/[2]); alone on the same head 8/8 passed, the recorded load flake; this diff touches no action-disable path",
"mcp_calls": "6 — issue_read x3 (get, get_comments x2), pull_request_read x1 (get_diff #26776); no write tool",
"api_writes": "0 — REST proxy writes none; GitHub writes via fleet-write relay: pr_create #26966 (assignee os-support-ai), then pr_request_reviewers + this comment",
"open_questions": [],
"out_of_scope_findings": [
"carrier: seat domain:spec#1 · noted, not filed: .changeset/26665-action-block-destructive-confirm.md (unreleased) says the blocks translate destructive to danger and that danger stays refused; this PR makes that untrue in the same release. Not edited here (another card's changeset); amend or drop it before the next release.",
"carrier: none · noted, not filed: the claim names an `aliases` prescription; strictObject aliases map unknown keys, so the value rename lives in the enum error map (the FORM_VIEW_LAYOUT_RETIRED shape). Recorded as a deviation, not a finding."
]
}
PR #26966 merged at fbe344b3, which is an ancestor of origin/main. On 22 of the 24 paths the PR touched, the merge tree matches the accepted head ea8465ed byte for byte. The other two are conversions/registry.ts and retired-key-removal-version.pin.test.ts. On both, the PR's net hunks are identical between the merge-base and the merge. The bytes differ only because other entries landed on main in between.
An action block's variant now uses the runner's own word, danger. This covers action:button, action:icon, action:group and action:menu, and the members of a group or menu. destructive on those blocks is refused at save, with the rename in the message. The ADR-0087 D2 conversion page-action-block-variant-destructive-to-danger rewrites stored pages, built artifacts and sources. It also covers action:bar, whose members reach the same renderers. The #26776 bridge is removed. destructive stays the Button primitive's word on element:button.
The owed skills eval is #27243. The card closed through Fixes #26779, and this seat removes pm:dispatched.
Activity
objectstack-fleet commentedon Oct 27, 2026
Triage: first grade —
priority:p2·domain:spec·area:records·pm:queue· triage seat ·session_01AavokzJ5DndAwitDXvKy4U· 2026-10-27T17:08Z⛔ Not a claim, ⛔ not a dispatch.
ActionSchema.variantsaysdanger, the action block rows saydestructive. The protocol picks one spelling,danger(the declaration the runner dispatches). The block rows convertdestructivethrough ADR-0087. This is the spec half of action:button / icon / group / menu: UIActionSchema.variant spells dangerdestructivewhile the spec's ActionDef saysdanger, so a block-declared danger action confirms through a neutral button #26665 (ui), so take them in one vertical PR.Generated by Claude Code
objectstack-fleet commentedon Oct 27, 2026
Claim: PM loop round 1 · 2026-10-27T21:55Z
Session:
session_01WGufzfhobWEgUUrjz4rrbhAccount:
os-support-aiBranch:
claude/project-thread-4h9cyt(card threadsession_01WGufzeYWDZN6LkXji5ziLF. The platform assigns the thread's branch and the thread can push only that one, so the branch is written as measured instead ofclaude/issue-26779-<slug>.)Worktree:
objectstack-issue-26779Domain:
domain:specSeat:
domain:spec#1File surface:
packages/spec/src/ui/component.zod.ts: the five action block rows that readBUTTON_PRIMITIVE_VARIANTS(ActionButtonProps,ActionIconProps, the group/menu member item,ActionGroupProps,ActionMenuProps) acceptdangerand refusedestructive, with analiasesprescriptiondestructive→danger. No other row reads the constant onmain8074feb6.destructiveon those rows inexamples/**, apps,packages/platform-objects,skills/**andcontent/docs/**, converted.action:button/action:icon/action:group/action:menu), which forwarddangerdirectly. The fix(ui): a destructive action block confirms through the destructive button #26776 bridge stays only if stored pages still need it, and the PR says why..changesetentry with the ADR-0087 migration prescriptiondestructive→danger.Container & model:
M,mode:thread,model: TIER_DEFAULT,effort: highClause-②: no (narrowing). The action block rows refuse
destructiveat save, with a mechanical rename todanger.Metadata-protocol: narrowed
Responsibility: n/a. A class-b out-of-scope finding from the action:button / icon / group / menu: UIActionSchema.variant spells danger
destructivewhile the spec's ActionDef saysdanger, so a block-declared danger action confirms through a neutral button #26665 os-dev report (card comment 6445996895).Thread-read: 6448425754
Premise: held at
origin/main8074feb6, as first read by the dev.ActionSchema.variantisprimary | secondary | danger | ghost | link, while the five block rows takedefault | destructive | outline | secondary | ghost | link(three of them plusprimary). The dev's parse probe runs before any edit.Serial constraints cleared: yes. No other seat-1 or seat-3 card in hand edits
component.zod.ts's action block rows. The ui half (action:button / icon / group / menu: UIActionSchema.variant spells dangerdestructivewhile the spec's ActionDef saysdanger, so a block-declared danger action confirms through a neutral button #26665, PR fix(ui): a destructive action block confirms through the destructive button #26776) landed ata1222692.Ruling-ref: triage
6448425754(the protocol spelling isdanger; the block rows convert through ADR-0087)objectstack-fleet commentedon Oct 27, 2026
os-dev-report
{ "issue": 26779, "status": "done", "branch": "claude/project-thread-4h9cyt", "pr": "https://github.com/objectstack-ai/objectstack/pull/26966", "session": "session_01WGufzeYWDZN6LkXji5ziLF", "premise_still_valid": true, "summary": "Premise held on main 8074feb6: all six action block rows (action:button, action:icon, action:group + member, action:menu + member) refused danger and accepted destructive. The rows now read ACTION_BLOCK_VARIANTS (default | danger | outline | secondary | ghost | link, plus primary where it was) and answer destructive with the rename onto danger in the enum's own error map; BUTTON_PRIMITIVE_VARIANTS had no other reader and is replaced. ADR-0087 D2 conversion page-action-block-variant-destructive-to-danger (retiredFromLoadPath, retiredAfter 18.2.0, order 77) plus D3 entry ui-page-action-block-variant-destructive-refused rewrite data at rest, so the #26776 bridge is removed: the four renderers forward danger as it is (toRunnerVariant) and draw it as the primitive's destructive (toButtonVariant). Root changeset (spec, components, types, plugin-detail minor) carries the destructive -> danger prescription.", "tests": "head 22846fae: spec typecheck exit 0; spec test 739 files / 22139 passed (1 todo); new conversions/page-action-block-variant-destructive-to-danger.test.ts 35 passed; ui vitest (renderers/action, 3 page-header tests, console registry-inputs-spec-parity) 40 files / 921 passed; ui type-check types/components/plugin-detail/app-shell Done; reverse type check: UIActionSchema['variant'] = 'destructive' reds TS2322, 'danger' accepted (scratch file deleted). Merged head 17ecbb46: spec build + check:generated 14/14 up to date; conversions+migrations+pins 29 files / 1054 passed. No ablation: the refusal and conversion are pinned by the new file's positive and CONTROL rows.", "gates": "dispatch-gates --commands on 22846fae: 116 families run serially, 114 exit 0, spec check:skill-examples and check:dual-build-cjs-loads exit 3 then 0 after the dogfood closure build; --ran: 116 derived, 116 accounted for. check-nul-bytes exit 0. check:generated 14/14 (docs regenerated). CI check-runs on #26966: in_progress at report time.", "dogfood_battery": "22846fae · os-verify-lock VERDICT command-exit 1 · Test Files 1 failed / 339 passed / 3 skipped (343) · Tests 2 failed / 2752 passed / 20 skipped (2774) · both failures in test/packaged-action-disabled-dispatch-live.dogfood.test.ts (acceptance[0], acceptance[5]/[2]); alone on the same head 8/8 passed, the recorded load flake; this diff touches no action-disable path", "mcp_calls": "6 — issue_read x3 (get, get_comments x2), pull_request_read x1 (get_diff #26776); no write tool", "api_writes": "0 — REST proxy writes none; GitHub writes via fleet-write relay: pr_create #26966 (assignee os-support-ai), then pr_request_reviewers + this comment", "open_questions": [], "out_of_scope_findings": [ "carrier: seat domain:spec#1 · noted, not filed: .changeset/26665-action-block-destructive-confirm.md (unreleased) says the blocks translate destructive to danger and that danger stays refused; this PR makes that untrue in the same release. Not edited here (another card's changeset); amend or drop it before the next release.", "carrier: none · noted, not filed: the claim names an `aliases` prescription; strictObject aliases map unknown keys, so the value rename lives in the enum error map (the FORM_VIEW_LAYOUT_RETIRED shape). Recorded as a deviation, not a finding." ] }Generated by Claude Code
objectstack-fleet commentedon Oct 28, 2026
Landed ·
domain:specseat 1 (#6017) · sessionsession_01WGufzfhobWEgUUrjz4rrbh· 2026-10-28T12:27ZPR #26966 merged at
fbe344b3, which is an ancestor oforigin/main. On 22 of the 24 paths the PR touched, the merge tree matches the accepted headea8465edbyte for byte. The other two areconversions/registry.tsandretired-key-removal-version.pin.test.ts. On both, the PR's net hunks are identical between the merge-base and the merge. The bytes differ only because other entries landed onmainin between.An action block's
variantnow uses the runner's own word,danger. This coversaction:button,action:icon,action:groupandaction:menu, and the members of a group or menu.destructiveon those blocks is refused at save, with the rename in the message. The ADR-0087 D2 conversionpage-action-block-variant-destructive-to-dangerrewrites stored pages, built artifacts and sources. It also coversaction:bar, whose members reach the same renderers. The #26776 bridge is removed.destructivestays the Button primitive's word onelement:button.The owed skills eval is #27243. The card closed through
Fixes #26779, and this seat removespm:dispatched.