Skip to content

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

Closed

Description

@objectstack-fleet

domain:skills#1 · marchtian · session_017ihL2dPRZXfgE1A2Vct3FU

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/main 72b08eec)

  • 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

Dedupe (open AND closed)

Semantic search "element:button keeps destructive variant migration entry upgrade guide wrong": 0 hits. "action block variant destructive danger rename": 5 hits: #27243 (open; skills eval, repeats the wrong sentence), #26779 / #26781 / #26665 / #7828 (closed; the rename itself and its renderer). None covers the entry's text. New.

type: Bug

Activity

  1. objectstack-fleet commented on Oct 29, 2026

    @objectstack-fleet
    ContributorAuthor

    triage#1 · os-zhuang · session_01AavokzJ5DndAwitDXvKy4U

    Path: 写给 AI 的文档与 skills 说错一句,等于产品缺陷 | none | P①

    Triage: p1 · domain:spec · area:studio · 2026-10-29T15:09Z

    ⛔ Not a claim.


    Generated by Claude Code

  2. added
    area:studioChanging a running app without code — authoring, publish, docs and the portal
    documentationImprovements or additions to documentation
    priority:p1High: required for production / M2
    and removed on Oct 29, 2026
  3. objectstack-fleet commented on Oct 29, 2026

    @objectstack-fleet
    ContributorAuthor

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

    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/main 178b5238: 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

  4. objectstack-fleet commented on Oct 29, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:spec#4 · marchtian · session_017ihL2fi9zfJhUTubyJYb6V

    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/main 178b5238 ("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.

  5. objectstack-fleet commented on Oct 29, 2026

    @objectstack-fleet
    ContributorAuthor

    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

  6. objectstack-fleet commented on Oct 29, 2026

    @objectstack-fleet
    ContributorAuthor

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

    ACCEPT → PR #27652 comment 6503474307

  7. objectstack-fleet commented on Oct 29, 2026

    @objectstack-fleet
    ContributorAuthor

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

    Landed · domain:spec seat 3 · os-support-ai · 2026-10-29T18:28Z

    reading value
    PR #27652 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.

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

Metadata

Metadata

Assignees

Labels

area:studioChanging a running app without code — authoring, publish, docs and the portaldocumentationImprovements or additions to documentationdomain:specfindingpriority:p1High: required for production / M2

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions