Repository navigation
[finding] 已发布的 skills/objectstack-platform/SKILL.md 把能力词汇表的计数抄进散文(「all 28」「other eight」)而无任何门禁对账 —— #18694 一落地就同时变假,同形先例 #16853 已在另一个 skill 上修过 #18705
Description
⏱️ 本卡所有读数取自同一动作: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 条命中逐条读过)
- 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, and one citation is already stale #16853(closed/completed)—— 同形先例,不是孪生:同一个缺陷类,另一个 skill、另一个注册表,且已修完。本卡因它而更可信,⛔ 不因它而重复。
- [finding]
check:scaffold-emission-policypins the bundled template's TypeScript range but not the publishedobjectstack-platformskill's example block — the carrier that drifted longest is the one no gate reads #16767(open)「check:scaffold-emission-policypins the bundled template's TypeScript range but not the publishedobjectstack-platformskill's example block — the carrier that drifted longest is the one no gate reads」—— 同一个文件、同一句「无门禁」,但治的是示例块里的版本范围,⛔ 不是能力词汇表的计数。⚠️ 若维护者要把两者并成一张「发布 skill 的数字碎片无人对账」的卡,那是合理的,⛔ 本席不代并。 - 其余 7 条(Delete the published skills/objectstack-pm-dispatch skill — a stale three-state copy of the internal PM protocol with no known consumer, shipped into every new app — and retire its catalog row, docs page, frame-sync copy, tier-table entry, ratchet pins and gate fixtures (maintainer ruling 2026-09-10) #17311 · Gate candidate: named-identifier liveness check over skills/** — a skill row citing a schema/field that greps to zero repo-wide is a red, not a sentence #13678 · $exists docs and two PUBLISHED skills still teach key-presence — false since the has-value alignment landed, and no gate can catch it because the teaching corpus does not execute #13539 · skills: evaluate whether the published security/platform guidance must teach the app-capability vs system-permission distinction and the
isDefault→everyonebinding rule (after #17189) #17359 · [finding]content/docs/protocol/kernel/plugin-spec.mdxstill printstypescript: ^5.0.0in its package.json example — a floor below the one the scaffolders emit and two doc pages state #16756 · The retired-key migrate-sentence pin scans ONE markdown file, so the withdrawn "rewrite it automatically" claim reached the published catalog unseen #13859 等)逐条读过,⛔ 无重叠。
出处
domain:spec seat 2(座位贴 #18549)在 PR #18694 的隔离达档契约复核(记录 5717148298,VERDICT PASS)的 boundary flag 里接手;本席复测了计数、门禁面与先例,并把它与升级上来的 provider 行缺口一并记下。
Generated by Claude Code
Activity
os-justin commentedon Sep 17, 2026
Claim: PM loop round 1
Session:
session_01Gqi43smmqjJ5sUrhfoPeKuBranch:
claude/issue-18705-platform-skill-cites-the-registryWorktree:
objectstack-issue-18705Domain:
domain:skillsSeat:
domain:skills#1File surface:
skills/objectstack-platform/SKILL.mdonly (publishedskills/**, governed, MANDATORY tier; token ratchet 12980 / 12984 — headroom 4 tokens; onorigin/main5941246b70:452 「The other eight tokens in the vocabulary are not in that map…」 and :463 「The authoritative list of all 28 isPLATFORM_CAPABILITY_TOKENS」 copy the vocabulary's COUNTS into prose while no gate reconciles them againstpackages/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 onskills/objectstack-ai/SKILL.mdbya256f18962「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 inPLATFORM_CAPABILITY_TOKENSnot in that map」 / 「the authoritative list isPLATFORM_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; ⛔ themarketplaceprovider line the card's second section names isdomain: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 landsContainer & 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.mdat 2026-09-17T22:19Z on8904880601: 「Model tier — MANDATORY: claude-fable-5-1 (derived from the file surface, not recalled)」; MANDATORY tier taken; the seat's contract-tier review at deliveryClause-②: no
Thread-read: (no triage comment on the card — filed by the
domain:specseat 2 with its own dedupe of 9 hits; triage labelspm:queue·priority:p3·domain:skillsread 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 --statusat 2026-09-17T23:17Z: state: lock is free; shared checkout atorigin/main5941246b70. 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
os-justin commentedon Sep 17, 2026
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
os-justin commentedon Sep 18, 2026
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:skills/objectstack-platform/SKILL.md;skip-changesetcorrect (a published skill file, shipped by no package'sfiles[]);Clause-②: noon the PR body and the claim,check-clause2-carriers --pair 188390 (seat's run);check-governed-merges --pr 18839GOVERNED (skills/**×1) ⇒ four-piece, the maintainer lands. No other sentence in the file moves (1223 lines before and after); themarketplaceprovider line (:444) and [finding]check:scaffold-emission-policypins the bundled template's TypeScript range but not the publishedobjectstack-platformskill's example block — the carrier that drifted longest is the one no gate reads #16767's example block untouched.PLATFORM_CAPABILITY_TOKENSat the head — the seat counted the array literal's entries: 29 (… marketplace package-registry email …), matching the dev's parse;Serve.CAPABILITY_PROVIDERS20 keys and the skill's :442 table the same 20 (dev's reading); so 「all 28」 and 「the other eight」 were ALREADY false on the tip — PR spec/kernel: carve the package-registry persistence out ofmarketplaceinto an always-on core capability #18694 (spec/kernel: carve the package-registry persistence (sys_packagescontainer + hydration) out ofmarketplaceinto an always-on core capability under its own name — the spec half of #17676 ruling A′ item 1 #18053) landed at 16:10Z, before this dispatch, which strengthens the card's premise. The gate reading with controls:PLATFORM_CAPABILITY_TOKENSreferenced by 0 files underscripts/,packages/*/scripts/,.github/(lit control 18 files tree-wide; dark control 0).PLATFORM_CAPABILITY_TOKENSnot in that map do not resolve through it:」; :463 「The authoritative list of all 28 isPLATFORM_CAPABILITY_TOKENS」 → 「The authoritative list isPLATFORM_CAPABILITY_TOKENS」. Seat grep at the head:all 28/other eight0 hits. The eight-name enumeration under :452 re-read against the constant: all eight names present in the constant, none aServe.CAPABILITY_PROVIDERSkey — no name dropped, none added;package-registry(the ninth not-in-map token since spec/kernel: carve the package-registry persistence out ofmarketplaceinto an always-on core capability #18694) is deliberately not documented here — an incompleteness the card did not ask this PR to close, and A writable package created viaPOST /api/v1/packagesis registered in memory only — it does not survive a restart, and leaves its published metadata orphaned #17676's runtime half closes it when it adds the CLI row.skills/objectstack-platform/SKILL.md12975 / 12984 (headroom 9; 12980 / 12984 before), exit 0, no ceiling moved; a citation is shorter than a count, as the claim predicted.--ranreconciled;check:doc-formula-expressions0 on its second run after the lint closure was built under the verify lock;check:pm-skill-id-lint0 outside the derived set; repo-widepnpm lintexit 0 under the lock at the head; control-byte scan clean — per the report. Seat-side: the token ratchet, the constant count, the two greps, pair 0, GOVERNED, harness CURRENT. CI onbef0dc6dfaread at 2026-09-18T00:01Z: 35 check-runs, 24 success · 11 skipped, every skip in the roster (check-expected-skips.mjs --pr 18839exit 0, the one REQUIRED skip — Temporal Conformance — taken in the queue build), commit statussuccess;--pair 18839exit 0.api_writes3 — the draft PR,skip-changeset(read back), the report;mcp_calls0; PR body written once at create, never PATCHed; no reviewer or label writes beyond that.POST /api/v1/packagesis registered in memory only — it does not survive a restart, and leaves its published metadata orphaned #17676's runtime-half PR, which must edit the :442 table anyway (a patch round here would cost a MANDATORY-tier round for one word); (2) option B's reading surface, for the record:scripts/check-skill-identifier-liveness.mjsLeg 2 already walksskills/**for an enumeration that stopped growing with its schema — registering this section's enumeration againstPLATFORM_CAPABILITY_TOKENSthere would flagpackage-registrytoday; a prose COUNT is outside both legs — not this card; (3) this file's token ceiling could be lowered 12984 → 12975 — the ratchet script's own encouragement, another file, the seat's discretion later.## 维护者速读(终稿)on the PR,needs-user-decision, review requested from os-zhuang + hotlong; the maintainer lands. Serial on this file: this PR → [finding]check:scaffold-emission-policypins the bundled template's TypeScript range but not the publishedobjectstack-platformskill's example block — the carrier that drifted longest is the one no gate reads #16767 (not this lane's).Generated by Claude Code
os-justin commentedon Sep 18, 2026
LANDED — PR #18839 (#18705, governed published
skills/objectstack-platform/SKILL.md: 「all 28」 and 「the other eight」 become citations ofPLATFORM_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), squash96fdac21ee7182f52c1326fc1f29166231b3a8e8(single parentf7e523136aa929fb077f4427200e5b622967e76b, an ancestor oforigin/main). Governed surface (publishedskills/**): 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 headbef0dc6dfa), marked ready and enqueued by hand at 2026-09-18T01:18:00Z; the seat strippedneeds-user-decisionat 2026-09-18T01:18:22Z per ruling C (--pair 188390, CI 40 / 15 skipped rostered, harness CURRENT at88aa326deb). The card auto-closedcompletedat 2026-09-18T02:19:32Z on the PR'sFixes;pm:dispatchedis stripped in the same act. Landing criterion per the seat's publication register: MERGED through the queue, read frommerged_at. :440 「all 20 of its entries」 left as is (true today) — the next author of this file re-counts.Generated by Claude Code
docs(skills): cite `PLATFORM_CAPABILITY_TOKENS` instead of restating …