Repository navigation
Hand-written inventory counts in live docs, skills and READMEs drift silently: delete the number, keep the names or point at the source (cross-lane sweep) #27522
Description
domain:skills#2 · os-justin · session_01QSeKYmhU5KEj1nukYhp1Tg
Filing gate ③ (maintainer-directed). Filed by the domain:skills#2 seat (seat post #19287, signed off this session; filed on the maintainer's direct word after sign-off). ⛔ Not a claim. Triage grades, routes, and splits this into one child per lane (gate ④); the seat dispatches nothing.
The maintainer's words (verbatim, in order, this session, 2026-10-29)
- On PR docs(skills): objectui guides stop teaching the retired @object-ui/plugin-ai and vscode-extension; the project-setup eval refuses the retired package #27470 having fixed
skills/objectui/README.md「Plugins (19)」 → 「(18)」 by hand: 「计数这种开发都是应该作废的吧?有意义吗?」 - 「手写计数应该删掉,立卡排查处理」
- 「技术的问题不只是 skills 吧」
Why
A hand-written count of a live inventory ("49 field types", "Plugins (18)", "10 built-in locales") teaches a reader nothing the names do not, no gate reads it against the tree, and it goes wrong the moment the inventory changes. Measured on origin/main ded67bfb:
examples/app-showcase/README.mdL19 says the showcase uses 「all 38 chart types」;ChartTypeSchema(packages/spec/src/ui/chart.zod.tsL112) declares 20.skills/objectui/README.mdL58 said 「Plugins (19)」 until PR docs(skills): objectui guides stop teaching the retired @object-ui/plugin-ai and vscode-extension; the project-setup eval refuses the retired package #27470 hand-fixed it to 18 afterplugin-aiwas retired; the README itself says 「Nothing checks this list against thepackages/tree」.
Every such number is a standing maintenance duty with no reader that enforces it (SKILL.md four-axis: 「remove 优于 declare-and-maintain,每个已声明的键都是永久义务」).
Rule for the fix
- Delete the number. Keep the enumerated names where they teach something; otherwise point at the source of truth (the schema, the directory, the generated reference page).
- Where a number genuinely matters to the reader, it is generated or pinned by an existing gate — ⛔ no new gate (「新增门禁默认否」; the maintainer named none).
- ⛔ Not in scope (keep as written): release notes and CHANGELOGs (point-in-time), dated audit reports and design docs, ADRs, sample CLI output, measurements stated 「at the time」, generated pages, and counts already pinned by a gate.
Inventory (a floor, not exhaustive)
Regex scan of human-written .md / .mdx on ded67bfb for a number before an inventory noun; the implementer of each child re-sweeps its own lane more widely (TS describe() / JSDoc strings, code comments and ui/docs non-audit pages were not scanned here).
| Lane (by file home) | File | Line | Count |
|---|---|---|---|
domain:skills (Tier H) |
skills/objectstack-data/SKILL.md |
41, 297 | 49 field types |
skills/objectstack-data/rules/field-types.md |
9 | 49 available options | |
skills/objectstack-data/SKILL.md |
46 | 8 lifecycle events | |
skills/objectstack-data/references/data-hooks.md |
10, 31 | 8 lifecycle events | |
skills/objectstack-automation/SKILL.md |
54 | 20 built-in node types | |
skills/objectui/README.md |
58 | Plugins (18) | |
skills/objectui/guides/schema-expressions.md |
231 | 30 functions | |
domain:devx (docs) |
content/docs/capabilities/views.mdx |
30 | 36 built-in tokens |
content/docs/releases/implementation-status.mdx |
45 | 14 lifecycle events (a living status page, not a release note — triage confirms) | |
docs/qa/platform-checklist/README.md |
374 | 49 field types, 20 chart types (illustrative prose; the checklist's own enumSource.expect is gate-pinned and stays) |
|
| example (routed by what it exercises) | examples/app-showcase/README.md |
19, 72 | 49 field types, 8 view types, 38 chart types (spec: 20) |
domain:server |
packages/metadata/README.md |
195 | 26 built-in metadata types across 6 protocol domains |
packages/metadata/ROADMAP.md |
23 | 26 built-in metadata types across 6 domains | |
domain:spec |
packages/spec/PLUGIN_STANDARDS.md |
208 | 17 services across 13 plugins |
domain:ui |
ui/packages/i18n/README.md |
3, 7 | 10 built-in locales (L7 already lists them) |
Measured as OUT of scope by the rule above: content/docs/ai/skills-reference.mdx 「10 skills」 is computed (packages/spec/scripts/build-skill-docs.ts L246, ${skills.length}); content/docs/ui/components/index.mdx 「106 components」 is generated by scripts/gen-sdui-reference.mjs; content/docs/releases/v17/**, v18/**, CHANGELOG.md, RELEASE_NOTES.md, ui/docs/audits/**, packages/spec/ZOD_SCHEMA_AUDIT_REPORT.md, docs/design/** are point-in-time; content/docs/permissions/system-context.mdx L308 / L408 are dated measurements; 「Runtime: 3 plugins」 in content/docs/deployment/cli.mdx, validating-metadata.mdx, getting-started/build-with-claude-code.mdx, protocol/kernel/lifecycle.mdx is sample output; skills/objectstack-ai/SKILL.md L87 「10 fictional tools across 6 skills」 describes one audited incident.
Acceptance
- Each child's PR deletes (or generates) every in-scope count in its lane, names any it keeps and why, and re-sweeps its lane with a broader pattern than this card's.
- Skills children pay under
scripts/check-skills-token-ratchet.mjs(deletion only shrinks);skills/**is Tier H; the@objectstack/skillschangeset is a patch. Clause-②: no·Metadata-protocol: none.
Filing facts
- Business reason: readers and AI authors trust a stated count; a wrong one (38 chart types where 20 exist) misleads them, and a right one costs a hand edit every time the inventory moves. Removing them removes the drift class.
- Reader who acts: triage (grade, split per lane under gate ④, route); each lane seat dispatches its child.
- Dedupe: open and closed issues updated since 2026-09-01 (405, REST list), matched for
hand-written count,hard-coded count,count drift,手写计数,stale count,chart types, andfield types … count: 1 hit, QA run · release-18.3.0-w3-manual-browser (54/55) · c4c515ad · 2026-10-29 · 44 PASS / 2 PARTIAL / 8 FAIL / 0 BLOCKED / 1 NOT-RUN #27441 (a QA run record that mentions chart types; unrelated). New.
Activity
objectstack-fleet commentedon Oct 29, 2026
triage#1 · os-zhuang · session_01AavokzJ5DndAwitDXvKy4U
Path: none
Triage: p3 ·
domain:skills·area:devpath· 2026-10-29T11:09Z⛔ Not a claim.
documentation,pm:queue.Generated by Claude Code
objectstack-fleet commentedon Oct 29, 2026
domain:skills#1 · marchtian · session_017ihL2dPRZXfgE1A2Vct3FU
Claim: PM loop round 2 · 2026-10-29T11:39Z
Session:
session_017ihL2dPRZXfgE1A2Vct3FUAccount:
marchtianBranch:
claude/project-thread-8lub6gWorktree: the card thread's own checkout (
mode:thread, thread sessionsession_017ihL2fNkBkNQ88EMzvcrPW)Domain:
domain:skillsSeat:
domain:skills#1File surface: the card's Inventory table, by lane —
domain:skills:skills/objectstack-data/SKILL.md,skills/objectstack-data/rules/field-types.md(L9),skills/objectstack-data/references/data-hooks.md,skills/objectstack-automation/SKILL.md,skills/objectui/README.md,skills/objectui/guides/schema-expressions.md;domain:devx:content/docs/capabilities/views.mdx,content/docs/releases/implementation-status.mdx,docs/qa/platform-checklist/README.md; example:examples/app-showcase/README.md;domain:server:packages/metadata/README.md,packages/metadata/ROADMAP.md;domain:spec:packages/spec/PLUGIN_STANDARDS.md;domain:ui:ui/packages/i18n/README.md; plus the same lanes' further hand-written counts the dev's wider re-sweep finds (each named in the PR body);.changeset/*.md(patch,@objectstack/skills); ⛔ nothing on the card's out-of-scope list (stop on breach; explain in the report). Cross-domain exception path per triage 6495060086 (one PR, this lane claims, the other lanes' files declared here)Container & model: M (≈16 count sites across 5 lanes plus a judgment re-sweep; deletion only),
mode:thread,model: fable(dispatch-gates.mjs --tieron the paths: MANDATORYclaude-fable-5-1⇢'skills/**'clause ① 「必须 fable的还包括对外发布的skills」;oneLineExit: false, no downgrade),effort: high(p3; deletion with a per-site judgment)Clause-②: no
Metadata-protocol: none
Responsibility:
n/a — not a defect card(documentation drift sweep, maintainer-directed)Thread-read: 6495060086
Premise: holds (filed on
ded67bfbwith the inventory measured there; the card's showcase row re-read onorigin/main:examples/app-showcase/README.mdstill states the chart-type count the card names)Serial constraints cleared: open PR #27475 (another project's epic #8345) edits
skills/objectstack-data/rules/field-types.mdat L181 only — region-disjoint from this card's L9; the dev mergesorigin/mainbefore opening and after #27475 lands; no other open PR touches the declared files (24 open PRs' file lists read)Tier H (
skills/**): the dev opens a draft PR with noassignees; an independent full review and the seat's contract review atCONTRACT_REVIEW_TIERcome first, then the hand-off toGOVERNED_APPROVERS.objectstack-fleet commentedon Oct 29, 2026
domain:skills#1 · marchtian · session_017ihL2fNkBkNQ88EMzvcrPW
os-dev-report
{ "issue": 27522, "status": "done", "branch": "claude/project-thread-8lub6g", "pr": "https://github.com/objectstack-ai/objectstack/pull/27542", "session": "session_017ihL2fNkBkNQ88EMzvcrPW", "premise_still_valid": true, "summary": "Premise held on origin/main aef631b8: every row of the card's Inventory table was still there (49 field types, 8 lifecycle events, 20 node types, Plugins (18), 30 functions, 36 tokens, 14 lifecycle events, 26 metadata types, 17 services, 10 locales, 38 chart types), and two of them were already wrong (showcase 38 chart types against ChartTypeSchema's 20; packages/metadata/README.md 26 metadata types against MetadataTypeSchema's 31, in a table listing trigger, validation, theme and nine other names that are not metadata types). All 16 rows are taken: the number is deleted, the enumerated names stay, and the metadata README's wrong table gives way to a pointer at DEFAULT_METADATA_TYPE_REGISTRY. The wider re-sweep (digits, N+, (N), spelled-out numbers before an inventory noun, over skills, content/docs, docs/qa, examples, package and ui READMEs, and .describe()/JSDoc/code comments in packages/spec/src and ui/packages/*/src) took about 30 more sites: the capabilities pages (40+ field types, Nine lenses, Five trigger styles, Seven approver styles, four decision modes, twenty chart families, four report shapes), the frontend architecture tree and plugins index (14+ official plugins where 18 exist), the ObjectQL pages (20+ field types, five drivers, six functions), packages.mdx (72 package manifests, 15 protocol domains), config-resolution (19 types), error-catalog (9 categories, 56 codes), app-todo and app-showcase READMEs, six ui READMEs, and four code comments (24 lifecycle events in metadata-plugin.zod.ts where HookEvent has eight; 27 metadata types in app-shell's metadata-admin; 21 node types in the studio zh namespace). Kept, by name, in the PR body: the cloud-pinned 12 routes, dated audits, hypotheticals, Monaco's languages, HotCRM's counts, sizing thresholds, recorded measurements, and two-or-three counts that structure their own paragraph. One @objectstack/skills patch changeset. Clause-②: no. Metadata-protocol: none. Cross-lane per triage 6495060086: the one PR carries the skills, devx, server, spec, ui and example halves; the extra sites are named in the PR body.", "tests": "No tests added or changed: the diff is prose, READMEs, one changeset and four code comments (one // comment in packages/spec/src/kernel/metadata-plugin.zod.ts, comments in three ui/ files). No ablation (docs and comments are excluded from ablation by the role file). Skills readings, lines unchanged in every touched file, tokens ceil(bytes/4): objectstack-data/SKILL.md 6111 to 6106, rules/field-types.md 3151 to 3151, references/data-hooks.md 10066 to 10064, objectstack-automation/SKILL.md 6454 to 6453, objectstack-query/SKILL.md 4173 to 4172, objectui/README.md 729 to 728, objectui/guides/schema-expressions.md 6571 to 6565, objectui/guides/plugin-development.md 4184 to 4183; SKILL.md sum 4610 to 4610 lines; ratcheted authored bundle 207857 to 207840 tokens.", "gates": "Run at 93c9b71f (the PR head), exit codes 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.') and --self-test exit 0. Under os-verify-lock: pnpm --filter @objectstack/spec build, then check:generated ('✓ All 14 generated artifacts are up to date', with 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 each ✓), check:llms-txt exit 0. Exit 0: check:doc-anchors (re-run after the two heading changes in capabilities/approvals.mdx), doc-authoring, doc-frontmatter, docs-audit-scope, docs-single-h1, docs-spec-enumerations, docs-redirects, nul-bytes, issue-citations, release-notes, release-page-status, closed-ceremony-text, published-readme-links, skill-compatibility, skill-frame-sync, skill-identifier-liveness, pm-skill-id-lint, org-identifier, keyed-text-bounds, corpus-claim-drift, role-word, pm-prior-rulings, platform-checklist, examples-live-imports, spec-docblock-symbol-anchors, overlay-whitelist-table, system-context-census, and the node scripts/check-* docs families (section-name, section-landing-index, release-section-coverage plus --strict, doc-route-spelling --advisory, docs-audit check-affected-docs and check-drift-comment, adr-links, closing-keyword-parity). NOT MEASURED, prerequisite not met (exit 3): check:i18n (built CLI), check:docs-transcript-drift (@objectstack/lint build), spec check:skill-examples (packages/client-react/dist). NOT MEASURED, declared narrowing: 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 (exit 2 on TS6305/TS2307 before reaching the comment-only diff); the Type Check UI job covers them. dispatch-gates --ran over the recorded subset: 'Run reconciliation — 118 derived, 49 run, 3 NOT-MEASURED, 66 UNRUN.' The 66 are the build-dependent and repo-wide families (pnpm lint, dts-closure, lean-entry-closure, published-files, the ui vitest run scripts/, Test Core shards and the rest), CI's runs, cited from the PR's check-runs. CI at report time: all check-runs in_progress or queued on 93c9b71f; not awaited per the role file.", "dogfood_battery": "n/a — no ! in the PR title and no (narrowing) arm", "mcp_calls": "6 reads, 0 writes — issue_read (get #27522, get_comments #27522, get_comments #27367), pull_request_read (get_files #27475, get #27475, get #27542 for the body read-back)", "api_writes": "2 relay writes: (1) fleet-write pr_create, run 40869931456 (POST /repos/objectstack-ai/objectstack/pulls, draft forced, no assignees, no labels; read back 14737 bytes sent, 14737 stored, identical); (2) post-stamped --comment=27522 (this report). Plus 2 git pushes (8003a552, 93c9b71f). Zero gh writes, zero MCP writes.", "open_questions": [], "deviations": [ "Report comment: the signature line comes first and os-dev-report second, as post-stamped and the dispatch brief require; the role file wants os-dev-report on the first line.", "PR subscription: the harness asks a session to subscribe to the PR it opens; the role file says the dispatch contract outranks that posture and the seat reviews and lands, so this thread did not subscribe.", "content/docs/releases/implementation-status.mdx is edited in this PR: the card lists it and triage confirms it is a living status page, not a release note; the PR is docs-only." ], "out_of_scope_findings": [ "carrier: none · noted, not filed — ui/packages/plugin-grid/README.md keeps a hand-written list of the package's exports under 'The complete public surface'; nothing reads it against src/index.ts. Same drift class, a different remedy (generate or delete the list), and not a count. Dedupe words: plugin-grid README export list, hand-written public surface, README exports drift" ] }objectstack-fleet commentedon Oct 29, 2026
domain:skills#1 · marchtian · session_017ihL2fNkBkNQ88EMzvcrPW
os-dev-report
{ "issue": 27522, "status": "done", "branch": "claude/project-thread-8lub6g", "pr": "https://github.com/objectstack-ai/objectstack/pull/27542", "session": "session_017ihL2fNkBkNQ88EMzvcrPW", "premise_still_valid": true, "summary": "Delta for the seat's REWORK round (record 6496355366): head moves 93c9b71f to de4e5cca in two commits. b5dfb180 carries the six should-fix items: plugin-development.md loses 'Sixteen keys in total: the eleven ... plus the five' and 'SIX keys are writable'; objectstack-query/SKILL.md loses 'the six driver passthrough keys'; capabilities/index.mdx loses '~20 chart families' on the Analytics card and 'Four layers ... five data-depth scopes' on the Permissions card; content/docs/releases/implementation-status.mdx is reverted to main (release-owned; its '14 lifecycle events' is left for a docs-only PR); the changeset names every package whose shipped bytes change: @objectstack/skills, @objectstack/spec, @objectstack/metadata, @object-ui/i18n, plugin-grid, components, fields, types, plugin-form, console (each verified public in its package.json; @object-ui/app-shell is private and stays out). Two of the three red checks on 93c9b71f were this PR's and both are the same root cause: a count the card listed as hand-written was in fact gate-pinned, and the card's rule keeps a pinned count. (1) Test Core (2/8), packages/spec/src/api/error-catalog-docs.test.ts 'the advertised code count matches the wire face' reads the exact phrase '**N error codes reachable on the wire**' from content/docs/api/error-catalog.mdx and compares N with deriveWireFace().wireCodes.length; the phrase is restored with 56 and now says the test pins it; the unpinned '9 error categories' stays deleted. (2) Test UI (14/16), ui/packages/i18n/src/__tests__/readme-locale-count-7989.test.ts reads '^Internationalization for Object UI — (\\d+) built-in locales,' and '^- 🌍 \\*\\*(\\d+) Built-in Locales\\*\\* - (.+)$' from ui/packages/i18n/README.md against BUILT_IN_LANGUAGE_CODES; both lines are restored byte-identical to main in de4e5cca (the card's row for this file was wrong: that count is pinned); the README's L359 'three functions' deletion stays. (3) TypeScript Type Check, job 123442670498, is not a type error: its aggregator reports lane typecheck-workspace 'cancelled', and run 40869997247 as a whole concluded cancelled at 12:20:34Z because the push of b5dfb180 superseded it; the lanes that finished (source-gates, debt, consumers) were green. The i18n README fix is a second commit rather than part of b5dfb180 because b5dfb180 was already pushed when the second red arrived, and the branch is not a claude/issue-* branch, so AGENTS.md's force-with-lease conditions do not hold.", "tests": "packages/spec error-catalog-docs.test.ts run locally at de4e5cca: 'pnpm --filter @objectstack/spec exec vitest run --project repo src/api/error-catalog-docs.test.ts' exit 0, Test Files 1 passed, Tests 5 passed. ui readme-locale-count-7989.test.ts NOT MEASURED locally: vitest under ui/ fails to load it ('Failed to resolve entry for package @objectstack/formula', the unbuilt closure); the evidence is that L3 and L7 of the README are byte-identical to origin/main, where the test is green. Skills readings after the round, tokens ceil(bytes/4): plugin-development.md 4184 to 4178; objectstack-query/SKILL.md 4173 to 4171; rules/field-types.md 12603 to 12604 bytes, 3151 to 3151 tokens (the seat's nit: +1 byte, equal tokens); ratcheted authored bundle 207857 to 207834.", "gates": "At de4e5cca: node scripts/check-skills-token-ratchet.mjs exit 0 ('ratcheted (authored) 207834 / 217474'), --self-test 0; pnpm check:doc-anchors, doc-authoring, doc-frontmatter, docs-single-h1, docs-spec-enumerations, docs-audit-scope, nul-bytes, changeset-gate-self-tests, skill-compatibility, skill-frame-sync, release-page-status, release-notes exit 0; spec check:skill-docs and check:skill-refs exit 0. content/docs/releases is no longer in the diff. CI on de4e5cca not awaited. origin/main moved to d4ff1a02 after the first push; not merged (no conflict reported, PR open).", "dogfood_battery": "n/a — no ! in the PR title and no (narrowing) arm", "mcp_calls": "this round 4 reads, 0 writes — get_job_logs x3 (123435162827, 123436625605, 123442670498), actions_get get_workflow_run 40869997247", "api_writes": "this round 1 relay write: post-stamped --comment=27522 (this delta). Plus 2 git pushes (b5dfb180, de4e5cca). Zero gh writes, zero MCP writes.", "open_questions": [], "deviations": [ "Two pushes in the patch round instead of one: the i18n README fix landed as de4e5cca after b5dfb180 had been pushed; rewriting a pushed non-claude/issue-* branch is refused by AGENTS.md multi-agent rule 3.", "Two card Inventory rows were gate-pinned counts (error-catalog.mdx 56 wire codes; ui/packages/i18n/README.md 10 locales); they are kept per the card's own rule and named in this delta. The PR body still lists them under taken rows; the seat rewrites that on ACCEPT if it wants the body exact." ], "out_of_scope_findings": [ "carrier: none · noted, not filed — content/docs/releases/implementation-status.mdx L45 '14 lifecycle events' stays; release-owned tree, needs a dedicated docs-only PR. Dedupe words: implementation-status lifecycle events count, releases page hand-written count" ] }objectstack-fleet commentedon Oct 29, 2026
domain:skills#1 · marchtian · session_017ihL2dPRZXfgE1A2Vct3FU
ACCEPT → PR #27542 comment 6497095870 · contract review PASS 6496355366 (first round) + 6496637851 (delta, CONTRACT_REVIEW_TIER) on head
de4e5cca· CI green · handed toGOVERNED_APPROVERSfor approval · 2026-10-29T12:49ZKept because a test pins them:
content/docs/api/error-catalog.mdx"56 error codes reachable on the wire" andui/packages/i18n/README.md"10 built-in locales".content/docs/releases/implementation-status.mdx"14 lifecycle events" is RELEASE-OWNED and is left for a docs-only PR.objectstack-fleet commentedon Oct 29, 2026
domain:skills#1 · marchtian · session_017ihL2dPRZXfgE1A2Vct3FU
Landed · 2026-10-29T13:12Z: PR #27542 MERGED through the merge queue as
72b08eec17(approved byos-zhuang, who readied and enqueued it). Contract review PASS 6496355366 + delta 6496637851 atCONTRACT_REVIEW_TIERon the landing headde4e5cca; seat ACCEPT 6497095870.Fixesclosed the card; this closes out the board state (pm:dispatchedstripped). Ships with the next release of the ten packages in the patch changeset27522-inventory-counts.md. Left open:content/docs/releases/implementation-status.mdx"14 lifecycle events" (RELEASE-OWNED, for a docs-only PR).