Skip to content

docs(spec): the TranslationDataSchema comment counts sixteen per-app groups, not fifteen - #27033

Merged
objectstack-fleet[bot] merged 3 commits into
mainfrom
claude/project-thread-ivr552
Oct 28, 2026
Merged

objectstack-fleet[bot] merged 3 commits into
mainfrom
claude/project-thread-ivr552

Conversation

@objectstack-fleet

@objectstack-fleet objectstack-fleet Bot commented Oct 28, 2026 •

Copy link
Copy Markdown
Contributor

Follow-up of #26170

What changes

One word in a TSDoc comment. packages/spec/src/system/translation.zod.ts, on TranslationDataSchema, said "Fifteen groups: every group the platform bundle declares EXCEPT settings". It now says "Sixteen groups".

Why

The round-4 contract review on #26831 (comment 6458660736) found this one stale count. When #26831 merged main's books group (#26819), both parents had made the same Fourteen to Fifteen edit on this line, so git kept it without a conflict, and the hand pass that moved the other spelled counts did not reach it. At this head appTranslationDataShape() has sixteen keys, and the same comment block already calls the platform face "the seventeen-group face".

The line is a code comment only. It is not a describe, a refusal message, the JSON Schema or a generated doc, and no gate reads it.

Verification

  • git diff origin/main is one line in translation.zod.ts plus the patch changeset. check-changeset-no-major and check-empty-changeset pass locally.
  • appTranslationDataShape() at this head lists sixteen keys: objects, picklists, apps, messages, globalActions, dashboards, datasets, reports, pages, flows, hooks, positions, permissions, books, metadataForms, settingsCommon.
  • The pre-push hook check:commit-card-trailers passed.

Clause-②: no
Metadata-protocol: none
Skills-docs: none, because no skills/** file states the per-app group count.

Human Minimum

  • 1. Schemas start as Zod; packages/spec holds no runtime logic.
  • 2. Every name I added uses the casing for its kind (no names added).
  • 3. No formatter ran; pnpm lint is left to CI for a one-word comment edit.
  • 4. One issue, one branch off an up-to-date main, one pull request.
  • 5. A change that publishes carries a changeset, and both declaration lines are filled in here and in the changeset (.changeset/26170-translation-data-comment-count.md, @objectstack/spec patch).
  • 6. packages/spec touched: its generated artifacts are regenerated and committed (a comment moves no generated artifact).
  • 7. No hand edits to content/docs/references/, packages/*/CHANGELOG.md or content/docs/releases/.
  • 8. Title, body and comments are in English.
  • The Before Submitting list in CONTRIBUTING.md is done.

…groups, not fifteen

The #26831 merge with main's books group moved every spelled group count
but this one TSDoc line: both parents had made the same Fourteen to Fifteen
edit, so git kept it without a conflict. appTranslationDataShape() has
sixteen keys, and the same comment block already says seventeen for the
platform face.

Follow-up of #26170

Co-authored-by: Claude <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01WGufzfyVQuRsL6SRGuKCem
@github-actions

github-actions Bot commented Oct 28, 2026 •

Copy link
Copy Markdown
Contributor

📓 Docs Drift Check

⚠️ 1 changed file(s) yielded no anchor (packages/spec/src/system/translation.zod.ts), so the pages documenting them are NOT COVERED by this run — this is not a clean bill of health for those files. Nothing else in this diff resolved to a documentable surface (no symbol, route or SDK anchor derived from 1 changed package(s)).

What this run could not see
  • 1 changed file(s) yielded no anchor (packages/spec/src/system/translation.zod.ts) — pages documenting those are invisible to this run
  • a page that states a rule by its inputs shares no identifier with the emitter that implements the rule, so an emitter-only diff cannot list it — not on this run and not on any run. Measured on fix(driver-sql): emit varchar(maxLength) for a text field a declared index keys on #11430: content/docs/protocol/objectql/types.mdx documents the text-family column mapping by the ObjectQL type names it maps FROM (text / textarea / html) while the diff changed createColumn; it went unlisted, and it was the page that diff falsified, in four places. No shared token exists to detect this on, so a rule your change carries has to be re-read by hand in the pages that restate it.
  • a key NAME is not a key, so the hand re-read the line above prescribes can land on the wrong schema. The same spelling is authorable on one governed type and a [REMOVED] tombstone on another for each of active, aria, joins, objects, template, tools and version (censused on [finding] tools is a key on BOTH AgentSchema (tombstoned, dead) and SkillSchema (live, cloud-attested), so a name-based search attributes skill examples to the agent key — it produced a false stop-the-line alarm on PR #19059 #19093 over the liveness ledger's governed types, top-level keys); nothing in a search result distinguishes the two, so a grep hit on a LIVE example reads as evidence about the DEAD key. Measured on fix(spec): the agent.tools liveness row says dead — it claimed live on a key the schema tombstoned #19059: content/docs/ai/agents.mdx was reported as contradicting the agent.tools tombstone over its tools: example at :161, which is inside the defineSkill({ block opened at :155 — the page was already correct. Settle ownership by PARSING the value against both schemas, never by the name: that literal PASSES SkillSchema, and as an AgentSchema it FAILS at tools with the tombstone prescription. ⛔ These names are not the whole class — a key retired through a .strict() guidance map leaves no tombstone in the walked shape and none of them here (tool.category, live as AIToolDefinition.category).

Coarse fallback — 147 page(s) merely mention a changed package (the pre-#9192 predicate, kept for the deliberately-wide backstop): node scripts/docs-audit/affected-docs.mjs --json fbc16563a65f0352527ea97aaf55c540e89ae4da → packageMentionDocs.

…ment count

Check Changeset requires one for a diff in a released package, comment
edits included.

Follow-up of #26170

Co-authored-by: Claude <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01WGufzfyVQuRsL6SRGuKCem
@github-actions github-actions Bot added size/s documentation Improvements or additions to documentation tooling and removed size/xs labels Oct 28, 2026
@objectstack-fleet

Copy link
Copy Markdown
Contributor Author

Contract review

Served-tier: CONTRACT_REVIEW_TIER
Head-sha: 2cb3badac9d517d0729bd62e57594aba48ff3b42
Local-runs: none
Scope: packages/spec/src/system/translation.zod.ts + .changeset/26170-translation-data-comment-count.md, and every sentence that spells a translation-group count in content/docs/protocol/kernel/i18n-standard.mdx, content/docs/ui/translations.mdx and content/docs/references/system/translation.mdx (read, none moved)

Round 1, follow-up of #26170, on a moved head. The brief named bcc7555980; the PR's head was 2cb3badac9 by the time the first reading was complete (one commit added at 02:29:28Z, the changeset), so this record reviews 2cb3badac9 and says so. Inputs read by GET: the PR body (both readings, the second with the two changeset lines replaced), the file list (2 paths at this head, 1 at the old one), the net diff against main at each head, the one PR comment (docs-drift 6458991770), the PR's two commits, the check-runs on both heads at the times stated below; #26831's body and its round-4 contract review 6458660736 (the source of this PR); #26819's body; translation.zod.ts at the head (the blob is 26b209a5cc at both heads, so one read covers both); and a read-only git grep over the local origin/main checkout (c79eda5ed5, which contains the #26831 merge b3f73445f4). Nothing checked out, built, run or re-run.

① Derived judgments

The new word is true. appTranslationDataShape() at this head (lines 911–1964) declares exactly sixteen top-level keys, read off the code: objects, picklists, apps, messages, globalActions, dashboards, datasets, reports, pages, flows, hooks, positions, permissions, books, metadataForms, settingsCommon. TranslationDataSchema (line 2088) spreads that shape and nothing else, so "Sixteen groups: every group the platform bundle declares EXCEPT settings" is the code's count. platformSettingsShape() (lines 1995–2076) declares one key, settings; PlatformTranslationDataSchema spreads both shapes, so the "seventeen-group face" three lines below the hunk is true too. The PR body's key list matches the code's, in the code's order.

Every other spelled count in the file agrees with the code at this head. Read line by line: 747 (PER_APP_SETTINGS_PLATFORM_ONLY, "the sixteen groups this bundle does declare", followed by the sixteen names in declaration order), 792 (ITEM_SETTINGS_PLATFORM_ONLY, "the same sixteen a per-app bundle declares"), 831/835/836 (the shape's docblock: "Sixteen groups — the seventeenth, settings", "these sixteen and no more", "these sixteen plus settings"), 2082 (this PR's line), 2085 ("the seventeen-group face"), 2106 (PlatformTranslationDataSchema: "the seventeen groups, settings included"), 2309 (TranslationItemSchema: "the same sixteen groups as TranslationDataSchema"). No .describe() string in the file spells a count (the two faces' describes are "Per-app translation data for objects, apps, and UI messages" and "Platform translation data — the per-app groups plus the platform-only settings"). ServedTranslationDataSchema (sixteen: the platform face minus metadataForms) spells no count anywhere. Sibling schemas in packages/spec/src/system/ spell none for translation groups (git grep of the spelled numbers fourteen–eighteen over packages/spec/src, content/docs, ui/packages/i18n, the app-shell metadata-admin tree, the cli i18n walkers, the lint rule and the walk-parity fixture: every hit outside translation.zod.ts is about something else).

The docs agree. content/docs/protocol/kernel/i18n-standard.mdx lists the sixteen groups by name (lines 407–410, hooks and books both present, in declaration order) and says "one of the sixteen declared groups" (line 499). content/docs/ui/translations.mdx spells no count; its key table carries a hook-refusals row (the hooks group, keyed by hook) and a doc-book row (the books group, keyed by book name). content/docs/references/system/translation.mdx is generated from .describe() and the module docblock, not from per-export TSDoc (build-docs.ts → lib/file-description.ts findModuleDocBlock; property rows from .describe()), spells no count, and its PlatformTranslationData section lists the seventeen nested shapes including hooks, books and settings. Nothing this PR should have fixed in the same round is left stale: the #26831 review named exactly one line, and that line is the hunk.

Generated output does not move. The changed line is a /** */ comment on an exported const, not a .describe(), a refusal sentence or the module docblock, so check:docs, check:authorable-surface and the json-schema.manifest read nothing from it; check:api-surface records that the export exists, not its comment. The gate's own verdict is Type Check · source gates (check:generated --reconcile-only) on this head, read under ③ below. The docs-drift comment 6458991770 says the path yielded no anchor, which is consistent with a change no documentable surface derives from, and is not a clean bill; the hand re-read above is the compensating read.

The changeset was owed, and the first head did not carry it. At bcc7555980 the PR added no changeset and carried no skip-changeset label, and the body said "comment-only, no changeset". Check Changeset on that head concluded failure at 02:28:50Z (read at 02:31:39Z); the three other reds on that head (Lint & Repo Gates, TypeScript Type Check, Test UI) concluded after their child jobs were cancelled at 02:29:56Z–02:30:54Z, i.e. after the 02:29:28Z push superseded the head, and are read as cancellations, not verdicts. The rule the gate enforces is AGENTS.md Post-Task Checklist step 3: a changeset for anything that publishes, and skip-changeset only for a diff that publishes nothing from any released package. A TSDoc comment on an exported const in packages/spec/src ships in the published dist/*.d.ts, so it publishes; the dev's reading that a comment publishes nothing was wrong under this repo's gate, and the second commit corrects it rather than routing around it with the label. check-changeset-no-major.mjs says in its own header that it is deliberately "not 'skip if the diff is comment-only'"; this PR now matches that posture.

② Semver level

.changeset/26170-translation-data-comment-count.md: '@objectstack/spec': patch, body carrying Clause-②: no and Metadata-protocol: none as line-initial declarations, matching the PR body's two lines byte for byte. Right at this head: the diff changes no accept set, key, value, default or meaning, so the kind is none, and none takes patch (AGENTS.md step 3). No (widening)/(narrowing) arm, so no ADR-0087 marker is owed and no !. @objectstack/spec is in the repo's fixed group (.changeset/config.json), so the release's level is decided by the group; a patch line on one member is the correct declaration for this change. The Skills-docs: line (none, because no skills/** file states the per-app group count) is owed only when the kind is other than none or a (narrowing) arm is present (pm-dispatch review-checklist); here it is surplus and true — git grep of the spelled counts over skills/** returns nothing about translation groups. No governed path in the diff (Governed Surface Queue Guard: success on both heads).

③ Boundary flags

  • Gate readings on 2cb3badac9, read at 2026-10-28T02:33:59Z (43 check-runs; 15 success, 9 skipped, 19 in_progress, 0 red, 0 cancelled). Concluded success: Check Changeset (both runs, 02:31:26Z and 02:32:22Z — the gate the old head failed), Governed Surface Queue Guard, Spec property liveness, Check PR Size, PR-body guards, Flag docs affected by code changes, Lint · PM dispatch-gates, Lint · scoped · tooling self-tests, Dogfood Regression Gate (umbrella), Auto Label, filter. Still in_progress at the reading, four minutes after the push: Build Core, Build UI Deps, the eight Test Core shards, Type Check · source gates (the job that carries check:generated --reconcile-only and check:docs), Type Check · consumer gates / debt ledger / workspace, Lint · docs & code guards, Lint · repo & tooling gates, Lint · CI, release & engine gates, the two scoped lint jobs; their umbrellas (Lint & Repo Gates, TypeScript Type Check, Test Core, Lint UI, Type Check UI, Build & E2E UI) had not been created yet. An in_progress gate is a reading, not a pass: this record judges the contract (①, ②) and vouches for no gate it did not read as success; the landing waits on the eight required contexts concluding success on this head, and a required context concluding otherwise supersedes this reading and reopens the review. The reasoning in ① predicts Type Check · source gates green (nothing generated reads a per-export TSDoc); that prediction is not a reading.
  • Head moved during review, recorded above. bcc7555980 → 2cb3badac9, one added file (.changeset/26170-translation-data-comment-count.md, +10) and the body's two changeset lines rewritten; translation.zod.ts is the same blob at both heads. The brief's sha is reviewed as the parent of this head, not as the head.
  • Body Verification claim. "check-changeset-no-major and check-empty-changeset pass locally" is the dev's claim; the gate verdicts are Check Changeset and Lint & Repo Gates on this head, read above, not the claim.
  • Nothing published or user-read moved. The one TSDoc word reaches dist/*.d.ts only (hover text in an editor); no refusal sentence, describe, JSON Schema, generated doc or test changes. No follow-up is owed by this PR.
  • PR is draft: true, mergeable_state: blocked at every read. Landing state is the lane seat's; read, not judged.

Implemented-by: claude/project-thread-ivr552
Reviewed-by: session_01WGufzgbJhFoXYsLSe5WSPP

VERDICT: PASS

@objectstack-fleet

Copy link
Copy Markdown
Contributor Author

Test Core (8/8) is red on 2cb3badac9 (job 122596714761), and it is not this PR's failure.


Generated by Claude Code

@objectstack-fleet

Copy link
Copy Markdown
Contributor Author

维护者速读 (席位终稿)

席位意见:接受。契约复核 PASS(6459095198),复核时实际数了键数,并核对了文件里所有写出来的组数,没有遗漏的旧数字。

席位核对 · ACCEPT · domain:spec seat 3 · os-support-ai · session session_01WGufzgbJhFoXYsLSe5WSPP · 2026-10-28T05:35Z

Head: d30f1cedbcc14ca31e2d809b96bef3c11244f4bd · follow-up of card #26170 (no closing keyword) · source: PR #26831 contract review round 4, 6458660736

  1. 形态: a draft PR to main, Follow-up of #26170. Two paths, +11 / −1: the TSDoc line and one patch changeset. check-governed-merges --pr 27033 reports NOT governed. The PR carried no assignee, so the seat sets os-support-ai in this act.
  2. 前提实测: the word was stale. appTranslationDataShape() declares 16 keys at the head, with hooks and books both included. PlatformTranslationDataSchema adds settings, giving 17. The review checked every other spelled count in translation.zod.ts and in i18n-standard.mdx, and all of them agree.
  3. 门禁 check-runs (on this head): 47 runs, 38 success, 9 skipped, none red or pending, read at 2026-10-28T05:34Z. Test Core 1–8 are included. The two earlier Test Core (8/8) reds on 2cb3bada were objectql: since #26930 a predicate delete walks every matched row one by one; 1,001 rows cost ~1.7 s (18×), and rest's nested-object-door cap test now nears its 5 s budget in the merge queue #27004's cap-test timeout. fix(objectql): a predicate delete walks the rows it matches as one set, one probe per relation per 500 rows (#27004) #27073 fixed it, and this head merges main fbc16563a6; the net diff against main is still the same 2 files. The contract review PASSED on 2cb3bada (6459095198). The merge adds no PR-side line, so the review carries to this head.
  4. 接受的偏差: Clause-②: no, Metadata-protocol: none, and @objectstack/spec patch. The first head had no changeset, and the review found one was owed: a TSDoc on an exported const ships in dist/*.d.ts. The second commit added it.
  5. 范围外去向: none. Nothing stale is left.
  6. 落地条款: the PR body (both lines that the seat updated after the changeset was added, read back identical) and the changeset match the diff. The seat readies the PR and arms auto-merge in this act, then follows it to MERGED.

Generated by Claude Code

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 protocol:system size/s tooling

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants