Skip to content

docs: hand-written inventory counts are deleted across skills, docs, READMEs and code comments; the names and the source of truth stay - #27542

Merged
os-zhuang merged 4 commits into
mainfrom
claude/project-thread-8lub6g
Oct 29, 2026
Merged

os-zhuang merged 4 commits into
mainfrom
claude/project-thread-8lub6g

Conversation

@objectstack-fleet

Copy link
Copy Markdown
Contributor

Requested by 田騏 · project thread

domain:skills#1 · marchtian · session_017ihL2fNkBkNQ88EMzvcrPW

Fixes #27522

Clause-②: no
Metadata-protocol: none

维护者速读

  • 改了什么: 删掉手写的清单计数(「49 field types」「8 lifecycle events」「20 built-in node types」「Plugins (18)」「30 functions」「36 built-in tokens」「26 built-in metadata types」「10 built-in locales」「38 chart types」等):卡片清单表 16 行全部处理,再加本次扩扫到的 docs、examples、ui README、代码注释里的同类计数;枚举出来的名字保留,packages/metadata/README.md 那张已经过时的类型表(列着 trigger、validation、theme 等根本不存在的类型)换成指向 DEFAULT_METADATA_TYPE_REGISTRY 的一句话。
  • 为什么改: 这些数字没有门禁对着目录核对,清单一动就错(showcase 写 38 种图表,spec 只有 20;README 写 26 种元数据类型,spec 有 31),错的数字比没有数字更误导读者和 AI 作者。
  • 风险与回滚: 纯文档、README、changeset 与两处代码注释(packages/spec 一行 // 注释,ui/ 三个文件的注释),不改任何行为;回滚即还原本 PR。skills/** 为 Tier H。
  • 先看: packages/metadata/README.md(唯一删掉一张表的地方)、skills/objectstack-data/references/data-hooks.md(「Why so few?」那条说明)、content/docs/api/error-catalog.mdx 首句。
  • 两分钟验证: node scripts/check-skills-token-ratchet.mjs,预期最后一行 ✓ check-skills-token-ratchet: 84 authored bundle file(s) within their ceilings。
  • 需要你做的: skills/** 是 Tier H,落地需 os-zhuang 或 hotlong 批准;其余由席位落地。

What changes

Rule applied, from the triage ruling: delete the number, or point at the source of truth; a count that matters is generated or pinned by an existing gate; no new gate.

The card's Inventory table, every row taken

File Was Now
skills/objectstack-data/SKILL.md L41, L297 49 field types the names stay; the table in rules/field-types.md is the pointer
skills/objectstack-data/rules/field-types.md L9 49 available options the available options
skills/objectstack-data/SKILL.md L46 the 8 lifecycle events the lifecycle events
skills/objectstack-data/references/data-hooks.md L10, L31, L46 8 lifecycle events; "Why only 8?" lifecycle events; "Why so few?" (the explanation of why find is the only read event stays)
skills/objectstack-automation/SKILL.md L54 20 built-in node types built-in node types (the node tables follow)
skills/objectui/README.md L58 Plugins (18) Plugins (the names follow)
skills/objectui/guides/schema-expressions.md L231 30 functions "the whole registry" (the function table above it is the enumeration)
content/docs/capabilities/views.mdx L30 36 built-in tokens built-in tokens
content/docs/releases/implementation-status.mdx L45 14 lifecycle events the lifecycle events that actually fire (a living status page per triage, not a release note)
docs/qa/platform-checklist/README.md L374 49 field types, 20 chart types field types, chart types (the gate-pinned enumSource.expect is untouched)
examples/app-showcase/README.md L19, L72 all 49 field types, all 8 view types, all 38 chart types every field type, every view type, every chart type
packages/metadata/README.md L195 26 built-in metadata types across 6 protocol domains, plus a table a pointer at DEFAULT_METADATA_TYPE_REGISTRY and MetadataTypeSchema (see Acceptance notes: the table was wrong, not just stale)
packages/metadata/ROADMAP.md L23 26 built-in metadata types across 6 domains the built-in metadata types of DEFAULT_METADATA_TYPE_REGISTRY, by protocol domain
packages/spec/PLUGIN_STANDARDS.md L208 17 services across 13 plugins services registered by plugins via ctx.registerService()
ui/packages/i18n/README.md L3, L7 10 built-in locales built-in locales (L7 still lists them)

The wider re-sweep (sites the card did not list)

Patterns: a digit, a N+, a parenthesised (N) or a spelled-out number before an inventory noun, over skills/**, content/docs/**, docs/qa/**, examples/**, package READMEs, ui/** READMEs, and .describe() / JSDoc / code comments in packages/spec/src and ui/packages/*/src.

  • skills/objectstack-query/SKILL.md L238: "The six functions (…)" → "The functions (…)".
  • skills/objectui/guides/plugin-development.md L95: "The eleven control kinds" → "The control kinds" (a code comment inside the guide).
  • content/docs/capabilities/index.mdx: "40+ field types", "Nine lenses", "Five trigger styles", "Seven approver styles, four decision modes"; data.mdx L4 "40+ field types"; approvals.mdx L4, L10, L26 (two headings: "seven resolution styles", "four decision modes"; no page linked those anchors, check:doc-anchors green); automation.mdx L4 "Five trigger styles"; analytics.mdx L4, L12, L29 "~20 / roughly twenty chart families", "four report shapes".
  • content/docs/frontend/plugins/index.mdx L24 "14+ official plugins" (18 exist); frontend/architecture-overview.mdx L317–L330 "20+ hooks", "91+ Shadcn UI atoms", "35+ field renderers", "20 plugin packages", "(15 more)".
  • content/docs/protocol/objectql/index.mdx L114 and schema.mdx L1036 "20+ field types"; query-syntax.mdx L350, L1217 "all five drivers", L1041 "All six functions".
  • content/docs/plugins/packages.mdx L7 "72 package manifests", L27 "all 15 protocol domains"; protocol/kernel/config-resolution.mdx L149 "19 types"; api/error-catalog.mdx L7 "9 error categories and 56 error codes" (the page itself is the catalogue; no gate pins either number).
  • examples/app-todo/README.md L51 "20+ fields", L66 "Actions (8)", L73 "4 Key Metrics", L77 "Reports (5)", L84 "Automation Flows (4)"; examples/app-showcase/README.md L159 "six protocol domains".
  • ui/packages/components/README.md L9 "60+ Components (46 from Shadcn + 14 custom)"; ui/apps/console/README.md L11 "15+ view plugins"; ui/packages/types/README.md L409 "50+ members"; ui/packages/plugin-grid/README.md L101 "20 values and 29 types"; ui/packages/plugin-form/README.md L968 "all five renderers"; ui/packages/fields/README.md L344, L354 "All four widgets", "all eight read sites across the four widgets"; ui/packages/i18n/README.md L359 "three functions".
  • Code comments: packages/spec/src/kernel/metadata-plugin.zod.ts L82 "hook (24 lifecycle events)" (HookEvent declares eight); ui/packages/app-shell/src/views/metadata-admin/i18n.ts L6, L735 and registry.ts L7 "27 metadata types" (MetadataTypeSchema declares 31); ui/packages/i18n/src/namespaces/studio/zh.ts L3190 "the other 21 node types". Comments only; no string a user sees carried a count.

Kept, by name

  • content/docs/api/plugin-endpoints.mdx L129 "all 12 routes": pinned by the cloud repo's ai-route-ledger.ts conformance test the sentence cites.
  • content/docs/api/client-sdk.mdx L916 and packages/client/CLIENT_SPEC_COMPLIANCE.md L10 "27 routes": a dated audit measurement.
  • content/docs/ui/create-vs-edit-form.mdx L92 "all 40 fields", protocol/kernel/index.mdx L164 "200+ plugins" and L233 "15 languages": hypotheticals, not inventories.
  • content/docs/frontend/plugins/plugin-editor.mdx L73 and plugins/index.mdx L169 "100+ languages": Monaco's inventory, not ours.
  • examples/README.md L14, examples/app-crm/README.md L5 and getting-started/examples.mdx L240–L244 ("10+ objects", "15+ actions per domain", "5 AI agents"): HotCRM, an external repository.
  • skills/objectstack-i18n/SKILL.md L242–L244 ("2-3 locales", "5-20 objects"): sizing thresholds, not counts.
  • ui/packages/fields/src/widgets/number-format.ts L273 "10 locales x 18 values x 4 precisions": a recorded measurement.
  • Counts of two or three that structure the paragraph enumerating them ("three run modes", "Three view kinds", "Three action types", "two channels") in skills/**: left as written.
  • Everything on the card's own out-of-scope list: release notes and CHANGELOGs, docs/audits/**, ui/docs/** (ADRs, audits, design, RFCs), packages/spec/DEVELOPMENT_PLAN.md, packages/core/PHASE2_IMPLEMENTATION.md, packages/spec/liveness/README.md, content/docs/permissions/system-context.mdx, sample CLI output, the computed "10 skills" and generated "106 components", skills/objectstack-ai/SKILL.md L87.

Skills readings (Tier H, skills/**)

Deletion only. Lines are unchanged in every touched file (no re-wrap); tokens are ceil(utf8 bytes / 4) on the whole file, stamp line included.

File Lines before → after Tokens before → after
skills/objectstack-data/SKILL.md 472 → 472 6111 → 6106
skills/objectstack-data/rules/field-types.md 320 → 320 3151 → 3151 (one word swapped, equal bytes; ceiling 3158, PR #27475's seven-token headroom there is intact)
skills/objectstack-data/references/data-hooks.md 973 → 973 10066 → 10064
skills/objectstack-automation/SKILL.md 452 → 452 6454 → 6453
skills/objectstack-query/SKILL.md 403 → 403 4173 → 4172
skills/objectui/README.md 64 → 64 729 → 728
skills/objectui/guides/schema-expressions.md 642 → 642 6571 → 6565
skills/objectui/guides/plugin-development.md 482 → 482 4184 → 4183

Whole package: the sum of every SKILL.md is 4610 → 4610 lines; the ratcheted authored bundle is 207857 → 207840 tokens (the gate's own figure after: ratcheted (authored) 207840 / 217474).

@objectstack/skills patch changeset: .changeset/27522-inventory-counts.md.

Tests

None added or changed: the diff is prose, READMEs, one changeset and four code comments. No behaviour is tested by a count.

Acceptance notes

  • packages/metadata/README.md's table was not merely stale. It listed validation, theme, workflow, trigger, schedule, manifest, permission_set, role, profile, rag_pipeline, model and prompt, none of which is in MetadataTypeSchema (31 names on main), and the spec's own comment says there is no trigger and no validation metadata type. Keeping those names would have taught the wrong thing, so the rule's second arm applies: the section now points at the registry and keeps no copy.
  • Serial constraint with PR docs(data-modeling): the currency page — dynamic, fixed and record modes, the sibling code field, what a record-currency amount refuses #27475 (edits skills/objectstack-data/rules/field-types.md L181): this PR edits L9 only; the branch is on today's main tip (aef631b8, which is an ancestor of this head), so there was nothing to merge.
  • Out of scope, noted and not filed (carrier: none): ui/packages/plugin-grid/README.md keeps a hand-written export list under "The complete public surface"; nothing reads it against src/index.ts. Same class as this card, a different remedy (generate or delete the list), and not a count.
  • Cross-lane per triage 6495060086: one PR carries the skills, devx, server, spec, ui and example halves; the claim declares the other lanes' files; the extra sites above are named here as the seat asked.

Verification

Local gates, run at 93c9b71f, every exit code captured before any pipe:

  • node scripts/check-skills-token-ratchet.mjs → exit 0 (✓ check-skills-token-ratchet: 84 authored bundle file(s) within their ceilings; 10 generator-owned file(s) measured, not ratcheted.), plus --self-test → 0.
  • pnpm --filter @objectstack/spec build && check:generated → ✓ All 14 generated artifacts are up to date (check:docs, check:skill-docs, check:skill-refs, check:api-surface, check:authorable-surface, check:export-origins, check:liveness, check:strictness-ledger, check:meta-url-spelling all ✓); check:llms-txt → 0.
  • pnpm check:doc-anchors, check:doc-authoring, check:doc-frontmatter, check:docs-audit-scope, check:docs-single-h1, check:docs-spec-enumerations, check:docs-redirects, check:nul-bytes, check:issue-citations, check:release-notes, check:release-page-status, check:closed-ceremony-text, check:published-readme-links, check:skill-compatibility, check:skill-frame-sync, check:skill-identifier-liveness, check:pm-skill-id-lint, check:org-identifier, check:keyed-text-bounds, check:corpus-claim-drift, check:role-word, check:pm-prior-rulings, check:platform-checklist, check:examples-live-imports, check:spec-docblock-symbol-anchors, check:overlay-whitelist-table, check:system-context-census, and the node scripts/check-*.mjs docs families the derivation named → all exit 0.
  • NOT MEASURED locally, prerequisite not met (exit 3), left to CI: check:i18n (needs the built CLI), check:docs-transcript-drift (needs @objectstack/lint built), check:skill-examples (needs packages/client-react/dist); pnpm --filter @object-ui/i18n type-check and @object-ui/app-shell type-check stop on the unbuilt ui/packages/core and @object-ui/fields closure (the diff in those packages is comments only); every other family in dispatch-gates --commands (repo-wide scans such as pnpm lint, the ui/ test and build lanes, Test Core) is CI's run and is cited from this PR's check-runs.
  • node scripts/pm/dispatch-gates.mjs --ran over the recorded subset: see the os-dev-report comment on the card for the reconciliation line.

Human Minimum

  • 1. Schemas start as Zod; packages/spec holds no runtime logic. (one // comment changed)
  • 2. Every name I added uses the casing for its kind. (no names added)
  • 3. No formatter ran; pnpm lint is CI's run.
  • 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.
  • 6. packages/spec touched: check:generated reports all 14 artifacts current; nothing to regenerate for a comment.
  • 7. No hand edits to content/docs/references/ or packages/*/CHANGELOG.md; content/docs/releases/implementation-status.mdx is the one releases-tree file, a living status page the card and triage put in scope, in a docs-only PR.
  • 8. Title, body and comments are in English.

🤖 Generated with Claude Code

https://claude.ai/code/session_017ihL2fNkBkNQ88EMzvcrPW


Generated by Claude Code

…Es and comments

A hand-written count of a live inventory (field types, lifecycle events,
node types, plugins, locales, metadata types, chart types) teaches nothing
the names do not, no gate reads it against the tree, and it drifts the
moment the inventory changes. The numbers go; the enumerated names stay
where they teach something, and the stale metadata-type table in
packages/metadata/README.md gives way to a pointer at the registry that
declares the types.

Co-Authored-By: Claude <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017ihL2fNkBkNQ88EMzvcrPW
Trigger styles, approver styles, decision modes, report shapes and chart
families are spec enumerations; the pages enumerate the names and the
numbers before them drifted the same way the digits did.

Co-Authored-By: Claude <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017ihL2fNkBkNQ88EMzvcrPW
@github-actions github-actions Bot added size/m documentation Improvements or additions to documentation tooling labels Oct 29, 2026
@github-actions

github-actions Bot commented Oct 29, 2026 •

Copy link
Copy Markdown
Contributor

📓 Docs Drift Check

This PR changes 2 package(s): @objectstack/metadata, @objectstack/spec, touching 1 documentable anchor(s). ⚠️ 3 changed file(s) yielded no anchor (packages/metadata/README.md, packages/metadata/ROADMAP.md, packages/spec/PLUGIN_STANDARDS.md), so the pages documenting them are NOT COVERED by this run — this is not a clean bill of health for those files.

⛔ 1 release-owned page(s) name something this change touched. These are read-only:

  • content/docs/releases/v12.mdx (via MetadataTypeSchema (symbol, a top-level const))

content/docs/releases/ is RELEASE-OWNED (AGENTS.md "Documentation Guardrails"): release
notes are written centrally at release time, and a code PR that edits them is the exact PR
that guardrail exists to stop. They are still audited — read-only. If one of them is actually
wrong, file an issue or open a dedicated docs-only PR; do not edit it here.

What this run could not see
  • 3 changed file(s) yielded no anchor (packages/metadata/README.md, packages/metadata/ROADMAP.md, packages/spec/PLUGIN_STANDARDS.md) — pages documenting those are invisible to this run
  • the SDK route bridge reached 58 of 210 client-bound route-ledger rows — the other 152 have no registrar path: tail to select them, so pages documenting THEIR client methods cannot appear above, on this or any run. Of those 152: 0 are remediable by widening that discovery convention (an in-repo file declares the path; the convention did not scan it); 55 are structural — on a ledger where NOT ONE row is declared in-repo, so no discovery change reaches them at any price; 97 are undecided (no in-repo declaration, on a ledger that has other in-repo registrars — absence and an unreadable spelling are not distinguishable here). The rows themselves: node scripts/docs-audit/affected-docs.mjs --bridge-coverage
  • 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 — 169 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 d4ff1a025fa4568505bfbc66a0f8cbeb3bab06ff → packageMentionDocs.

Which tree this was computed on

This run read content/docs from 0743ee49e8d97693ce74fc6a9b3f3f21d8800c13 — the merge of head de4e5ccabb981868b62389693e16af8c24e96e5f into base d4ff1a025fa4568505bfbc66a0f8cbeb3bab06ff, which is what actions/checkout gives a pull_request run. Not the PR head.

A worktree cut from an older main holds a different content/docs, so re-deriving there can legitimately return a different list — that is a different tree, not a wrong row. To answer on the same tree:

# while this PR is open — GitHub drops the merge commit once it closes
git fetch origin 0743ee49e8d97693ce74fc6a9b3f3f21d8800c13 && git checkout 0743ee49e8d97693ce74fc6a9b3f3f21d8800c13
# afterwards, rebuild it from the two parents, which stay fetchable
git fetch origin d4ff1a025fa4568505bfbc66a0f8cbeb3bab06ff de4e5ccabb981868b62389693e16af8c24e96e5f && git checkout -B drift-repro d4ff1a025fa4568505bfbc66a0f8cbeb3bab06ff && git merge --no-ff de4e5ccabb981868b62389693e16af8c24e96e5f

node scripts/docs-audit/affected-docs.mjs --json d4ff1a025fa4568505bfbc66a0f8cbeb3bab06ff

⚠️ That checkout carried uncommitted changes, so the commit above does not fully identify what was read.

Advisory only, and a precision-first one (#9192): a page is listed because it names a
symbol, wire route or SDK method this diff touched — not because it mentions a changed
package. Each row says which anchor put it there, so a wrong row is reportable rather than
merely annoying. To re-verify, run the docs-accuracy-audit workflow scoped to these files:
node scripts/docs-audit/affected-docs.mjs d4ff1a025fa4568505bfbc66a0f8cbeb3bab06ff → pass the list as
args.docs, on the commit named under Which tree this was computed on.

@objectstack-fleet

Copy link
Copy Markdown
Contributor Author

domain:skills#1 · marchtian · session_017ihL2dPRZXfgE1A2Vct3FU

Contract review

Served-tier: CONTRACT_REVIEW_TIER
Head-sha: 93c9b71f0e2794ab58bb647687753937d4ebef10
Local-runs: none
Scope: packages/spec/src/kernel/metadata-plugin.zod.ts, skills/objectstack-automation/SKILL.md, skills/objectstack-data/SKILL.md, skills/objectstack-data/references/data-hooks.md, skills/objectstack-data/rules/field-types.md, skills/objectstack-query/SKILL.md, skills/objectui/README.md, skills/objectui/guides/plugin-development.md, skills/objectui/guides/schema-expressions.md + packages/spec/src/data/hook.zod.ts (HookEvent), packages/spec/src/data/query.zod.ts (AggregationFunction), ui/packages/core/src/evaluator/FormulaFunctions.ts (registerDefaults), ui/packages/types/src/base.ts (ComponentInputControlType, ComponentMeta), ui/packages/core/src/registry/Registry.ts (RegistryComponentMetaExtras), the ui/packages/plugin-* directory listing, scripts/check-skills-token-ratchet.mjs, .changeset/27522-inventory-counts.md, .changeset/config.json (fixed group), packages/spec/package.json (files)

Reviewer: an independent agent at CONTRACT_REVIEW_TIER (not the drafter), fed the card, the PR and the check-runs only, adopted by the domain:skills#1 seat.

① Derived judgments

  • Governed surface, Tier H (eight skills/** paths); draft, no assignee. Face schema + rules ⇒ CONTRACT_REVIEW_TIER (the metadata-plugin.zod.ts hunk is one // comment inside the MetadataTypeSchema enum literal: no .describe(), no TSDoc, no export moved; nothing to regenerate).
  • Skills token ratchet, whole-file ceil(bytes/4): data/SKILL.md 6111→6106, rules/field-types.md 3151→3151, references/data-hooks.md 10066→10064, automation/SKILL.md 6454→6453, query/SKILL.md 4173→4172, objectui/README.md 729→728, schema-expressions.md 6571→6565, plugin-development.md 4184→4183; no file grows. (rules/field-types.md is +1 byte, equal tokens — the PR body's "equal bytes" is a nit.)
  • Clause-②: no, Metadata-protocol: none, both line-initial in the PR body and the changeset; patch.

② Semver level

patch is right. The frontmatter names only @objectstack/skills, while the diff also changes shipped bytes in @objectstack/spec (src/**/*.zod.ts ships), @objectstack/metadata, @object-ui/i18n, plugin-grid, components, fields, types, plugin-form, console (READMEs ship). All are in the fixed group, so the bump lands anyway; the omission costs their CHANGELOG lines. Should-fix (repo precedent 26080-readme-contributing-links.md, 26170-translation-data-comment-count.md).

③ Boundary flags

④ Design judgment

Per hits file, against the cited code on the head: metadata-plugin.zod.ts (the deleted "24 lifecycle events" was wrong — HookEvent declares eight); automation/SKILL.md (the four node tables are the enumeration); data/SKILL.md (each site still points at its source); data-hooks.md (the table lists exactly the eight HookEvent names; "Why so few?" keeps the argument); field-types.md (the tables enumerate); query/SKILL.md (the six names match AggregationFunction); objectui/README.md (the 18 names match the 18 ui/packages/plugin-* dirs); schema-expressions.md (30 names listed, 30 registered); plugin-development.md L95 (the eleven literals match ComponentInputControlType). Each holds: no deleted count carried information the remaining text does not reach; no sentence became false or ungrammatical; no gate-pinned, generated, release-note, ADR or dated site edited in hits; deletion only.

Should-fix, same file: skills/objectui/guides/plugin-development.md L85–87 "Sixteen keys in total: the eleven … plus the five …" — counts of the card's class in an edited hits file, neither deleted nor named as kept. A miss against the card's acceptance, not a wrong edit.

Must-fix: none.

Implemented-by: claude/project-thread-8lub6g
Reviewed-by: session_017ihL2dPRZXfgE1A2Vct3FU

VERDICT: PASS

…bilities pages, the releases page left to a docs-only PR, every shipping package in the changeset

The releases tree is release-owned, so its one count stays for a dedicated
docs-only PR. The changeset now names every package whose shipped bytes
the sweep touches.

Co-Authored-By: Claude <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017ihL2fNkBkNQ88EMzvcrPW
…pins against the locale packs

Co-Authored-By: Claude <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017ihL2fNkBkNQ88EMzvcrPW
@objectstack-fleet

Copy link
Copy Markdown
Contributor Author

domain:skills#1 · marchtian · session_017ihL2dPRZXfgE1A2Vct3FU

Contract review

Served-tier: CONTRACT_REVIEW_TIER
Head-sha: de4e5ccabb981868b62389693e16af8c24e96e5f
Local-runs: none
Scope: packages/spec/src/kernel/metadata-plugin.zod.ts, skills/objectstack-automation/SKILL.md, skills/objectstack-data/SKILL.md, skills/objectstack-data/references/data-hooks.md, skills/objectstack-data/rules/field-types.md, skills/objectstack-query/SKILL.md, skills/objectui/README.md, skills/objectui/guides/plugin-development.md, skills/objectui/guides/schema-expressions.md + packages/spec/src/api/error-catalog-docs.test.ts (the wire-count pin), ui/packages/i18n/src/tests/readme-locale-count-7989.test.ts and ui/packages/i18n/src/locales/registry.ts (BUILT_IN_LANGUAGE_CODES, the locale-count pin), .changeset/27522-inventory-counts.md, the nine named packages' package.json files lists, ui/packages/types/src/base.ts (ComponentMeta, ComponentInput), ui/packages/core/src/registry/Registry.ts (RegistryComponentMetaExtras)

Delta review: 93c9b71f to de4e5cca, two commits (b5dfb180, de4e5cca), seven files. The first-round record on 93c9b71f stands for everything the delta does not touch. The merge-base with origin/main is unchanged (aef631b8). The whole-PR delta vs main is now 40 files.

① Derived judgments

  • Hits files in the delta: two (skills/objectstack-query/SKILL.md, skills/objectui/guides/plugin-development.md). Both are deletion-only in the ratchet's unit: query/SKILL.md goes from 4172 to 4171 tokens, plugin-development.md from 4183 to 4178, with lines unchanged (403, 482). Right.

  • Governed surface unchanged: the PR is still Tier H on skills/**, still a draft, with no assignee. Governed Surface Queue Guard is green on the new head. Right.

  • Two card Inventory rows are gate-pinned:

    • content/docs/api/error-catalog.mdx pins 56 wire codes.
    • ui/packages/i18n/README.md pins 10 locales.

    The card's own rule keeps a pinned count, so restoring these two is the right reading of the card. The first head's Test Core (2/8) and Test UI (14/16) reds were those two pins firing. Nothing else in the first head's red set was this PR's: the Type Check lanes read cancelled, which fits the superseding push. Right.

  • content/docs/releases/implementation-status.mdx reverted: git diff aef631b8 de4e5cca -- content/docs/releases/ is empty. Right.

  • Changeset frontmatter widened to ten packages; the body gains one sentence naming them, and both declaration lines are unchanged. Right; see ②.

② Semver level

Clause-②: no · Metadata-protocol: none ⇒ patch, unchanged.

The frontmatter now names ten packages: @objectstack/skills, @objectstack/spec, @objectstack/metadata, @object-ui/i18n, plugin-grid, components, fields, types, plugin-form, console. For each of the nine added, two things were verified on the head:

  • private is unset in its package.json.
  • A path the diff changes is inside its files list. That path is src/**/*.zod.ts for spec and README.md for the other eight.

Left out, correctly:

  • @object-ui/app-shell: private, and the diff changes only two comments in it.
  • The src/** comment in @object-ui/i18n's zh.ts: not in files, and the package is named anyway because of its README.
  • packages/spec/PLUGIN_STANDARDS.md and packages/metadata/ROADMAP.md: not shipped, and their packages are named for other files.

The list is exactly the set of packages that publish a changed byte. Right.

③ Boundary flags

  • open_questions: empty.
  • Deviation 1 (two pushes, no force-with-lease) is the rule-abiding choice. Answered.
  • Deviation 2: the PR body still lists the error-catalog and i18n README rows under "taken". Should-fix for the seat on ACCEPT: move both rows to "Kept, by name" and name each pin.
  • out_of_scope_findings: implementation-status.mdx still says "14 lifecycle events" and is left for a docs-only PR. That is the right disposition under AGENTS.md's RELEASE-OWNED row. Answered. First-round item 3 is closed by the revert.
  • First-round items:
    • Items 1, 2 and 4 land in b5dfb180.
    • Item 3 is closed by the revert.
    • Item 5 is acknowledged.
    • Item 6 (optional) was not taken, which the ratchet permits.

④ Design judgment

This section covers only the delta in the hits files.

  • skills/objectui/guides/plugin-development.md
    • L85 to L87: the three numbers are gone. The pointers to ComponentMeta (base.ts) and to RegistryComponentMetaExtras stay, and the five extras names match the type on the head. Holds. Nit: "The keys in total:" is stilted residue of the deletion.
    • L101 to L102: "The writable keys" are followed by six names, which match the non-never keys of ComponentInput on the head. Holds.
  • skills/objectstack-query/SKILL.md L25: "the driver passthrough keys", followed by the six names. Holds.
  • Re-sweep of all nine hits files for a number before an inventory noun found two candidates, and neither is the card's class:
    • "Three renderer-side facts" (schema-expressions.md L324) counts its own three-item list, which is a named kept class.
    • The >= 3 packages comment in metadata-plugin.zod.ts L860 predates this PR and is not an inventory count.

Outside hits, read but not reviewed:

  • error-catalog.mdx L7 restores the pinned phrase in exactly the shape the test's regex reads. The unpinned "9 error categories" stays deleted.
  • ui/packages/i18n/README.md L1 to L10 are byte-identical to main.
  • content/docs/capabilities/index.mdx drops its two counts.
  • Nothing else moved.

Check-runs on de4e5cca at the reviewer's read: no failure. The Test Core and Test UI shards had not reported yet. The seat reads them before ACCEPT.

Implemented-by: claude/project-thread-8lub6g
Reviewed-by: session_017ihL2dPRZXfgE1A2Vct3FU

VERDICT: PASS

Should-fix (none blocks):

  1. PR body: move the error-catalog and i18n README rows to "Kept, by name" and name each pin test.
  2. plugin-development.md L85: tighten "The keys in total:" on the same line.
  3. Optional: error-catalog.mdx L7 names a repo test path on a customer-facing page; "(pinned by a test against the wire face)" says the same thing.

@objectstack-fleet

Copy link
Copy Markdown
Contributor Author

domain:skills#1 · marchtian · session_017ihL2dPRZXfgE1A2Vct3FU

席位核对 — ACCEPT · #27522 · head de4e5ccabb981868b62389693e16af8c24e96e5f · 2026-10-29T12:47Z

维护者速读

  • 改了什么:删掉没有门禁核对的手写清单计数,比如「49 field types」「8 lifecycle events」「26 built-in metadata types」「38 chart types」。范围是卡片清单表的各行,加上扩扫到的 skills、docs、examples、各包 README 和代码注释里的同类计数,共 40 个文件、+97/−83。枚举出来的名字都保留。packages/metadata/README.md 里那张错误的类型表(列着 trigger、validation 等不存在的类型)换成一句话,指向 DEFAULT_METADATA_TYPE_REGISTRY。

  • 为什么改:这些数字没有门禁对着目录核对,清单一动就错。例如 showcase 写 38 种图表,spec 只有 20 种;README 写 26 种元数据类型,spec 有 31 种。错的数字比没有数字更误导人类读者和 AI 作者。

  • 与 PR 描述不一致的两处(以本条为准): 卡片清单里有两行其实被测试锁定,按卡片规则「有门禁锁定的计数保留」,已经恢复。

    • content/docs/api/error-catalog.mdx 的「56 error codes reachable on the wire」,由 packages/spec/src/api/error-catalog-docs.test.ts 锁定。
    • ui/packages/i18n/README.md L3、L7 的「10 built-in locales」,由 ui/packages/i18n/src/__tests__/readme-locale-count-7989.test.ts 锁定。

    PR 描述里这两行仍写着已删,那是首个提交时的说法。按规程,PR 描述只在创建时写一次。

  • 风险与回滚:这是纯文档改动,范围是 README、changeset 和几处代码注释(packages/spec 一行 // 注释,ui/ 三个文件的注释),不改任何行为。changeset 是 patch,列出 10 个会发出改动字节的公开包。回滚即还原本 PR。

  • 先看:packages/metadata/README.md,skills/objectstack-data/references/data-hooks.md 里「Why so few?」那条说明,skills/objectui/guides/plugin-development.md L85–L102。

  • 两分钟验证:跑 node scripts/check-skills-token-ratchet.mjs,应该 exit 0,ratcheted (authored) 207834 / 217474。

  • 需要你做的:批准本 PR。它改了 skills/**,属于 Tier H。契约复核 PASS 在案:首轮记录 6496355366(93c9b71f),增量记录 6496637851(Head-sha: de4e5ccabb981868b62389693e16af8c24e96e5f)。批准后由本席落地。

席位意见:首轮复核提出的 should-fix 都已落实;增量复核没有 must-fix。剩下两条小瑕疵不影响合并,原样留着:plugin-development.md L85 的「The keys in total:」读着别扭;skills/objectstack-data/rules/field-types.md 多了 1 个字节,token 数不变。

席位核对

  1. Shape: 40 files, +97/−83, all in the claimed surface (claim 6495656923) plus the wider re-sweep the card asks for, each site named in the PR body. Tier H (skills/**); the domain:devx / server / spec / ui files enter through triage 6495060086's cross-domain path (one PR, claimed by this lane).
  2. Premise check:
    • The reviewer re-read every deleted count against its inventory source on the head: HookEvent, ComponentMeta / RegistryComponentMetaExtras / ComponentInput, MetadataTypeSchema, BUILT_IN_LANGUAGE_CODES, the wire face.
    • The skills ratchet is deletion-only: lines unchanged in every touched file, authored bundle 207857 → 207834 tokens.
  3. Gate check-runs on de4e5cca: 58 success, 7 skipped, none failed. check-expected-skips.mjs --pr 27542: OK, all 7 skips in main's roster. Mergeable clean.
  4. Accepted deviations:
    • The two gate-pinned rows are restored. That is the card's rule; the first head's Test Core (2/8) and Test UI (14/16) reds were those pins.
    • The PR body is stale on those two rows; this comment carries the correct reading. The relay refuses a body issue_patch whose first line is the attribution marker, and os-dev.md writes the body once.
    • readme-locale-count-7989.test.ts was NOT MEASURED locally (unbuilt closure); CI Test UI is green.
    • Two pushes, not force-with-lease, because the branch is not claude/issue-*.
  5. Out-of-scope dispositions:
    • (a) content/docs/releases/implementation-status.mdx "14 lifecycle events": reverted out of this PR because the file is RELEASE-OWNED (AGENTS.md); dropped from this PR and left for the next docs-only or release PR.
    • (b) Lowering CEILINGS rows to the new readings: dropped; it is optional, and the ratchet permits leaving it.
    • (c) The L85 wording nit and the field-types.md +1 byte nit: dropped; they are cosmetic and not worth a new head.
    • Skills-docs: n/a (Metadata-protocol: none).
  6. Serial constraint: open PR docs(data-modeling): the currency page — dynamic, fixed and record modes, the sibling code field, what a record-currency amount refuses #27475 edits skills/objectstack-data/rules/field-types.md at L181 only; this PR touches L9. The regions are disjoint, and GitHub reports clean against main now. Whichever PR lands second merges main if the queue asks.
  7. Landing clause: Tier H, so this goes to GOVERNED_APPROVERS (os-zhuang, hotlong) via pr_request_reviewers with this comment. needs-user-decision stays on the PR while it waits. After an APPROVED review with every check green, the seat will:

@os-zhuang
os-zhuang marked this pull request as ready for review October 29, 2026 12:50
@os-zhuang
os-zhuang added this pull request to the merge queue Oct 29, 2026
Merged via the queue into main with commit 72b08ee Oct 29, 2026
74 checks passed
@os-zhuang
os-zhuang deleted the claude/project-thread-8lub6g branch October 29, 2026 13:11
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/m tooling

Projects

None yet

2 participants