Uh oh!
There was an error while loading. Please reload this page.
skills(i18n): optimization flight — drop the restated overview, the zero-usage layout and plugin bootstrap and the duplicate template; teach the generated-bundle shape and the --objects-only divergence (net −2,069 tokens) - #14574
Merged
Conversation
…ts (I18N-B-03, I18N-B-04, I18N-A-01, I18N-B-01) - I18N-B-03: the opening paragraph restated the frontmatter description the agent already holds when the skill loads. - I18N-B-04: "When to Use This Skill" restated the description in seven bullets; one of them pointed at a contract-only surface with no implementation, and one was I18N-A-01. - I18N-A-01: the locale-formatting trigger (dates, numbers, currency) routed agents here for work this package teaches nowhere — a whole-file grep for currency/timezone/format/Intl. matched only those five lines. The currency fallback is carried by objectstack-data's field-types rules and objectstack-ui; the localization endpoint is API surface. - I18N-B-01: "Core Concepts / Translation Architecture Overview" was a table of contents — each of its four items is restated in full by a later section (object sub-keys, bundle authoring, coverage, runtime authoring). Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01LraLgQVGq8egUwfYZpbYt1
…below the object constructs (I18N-D-02, I18N-D-03, I18N-B-05) - I18N-D-02: three prose "strategies" with ASCII trees and size heuristics became one three-row table. The per-namespace layout has zero real usages in the repo (a search for an i18n/<locale>/*.json tree finds only package.json/tsconfig.json), and the section already conceded the layout is inert — the import graph, not the platform, assembles it. - I18N-D-03: the FileI18nAdapter localesDir flat-file rule was stated twice, here and again under Plugin Setup. Both go: localesDir has zero real usages and os serve never passes it (see I18N-C-01). The surviving row states the operative fact — your own imports assemble the tree. - I18N-B-05: the layout prose sat between the config table and the object sub-key table, so ~380 tokens of authoring convention stood in front of the most decision-changing construct in the file. The order is now config → canonical bundle → object sub-keys → naming → layout. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01LraLgQVGq8egUwfYZpbYt1
…ing paragraph (I18N-F-03, I18N-D-04) - I18N-F-03: the `translation` metadata item held 570 tokens (9% of the file) including a full worked example, for a surface with zero measured usage — a search for defineTranslation( across examples and packages returns only the schema's own docstring and definition. It is a live surface, so the last mention stays: one paragraph carrying the three rules that differ from a file bundle (locale required, one locale per item, layers over the shipped bundle) and a pointer to TranslationItemSchema. - I18N-D-04: the retired `o.*` dialect was stated twice — here and under Common Pitfalls. Only the pitfall copy carries the migration map for the sibling keys, so that is the copy that survives. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01LraLgQVGq8egUwfYZpbYt1
…act (I18N-C-01, I18N-E-01, I18N-E-02)
- I18N-C-01: the section taught new ObjectKernel() + kernel.use(new
I18nServicePlugin({localesDir, registerRoutes, basePath})) + bootstrap.
os serve auto-registers I18nServicePlugin whenever the config carries
translations or i18n, and passes only defaultLocale/fallbackLocale — never
localesDir. Zero apps in this repo hand-wire it. Kernel bootstrap is
objectstack-platform's domain, whose Runtime Boot Sequence section already
carries the same fact; this file keeps one sentence plus the three routes.
- I18N-E-01: that block was the one unmarked fence presenting as a complete
program that would fail the example gate — it used II18nService with the
import in a different fence (TS2304). It dies with the section.
- I18N-E-02: the same block called kernel.use(...) un-awaited while
ObjectKernel.use is `async use(plugin: Plugin): Promise<this>`
(packages/core/src/kernel.ts:192) and the platform's own call site awaits
it. It dies with the section rather than being patched.
- I18N-D-03 (second half): the duplicate localesDir flat-file note goes with
it.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LraLgQVGq8egUwfYZpbYt1…I18N-D-01, I18N-D-05, I18N-D-07) - I18N-D-01: "AI-Powered Translation Suggestions" was a vendor list plus a best-practice aside for a contract method no shipped adapter implements and no CLI reaches. The same "contract-only" fact is already stated by the Diff & Coverage Schemas paragraph and again by the service-contract section. - I18N-D-05: the "CRM I18n Blueprint" table restated the config table, the canonical assembly and the naming callout. The only facts it alone carried were the two example paths, which is what remains. - I18N-D-07: "Mismatched Object Names" restated the Critical callout under Naming Conventions, and "Hardcoded Option Values" restated the option-value paragraph there — which is the stronger statement, because it names the failure (both the display label and a hyphenated spelling parse, ship, and resolve to nothing). Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01LraLgQVGq8egUwfYZpbYt1
…ng lint surface (I18N-B-02, I18N-C-02, I18N-G-01, I18N-D-06) - I18N-B-02: "Quick-Start Template" was a strict subset of the canonical example under Authoring Translation Bundles — same object, same sub-keys, same apps/messages — and its own preamble said so. Two checked example blocks were paying to teach one shape. - I18N-C-02: "Verify your work" restated objectstack-platform's own section and then pointed at it. Two commands and the pointer remain. - I18N-G-01: the lint unknown-target enumeration presented as exhaustive but omitted tabs. validateTranslationReferences walks objects.<o>._tabs.<tab> and reports translation-target-unknown for it, and this file's own object sub-key table already lists _tabs. - I18N-D-06: the validationMessages note narrated why the key was removed. The removal changes no decision the reader can act on; where to author the message does. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01LraLgQVGq8egUwfYZpbYt1
…orkflow converge (I18N-F-01, I18N-F-02, I18N-F-04, I18N-G-02) - I18N-F-01: the highest-count real pattern had no canonical example. Eight packages ship their own generated bundle (36 *.objects.generated.ts across four locales, 11 withSourceFallback call sites, 5 kernel:ready loadTranslations sites) and the generated module exports an objects subtree rather than a TranslationData, so a reader following the extract workflow dead-ended at a file that cannot be registered. The block shows the wrap, the bundle, and the kernel:ready alternative for a plugin. - I18N-F-04: --source-hashes had one word in a flag list although stale fill is the platform's own headline i18n hazard. Its purpose is now stated where the argument is passed: without the companion a leaf whose source moved goes on serving the superseded fill under a green os i18n check. - I18N-F-02 / I18N-G-02: the documented extract-translate-check workflow could not converge. os i18n extract defaults to --objects-only (default: true, allowNo: true) so it writes only objects/globalActions, while os i18n check's COVERAGE_SOURCE also demands app, navigation, dashboard, widget, page and flow. The flag was missing from a six-flag enumeration presented as the remainder; it is named now, with the divergence and the way out. The block is deliberately NOT marked for check:skill-examples: that gate's skills surface resolves @objectstack/spec only, and the real shape needs withSourceFallback from @objectstack/platform-objects. Marking it would fail on correct code. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01LraLgQVGq8egUwfYZpbYt1
…teaches (I18N-A-02) The description triggered on adding *.translation.ts files, wiring a locale and resolving missing-translation warnings. It did not name the `translation` metadata item — nor, after this flight, the package-ships-its-own-generated- bundle shape, which is the highest-count real pattern in the repo and the one construct this flight added. Both are now trigger phrases, so an agent facing either task can load the package at all. "per-locale source layout" became "source layout": the file no longer privileges one of the three. skills/README.md and content/docs/ai/skills-reference.mdx are generator output (`pnpm --filter @objectstack/spec gen:skill-docs`), regenerated because check:skill-docs demanded it; both files carry only the derived description. No prose in skills/README.md was hand-edited — the I18N-A-03 routing bullet is a follow-up recorded in the PR body. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01LraLgQVGq8egUwfYZpbYt1
…ng down (I18N-H-01) Maintainer ruling on #14296 (decision batch 1), reply `1A 2A 3A 4A`. Item 2 option A, verbatim from the card: 「删除存根(整包约 −2,200 tokens),保留真实 fixture(ui 的 analytics json、automation 的 approvals md);formula 不新建。」 and 「裁后执行:各飞行内删除存根,棘轮上限随之下调」. skills/objectstack-i18n/evals/README.md was 45 lines / 410 tokens shipped into every customer session: an ASCII tree naming six eval files that do not exist (the package has three files in total), plus Format / Status / Contributing process prose about evals that do not exist. Zero rubrics — nothing in it can grade anything. It is the stub the ruling names. The only change to scripts/check-skills-token-ratchet.mjs is dropping the deleted file's ceiling row; nothing else in that script is touched, and the expanding-remedy authority sweep (check-ratchet-remedy-authority) stays green. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01LraLgQVGq8egUwfYZpbYt1
…ills-i18n-optimization # Conflicts: # content/docs/ai/skills-reference.mdx # skills/README.md
…t only) `pnpm --filter @objectstack/spec gen:skill-docs` re-derived from all 11 SKILL.md files after merging origin/main. The merge conflicted in both generated artifacts because sibling flights changed them on main; main's side was taken and the generator re-derived on top, which is the only safe order for a generated file — resolving one textually would have kept whichever side the driver happened to pick. Asserted after regeneration: every sibling package's row is byte-identical to origin/main's, and both files still carry all 17 rows. The staged diff is this card's i18n description and nothing else. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01LraLgQVGq8egUwfYZpbYt1
…lationBundle (I18N-F-01 follow-up, I18N-G-05) check:doc-authoring (#2035, ADR-0059) refused the block: it exported a bare `: TranslationBundle` literal, which is the one pattern that rule exists to keep out of the published catalog. The file's own canonical example already says to prefer the factory over a bare literal, so the block contradicted its own package — the inconsistency audit finding I18N-G-05 recorded from the other side (the flagship shipped example does the discouraged thing). The factory takes the wrapped values unchanged, so the shape the block teaches is the same one; only the authoring form is now the one the skill prescribes. Re-driven against the real exports before and after (throwaway driver in packages/services/service-storage typechecking the exact block against @objectstack/spec + @objectstack/platform-objects, tsc --noEmit exit 0, deleted in the same step with a clean tree). Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01LraLgQVGq8egUwfYZpbYt1
os-zhuang
approved these changes
Sep 2, 2026
os-zhuang
marked this pull request as ready for review
September 2, 2026 14:05
Sibling skills flights landed on main and conflicted in three files: - skills/README.md and content/docs/ai/skills-reference.mdx (generated catalog artifacts, not routed merge=os-regen): main's side taken here to clear the markers; regenerated wholesale in the following commit, per the procedure this branch's earlier main-merge already followed. - scripts/check-skills-token-ratchet.mjs: both sides' deletions applied — main dropped the objectstack-api evals row, this branch drops the objectstack-i18n one. No ceiling value changed, no row re-added. skills/objectstack-i18n is byte-identical to the pre-merge head. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01489YWhZEoHT9oXshiyywQy
gen:skill-docs run on the committed merge, never in MERGE state. The regenerated artifacts differ from origin/main by exactly this package's own rows — the delta is line-for-line identical to the one this branch authored before the merge — so every sibling flight's row survives as origin/main has it. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01489YWhZEoHT9oXshiyywQy
os-zhuang
approved these changes
Sep 2, 2026
Uh oh!
There was an error while loading. Please reload this page.
os-litant pushed a commit
that referenced
this pull request
Sep 2, 2026
`objects.OBJECT._validations.RULE.message` is object-scoped and resolved on the write path by the ObjectQL rule evaluator through the existing i18n service, so the blockquote teaching that validation messages are not a translation group is false on main. Correct it and the two neighbouring inventories it sits in: `_views.VIEW.bulkActions` on the object sub-key table and `datasets` in the top-level group list, plus the validation-rule target `os validate` / `os lint` already report but the list omitted. A correction, not an expansion: the retired-key blockquote's substance moves into the `_validations` row it belongs in, which pays the three additions in the same file. Net +7 tokens (4678 to 4685), 3 lines shorter; ceiling unchanged and the headroom left un-re-locked by #14574 is not spent. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01LraLgQVGq8egUwfYZpbYt1
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for freeto join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Fixes#14315
Skills catalog optimization program #14292, maintainer mandate 2026-09-02: 「审核所有的 skills,进行全面的优化。」 Audit record posted verbatim on the card. Governed surface — this PR stays draft and awaits the maintainer's own merge.
Transliteration key. The GitHub body sanitizer eats angle-bracket-shaped fragments, so every one below is rewritten.
[[X]]reads as "angle-bracketedX":[[os:check]]= the opt-in fence marker (an HTML comment whose text isos:check);[[locale]],[[o]],[[tab]],[[obj]],[[field]]= angle-bracketed placeholders;NonNullable[[TranslationData['objects']]]=NonNullableapplied toTranslationData['objects'];Promise[[this]]=Promiseofthis.Landing form — why
Fixesand notPart ofThe claim comment specified
Part of #14315, for one stated reason: the deferred eval stub kept the card open. That reason is void. The maintainer ruled #142961A 2A 3A 4A, item 2 option A, which moved the stub from deferred to delivered — it is deleted in this PR (I18N-H-01 below). Every remaining DEFER item now has its own tracked home:_index.mdpointers)skills/README.md)Nothing is left on the card, so it closes on merge. That is also the state #14377 is waiting for — it carries
Blocked-by: #14315and becomes actionable once this lands. If the seat prefers the card kept open, this is a one-word edit before merge.Per-item landing table
落点= where it landed. Line numbers are the audit's (base93940d49, byte-identical to the audit refa59f78dfor this package — verified,git diff --stat a59f78d origin/main -- skills/objectstack-i18nempty).SKILL.md:19-25:28-41:35-39Intl.matched only those 5 lines, so the trigger routed agents here for work the package teaches nowhere:44-66:99-148:143-148and:526-530localesDirflat-file rule, stated twicelocalesDirhas zero real usages andos servenever passes it:308-362translationmetadata item, 570 tokens incl. a full worked example, 0 measured usages:356-362o.*dialect, stated twice:506-530new ObjectKernel()+kernel.use(new I18nServicePlugin({localesDir, registerRoutes, basePath}))+ bootstrap:508-524II18nServicewith the import in a different fence, TS2304):513kernel.use(...)un-awaited (hazard 1):455-469:569-585:608-638:646-688:690-704:270-274validationMessagesremoval narrated with its history:300-302_tabsmissingobjects.[[o]]._tabs.[[tab]]and reportstranslation-target-unknown:535-560,:546-547--objects-onlyabsent from a 6-flag list:535-547gapwithSourceFallback, register or load atkernel:ready:546gap--source-hasheshad one word in a flag listdescriptiontranslationmetadata item and on shipping a generated bundle:247-248vs the new blockdefineTranslationBundle, so it no longer contradicts the file's own advice — see the gate note belowevals/README.mdevals/README.md:13-24The two hazards
kernel.useis async.packages/core/src/kernel.ts:192at this base readsasync use(plugin: Plugin): Promise[[this]], andos serve's own call site awaits it (packages/cli/src/commands/serve.ts:2896). The skill's block did not. Fixed by deletion, not by addingawait— the whole block was teaching a path nothing runs.os i18n extract's--objects-onlyis declareddefault: true, allowNo: true(packages/cli/src/commands/i18n/extract.ts:89-93), so extract writes onlyobjects/globalActions;COVERAGE_SOURCEinpackages/cli/src/utils/i18n-coverage.ts:192-220also demandsapp,navigation,dashboard,widget,pageandflow. Following the skill ended in coverage gaps the extract never scaffolded. Now stated, with--no-objects-onlyas the way out.Anchor (I18N-C-01), cited by section
Plugin wiring /
os serveauto-registration belongs to objectstack-platform →## Runtime Boot Sequence, which carries the boot-tree line namingI18nServicePlugin. Verified by content on bothorigin/mainandorigin/claude/issue-14299-skills-platform-optimization(PR #14351, approved and may land first) — the section heading and the line are present on both, so the pointer survives whichever lands first. Cited by section, never by line number. Field and view labels stay in this package.Why the generated-bundle block is NOT marked
[[os:check]]check:skill-examplescompiles marked fences per surface, and theskills + docssurface is declaredresolutionDir: SPEC_DIR, selfPackages: [SPEC_DIR](packages/spec/scripts/check-skill-examples.ts,SURFACES) — it resolves@objectstack/specand nothing else.@objectstack/specdoes not depend on@objectstack/platform-objects(checked: not in itsdependencies, nopackages/spec/node_modules/@objectstacklink), and the real shape needswithSourceFallbackfrom@objectstack/platform-objects/apps. Marking the block would red it withTS2307on correct code, so it is left unmarked and this paragraph is the reason.It is verified anyway. A throwaway driver in
packages/services/service-storagereproduced the block verbatim against the real exports and typechecked clean (tsc --noEmit, exit 0), twice — once for the original shape and again after the factory change below. Deleted in the same step both times;git statusclean, confirmed by observing the files gone rather than by reading an exit code.Symbols verified at source:
withSourceFallback(packages/platform-objects/src/apps/translations/source-hash.ts:462, public via theappsbarrel), the 4-argument order(translated, source, recorded, filledFrom), the generated module'sNonNullable[[TranslationData['objects']]]export, andi18n.loadTranslationsatkernel:ready(5 plugin call sites).Token accounting — measured, not smoothed
Per the maintainer's 2026-08-21 ruling on published skills (「对外发布的 skills 是整个平台的最大价值,尤其要整体考虑和评估。」「……不能为了一个小功能扩写很多。」), both readings:
The edited file, whole-file:
skills/objectstack-i18n/SKILL.mdskills/objectstack-i18n/evals/README.mdThe whole published package: 7296 → 5227 tokens shipped (−2069, −28.4%). Ratcheted total 6747 → 4678 (−2069, −30.7%). No ceiling was raised; no new file was added.
Per commit, against the audit's own estimates. Gaps are itemised per cluster, not netted away:
7164f69e1da918fbc97dafddff489c1884a1928d74dd2f7036c7a16c4de6130ebc84ff2bd0dbe12cNotes on the three gaps that are not rounding:
36c7a16c, +218 over. The audit costed F-01 at +180 for one block and F-04 at +0 ("fold one clause into F-01"). The block as written also carries the--objects-onlydivergence paragraph (audit: +25; actual closer to +70, because naming the six diverging key groups is what makes it actionable) and the--source-hashesrationale inline. I did not trim it to hit the number: it is the package's highest-count real pattern and its only convergence hazard. Flagging it rather than smoothing it.1da918fb+ff489c18, +180 under (combined est −519, measured −339). Both are REWRITE-AS-CONSTRUCT items the audit costed as if only one line survived. The layout table keeps three rows and a lead sentence; the registration paragraph keeps the three route paths and the platform pointer. Both are smaller than a one-line estimate implies, and I judged the surviving content load-bearing.c97dafdd, −58 more than estimated. F-03's compression removed the whole worked example, not just:343-354.On the dispatch's target of ≈ −1,418 on SKILL.md. That figure was the audit's −1,685 minus the deferred −267, but those are two different files: the audit's "Reducible total" gives −1,685 as
SKILL.md's own net and −267 asevals/README.md's. The subtraction crossed files. Measured against the audit's actual per-file rows: SKILL.md −1,659 vs −1,685 estimated, and evals −410 vs −267 estimated (larger because the 1A 2A 3A 4A ruling deletes the stub where the audit had costed a rewrite).Collision recorded and deliberately left alone: the object sub-key inventory, owned by #14377
While verifying premises at this base I measured that #14253 has landed, and it changes what is true in this file:
ObjectTranslationDataSchema(packages/spec/src/system/translation.zod.ts:169) now declares a ninth object sub-key,_validations—objects.[[obj]]._validations.[[rule]].message, with a reader on the write path.packages/lint/src/validate-translation-references.ts:918-929walks it.objects.[[obj]]._views.[[view]].bulkActions.*and a top-leveldatasetsgroup.Consequences for this file, stated and left alone:
D-06blockquote is false today — validation rule messages are translatable now. My edit compressed that blockquote per the card's D-06 ruling and left its truth state exactly as it was. It did not pre-emptively repair it.a59f78d, before i18n: three authored display surfaces have no bundle key at all (bulk-action defs, custom validation messages, dataset labels) #14253. At93940d49it is not.Why none of that is repaired here. The correction is owned by #14377, which instructs twice and explicitly (quoted verbatim, its emphasis):
That card carries
Blocked-by: #14315, and its triage ordering is "#14315 first, this correction second". Following the instruction is why the stale inventory ships one more round; recording the measurement here is so the next seat inherits it rather than re-deriving it.premise_false
_validations,bulkActions,datasets). Recorded above; not acted on, per Published skillobjectstack-i18nteaches that validation messages are not a translation group — false once #14253 lands #14377.Every other finding's premise held. Nothing was forced.
Follow-ups (not in this PR)
skills/README.md— I18N-A-03: the cross-skill routing list has no labels-vs-bundles decision point, so an agent authoringlabel/pluralLabelin*.object.tsor*.view.tsnever learns this package exists (objectstack-uicontains zero occurrences of "translat"). Recorded here as the card ruled, and tracked as [finding] Nothing routes an agent authoring object/field/view labels toobjectstack-i18n— the cross-skill routing list inskills/README.mdhas no labels-vs-bundles decision point #14566.packages/spec— I18N-C-03: the generatedreferences/_index.mdroutes 5 of 7 transitive pointers at schemas unreachable from a translation bundle. Tracked as [finding] Theobjectstack-i18nreference index routes 5 of its 7 transitive pointers at schemas unreachable from a translation bundle — the closure step inbuild-skill-references.ts#14565; sibling of [finding] Theobjectstack-aigenerated reference index advertises 6 schemas the SKILL.md never teaches and omits the one it names —SKILL_MAPinbuild-skill-references.tsis unreconciled with the body #14462 and [finding] Theobjectstack-automationreference index routes to the ADR-0020-retiredstate-machine.zod.tsand omits both per-nodeconfigschemas —SKILL_MAPinbuild-skill-references.ts#14466, same generator, adjacent defect (those areSKILL_MAP, this is the closure step).skills/objectstack-i18n— the Published skillobjectstack-i18nteaches that validation messages are not a translation group — false once #14253 lands #14377 correction described above.Gates
Head sha
bc84ff2b— the tree every reading below was taken from, and the tree pushed to this branch.Card-named gates, exit codes captured before any pipe:
node scripts/check-skills-token-ratchet.mjspnpm --filter @objectstack/spec check:skill-examplespnpm check:skill-compatibilitypnpm check:skill-identifier-livenesspnpm --filter @objectstack/spec check:skill-docscheck:skill-identifier-livenesswas also checked before the first deletion: itsBINDINGStable registers 8 exhaustive sections across 7 files, and none is inskills/objectstack-i18n(zero occurrences ofi18nin the script), so no registered binding could be broken by a deletion here.The full re-derived union was run, not just the card-named list.
node scripts/pm/dispatch-gates.mjs --repo objectstack-ai/objectstack --commandswas re-derived after the doc regeneration and after mergingorigin/main— the first derivation printed a STALE TREE warning naming 148 changed files, which is exactly the "well-formed answer about a tree nobody is on" failure, so it was re-run from a fresh tree. It prints 45 commands; all 45 were run onbc84ff2b.Two results that are not green and are not red either:
node scripts/check-test-completeness.mjs— exit 3, NOT MEASURED. The gate says so itself: "Nothing was measured … ⛔ It is NOT a finding". Reported as unmeasured, not as a pass.pnpm --filter @objectstack/spec check:skill-examples— first run exit 1 with PREREQUISITE NOT MET:packages/spec/dist/**/*.d.tsolder thanpackages/spec/src, because mergingorigin/mainmoved spec's sources under an earlier build. Rebuilt the@objectstack/spec+@objectstack/client-reactclosures and re-ran onbc84ff2b: exit 0, "259 prose examples type-check across 3 surface(s) — every marked block parsed, so tsc ran the SEMANTIC pass on all of them". Reported as green only from the run that actually read fresh declarations.pnpm --filter @objectstack/spec check:docs— first run exit 1 with PREREQUISITE NOT MET (packages/spec/json-schemais a gitignored build artifact older thansrc). Satisfied it withgen:schema— run after the merge was committed, never in MERGE state — which left zero tracked drift, then re-ran: exit 0.One gate caught a real defect in this PR's own addition, which is recorded rather than quietly fixed:
pnpm check:doc-authoringwent red on the new block,#2035/ ADR-0059, "Bare metadata-literal authoring found in docs/skills" — the block exported a bare: TranslationBundleliteral, the one pattern that rule keeps out of the published catalog, and the same inconsistency the audit recorded from the other side as I18N-G-05. Commitbc84ff2breauthors it throughdefineTranslationBundle; the gate is exit 0 on the final head, and the block was re-driven against the real exports after the change.The merge of
origin/mainconflicted in both generated artifacts because sibling flights changed them.scripts/pm/os-regen-merge.shcorrectly refused them (they are notos-regendriver paths), so the documented order was followed by hand: take main's side, commit the merge first, then regenerate withgen:skill-docs, then commit the regeneration separately. Asserted afterwards: every sibling package's row is byte-identical toorigin/main's and both artifacts still carry all 17 rows — the staged diff is this card's description change and nothing else.Labels
skip-changeset— this PR releases nothing. Checked againstscripts/check-empty-changeset.mjs's own enumeration ("It releases nothing (.github/, .claude/, skills/, docs/, content/, examples/, tests-only, and the like)"): the five changed paths are three underskills/, one undercontent/, and one CI-internal gate script underscripts/that publishes from no package.needs:contract-reviewon this PR and on the card — the generated-bundle block, the--objects-onlyextract semantics and the un-awaitedkernel.usehazard are contract claims.🤖 Generated with Claude Code
https://claude.ai/code/session_01LraLgQVGq8egUwfYZpbYt1
Generated by Claude Code