Skip to content

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

Closed

Description

@objectstack-fleet

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)

  1. 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: 「计数这种开发都是应该作废的吧?有意义吗?」
  2. 「手写计数应该删掉,立卡排查处理」
  3. 「技术的问题不只是 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:

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/skills changeset 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, and field 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

  1. objectstack-fleet commented on Oct 29, 2026

    @objectstack-fleet
    ContributorAuthor

    triage#1 · os-zhuang · session_01AavokzJ5DndAwitDXvKy4U

    Path: none

    Triage: p3 · domain:skills · area:devpath · 2026-10-29T11:09Z

    ⛔ Not a claim.

    • Read fresh. Hand-written inventory counts in skills, docs, READMEs and package docs drift silently (showcase claims 38 chart types, spec has 20); documentation-only, p3; spans skills, devx, server, spec and ui, so triage splits one child per lane.
    • 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 is added.
    • Cross-domain: one PR carries both halves, the lane named here claims it, and the claim declares the other lane's files (SKILL.md 跨域例外路径). Run the in-flight intersection check before the push.
    • documentation, pm:queue.

    Generated by Claude Code

  2. objectstack-fleet commented on Oct 29, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:skills#1 · marchtian · session_017ihL2dPRZXfgE1A2Vct3FU

    Claim: PM loop round 2 · 2026-10-29T11:39Z
    Session: session_017ihL2dPRZXfgE1A2Vct3FU
    Account: marchtian
    Branch: claude/project-thread-8lub6g
    Worktree: the card thread's own checkout (mode:thread, thread session session_017ihL2fNkBkNQ88EMzvcrPW)
    Domain: domain:skills
    Seat: domain:skills#1
    File 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 --tier on the paths: MANDATORY claude-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 ded67bfb with the inventory measured there; the card's showcase row re-read on origin/main: examples/app-showcase/README.md still 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.md at L181 only — region-disjoint from this card's L9; the dev merges origin/main before 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 no assignees; an independent full review and the seat's contract review at CONTRACT_REVIEW_TIER come first, then the hand-off to GOVERNED_APPROVERS.

  3. objectstack-fleet commented on Oct 29, 2026

    @objectstack-fleet
    ContributorAuthor

    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"
      ]
    }
  4. objectstack-fleet commented on Oct 29, 2026

    @objectstack-fleet
    ContributorAuthor

    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"
      ]
    }
  5. objectstack-fleet commented on Oct 29, 2026

    @objectstack-fleet
    ContributorAuthor

    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 to GOVERNED_APPROVERS for approval · 2026-10-29T12:49Z

    Kept because a test pins them: content/docs/api/error-catalog.mdx "56 error codes reachable on the wire" and ui/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.

  6. objectstack-fleet commented on Oct 29, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:skills#1 · marchtian · session_017ihL2dPRZXfgE1A2Vct3FU

    Landed · 2026-10-29T13:12Z: PR #27542 MERGED through the merge queue as 72b08eec17 (approved by os-zhuang, who readied and enqueued it). Contract review PASS 6496355366 + delta 6496637851 at CONTRACT_REVIEW_TIER on the landing head de4e5cca; seat ACCEPT 6497095870. Fixes closed the card; this closes out the board state (pm:dispatched stripped). Ships with the next release of the ten packages in the patch changeset 27522-inventory-counts.md. Left open: content/docs/releases/implementation-status.mdx "14 lifecycle events" (RELEASE-OWNED, for a docs-only PR).

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

area:devpathThe road — create, dev, verify, publish/install, connect an agent, iteratedocumentationImprovements or additions to documentationdomain:skillspriority:p3

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions