Skip to content

[finding] 已发布的 skills/objectstack-platform/SKILL.md 把能力词汇表的计数抄进散文(「all 28」「other eight」)而无任何门禁对账 —— #18694 一落地就同时变假,同形先例 #16853 已在另一个 skill 上修过 #18705

Closed

Description

@os-bill

⏱️ 本卡所有读数取自同一动作:2026-09-17T15:49Z。逐条本席第一手实测,亮控暗控写在读数旁边。

一句话

发布出去的 skills/objectstack-platform/SKILL.md 把平台能力词汇表的数量抄进了散文(「all 28」「the other eight」),而没有任何门禁把这个数对常量核 —— 在飞的 PR #18694 把词汇表带到 29,那两句当场变假。

实测

skills/objectstack-platform/SKILL.md(共 1223 行)
  :452  The other **eight** tokens in the vocabulary are **not** in that map and do not …
  :463  The authoritative list of all **28** is `PLATFORM_CAPABILITY_TOKENS`
         (`@objectstack/spec`, `kernel/platform-capabilities.ts`)

PR #18694(#18053 / 裁决 A′ item 1,已复核 PASS)把 token 数 28 → 29
  ⇒ 「all 28」与「other eight」在该 PR 落地的那一刻同时变假

没有门禁读它:

把 PLATFORM_CAPABILITY_TOKENS 引到的门禁面(scripts/ · packages/*/scripts/ · .github/)   0 个文件
⭐ 亮控 同一把 grep 在全树                                                              17 个文件
⭐ 暗控 伪造常量名                                                                        0

⛔ 为什么这不是落地阻塞,而是另立一卡

⭐ 决定性的一句就在同一节里::463 逐字把权威交给了常量本身 ——「The authoritative list of all 28 is PLATFORM_CAPABILITY_TOKENS」,并且下一句说未知 token 由 defineStack 在 authoring 时拒绝。⇒ 变假的是计数,⛔ 不是操作指令:照这节做事的人仍然被导向常量,而常量是对的。

而把它塞进 #18694 的代价是路线级的:那是手写的 skills/** 散文,⛔ 不是生成物,所以 #11705 生成物例外抬不起它 —— 一进 diff,一个本可普通队列落地的 PR 就变成受管四件套、留 draft 等维护者。

⇒ 用一个陈旧计数换掉一次干净落地是不划算的;而且它无门禁,下一次加 token 还会再假一次 —— 那才是本卡要治的东西。

⭐ 同形先例已经修过一次,修法是现成的

#16853(closed / completed)逐字:「skills/objectstack-ai/SKILL.md restates the platform-tool registry's counts and line ranges instead of citing it — three numbers go stale the moment PR #16844 lands」。它的修法落在 a256f18962,提交题目就是答案:「docs(skills): cite the platform-tool registry instead of restating it」。

⇒ 同一个缺陷类在另一个已发布 skill 上重现了。

建议的修法(⛔ 非裁定)

  • A(照先例):把两处计数改成引用而不是复述 —— 不写数字,写「PLATFORM_CAPABILITY_TOKENS 里除去下表所列的其余 token」。⭐ 代价最低,且一次修好永不再假。
  • B(加门禁):让某个门禁把 skills/** 里声明的计数对常量核。⚠️ 要先量误报:散文里的数字未必都是这个词汇表的。
  • C:A + B。A 治这一处,B 治「下一个把数字抄进散文的人」。

⚠️ 无论取哪条,skills/** 是受管面 ⇒ 承接它的 PR 按规矩留 draft 等维护者,⛔ 不走普通队列。这一点要写进那张卡的派发令,免得下一席以为它能照常入队。

顺带一条更硬的缺口,同一次复核升级上来的

marketplace 的 provider 行仍然指向 @objectstack/service-package。裁决 A′ 说「marketplace 只留目录/浏览那一半」,但把那一行重新指向谁,目前没有任何一方拥有:#18694 的面里没有它,#17676 的 items 2/3/5 按现文字也没写它。⇒ 「只留目录那一半」这句裁决目前执行在零个地方。

⛔ 本席不代 domain:engine 车道认领;记在这里,是因为下一个读 platform-capabilities 的人会同时撞上这两件事。

查重(MCP search_issues,含 closed,9 条命中逐条读过)

出处

domain:spec seat 2(座位贴 #18549)在 PR #18694 的隔离达档契约复核(记录 5717148298,VERDICT PASS)的 boundary flag 里接手;本席复测了计数、门禁面与先例,并把它与升级上来的 provider 行缺口一并记下。


Generated by Claude Code

Activity

  1. os-justin commented on Sep 17, 2026

    @os-justin
    Collaborator

    Claim: PM loop round 1
    Session: session_01Gqi43smmqjJ5sUrhfoPeKu
    Branch: claude/issue-18705-platform-skill-cites-the-registry
    Worktree: objectstack-issue-18705
    Domain: domain:skills
    Seat: domain:skills#1
    File surface: skills/objectstack-platform/SKILL.md only (published skills/**, governed, MANDATORY tier; token ratchet 12980 / 12984 — headroom 4 tokens; on origin/main 5941246b70 :452 「The other eight tokens in the vocabulary are not in that map…」 and :463 「The authoritative list of all 28 is PLATFORM_CAPABILITY_TOKENS」 copy the vocabulary's COUNTS into prose while no gate reconciles them against packages/spec/src/kernel/platform-capabilities.ts — the seat's grep of the gate surfaces for the constant name: 0 files (lit control across the tree: 17); PR #18694 (#18053, ruled A′ item 1) takes the vocabulary 28 → 29 and both sentences turn false the moment it lands — the same class #16853 fixed on skills/objectstack-ai/SKILL.md by a256f18962 「cite the platform-tool registry instead of restating it」); deliverable = the card's option A, the precedent's shape: the two counts become CITATIONS (「the remaining tokens in PLATFORM_CAPABILITY_TOKENS not in that map」 / 「the authoritative list is PLATFORM_CAPABILITY_TOKENS」 — no number in prose), the eight-token enumeration under :452 re-read against the constant at the tip and kept only as the list it is (names, not a count) — ⛔ no number that a registry change can falsify survives in the section; the token ratchet holds (a citation is shorter than a count — measure; ⛔ never a ceiling raise for this); ⛔ option B (a gate reconciling prose counts against constants) is NOT this card — name it in the report if the diff shows where such a gate would read; ⛔ the marketplace provider line the card's second section names is domain:engine's (#17676 / #18694), read, not touched; ⛔ #16767 (the example block's TypeScript range, same file) is read, not folded; a ## 维护者速读(草稿) in the PR body at creation (governed — the maintainer lands); governed published skill ⇒ draft, skip-changeset, the seat's four-piece, the maintainer lands
    Container & model: M(两处计数改引用 + 枚举对常量重读 + token 棘轮不动 + 速读草稿), mode:subagent, model: claude-fable-5-1 — node scripts/pm/dispatch-gates.mjs --tier --repo objectstack-ai/objectstack skills/objectstack-platform/SKILL.md at 2026-09-17T22:19Z on 8904880601: 「Model tier — MANDATORY: claude-fable-5-1 (derived from the file surface, not recalled)」; MANDATORY tier taken; the seat's contract-tier review at delivery
    Clause-②: no
    Thread-read: (no triage comment on the card — filed by the domain:spec seat 2 with its own dedupe of 9 hits; triage labels pm:queue · priority:p3 · domain:skills read at 2026-09-17T22:42Z)
    Serial constraints cleared: no open PR touches skills/objectstack-platform/SKILL.md (28 open PRs' file lists read at 2026-09-17T23:05Z); os-verify-lock.sh --status at 2026-09-17T23:17Z: state: lock is free; shared checkout at origin/main 5941246b70. Hot-file queue behind this card on this file: #16767 (not this lane's to fold). Slot: the one freed by #18811's delivery (PR #18827, four-piece next); #18806 and #18622 in flight. Total order at 2026-09-17T23:17Z: p1 — none free; p2 by age — #18536 (SKILL.md serial) · #18699 (behind PR #18725) · #18743 (SKILL.md serial) · #18744 (HELD) · #18755 (SKILL.md serial) · #18812 (os-dev.md serial); p3 — #18665 (SKILL.md serial) · #18686 (behind #18622) · this card · #18807 (behind PR #18824).
    Ruling-ref: 5717148298


    Generated by Claude Code

  2. os-justin commented on Sep 17, 2026

    @os-justin
    Collaborator

    os-dev-report

    {
      "issue": 18705,
      "status": "done",
      "branch": "claude/issue-18705-platform-skill-cites-the-registry",
      "pr": "https://github.com/objectstack-ai/objectstack/pull/18839",
      "head": "bef0dc6dfa3a8fe58ec7b0e07896a8725ed4b956",
      "files": [
        "skills/objectstack-platform/SKILL.md"
      ],
      "session": "session_01Gqi43smmqjJ5sUrhfoPeKu",
      "premise_still_valid": true,
      "summary": "Option A in the #16853 / PR #17259 shape: the two copied counts in the `requires:` section of the published `skills/objectstack-platform/SKILL.md` became citations — :452 「The other eight tokens in the vocabulary are **not** in that map and do not resolve through it:」 → 「The tokens in `PLATFORM_CAPABILITY_TOKENS` not in that map do not resolve through it:」, and :463 「The authoritative list of all 28 is `PLATFORM_CAPABILITY_TOKENS`」 → 「The authoritative list is `PLATFORM_CAPABILITY_TOKENS`」. The premise is stronger than the card: PR #18694 had already landed (2026-09-17T16:10Z), so on the branch point `5941246b70` the constant holds 29 tokens and the CLI map 20, i.e. nine not-in-map tokens — both numbers were already false. The enumeration under :452 was re-read against the constant: all eight names it lists are in `PLATFORM_CAPABILITY_TOKENS` and none is a `Serve.CAPABILITY_PROVIDERS` key, so no name dropped and none added (`package-registry`, the ninth, is deliberately not documented here per the card). Diff 3 insertions / 3 deletions, one file; no other sentence moves. Draft PR #18839 with `Fixes #18705`, `Clause-②: no`, `skip-changeset` (added via POST labels, read back), and a `## 维护者速读(草稿)` section with 席位意见 left blank; governed `skills/**`, the maintainer lands. Assignee on the card is empty (PM's field); the claim comment 5722490619 names this branch.",
      "measurements": {
        "tree": "origin/main 5941246b70 (BASE, the branch point; origin/main advanced 3 commits to c993b7c820 during the run, none touching the three files; merge-base still 5941246b70)",
        "PLATFORM_CAPABILITY_TOKENS": "29 (parsed frozen array literal in packages/spec/src/kernel/platform-capabilities.ts; PLATFORM_CAPABILITY_PROVIDERS has the same 29 keys)",
        "Serve.CAPABILITY_PROVIDERS": "20 top-level keys (packages/cli/src/commands/serve.ts :1863–:2009); the skill's :442 table names the same 20 as a set",
        "not_in_map": "9 — ai, ai-studio, i18n, ui, auth, hierarchy-security, ai-seat, governance (the eight the section lists) + package-registry",
        "all_28_true_on_tip": false,
        "other_eight_true_on_tip": false,
        "all_20_at_440_true_on_tip": true,
        "gate_surface_grep": "git grep -l PLATFORM_CAPABILITY_TOKENS over scripts/ packages/*/scripts/ .github/ → 0 files (exit 1); lit control whole tree → 18 files (exit 0; card read 17 pre-#18694 — .changeset/18053-package-registry-capability.md and content/docs/releases/v16.mdx are new); dark control forged name whole tree → 0 files (exit 1)",
        "token_ratchet": "before 51918 bytes = 12980 tokens / ceiling 12984 / headroom 4, exit 0 (at 5941246b70); after 51898 bytes = 12975 / 12984 / headroom 9, exit 0 (at bef0dc6dfa); no ceiling moved",
        "skills_readings": "file 1223 → 1223 lines, 12980 → 12975 tokens; package (ten skills/*/SKILL.md) 6145 → 6145 lines, 70695 → 70690 tokens; whole priced bundle 139987 → 139982 tokens"
      },
      "tests": "No package touched ⇒ no ① closure build, no ② package test/typecheck owed. ③/④: `node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack` from the worktree (change set from merge base 5941246b70, no hand-fed paths) → 23 commands; all 23 run at bef0dc6dfa, each exit captured redirect-then-$?, all exit 0: check-ci-filter-parity; check-closing-keyword-parity (+ --self-test); check-comment-mask-corpus; check-doc-route-spelling --advisory (+ --self-test); check-skills-token-ratchet (+ --self-test); spec check:skill-docs; check:agent-test-spelling; check:corpus-claim-drift; check:cross-package-test-inputs; check:doc-authoring; check:driver-memory-census; check:nul-bytes; check:pm-governed-merges; check:refd-timer-probe; check:role-word; check:skill-compatibility; check:skill-frame-sync; check:skill-identifier-liveness; check:watch-hint-literal; lint check:doc-formula-expressions. The last answered exit 3 (PREREQUISITE NOT MET) on the first run before any build; `pnpm --workspace-concurrency=2 --filter '@objectstack/lint...' build` under scripts/pm/os-verify-lock.sh (VERDICT command-exit 0, held 169s, waited 0s); second run exit 0 — the 0 is the second run. Reconciliation `dispatch-gates.mjs --ran ran.list` → `✓ dispatch-gates --ran: 23 derived famil(ies) accounted for — 23 run, 0 NOT-MEASURED (a DERIVED zero — all 23 recorded an exit code and none of them is 3)`, exit 0. Dispatch-named extra (not in the derivation): `pnpm check:pm-skill-id-lint` exit 0. Repo-wide `pnpm lint` (eslint . --no-inline-config) under the verify lock: VERDICT command-exit 0, held 88s, waited 65s (shared-box seconds), at bef0dc6dfa. Control-byte self-scan of the edited file: 0 hits. Pre-push hook: `check:commit-card-trailers` green (no card relation, no model identifier in the trailer pair). PR body self-check before POST: 0 angle brackets, 0 HTML comments, 0 model identifiers; stored body read back = sent body minus one trailing newline, one footer. Ablation: none — a prose citation has no runtime to ablate. CI on PR #18839: in_progress at report time (not waited on).",
      "mcp_calls": "0 — no MCP GitHub tool called; every GitHub read and write went through the REST proxy (curl with GITHUB_TOKEN)",
      "api_writes": "3 REST writes — POST /repos/objectstack-ai/objectstack/pulls (→ #18839, draft:true, 201); POST /repos/objectstack-ai/objectstack/issues/18839/labels {skip-changeset} (200, read back ['skip-changeset']); POST /repos/objectstack-ai/objectstack/issues/18705/comments (this os-dev-report). Plus 2 git pushes to the branch (empty-branch probe, then bef0dc6dfa). No PATCH on the PR body, no reviewer request, no assignee write.",
      "open_questions": [],
      "out_of_scope_findings": [
        "noted, not filed: :440 「— all 20 of its entries:」 is a third copied count in the same section (true on the tip: map = 20, table = same 20 names; same class as this card); it turns false when #17676's runtime half keys `package-registry` in Serve.CAPABILITY_PROVIDERS. Kept out by the dispatch's 「no other sentence moves」. 承接者: the seat (a patch round on PR #18839 — 「all 20 of its entries」 → 「its entries」 — pays for itself in tokens) or #17676's runtime-half PR, which must edit the :442 table anyway.",
        "noted, not filed: `package-registry` (in the vocabulary since #18694, no Serve.CAPABILITY_PROVIDERS row yet, inert under `objectstack serve` per the constant's own comment) is not documented in this section, so the not-in-map enumeration is one name short on the tip — incompleteness (漏列成员), not a wrong instruction; an author never writes it (always-on). Closes by itself when #17676's runtime half adds the CLI row (then the :442 table gains a line and the enumeration is complete again). 承接者: #17676 (open, domain:engine, pm:blocked); the card's 「#18694 / #18053's own text」 has no live holder — #18053 is done, #18694 landed without touching the skill.",
        "option B sentence for the seat (no code): the gate that already walks skills/** for this shape is scripts/check-skill-identifier-liveness.mjs Leg 2 (header: 「the missing row — a doc enumeration presented as exhaustive stopped growing when the schema did」); registering this section's enumeration (:442 table + the two bullets) against PLATFORM_CAPABILITY_TOKENS there would flag package-registry today; a prose COUNT like 「all 20」 is outside both legs (existence, not arithmetic), and check-skills-token-ratchet.mjs prices bytes, not claims.",
        "noted, not filed: this file's token ceiling could be lowered 12984 → 12975 (the ratchet script says lowering is encouraged) but that edits scripts/check-skills-token-ratchet.mjs, outside the one-file surface. 承接者: the seat, at its discretion.",
        "read, not touched: the `marketplace` provider line (:444 → @objectstack/service-package) matches Serve.CAPABILITY_PROVIDERS.marketplace.pkg at serve.ts :1958 on the tip; repointing it is #17676's engine lane. #16767 (example block's TypeScript range, same file) remains open, not folded."
      ]
    }

    Generated by Claude Code

  3. os-justin commented on Sep 18, 2026

    @os-justin
    Collaborator

    ACCEPT — in-seat contract-tier review of PR #18839 (head bef0dc6dfa, report 5722703866) by the skills seat, 2026-09-18T00:02Z. Verified against GitHub and a scratch worktree at the head, ⛔ not against the report:


    Generated by Claude Code

  4. os-justin commented on Sep 18, 2026

    @os-justin
    Collaborator

    LANDED — PR #18839 (#18705, governed published skills/objectstack-platform/SKILL.md: 「all 28」 and 「the other eight」 become citations of PLATFORM_CAPABILITY_TOKENS — the seat counted 29 on the head, both numbers already false since PR #18694; token ratchet 12980 → 12975 / 12984; MANDATORY tier) merged through the queue at 2026-09-18T02:19:31Z (merged_at), squash 96fdac21ee7182f52c1326fc1f29166231b3a8e8 (single parent f7e523136aa929fb077f4427200e5b622967e76b, an ancestor of origin/main). Governed surface (published skills/**): the seat's ACCEPT 5722897729 here, ## 维护者速读(终稿) 5722898097 on the PR, needs-user-decision + reviewers at 2026-09-18T00:02Z; os-zhuang APPROVED at 2026-09-18T01:16:57Z (review 5243139621 on the ACCEPT head bef0dc6dfa), marked ready and enqueued by hand at 2026-09-18T01:18:00Z; the seat stripped needs-user-decision at 2026-09-18T01:18:22Z per ruling C (--pair 18839 0, CI 40 / 15 skipped rostered, harness CURRENT at 88aa326deb). The card auto-closed completed at 2026-09-18T02:19:32Z on the PR's Fixes; pm:dispatched is stripped in the same act. Landing criterion per the seat's publication register: MERGED through the queue, read from merged_at. :440 「all 20 of its entries」 left as is (true today) — the next author of this file re-counts.


    Generated by Claude Code

  5. added a commit that references this issue on Sep 28, 2026
    96fdac2
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions