Skip to content

docs(skills): objectstack-i18n teaches the books translation group, with an eval for a two-language doc book - #27024

Merged
objectstack-fleet[bot] merged 1 commit into
mainfrom
claude/project-thread-9ngvro
Oct 28, 2026
Merged

objectstack-fleet[bot] merged 1 commit into
mainfrom
claude/project-thread-9ngvro

Conversation

@objectstack-fleet

Copy link
Copy Markdown
Contributor

Requested by Steve · project thread

Fixes #26820

Clause-②: no
Metadata-protocol: none

维护者速读

  • 改了什么:objectstack-i18n 技能的顶层分组清单补上 books(文档手册的书名、简介和各章节标题按读者语言显示),给出键的拼法;评测文件新增第 9 题(双语手册),并删去 5 句与技能正文重复的评测句子来付 token 账,余额按实测把该评测文件的上限从 1642 提到 1790。
  • 为什么改:spec 已落地 books 翻译分组,但技能不教它,照技能写 zh-CN 包的 agent 会让文档侧栏停在英文,或把键错放到 pages 下。
  • 风险与回滚:只改技能文字、评测 JSON、棘轮一行和一条 changeset,无代码和 schema 变更;回滚即还原本 PR。
  • 先看:skills/objectstack-i18n/SKILL.md(第 169–181 行那一段)、skills/objectstack-i18n/evals/bundles-locales-coverage.json(第 9 题与 5 处删句)、scripts/check-skills-token-ratchet.mjs(该评测行的算式注释)。
  • 两分钟验证:仓根执行 node scripts/check-skills-token-ratchet.mjs,预期打印 82 个文件均在上限内、退出 0。
  • 需要你做的:批准本 PR(skills/** 为 Tier H,席位不会 ready、入队或开自动合并)。

What changes

  • skills/objectstack-i18n/SKILL.md: the "Top-level groups alongside objects" paragraph now names books, the group the spec added so a doc book's title and section titles follow the reader's locale. The entry spells the three keys the spec declares, read off packages/spec/src/system/translation.zod.ts (the books record) and system/book.zod.ts on origin/main: books.{book}.label / .description by Book.name, and books.{book}.groups.{group_key}.label by each group's stable key, never its position, with one spelled example (books.crm_manual.groups.getting_started.label). It says the pages themselves localize through doc.translations and that the inline translations map a book once carried stays retired (the BOOK_TRANSLATIONS_RETIRED prescription). The existing sentence "os i18n extract --no-objects-only scaffolds every group above but messages and settingsCommon" now covers books too, which is what walkBooks in packages/cli/src/utils/i18n-extract.ts does.
  • skills/objectstack-i18n/evals/bundles-locales-coverage.json: case 9, a two-language crm_manual book whose sidebar is still English. The ideal answer spells the book label and the getting_started group label by key and says os i18n extract --no-objects-only seeds them; must_contain pins books, groups, getting_started, doc.translations; must_not_contain pins pages.crm_manual (a key invented under pages) and sections.getting_started (the sections alias the spec points at groups).
  • The eval file sat at its token ceiling (1642, headroom 0). Paid under the standing ruling recorded beside that row, quoted verbatim and untranslated: 「A:先削重复,余额按实测提高」.
    • Cut first (227 bytes, 57 units, 6567 → 6340 bytes, 1642 → 1585): five sentences that restated a rule the reader already reads elsewhere, each with its surviving home:
      1. case 1, "there is no ICU plural/select" (31 B) → SKILL.md "No ICU MessageFormat" section; the case's own {count, plural pin stays.
      2. case 3, "the retired o.* dialect is rejected on this door too" (56 B) → SKILL.md "The Retired o.* Shape" section; the case's own o: { pin stays.
      3. case 5, "extract --check is the separate freshness gate" (50 B) → SKILL.md "os i18n extract --check — freshness, not coverage" section.
      4. case 6, "inherited by every field referencing the picklist" (51 B) → SKILL.md's picklists entry in the top-level group list ("every field referencing the picklist inherits them").
      5. case 8, "Neither is a pages.*.components key." (39 B) → the case's own components.open_block pin.
    • Then the remainder: case 9 adds 817 bytes = 205 units (6340 → 7157 bytes, 1585 → 1790). The row is pinned AT the measurement, ceil(7157 / 4) = 1790, zero headroom; the row comment in scripts/check-skills-token-ratchet.mjs carries the same arithmetic.
  • SKILL.md had headroom: 5485 → 5571 tokens against its ceiling of 6333 (stamp line excluded), so its row is unchanged.
  • .changeset/26820-i18n-skill-books-group.md: @objectstack/skills patch (the package's dist is built from skills/**).

No forced test edits: nothing but the eval JSON and the ratchet row changed outside SKILL.md.

Tests

  • Per-case cross-check over every case in the eval file, 9 cases: every must_contain string present in its own expected_output, no must_not_contain string inside it — 0 violations. JSON.parse of the file succeeds.
  • node scripts/check-skills-token-ratchet.mjs: ✓ check-skills-token-ratchet: 82 authored bundle file(s) within their ceilings; 10 generator-owned file(s) measured, not ratcheted. (exit 0); --self-test: ✓ check-skills-token-ratchet self-test: 79 cases pass. (exit 0).
  • No package test or typecheck is owed: the diff touches no package source (skills/**, one ratchet row, one changeset), and no behaviour a test pins changed, so no ablation.

Acceptance notes

  • Skills readings (lines, then tokens as ceil(utf8 bytes / 4), the sibling gate's convention): SKILL.md 521 → 524 lines, 5485 → 5571 tokens (ceiling 6333); evals/bundles-locales-coverage.json 85 → 95 lines, 1642 → 1790 tokens (ceiling 1642 → 1790); whole package, all 11 SKILL.md files: 4610 → 4613 lines, 56462 → 56549 tokens; whole skills/ tree 19271 → 19284 lines.
  • Not carried (noted, not filed): no shipped example bundle (app-crm, app-showcase) declares a books group yet, so the SKILL.md example is a spelled key rather than a line quoted from a shipped bundle, as the inlineTitle and report-block lines are.
  • check:skill-docs and check:skill-refs are @objectstack/spec scripts (pnpm --filter @objectstack/spec run check:skill-docs), not root scripts; the derived list names the former.

Verification

All at head cd559297, on origin/main 7eb613c3 (the branch base; main had not moved when the list was derived).

  • Derived gate list: node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack printed 63 commands for this change set (4 paths, 63 changed lines, under the 3000 human-merge threshold). Every one ran locally (the 8 dist-reading ones after turbo run build --filter='./packages/**' under os-verify-lock, VERDICT command-exit 0, 7m26s), each exit code captured before any pipe: 63 of 63 exit 0.
  • Reconciliation: node scripts/pm/dispatch-gates.mjs --repo objectstack-ai/objectstack --ran FILE → ✓ dispatch-gates --ran: 63 derived famil(ies) accounted for — 63 run, 0 NOT-MEASURED (a DERIVED zero — all 63 recorded an exit code and none of them is 3).
  • Verdict lines worth reading: ✓ check-skills-token-ratchet: 82 authored bundle file(s) within their ceilings; ✓ check-skills-token-ratchet self-test: 79 cases pass.; ✓ check-skill-id-lint: 104 file(s) clean; check-nul-bytes: OK (scanned 21762 text file(s) …); ✓ dispatch-gates self-test (fast tier): 1935 cases pass; 7 slow section(s) deferred.
  • dispatch-gates --tier: both skills/** paths hit clause ① (MANDATORY CONTRACT_REVIEW_TIER, no one-line exit), as the claim records.
  • CI: the PR's own check-runs are the reading for every family CI runs; nothing was re-run locally to stand in for them.
The 63 commands and their exit codes (the `--ran` ledger)
node scripts/check-adr-0087-registration.mjs --base origin/main :: exit 0
node scripts/check-adr-0087-registration.mjs --self-test :: exit 0
node scripts/check-changeset-no-major.mjs --base origin/main :: exit 0
node scripts/check-closing-keyword-parity.mjs :: exit 0
node scripts/check-closing-keyword-parity.mjs --self-test :: exit 0
node scripts/check-comment-mask-corpus.mjs :: exit 0
node scripts/check-declaration-mirrors.mjs :: exit 0
node scripts/check-declaration-mirrors.mjs --self-test :: exit 0
node scripts/check-doc-route-spelling.mjs --advisory :: exit 0
node scripts/check-doc-route-spelling.mjs --self-test :: exit 0
node scripts/check-dts-emitted.mjs --self-test :: exit 0
node scripts/check-empty-changeset.mjs --base origin/main :: exit 0
node scripts/check-empty-changeset.mjs --self-test :: exit 0
node scripts/check-self-test-wired.mjs :: exit 0
node scripts/check-self-test-wired.mjs --self-test :: exit 0
node scripts/check-self-test-workflow-commands.mjs :: exit 0
node scripts/check-self-test-workflow-commands.mjs --self-test :: exit 0
node scripts/check-skills-token-ratchet.mjs :: exit 0
node scripts/check-skills-token-ratchet.mjs --self-test :: exit 0
node scripts/check-whole-set-label-write.mjs :: exit 0
node scripts/check-whole-set-label-write.mjs --self-test :: exit 0
node scripts/ci/assert-turbo-remote-cache.mjs --self-test :: exit 0
node scripts/ci/plan-test-core-shards.mjs --self-test :: exit 0
node scripts/ci/prune-turbo-cache.mjs --self-test :: exit 0
node scripts/pm/bare-root-worklist.mjs --self-test :: exit 0
node scripts/pm/release-rehearsal-clone.mjs --self-test :: exit 0
node scripts/release-pending-publish.mjs --self-test :: exit 0
pnpm check:agent-test-spelling :: exit 0
pnpm check:bash32-floor :: exit 0
pnpm check:changeset-gate-self-tests :: exit 0
pnpm check:ci-filter-parity :: exit 0
pnpm check:cli-command-ids :: exit 0
pnpm check:closed-ceremony-text :: exit 0
pnpm check:corpus-claim-drift :: exit 0
pnpm check:cross-package-test-inputs :: exit 0
pnpm check:doc-authoring :: exit 0
pnpm check:driver-memory-census :: exit 0
pnpm check:gitlink-declared :: exit 0
pnpm check:merge-driver :: exit 0
pnpm check:nul-bytes :: exit 0
pnpm check:parse-guard :: exit 0
pnpm check:pm-changeset-deadline-census :: exit 0
pnpm check:pm-dispatch-gates :: exit 0
pnpm check:pm-governed-merges :: exit 0
pnpm check:pm-skill-id-lint :: exit 0
pnpm check:pnpm-filter-targets :: exit 0
pnpm check:pnpm-flag-spellings :: exit 0
pnpm check:ratchet-remedy-authority :: exit 0
pnpm check:refd-timer-probe :: exit 0
pnpm check:role-word :: exit 0
pnpm check:scripts-symbol-anchors :: exit 0
pnpm check:skill-compatibility :: exit 0
pnpm check:skill-frame-sync :: exit 0
pnpm check:skill-identifier-liveness :: exit 0
pnpm check:watch-hint-literal :: exit 0
pnpm --filter @objectstack/lint run check:doc-formula-expressions :: exit 0
pnpm --filter @objectstack/spec run check:skill-docs :: exit 0
pnpm check:dts-closure :: exit 0
pnpm check:dual-build-cjs-loads :: exit 0
pnpm check:entry-guard :: exit 0
pnpm check:lean-entry-closure :: exit 0
pnpm check:published-files :: exit 0
pnpm check:sourcemap-no-sources-content :: exit 0

🤖 Generated with Claude Code

https://claude.ai/code/session_01ADHkmPLgCH4kXgfdFGF4Z2


Generated by Claude Code

… with an eval for a two-language doc book

The top-level group list names `books` with its three keys, by `Book.name`
and the group's stable `key`; eval 9 expects the book label plus a group
label by key for a two-language manual and never a `pages.*` key. Five
eval sentences that restated a rule the skill already teaches pay for
most of the case; the eval's ratchet row is raised by the measured
remainder (1642 -> 1790) under the standing ruling recorded beside it.

Claude-Session: https://claude.ai/code/session_01ADHkmPLgCH4kXgfdFGF4Z2
Co-authored-by: Claude <noreply@anthropic.com>
@github-actions github-actions Bot added size/s documentation Improvements or additions to documentation tooling labels Oct 28, 2026
@os-zhuang
os-zhuang marked this pull request as ready for review October 28, 2026 02:06
@os-zhuang
os-zhuang enabled auto-merge October 28, 2026 02:06
@objectstack-fleet

Copy link
Copy Markdown
Contributor Author

席位核对

ACCEPT · domain:skills#1 · session_01ADHkmSrRBdu9MdC6fc33Uu · head cd559297 · 2026-10-28T02:08Z

  1. 形态 — Tier H (skills/**): 4 files +53/−10, all inside the claimed surface (claim 6458384203).
    • objectstack-i18n/SKILL.md: the top-level group list gains books. Its keys: books.{book}.label / .description by Book.name, and groups.{group_key}.label by the group's stable key, with one spelled example. The pages localize through doc.translations, and the book's inline translations stays retired.
    • The bundles eval gains case 9.
    • The eval's token-ratchet row moves; changeset @objectstack/skills patch.
  2. 前提实测 — the seat read every taught fact off origin/main:
    • book.zod.ts L79–100 / L152: inline translations is retired, and doc.translations carries the pages.
    • doc.zod.ts L136: translations.
    • cli/src/utils/i18n-extract.ts walkBooks (L1972ff): it seeds books.<name>.label / .description and groups.<key>.label by key, skipping a group without a key. It sits in the stack subtree, so --no-objects-only is what writes it.
  3. 门禁 check-runs:
    • Dev reading: 63 derived commands, 63/63 exit 0 (--ran 63/63, 0 NOT-MEASURED, 0 UNRUN; build closure under the lock, VERDICT 0).
    • The seat re-ran the per-case cross-check at cd559297: 9 cases, 0 failures; JSON parses; 7157 B, so ceil(7157/4) = 1790 = the new ceiling.
    • CI on the head is read again before landing.
  4. 接受的偏差 — the ceiling goes 1642 → 1790 under ruling A (「A:先削重复,余额按实测提高」): 57 units paid down first, 205 units for the new case, pinned AT the measurement. The seat checked each of the five cut sentences against the home its reader reads:
    • Case 1's "no ICU plural/select" → SKILL.md L282 "No ICU MessageFormat", plus the case's own {count, plural pin.
    • Case 3's "retired o.* dialect" → SKILL.md L474 "The Retired o.* Shape", plus its own o: { pin.
    • Case 5's "extract --check freshness gate" → SKILL.md L311.
    • Case 6's picklist inheritance → the SKILL.md picklists entry ("every field referencing the picklist inherits them").
    • Case 8's "not a pages.*.components key" → its own components.open_block pin.
      Accepted.
  5. 范围外去向 — open question 1 (the example is a spelled key, and no shipped bundle has a books group yet): keep. The key shape is the spec's own (translation.zod.ts L1780–1782). Contract review at CONTRACT_REVIEW_TIER, effort ≥ xhigh: requested from the director seat.
  6. 落地条款 — governed, Tier H. os-zhuang approved this head (cd559297, 02:06:48Z), readied it and armed auto-merge; it lands through the queue on that approval. The seat does not push or re-arm.

@objectstack-fleet

Copy link
Copy Markdown
Contributor Author

Contract review

Served-tier: CONTRACT_REVIEW_TIER
Head-sha: cd55929728ce54eafb8d1c35df8ad3cc83da9caf
Local-runs: none
Scope: skills/objectstack-i18n/SKILL.md, skills/objectstack-i18n/evals/bundles-locales-coverage.json, scripts/check-skills-token-ratchet.mjs, .changeset/26820-i18n-skill-books-group.md + packages/spec/src/system/translation.zod.ts, packages/spec/src/system/book.zod.ts, packages/spec/src/system/doc.zod.ts, packages/spec/src/system/i18n-resolver.ts, packages/cli/src/utils/i18n-extract.ts

Director seat (summon #52, ledger objectstack#12708), summoned by the domain:skills#1 seat; effort ≥ xhigh. Read-only at the head above: the diff, card #26820 and its thread (triage 6449678084, claim 6458384203), the seat's ACCEPT 6458741426, the head and origin/main (25a697ec) copies of both skill files and the ratchet table, the spec, resolver and CLI extractor on origin/main, the head's check runs, reviews and timeline. skills/** is a governed-register row ⇒ the rules face, CONTRACT_REVIEW_TIER; Tier H. The seat records; it does not approve, ready, queue or merge.

① Derived judgments

  • The three keys are the spec's, spelled as the spec spells them. translation.zod.ts L1778–1795: books.<name>.label / .description (the book's own), books.<name>.groups.<group_key>.label (a group's label, by the group's key); books is in the group vocabulary (L749) and book is its alias (L2039 / L2084 / L2291). The resolver reads exactly those paths (i18n-resolver.ts:2267, :2281). "By Book.name" and "by each group's stable key, never its position" are book.zod.ts L90–94 (a group's key and a label "translated by books.<book>.groups.<key>.label"); the sections / chapters / toc aliases point at groups (L146), which is what case 9's sections.getting_started refusal pins. "The inline translations map a book once carried stays retired" is BOOK_TRANSLATIONS_RETIRED (L78–83, retiredKey at L100); "the pages themselves localize through doc.translations" is doc.zod.ts:136. Nothing is invented.
  • The scaffold sentence now covers books truthfully. i18n-extract.ts#walkBooks (:1972, called from the stack walk at :1645) emits the same three keys by group.key; objectsOnly: false is the stack kind (:2759–2760), so --no-objects-only is what writes them — the skill's existing "scaffolds every group above but messages and settingsCommon" (head L184) holds with books added above it.
  • Every one of the five cut sentences has its home, and nothing it pinned is lost. Case 1's "no ICU plural/select" → head L285 ### No ICU MessageFormat, and the case keeps {count, plural in must_not_contain. Case 3's "retired o.* dialect" → head L477 ### ❌ The Retired o.* Shape, and the case keeps o: {. Case 5's "extract --check is the separate freshness gate" → head L314 ### os i18n extract --check — freshness, not coverage. Case 6's "inherited by every field referencing the picklist" → the picklists entry of the group list (head L172, "every field referencing the picklist inherits them"). Case 8's "Neither is a pages.*.components key" → the case keeps components.open_block in must_not_contain. Each case's assertions are identical on both sides; only expected_output moved.
  • Eval parse-clean and self-consistent on both sides. main already had no cross-check failure in this file; at the head all nine cases pass (every must_contain present, no must_not_contain present). Case 9's expected text spells books.crm_manual.groups.getting_started.label and doc.translations, and contains neither pages.crm_manual nor sections.getting_started.
  • Ratchet arithmetic holds from the stored bytes, pinned AT the measurement under ruling A. Cuts by case: 31 + 56 + 50 + 51 + 39 = 227 B (6567 → 6340, 1642 → 1585); case 9 adds 817 B (6340 → 7157); ceil(7157 / 4) = 1790; row 1642 → 1790 (+148), headroom 0 both sides. SKILL.md (stamp excluded): 21937 → 22282 priced B, 5485 → 5571 under its 6333 ceiling, row untouched by right.
  • Changeset is right for what moves. @objectstack/skills patch; Clause-②: no / Metadata-protocol: none — skill text, an eval, one ceiling. Four files, all inside the claim.

② Semver level

@objectstack/skills patch. Correct.

③ Boundary flags

  • Governed path (skills/**, Tier H). At this record the PR is approved by os-zhuang (GOVERNED_APPROVERS) on this head at 2026-10-28T02:06:48Z, readied and auto-merge armed by the same hand at 02:06:52–53Z, before the seat's ACCEPT; it lands through the queue on that approval. This record changes nothing about it and may post after the merge. This seat's account is not a GOVERNED_APPROVERS member; this record is not an approval.
  • The example key is spelled, not quoted from a shipped bundle: no examples/* bundle declares a books group yet (the dev's open question, the seat's "keep"). The shape is the spec's own, so the teaching does not wait on an exhibit; when an example ships one, the line can cite it. Not a should-fix.
  • Check runs on cd559297 at this record: 16 success, 12 expected skips, 10 in_progress — among them Lint · repo & tooling gates (home of check:skills-token-ratchet) and the Type Check jobs. Nothing red; a red there re-opens this record. main has not moved on the touched files since the base (acc9c57d).
  • Dev deviations: none. The five cuts were inside the claim's "true duplicates trimmed first" clause and each is named with its home in the row comment, so the next reader finds the payment path without this record.
  • Nothing to carry: no should-fix.

④ Design judgment

Implemented-by: claude/project-thread-9ngvro
Reviewed-by: session_01ADHkmQr732toX135tyo5zs

VERDICT: PASS


Generated by Claude Code

@github-actions

Copy link
Copy Markdown
Contributor

⛔ merge queue 构建失败 — 先分诊,再决定要不要重排

队列构建 40623576592 红了。队列跑的是全量套件(PR 侧 CI 只跑 affected 子集),
所以失败的测试可能在本 PR 没碰过的包里 —— 那不是重排能修的。每次盲目重排都会让排在后面的所有 PR 重建一轮。

分类:failure —— 按下面的日志分诊。

失败的 job(日志抽取,best effort):

  • Test Core (1/8) — 失败步骤: Run this shard's tests

    @objectstack/spec:test:      ✓ inverts the card's measured control: the three bogus keys now FAIL parse instead of adding zero warnings  337ms
      ↳ 失败原因: (这条 FAIL 之后 12 行内没有可识别的原因行 —— 点进 job 看)
    @objectstack/spec:test:repo:  FAIL   repo  scripts/build-schemas-check-mode.deletion-proofs.test.ts > build-schemas.ts — a deleted manifest key must prove itself (#4725)
      ↳ 失败原因: @objectstack/spec:test:repo: Error: Hook timed out in 10000ms.
    @objectstack/spec:test:repo:  FAIL   repo  scripts/build-schemas-check-mode.git-topology.test.ts > build-schemas.ts — the drift notice names the direction it measured (#5847)
      ↳ 失败原因: @objectstack/spec:test:repo: Error: Hook timed out in 10000ms.
    

↳ 失败原因 是判读的关键:超时(Test timed out in … / Hook timed out in …)多半是负载/时序,不是本 PR 的回归;
断言(AssertionError: …)才指向真实的行为改变。两者的 FAIL 行长得一模一样,只有这一行能区分。

⚠️ 断言这一侧有一类例外,判据是断言在测什么,不是它是不是 AssertionError。 断言的对象是产品行为(一个值、一个形状、一次拒收)⇒ 照上面读:真实的行为改变,去查,⛔ 不要重排掉;
断言的对象是这次实验自身的有效性前提(跑完的耗时、负载下的先后、任何只在时间预算内才成立的条件)⇒ 它跟超时是同一类,同样对负载敏感,重排一次是合法的判别手段。
识别是机械的:断言的消息或它比较的值本身点名了一段时长、一个时间戳、一个耗时计数。实测过的一对 —— AssertionError: SecurityPlugin.init() ran: expected false to be true 测的是产品行为(真回归);
AssertionError: this run took over a second, so second-precision stamps could have differed too: expected 1006 to be less than 1000 测的是实验前提:它守护的那条不变式当时是绿的,同一个 head 原样重排一次即成功。
穿着 AssertionError 外衣的时间测量,仍然是时间测量。(⛔ 这只改「怎么读一次红」,不改「哪些测试可以重排」——后者由别处管。)

跨 PR 相同签名(24h,按失败测试文件聚合):

  • scripts/build-schemas-check-mode.deletion-proofs.test.ts — 24h 窗口内只有本 PR 撞到过,暂不汇总(再有一个不同 PR 撞到就会自动开汇总 issue)。
  • scripts/build-schemas-check-mode.git-topology.test.ts — 24h 窗口内只有本 PR 撞到过,暂不汇总(再有一个不同 PR 撞到就会自动开汇总 issue)。
  • ⚠️ 24h 评论账本没读完(超过 5 页仍未读到窗口尽头),所以上面的「不同 PR 数」是下界,不是全量。

历史信号:

  • 本 PR 过去 24h 无队列失败记录(首次)。
  • 过去 24h 队列共有 18 个失败构建(不含本次)。

分诊清单:

  1. 失败测试在本 PR 改动的包里 → 真回归,修 PR。
  2. 失败测试与本 PR 无关 → 看上面的「跨 PR 相同签名」;已有汇总 issue ⇒ flaky/环境问题实锤,去那张 issue 上谈,修好前重排只会再烧一轮全队列。
  3. 两者都不是 → 可能与同组 PR 语义冲突;等前面的 PR 落地或失败出队后再重排一次即可,不要连续重排。

Generated by Claude Code · merge-queue-triage workflow (#4859)

@objectstack-fleet

Copy link
Copy Markdown
Contributor Author

Queue build 40623576592 red, dequeued on CI_FAILURE — not this PR's failure, standing down from a push.

  • Failing check: Test Core (1/8), two @objectstack/spec test:repo files: scripts/build-schemas-check-mode.deletion-proofs.test.ts and scripts/build-schemas-check-mode.git-topology.test.ts, both Error: Hook timed out in 10000ms (the triage comment's own reading: a timeout, not an assertion).
  • Why it is not this PR's: the diff is four files — skills/objectstack-i18n/SKILL.md, skills/objectstack-i18n/evals/bundles-locales-coverage.json, one row of scripts/check-skills-token-ratchet.mjs and .changeset/26820-i18n-skill-books-group.md. It touches no packages/spec source, no build-schemas script and no test; the queue runs the full battery, and a beforeAll hook that spawns the schema build timing out at 10 s is load in the grouped queue build. Both signatures are first-seen in the 24h window, no aggregation issue exists yet.
  • Fix ported: none exists to port; nothing in this PR can make a hook in an untouched package faster. The head stays cd559297.
  • Next: one re-queue on the same head is the legitimate discriminator for a timeout. The dev seat never queues or re-arms a Tier H PR; that act belongs to the maintainer or the approving hand (os-zhuang readied and queued it). If a second queue build fails on the same two files, that is a main-red for the spec lane, not this PR.

Generated by Claude Code

@objectstack-fleet
objectstack-fleet Bot added this pull request to the merge queue Oct 28, 2026
Merged via the queue into main with commit 857cd3c Oct 28, 2026
41 checks passed
@objectstack-fleet
objectstack-fleet Bot deleted the claude/project-thread-9ngvro branch October 28, 2026 07:52
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

documentation Improvements or additions to documentation size/s tooling

Projects

None yet

Development

Successfully merging this pull request may close these issues.

skills(objectstack-i18n): the group list and the bundles eval do not teach the books translation group (follow-up owed by #26690)

2 participants