docs(skills): name translation-target-unknown an error in the i18n skill - #17946
docs(skills): name translation-target-unknown an error in the i18n skill#17946claude[bot] wants to merge 1 commit into
translation-target-unknown an error in the i18n skill#17946Conversation
The i18n skill grouped `translation-target-unknown` and `translation-option-key-unknown` under one word, "warnings". On the tree `translation-target-unknown` is raised at `error` and fails the run (`packages/lint/src/validate-translation-references.ts`, severity note and `TRANSLATION_TARGET_UNKNOWN_SEVERITY`); only the option-key rule stays a warning. The sentence now names each id with its own severity, re-flowed within its own six lines so the file stays at 494 lines. Claude-Session: https://claude.ai/code/session_01DAcomhvR9kKizeYgg89Vo8 Co-authored-by: Claude <noreply@anthropic.com>
Contract reviewHead: ① derived judgments: the diff makes ONE tool-contract claim on a published skill — Implemented-by: claude/issue-17787-i18n-severity-words (mode:subagent) Verdict: PASS. Governed surface ( Generated by Claude Code |
维护者速读改了什么 —— 为什么改 —— PR #17777(你批的 #16310 裁决)把孤儿翻译键升成了错误,而发布的技能仍说它是警告——agent 照技能写元数据,不会去看工具自己打印的严重级。本席在 风险与代价(含回滚) —— 纯文档面;唯一的形变是那一句被重新断行(只动了这一句的六行,行数不变)。回滚 = revert 单文件六行。 席位意见 —— 收。本席亲核:「report it as warnings」0 命中、两个规则 id 各 1、 你要做的(一个动作) —— 受管面( Generated by Claude Code |
Fixes #17787
What changed
skills/objectstack-i18n/SKILL.md:196–:201 — one sentence, re-flowed within its own six lines. It groupedtranslation-target-unknownandtranslation-option-key-unknownunder the single word "warnings"; on the tree the first is raised aterrorand fails the run, the second stays a warning. The sentence now names each id with its own severity. No other file is touched.Before (flattened):
After (flattened):
The tail of the paragraph (「A bundle keyed to something since renamed still parses — …」) is content-identical; only line breaks moved.
Severities re-measured on the tree (card acceptance item 2)
Measured at
origin/main84e6b05(this branch's base), not against the card:translation-target-unknownerrorpackages/lint/src/validate-translation-references.ts:31 (severity note), :151TRANSLATION_TARGET_UNKNOWN_SEVERITY = 'error', :155–:156 (field docblock), emitted at :813 and :1265; testvalidate-translation-references.test.ts:306 「raisestranslation-target-unknownaterror, selectable by its exact id」translation-option-key-unknownwarningseverity: 'warning'besiderule: TRANSLATION_OPTION_KEY_UNKNOWN; test :327 「leavestranslation-option-key-unknownatwarning」The card's wording is still current: the option-key rule has not moved since the triage grading.
Acceptance greps (both directions, this branch at
1974cee)grep -c 'report it as warnings' skills/objectstack-i18n/SKILL.md→0grep -c 'translation-option-key-unknown' skills/objectstack-i18n/SKILL.md→1errorinside the same sentence astranslation-target-unknown: see the flattened "After" sentence above — 「… check this direction:translation-target-unknownis an error and fails the run; …」Line and token readings for
skills/**84e6b05)1974cee)skills/objectstack-i18n/SKILL.mdlinesskills/objectstack-i18n/SKILL.mdbytesskills/objectstack-i18n/SKILL.mdratchet tokens (ceil bytes/4)skills/*/SKILL.mdlines summedskills/objectstack-i18n/directory lines+0 lines is met by re-flowing only the six lines of the edited sentence (new widths 91/81/87/92/88/68; the sentence's own pre-edit maximum was 92, at line 200). Nothing outside the sentence was re-wrapped and no content was deleted to pay for anything. The ratchet prices tokens, not lines; the ceiling is untouched.
Gates
Derived with
node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstackon1974cee(24 commands — the same 24 the dispatch clue list named), each run in the foreground with its exit code captured before any pipe, then reconciled with--ran:24 derived, 24 run, 0 NOT-MEASURED, 0 UNRUN.node scripts/check-ci-filter-parity.mjsnode scripts/check-closing-keyword-parity.mjsnode scripts/check-closing-keyword-parity.mjs --self-testnode scripts/check-comment-mask-corpus.mjsnode scripts/check-doc-route-spelling.mjs --advisorynode scripts/check-doc-route-spelling.mjs --self-testnode scripts/check-skills-token-ratchet.mjsnode scripts/check-skills-token-ratchet.mjs --self-testnode scripts/report-test-timings.mjs --self-testpnpm --filter @objectstack/lint run check:doc-formula-expressionspnpm --filter @objectstack/spec run check:skill-docspnpm check:agent-test-spellingpnpm check:corpus-claim-driftpnpm check:cross-package-test-inputspnpm check:doc-authoringpnpm check:driver-memory-censuspnpm check:nul-bytespnpm check:pm-governed-mergespnpm check:refd-timer-probepnpm check:role-wordpnpm check:skill-compatibilitypnpm check:skill-frame-syncpnpm check:skill-identifier-livenesspnpm check:watch-hint-literalcheck:doc-formula-expressions: the first run exited 3 (PREREQUISITE NOT MET—@objectstack/formulaand@objectstack/lintare not built in a fresh worktree), which measures nothing. Afterpnpm exec turbo run build --filter=@objectstack/formula --filter=@objectstack/lint(the remedy the gate itself prescribes; run underscripts/pm/os-verify-lock.sh,VERDICT command-exit 0) it exited 0. The build left the tree clean (git status --porcelainprinted nothing).check:skill-docsreads only the SKILL.md frontmatter (the catalog); this body edit moves no generated listing — it reports in sync, nothing regenerated.skills/is not one), so there is no dependency-closure build and no packagetest/typecheckfor this diff. The 14 "pending-changeset" families the derivation lists apply only once a changeset exists; this PR ships none (measured below).Changeset:
skip-changeset, measuredskills/**reaches customer projects at scaffold time throughpackages/create-objectstack/src/skills-install.ts(SKILLS_CATALOG = 'objectstack-ai/objectstack/skills', pulled from the git catalog by the skills CLI) — not inside any npm tarball. Measurement on1974cee: 70 non-privatepackage.jsonmanifests underpackages/,examples/andapps/(node_modules excluded); 0 whosefiles[]mentionsskills; positive control: 70 whosefiles[]mentionsdist.create-objectstackitself ships["dist", "README.md", "CHANGELOG.md"]. No released package'sfiles[]ships this path, so nothing published moves ⇒skip-changeset, applied with the additive labels endpoint and read back.Governed surface
skills/**is governed (AGENTS.md Prime Directive #14). This PR stays a draft: no seat flips it ready, queues it, arms auto-merge or submits a review — the maintainer lands it by hand.Acceptance notes
84e6b05withgit grep -n 'translation-target-unknown' origin/main -- skills content docs examples:examples/app-showcase/test/seed.test.ts:94(already says the rule fails) anddocs/audits/2026-07-app-metadata-reference-integrity-assessment.md:143(a dated audit table of counts). Neither is false; nothing filed.wait/boundary_eventnode at run time #17937); its file list does not touchskills/.error-severity finding does to a run, which is why the sentence spells out "fails the run" instead of relying on the severity word alone. No carrier.维护者速读(草稿)
改了什么:
skills/objectstack-i18n/SKILL.md里的一句话(第 196–201 行)。原句把translation-target-unknown与translation-option-key-unknown一起称为「warnings」;现在分别写明:前者是 error,会让os validate/os lint/os compile这次运行失败;后者仍是 warning。只改这一句,文件行数 494 → 494。为什么改:PR #17777 已把
translation-target-unknown提到 error 级(packages/lint/src/validate-translation-references.ts),技能文件却还说它是 warning。技能是 AI 作者最先读、而且不会去复核的那份说明——写错等于教 AI 把一个会让构建失败的问题当成可忽略的提示。风险与代价(含回滚):纯文档改动,不发布任何 npm 包(实测 70 个非 private 包的
files[]无一包含skills/),无运行时影响。技能 token 棘轮 +5(上限 6338,余量 1625),不动上限。回滚 = revert 这一个 commit。席位意见:(留空,待席位定稿)
你要做的:确认这句表述与你对两个规则严重度的预期一致,然后人工合并(受管面
skills/**,不走队列)。若translation-option-key-unknown日后也提级,这句话需要再改一次。Generated by Claude Code