Member card of the skills catalog optimization program #14292 (maintainer mandate 2026-09-02, verbatim: 「审核所有的 skills,进行全面的优化。」). Filed by the skills lane seat (session session_01LraLgQVGq8egUwfYZpbYt1). Read-only audit at objectstack origin/maina59f78d. Full findings table = audit record: the dev posts audit/objectstack-i18n/findings.md (seat scratchpad) verbatim as the first comment at claim time.
Audit summary
3 files, 7,296 tok shipped: SKILL.md 6,337 (headroom 1) · evals/README.md 410 (headroom 1) · generated 549. Real usage: 6 patterns — object/field labels + pluralLabel (3 apps, 40/37 sites), option label maps (23), _sections (10), _views + emptyState (12/2), apps/navigation/messages (6/3/5), stack registration (3) — and the biggest by far, a package shipping its own generated bundle (8 packages, 36 *.objects.generated.ts across 4 locales, 11 withSourceFallback sites, 5 kernel:readyloadTranslations sites), which is the package's main hole. Enumeration check: 12 of 14 presented-as-exhaustive enumerations complete; two stale (_tabs missing from the lint-surface list :300-302; --objects-only missing from the extract flag list :546-547). Retired-spelling residue: none. Verdict DIET (28.8%).
Top findings
| id | span | proposal | Δ |
|---|
| I18N-B-01 | SKILL.md:44-66 | DELETE "Core Concepts" — each item restated in full at :252-278, :151-248, :399-415, :308-354 | −301 |
| I18N-D-02 | SKILL.md:99-148 | REWRITE-AS-CONSTRUCT (3-row table) — per-namespace layout 0 real usages; localesDir 0 | −280 |
| I18N-H-01 | evals/README.md:1-45 | planned-eval stub, 6 named files that don't exist (DEFERRED, #14296 item 2) | −267 |
| I18N-B-02 | SKILL.md:646-688 | DELETE "Quick-Start Template" — strict subset of :157-245; its own preamble says so | −245 |
| I18N-B-04 | SKILL.md:28-41 | DELETE "When to Use" | −243 |
| I18N-F-03 | SKILL.md:308-362 | defineTranslation( has 0 usages outside the schema's own file → ONE schema-pointing row (live surface: never delete the last mention) | −250 |
| I18N-C-01 | SKILL.md:506-530 | DELETE hand-wired "Plugin Setup" — os serve auto-registers it (serve.ts:2850-2895), stated in objectstack-platform :442 | −150 |
| I18N-D-05 | SKILL.md:569-585 | REWRITE-AS-CONSTRUCT — "CRM Blueprint" restates :89-93, :234-244, :292 | −150 |
| I18N-D-07 | SKILL.md:608-638 | DELETE two pitfalls that restate :292 and :294-297 | −151 |
| I18N-D-01 | SKILL.md:455-469 | DELETE "AI-Powered Translation Suggestions" — the "no shipped adapter" fact appears 4× | −147 |
| I18N-A-01 | SKILL.md:35-39 | DELETE the locale-formatting trigger — body teaches zero formatting | −103 |
| I18N-B-03 | SKILL.md:19-25 | DELETE preamble | −89 |
| I18N-D-04 | SKILL.md:356-362 | MERGE-INTO :588-606 — the o.* retirement stated twice | −87 |
| I18N-D-06 | SKILL.md:270-274 | REWRITE — validationMessages removal narration → one redirect line | −45 |
Hazards short of falsehood (fix in this flight)
SKILL.md:513 — kernel.use(new I18nServicePlugin({…})) is not awaited; ObjectKernel.use is async (packages/core/src/kernel.ts:192); platform's own examples write await kernel.use(...).SKILL.md:535-560 — the extract → translate → check workflow cannot converge: extract defaults to --objects-only while os i18n check demands app/navigation/dashboard/… keys (packages/cli/src/utils/i18n-coverage.ts:190-220). One clause naming --objects-only makes it terminate.
Three funded additions
- Canonical "package ships its own generated bundle" block (+180, paid by I18N-D-01 + I18N-D-05) — the real shape:
const enSource: TranslationData = { objects: enObjects } → withSourceFallback({objects: zhCNObjects}, enSource, undefined, zhCNGeneratedSourceHashes) (public @objectstack/platform-objects/apps) → i18n.loadTranslations at kernel:ready; fold --source-hashes' purpose in (I18N-F-04). - One clause naming
--objects-only (+25, paid by I18N-B-03). translation metadata item in the frontmatter description (+12) and "tab, " in the lint-surface list (+3), paid by I18N-A-01.
Flight scope
IMPLEMENT (same-file, shrink-only): every row above and in the findings file at HIGH or MED except the deferred ones; the two stale enumerations; the two hazards; the three funded additions; the description edits (regenerate the README index only if the drift gate requires it — report which).
ANCHOR RULINGS: plugin wiring / os serve auto-registration → objectstack-platform (I18N-C-01: delete + pointer). Field/view labels stay here (data and ui point here for translation of what they declare).
DEFER: I18N-H-01 (eval stub, #14296 item 2); I18N-C-03 (generator-owned _index.md transitive pointers → out-of-scope card for the spec lane's build-skill-references.ts); I18N-A-03 (a routing bullet in skills/README.md → "follow-up for skills/README.md" in the PR body).
Flight constraints (binding)
- ONE draft PR, first line
Fixes #<this card>; governed ⇒ stays draft; review requests are the seat's step. - Token ratchet:
SKILL.md may not grow; additions paid by deletions in the same file; ⛔ re-wrap is not payment; ⛔ no ceiling raise; ⛔ no new files; ⛔ do not touch the ratchet script. - ⛔ Never edit another package's files; follow-ups in the PR body. Generated files untouched.
- Live surface with zero measured usage ⇒ one row pointing at its schema; retired/tombstoned ⇒ delete. A false claim matching a spec
.describe() string ⇒ spec-side twin card. - Gates:
node scripts/check-skills-token-ratchet.mjs, pnpm --filter @objectstack/spec check:skill-examples, pnpm check:skill-compatibility, pnpm check:skill-identifier-liveness, pnpm --filter @objectstack/spec check:skill-docs, plus node scripts/pm/dispatch-gates.mjs --commands <changed paths>; record the head sha. - PR body: per-item 落点 | before | after keyed by finding id; per-file token delta;
needs:contract-review on both carriers (the generated-bundle block and the --objects-only semantics are contract claims).
Refs: #14292 · #14296 · #13658.
Member card of the skills catalog optimization program #14292 (maintainer mandate 2026-09-02, verbatim: 「审核所有的 skills,进行全面的优化。」). Filed by the skills lane seat (session
session_01LraLgQVGq8egUwfYZpbYt1). Read-only audit at objectstackorigin/maina59f78d. Full findings table = audit record: the dev postsaudit/objectstack-i18n/findings.md(seat scratchpad) verbatim as the first comment at claim time.Audit summary
3 files, 7,296 tok shipped:
SKILL.md6,337 (headroom 1) ·evals/README.md410 (headroom 1) · generated 549. Real usage: 6 patterns — object/field labels +pluralLabel(3 apps, 40/37 sites), option label maps (23),_sections(10),_views+emptyState(12/2),apps/navigation/messages(6/3/5), stack registration (3) — and the biggest by far, a package shipping its own generated bundle (8 packages, 36*.objects.generated.tsacross 4 locales, 11withSourceFallbacksites, 5kernel:readyloadTranslationssites), which is the package's main hole. Enumeration check: 12 of 14 presented-as-exhaustive enumerations complete; two stale (_tabsmissing from the lint-surface list:300-302;--objects-onlymissing from the extract flag list:546-547). Retired-spelling residue: none. Verdict DIET (28.8%).Top findings
SKILL.md:44-66:252-278,:151-248,:399-415,:308-354SKILL.md:99-148localesDir0evals/README.md:1-45SKILL.md:646-688:157-245; its own preamble says soSKILL.md:28-41SKILL.md:308-362defineTranslation(has 0 usages outside the schema's own file → ONE schema-pointing row (live surface: never delete the last mention)SKILL.md:506-530os serveauto-registers it (serve.ts:2850-2895), stated in objectstack-platform:442SKILL.md:569-585:89-93,:234-244,:292SKILL.md:608-638:292and:294-297SKILL.md:455-469SKILL.md:35-39SKILL.md:19-25SKILL.md:356-362:588-606— theo.*retirement stated twiceSKILL.md:270-274validationMessagesremoval narration → one redirect lineHazards short of falsehood (fix in this flight)
SKILL.md:513—kernel.use(new I18nServicePlugin({…}))is not awaited;ObjectKernel.useis async (packages/core/src/kernel.ts:192); platform's own examples writeawait kernel.use(...).SKILL.md:535-560— the extract → translate → check workflow cannot converge: extract defaults to--objects-onlywhileos i18n checkdemandsapp/navigation/dashboard/… keys (packages/cli/src/utils/i18n-coverage.ts:190-220). One clause naming--objects-onlymakes it terminate.Three funded additions
const enSource: TranslationData = { objects: enObjects }→withSourceFallback({objects: zhCNObjects}, enSource, undefined, zhCNGeneratedSourceHashes)(public@objectstack/platform-objects/apps) →i18n.loadTranslationsatkernel:ready; fold--source-hashes' purpose in (I18N-F-04).--objects-only(+25, paid by I18N-B-03).translationmetadata item in the frontmatter description (+12) and "tab, " in the lint-surface list (+3), paid by I18N-A-01.Flight scope
IMPLEMENT (same-file, shrink-only): every row above and in the findings file at HIGH or MED except the deferred ones; the two stale enumerations; the two hazards; the three funded additions; the description edits (regenerate the README index only if the drift gate requires it — report which).
ANCHOR RULINGS: plugin wiring /
os serveauto-registration → objectstack-platform (I18N-C-01: delete + pointer). Field/view labels stay here (data and ui point here for translation of what they declare).DEFER: I18N-H-01 (eval stub, #14296 item 2); I18N-C-03 (generator-owned
_index.mdtransitive pointers → out-of-scope card for the spec lane'sbuild-skill-references.ts); I18N-A-03 (a routing bullet inskills/README.md→ "follow-up for skills/README.md" in the PR body).Flight constraints (binding)
Fixes #<this card>; governed ⇒ stays draft; review requests are the seat's step.SKILL.mdmay not grow; additions paid by deletions in the same file; ⛔ re-wrap is not payment; ⛔ no ceiling raise; ⛔ no new files; ⛔ do not touch the ratchet script..describe()string ⇒ spec-side twin card.node scripts/check-skills-token-ratchet.mjs,pnpm --filter @objectstack/spec check:skill-examples,pnpm check:skill-compatibility,pnpm check:skill-identifier-liveness,pnpm --filter @objectstack/spec check:skill-docs, plusnode scripts/pm/dispatch-gates.mjs --commands <changed paths>; record the head sha.needs:contract-reviewon both carriers (the generated-bundle block and the--objects-onlysemantics are contract claims).Refs: #14292 · #14296 · #13658.