Repository navigation
docs(skills): objectstack-i18n lists every top-level translation group and the nested form, tab and approval keys - #26388
Conversation
…ted keys the bundle gained since 18.0
The object sub-key table gains a form view's own `title` under `_views`
and the section entry overrides (`label`, `placeholder`, `helpText`)
under `_sections.{section}.fields`; the top-level group list now names
every group the per-app bundle declares (`picklists`, `reports`,
`positions`, `permissions` added), with one line each for a `page:tabs`
item label and an approval step label and the scaffold that writes them.
Two eval prompts cover the new teaching (a report, a permission set, a
position and a picklist; the four nested keys). The eval file sat at zero
token headroom with nothing duplicated to delete, so its ratchet row
rises by exactly the measured addition under the maintainer's ruling
quoted on the row.
Claude-Session: https://claude.ai/code/session_01JQwxbXbFVr7jEKWyQKnPm9
Co-authored-by: Claude <noreply@anthropic.com>
Contract reviewReviewed at 2026-10-27T02:10Z · PR #26388 (card #26296, Served-tier: Readings: PR read over REST at 2026-10-27T02:05Z — ① Derived judgments(a) Every new sentence against the spec and the CLI on
(b) Cuts — none. The diff deletes nothing beyond the three lines it respells ( (c) Ratchet rows. The script's measure is (d) Evals. Ids 6 and 7 are unique and sequential after 1–5; the file parses; (e) Wanted lines — all met: (f) PR body. Line 1 is the harness attribution HTML comment, line 2 the (g) Report. os-dev-report 6431884295 on the card at 2026-10-27T02:01Z carries ② Semver level
③ Boundary flags
Seat to-do before the maintainer's hand:
Implemented-by: VERDICT: FAIL — ①(a): the new sentence " Generated by Claude Code |
…old does not write The scaffold sentence said `os i18n extract --no-objects-only` writes every top-level group; the extractor emits nothing for `messages` (free-form ids) or `settingsCommon`, so the sentence now excepts those two. The `--objects-only` warning also names the dataset, report, picklist, position and permission buckets `os i18n check` reports beside the six it listed. Claude-Session: https://claude.ai/code/session_01JQwxbXbFVr7jEKWyQKnPm9 Co-authored-by: Claude <noreply@anthropic.com>
Contract reviewReviewed at 2026-10-27T02:37Z · PR #26388 (card #26296, Served-tier: Readings: PR read over REST at 2026-10-27T02:35Z — Blob comparison, ① Derived judgments(a) The two respelled sentences against the CLI on
(b) Cuts — none in the rework (+4/−2 is two respellings; every clause of each replaced line survives). (c) Ratchet. SKILL.md on (d) Evals — file identical to (e) Wanted lines — unchanged from the first record, all met; the scaffold pointer the card asked for is now true. Line counts on the head: SKILL.md 512, evals 75, package 542 (512 + 30), as the body and report state. Line 1 of SKILL.md untouched. Nothing outside the claim + amendment surface. (f) PR body (the seat's patch, read at 2026-10-27T02:35Z) against the head: the nine amendments the dev listed in 6432294868 (g) Report 6432294868 — carries ② Semver levelUnchanged and right: ③ Boundary flags
Seat to-do: none blocking. Optional on the next body touch — move the paragraph bullet under the SKILL.md heading and change "1075 tokens of headroom remain" to 1051. Implemented-by: VERDICT: PASS Generated by Claude Code |
维护者速读改了什么: 席位核对ACCEPT ·
Generated by Claude Code |
Requested by Warren · project thread
Fixes #26296
Clause-②: no
Metadata-protocol: none
维护者速读
skills/objectstack-i18n/SKILL.md的对象子键表补上表单视图自己的title(_views)和表单分区条目的label/placeholder/helpText(_sections.{section}.fields);顶层分组清单补齐picklists、reports、positions、permissions,并各用一行写明页面page:tabs条目标签与审批步骤标签的键路径,以及os i18n extract --no-objects-only会把它们一并生成。评测文件加两道题(报表 + 权限集 + 岗位 + 选项列表;四个嵌套键)。评测文件 token 天花板按你的裁决从 1004 提到 1451。reports、positions、permissions分组和这几个嵌套键,技能里的清单读起来像是完整的,AI 作者照着写 zh-CN 包就会漏掉报表、岗位和权限集,而且没有任何提示。skills/objectstack-i18n/SKILL.mdL169–L181(顶层分组清单与两条嵌套键);② 同文件 L163、L165(_views的title、_sections的fields);③scripts/check-skills-token-ratchet.mjsL657–L667(天花板行 1004 → 1451 与引用的裁决)。node scripts/check-skills-token-ratchet.mjs,预期退出 0,且印出bundles-locales-coverage.json is 1451 tokens (ceiling 1451; headroom 0)与SKILL.md is 5282 tokens (ceiling 6333; headroom 1051)。skills/**为对外发布面;席位不会 ready、不会入队)。What changes
skills/objectstack-i18n/SKILL.md(503 → 512 lines; 5028 → 5282 tokens, headroom 1305 → 1051, no ceiling moved):_views.{view_name}row: addstitle— a form view's own heading, translated only where the form authors one; a list view has none (translation.zod.ts303–320)._sections.{section_name}row: addsfields.{field_name}with thelabel,placeholder,helpTextan entry overrides for that form alone, and says why the spelling ishelpTexthere andhelpone row up (translation.zod.ts455–490: each spells what its source does).picklists(pre-18.0, previously unlisted),reports,positions,permissionsadded, each with the one line an author needs (reports/positions/permissionsholdlabel+descriptionby name;picklistsholdslabel+optionsby stored value, inherited by every field referencing the picklist;permissionsis spelled as the stack'spermissions[]).label:pages.{page}.components.{tabs_id}.items.{value}.label(keyed by the item'svalue; novalue, no key) andflows.{flow}.approvals.{node_id}.label, plus the scaffold that writes them:os i18n extract --no-objects-only— every group above butmessagesandsettingsCommon, which the extractor never emits — (the default--objects-onlyemits onlyobjects/globalActions;packages/cli/src/utils/i18n-extract.ts63–131 lists the walk).skills/objectstack-i18n/evals/bundles-locales-coverage.json(55 → 75 lines; 1004 → 1451 tokens):--objects-onlywarning paragraph names thedataset,report,picklist,positionandpermissioncoverage kindsos i18n checkreports beside the six it listed (review item 3).permissionSetsand the singularreport: {alias.title, section entryplaceholder,page:tabsitem, approval step); negative pinsstepLabeland an object-level_tabs.overviewkey.scripts/check-skills-token-ratchet.mjs: the eval file's CEILINGS row 1004 → 1451 (+447, the measured size of the two prompts), with the ruling quoted on the row.Package reading (SKILL.md +
references/**/*.md+rules/**/*.md): 533 → 542 lines (references/_index.md30 → 30, generated, unchanged). Authored tokens 6032 → 6733.Nothing is removed: the card names no stale line, and the line that existed (the group list) is extended, not replaced.
Why
The skill's enumerated lists read as complete. The bundle gained
reports,positionsandpermissionsas top-level groups, the section entry overrides, the form view title, the page tab item and the approval step label, and none of them was taught — so an AI author shipping a zh-CN pack from this page leaves reports, positions and permission sets in English, and nothing reports a missing key (audit row I1–I5 of the skills gap audit;priority:p1, 18.2 headline rows).The token ceiling
The eval file sat at zero headroom (1004 / 1004) under the shrink-only
check-skills-token-ratchet. The maintainer ruled on the seat thread's decision card, question 「skills 修复卡的教学和 eval 都撞 token 天花板,怎么付?」, tap label verbatim and untranslated:Paid down first: the eval file carried no duplicated content to delete (five prompts, five distinct surfaces — bundle authoring, a new locale, the
translationitem, a plugin's generated bundle, the--objects-onlydiagnosis), so the remainder is the whole addition, 447 tokens, and the row is pinned at the measurement with zero headroom. SKILL.md needed no raise (1075 tokens of headroom remain). Arithmetic: evals +447 (ceiling +447), SKILL.md +254 (ceiling +0); bundle +701, ceilings +447.Tests
No package is touched, so no package test or typecheck is owed. The gate script edited (
check-skills-token-ratchet.mjs) carries its own--self-test, which ran green on the final tree; no*.test.*file names that script (git grep -l check-skills-token-ratchet -- '*.test.*'returns nothing).Ratchet and self-test on 6181b12
Acceptance notes
--objects-onlywarning paragraph in the same file (L394–L398 before this PR) still lists the coverage kinds asapp,navigation,dashboard,widget,pageandflow;os i18n checkalso reportsreport,picklist,positionandpermissionbuckets (packages/cli/src/utils/i18n-coverage.ts356–384, 450–454). Fixed in this PR at the review's suggestion (rework6181b122, inside SKILL.md's headroom; now L402–406).translation.zod.ts:602-608, 724, 1140-1143) do not matchorigin/mainat 756220c; the readings used here arereports1161–1168,positions1698–1705,permissions1721–1728,picklists902–911,_views.title320, tab items 1353–1359,approvals1668–1680,_sections.fields476–490.:165addsfields.FIELD(label,placeholder,helpText)」is right as written: under_sections.SECTION.fields.FIELDthe canonical key ishelpText(helpis the alias); only the object-levelfields.FIELDspells ithelp. No duplicate object-levelfieldsrow was added.skip-changeset: the skills package carries nopackage.json;scripts/**ships in no package'sfiles[].Verification
Derived with
node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstackon the final tree (6181b12), every command run with its exit code captured before any pipe, reconciled with--ran.Reconciliation: 52 derived, 51 green, 1 NOT MEASURED (exit 3)
Green (exit 0): check-ci-filter-parity, check-closing-keyword-parity (+ self-test), check-comment-mask-corpus, check-declaration-mirrors (+ self-test), check-doc-route-spelling --advisory (+ self-test), check-dts-emitted --self-test, check-scripts-symbol-anchors (+ self-test), check-self-test-wired (+ self-test), check-self-test-workflow-commands (+ self-test), check-skills-token-ratchet (+ self-test), check-whole-set-label-write (+ self-test), ci/assert-turbo-remote-cache --self-test, ci/prune-turbo-cache --self-test, pm/bare-root-worklist --self-test, spec check:skill-docs, check:agent-test-spelling, check:bash32-floor, check:cli-command-ids, check:corpus-claim-drift, check:cross-package-test-inputs, check:doc-authoring, check:driver-memory-census, check:entry-guard, check:gitlink-declared, check:merge-driver, check:nul-bytes, check:parse-guard, check:pm-dispatch-gates, check:pm-governed-merges, check:pm-skill-id-lint, check:pnpm-filter-targets, check:pnpm-flag-spellings, check:ratchet-remedy-authority, check:refd-timer-probe, check:role-word, check:skill-compatibility, check:skill-frame-sync, check:skill-identifier-liveness, check:watch-hint-literal, lint check:doc-formula-expressions, check:dts-closure, check:lean-entry-closure, check:sourcemap-no-sources-content (the four after building the closures they read, under the shared verify lock).
NOT MEASURED locally (exit 3,
PREREQUISITE NOT MET: it reads every workspace package's builtdist, which a fresh worktree does not have; this diff touches no package, so no whole-tree build is owed and CI runs it on a built tree): check:dual-build-cjs-loads.check:skill-refsis not in the derived set:references/_index.mdis generated from the SKILL.md frontmatter and the schema exports, neither of which moved, and the file is byte-identical toorigin/main.Human Minimum
Each item is one rule from
CONTRIBUTING.md › Human Minimum,
which links the AGENTS.md text that states it.
packages/specholds no runtime logic. (No schema or runtime file is touched.)snake_casemachine names.)pnpm lintis the repo-level scan CI'sLint & Repo Gatesowns — not run locally.main(756220c), one pull request.skip-changeset); both declaration lines are filled in above.packages/spectouched: no.content/docs/references/,packages/*/CHANGELOG.mdorcontent/docs/releases/.pnpm lint, which is not run locally; the change reaches no package test, updates the documentation it is about, publishes nothing, carries nothing unrelated, and touches no auth surface.)Generated by Claude Code