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: the 18.x migration entry for the action-block destructive → danger rename says element:button keeps destructive, but element:button refuses destructive and spells it danger #27589
Filing gate: ① a product defect with a named location (exception: wrong text that a release freezes; reachability measured first, below). Filed by domain:skills seat 1 · marchtian · session session_017ihL2dPRZXfgE1A2Vct3FU, from the dev's out-of-scope finding on card #27243 (PR #27588, os-dev-report 6498700895). ⛔ Not a claim. No grade yet: triage sets the grade. The domain:spec lane is suggested, since the file is in packages/spec/src/migrations/.
Business reason. The migration entry's reason is compiled into the 18.x upgrade guide. An author upgrading a page reads that element:button "keeps destructive". If they follow it and write variant: 'destructive' on an element:button, the page is refused at save. The upgrade text then teaches the exact mistake the rename removed, both to human authors and to agents that read the guide.
Reader. The domain:spec seat. The next PR is a one-sentence text fix in the entry below, plus the same correction in the card body of #27243 where it is quoted.
Measured (origin/main72b08eec)
packages/spec/src/migrations/entries/semantic/18.ui-page-action-block-variant-destructive-refused.ts L19–L20 says: "Other components that draw the Button primitive directly (element:button and the like) keep destructive, the primitive's own word, and are not touched."
That is false for element:button:
ElementButtonPropsSchema.variant (packages/spec/src/ui/component.zod.ts L2968) is z.enum(['primary', 'secondary', 'danger', 'ghost', 'link']). There is no destructive, and the props object is strict, so destructive is refused at the metadata save door and by os validate.
The renderer maps the spec word to the primitive's: ui/packages/components/src/renderers/basic/elements.tsx L308–L314, SHADCN_BUTTON_VARIANT maps danger to 'destructive'.
destructive is only the word of the React Button primitive (ui/packages/components/src/ui/button.tsx L21), which is not a metadata surface.
reach: the entry landed in b8f4acc2 (2026-10-29) and is in no release tag yet. The next 18.x release compiles it into the upgrade guide, which freezes the wrong sentence. Hence filing now.
Wanted
Correct that sentence. element:button already spells it danger. destructive is only the React Button primitive's word, and no metadata block accepts it.
Claim: PM loop round 3 · 2026-10-29T15:28Z
Session: session_01WGufzgbJhFoXYsLSe5WSPP
Account: os-support-ai
Branch: claude/project-thread-1yvwce (card thread; the platform assigns the thread's branch and it can push only that one, written as measured instead of claude/issue-27589-<slug>)
Worktree: objectstack-27589
Domain: domain:spec
Seat: domain:spec#3
Ruling-ref: none (triage 6500456009: one sentence; release priority, the next 18.x release freezes it)
File surface: the semantic migration entry 18.ui-page-action-block-variant-destructive-refused.ts, the regenerated upgrade guide and other artifacts it feeds, non-governed copies of the same claim, a pin test, an @objectstack/spec patch changeset (stop on breach; explain in the report)
Container & model: S, mode:thread, model: TIER_DEFAULT — --tier: no path-derived mandate (prose; the contract review is triage's), effort: high
Clause-②: no
Metadata-protocol: none
Responsibility: an unclaimed p1 domain:spec card; seat 1 is off duty
Thread-read: 6500456009
Premise: to be measured first by the dev on origin/main178b5238: the entry says element:button keeps destructive, which ElementButtonPropsSchema.variant refuses
Serial constraints cleared: no open PR on these files that the seat knows of; the dev re-checks before editing
Note for the claiming seat (domain:spec#3) · 2026-10-29T15:41Z · ⛔ not a claim
A measurement from a dev this seat had readied for this card before seat 3's claim 6500945752 was seen (no edits made): the same false claim also sits in the unreleased changeset .changeset/26779-action-block-variant-danger.md L12 on origin/main178b5238 ("element:button, toasts, alerts, badges and the like keep destructive"). The head of claude/project-thread-1yvwce (00bd2dad) does not touch that file. The changeset text goes into the release notes, so it freezes with the next release like the entry does.
{
"issue": 27589,
"status": "done",
"branch": "claude/project-thread-1yvwce",
"pr": "https://github.com/objectstack-ai/objectstack/pull/27652",
"head": "00bd2dadd6527effe0d310f0726c2eb8d9e17a9f",
"session": "session_01WGufzjAFu9q3UWTLiMSuk9",
"premise_still_valid": true,
"summary": "Measured on origin/main 178b5238: ElementButtonPropsSchema.variant is z.enum(['primary','secondary','danger','ghost','link']) on a strict object, so the D3 entry's 'element:button and the like keep destructive' is false. The card's wanted 'no metadata block accepts it' is also false: RecordQuickActionsProps.variant and RecordAlertActionSchema.variant take the primitive's enum including destructive, so the corrected reason names element:button as danger and those two record blocks as the ones that keep destructive. Same correction in the D2 conversion docblock and one fixture comment in conversions/registry.ts, and the conversion test's header bullet and one control label. Pin: a new describe in page-action-block-variant-destructive-to-danger.test.ts reads the entry from MIGRATIONS_BY_MAJOR[18] and asserts the two sentences, the three schema facts, and the absence of 'keep(s) destructive' / 'element:button and the like'. Upgrade guide is git-ignored (generated at docs build/release); regenerated locally with --out and --docs: new sentence present, old phrase 0 hits (1 on main). Patch changeset with a 'Supersedes, in the same release' paragraph for .changeset/26779 (governed by check-empty-changeset, not edited). #27243 body left to the seat.",
"tests": "head 00bd2dad, os-verify-lock: spec test + typecheck VERDICT command-exit 0, Test Files 751 passed | 1 skipped (752), Tests 22345 passed | 1 skipped | 1 todo; spec test:repo VERDICT command-exit 0, Test Files 86/86, Tests 1433/1433. One-shot negative: entry file from origin/main + registry regen: Tests 3 failed | 38 passed (41), VERDICT command-exit 1; restored via git checkout HEAD --, blob hash == HEAD.",
"gates": "dispatch-gates --commands --repo objectstack-ai/objectstack: 81 derived at 00bd2dad (4 paths vs merge base 178b5238). Serial pass 70 exit 0, 11 exit 3 (spec dist + teardown fixture commit). After turbo build --filter='@objectstack/lint...' (VERDICT command-exit 0) and git fetch origin 621a4876: the 11 rerun all exit 0. dispatch-gates --ran: 81 derived, 81 run, 0 NOT-MEASURED, 0 UNRUN, exit 0. check-changeset-no-major --event (PR body): exit 0, LEVEL AXIS none at patch. CI check-runs: in_progress at report time.",
"dogfood_battery": "n/a — no `!` in the PR title and no (narrowing) arm",
"mcp_calls": "2 — mcp__github__issue_read get + get_comments on #27589 (reads only); other GitHub reads were unauthenticated GETs",
"api_writes": "2 relay writes as objectstack-fleet[bot]: pr_create (#27652, 8441 bytes read back identical), comment (this report on #27589). Plus 1 git push of the thread branch. No assignee, reviewer or label written.",
"writes": "git push x1; relay pr_create x1; relay comment x1",
"deviations": [
"The card's wanted wording 'destructive ... which no metadata block accepts' was not used: record:quick_actions and record:alert action variants accept destructive on origin/main; the sentence names them instead.",
"PR opened without assignees and without a review request (os-dev rule 2 and the order's no-MCP-writes rule over the session's assignee step); the seat hands the PR over.",
"The conversion fixture keeps its element:button variant 'destructive' control (prose-only binding); noted in Acceptance notes.",
"Worktree ../objectstack-issue-27589 kept for a patch round."
],
"open_questions": [],
"out_of_scope_findings": [
"carrier: seat 3 · noted, not filed · #27243's body quotes the corrected sentence and needs the same correction (the seat's per the order)"
]
}
seat ACCEPT (6503474307) on triage's PASS (6503382064), merged through the merge queue at 2026-10-29T18:27Z, head 00bd2dadd, merge commit 7538f2776b
origin/main
contains the merge commit (git merge-base --is-ancestor)
Delivered:
The 18.x destructive → danger migration entry no longer says element:button keeps destructive. It now says element:button already spells the arm danger and refuses destructive, and that only the record blocks forwarding a variant to the Button primitive (record:quick_actions, a record:alert action) still take it. The D2 conversion docblock and fixture comment match, and a pin binds the sentence to the three schema facts.
Owed elsewhere: none. The review's non-blocking should-fix (the count "two" is not pinned) is recorded in the ACCEPT. pm:dispatched is removed here; the card is closed by the merge.
Activity
objectstack-fleet commentedon Oct 29, 2026
triage#1 · os-zhuang · session_01AavokzJ5DndAwitDXvKy4U
Path: 写给 AI 的文档与 skills 说错一句,等于产品缺陷 | none | P①
Triage: p1 ·
domain:spec·area:studio· 2026-10-29T15:09Z⛔ Not a claim.
element:buttonspells itdanger, and only the React Button primitive saysdestructive. Correct [skills-docs owed] no objectui skill eval exercises an action block'svariant, so thedestructive→dangerrename (#26779) is untaught to an agent #27243's quoted body in the same pass.documentation,pm:queue.Generated by Claude Code
objectstack-fleet commentedon Oct 29, 2026
domain:spec#3 · os-support-ai · session_01WGufzgbJhFoXYsLSe5WSPP
Claim: PM loop round 3 · 2026-10-29T15:28Z
Session:
session_01WGufzgbJhFoXYsLSe5WSPPAccount:
os-support-aiBranch:
claude/project-thread-1yvwce(card thread; the platform assigns the thread's branch and it can push only that one, written as measured instead ofclaude/issue-27589-<slug>)Worktree:
objectstack-27589Domain:
domain:specSeat:
domain:spec#3Ruling-ref: none (triage 6500456009: one sentence; release priority, the next 18.x release freezes it)
File surface: the semantic migration entry
18.ui-page-action-block-variant-destructive-refused.ts, the regenerated upgrade guide and other artifacts it feeds, non-governed copies of the same claim, a pin test, an@objectstack/specpatch changeset (stop on breach; explain in the report)Container & model:
S,mode:thread,model: TIER_DEFAULT — --tier: no path-derived mandate (prose; the contract review is triage's),effort: highClause-②: no
Metadata-protocol: none
Responsibility: an unclaimed p1
domain:speccard; seat 1 is off dutyThread-read: 6500456009
Premise: to be measured first by the dev on
origin/main178b5238: the entry sayselement:buttonkeepsdestructive, whichElementButtonPropsSchema.variantrefusesSerial constraints cleared: no open PR on these files that the seat knows of; the dev re-checks before editing
objectstack-fleet commentedon Oct 29, 2026
domain:spec#4 · marchtian · session_017ihL2fi9zfJhUTubyJYb6V
Note for the claiming seat (
domain:spec#3) · 2026-10-29T15:41Z · ⛔ not a claimA measurement from a dev this seat had readied for this card before seat 3's claim 6500945752 was seen (no edits made): the same false claim also sits in the unreleased changeset
.changeset/26779-action-block-variant-danger.mdL12 onorigin/main178b5238("element:button, toasts, alerts, badges and the like keep destructive"). The head ofclaude/project-thread-1yvwce(00bd2dad) does not touch that file. The changeset text goes into the release notes, so it freezes with the next release like the entry does.objectstack-fleet commentedon Oct 29, 2026
domain:spec#3 · os-support-ai · session_01WGufzjAFu9q3UWTLiMSuk9
os-dev-report
{ "issue": 27589, "status": "done", "branch": "claude/project-thread-1yvwce", "pr": "https://github.com/objectstack-ai/objectstack/pull/27652", "head": "00bd2dadd6527effe0d310f0726c2eb8d9e17a9f", "session": "session_01WGufzjAFu9q3UWTLiMSuk9", "premise_still_valid": true, "summary": "Measured on origin/main 178b5238: ElementButtonPropsSchema.variant is z.enum(['primary','secondary','danger','ghost','link']) on a strict object, so the D3 entry's 'element:button and the like keep destructive' is false. The card's wanted 'no metadata block accepts it' is also false: RecordQuickActionsProps.variant and RecordAlertActionSchema.variant take the primitive's enum including destructive, so the corrected reason names element:button as danger and those two record blocks as the ones that keep destructive. Same correction in the D2 conversion docblock and one fixture comment in conversions/registry.ts, and the conversion test's header bullet and one control label. Pin: a new describe in page-action-block-variant-destructive-to-danger.test.ts reads the entry from MIGRATIONS_BY_MAJOR[18] and asserts the two sentences, the three schema facts, and the absence of 'keep(s) destructive' / 'element:button and the like'. Upgrade guide is git-ignored (generated at docs build/release); regenerated locally with --out and --docs: new sentence present, old phrase 0 hits (1 on main). Patch changeset with a 'Supersedes, in the same release' paragraph for .changeset/26779 (governed by check-empty-changeset, not edited). #27243 body left to the seat.", "tests": "head 00bd2dad, os-verify-lock: spec test + typecheck VERDICT command-exit 0, Test Files 751 passed | 1 skipped (752), Tests 22345 passed | 1 skipped | 1 todo; spec test:repo VERDICT command-exit 0, Test Files 86/86, Tests 1433/1433. One-shot negative: entry file from origin/main + registry regen: Tests 3 failed | 38 passed (41), VERDICT command-exit 1; restored via git checkout HEAD --, blob hash == HEAD.", "gates": "dispatch-gates --commands --repo objectstack-ai/objectstack: 81 derived at 00bd2dad (4 paths vs merge base 178b5238). Serial pass 70 exit 0, 11 exit 3 (spec dist + teardown fixture commit). After turbo build --filter='@objectstack/lint...' (VERDICT command-exit 0) and git fetch origin 621a4876: the 11 rerun all exit 0. dispatch-gates --ran: 81 derived, 81 run, 0 NOT-MEASURED, 0 UNRUN, exit 0. check-changeset-no-major --event (PR body): exit 0, LEVEL AXIS none at patch. CI check-runs: in_progress at report time.", "dogfood_battery": "n/a — no `!` in the PR title and no (narrowing) arm", "mcp_calls": "2 — mcp__github__issue_read get + get_comments on #27589 (reads only); other GitHub reads were unauthenticated GETs", "api_writes": "2 relay writes as objectstack-fleet[bot]: pr_create (#27652, 8441 bytes read back identical), comment (this report on #27589). Plus 1 git push of the thread branch. No assignee, reviewer or label written.", "writes": "git push x1; relay pr_create x1; relay comment x1", "deviations": [ "The card's wanted wording 'destructive ... which no metadata block accepts' was not used: record:quick_actions and record:alert action variants accept destructive on origin/main; the sentence names them instead.", "PR opened without assignees and without a review request (os-dev rule 2 and the order's no-MCP-writes rule over the session's assignee step); the seat hands the PR over.", "The conversion fixture keeps its element:button variant 'destructive' control (prose-only binding); noted in Acceptance notes.", "Worktree ../objectstack-issue-27589 kept for a patch round." ], "open_questions": [], "out_of_scope_findings": [ "carrier: seat 3 · noted, not filed · #27243's body quotes the corrected sentence and needs the same correction (the seat's per the order)" ] }Generated by Claude Code
objectstack-fleet commentedon Oct 29, 2026
domain:spec#3 · os-support-ai · session_01WGufzgbJhFoXYsLSe5WSPP
ACCEPT → PR #27652 comment 6503474307
objectstack-fleet commentedon Oct 29, 2026
domain:spec#3 · os-support-ai · session_01WGufzgbJhFoXYsLSe5WSPP
Landed ·
domain:specseat 3 ·os-support-ai· 2026-10-29T18:28Z00bd2dadd, merge commit7538f2776borigin/maingit merge-base --is-ancestor)Delivered:
destructive→dangermigration entry no longer sayselement:buttonkeepsdestructive. It now sayselement:buttonalready spells the armdangerand refusesdestructive, and that only the record blocks forwarding a variant to the Button primitive (record:quick_actions, arecord:alertaction) still take it. The D2 conversion docblock and fixture comment match, and a pin binds the sentence to the three schema facts.Owed elsewhere: none. The review's non-blocking should-fix (the count "two" is not pinned) is recorded in the ACCEPT.
pm:dispatchedis removed here; the card is closed by the merge.