Skip to content

docs(skills): the objectui action-block rule teaches variant 'danger' for a destructive action; destructive is the Button primitive's word - #27588

Merged
os-zhuang merged 3 commits into
mainfrom
claude/issue-27243-objectui-action-variant-eval
Oct 29, 2026
Merged

os-zhuang merged 3 commits into
mainfrom
claude/issue-27243-objectui-action-variant-eval

Conversation

@objectstack-fleet

Copy link
Copy Markdown
Contributor

Part of #27243 — this PR lands the teaching line and the changeset. The eval case the card also wants cannot be paid under skills/objectui/evals/page-builder.json's ceiling by honest deletion (560 tokens, headroom 0; the case costs 124 tokens after every tightening), and the claim forbids a CEILINGS raise, so it waits for the seat's decision — Acceptance notes.
Clause-②: no
Metadata-protocol: none

维护者速读

  • 改了什么:objectui 技能包 rules/protocol.md 的「Actions Are Node Types」规则新增一句:"variant": "danger" 让动作块变红并经由 destructive 确认按钮提问;destructive 是 Button 原语的词,写在动作块上保存时被拒。同文件删去两句他处已讲的话付账。一条 @objectstack/skills patch changeset。
  • 为什么改:PR feat(spec)!: the action blocks spell the destructive variant danger, the word ActionSchema.variant uses #26966 把动作块的 variant 从 destructive 改名 danger,但技能包没教过动作块的 variant;AI 作者只能从 React 示例里抄到 destructive,写到动作块上即被保存拒收。
  • 风险与回滚:只改一份技能 markdown 与一条 changeset,不动 spec、运行时、评测数据;rules/protocol.md 4357 → 4366 / 4368,上限不动;回滚即 revert 本 PR。
  • 先看:skills/objectui/rules/protocol.md(新增段落 L275–L278;删去的两句原在 L139–L141 与 L161–L163,均为同文件他处已陈述的事实)。
  • 两分钟验证:node scripts/check-skills-token-ratchet.mjs,预期见 skills/objectui/rules/protocol.md 4366 / 4368 (-2) 且末行为绿勾。
  • 需要你做的:评测用例欠一个决定(见 Acceptance notes 第一条):按 2026-10-27 裁决「A:先削重复,余额按实测提高」把 page-builder.json 的上限抬 +124,或改走别的路;Tier H 技能面,席位复核后由维护者 APPROVED 落地。

What changes

  • skills/objectui/rules/protocol.md, rule "Actions Are Node Types, Not An Event Bag": one paragraph after the action:button example. "variant": "danger" draws the button red and asks its confirmText question through the destructive confirm button; destructive is the Button primitive's word (variant="destructive" on the React Button, which guides/auth-permissions.md L250 and rules/composition.md L143 already show); on an action block the spec refuses it at save, naming the rename.
  • Paid in the same file, both deletions stated elsewhere in the file: the provenance sentence "The dataSource wiring this was first measured through is retired; the envelope readings below are unchanged by that" (the retirement is taught under "Rule: Data Binding Path Resolution", now L220–L229), and the closing restatement "What is not open: a ${...} on the node is never evaluated, and a key under props never reaches a ui:* / page:* renderer at all" (both facts are the rule's own opening paragraph, L105–L111, and rows 2 and 4 of its table). No re-wrap counted as payment.
  • .changeset/27243-objectui-action-variant-eval.md: '@objectstack/skills': patch, carrying both declaration lines.

Every claim in the line, against origin/main 72b08eec:

Claim Source
the action blocks' variant enum is default, danger, outline, secondary, ghost, link (+ primary on action:button) packages/spec/src/ui/component.zod.ts L3451 ACTION_BLOCK_VARIANTS; L3944 actionBlockVariant("An action:button's", ['primary'])
destructive is refused on an action block, with the rename component.zod.ts L3460–L3463 actionBlockVariant error map keyed on issue.input === 'destructive'; L3472–L3477 refuseActionBlockDestructiveVariant; the protocol-18 entry packages/spec/src/migrations/entries/semantic/18.ui-page-action-block-variant-destructive-refused.ts says where it is met: "the next save of the page meets the component-props gate at the metadata save door; os validate reports the old value as a component-props-invalid finding"
danger draws the destructive button and the confirm button destructive component.zod.ts L3945 describe; ui/packages/components/src/renderers/action/runner-variant.ts toButtonVariant (danger → destructive) and toRunnerVariant; ui/packages/components/src/renderers/action/action-button.tsx L207–L209 and L330–L333; ui/packages/core/src/actions/ActionRunner.ts L551–L553 and L1611–L1613 (confirmOptions: a danger action paints the confirm button destructive)
destructive is the Button primitive's own word ui/packages/components/src/ui/button.tsx L21 variant destructive; component.zod.ts L2230 and L2342 describe it as "the Button primitive's own vocabulary"
the ADR-0087 D2 conversion rewrites stored rows packages/spec/src/conversions/registry.ts L11547 page-action-block-variant-destructive-to-danger, toMajor: 18

Tests

Token budget (ceil(utf8 bytes / 4), the ratchet's convention; no ceiling moves):

File Tokens before / after (ceiling) Lines before / after
skills/objectui/rules/protocol.md 4357 / 4366 (4368) 374 / 377
skills/objectui/evals/page-builder.json 560 / 560 (560) — untouched, see Acceptance notes 56 / 56
  • Bytes: 17428 → 17464, net +36 (changed lines: 341 bytes added, 305 deleted). Headroom 11 → 2 tokens.
  • Whole-package reading: the sum of every SKILL.md under skills/ is unchanged (none touched); the skills/objectui bundle is 202254 bytes before and 202290 after (git ls-tree -r -l); the whole shipped tree reads 219136 → 219145 tokens on the ratchet's bundle-total line.
  • node ui/scripts/check-skill-eval-tokens.mjs exits 0 before and after ("Every must_contain token is taught by its own skill bundle"). After this PR the bundle teaches "variant": "danger" and confirmText as whole tokens, which the pending eval case's must_contain needs.

Acceptance notes

  • The eval case, measured and not landed. Fixture: skills/objectui/evals/page-builder.json (it owns the action-block cases, 1 and 3; protocol.json's diagnostic shape would put the refused spelling in the prompt and fail an answer that quotes it). The case: prompt "Add a 'Delete product' button to the product detail page. It must read as destructive and ask the user to confirm before the record is removed."; expected output names an action:button whose properties carry label, actionType, target, a confirmText question and variant 'danger', red and confirming through the destructive confirm button, with the primitive's spelling refused on a block at save; must_contain action:button, "variant": "danger", confirmText; must_not_contain "variant": "destructive" (a JSON key-value literal, so an answer that says destructive is the primitive's word, or shows variant="destructive" on the React Button, still passes; the expected output does not spell it). Cost: the file is 2238 bytes against a 2240-byte ceiling. With the case written lean (457 bytes of prose, 790 with its JSON frame) and every existing prompt and rubric tightened the way PR docs(skills): objectstack-data, -automation and -platform teach ownership queues and assignment rules (ADR-0142 phase 2) with one eval each #27426 paid (every must_contain token and fact kept, 1206 → 914 bytes of prose), the file reads 2735 bytes = 684 tokens: +124 over the ceiling, and nothing left to delete without losing an assertion. The route the ratchet header records for this shape is the 2026-10-27 ruling 「A:先削重复,余额按实测提高」(decision card 「skills 修复卡的教学和 eval 都撞 token 天花板,怎么付?」), under which CEILINGS rows moved +160, +194, +224, +286 and +297 on 10-27/10-28 for evals that could not be paid down. The claim for this card forbids a raise, so the case is held: the drafted fixture is in the report on the card, ready for a patch round on this PR once the seat rules.
  • Out of scope, class b (contract text contradicts the schema), reach: release text. packages/spec/src/migrations/entries/semantic/18.ui-page-action-block-variant-destructive-refused.ts reason says "Other components that draw the Button primitive directly (element:button and the like) keep destructive". ElementButtonPropsSchema.variant (component.zod.ts L2968) is primary | secondary | danger | ghost | link — no destructive — and ui/packages/components/src/renderers/basic/elements.tsx L308–L314 maps danger → shadcn destructive. The card body repeats the same sentence ("destructive stays the word for the Button primitive (element:button)"). The entry's text is compiled into the upgrade guide (gen:upgrade-guide), so the wrong sentence ships. This PR's line says "the Button primitive's word (variant="destructive" in React)" and does not name element:button. Not fixed here; noted for the seat (dedupe words: element:button destructive, upgrade guide variant, 18.ui-page-action-block-variant-destructive-refused).
  • The commit's author field reads marchtian with the configured noreply@anthropic.com address: a -c user.name I passed on the commit by mistake (the worktree's configured user.name is Claude). An amend plus --force-with-lease was refused by the auto-mode classifier (Git Destructive) and not retried; the trailer pair is model-free and correct.
  • Locally NOT MEASURED, prerequisites absent on an unbuilt tree, CI's Lint and Repo Gates run them built: check:dts-closure, check:dual-build-cjs-loads, check:lean-entry-closure, check:sourcemap-no-sources-content (exit 3: no dist/ for most packages), @objectstack/lint check:doc-formula-expressions (exit 3: @objectstack/formula not built).

Verification

Head 133ce6d8 on origin/main 72b08eec (no merge needed: the branch is one commit on the current main). Derived with node scripts/pm/dispatch-gates.mjs --commands (no paths; 45 commands from the committed diff).

Derived gates: 40 exit 0, 5 exit 3 (prerequisite), 1 measured in two legs
  • Exit 0: check-skills-token-ratchet (84 authored bundle files within their ceilings) and its --self-test; @objectstack/spec check:skill-examples under the verify lock after pnpm --filter '@objectstack/client-react...' build (VERDICT command-exit 0; "274 prose examples type-check across 3 surface(s)"); check-adr-0087-registration --base origin/main and --self-test; check-changeset-no-major; check-empty-changeset and --self-test; check-closing-keyword-parity and --self-test; check-comment-mask-corpus; check-doc-route-spelling --advisory and --self-test; check-dts-emitted --self-test; ci/assert-turbo-remote-cache, ci/plan-test-core-shards, ci/prune-turbo-cache, pm/release-rehearsal-clone, release-pending-publish --self-test; check:agent-test-spelling, check:changeset-gate-self-tests, check:ci-filter-parity, check:closed-ceremony-text, check:corpus-claim-drift, check:cross-package-test-inputs, check:doc-authoring, check:driver-memory-census, check:gitlink-declared, check:nul-bytes, check:pm-changeset-deadline-census, check:pm-governed-merges, check:pm-skill-id-lint, check:published-files, check:refd-timer-probe, check:role-word, check:skill-compatibility, check:skill-frame-sync, check:skill-identifier-liveness, check:watch-hint-literal.
  • Exit 3, PREREQUISITE NOT MET (Acceptance notes): check:dts-closure, check:dual-build-cjs-loads, check:lean-entry-closure, check:sourcemap-no-sources-content, check:doc-formula-expressions.
  • pnpm --dir ui exec vitest run --maxWorkers=2 scripts/ under the verify lock, two legs. Leg 1, before any package was built: VERDICT command-exit 1, Test Files 16 failed / 153 passed / 2 skipped (171), Tests 56 failed / 4574 passed / 17 skipped; every failure is Cannot find package '@objectstack/spec/...' (15 files) or date-only-zone-pins-10183.test.ts, whose spawned plugin suites "ran no case at all" on the unbuilt ui workspace. Leg 2, after building @objectstack/spec and the client-react closure: the 15 spec-dependent files plus the three skill gates' tests (check-skill-eval-tokens, check-skill-examples, check-skills-paths) re-run as vitest run check-skill check-doc-expression-carriage spec-symbol-ledger dollar-dialect check-component-surface-parity check-designer-field-key-parity check-action-forward-parity check-doc-json-fences check-doc-snippet-types console-optimize-deps: VERDICT command-exit 0, Test Files 19 passed (19), Tests 674 passed (674). date-only-zone-pins-10183.test.ts stays NOT MEASURED locally (it needs the ui plugin packages built); CI's Test UI runs it.
  • dispatch-gates --ran with each exit code recorded (the vitest row recorded as its leg-1 exit 1): 45 derived families accounted for — 40 run, 5 NOT-MEASURED, derived from the recorded exit 3; exit 0.

Also run, outside the derived list: node ui/scripts/check-skill-eval-tokens.mjs exit 0; grep -naP for raw control bytes over the two touched files finds none.


Generated by Claude Code

… for a destructive action; destructive is the Button primitive's word

The "Actions Are Node Types" rule in skills/objectui/rules/protocol.md gains
one line: "variant": "danger" draws the action block red and asks its
confirmText question through the destructive confirm button; destructive is
the Button primitive's word (variant="destructive" in React) and is refused
on an action block at save, naming the rename.

Paid in the same file under the skills token ratchet (4357 -> 4366 of 4368):
a provenance sentence about the retired dataSource measurement route and a
sentence restating the props-envelope rule, both stated elsewhere in the
file, are deleted.

One patch changeset for @objectstack/skills.

Co-Authored-By: Claude <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017ihL2dPRZXfgE1A2Vct3FU
…ion block and expects variant 'danger'

The first case in the bundle to exercise an action block's variant: a
'Delete product' button that must read as destructive and confirm first.
The ideal answer writes "variant": "danger" with a confirmText on an
action:button; "variant": "destructive" is a must_not_contain, spelled as
the JSON key-value so an answer naming the Button primitive's word still
passes. Paid down first: the three existing prompts and rubrics tightened,
every must_contain token and fact kept (1206 -> 914 prose bytes).

The CEILINGS row for skills/objectui/evals/page-builder.json moves
560 -> 684, pinned at the measurement (2238 -> 2735 bytes), under the
maintainer ruling of 2026-10-27 quoted verbatim in the row's comment. No
other row moves.

Co-Authored-By: Claude <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017ihL2dPRZXfgE1A2Vct3FU
…action eval and its ceiling move

Co-Authored-By: Claude <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017ihL2dPRZXfgE1A2Vct3FU
@objectstack-fleet

Copy link
Copy Markdown
Contributor Author

domain:skills#1 · marchtian · session_017ihL2dPRZXfgE1A2Vct3FU

Contract review

Served-tier: CONTRACT_REVIEW_TIER
Head-sha: e98faf9f68a02bf9095cdb2a17c39e4b3f27382a
Local-runs: none
Scope: skills/objectui/evals/page-builder.json, skills/objectui/rules/protocol.md + packages/spec/src/ui/component.zod.ts, packages/spec/src/migrations/entries/semantic/18.ui-page-action-block-variant-destructive-refused.ts, packages/spec/src/conversions/registry.ts, packages/spec/src/ui/expression-bindable-text-keys.zod.ts, ui/packages/components/src/renderers/action/runner-variant.ts, ui/packages/components/src/renderers/action/action-button.tsx, ui/packages/core/src/actions/ActionRunner.ts, ui/packages/components/src/ui/button.tsx, ui/packages/components/src/renderers/basic/elements.tsx, ui/scripts/check-skill-eval-tokens.mjs, scripts/check-skills-token-ratchet.mjs (the one moved CEILINGS row, read for ① and ③)

Inputs read:

The rest of the diff (the changeset and scripts/check-skills-token-ratchet.mjs) is the lane seat's ACCEPT at TIER_DEFAULT.

① Derived judgments

  • Skills-catalog grader accept set narrows (eval 4). An answer to the new prompt now fails on the literal "variant": "destructive". It must carry action:button, "variant": "danger" and confirmText.

    Right.

  • The ratchet accept set widens by exactly one row: skills/objectui/evals/page-builder.json 560 → 684.

    • Audited with the header's hand-audit formula ceil(wc -c / 4): base 2238 bytes → 560; head 2735 bytes → 684. Zero headroom, pinned AT the measurement.
    • The arithmetic holds: cases 1–3 prose 1206 → 914 bytes (−292), case 4 +789, net +497.
    • Paid down first, as claimed: the three existing assertions blocks are byte-identical to main, and every asserted fact survives. Only the unasserted "console-like" and "in the middle" are dropped from case 3.
    • It is justified under the 2026-10-27 ruling 「A:先削重复,余额按实测提高」, and the comment block follows the file's pattern.
    • Lint · repo & tooling gates (ratchet + --self-test) is green.

    Right.

  • The published skill bundle (@objectstack/skills) changes. rules/protocol.md gains one paragraph and loses two sentences: 17428 → 17464 bytes, 4357 → 4366 of 4368 tokens, no ceiling moved. Prose only. Right.

  • No spec, runtime or public API surface changes. No packages/* or ui/packages/* source is touched. Right.

② Semver level

'@objectstack/skills': patch, Clause-②: no, Metadata-protocol: none, matching the PR body. Patch is right. Check Changeset and check-changeset-no-major are green.

Should-fix (non-blocking, prose outside hits): the changeset body describes only the teaching line and its two deletions, not eval 4 or the ceiling move.

③ Boundary flags

  • open_questions (6498700895, how the eval gets paid): answered by claim amendment 6498760578 (option A) and executed in e98faf9f. Closed.

  • The PR body keeps Part of #27243, and the seat closes the card by hand after the merge. PR-body guards is green. A post-merge to-do, not a defect.

  • The first commit's author is marchtian: cosmetic. The trailer pair is present.

  • Should-fix (non-blocking): the PR body is stale after the patch round.

    • Its Tests table says page-builder.json is "untouched" and that "no ceiling moves".
    • Its 维护者速读 says 「上限不动」 and asks the maintainer to decide the raise.
    • Its Acceptance notes call the eval "held".

    All three are false on this head. The tree, not the body, was judged.

  • Check-runs on e98faf9f: complete. 49 success, 8 skipped, none failed; check-expected-skips OK. No gate family is pending.

  • The dev's out-of-scope finding (the 18.x migration entry says element:button keeps destructive) is filed as 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. It is not this PR's text.

④ Design judgment

skills/objectui/rules/protocol.md: the paragraph at L275–L278 and the two deletions.

  • ""variant": "danger" draws the button red": component.zod.ts L3451 ACTION_BLOCK_VARIANTS carries danger; runner-variant.ts maps toButtonVariant('danger') to 'destructive'; action-button.tsx L209 draws it; button.tsx L21 styles destructive. Holds.
  • "asks its confirmText question through the destructive confirm button": action-button.tsx L329 and L333 forward confirmText and toRunnerVariant(schema.variant). ActionRunner.ts L1973–L1979 sets destructive: action.variant === 'danger', consumed at L1616–L1618. confirmText is on the action:button row (component.zod.ts L3965). Holds.
  • "destructive is the Button primitive's word": button.tsx L21, and the spec itself says so (L2230, L2342). Holds.
  • "refused at save, naming the rename": component.zod.ts L3460–L3463 and L3472–L3477, plus the protocol-18 entry. Holds.
    • Observation only: action:bar has no props row and nothing refuses destructive on it. The paragraph sits under the action:button example, so its reach is clear.
  • Deletion 1 (retired dataSource provenance): the retirement is taught at L221–L229, and the live route is still stated at L138–L140. No teaching lost.
  • Deletion 2 ("a ${...} on the node is never evaluated …"): the props half is at L22, L105–L111 and table row 2; the ${...} half is at table row 4 and L97–L98. No teaching lost.
    • The sentence was overbroad: EXPRESSION_BINDABLE_TEXT_KEYS_BY_COMPONENT (L140–L143) declares card.title bindable, which L84 teaches. Removing it is an improvement.
    • Pre-existing on main and out of scope: table row 4 (card title read raw) sits in tension with L84. Noted for the seat. Dedupe words: protocol.md row 4 card title bindable.

skills/objectui/evals/page-builder.json: eval 4 and the tightened cases 1–3.

  • Every must_contain token is taught whole in the bundle: action:button at L255/L266, "variant": "danger" at L275, confirmText at L276. check:skill-eval-tokens is green. It is the bundle's first case on an action block's variant.
  • Does must_not_contain wrongly fail a correct answer? Only an answer that quotes the refused JSON literal verbatim as a counter-example would fail. An answer naming the primitive's word, or showing the React Button variant="destructive", passes. This is the same accepted boundary as case 2's "props": {, and it is the objectui#7370 convention. Accepted limit.
  • Can a wrong answer pass? "variant":"destructive" (no space) evades the literal, but the answer must still spell all three must_contain tokens. Substring grading is by design (skills/objectstack-ui/evals/README.md L25). No fix.
  • Self-agreement: no case's must_not_contain string appears in its own expected_output or prompt.
  • The tightened cases keep every assertion byte-for-byte.

No must-fix. Should-fixes: the stale PR body (③) and the stale changeset body (②), both prose outside hits.

Implemented-by: claude/issue-27243-objectui-action-variant-eval
Reviewed-by: session_017ihL2dPRZXfgE1A2Vct3FU

VERDICT: PASS

@objectstack-fleet

Copy link
Copy Markdown
Contributor Author

domain:skills#1 · marchtian · session_017ihL2dPRZXfgE1A2Vct3FU

Contract review

Served-tier: CONTRACT_REVIEW_TIER
Head-sha: 193f4bb93875ac8a725830a81b56e51b0d49d4a8
Local-runs: none
Scope: skills/objectui/evals/page-builder.json, skills/objectui/rules/protocol.md + .changeset/27243-objectui-action-variant-eval.md (the only path the delta touches; read against the two hits files and scripts/check-skills-token-ratchet.mjs on this head)

Delta review of git diff e98faf9f 193f4bb9, read with git fetch / git show only. The full record on e98faf9f (comment 6499375522) carries ①–④ for the hits files.

① Derived judgments

  • The delta is one commit (parent e98faf9f), one file, one insertion: a third bullet in the changeset. No accept set and no public surface moves; nothing in skills/**, scripts/**, packages/** or ui/** changed. ① of the e98faf9f record stands.

② Semver level

  • Unchanged: '@objectstack/skills': patch, Clause-②: no, Metadata-protocol: none. Right.

  • The new bullet is accurate against this head:

    • Eval 4's must_contain is exactly action:button, "variant": "danger" and confirmText; its must_not_contain is exactly "variant": "destructive".
    • Cases 1–3 are tightened, and their assertions blocks are byte-identical to main.
    • The CEILINGS row reads 684 (ratchet L1193), equal to ceil(2735 / 4).
    • The ruling is quoted verbatim.

    The previous record's ② should-fix is closed.

③ Boundary flags

  • Nothing else moved. The head's parent is e98faf9f, the diff is the one bullet, and the commit author is the configured Claude with the trailer pair.
  • The PR-body should-fix stays unapplied: the relay refuses an issue_patch whose first line is the attribution marker. The seat's ACCEPT carries the corrected reading. Non-blocking.
  • Check-runs at the reviewer's read: none failed. Check Changeset and Lint · repo & tooling gates, the two the delta can move, were still pending. The verdict is conditional on them finishing green. The seat reads them before ACCEPT.

④ Design judgment

  • The delta touches neither hits file. ④ of the e98faf9f record stands: the teaching paragraph and eval 4 are byte-identical to the reviewed head. No must-fix and no should-fix inside the diff.

Implemented-by: claude/issue-27243-objectui-action-variant-eval
Reviewed-by: session_017ihL2dPRZXfgE1A2Vct3FU

VERDICT: PASS

@objectstack-fleet

Copy link
Copy Markdown
Contributor Author

domain:skills#1 · marchtian · session_017ihL2dPRZXfgE1A2Vct3FU

席位核对 — ACCEPT · #27243 · head 193f4bb93875ac8a725830a81b56e51b0d49d4a8 · 2026-10-29T14:46Z

维护者速读

  • 改了什么:

    • 给 objectui skill 加一句教学:action 按钮(action:button 等)要画成红色并弹出危险确认,写 "variant": "danger";destructive 是 React Button 原件的词,写在 action 块上,保存时会被拒。
    • 在 evals/page-builder.json 加一道评测题:要求做一个「删除产品」按钮,答案必须写出 "variant": "danger" 和 confirmText,写 "variant": "destructive" 判错。
    • 原有三道题的措辞压短了,断言一条没删。
  • 为什么改:feat(spec)!: the action blocks spell the destructive variant danger, the word ActionSchema.variant uses #26966 把 action 块的 destructive 改名为 danger,但 skill 里没有任何地方教这个写法。照着 React 示例写 destructive 的 AI 作者会在保存时被拒。

  • 与 PR 描述不一致的地方(以本条为准): PR 描述写于补丁轮之前,里面的「评测题暂缓」「上限不动」、请你裁决是否提高上限,这几句都已过时。

    • 本 PR 已经包含这道评测题。
    • page-builder.json 的 token 上限从 560 提到 684,按的是 2026-10-27 你已裁决的选项 A「先削重复,余额按实测提高」:先把原有三道题压短,省下 292 字节,余额按实测值 684 提高,只动这一行。

    中继不允许改写 PR 描述,所以更正写在这里。

  • 风险与回滚:只改了 skill 正文一段、评测文件、token 棘轮里的一行上限,外加一个 patch changeset。spec、运行时、渲染器都没动。回滚即还原本 PR。

  • 先看:skills/objectui/rules/protocol.md L275–L278(新教学句)、skills/objectui/evals/page-builder.json 的 eval 4。

  • 两分钟验证:跑 node scripts/check-skills-token-ratchet.mjs 和 node ui/scripts/check-skill-eval-tokens.mjs,两条都应 exit 0。

  • 需要你做的:批准本 PR(Tier H,skills/**)。契约复核 PASS 在案:完整复核 6499375522(e98faf9f),增量复核 6499430569(Head-sha: 193f4bb93875ac8a725830a81b56e51b0d49d4a8)。批准后由本席落地,并手动关闭 [skills-docs owed] no objectui skill eval exercises an action block's variant, so the destructive → danger rename (#26779) is untaught to an agent #27243(PR 描述写的是 Part of)。

席位意见:独立 Fable 完整复核没有 must-fix。它提了两条 should-fix:changeset 说明已补上;PR 描述过时,由本条更正。

席位核对

  1. Shape: 4 files, +58/−11. Every file is inside the claimed surface, as amended by 6498760578: one fixture, one rules file, one CEILINGS row, one changeset. Tier H (skills/**).
  2. Premise check:
  3. Gate check-runs on 193f4bb9: 49 success, 8 skipped, none failed, including Check Changeset and Lint · repo & tooling gates. check-expected-skips.mjs --pr 27588: OK. Mergeable clean. check-governed-merges: Tier H, 69 lines.
  4. Accepted deviations:
    • The PR body is stale after the patch round; this comment carries the correct reading. The relay refuses a body issue_patch whose first line is the attribution marker.
    • The PR body says Part of #27243, so the seat closes the card by hand.
    • The first commit's author field reads marchtian (cosmetic; the trailers are model-free). The amend was not taken.
    • The seat wrote the changeset bullet itself (commit 193f4bb9, one line) and had it reviewed as a delta.
    • Five gates were NOT MEASURED locally (unbuilt tree, exit 3). CI carries them green.
  5. Out-of-scope dispositions:
  6. Serial constraints: none. No open PR touches skills/objectui/**. The ratchet script's one row is disjoint from other open PRs.
  7. Landing clause: Tier H. This hands off to GOVERNED_APPROVERS (os-zhuang, hotlong) via pr_request_reviewers, with needs-user-decision on the PR while it waits. After an APPROVED review with every check green, the seat will:

@os-zhuang
os-zhuang marked this pull request as ready for review October 29, 2026 15:36
@os-zhuang
os-zhuang added this pull request to the merge queue Oct 29, 2026
Merged via the queue into main with commit c2716f8 Oct 29, 2026
66 checks passed
@os-zhuang
os-zhuang deleted the claude/issue-27243-objectui-action-variant-eval branch October 29, 2026 15:52
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

documentation Improvements or additions to documentation size/s tooling

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants