Skip to content

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

Closed

Description

@os-litant

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)

  1. 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(...).
  2. 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

  1. 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).
  2. One clause naming --objects-only (+25, paid by I18N-B-03).
  3. 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.

Activity

  1. self-assigned this
    on Sep 2, 2026
  2. os-litant commented on Sep 2, 2026

    @os-litant
    ContributorAuthor

    Claim: PM loop round 3
    Session: session_01LraLgQVGq8egUwfYZpbYt1
    Branch: claude/issue-14315-skills-i18n-optimization
    Worktree: objectstack-issue-14315
    Domain: domain:skills
    File surface: skills/objectstack-i18n/SKILL.md ONLY (shrink-only; ceiling 6,338, headroom 1); evals/README.md untouched (I18N-H-01 deferred, #14296 item 2); generated references/_index.md untouched; skills/README.md + content/docs/ai/skills-reference.mdx regenerated 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.json only if check:role-word ratchets DOWN and names --update as 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 — --tier reads no path-derived mandate (floor sonnet · default opus · ceiling fable); the content limb applies, compensated by the seat's in-seat review at CONTRACT_REVIEW_TIER
    Clause-②: yes — the generated-bundle block (withSourceFallback / loadTranslations at kernel:ready / --source-hashes), the --objects-only extract semantics, and the un-awaited kernel.use hazard are contract claims ⇒ needs:contract-review on both carriers at PR creation; in-seat review before any human review request
    Serial constraints cleared: plugin wiring / os serve auto-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 both origin/main and its branch); field/view labels stay here (data and ui point here); no open PR touches skills/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:blocking is 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.md transitive pointers) goes out as an out-of-scope finding card for the spec lane, not a doc edit. Landing form: first line Part of #14315 (the deferred eval stub keeps the card open).


    Generated by Claude Code

  3. os-litant commented on Sep 2, 2026

    @os-litant
    ContributorAuthor

    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/main has moved past the dispatch's 18d816a5 to 93940d49; the worktree is cut from 93940d49. PM mechanism assumption 1 verified at that base — git diff --stat a59f78d origin/main -- skills/objectstack-i18n is 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:blocking left as it stands.

    Next comment: the full audit record verbatim (angle-bracket fragments transliterated, key at the top).


    Generated by Claude Code

  4. os-litant commented on Sep 2, 2026

    @os-litant
    ContributorAuthor

    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-bracketed X":

    written here the source file's literal
    [[os:check]] the opt-in fence marker: an HTML comment whose text is os:check
    [[locale]] [[o]] [[f]] [[tab]] the angle-bracketed placeholders locale, o, f, tab
    Promise[[this]] Promise with angle-bracketed this
    NonNullable[[TranslationData['objects']]] NonNullable with angle-bracketed TranslationData['objects']

    Nothing else is changed: the record below is the seat scratchpad file audit/objectstack-i18n/findings.md verbatim. Verified at the dev base 93940d49: git diff --stat a59f78d origin/main -- skills/objectstack-i18n is 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 at a39b02a;
    git diff --stat a59f78d a39b02a -- skills/ is empty, so every span below is
    identical at the pinned ref.)

    Package price tag (node scripts/check-skills-token-ratchet.mjs)

    File Tokens Ceiling Headroom
    SKILL.md (719 lines) 6337 6338 1
    evals/README.md (45 lines) 410 411 1
    references/_index.md (35 lines) 549 — (generator-owned) —
    Total shipped 7296

    Ratcheted total: 6747.

    Real-usage corpus measured (dimensions E/F)

    Grepped examples/**, packages/apps/**, packages/**:

    Pattern Real usages Where
    Object/field labels + pluralLabel in a TranslationData 3 apps, 40 fields:, 37 pluralLabel: examples/app-{crm,todo,showcase} translations
    Select-option label maps (fields.[[f]].options) 23 same
    _sections (form/detail section labels) 10 examples/app-showcase/src/system/translations/index.ts
    _views incl. emptyState 12 / 2 same + app-todo
    apps + navigation + messages 6 / 3 / 5 same
    Bundle registered on the stack (translations: [...]) 3 examples/app-{showcase,crm,todo}/objectstack.config.ts
    Package/plugin ships its OWN generated bundle 8 packages, 36 *.objects.generated.ts, 4 locales, 11 withSourceFallback call sites, 5 kernel:ready loadTranslations call sites packages/plugins/plugin-{approvals,audit,security,sharing,webhooks}/src/translations/index.ts, packages/services/service-{messaging,realtime,storage}/src/translations/index.ts
    defineTranslation( (the translation metadata item) 0 outside the schema's own file packages/spec/src/system/translation.zod.ts:1021,1078 only
    localesDir / per-namespace i18n/[[locale]]/*.json tree 0 grepped examples, packages/apps, packages/core, packages/runtime
    Hand-wired new I18nServicePlugin(...) in an app 0 — os serve auto-registers it packages/cli/src/commands/serve.ts:2850-2895

    Distinct real authoring tasks: 6.


    Findings

    id dim file:span evidence (measured) proposal Δtok gate ①②③ conf human-floor
    I18N-A-01 A SKILL.md:35-39 "You are implementing locale-specific formatting (dates, numbers, currency)" + a 4-line localization-settings note. `grep -niE "currency timezone number format date format Intl. formatDate"over 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`).
    I18N-A-02 A SKILL.md:3-9 (frontmatter description) Description triggers on "adding *.translation.ts files, wiring a new locale, or resolving missing-translation warnings". The body spends 570 tokens (SKILL.md:308-362) on the translation metadata item authored "in the Studio, through the metadata API, or by an agent" — no phrase in the description matches that request. ADD (paid by A-01) +12 ① yes — package not loadable by its own runtime-authoring task ② no ③ n/a HIGH no
    I18N-A-03 A skills/README.md:94-108; all sibling frontmatters `grep -rn "objectstack-i18n translat" skills//SKILL.md excluding this package: **skills/objectstack-ui/SKILL.mdcontains zero occurrences of "translat"**;objectstack-data has 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. ADD one routing bullet to skills/README.md +25 (sibling file) ① yes — this is the load-failure mode for the package's #1 task ② no ③ yes HIGH
    I18N-B-01 B SKILL.md:44-66 "Core Concepts / Translation Architecture Overview" — 4 numbered items, each restated in full later: item 1 → :252-278, item 2 → :151-248, item 3 → :399-415, item 4 → :308-354. Pure table of contents. DELETE −301 ① no ② yes ③ n/a HIGH no
    I18N-B-02 B SKILL.md:646-688 "Quick-Start Template" is a strict subset of the canonical example at :157-245 (same zh-CN objects.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. DELETE −245 ① no ② yes ③ :157-245 IS the construct HIGH no
    I18N-B-03 B SKILL.md:19-25 "Expert instructions for designing internationalization (i18n) and localization (l10n) strategies…" restates the frontmatter description the agent already holds. DELETE −89 ① no ② yes ③ n/a HIGH no
    I18N-B-04 B SKILL.md:28-41 "When to Use This Skill" — 7 bullets. :30,31,32,33,40 restate the description; :34 points at a contract-only surface with no implementation (D-01); :35-39 is A-01. DELETE whole section −243 ① no ② yes ③ n/a HIGH no
    I18N-B-05 B SKILL.md:99-148 vs :252-278 The most decision-changing construct — the object sub-key table — sits at line 252, behind 380 tokens of file-layout prose the package itself calls "authoring conventions" (:143). MOVE-TO after :248 0 ① yes — order decides what a truncated read reaches ② no ③ n/a MED no
    I18N-B-06 B evals/README.md:13-24 The ASCII tree names 6 eval files that do not exist. find skills/objectstack-i18n -type f returns 3 files total. Dead pointers in a shipped file. see H-01 — HIGH no
    I18N-C-01 C SKILL.md:506-530 "Plugin Setup" teaches new ObjectKernel(); kernel.use(new I18nServicePlugin({localesDir, registerRoutes, basePath})); await kernel.bootstrap();. os serve auto-registers I18nServicePlugin whenever the config carries translations or i18n (packages/cli/src/commands/serve.ts:2850-2895), passing only defaultLocale/fallbackLocale — never localesDir. skills/objectstack-platform/SKILL.md:442 already states this; kernel bootstrap is platform's domain (:962-965). Zero app in the repo hand-wires it. DELETE, keep one line on auto-registration + the 3 routes −150 ① yes — points the agent at a path the platform already runs ② yes ③ yes HIGH yes
    I18N-C-02 C SKILL.md:690-704 "Verify your work" repeats os validate / os build / "In a scaffolded project the schema gate is npm run validate" — substance verbatim from skills/objectstack-platform/SKILL.md:1143-1162 — then says "See objectstack-platform → Verify your work". REWRITE-AS-CONSTRUCT (2 commands + pointer) −70 ① no ② yes ③ yes HIGH no
    I18N-C-03 C references/_index.md:15-23 "Transitive dependencies" lists data/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 (FieldTranslationSchema is label/help/placeholder/options only, translation.zod.ts:38-47; every target is addressed by name string). RETIRE-SURFACE from the gen:skill-refs closure for this entry −150 (of 221) ① yes — 5 of 7 pointers send the agent to unrelated schemas ② yes ③ n/a MED yes (generated)
    I18N-D-01 D SKILL.md:455-469 "AI-Powered Translation Suggestions" — vendor list (Phrase, Crowdin, Lokalise, Google Translate, DeepL) + "> Best Practice: Review and approve machine suggestions…". The "contract-only, no shipped adapter, no CLI" fact already appears at :451-453, :501-504, :551-552 — 4 statements of one fact (grep -n suggestTranslations → 452, 459, 502, 552). DELETE the section −147 ① no — no adapter implements it ② yes ③ n/a HIGH yes
    I18N-D-02 D SKILL.md:99-148 Three "strategies" with size heuristics. Strategy 3 (per-namespace i18n/[[locale]]/*.json) has 0 real usages: find examples packages -path '*i18n/*' -name '*.json' → 2 hits, both package.json/tsconfig.json; grep -rn localesDir in examples/packages/apps/packages/core/packages/runtime → 0. The section concedes the layout is inert (:143). REWRITE-AS-CONSTRUCT — one 3-row table −280 ① marginal ② yes ③ yes HIGH no
    I18N-D-03 D SKILL.md:143-148 ≡ :526-530 Same fact twice: "FileI18nAdapter's localesDir loads only flat top-level {locale}.json files (subdirectories are skipped)" and "localesDir loads only flat, top-level {locale}.json files … (subdirectories are skipped)". DELETE both −89 ① no ② yes ③ n/a HIGH no
    I18N-D-04 D SKILL.md:356-362 ≡ :588-606 "Retired: the o.* dialect … both doors now reject it — files included" vs "❌ The Retired o.* Shape … Both doors reject it, files included." Two sections, one rule; only the pitfall copy carries the migration map. MERGE-INTO :588-606 −87 ① no ② yes ③ the map IS the construct HIGH no
    I18N-D-05 D SKILL.md:569-585 "CRM I18n Blueprint" — a 4-row table restating the config table (:89-93), the canonical assembly (:234-244) and the naming callout (:292). Only new facts: the two example paths at :571-572. REWRITE-AS-CONSTRUCT (2 lines) −150 ① no ② yes ③ yes HIGH no
    I18N-D-06 D SKILL.md:270-274 "validationMessages was 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. REWRITE-AS-CONSTRUCT: one redirect line −45 ① partly ② yes ③ yes MED yes (retired semantics)
    I18N-D-07 D SKILL.md:608-638 vs :292,:294-297 "❌ Mismatched Object Names" restates the "Critical: … must match the snake_case names" 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"). DELETE :608-638 −151 ① no ② yes ③ the naming table IS the construct HIGH no
    I18N-E-01 E SKILL.md fence census Per packages/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-524 is the one unmarked block presenting as a complete program that would FAIL the gate: it uses II18nService at :523 with no import inside the fence (that import is a separate fence at :479-481) → TS2304. dies with C-01 — ① yes ② yes ③ n/a HIGH no
    I18N-E-02 E SKILL.md:513 kernel.use(new I18nServicePlugin({…})); not awaited. ObjectKernel.use is async use(plugin): Promise[[this]] (packages/core/src/kernel.ts:192); the platform's own call site awaits (packages/cli/src/commands/serve.ts:2889), and skills/objectstack-platform/SKILL.md:962-964 writes await kernel.use(...) 3×. dies with C-01; else add await 0 ① yes ② n/a ③ n/a HIGH no
    I18N-F-01 F SKILL.md:535-547 (gap) The highest-count real pattern has no canonical example. A generated module exports NonNullable[[TranslationData['objects']]] — an objects subtree, not a TranslationData (packages/services/service-storage/src/translations/zh-CN.objects.generated.ts:17) — so it must be wrapped: const enSource: TranslationData = { objects: enObjects }; then withSourceFallback({ objects: zhCNObjects }, enSource, undefined, zhCNGeneratedSourceHashes) (.../translations/index.ts:53-60; withSourceFallback ships from the public @objectstack/platform-objects/apps, packages/platform-objects/src/apps/translations/source-hash.ts:462), then loaded at kernel:ready via i18n.loadTranslations(locale, data) (5 call sites, e.g. packages/plugins/plugin-sharing/src/sharing-plugin.ts:505-508). The skill's loadTranslations coverage is one bullet clause (:493-495). ADD one [[os:check]] block — paid by D-01 + D-05 +180 ① yes — the extract workflow otherwise dead-ends at an unregistrable file ② n/a ③ yes HIGH no
    I18N-F-02 F SKILL.md:535-547, :549-560 Documented workflow is extract → translate → check. os i18n extract defaults 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), while os i18n check demands app/navigation/dashboard/widget/page/flow keys (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-547 names 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). ADD one clause at :546 +25 ① yes — decides whether the workflow terminates ② n/a ③ yes HIGH no
    I18N-F-03 F SKILL.md:308-362 The translation metadata item + defineTranslation occupies 570 tokens (9% of the file) with 0 real usages: grep -rn "defineTranslation(" --include=*.ts examples packages → only packages/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). RETIRE-SURFACE candidate (maintainer ruling); else compress :343-354 −250 if retired ① yes if retired ② yes ③ n/a MED yes
    I18N-F-04 F SKILL.md:546 (gap) --source-hashes gets one word in a flag list, yet stale-fill is the platform's own headline i18n hazard: scripts/check-i18n-stale-fill.mjs exists solely for it, 11 shipped bundles consume it, and the extract config warns a stale fill "publishes a superseded draft under a green check:i18n forever" (packages/services/service-storage/scripts/i18n-extract.config.ts:19-25). extract --check (:417-439) covers file freshness, a different failure. fold one clause into F-01 +0 ① yes ② n/a ③ yes MED no
    I18N-G-01 G SKILL.md:300-302 Enumeration that stopped growing. "a key naming an object, field, view, action, param, section, app, nav item, dashboard, widget or flow screen…" — _tabs is missing. validateTranslationReferences validates objects.[[o]]._tabs.[[tab]] and emits translation-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). ADD "tab, " +3 ① yes ② no ③ n/a HIGH no
    I18N-G-02 G SKILL.md:546-547 Second stale enumeration — --objects-only, the flag deciding what gets written, absent from a list of 6. See F-02. see F-02 — HIGH no
    I18N-G-03 G SKILL.md (all enumerations) 12 of 14 presented-as-exhaustive enumerations are COMPLETE against the schema/impl member set (table below). Only G-01 and G-02 are stale. no action 0 HIGH no
    I18N-G-04 G SKILL.md retired-spelling grep `grep -niE "silently ignored dropped legacy deprecated M9
    I18N-G-05 G SKILL.md:247-248 vs flagship example "prefer it over a bare : TranslationBundle literal" — 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-todo do use the factory.) repo-side; file upstream 0 HIGH no
    I18N-H-01 H evals/README.md:1-45 Zero rubrics. 45 lines / 410 tokens of "reserved for future development" (: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.md carries the same placeholder in 11 lines / 143 tokens. Nothing here can teach a grader to fail a correct answer, because nothing grades. REWRITE-AS-CONSTRUCT to the objectstack-data shape (keep the 6 candidate scenarios) −267 ① no ② yes ③ yes HIGH no
    I18N-I-01 I package-wide 6747 ratcheted tokens buy 6 distinct real authoring patterns. ~1,500 tokens (23%) sit on zero/near-zero-usage surfaces: per-namespace layout + localesDir (369), translation item (570), AI suggestions (147), hand-wired bootstrap (188), locale formatting (103), AI-suggestion bullet (30). os i18n check is taught in 6 separate sections (:33, :401-415, :554-560, :583, :640-642, :697-704). see deletions −1905 gross HIGH

    Enumeration structure check (dimension G)

    Skill span Enumerates Implementation member set Verdict
    :48-52 & :266-268 9 top-level groups besides objects translationDataShape() — 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) COMPLETE — stated twice in one file (53 tok)
    :257-264 8 object sub-keys ObjectTranslationDataSchema — label, pluralLabel, description, fields, _views, _actions, _sections, _tabs (:151-261) COMPLETE
    :260 field sub-keys FieldTranslationSchema — label, help, placeholder, options (:38-47) COMPLETE
    :261 _views sub-keys label, description, emptyState.{title,message} (:189-203) COMPLETE
    :262 _actions sub-keys actionTranslationSchema — label, description, confirmText, successMessage, params, resultDialog (:92-130) COMPLETE
    :263 / :264 _sections / _tabs label, description (:229-231) / label (:259) COMPLETE
    :89-93 3 i18n config props TranslationConfigSchema — defaultLocale, supportedLocales, fallbackLocale (:985-1000) COMPLETE
    :358-360 retired o.* sibling keys LEGACY_OBJECT_FIRST_KEYS (:277-289) + confirmMessage → confirmText alias (:126) COMPLETE
    :491-496 + :501-504 7 implemented + 3 optional = 10 II18nService (packages/spec/src/contracts/i18n-service.ts:18-146) COMPLETE partition
    :443-449 TranslationDiffItem fields key, status, objectName, locale, sourceHash, aiSuggested, aiConfidence (:1115-1136) COMPLETE
    :526-529 3 auto-registered routes /locales, /translations/:locale, /labels/:object/:locale (packages/services/service-i18n/src/i18n-service-plugin.ts:169,183,198) COMPLETE
    :406-408, :415 os i18n check flags json, default-locale, locales, strict, threshold, show-keys (packages/cli/src/commands/i18n/check.ts:37-56) COMPLETE
    :413-415 coverage surfaces walked 14 buckets in COVERAGE_SOURCE (packages/cli/src/utils/i18n-coverage.ts:190-220); _tabs walked under the view kind (packages/cli/src/utils/i18n-extract.ts:645-656) COMPLETE (hedged)
    :300-302 lint unknown-target surfaces also walks objects.[[o]]._tabs.[[tab]] (packages/lint/src/validate-translation-references.ts:874-887) STALE — _tabs missing (G-01)
    :546-547 os i18n extract flags 12 flags (packages/cli/src/commands/i18n/extract.ts:65-114) STALE — --objects-only (default true) missing (F-02)

    Incidental falsehoods

    None. Two hazards short of falsehood, both recorded above:

    1. SKILL.md:513 — kernel.use(...) un-awaited while ObjectKernel.use is async (packages/core/src/kernel.ts:192); platform's own call site and the sibling skill both await (E-02).
    2. SKILL.md:535-560 — the extract→check workflow cannot converge (--objects-only default vs check's app/dashboard/page/flow demand). Every sentence true; the sequence is not runnable as written (F-02).

    Reducible total

    tokens
    SKILL.md deletions (A-01 subsumed in B-04) −1905
    SKILL.md additions (A-02 +12, F-01 +180, F-02 +25, G-01 +3) +220
    SKILL.md net −1685 of 6337 = 26.6%
    evals/README.md (H-01) −267 of 410 = 65%
    references/_index.md (C-03, generator-owned) −150 of 549 = 27%
    Package net −2102 of 7296 = 28.8%

    Verdict: DIET (10–30%, at the top of the band).


    Generated by Claude Code

  5. os-litant commented on Sep 2, 2026

    @os-litant
    ContributorAuthor

    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

  6. os-litant commented on Sep 2, 2026

    @os-litant
    ContributorAuthor

    ACCEPT — PR #14574 @ bc84ff2b, verified against GitHub, not the report.
    Session: session_01LraLgQVGq8egUwfYZpbYt1 · seat review in-seat at CONTRACT_REVIEW_TIER (served model read claude-fable-5-1).

    Contract review — PASS, verified at source (merge base 53d36892):

    • Registration: os serve auto-registers I18nServicePlugin when the config carries translations / i18n (packages/cli/src/commands/serve.ts:2850-2896, awaited — the un-awaited kernel.use in the deleted block was hazard 1); localesDir exists only on FileI18nAdapter's options (file-i18n-adapter.ts:15, :137) and serve never passes it; the three routes are the route ledger's (i18n-route-ledger.ts:96-99).
    • Lint: 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.
    • The translation item: TranslationItemSchema (translation.zod.ts:1326), defineTranslation (:1368), locale required (: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).
    • Extract / check divergence (hazard 2): objects-only is default: true, allowNo: true (extract.ts), COVERAGE_SOURCE also demands app, navigation, dashboard, widget, page, flow (i18n-coverage.ts:192-220); os lint --i18n-strict exists (lint.ts:486, :591).
    • The generated-bundle block: defineTranslationBundle (translation.zod.ts:1226), TranslationData (:1211), withSourceFallback(translated, source, recorded, filledFrom?) with recorded judging hand-authored sections and filledFrom the generated ones (source-hash.ts:455-475 and its docblock) — the block's comment is exactly that; NonNullable<TranslationData['objects']> is the generated module's export (en.objects.generated.ts:17); i18n.loadTranslations at kernel:ready in the approvals / audit / security / platform-objects plugins. Left unmarked for check:skill-examples for the stated reason (the surface resolves @objectstack/spec only); the dev's throwaway driver typechecked it against the real exports.
    • Examples: examples/app-crm/src/translations/crm.translation.ts (bundled) and examples/app-todo/src/translations/{en,zh-CN,ja-JP}.ts + index.ts (per-locale) exist. The platform anchor ## Runtime Boot Sequence with the I18nServicePlugin boot-tree line is present on origin/main (:426, :443) and on the platform flight's branch (:395, :412) — cited by section, survives either landing order.
    • Recorded exception, not a FAIL of this flight: the compressed D-06 blockquote ("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, plus bulkActions and datasets); its correction is owned by Published skill objectstack-i18n teaches 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 skill objectstack-i18n teaches 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.md deleted, 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-authoring caught a bare metadata literal in the new block and the final commit authors it through defineTranslationBundle — recorded, not hidden.

    CI at bc84ff2b: green — Lint & Repo Gates success (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-review stripped 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 by Fixes; the seat strips pm:dispatched and dispatches #14377.


    Generated by Claude Code

  7. claude commented on Sep 2, 2026

    @claude
    Contributor

    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.

    • session: 01489YWhZEoHT9oXshiyywQy
    • working branch: patch/14574-sync (worktree objectstack-14574-sync), pushed to claude/issue-14315-skills-i18n-optimization
    • old head bc84ff2b to new head c20ae51e3 (fast-forward, bc84ff2be..c20ae51e3)
    • merge commit 2871d4fd7 (git merge origin/main, origin/main 7085f9053); regeneration commit c20ae51e3

    Conflict 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 -c "merge.os-regen.driver=git merge-file -L %L -L base -L theirs %A %O %B" \
      merge-tree --write-tree --name-only \
      origin/claude/issue-14315-skills-i18n-optimization origin/main
    EXIT 1 · merge-base 53d368921 · CONFLICT in exactly:
        content/docs/ai/skills-reference.mdx
        scripts/check-skills-token-ratchet.mjs
        skills/README.md
    

    git check-attr merge on all three: unspecified — none is routed merge=os-regen, as recorded. The real merge produced the same three UU paths 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:

    pnpm --filter @objectstack/spec gen:skill-docs        EXIT 0
    pnpm --filter @objectstack/spec check:skill-docs      EXIT 0  "Skill docs in sync"
    pnpm --filter @objectstack/spec gen:skill-docs (2nd)  EXIT 0, git status clean on both paths
    

    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 (53d368921 vs bc84ff2b):

    file changed lines verdict
    skills/README.md 2 delta IDENTICAL to the PR's own authored change
    content/docs/ai/skills-reference.mdx 6 delta IDENTICAL to the PR's own authored change

    So this package's rows read exactly as the PR authored them, and every sibling flight's row reads exactly as origin/main has it — including rows main moved under us that did not exist at the old merge base (the Automation jobs / webhooks description, 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 the objectstack-api evals row, this PR drops the objectstack-i18n one. Both applied, nothing else. Resolved file diffed against origin/main's copy:

    @@ -442,7 +442,6 @@ export const CEILINGS = new Map([
       // the remaining skills' eval notes
       ['skills/objectstack-ai/evals/README.md', 315],
    -  ['skills/objectstack-i18n/evals/README.md', 411],
     ]);
    

    That is the whole difference against origin/main: one row removal, this PR's own. No ceiling value changed; no row re-added; main's objectstack-api deletion preserved.

    node scripts/check-skills-token-ratchet.mjs   EXIT 0
      skills/objectstack-i18n/SKILL.md is 4678 tokens (ceiling 6338; headroom 1660)
      35 authored bundle file(s) within their ceilings
      no row and no red for the deleted skills/objectstack-i18n/evals/README.md
    node scripts/check-skills-token-ratchet.mjs --self-test   EXIT 0 (64 cases)
    

    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 -l over test files: no hits); its two in-repo consumers, check:ratchet-remedy-authority and scripts/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:

    BEFORE (base 53d368921)                        AFTER (base 7085f9053)
     content/docs/ai/skills-reference.mdx    | 6 +-   content/docs/ai/skills-reference.mdx    | 6 +-
     scripts/check-skills-token-ratchet.mjs  | 1 -    scripts/check-skills-token-ratchet.mjs  | 1 -
     skills/README.md                        | 2 +-   skills/README.md                        | 2 +-
     skills/objectstack-i18n/SKILL.md        | 389 +   skills/objectstack-i18n/SKILL.md        | 389 +
     skills/objectstack-i18n/evals/README.md | 45 -    skills/objectstack-i18n/evals/README.md | 45 -
     5 files changed, 87 insertions(+), 356 deletions(-)      (identical)
    

    GitHub agrees on the new head: changed_files: 5, additions: 87, deletions: 356.

    • skills/objectstack-i18n/SKILL.md blob 519130b15a63dc375e06d18dbb0e0dd192cd2002 at bc84ff2b and at c20ae51e3 — 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.md still absent, its deletion commit d0dbe12cd intact; the directory does not exist on the merged tree.

    Anchor survival (I18N-C-01)

    ## Runtime Boot Sequence is present in skills/objectstack-platform/SKILL.md on the merged tree at line 426, with the boot-tree line naming I18nServicePlugin at line 443 under it. PR #14351 has not landed — the newest commit touching that file on origin/main is e4916fc4b (#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 c20ae51e3

    Every exit code captured by redirecting first and reading it before any pipe (cmd > log 2>&1; EXIT=$?), never through a pipeline.

    Card-named:

    gate exit
    pnpm --filter @objectstack/spec check:skill-examples 0 — 259 prose examples type-check across 3 surfaces
    pnpm check:skill-compatibility 0 — 11 SKILL.md reconciled against 79 workspace packages
    pnpm check:skill-identifier-liveness 0 — 482 citations over 45 published files, 8 exhaustive sections
    pnpm check:doc-authoring 0 — 392 files clean, 45 published skill files clean
    pnpm check:published-readme-links 0 — 176 links across 60 published files

    check:skill-examples needed no PREREQUISITE retry this round: the @objectstack/spec and @objectstack/client-react closures 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", VERDICT command-exit 0 · held the lock 309s · waited 3s.

    check:docs likewise did not demand gen:schema this round: the rebuild refreshed the gitignored json-schema tree, so it passed first try and produced zero tracked drift (git status --porcelain empty after the entire union).

    Derived union: node scripts/pm/dispatch-gates.mjs --repo objectstack-ai/objectstack EXIT 0, header derived from the tree of 'objectstack-ai/objectstack' at commit c20ae51e3, repo assertion holds, change set 5 paths vs merge base 7085f9053 (committed 5, working tree 0, untracked 0). It reconciles to 45 families — the same 45 the PR body recorded at bc84ff2b, so the merge moved no family in or out. Harvested with --commands rather than by grepping the prose block, and all 45 were run on c20ae51e3:

    • 44 EXIT 0
    • 1 EXIT 3 — 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-bytes EXIT 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:

    git -c "merge.os-regen.driver=..." merge-tree --write-tree --name-only HEAD origin/main
    EXIT 0, tree 0a51d0f1e0a060d07f50dc6ea3b429c5e55aab6f, no conflicts
    

    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 — the dirty state is gone, and blocked is the expected resting state for a governed-surface PR whose pinned approval expired with the new head.

    Deviations, and state I did not set

    • None on method. Every step followed the adjudicated procedure; no gate was skipped, narrowed or waived.
    • One command in the batch of 45 exceeded the container's roughly 10-minute foreground cap (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: false is 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.
    • The maintainer's approval pinned to bc84ff2b is 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

  8. os-support-ai commented on Sep 2, 2026

    @os-support-ai
    Collaborator

    Merge-sync round accepted — PR #14574 conflict cleared at head c20ae51e3; re-review requested

    Director seat (maintainer-summoned, session session_01489YWhZEoHT9oXshiyywQy). Verified against GitHub, not the report: head c20ae51e3, base 7085f9053, PR diff unchanged at 5 files / +87 −356; skills/objectstack-i18n/SKILL.md blob identical to the pre-round head and the evals/README.md deletion intact. Both generated catalog files regenerated by gen:skill-docs on the committed merge (second run a byte-level no-op); scripts/check-skills-token-ratchet.mjs text-resolved to carry BOTH sides' row deletions with no ceiling value changed — exactly one line of difference against origin/main. 45 derived families: 44 green, 1 NOT MEASURED (check-test-completeness, exit 3 by design). Anchor ## Runtime Boot Sequence resolves on the merged tree.

    Forward look, measured locally with the os-regen driver neutralised: this head three-way-merges clean against origin/main at a5b95ee6e (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 bc84ff2b and has expired with this push, as governed-surface rules require; re-review requested from os-zhuang (hotlong already requested). No enqueue until an approval is pinned to c20ae51e3.


    Generated by Claude Code

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions