Repository navigation
docs(skills): teach an action param's widget key in the action dialog - #30684
Conversation
The objectui protocol rule lists `widget` among an inline param's widget config: a registered field widget draws the param instead of its `type` widget, an unregistered name keeps the `type` widget, the bulk dialog does not read it, and the server validates by `type`. The objectstack-ui actions rule says a field-backed param inherits the field's `widget` only while it keeps or restates the field's `type`. Paid inside both files' token ceilings by deleting restatements. Co-authored-by: Claude <[email protected]> Claude-Session: https://claude.ai/code/session_016WV4cyNZ7aKsfF5vTBgKKn
|
domain:skills#1 · os-elon-musk · session_016WV4d1mkgEris4MHHLjtnk Contract-review-claim: session_016WV4d1mkgEris4MHHLjtnk · head f49a7c3 · 2026-11-05T22:26Z |
|
domain:skills#1 · os-elon-musk · session_016WV4d1mkgEris4MHHLjtnk Contract reviewServed-tier: ① Derived judgments
② Semver level
③ Boundary flags
④ Design judgment
Implemented-by: VERDICT: PASS |
|
domain:skills#1 · os-elon-musk · session_016WV4d1mkgEris4MHHLjtnk 维护者速读
席位核对 — ACCEPT · head f49a7c3
|
Requested by Elon · project thread
domain:skills#1 · os-elon-musk · session_016WV4cyNZ7aKsfF5vTBgKKn
Fixes #30549
Clause-②: no
Metadata-protocol: none
维护者速读
widget:objectui 协议规则的内联参数清单加上widget(写注册过的字段控件名,如text参数写'permission-ref'就是权限集选择器;未注册的名字退回type控件,批量对话框不读它,服务端仍按type校验);objectstack-ui 动作规则说清字段型参数只在沿用或重述字段type时继承字段的widget,改了type要自己写widget。skills/objectui/rules/protocol.md的 Inline params 条;②skills/objectstack-ui/rules/actions.md的 Action Parameter Patterns 段;③ 两文件中被删的重复句(付账用)。node scripts/check-skills-token-ratchet.mjs,预期 actions.md 2259/2259、protocol.md 4352/4368,整体通过。skills/**为 Tier H,需人工合并)。What changes
skills/objectui/rules/protocol.md, "Inline params": the widget-config list gainswidget. It names a registered field widget that draws the param instead of itstypewidget ('permission-ref'on atextparam is the permission-set picker); an unregistered name keeps thetypewidget; the selection bar's bulk dialog ignores it; the server validates bytype.skills/objectstack-ui/rules/actions.md, "Action Parameter Patterns": the field'swidgetis inherited only while the param keeps or restates the field'stype; a param that overridestypenames its ownwidget.'@objectstack/skills': patch.Every taught fact is read off
origin/main(b77c160a), not the card's prose:ui/packages/fields/src/resolveActionParams.tsinheritedWidget: the param's ownwidgetwins; with notypethe field'swidgetis inherited; with atype, only whenresolveParamWidgetType(param.type) === resolveParamWidgetType(field.type). Inline and unresolved branches copyparam.widget.ui/packages/app-shell/src/utils/paramToField.tsauthoredWidgetKey: a nameresolveFormWidgetTyperesolves (not thetextfallback) replaces thetypewidget key; otherwise thetypewidget stays.packages/spec/liveness/action.jsonparams.widget:live; the dispatcher still validates the submitted value bytype; not read by plugin-gridbulkParamToField.permission-refis a registered widget (ui/packages/fields/src/FieldEditWidget.tsx,ui/packages/components/src/renderers/form/form.tsx).Token ratchet: paid by same-file deletion, no ceiling raise
skills/objectstack-ui/rules/actions.mdskills/objectui/rules/protocol.mdLines: actions.md 179 → 180, protocol.md 377 → 377 (whole-file
wc -l). No SKILL.md changes, so the package's SKILL.md sum is unchanged.Deleted restatements (each already said elsewhere in the same file):
textnode'scontent" under Fields That are NOT Evaluated (the Bindable Text Keys rule says it, and now carries theSchemaRendererwording); "There is no way to opt a type in from metadata …" (the closed-list sentence above it says it); "the third row works today, but its channel is an open contract question" (the Keys Live on the Node rule says it, and the sentence already points there).ctxexplicitly" (the preceding sentence says how to read the org); theskipped while newTabUrl is setcomment (the prose saysnewTabUrlskips the round-trip);static template;in a comment (the heading line says statictarget).Why
After PR #30543 the action dialog draws a param's
widget, but neither skill named the key, and the actions rule promised that every field-backed param inherits the field widget. Authors kept writing free-text params where a picker exists.Acceptance notes
protocol.mdstill lists what is inherited withoutwidget; the inheritance rule is taught once, inactions.md, to stay inside the ceiling.Verification
All local readings are on head
f49a7c33(the only commit), baseb77c160a.Gates: 44 derived families + pnpm lint
node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstackderived 44 families from the diff; each ran with its exit code captured before any pipe, then--ranreconciled:✓ dispatch-gates --ran: 44 derived famil(ies) accounted for — 43 run, 1 NOT-MEASURED (1 DERIVED from a recorded exit 3).check-skills-token-ratchet.mjs(and--self-test),pnpm --dir ui exec vitest run scripts/,check:skill-examples,check:doc-formula-expressions,check:doc-authoring,check:skill-identifier-liveness,check:nul-bytes,check-empty-changeset,check-changeset-no-major,check-adr-0087-registration.pnpm check:dual-build-cjs-loads, reason: exit 3, PREREQUISITE NOT MET (needs a whole-tree build; only the@objectstack/client-react...,@objectstack/formula,@objectstack/lint...closures were built). CI runs it.pnpm lint: exit 0.check-commit-card-trailers.mjs --range origin/main..HEAD: pass.Generated by Claude Code