Repository navigation
Skills optimization flight — skills/objectstack-i18n: DIET (≈ −1,685 tok, −27%) — "Core Concepts" restated in full four sections later, a per-namespace layout with zero real usages, os i18n check taught in six places, and the #1 real pattern (a package shipping its own generated bundle) dead-ends #14315
Description
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/main a59f78d. 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:ready loadTranslations 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.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
- 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.loadTranslationsatkernel:ready; fold--source-hashes' purpose in (I18N-F-04). - One clause naming
--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 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.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. - ⛔ 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, plusnode 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-reviewon both carriers (the generated-bundle block and the--objects-onlysemantics are contract claims).
Activity
os-litant commentedon Sep 2, 2026
Claim: PM loop round 3
Session:
session_01LraLgQVGq8egUwfYZpbYt1Branch:
claude/issue-14315-skills-i18n-optimizationWorktree:
objectstack-issue-14315Domain:
domain:skillsFile surface:
skills/objectstack-i18n/SKILL.mdONLY (shrink-only; ceiling 6,338, headroom 1);evals/README.mduntouched (I18N-H-01 deferred, #14296 item 2); generatedreferences/_index.mduntouched;skills/README.md+content/docs/ai/skills-reference.mdxregenerated only because the drift gate demands it after the description edits (⛔ no hand edit to README prose — the I18N-A-03 routing bullet goes in the PR body as a follow-up);scripts/role-word-baseline.jsononly ifcheck:role-wordratchets DOWN and names--updateas the remedy (its own commit); ⛔ no other package (stop on breach; explain in the report)Container & model: S/M (one 6,337-token file, 719 lines; one source-pinned funded block),
mode:subagent,model: opus—--tierreads no path-derived mandate (floor sonnet · default opus · ceiling fable); the content limb applies, compensated by the seat's in-seat review atCONTRACT_REVIEW_TIERClause-②: yes — the generated-bundle block (
withSourceFallback/loadTranslationsatkernel:ready/--source-hashes), the--objects-onlyextract semantics, and the un-awaitedkernel.usehazard are contract claims ⇒needs:contract-reviewon both carriers at PR creation; in-seat review before any human review requestSerial constraints cleared: plugin wiring /
os serveauto-registration → objectstack-platform (I18N-C-01: delete + pointer; the platform flight PR #14351 is approved and may land first, so the anchor is verified by content on bothorigin/mainand its branch); field/view labels stay here (data and ui point here); no open PR touchesskills/objectstack-i18n/**; in flight alongside #14316 (formula) on a disjoint directory; #14302 / #14307 / #14308 delivered and under seat review, #14305 in patch round 1.pm:blockingis the triage sweep's derived cache and is left as it stands.Decision re-read: no maintainer ruling on this card; binding inputs = the mandate, the value gate, the ratchet discipline, and #14296 (item 2 deferred: eval stub untouched). I18N-C-03 (generator-owned
_index.mdtransitive pointers) goes out as an out-of-scope finding card for the spec lane, not a doc edit. Landing form: first linePart of #14315(the deferred eval stub keeps the card open).Generated by Claude Code
os-litant commentedon Sep 2, 2026
Claim: dev seat (os-dev subagent dispatched from the PM claim above)
Session:
session_01LraLgQVGq8egUwfYZpbYt1— same session id as the PM claim; this is the dev subagent inside it, not a second claimant. No other claim comment exists on this card.Branch:
claude/issue-14315-skills-i18n-optimization— pushed empty first as the write-route probe (exit 0,[new branch]).Worktree:
../objectstack-issue-14315,BASE=93940d4928b2a49c3adff5f9f82dda4215b6f696.Base note:
origin/mainhas moved past the dispatch's18d816a5to93940d49; the worktree is cut from93940d49. PM mechanism assumption 1 verified at that base —git diff --stat a59f78d origin/main -- skills/objectstack-i18nis empty, so every span in the audit record is byte-identical here and line numbers in the findings table are usable as-is for this file.packages/**line numbers from the audit are re-checked at this base before citation.Assignee untouched.
pm:blockingleft as it stands.Next comment: the full audit record verbatim (angle-bracket fragments transliterated, key at the top).
Generated by Claude Code
os-litant commentedon Sep 2, 2026
audit-record — skills/objectstack-i18n (read-only audit at a59f78d)
Transliteration key. The GitHub body sanitizer eats angle-bracket-shaped fragments, so every one in the source file is rewritten below.
[[X]]reads as "the source's angle-bracketedX":[[os:check]]os:check[[locale]][[o]][[f]][[tab]]locale,o,f,tabPromise[[this]]Promisewith angle-bracketedthisNonNullable[[TranslationData['objects']]]NonNullablewith angle-bracketedTranslationData['objects']Nothing else is changed: the record below is the seat scratchpad file
audit/objectstack-i18n/findings.mdverbatim. Verified at the dev base93940d49:git diff --stat a59f78d origin/main -- skills/objectstack-i18nis empty, so every cited span is byte-identical to the pinned ref.Audit —
skills/objectstack-i18n/(read-only)Pinned ref: objectstack
origin/main=a59f78d. (Working checkout is ata39b02a;git diff --stat a59f78d a39b02a -- skills/is empty, so every span below isidentical at the pinned ref.)
Package price tag (
node scripts/check-skills-token-ratchet.mjs)SKILL.md(719 lines)evals/README.md(45 lines)references/_index.md(35 lines)Ratcheted total: 6747.
Real-usage corpus measured (dimensions E/F)
Grepped
examples/**,packages/apps/**,packages/**:pluralLabelin aTranslationDatafields:, 37pluralLabel:examples/app-{crm,todo,showcase}translationsfields.[[f]].options)_sections(form/detail section labels)examples/app-showcase/src/system/translations/index.ts_viewsincl.emptyStateapp-todoapps+navigation+messagestranslations: [...])examples/app-{showcase,crm,todo}/objectstack.config.ts*.objects.generated.ts, 4 locales, 11withSourceFallbackcall sites, 5kernel:readyloadTranslationscall sitespackages/plugins/plugin-{approvals,audit,security,sharing,webhooks}/src/translations/index.ts,packages/services/service-{messaging,realtime,storage}/src/translations/index.tsdefineTranslation((thetranslationmetadata item)packages/spec/src/system/translation.zod.ts:1021,1078onlylocalesDir/ per-namespacei18n/[[locale]]/*.jsontreeexamples,packages/apps,packages/core,packages/runtimenew I18nServicePlugin(...)in an appos serveauto-registers itpackages/cli/src/commands/serve.ts:2850-2895Distinct real authoring tasks: 6.
Findings
SKILL.md:35-39localization-settings note. `grep -niE "currencyover the whole SKILL.md returns **only these 5 lines** — the body teaches no formatting at all. The currency-fallback half is already carried byskills/objectstack-data/rules/field-types.md:241andskills/objectstack-ui/SKILL.md:1588; the endpoint half (GET /api/v1/auth/me/localization) is API surface (packages/plugins/plugin-hono-server/src/current-user-endpoints.ts:4`).SKILL.md:3-9(frontmatterdescription)*.translation.tsfiles, wiring a new locale, or resolving missing-translation warnings". The body spends 570 tokens (SKILL.md:308-362) on thetranslationmetadata item authored "in the Studio, through the metadata API, or by an agent" — no phrase in the description matches that request.skills/README.md:94-108; all sibling frontmattersexcluding this package: **skills/objectstack-ui/SKILL.mdcontains zero occurrences of "translat"**;objectstack-datahas one passing mention (:1140).skills/README.md"Cross-skill routing" lists 4 decision points, **none about labels vs bundles**. An agent authoring.view.ts/*.object.ts` labels never learns this package exists.skills/README.mdSKILL.md:44-66:252-278, item 2 →:151-248, item 3 →:399-415, item 4 →:308-354. Pure table of contents.SKILL.md:646-688:157-245(same zh-CNobjects.account+label/pluralLabel/fields/options/_views+apps+messages). Its own preamble concedes it: "…as shown in 'Authoring Translation Bundles' above" (:648-650). Two[[os:check]]blocks paid to teach one shape.:157-245IS the constructSKILL.md:19-25descriptionthe agent already holds.SKILL.md:28-41:30,31,32,33,40restate the description;:34points at a contract-only surface with no implementation (D-01);:35-39is A-01.SKILL.md:99-148vs:252-278:143).:248evals/README.md:13-24find skills/objectstack-i18n -type freturns 3 files total. Dead pointers in a shipped file.SKILL.md:506-530new ObjectKernel(); kernel.use(new I18nServicePlugin({localesDir, registerRoutes, basePath})); await kernel.bootstrap();.os serveauto-registersI18nServicePluginwhenever the config carriestranslationsori18n(packages/cli/src/commands/serve.ts:2850-2895), passing onlydefaultLocale/fallbackLocale— neverlocalesDir.skills/objectstack-platform/SKILL.md:442already states this; kernel bootstrap is platform's domain (:962-965). Zero app in the repo hand-wires it.SKILL.md:690-704os validate/os build/ "In a scaffolded project the schema gate isnpm run validate" — substance verbatim fromskills/objectstack-platform/SKILL.md:1143-1162— then says "See objectstack-platform → Verify your work".references/_index.md:15-23data/filter.zod.ts(Query DSL),kernel/metadata-protection.zod.ts,shared/expression.zod.ts,data/field-value.zod.ts,shared/suggestions.zod.ts— none reachable from a translation bundle (FieldTranslationSchemaislabel/help/placeholder/optionsonly,translation.zod.ts:38-47; every target is addressed by name string).gen:skill-refsclosure for this entrySKILL.md:455-469:451-453,:501-504,:551-552— 4 statements of one fact (grep -n suggestTranslations→ 452, 459, 502, 552).SKILL.md:99-148i18n/[[locale]]/*.json) has 0 real usages:find examples packages -path '*i18n/*' -name '*.json'→ 2 hits, bothpackage.json/tsconfig.json;grep -rn localesDirinexamples/packages/apps/packages/core/packages/runtime→ 0. The section concedes the layout is inert (:143).SKILL.md:143-148≡:526-530FileI18nAdapter'slocalesDirloads only flat top-level{locale}.jsonfiles (subdirectories are skipped)" and "localesDirloads only flat, top-level{locale}.jsonfiles … (subdirectories are skipped)".SKILL.md:356-362≡:588-606o.*dialect … both doors now reject it — files included" vs "❌ The Retiredo.*Shape … Both doors reject it, files included." Two sections, one rule; only the pitfall copy carries the migration map.:588-606SKILL.md:569-585:89-93), the canonical assembly (:234-244) and the naming callout (:292). Only new facts: the two example paths at:571-572.SKILL.md:270-274validationMessageswas removed in spec 17.0.0 — nothing ever read it, so a translated rule message was stored and never shown." History clause changes no decision.SKILL.md:608-638vs:292,:294-297snake_casenames" callout at:292; "❌ Hardcoded Option Values" restates:294-297, which is the stronger statement (it names the failure: "both'Direct Mail'and'direct-mail'parse, ship, and resolve to nothing").:608-638SKILL.mdfence censuspackages/spec/scripts/check-skill-examples.ts(opt-in[[os:check]]above the fence): 10 TypeScript fences — 4 marked (:75-76,:157-158,:316-317,:652-653) and 6 unmarked (:384,:479,:508,:595,:612,:627). Four of six are deliberate WRONG/fragment blocks.:508-524is the one unmarked block presenting as a complete program that would FAIL the gate: it usesII18nServiceat:523with no import inside the fence (that import is a separate fence at:479-481) → TS2304.SKILL.md:513kernel.use(new I18nServicePlugin({…}));not awaited.ObjectKernel.useisasync use(plugin): Promise[[this]](packages/core/src/kernel.ts:192); the platform's own call site awaits (packages/cli/src/commands/serve.ts:2889), andskills/objectstack-platform/SKILL.md:962-964writesawait kernel.use(...)3×.awaitSKILL.md:535-547(gap)NonNullable[[TranslationData['objects']]]— an objects subtree, not aTranslationData(packages/services/service-storage/src/translations/zh-CN.objects.generated.ts:17) — so it must be wrapped:const enSource: TranslationData = { objects: enObjects };thenwithSourceFallback({ objects: zhCNObjects }, enSource, undefined, zhCNGeneratedSourceHashes)(.../translations/index.ts:53-60;withSourceFallbackships from the public@objectstack/platform-objects/apps,packages/platform-objects/src/apps/translations/source-hash.ts:462), then loaded atkernel:readyviai18n.loadTranslations(locale, data)(5 call sites, e.g.packages/plugins/plugin-sharing/src/sharing-plugin.ts:505-508). The skill'sloadTranslationscoverage is one bullet clause (:493-495).[[os:check]]block — paid by D-01 + D-05SKILL.md:535-547,:549-560os i18n extractdefaults to--objects-only("Emit only the objects/globalActions subtree (default). Disable to include apps/dashboards",packages/cli/src/commands/i18n/extract.ts:89-93; enforced:254,:287,packages/cli/src/utils/i18n-extract.ts:1416), whileos i18n checkdemandsapp/navigation/dashboard/widget/page/flowkeys (COVERAGE_SOURCE,packages/cli/src/utils/i18n-coverage.ts:190-220). Following the skill ends in coverage failures the extract never scaffolded. The flag list:546-547names 6 flags and omits this one. Repo's own config passes--objects-only --no-metadata-forms --source-hashes(packages/services/service-storage/scripts/i18n-extract.config.ts:12-16).:546SKILL.md:308-362translationmetadata item +defineTranslationoccupies 570 tokens (9% of the file) with 0 real usages:grep -rn "defineTranslation(" --include=*.ts examples packages→ onlypackages/spec/src/system/translation.zod.ts:1021(docstring) and:1078(the definition). Zero usage is evidence, not proof — the sync path exists (authored-translation-sync,translation.zod.ts:271-273).:343-354SKILL.md:546(gap)--source-hashesgets one word in a flag list, yet stale-fill is the platform's own headline i18n hazard:scripts/check-i18n-stale-fill.mjsexists solely for it, 11 shipped bundles consume it, and the extract config warns a stale fill "publishes a superseded draft under a greencheck:i18nforever" (packages/services/service-storage/scripts/i18n-extract.config.ts:19-25).extract --check(:417-439) covers file freshness, a different failure.SKILL.md:300-302_tabsis missing.validateTranslationReferencesvalidatesobjects.[[o]]._tabs.[[tab]]and emitstranslation-target-unknown(packages/lint/src/validate-translation-references.ts:874-887, anchor at:629), and the package's own object table already lists_tabs(SKILL.md:264).SKILL.md:546-547--objects-only, the flag deciding what gets written, absent from a list of 6. See F-02.SKILL.md(all enumerations)SKILL.mdretired-spelling grepSKILL.md:247-248vs flagship example: TranslationBundleliteral" — the largest shipped example does the discouraged thing:export const ShowcaseTranslationBundle = {(examples/app-showcase/src/system/translations/index.ts:20), a bare literal with no type annotation. (app-crm/app-tododo use the factory.)evals/README.md:1-45:3,:37), a fictional file tree (B-06), plus "## Format" (:27-33), "## Status" (:35-37), "## Contributing" (:39-45) = 154 tokens of process prose about evals that do not exist. Sibling precedent:skills/objectstack-data/evals/README.mdcarries the same placeholder in 11 lines / 143 tokens. Nothing here can teach a grader to fail a correct answer, because nothing grades.localesDir(369),translationitem (570), AI suggestions (147), hand-wired bootstrap (188), locale formatting (103), AI-suggestion bullet (30).os i18n checkis taught in 6 separate sections (:33,:401-415,:554-560,:583,:640-642,:697-704).Enumeration structure check (dimension G)
:48-52&:266-268objectstranslationDataShape()— objects, apps, messages, globalActions, dashboards, pages, flows, settings, metadataForms, settingsCommon (packages/spec/src/system/translation.zod.ts:422,425,442,460,477,544,717,777,859,889):257-264ObjectTranslationDataSchema— label, pluralLabel, description, fields, _views, _actions, _sections, _tabs (:151-261):260FieldTranslationSchema— label, help, placeholder, options (:38-47):261_viewssub-keys:189-203):262_actionssub-keysactionTranslationSchema— label, description, confirmText, successMessage, params, resultDialog (:92-130):263/:264_sections/_tabs:229-231) / label (:259):89-93TranslationConfigSchema— defaultLocale, supportedLocales, fallbackLocale (:985-1000):358-360o.*sibling keysLEGACY_OBJECT_FIRST_KEYS(:277-289) +confirmMessage → confirmTextalias (:126):491-496+:501-504II18nService(packages/spec/src/contracts/i18n-service.ts:18-146):443-449TranslationDiffItemfields:1115-1136):526-529/locales,/translations/:locale,/labels/:object/:locale(packages/services/service-i18n/src/i18n-service-plugin.ts:169,183,198):406-408,:415os i18n checkflagspackages/cli/src/commands/i18n/check.ts:37-56):413-415COVERAGE_SOURCE(packages/cli/src/utils/i18n-coverage.ts:190-220);_tabswalked under theviewkind (packages/cli/src/utils/i18n-extract.ts:645-656):300-302objects.[[o]]._tabs.[[tab]](packages/lint/src/validate-translation-references.ts:874-887)_tabsmissing (G-01):546-547os i18n extractflagspackages/cli/src/commands/i18n/extract.ts:65-114)--objects-only(default true) missing (F-02)Incidental falsehoods
None. Two hazards short of falsehood, both recorded above:
SKILL.md:513—kernel.use(...)un-awaited whileObjectKernel.useisasync(packages/core/src/kernel.ts:192); platform's own call site and the sibling skill both await (E-02).SKILL.md:535-560— the extract→check workflow cannot converge (--objects-onlydefault vs check's app/dashboard/page/flow demand). Every sentence true; the sequence is not runnable as written (F-02).Reducible total
SKILL.mddeletions (A-01 subsumed in B-04)SKILL.mdadditions (A-02 +12, F-01 +180, F-02 +25, G-01 +3)SKILL.mdnetevals/README.md(H-01)references/_index.md(C-03, generator-owned)Verdict: DIET (10–30%, at the top of the band).
Generated by Claude Code
os-litant commentedon Sep 2, 2026
os-dev-report
{ "issue": 14315, "status": "done", "branch": "claude/issue-14315-skills-i18n-optimization", "pr": "https://github.com/objectstack-ai/objectstack/pull/14574", "premise_still_valid": true, "summary": "All 26 actionable audit findings landed in 9 commits on skills/objectstack-i18n/SKILL.md, plus I18N-H-01 (eval stub deleted, ceiling row dropped) after the coordinator relayed the maintainer's 1A 2A 3A 4A ruling on #14296. SKILL.md 6337 to 4678 tokens (net -1659, 719 to 496 lines); package 7296 to 5227 shipped (-2069, -28.4%); ceiling 6338 unchanged, headroom 1660, no new file. One audit verdict was falsified at my base and is NOT acted on: #14253 landed after the audit ref, adding a ninth object sub-key _validations (plus bulkActions and a datasets group), so I18N-G-03's 'object sub-key enumeration is COMPLETE' is false today. #14377 owns that correction, carries Blocked-by 14315, and instructs twice that whoever takes this card must not fold it in; measured and recorded in the PR body instead. Also required an origin/main merge: the two generator-owned artifacts had both changed on main, so main's side was taken, the merge committed first, then gen:skill-docs re-derived and committed separately.", "tests": "45-command union from `node scripts/pm/dispatch-gates.mjs --repo objectstack-ai/objectstack --commands`, re-derived AFTER the merge and regeneration (the first derivation printed STALE TREE naming 148 changed files and was discarded); all 45 run on head bc84ff2b, exit codes captured by redirecting to a file BEFORE any pipe. 43 exit 0. Two non-green, neither red: `check-test-completeness` exit 3 = NOT MEASURED (the gate prints 'Nothing was measured ... it is NOT a finding'); `check:skill-examples` and `check:docs` each first returned PREREQUISITE NOT MET (stale spec dist / missing gitignored json-schema after the merge) and were re-run green after rebuilding the spec+client-react closure and running gen:schema post-merge-commit with zero tracked drift. Card-named gates on bc84ff2b: check-skills-token-ratchet exit 0 (4678/6338); check:skill-examples exit 0 ('259 prose examples type-check across 3 surface(s)'); check:skill-compatibility exit 0; check:skill-identifier-liveness exit 0; check:skill-docs exit 0 (both artifacts in sync). One gate caught a real defect in my own addition: check:doc-authoring went red (#2035 / ADR-0059, bare metadata-literal in docs/skills) on the new block's bare TranslationBundle literal; commit bc84ff2b reauthors it through defineTranslationBundle and the gate is exit 0 on the final head. check:role-word exit 0, so scripts/role-word-baseline.json was NOT touched. Pre-deletion check: check-skill-identifier-liveness BINDINGS registers 8 sections across 7 files, none in skills/objectstack-i18n. No ablation in this flight. The funded generated-bundle block is deliberately UNMARKED for check:skill-examples (that gate's skills surface resolves @objectstack/spec only and the real shape needs @objectstack/platform-objects), and was instead verified by a throwaway driver in packages/services/service-storage typechecking the block verbatim against the real exports, tsc --noEmit exit 0, run twice (before and after the factory change), deleted both times with the files observed gone and git status clean. Pushed remote head equals local head equals the gate tree: bc84ff2b.", "mcp_calls": "16", "open_questions": [ { "question": "Landing form: the PR's first line is `Fixes #14315`, not the `Part of #14315` the claim comment specified. The claim's only stated reason for `Part of` was the deferred eval stub, which the 1A 2A 3A 4A ruling moved to delivered; the other two DEFER items were filed as their own tracked cards. Keep `Fixes`?", "options": [ "A - keep `Fixes #14315`: nothing is left on the card, and #14377 carries Blocked-by 14315 and only becomes actionable when this card completes", "B - revert to `Part of #14315`: keeps the card open as the seat originally specified, at the cost of leaving #14377 blocked until someone closes 14315 by hand" ], "recommendation": "A, because every DEFER item now has a disposition (H-01 delivered, C-03 filed as #14565, A-03 filed as #14566) and triage's own ordering on #14377 is '#14315 first, this correction second' - but this is a one-word edit before merge and the seat should overrule me if it disagrees." } ], "out_of_scope_findings": [ "filed as #14565: the objectstack-i18n generated reference index routes 5 of 7 transitive pointers at schemas unreachable from a translation bundle - the closure step in build-skill-references.ts; sibling of #14462 / #14466 (those are SKILL_MAP, this is the closure), dedupe-searched before filing", "filed as #14566: nothing routes an agent authoring object/field/view labels to objectstack-i18n - skills/README.md cross-skill routing has no labels-vs-bundles decision point (I18N-A-03, also recorded in the PR body as the card ruled)" ] }Generated by Claude Code
os-litant commentedon Sep 2, 2026
ACCEPT — PR #14574 @
bc84ff2b, verified against GitHub, not the report.Session:
session_01LraLgQVGq8egUwfYZpbYt1· seat review in-seat at CONTRACT_REVIEW_TIER (served model readclaude-fable-5-1).Contract review — PASS, verified at source (merge base
53d36892):os serveauto-registersI18nServicePluginwhen the config carriestranslations/i18n(packages/cli/src/commands/serve.ts:2850-2896, awaited — the un-awaitedkernel.usein the deleted block was hazard 1);localesDirexists only onFileI18nAdapter's options (file-i18n-adapter.ts:15,:137) andservenever passes it; the three routes are the route ledger's (i18n-route-ledger.ts:96-99).TRANSLATION_TARGET_UNKNOWN = 'translation-target-unknown'(validate-translation-references.ts:120); the walk covers_tabs,_sections,_views,_actions, params, apps, navigation, dashboards, widgets, flow screens — the "tab" addition (I18N-G-01) is real.translationitem:TranslationItemSchema(translation.zod.ts:1326),defineTranslation(:1368),localerequired (:1413), the runtime-authored overlay layering over file bundles (Authored (Studio) translations never reach the i18n runtime — only static bundles are loaded #2591,file-i18n-adapter.ts:112;i18n-service-plugin.ts:127).objects-onlyisdefault: true, allowNo: true(extract.ts),COVERAGE_SOURCEalso demandsapp,navigation,dashboard,widget,page,flow(i18n-coverage.ts:192-220);os lint --i18n-strictexists (lint.ts:486,:591).defineTranslationBundle(translation.zod.ts:1226),TranslationData(:1211),withSourceFallback(translated, source, recorded, filledFrom?)withrecordedjudging hand-authored sections andfilledFromthe generated ones (source-hash.ts:455-475and its docblock) — the block's comment is exactly that;NonNullable<TranslationData['objects']>is the generated module's export (en.objects.generated.ts:17);i18n.loadTranslationsatkernel:readyin the approvals / audit / security / platform-objects plugins. Left unmarked forcheck:skill-examplesfor the stated reason (the surface resolves@objectstack/speconly); the dev's throwaway driver typechecked it against the real exports.examples/app-crm/src/translations/crm.translation.ts(bundled) andexamples/app-todo/src/translations/{en,zh-CN,ja-JP}.ts+index.ts(per-locale) exist. The platform anchor## Runtime Boot Sequencewith theI18nServicePluginboot-tree line is present onorigin/main(:426,:443) and on the platform flight's branch (:395,:412) — cited by section, survives either landing order.validationMessages… author the message on the rule itself") is a pre-existing claim whose truth changed when i18n: three authored display surfaces have no bundle key at all (bulk-action defs, custom validation messages, dataset labels) #14253 landed (_validations, plusbulkActionsanddatasets); its correction is owned by Published skillobjectstack-i18nteaches that validation messages are not a translation group — false once #14253 lands #14377 (Blocked-by: #14315, which forbids folding it in). The flight compressed the sentence without changing its truth state and recorded the measurement (I18N-G-03 falsified at base). The seat dispatches Published skillobjectstack-i18nteaches that validation messages are not a translation group — false once #14253 lands #14377 as a light flight the moment this PR merges.Landing form. Draft; first line
Fixes #14315— ruled A: every DEFER item has a disposition (H-01 delivered under item 2; C-03 → #14565; A-03 → #14566), nothing remains on the card, and #14377 waits on its close. Five files: SKILL.md (6,337 → 4,678 tokens, ceiling 6,338 unchanged),evals/README.mddeleted, its ratchet row dropped (['skills/objectstack-i18n/evals/README.md', 411]), the two generator outputs (main's side taken at the merge, then regenerated separately — the diff carries only this card's description row).check:doc-authoringcaught a bare metadata literal in the new block and the final commit authors it throughdefineTranslationBundle— recorded, not hidden.CI at
bc84ff2b: green —Lint & Repo Gatessuccess (13:02Z), Type Check ×5, Test Core 1–6, Build Docs, Governed Surface Queue Guard, single-writer / same-issue / Part-of guards, Spec property liveness, doc links, PR size, Check Changeset all success.Labels.
needs:contract-reviewstripped from #14315 and #14574 by this comment's author under the 2026-08-31 ruling (PASS ⇒ same seat strips, both carriers); card →documentation,priority:p1,pm:dispatched,domain:skills,pm:blocking(the triage cache stays); PR →documentation,skip-changeset.Next. Reviewers os-zhuang + hotlong requested with
draft: true; the merge is the maintainer's. At merge the card closes byFixes; the seat stripspm:dispatchedand dispatches #14377.Generated by Claude Code
claude commentedon Sep 2, 2026
os-dev-report
Merge-sync round on PR #14574 — no content change to
skills/objectstack-i18n, no new PR, no rebase/amend/force-push; draft state, labels, reviews, review requests and auto-merge untouched.01489YWhZEoHT9oXshiyywQypatch/14574-sync(worktreeobjectstack-14574-sync), pushed toclaude/issue-14315-skills-i18n-optimizationbc84ff2bto new headc20ae51e3(fast-forward,bc84ff2be..c20ae51e3)2871d4fd7(git merge origin/main, origin/main7085f9053); regeneration commitc20ae51e3Conflict surface — exactly the three files the dispatch measured
Pre-merge control, driver neutralised per invocation (substituting the plain text merge for
merge.os-regen.driver; the shared git config was never written):git check-attr mergeon all three:unspecified— none is routedmerge=os-regen, as recorded. The real merge produced the same threeUUpaths and no fourth, so no STOP condition fired.Resolutions
The two generated catalog files — not hand-resolved. Main's side taken to clear the markers (both then byte-identical to
origin/main, asserted by blob hash), the merge committed, then regenerated wholesale on the committed merge, never in MERGE state:Both directions verified mechanically, not by eye. The delta of (regenerated vs
origin/main) was compared line-for-line with the delta this branch authored pre-merge (53d368921vsbc84ff2b):skills/README.mdcontent/docs/ai/skills-reference.mdxSo this package's rows read exactly as the PR authored them, and every sibling flight's row reads exactly as
origin/mainhas it — including rows main moved under us that did not exist at the old merge base (the Automationjobs/webhooksdescription, the Formula companion sentence). Nothing dropped, nothing re-added.scripts/check-skills-token-ratchet.mjs— text-resolved. The conflict was two deletions on one hunk: main (#14564) dropped theobjectstack-apievals row, this PR drops theobjectstack-i18none. Both applied, nothing else. Resolved file diffed againstorigin/main's copy:That is the whole difference against
origin/main: one row removal, this PR's own. No ceiling value changed; no row re-added; main'sobjectstack-apideletion preserved.The self-test is owed because this diff edits a gate script — an obligation separate from the derived families. The script carries no sibling vitest suite (
git grep -lover test files: no hits); its two in-repo consumers,check:ratchet-remedy-authorityandscripts/pm/bare-root-worklist.mjs --self-test, both ran green in the union below.The PR's own diff is unchanged by the merge
Against the new merge base
7085f9053, byte-for-byte the same shape as against the old one:GitHub agrees on the new head:
changed_files: 5, additions: 87, deletions: 356.skills/objectstack-i18n/SKILL.mdblob519130b15a63dc375e06d18dbb0e0dd192cd2002atbc84ff2band atc20ae51e3— byte-identical, not merely same-size.git diff --stat bc84ff2be -- skills/objectstack-i18n/on the merged tree is empty: the whole package is untouched by the merge.skills/objectstack-i18n/evals/README.mdstill absent, its deletion commitd0dbe12cdintact; the directory does not exist on the merged tree.Anchor survival (I18N-C-01)
## Runtime Boot Sequenceis present inskills/objectstack-platform/SKILL.mdon the merged tree at line 426, with the boot-tree line namingI18nServicePluginat line 443 under it. PR #14351 has not landed — the newest commit touching that file onorigin/mainise4916fc4b(#14052) — so the pointer resolves on the pre-#14351 shape, which is the case the PR body said it had to survive. It is cited by section, so it survives the other landing order too.Gates on the merged head
c20ae51e3Every exit code captured by redirecting first and reading it before any pipe (
cmd > log 2>&1; EXIT=$?), never through a pipeline.Card-named:
pnpm --filter @objectstack/spec check:skill-examplespnpm check:skill-compatibilitypnpm check:skill-identifier-livenesspnpm check:doc-authoringpnpm check:published-readme-linkscheck:skill-examplesneeded no PREREQUISITE retry this round: the@objectstack/specand@objectstack/client-reactclosures were rebuilt before it ran, through the shared verify lock —bash scripts/pm/os-verify-lock.sh -c "NODE_OPTIONS=--max-old-space-size=4096 pnpm --workspace-concurrency=2 --filter '@objectstack/spec...' --filter '@objectstack/client-react...' build", VERDICTcommand-exit 0 · held the lock 309s · waited 3s.check:docslikewise did not demandgen:schemathis round: the rebuild refreshed the gitignoredjson-schematree, so it passed first try and produced zero tracked drift (git status --porcelainempty after the entire union).Derived union:
node scripts/pm/dispatch-gates.mjs --repo objectstack-ai/objectstackEXIT 0, headerderived from the tree of 'objectstack-ai/objectstack' at commit c20ae51e3, repo assertion holds, change set 5 paths vs merge base7085f9053(committed 5, working tree 0, untracked 0). It reconciles to 45 families — the same 45 the PR body recorded atbc84ff2b, so the merge moved no family in or out. Harvested with--commandsrather than by grepping the prose block, and all 45 were run onc20ae51e3:node scripts/check-test-completeness.mjs: NOT MEASURED. Not a pass and not a finding, by the gate's own words: "Nothing was measured: this gate exited before parsing a single summary line". Identical to the reading the PR body already records.The union ran after the final commit and is quoted against that sha,
c20ae51e3; nothing has been committed since and the tree is clean.Byte discipline:
pnpm check:nul-bytesEXIT 0 (7975 files scanned); a direct control-character scan of the one hand-edited file found none.Mergeability re-check
Same command, same neutralisation, on the merged head:
The control fired in the other direction first (EXIT 1, three files, pre-merge head), so this clean result is a measurement rather than a command that cannot fail. GitHub's own recompute after the push:
mergeable: true,mergeable_state: blocked— thedirtystate is gone, andblockedis the expected resting state for a governed-surface PR whose pinned approval expired with the new head.Deviations, and state I did not set
pnpm check:pm-dispatch-gates, 776s, under contention with a sibling seat running the same gate). It was waited out in-round, blocking on the runner pid — not deferred to a later turn, not left to a background watcher.draft: falseis not my doing. The PR body says this PR "stays draft", but it was already ready when I picked it up (read before any write), and the dispatch forbids touching it. Recorded, not corrected. Labels (documentation,skip-changeset), reviews, review requests and auto-merge (null) are all as I found them.bc84ff2bis expired by this push, as the dispatch anticipated; re-requesting it belongs to the dispatching seat.MCP GitHub calls this run: 0 — the in-container REST read channel probed green and was used throughout; this comment is the only write.
Generated by Claude Code
Generated by Claude Code
os-support-ai commentedon Sep 2, 2026
Merge-sync round accepted — PR #14574 conflict cleared at head
c20ae51e3; re-review requestedDirector seat (maintainer-summoned, session
session_01489YWhZEoHT9oXshiyywQy). Verified against GitHub, not the report: headc20ae51e3, base7085f9053, PR diff unchanged at 5 files / +87 −356;skills/objectstack-i18n/SKILL.mdblob identical to the pre-round head and theevals/README.mddeletion intact. Both generated catalog files regenerated bygen:skill-docson the committed merge (second run a byte-level no-op);scripts/check-skills-token-ratchet.mjstext-resolved to carry BOTH sides' row deletions with no ceiling value changed — exactly one line of difference againstorigin/main. 45 derived families: 44 green, 1 NOT MEASURED (check-test-completeness, exit 3 by design). Anchor## Runtime Boot Sequenceresolves on the merged tree.Forward look, measured locally with the os-regen driver neutralised: this head three-way-merges clean against
origin/mainata5b95ee6e(which since gained #14585 and #14578, both ratchet-row deletions), against the synced #14463 head, and against the synced #14351 branch — so the three skills PRs no longer constrain each other's landing order.The maintainer's approval (review 5090714794) was pinned to
bc84ff2band has expired with this push, as governed-surface rules require; re-review requested fromos-zhuang(hotlong already requested). No enqueue until an approval is pinned toc20ae51e3.Generated by Claude Code