Repository navigation
docs(skills): the i18n skill names fields.{field}.inlineTitle and a joined report's block headings - #26832
Conversation
…oined report's block headings
The objectstack-i18n group table did not name two keys the 18.2 bundle
accepts and the runtime serves: a master-detail field's `inlineTitle`
(addressed on the child object that owns the field; untranslated it keeps
its authored text, no fallback to the child's plural label) and a joined
report's `blocks.{block_name}.{label,description}` (keyed by the block's
required `name`). Both are now in the table, with one example row each
spelled as the shipped app-crm and app-showcase bundles spell them, and
the hand-written author page under content/docs/ui gains the same two
rows. The eval file gains one prompt for both keys; its ratchet row is
pinned at the measurement after the duplicate `--no-objects-only` pin was
cut, under the standing ruling.
Claude-Session: https://claude.ai/code/session_01ADHkmPqouEb6yELnSqBwRY
Co-authored-by: Claude <noreply@anthropic.com>
…der lists report blocks The lead-in above the zh-CN example fence read as the two keys of the previous sentence; it now names `inlineTitle` and the report-block keys, and a blank line separates the fence from the `settings` paragraph. The validate-translation-references header's Reports section lists `blocks.<block_name>.label` / `.description` among a report's leaf keys, which the validator already accepts from the Zod shape. Claude-Session: https://claude.ai/code/session_01ADHkmPqouEb6yELnSqBwRY Co-authored-by: Claude <noreply@anthropic.com>
📓 Docs Drift Check
What this run could not see
Coarse fallback — 4 page(s) merely mention a changed package (the pre-#9192 predicate, kept for the deliberately-wide backstop): |
席位核对ACCEPT ·
|
Contract reviewServed-tier: Director seat (summon #52, ledger objectstack#12708), summoned by the ① Derived judgments
② Semver level
③ Boundary flags
④ Design judgment
Implemented-by: VERDICT: PASS Generated by Claude Code |
…used string
The i18n eval's case 6 said "never `permissionSets`" in its ideal answer
while listing `permissionSets` under must_not_contain, so the ideal
answer graded wrong. Same-byte rewording ("not the camelCase name");
the file stays at its 1642-token pin.
Claude-Session: https://claude.ai/code/session_01ADHkmPqouEb6yELnSqBwRY
Co-authored-by: Claude <noreply@anthropic.com>
Contract reviewServed-tier: Director seat (summon #52), re-stamping record 6450590107 (head ① Derived judgments
② Semver levelUnchanged: ③ Boundary flags
④ Design judgmentUnchanged from 6450590107 ④; the rewording keeps case 6's teaching (the stack's Implemented-by: VERDICT: PASS Generated by Claude Code |
Requested by Steve · project thread
Fixes #26759
Clause-②: no
Metadata-protocol: none
维护者速读
skills/objectstack-i18n/SKILL.md的分组表补上两把 18.2 已接受、运行时已下发但技能没教的键:fields.{field_name}行加inlineTitle(主从字段在父表单上的内嵌子网格标题,键挂在拥有该字段的子对象下;未翻译时保留作者原文,不回退到子对象复数标签);reports那句加reports.{report}.blocks.{block_name}.{label,description}(联合报表各区块标题,按区块必填的name取键)。表后各给一行示例,照搬app-crm/app-showcase已发货的 zh-CN 包写法。手写作者页content/docs/ui/translations.mdx同补两处。eval 文件加第 8 题覆盖两把键;其 token 棘轮行先削重复再按实测钉在 1642;@objectstack/skills补丁 changeset。fields.{field}.inlineTitleandreports.{report}.blocks.{block}.{label,description}(follow-up owed by PR #26757) #26759 是它欠下的Skills-docs:后续——AI 作者照技能写翻译包时,这两处标题会一直停在作者语言。skills/objectstack-i18n/SKILL.md(L162 字段行、L175–177 reports 句、L182–188 示例)、skills/objectstack-i18n/evals/bundles-locales-coverage.json(第 6 题删重复、第 8 题新增)、scripts/check-skills-token-ratchet.mjs(棘轮行 1451 → 1642,算式在注释里)。node scripts/check-skills-token-ratchet.mjs,预期objectstack-i18n/SKILL.md✓ 余量 877、bundles-locales-coverage.json✓ 余量 0,总行81 authored bundle file(s) within their ceilings。skills/**受管面,Tier H)。What changes
skills/objectstack-i18n/SKILL.md(the group table a bundle author picks keys from):fields.{field_name}row namesinlineTitle— the heading of the inline child grid amaster_detailfield draws on its parent's form; the field lives on the child object, so the key is the child's; untranslated it keeps its authored text and never falls back to the child's plural label (wording read offFieldTranslationSchema's docblock,packages/spec/src/system/translation.zod.tsL133–147 onorigin/main0ea90c7);reports,positionsandpermissionsholdlabel+descriptionby name now continues withreports.{report}.blocks.{block_name}.{label,description}, keyed by the block's requiredname(JoinedReportBlockSchema.name,packages/spec/src/ui/report.zod.ts; the translation slot attranslation.zod.tsL1199);os i18n extract --no-objects-onlysentence, spelled exactly as the shipped bundles spell them forzh-CN:objects.crm_opportunity_line_item.fields.opportunity.inlineTitle(examples/app-crm/src/translations/crm.translation.tsL99) andreports.showcase_task_overview.blocks.open_block.label(examples/app-showcase/src/system/translations/index.tsL1362). The skill's own example bundle mirrorsexamples/app-todo, which has neither a master-detail field nor a joined report, so the rows sit in a two-line fragment fence instead of being invented into the todo bundle.content/docs/ui/translations.mdx(the card's hand-written-twin item, named in the claim's file surface): a row for the inline child-grid heading under the field row, and the report row gains thereports.NAME.blocks.BLOCK.label/descriptionspelling. Not governed; it rides this PR because the claim's surface names it and the card thread has one PR.skills/objectstack-i18n/evals/bundles-locales-coverage.json: case 8 asks for theProductsgrid heading on thecrm_opportunityform and theOpen Tasksblock of the joinedshowcase_task_overviewreport, and expects the two keys above;must_containinlineTitle/crm_opportunity_line_item/blocks/open_block,must_not_containfields.opportunity_line_item(the key on the parent) andcomponents.open_block(a page-component spelling). Paid down first: case 6'sos i18n extract --no-objects-onlysentence and its--no-objects-onlyassertion duplicated case 5's pin of the same flag and were cut (77 bytes). Every name in the prompt and assertions is a shipped example's or the Zod source's; none is invented.scripts/check-skills-token-ratchet.mjs: the eval row 1451 → 1642, pinned AT the measurement with the arithmetic and the standing ruling quoted verbatim beside the sibling row: 「A:先削重复,余额按实测提高」. TheSKILL.mdrow does not move (5456 of 6333)..changeset/26759-i18n-skill-inline-title-report-blocks.md:@objectstack/skillspatch, both declaration lines at line start.packages/lint/src/validate-translation-references.ts(round 2, claim amendment 6449881440 — the card's "Stale header line" item): the Reports header comment now listsblocks.<block_name>.label/.description, keyed by the block'sname, among a report's leaf keys. Comment only; the validator reads the Zod shape.Skills readings (
skills/**touched; before =origin/main0ea90c7, after = head; tokens = the ratchet'sceil(bytes/4), stamp line excluded):skills/objectstack-i18n/SKILL.mdlines / tokensskills/objectstack-i18n/evals/bundles-locales-coverage.jsonlines / tokensSKILL.mdlines / tokens (whole package)Why
An AI author who writes a translation bundle from this skill picks keys off the group table; the two keys PR #26757 added were missing from it, so a localized app kept a master-detail grid's heading and a joined report's block headings in English even though the runtime serves both translated (the business case on the card).
Tests
node scripts/check-skills-token-ratchet.mjsat head:81 authored bundle file(s) within their ceilings; 10 generator-owned file(s) measured, not ratcheted, exit 0;objectstack-i18n/SKILL.md✓ (5456 / 6333),bundles-locales-coverage.json✓ (1642 / 1642, headroom 0).node scripts/check-skills-token-ratchet.mjs --self-test:79 cases pass, exit 0.must_containstring in itsmust_not_contain.Acceptance notes
check:skill-docs/check:skill-refs/check:skill-examplesreadSKILL.md,references/and the marked code fences). The new example fence is a fragment and carries noos:checkmarker on purpose.Verification
node scripts/pm/dispatch-gates.mjs --tier --repo objectstack-ai/objectstack: MANDATORY —skills/**, clause ①, no one-line exit; changed lines 51 vs the 3000 threshold.node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstackat head4f490d8e(the final commit) derived 87 commands. All 87 ran in the worktree after that commit, each exit code captured before any pipe: 87 of 87 exit 0 (70 source-reading commands in one serial runner, the 17 dist-reading ones in a second after the build) — among themnode scripts/check-skills-token-ratchet.mjsand its--self-test,pnpm --filter @objectstack/spec run check:skill-docs/check:skill-examples/check:docs,pnpm check:pm-governed-merges,pnpm check:pm-dispatch-gates,pnpm check:published-files,node scripts/check-empty-changeset.mjs --base origin/main,node scripts/check-adr-0087-registration.mjs --base origin/main,node scripts/check-changeset-no-major.mjs --base origin/main,pnpm check:skill-identifier-liveness,pnpm check:skill-frame-sync,pnpm check:skill-compatibility,pnpm check:doc-authoring,pnpm check:docs-spec-enumerations,pnpm check:ratchet-remedy-authority,pnpm check:nul-bytes.dispatch-gates --ran:87 derived famil(ies) accounted for — 87 run, 0 NOT-MEASURED (a DERIVED zero — all 87 recorded an exit code and none of them is 3), exit 0; no UNRUN family named on stderr.turbo run build --filter='./packages/**' --concurrency=2underscripts/pm/os-verify-lock.sh,VERDICT command-exit 0(held 8m20s).--self-test(79 cases); no package source is touched, so no packagetest/typecheckis owed;pnpm lintis CI's run.Human Minimum
packages/specholds no runtime logic. (No schema touched.)pnpm lintpasses (the repo-wide run is CI's; no source file edited).main, one pull request.packages/spectouched: n/a, not touched.content/docs/references/,packages/*/CHANGELOG.mdorcontent/docs/releases/.🤖 Generated with Claude Code
https://claude.ai/code/session_01ADHkmPqouEb6yELnSqBwRY
Generated by Claude Code