Repository navigation
docs(skills): objectstack-i18n names the action-entry keys os validate judges - #21656
Conversation
…e judges
The `_actions.{action_name}` row lists param options, `outcomeMessages`,
the `resultDialog` leaves and `resultDialog.fields.{path}`, and says the
same keys hold under `globalActions`; the `globalActions` line says a key
naming a bound action is an error whose message names the
`objects.{owner}._actions.{action_name}` key; the
`translation-target-unknown` paragraph names the three action-entry error
shapes and the shared option warning. Mirrors
content/docs/protocol/kernel/i18n-standard.mdx; no second vocabulary.
Claude-Session: https://claude.ai/code/session_01CB6W87z22K2yjUCDyVrJRk
Co-authored-by: Claude <noreply@anthropic.com>
Contract reviewServed-tier: Read-only shape: the diff against the merge base 759dbe9, card #21583 with every comment, and this head's check-runs; nothing built or run locally. Reviewed by the dispatch seat in seat (served tier equals the constant's value, read from ① Derived judgments
② Semver level
③ Boundary flags
Implemented-by: VERDICT: PASS |
维护者速读(终稿)— PR #21656(#21583)· skills seat 1 · 2026-10-04T01:32Z改了什么: 发布的 为什么改: 这是你本人在 spec 席对话里点名要立卡修的那处(卡正文引原话)。技能是 AI 写翻译包的直接依据;旧文本既不告诉作者 风险与代价(含回滚): 纯技能文本,不碰 席位意见: 建议批准。三处措辞逐句对照参考页 :1039–1058 的表核过,无第二套词汇,也没有复述门禁内部;一处可选的理由句(字段引用型参数为何不判)为守预算未写,记在 Acceptance notes。 你要做的(一个动作): 在 PR #21656 上给一次 APPROVED review;批准后由席位清标、ready、挂 auto-merge 入队。 |
Fixes #21583
Clause-②: no
Tier H (
skills/**): left as a draft; lands only by the maintainer's hand or an authorized APPROVED review, then the owning seat lands it. Not readied, no auto-merge armed.What changed
One file,
skills/objectstack-i18n/SKILL.md, three places, mirroringcontent/docs/protocol/kernel/i18n-standard.mdx:1039–:1058 (the sentence at :1039 and the table rows at :1053, :1055–:1058). No second vocabulary: keys and conditions are spelled the way the page and the lint spell them; the skill names shapes and outcomes, never the gate's internals.1. The
_actions.{action_name}row of the bundle-shape table (was :164)Before:
After:
Reference rows: :1055 (param options), :1056 (
outcomeMessages), :1057 (resultDialog.fields.{path}), :1058 (dialog leaves), :1039 (a{action}.row holds at both action addresses).2. The
globalActionsline (was :170)Before:
globalActions(object-less actions)After:
globalActions(actions with noobjectName— a key naming a bound action is an error whose message names theobjects.{owner}._actions.{action_name}key to write instead)Reference row: :1053.
3. The
translation-target-unknownparagraph (was :198–:203)Before, after the enumeration sentence:
After:
Reference: rows :1055–:1058 and the paragraph under the table (the error, and the option warning as the deliberate exception).
Gate-side reading (read only, not changed)
packages/lint/src/validate-translation-references.tsjudges every rule the page states:checkActionEntryis called from both the_actionsloop and theglobalActionsloop;checkActionParamOptionKeysis the warning rule and returns without judging a field-backed param that declares no inlineoptions;checkActionOutcomeMessages,checkActionResultDialogLeaves(which returns when the action declares aresultDialog) andcheckActionResultDialogFieldsare the error rule; aglobalActionskey naming a bound action is an orphan whose hint reads "Move these keys underobjects.{owner}._actions.{action}". Page and gate agree, so the page was not touched.Placeholder spelling: the skill's own
{action_name}/{param_name}are kept in the table (the row already used them);{value},{outcome},{path}and{owner}are the page's.Readings
skills/objectstack-i18n/SKILL.md: 496 → 503 lines (net +7, budget at most +8).skills/**/SKILL.mdtogether: 4397 → 4404 lines (baseorigin/main759dbe9).node scripts/check-skills-token-ratchet.mjs): 4752 → 5032 tokens against the unchanged ceiling 6338 (headroom 1586 → 1306).Verification (tree at afecd20)
Derived with
node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack(24 commands, the same 24 the dispatch named) and reconciled with--ran. Every exit code was captured before any pipe, from a redirected log.check-ci-filter-parity;check-closing-keyword-parityand its--self-test(40 assertions);check-comment-mask-corpus(8122 files, 0 disagree);check-doc-route-spelling --advisory("population clean") and its--self-test;check-skills-token-ratchet("54 authored bundle file(s) within their ceilings") and its--self-test(65 cases).pnpm check:*, each exit 0:agent-test-spelling(0 violations),corpus-claim-drift(251 files, 53 under skills),cross-package-test-inputs,doc-authoring("53 published skill files clean — no internal issue-id references"),driver-memory-census,gitlink-declared,nul-bytes("10027 text file(s) … no raw ASCII control bytes"),pm-governed-merges,refd-timer-probe,role-word,skill-compatibility("10 SKILL.md file(s) reconciled"),skill-frame-sync,skill-identifier-liveness("Leg 1: 457 citation(s) over 53 published file(s) … Leg 2: 8 registered exhaustive section(s), 0 ledgered gap(s)"),watch-hint-literal.pnpm --filter @objectstack/spec run check:skill-docsexit 0 ("Skill docs in sync");check:skill-refsexit 0 ("9 generated files in sync with packages/spec") — the second added because a SKILL.md body edit names it in AGENTS.md. Both read SKILL.md frontmatter andpackages/spec/srcthrough tsx, so no build was needed for them.pnpm --filter @objectstack/lint run check:doc-formula-expressionsexit 0 ("22 record-scoped formula example(s) across 460 files / 1381 TS blocks judged clean"), afterturbo run build --filter=@objectstack/lintunderscripts/pm/os-verify-lock.sh(4 tasks, all cache hits; no tracked file changed by the build).Byte hygiene: no raw control bytes in the file, no tracker-shaped ids, no new code fence, no model identifier.
维护者速读(草稿)
改了什么。 只改
skills/objectstack-i18n/SKILL.md一个文件、三处:bundle 形状表的_actions.{action_name}行补齐os validate实际判定的动作子键(参数选项、outcomeMessages、resultDialog的三个文案叶子与resultDialog.fields.{path}),并注明同样的键在globalActions下同样成立;globalActions一句写明:键名指向已绑定对象的动作是错误,错误消息会指出应改写到objects.{owner}._actions.{action_name};translation-target-unknown段落列出三种新的错误形状,并说明参数选项键与字段选项键共用同一条警告。措辞与i18n-standard.mdx:1039–:1058 一致,不另造词汇,不复述门禁内部实现。为什么改。 这是您在会话中点名、但当时没有建卡的技能文档修改。技能是 AI 作者写翻译包时读的文本;原文落后于门禁,作者无从得知
outcomeMessages、resultDialog.fields可译,也不会被告知在没有对话框的动作下写对话框文案、或把已绑定对象的动作写到globalActions下会被os validate以错误拒绝。参考页已经写对,技能只是对齐。风险与代价(含回滚)。 纯技能文本,不发布任何 npm 包,无 changeset(打
skip-changeset)。净增 7 行(预算不超过 8),token 棘轮 4752 → 5032 / 6338,上限未动。派生出的 24 项门禁本地全绿,另加check:skill-refs也绿。回滚即 revert 这一个提交。席位意见。 (留空,席位定稿)
你要做的。 这是 Tier H(
skills/**):请审阅后给出 APPROVED 评审;之后由席位落地。PR 保持 draft,未开 auto-merge。Acceptance notes
translation-target-unknownparagraph now carries the conditions once and the table row names the keys; the page says "takes the field's list when the dialog renders" as the reason a field-backed param is not judged — the skill states the consequence only, to stay inside the line budget.references/_index.mdis generator-owned and unchanged: the body edit touches no frontmatter, which is allgen:skill-refsreads from this file.content/docs/**is the source copied from, not an edit target; nothing else in the tree was touched.Generated by Claude Code