Repository navigation
docs(skills): cite PLATFORM_CAPABILITY_TOKENS instead of restating its count in objectstack-platform - #18839
Conversation
…its count The `requires:` section of `skills/objectstack-platform/SKILL.md` copied two numbers out of the platform capability vocabulary into prose — "the other eight tokens" and "the authoritative list of all 28" — and no gate reads either against `packages/spec/src/kernel/platform-capabilities.ts`. The vocabulary is 29 on `main` since `package-registry` landed, so both sentences are already false. Cite the constant instead. The tokens outside the CLI's `CAPABILITY_PROVIDERS` map are named as "the tokens in `PLATFORM_CAPABILITY_TOKENS` not in that map", and the authority sentence keeps the constant and drops the count. The enumeration under it is unchanged: every name it lists is still in the constant. Nothing in the tree read the removed numbers, so no gate or generator follows. Claude-Session: https://claude.ai/code/session_01Gqi43smmqjJ5sUrhfoPeKu Co-authored-by: Claude <noreply@anthropic.com>
维护者速读(终稿)改了什么:发布给客户项目的 为什么改:这两个数字是从 风险与代价(含回滚):纯文档、不发布代码、不改运行时;23 个派生门禁全 0,全仓 lint 0。回滚 = revert 这一个 commit。 席位意见:通过,按 dev 交付的原样。 你要做的:批准本 PR( Generated by Claude Code |
…he objectui fixture shape (objectstack-ai#19721) Fixes objectstack-ai#19714 Clause-②: no Patch round 2026-09-22: commit 41844ce adds the 11 ratchet rows (one per new evals json, pinned at its measured count, zero headroom) under the maintainer's ruling 「天花板行按照你的意见就行」 — issue comment 5776586573, batch objectstack-ai#213 item 2, letter A of the open question below; `check-skills-token-ratchet.mjs` and its `--self-test` are green on that head, so the «Token ratchet» section below describes the state before this commit. ## What this does Every one of the ten published skills under `skills/` now ships `evals/*.json` fixtures in the objectui shape — `{ skill_name, evals: [{ id, prompt, expected_output, files, assertions: { must_contain, must_not_contain } }] }` — copied verbatim from `skills/objectui/evals/app-composition.json` in the sibling repo. 11 new json files, 54 new evals (59 with the 5 pre-existing objectstack-ui ones); every skill has at least 3, one per stated «use when» trigger family in its description, and at least one anti-pattern case whose `must_not_contain` names the wrong spelling the skill exists to prevent (`conditionalRequired:`, `type: 'unique'`, `deleteBehavior: 'set_null'`, `many_to_many`, `next:` on flow nodes, `{{` in flow values, `o: {` translation shape, `cursor:` / `distinct: true` query keys, `sourceView`, `data:beforeInsert` kernel hook, `defineAgent(` for third parties, `??` alias on an upgrade, …). Prompts are written as realistic authoring requests with business nouns; `expected_output` states the shape an agent following the skill must emit. Every `must_contain` string is something the skill's own text tells the agent to write — the full token → file:line citation list is at the bottom of this body (253 tokens, 0 untaught). Two decisions the card left to the dev, stated here: - **objectstack-automation's markdown case** (`evals/approvals/test-revise-loop.md`): converted to json (`flows-triggers-approvals.json` eval 3 is the same budget_approval scenario, same required shape) and **kept beside it**, unchanged. Reason: `SKILL.md` lines 954–955 link the markdown file by path (no SKILL.md line may change in this PR), and the token ratchet carries a `CEILINGS` row for that path — a missing file is RED there, so deleting it would need a gate edit. - **Changeset: none, label `skip-changeset`.** Measured against the last three merged skills-only PRs found by `git log origin/main --oneline -- skills/` after deepening the shallow clone (objectstack-ai#19445, objectstack-ai#18839, objectstack-ai#18674): each carried `skip-changeset` and no `.changeset/*.md`. `skills/**` ships through `npx skills add`, not through any released package's `files[]` (no `packages/**/package.json` lists it), so nothing published from an npm package changes. ## Files | skill | files | evals | trigger families → eval ids | |:--|:--|--:|:--| | objectstack-ai | `evals/skills-tools-knowledge.json` (new) | 5 | `*.skill.ts` 1 · LLM provider 2 · tools a skill grants 1, 4 · knowledge source / RAG 3 · anti: agent authoring 5 | | objectstack-api | `evals/endpoints-auth-routes.json` (new) | 5 | `*.endpoint.ts` 1, 2 · auth providers 4 · custom routes 3 · REST generator 5 · anti: `transform:`, `'restore'` 1, 5 | | objectstack-automation | `evals/flows-triggers-approvals.json` (new) + `evals/approvals/test-revise-loop.md` (kept) | 5 | `*.flow.ts` 1, 5 · event-driven rule 2 · approval chain 3 · screen flow / wizard 4 · anti: `next:`, `values:`, `{{` 1, 2 | | objectstack-data | `evals/objects-fields-relationships.json`, `evals/hooks-security-seeds-datasources.json` (new); `evals/README.md` rewritten | 8 | `*.object.ts` / field types 1 · relationships 2 · validation 3 · `visibleWhen` rules 4 · hooks 5 · access control 6 · external database 7 · seeds / demo data 8 · anti: `type: 'password'`, `many_to_many`, `type: 'unique'`, `conditionalRequired:` 1–4 | | objectstack-formula | `evals/cel-predicates-formulas.json` (new) | 5 | `F` / `P` / `cel` templates 1, 3, 4 · «how do I express X» 2, 5 · anti: `{record.`, `ISCHANGED(`, `new Date(` 1–5 | | objectstack-i18n | `evals/bundles-locales-coverage.json` (new) | 5 | `*.translation.ts` 1 · `translation` item 3 · generated bundle from a plugin 4 · new locale 2 · missing-translation warnings 5 · anti: `o: {`, ICU plural 1, 3 | | objectstack-platform | `evals/config-plugins-ops.json` (new) | 6 | `objectstack.config.ts` 1 · plugin 2 · capability on 3 · Hono mount 4 · `os` CLI 5 · deployment 6 · anti: `workflows:`, `data:beforeInsert`, `new DriverPlugin` 1, 2, 6 | | objectstack-query | `evals/filters-pagination-search.json` (new) | 5 | query DSL 1, 3, 4, 5 · pagination strategy 2 · anti: `cursor:`, `distinct: true`, `fuzzy` 2–4 | | objectstack-ui | `evals/views-apps-actions-pages.json` (new) + `evals/analytics-inline-vs-dataset.json` (unchanged, 5); `evals/README.md` lists both | 11 | `*.view.ts` 1 · `*.app.ts` 2 · `*.action.ts` 3 · `*.page.ts` + `src/docs/*.md` 4 · interface page + `*.report.ts` 5 · wizard form 6 · `*.dashboard.ts` / `*.dataset.ts` existing 1–5 · anti: `groupBy:`, `sourceView`, `{record.` 1, 3, 5 | | objectstack-upgrade | `evals/protocol-major-upgrade.json` (new) | 4 | older major must move / «升级到 v17» 1 · spec bumped, parsing broke 4 · `[REMOVED]` prescription 2 · residue decision 3 · anti: `sed -i`, `??` 1, 2 | No `SKILL.md`, `rules/**` or `references/**` line changes (net 0 on every `SKILL.md`, measured with `git diff --numstat a251aaa -- 'skills/*/SKILL.md'` → empty). ## Verification Run on 02b931d (`git rev-parse --short HEAD`), worktree `objectstack-issue-19714`, base `a251aaa`. - **Shape.** Parse over `skills/*/evals/*.json`: 12 files parse; `skill_name` equals the frontmatter `name` in all 12; ids unique per file; every eval carries `id` / `prompt` / `expected_output` / `files` / `assertions.must_contain` / `must_not_contain`; no empty `must_contain`. - **Counts.** 10 skills · 12 json files · 59 evals (see table). - **Line budget.** `dispatch-gates` change-set reading: `changed lines: 630 (+613 / -17; 13 file(s))` → net **+596** across `skills/**/evals/**` (budget ≤ +900); `SKILL.md` net 0. - **Runner.** There is no eval runner in either repo (nothing executes a prompt against an agent): `grep -rn evals` over `package.json` / `scripts/` finds none here, and in objectui only the static oracle `scripts/check-skill-eval-tokens.mjs` (`pnpm check:skill-eval-tokens`), which checks that every `must_contain` token is taught as a whole token somewhere in the bundle's markdown. I invoked its exported `analyze({ root })` against this tree (the CLI is pinned to objectui's own root): `bundles: 10 · preconditions: [] · shapeFindings: [] · rows: 253 · rows with zero whole-token hits (bundle-wide): 0`. Per the card, no runner was built. - **Token citations.** 253 `must_contain` tokens, each located as a whole token in its own skill's hand-authored text (SKILL.md first, then `rules/*.md`, then hand-authored `references/*.md`; generated `_index.md` / `react-blocks.md` excluded); list at the bottom. - **Control-character self-scan** over the 13 touched files: `grep -naP '[\x00-\x08\x0b\x0c\x0e-\x1f\x7f]'` → no hits. ### Gates (derived by `node scripts/pm/dispatch-gates.mjs --repo objectstack-ai/objectstack --commands`, 23 commands; `--ran` reconciliation with exit codes: 23 derived, 23 run, 0 NOT-MEASURED, 0 unrun) | command | exit | reading | |:--|--:|:--| | `node scripts/check-ci-filter-parity.mjs` | 0 | OK: all 185 declared cross-package glob(s) covered | | `node scripts/check-closing-keyword-parity.mjs` (+ `--self-test`) | 0 / 0 | 40 assertions, 5 mutations driven to red | | `node scripts/check-comment-mask-corpus.mjs` | 0 | 7006 files, 0 disagree | | `node scripts/check-doc-route-spelling.mjs --advisory` (+ `--self-test`) | 0 / 0 | population clean | | `node scripts/check-skills-token-ratchet.mjs` | **1** | `11 of 55 published bundle file(s) failed their check` — every one is a NEW file «carrying no ceiling»; every pre-existing row is green (data README 142/143, ui README 287/289, analytics json 1102/1102, revise-loop md 550/1329). See «Token ratchet» below. | | `node scripts/check-skills-token-ratchet.mjs --self-test` | **1** | one failing case, the live-tree pin `every discovered AUTHORED file carries a ceiling today`, listing exactly the same 11 files; 65/65 pass on the pristine base tree (control run in the shared checkout at a251aaa). Same cause, not a second finding. | | `pnpm --filter @objectstack/lint run check:doc-formula-expressions` | 0 | first run exit 3 `PREREQUISITE NOT MET` (formula + lint not built — identical on the pristine base tree); after `turbo run build --filter=@objectstack/formula --filter=@objectstack/lint` under `os-verify-lock.sh` (VERDICT command-exit 0, held 190s), the gate ran and passed | | `pnpm check:agent-test-spelling` | 0 | clean | | `pnpm check:corpus-claim-drift` | 0 | 239 files scanned, skills 44 | | `pnpm check:cross-package-test-inputs` | 0 | 255 self-test cases, all declared | | `pnpm check:doc-authoring` | 0 | 44 published skill files clean — no internal issue-id references | | `pnpm check:driver-memory-census` | 0 | OK | | `pnpm check:gitlink-declared` | 0 | OK | | `pnpm check:nul-bytes` | 0 | 9221 text files, no raw control bytes | | `pnpm check:pm-governed-merges` | 0 | 441 assertions; live generator certified this tree | | `pnpm check:refd-timer-probe` | 0 | OK | | `pnpm check:role-word` | 0 | 239 files, ledger unchanged | | `pnpm check:skill-compatibility` | 0 | 10 SKILL.md reconciled | | `pnpm check:skill-frame-sync` | 0 | coherent | | `pnpm check:skill-identifier-liveness` | 0 | 456 citations over 44 files OK | | `pnpm check:watch-hint-literal` | 0 | 71 declarations OK | Not run locally (CI-owned): the repo-wide `pnpm lint` sweep, the type-check lanes, the `Test Core` shards — this diff touches no package source. Exit codes were captured before any pipe (`cmd log-redirect; EXIT=$?`). ### Token ratchet — the one thing only the maintainer can lift `scripts/check-skills-token-ratchet.mjs` enumerates every hand-authored file under `skills/` and reds on a file with no `CEILINGS` row; its remedy text carries the `⛔ MAINTAINER-ONLY` marker («adding a CEILINGS row prices new text into the bundle that ships to every customer project, which is the maintainer ruling this ratchet implements — not a step an author takes while landing the file»). The card's ruled shape forbids touching any gate script in this PR and the dispatch word says «⛔ 不改门禁本身», so this PR does **not** edit the script; the `Lint & Repo Gates` context will stay red on it until the rows land. The authorisation the ratchet asks for exists — the maintainer's decision-batch objectstack-ai#213 ruling, verbatim: 「1 2 4 同意」 on item 2 「objectstack 各 skill 先补 3 题 evals(复用 objectui 的 json 形状),先于第 1 项,好量化『切了没变差』」 — and the rows are mechanical, measured on this head in the ratchet's own `ceil(utf8 bytes / 4)` convention, each initialised AT its measurement (zero headroom, the same terms as the objectstack-ai#12392 rows): ``` ['skills/objectstack-ai/evals/skills-tools-knowledge.json', 1074], // measured at 02b931d, zero headroom ['skills/objectstack-api/evals/endpoints-auth-routes.json', 1042], // measured at 02b931d, zero headroom ['skills/objectstack-automation/evals/flows-triggers-approvals.json', 1255], // measured at 02b931d, zero headroom ['skills/objectstack-data/evals/hooks-security-seeds-datasources.json', 894], // measured at 02b931d, zero headroom ['skills/objectstack-data/evals/objects-fields-relationships.json', 946], // measured at 02b931d, zero headroom ['skills/objectstack-formula/evals/cel-predicates-formulas.json', 1046], // measured at 02b931d, zero headroom ['skills/objectstack-i18n/evals/bundles-locales-coverage.json', 1004], // measured at 02b931d, zero headroom ['skills/objectstack-platform/evals/config-plugins-ops.json', 1211], // measured at 02b931d, zero headroom ['skills/objectstack-query/evals/filters-pagination-search.json', 955], // measured at 02b931d, zero headroom ['skills/objectstack-ui/evals/views-apps-actions-pages.json', 1505], // measured at 02b931d, zero headroom ['skills/objectstack-upgrade/evals/protocol-major-upgrade.json', 1033], // measured at 02b931d, zero headroom ``` Sum of the 11 rows: 11965 tokens. Bundle total on this head per the ratchet's own price tag: 152338 (ratcheted authored 141361 vs 145656 ceilings). Whoever lands the rows (a maintainer-authorised follow-up, or this PR if the seat is told to add them) also clears the self-test's live-tree pin — no second edit needed. ## Acceptance notes - Two pre-existing README ceilings had 0–2 tokens of headroom; both rewrites were paid inside the same file (data README 143 → 142 tokens with the placeholder sentence gone; ui README 289 → 287 with the new file listed and a parenthetical example dropped from «Contributing»). Not filed: no defect, a measurement. - `must_not_contain` entries are spelled in their AUTHORED form (`conditionalRequired:` with the colon, `type: 'unique'`, `'project_id.name'` quoted) so a correct answer that merely names the rule while following it is not flagged — the same convention objectui adopted. A few (`ISBLANK(record.`, `??`, `sourceView`) can still trip an otherwise-correct answer that quotes the anti-pattern; treat such a flag as a review cue, as the pre-existing ui fixture's note says. Not filed: fixture design, not a defect. - objectui's `check-skill-eval-tokens.mjs` is pinned to its own repo root on the CLI path but exports `analyze({ root })`, which is how the reading above was taken. A gate of that shape for this repo is a separate card, if ever — the ruled shape says no new gate here. Not filed: out of scope, no defect. - `scripts/pm/dispatch-gates.mjs --ran` asks for `command :: exit N` rows to count NOT-MEASURED itself; my first record carried bare commands, so its «0 NOT-MEASURED» was the runner's claim — re-recorded with exit codes, it derives the same zero. Not filed: usage, not a defect. ## 维护者速读(草稿) **改了什么** — 十个已发布 skill 全部补上了 objectui 同款 json 形状的 evals(11 个新文件,54 题,每个 skill ≥ 3 题、每个「use when」触发族至少一题、每个 skill 至少一题反模式);objectstack-data 的「Not yet implemented」占位 README 改成了真实 fixture 清单;automation 的 markdown 用例转成 json 并保留原 md。没有动任何 SKILL.md / rules / references 的一行。 **为什么改** — 批次 objectstack-ai#213 第 2 项:「objectstack 各 skill 先补 3 题 evals(复用 objectui 的 json 形状),先于第 1 项,好量化『切了没变差』」。这些题是接下来拆 SKILL.md(姊妹卡)前后各跑一次的量尺。 **风险与代价(含回滚)** — 发布面只多了 evals 文件(随 `npx skills add` 一起发运,约 11965 tokens)。唯一红着的门禁是 `check:skills-token-ratchet`:11 个新文件没有 CEILINGS 行,而加行是「MAINTAINER-ONLY」,本 PR 按裁决没碰门禁脚本。行的内容已在上面按实测列好。回滚 = revert 这一个 commit(02b931d),无数据、无 API 影响。 **席位意见** — (留空,由席位定稿) **你要做的** — ① 决定 11 行 CEILINGS 落在哪里:让席位在本 PR 追加一个 commit,或另开一个引用本裁决的 follow-up;② 人合本 PR(Tier H)。 ## Token citations (must_contain → first whole-token occurrence in the skill's own text) ``` objectstack-ai/evals/skills-tools-knowledge.json eval 1 defineSkill → skills/objectstack-ai/SKILL.md:94 objectstack-ai/evals/skills-tools-knowledge.json eval 1 tools → skills/objectstack-ai/SKILL.md:4 objectstack-ai/evals/skills-tools-knowledge.json eval 1 action_escalate_case → skills/objectstack-ai/SKILL.md:108 objectstack-ai/evals/skills-tools-knowledge.json eval 1 triggerConditions → skills/objectstack-ai/SKILL.md:61 objectstack-ai/evals/skills-tools-knowledge.json eval 2 provider → skills/objectstack-ai/SKILL.md:6 objectstack-ai/evals/skills-tools-knowledge.json eval 2 anthropic → skills/objectstack-ai/SKILL.md:300 objectstack-ai/evals/skills-tools-knowledge.json eval 2 temperature → skills/objectstack-ai/SKILL.md:295 objectstack-ai/evals/skills-tools-knowledge.json eval 2 maxTokens → skills/objectstack-ai/SKILL.md:295 objectstack-ai/evals/skills-tools-knowledge.json eval 3 KnowledgeSourceSchema → skills/objectstack-ai/SKILL.md:209 objectstack-ai/evals/skills-tools-knowledge.json eval 3 contentFields → skills/objectstack-ai/SKILL.md:236 objectstack-ai/evals/skills-tools-knowledge.json eval 3 metadataFields → skills/objectstack-ai/SKILL.md:236 objectstack-ai/evals/skills-tools-knowledge.json eval 3 where → skills/objectstack-ai/SKILL.md:131 objectstack-ai/evals/skills-tools-knowledge.json eval 3 KnowledgeServicePlugin → skills/objectstack-ai/SKILL.md:215 objectstack-ai/evals/skills-tools-knowledge.json eval 4 exposed → skills/objectstack-ai/SKILL.md:81 objectstack-ai/evals/skills-tools-knowledge.json eval 4 description → skills/objectstack-ai/SKILL.md:3 objectstack-ai/evals/skills-tools-knowledge.json eval 4 action_ → skills/objectstack-ai/SKILL.md:54 objectstack-ai/evals/skills-tools-knowledge.json eval 4 tools → skills/objectstack-ai/SKILL.md:4 objectstack-ai/evals/skills-tools-knowledge.json eval 5 defineSkill → skills/objectstack-ai/SKILL.md:94 objectstack-ai/evals/skills-tools-knowledge.json eval 5 skills → skills/objectstack-ai/SKILL.md:4 objectstack-ai/evals/skills-tools-knowledge.json eval 5 surface → skills/objectstack-ai/SKILL.md:5 objectstack-ai/evals/skills-tools-knowledge.json eval 5 aiExposed → skills/objectstack-ai/SKILL.md:232 objectstack-api/evals/endpoints-auth-routes.json eval 1 /api/v1/apps/ → skills/objectstack-api/SKILL.md:126 objectstack-api/evals/endpoints-auth-routes.json eval 1 object_operation → skills/objectstack-api/SKILL.md:103 objectstack-api/evals/endpoints-auth-routes.json eval 1 objectParams → skills/objectstack-api/SKILL.md:130 objectstack-api/evals/endpoints-auth-routes.json eval 1 cacheTtlSeconds → skills/objectstack-api/SKILL.md:132 objectstack-api/evals/endpoints-auth-routes.json eval 2 authRequired → skills/objectstack-api/SKILL.md:131 objectstack-api/evals/endpoints-auth-routes.json eval 2 rateLimit → skills/objectstack-api/SKILL.md:161 objectstack-api/evals/endpoints-auth-routes.json eval 2 enabled: true → skills/objectstack-api/SKILL.md:161 objectstack-api/evals/endpoints-auth-routes.json eval 2 maxRequests → skills/objectstack-api/SKILL.md:161 objectstack-api/evals/endpoints-auth-routes.json eval 3 http.server → skills/objectstack-api/SKILL.md:113 objectstack-api/evals/endpoints-auth-routes.json eval 3 kernel:ready → skills/objectstack-api/SKILL.md:207 objectstack-api/evals/endpoints-auth-routes.json eval 3 getService → skills/objectstack-api/SKILL.md:202 objectstack-api/evals/endpoints-auth-routes.json eval 4 AuthProvider → skills/objectstack-api/SKILL.md:337 objectstack-api/evals/endpoints-auth-routes.json eval 4 auth.zod.ts → skills/objectstack-api/SKILL.md:337 objectstack-api/evals/endpoints-auth-routes.json eval 4 google → skills/objectstack-api/SKILL.md:338 objectstack-api/evals/endpoints-auth-routes.json eval 4 github → skills/objectstack-api/SKILL.md:338 objectstack-api/evals/endpoints-auth-routes.json eval 4 LoginRequestSchema → skills/objectstack-api/SKILL.md:339 objectstack-api/evals/endpoints-auth-routes.json eval 5 apiMethods → skills/objectstack-api/SKILL.md:58 objectstack-api/evals/endpoints-auth-routes.json eval 5 /batch → skills/objectstack-api/SKILL.md:49 objectstack-api/evals/endpoints-auth-routes.json eval 5 trackHistory → skills/objectstack-api/SKILL.md:267 objectstack-api/evals/endpoints-auth-routes.json eval 5 lifecycle → skills/objectstack-api/SKILL.md:401 objectstack-automation/evals/flows-triggers-approvals.json eval 1 defineFlow → skills/objectstack-automation/SKILL.md:156 objectstack-automation/evals/flows-triggers-approvals.json eval 1 type: 'schedule' → skills/objectstack-automation/SKILL.md:161 objectstack-automation/evals/flows-triggers-approvals.json eval 1 runAs: 'system' → skills/objectstack-automation/SKILL.md:163 objectstack-automation/evals/flows-triggers-approvals.json eval 1 update_record → skills/objectstack-automation/SKILL.md:80 objectstack-automation/evals/flows-triggers-approvals.json eval 1 edges → skills/objectstack-automation/SKILL.md:68 objectstack-automation/evals/flows-triggers-approvals.json eval 2 triggerType → skills/objectstack-automation/SKILL.md:51 objectstack-automation/evals/flows-triggers-approvals.json eval 2 record-after-update → skills/objectstack-automation/SKILL.md:466 objectstack-automation/evals/flows-triggers-approvals.json eval 2 previous. → skills/objectstack-automation/SKILL.md:423 objectstack-automation/evals/flows-triggers-approvals.json eval 2 notify → skills/objectstack-automation/SKILL.md:89 objectstack-automation/evals/flows-triggers-approvals.json eval 2 recipients → skills/objectstack-automation/SKILL.md:108 objectstack-automation/evals/flows-triggers-approvals.json eval 2 messaging → skills/objectstack-automation/SKILL.md:89 objectstack-automation/evals/flows-triggers-approvals.json eval 3 type: 'approval' → skills/objectstack-automation/SKILL.md:437 objectstack-automation/evals/flows-triggers-approvals.json eval 3 approval_revise → skills/objectstack-automation/SKILL.md:525 objectstack-automation/evals/flows-triggers-approvals.json eval 3 type: 'back' → skills/objectstack-automation/SKILL.md:545 objectstack-automation/evals/flows-triggers-approvals.json eval 3 maxRevisions → skills/objectstack-automation/SKILL.md:550 objectstack-automation/evals/flows-triggers-approvals.json eval 3 revise → skills/objectstack-automation/SKILL.md:525 objectstack-automation/evals/flows-triggers-approvals.json eval 4 screen → skills/objectstack-automation/SKILL.md:8 objectstack-automation/evals/flows-triggers-approvals.json eval 4 decision → skills/objectstack-automation/SKILL.md:65 objectstack-automation/evals/flows-triggers-approvals.json eval 4 condition → skills/objectstack-automation/SKILL.md:30 objectstack-automation/evals/flows-triggers-approvals.json eval 4 create_record → skills/objectstack-automation/SKILL.md:79 objectstack-automation/evals/flows-triggers-approvals.json eval 4 variables → skills/objectstack-automation/SKILL.md:122 objectstack-automation/evals/flows-triggers-approvals.json eval 5 function: → skills/objectstack-automation/SKILL.md:336 objectstack-automation/evals/flows-triggers-approvals.json eval 5 outputVariable → skills/objectstack-automation/SKILL.md:313 objectstack-automation/evals/flows-triggers-approvals.json eval 5 type: 'fault' → skills/objectstack-automation/SKILL.md:213 objectstack-automation/evals/flows-triggers-approvals.json eval 5 timeoutMs → skills/objectstack-automation/SKILL.md:198 objectstack-automation/evals/flows-triggers-approvals.json eval 5 update_record → skills/objectstack-automation/SKILL.md:80 objectstack-data/evals/hooks-security-seeds-datasources.json eval 1 searchableFields → skills/objectstack-data/SKILL.md:116 objectstack-data/evals/hooks-security-seeds-datasources.json eval 1 project_name → skills/objectstack-data/SKILL.md:136 objectstack-data/evals/hooks-security-seeds-datasources.json eval 1 beforeInsert → skills/objectstack-data/SKILL.md:11 objectstack-data/evals/hooks-security-seeds-datasources.json eval 1 afterUpdate → skills/objectstack-data/SKILL.md:11 objectstack-data/evals/hooks-security-seeds-datasources.json eval 2 sharingModel: 'private' → skills/objectstack-data/SKILL.md:208 objectstack-data/evals/hooks-security-seeds-datasources.json eval 2 readScope → skills/objectstack-data/SKILL.md:77 objectstack-data/evals/hooks-security-seeds-datasources.json eval 2 unit_and_below → skills/objectstack-data/SKILL.md:556 objectstack-data/evals/hooks-security-seeds-datasources.json eval 2 public_read → skills/objectstack-data/SKILL.md:78 objectstack-data/evals/hooks-security-seeds-datasources.json eval 2 hierarchy-security → skills/objectstack-data/SKILL.md:561 objectstack-data/evals/hooks-security-seeds-datasources.json eval 3 defineDatasource → skills/objectstack-data/SKILL.md:8 objectstack-data/evals/hooks-security-seeds-datasources.json eval 3 datasource → skills/objectstack-data/SKILL.md:91 objectstack-data/evals/hooks-security-seeds-datasources.json eval 3 remoteName → skills/objectstack-data/SKILL.md:51 objectstack-data/evals/hooks-security-seeds-datasources.json eval 3 columnMap → skills/objectstack-data/SKILL.md:51 objectstack-data/evals/hooks-security-seeds-datasources.json eval 3 schemaMode → skills/objectstack-data/rules/datasources.md:10 objectstack-data/evals/hooks-security-seeds-datasources.json eval 4 defineSeed → skills/objectstack-data/SKILL.md:8 objectstack-data/evals/hooks-security-seeds-datasources.json eval 4 externalId → skills/objectstack-data/SKILL.md:650 objectstack-data/evals/hooks-security-seeds-datasources.json eval 4 upsert → skills/objectstack-data/SKILL.md:108 objectstack-data/evals/hooks-security-seeds-datasources.json eval 4 env: → skills/objectstack-data/SKILL.md:662 objectstack-data/evals/hooks-security-seeds-datasources.json eval 4 daysFromNow → skills/objectstack-data/SKILL.md:742 objectstack-data/evals/objects-fields-relationships.json eval 1 ObjectSchema.create → skills/objectstack-data/SKILL.md:90 objectstack-data/evals/objects-fields-relationships.json eval 1 sharingModel → skills/objectstack-data/SKILL.md:69 objectstack-data/evals/objects-fields-relationships.json eval 1 type: 'secret' → skills/objectstack-data/rules/security.md:125 objectstack-data/evals/objects-fields-relationships.json eval 1 options → skills/objectstack-data/SKILL.md:251 objectstack-data/evals/objects-fields-relationships.json eval 1 nameField → skills/objectstack-data/SKILL.md:92 objectstack-data/evals/objects-fields-relationships.json eval 2 master_detail → skills/objectstack-data/SKILL.md:46 objectstack-data/evals/objects-fields-relationships.json eval 2 deleteBehavior → skills/objectstack-data/SKILL.md:784 objectstack-data/evals/objects-fields-relationships.json eval 2 inlineEdit → skills/objectstack-data/SKILL.md:785 objectstack-data/evals/objects-fields-relationships.json eval 2 summary → skills/objectstack-data/SKILL.md:421 objectstack-data/evals/objects-fields-relationships.json eval 2 lookup → skills/objectstack-data/SKILL.md:46 objectstack-data/evals/objects-fields-relationships.json eval 3 unique: 'organization' → skills/objectstack-data/SKILL.md:465 objectstack-data/evals/objects-fields-relationships.json eval 3 state_machine → skills/objectstack-data/SKILL.md:343 objectstack-data/evals/objects-fields-relationships.json eval 3 transitions → skills/objectstack-data/SKILL.md:345 objectstack-data/evals/objects-fields-relationships.json eval 3 record. → skills/objectstack-data/SKILL.md:157 objectstack-data/evals/objects-fields-relationships.json eval 4 visibleWhen → skills/objectstack-data/SKILL.md:13 objectstack-data/evals/objects-fields-relationships.json eval 4 requiredWhen → skills/objectstack-data/SKILL.md:13 objectstack-data/evals/objects-fields-relationships.json eval 4 readonlyWhen → skills/objectstack-data/SKILL.md:13 objectstack-data/evals/objects-fields-relationships.json eval 4 record.status → skills/objectstack-data/SKILL.md:259 objectstack-formula/evals/cel-predicates-formulas.json eval 1 F` → skills/objectstack-formula/SKILL.md:9 objectstack-formula/evals/cel-predicates-formulas.json eval 1 coalesce( → skills/objectstack-formula/SKILL.md:126 objectstack-formula/evals/cel-predicates-formulas.json eval 1 record. → skills/objectstack-formula/SKILL.md:30 objectstack-formula/evals/cel-predicates-formulas.json eval 2 isBlank( → skills/objectstack-formula/SKILL.md:86 objectstack-formula/evals/cel-predicates-formulas.json eval 2 && → skills/objectstack-formula/SKILL.md:81 objectstack-formula/evals/cel-predicates-formulas.json eval 2 record. → skills/objectstack-formula/SKILL.md:30 objectstack-formula/evals/cel-predicates-formulas.json eval 2 P` → skills/objectstack-formula/SKILL.md:9 objectstack-formula/evals/cel-predicates-formulas.json eval 3 previous.status → skills/objectstack-formula/SKILL.md:75 objectstack-formula/evals/cel-predicates-formulas.json eval 3 record.status → skills/objectstack-formula/SKILL.md:245 objectstack-formula/evals/cel-predicates-formulas.json eval 3 != → skills/objectstack-formula/SKILL.md:80 objectstack-formula/evals/cel-predicates-formulas.json eval 4 cel` → skills/objectstack-formula/SKILL.md:9 objectstack-formula/evals/cel-predicates-formulas.json eval 4 daysFromNow( → skills/objectstack-formula/SKILL.md:143 objectstack-formula/evals/cel-predicates-formulas.json eval 4 daysBetween( → skills/objectstack-formula/SKILL.md:145 objectstack-formula/evals/cel-predicates-formulas.json eval 5 visibleWhen → skills/objectstack-formula/SKILL.md:5 objectstack-formula/evals/cel-predicates-formulas.json eval 5 != null → skills/objectstack-formula/SKILL.md:110 objectstack-formula/evals/cel-predicates-formulas.json eval 5 record.end_date → skills/objectstack-formula/SKILL.md:107 objectstack-i18n/evals/bundles-locales-coverage.json eval 1 defineTranslationBundle → skills/objectstack-i18n/SKILL.md:56 objectstack-i18n/evals/bundles-locales-coverage.json eval 1 objects → skills/objectstack-i18n/SKILL.md:53 objectstack-i18n/evals/bundles-locales-coverage.json eval 1 pluralLabel → skills/objectstack-i18n/SKILL.md:69 objectstack-i18n/evals/bundles-locales-coverage.json eval 1 options → skills/objectstack-i18n/SKILL.md:74 objectstack-i18n/evals/bundles-locales-coverage.json eval 1 _actions → skills/objectstack-i18n/SKILL.md:91 objectstack-i18n/evals/bundles-locales-coverage.json eval 1 {{ → skills/objectstack-i18n/SKILL.md:106 objectstack-i18n/evals/bundles-locales-coverage.json eval 2 supportedLocales → skills/objectstack-i18n/SKILL.md:36 objectstack-i18n/evals/bundles-locales-coverage.json eval 2 ja-JP → skills/objectstack-i18n/SKILL.md:36 objectstack-i18n/evals/bundles-locales-coverage.json eval 2 os i18n extract → skills/objectstack-i18n/SKILL.md:285 objectstack-i18n/evals/bundles-locales-coverage.json eval 2 fallbackLocale → skills/objectstack-i18n/SKILL.md:37 objectstack-i18n/evals/bundles-locales-coverage.json eval 3 translation → skills/objectstack-i18n/SKILL.md:4 objectstack-i18n/evals/bundles-locales-coverage.json eval 3 locale → skills/objectstack-i18n/SKILL.md:5 objectstack-i18n/evals/bundles-locales-coverage.json eval 3 objects → skills/objectstack-i18n/SKILL.md:53 objectstack-i18n/evals/bundles-locales-coverage.json eval 3 defineTranslation → skills/objectstack-i18n/SKILL.md:226 objectstack-i18n/evals/bundles-locales-coverage.json eval 4 defineTranslationBundle → skills/objectstack-i18n/SKILL.md:56 objectstack-i18n/evals/bundles-locales-coverage.json eval 4 withSourceFallback → skills/objectstack-i18n/SKILL.md:415 objectstack-i18n/evals/bundles-locales-coverage.json eval 4 loadTranslations → skills/objectstack-i18n/SKILL.md:347 objectstack-i18n/evals/bundles-locales-coverage.json eval 4 kernel:ready → skills/objectstack-i18n/SKILL.md:432 objectstack-i18n/evals/bundles-locales-coverage.json eval 5 --no-objects-only → skills/objectstack-i18n/SKILL.md:388 objectstack-i18n/evals/bundles-locales-coverage.json eval 5 os i18n check → skills/objectstack-i18n/SKILL.md:268 objectstack-i18n/evals/bundles-locales-coverage.json eval 5 apps → skills/objectstack-i18n/SKILL.md:100 objectstack-i18n/evals/bundles-locales-coverage.json eval 5 --strict → skills/objectstack-i18n/SKILL.md:275 objectstack-platform/evals/config-plugins-ops.json eval 1 defineStack → skills/objectstack-platform/SKILL.md:5 objectstack-platform/evals/config-plugins-ops.json eval 1 manifest → skills/objectstack-platform/SKILL.md:47 objectstack-platform/evals/config-plugins-ops.json eval 1 engines → skills/objectstack-platform/SKILL.md:212 objectstack-platform/evals/config-plugins-ops.json eval 1 Object.values( → skills/objectstack-platform/SKILL.md:152 objectstack-platform/evals/config-plugins-ops.json eval 2 registerService → skills/objectstack-platform/SKILL.md:748 objectstack-platform/evals/config-plugins-ops.json eval 2 ctx.hook( → skills/objectstack-platform/SKILL.md:766 objectstack-platform/evals/config-plugins-ops.json eval 2 metadata:reloaded → skills/objectstack-platform/SKILL.md:771 objectstack-platform/evals/config-plugins-ops.json eval 2 init( → skills/objectstack-platform/SKILL.md:728 objectstack-platform/evals/config-plugins-ops.json eval 2 destroy → skills/objectstack-platform/SKILL.md:656 objectstack-platform/evals/config-plugins-ops.json eval 3 requires → skills/objectstack-platform/SKILL.md:6 objectstack-platform/evals/config-plugins-ops.json eval 3 job → skills/objectstack-platform/SKILL.md:445 objectstack-platform/evals/config-plugins-ops.json eval 3 messaging → skills/objectstack-platform/SKILL.md:445 objectstack-platform/evals/config-plugins-ops.json eval 3 triggers → skills/objectstack-platform/SKILL.md:450 objectstack-platform/evals/config-plugins-ops.json eval 4 createHonoApp → skills/objectstack-platform/SKILL.md:366 objectstack-platform/evals/config-plugins-ops.json eval 4 @objectstack/hono → skills/objectstack-platform/SKILL.md:366 objectstack-platform/evals/config-plugins-ops.json eval 4 LiteKernel → skills/objectstack-platform/SKILL.md:9 objectstack-platform/evals/config-plugins-ops.json eval 5 os migrate plan → skills/objectstack-platform/SKILL.md:578 objectstack-platform/evals/config-plugins-ops.json eval 5 os migrate apply → skills/objectstack-platform/SKILL.md:579 objectstack-platform/evals/config-plugins-ops.json eval 5 os validate → skills/objectstack-platform/SKILL.md:576 objectstack-platform/evals/config-plugins-ops.json eval 5 os lint → skills/objectstack-platform/SKILL.md:225 objectstack-platform/evals/config-plugins-ops.json eval 6 os start → skills/objectstack-platform/SKILL.md:341 objectstack-platform/evals/config-plugins-ops.json eval 6 PORT → skills/objectstack-platform/SKILL.md:580 objectstack-platform/evals/config-plugins-ops.json eval 6 OS_TRUSTED_ORIGINS → skills/objectstack-platform/SKILL.md:1095 objectstack-platform/evals/config-plugins-ops.json eval 6 driver-sql → skills/objectstack-platform/SKILL.md:334 objectstack-query/evals/filters-pagination-search.json eval 1 engine.find('account' → skills/objectstack-query/SKILL.md:349 objectstack-query/evals/filters-pagination-search.json eval 1 $in → skills/objectstack-query/SKILL.md:121 objectstack-query/evals/filters-pagination-search.json eval 1 $icontains → skills/objectstack-query/SKILL.md:138 objectstack-query/evals/filters-pagination-search.json eval 1 orderBy → skills/objectstack-query/SKILL.md:25 objectstack-query/evals/filters-pagination-search.json eval 2 orderBy → skills/objectstack-query/SKILL.md:25 objectstack-query/evals/filters-pagination-search.json eval 2 limit → skills/objectstack-query/SKILL.md:25 objectstack-query/evals/filters-pagination-search.json eval 2 $lt → skills/objectstack-query/SKILL.md:109 objectstack-query/evals/filters-pagination-search.json eval 2 keyset → skills/objectstack-query/SKILL.md:73 objectstack-query/evals/filters-pagination-search.json eval 3 engine.aggregate( → skills/objectstack-query/SKILL.md:26 objectstack-query/evals/filters-pagination-search.json eval 3 groupBy → skills/objectstack-query/SKILL.md:26 objectstack-query/evals/filters-pagination-search.json eval 3 aggregations → skills/objectstack-query/SKILL.md:26 objectstack-query/evals/filters-pagination-search.json eval 3 count_distinct → skills/objectstack-query/SKILL.md:77 objectstack-query/evals/filters-pagination-search.json eval 3 alias → skills/objectstack-query/SKILL.md:244 objectstack-query/evals/filters-pagination-search.json eval 4 searchFields → skills/objectstack-query/SKILL.md:25 objectstack-query/evals/filters-pagination-search.json eval 4 expand → skills/objectstack-query/SKILL.md:25 objectstack-query/evals/filters-pagination-search.json eval 4 fields → skills/objectstack-query/SKILL.md:7 objectstack-query/evals/filters-pagination-search.json eval 4 stored → skills/objectstack-query/SKILL.md:78 objectstack-query/evals/filters-pagination-search.json eval 5 context → skills/objectstack-query/SKILL.md:25 objectstack-query/evals/filters-pagination-search.json eval 5 isSystem: true → skills/objectstack-query/SKILL.md:59 objectstack-query/evals/filters-pagination-search.json eval 5 limit: 1 → skills/objectstack-query/SKILL.md:60 objectstack-ui/evals/analytics-inline-vs-dataset.json eval 1 defineDataset → skills/objectstack-ui/rules/dashboards.md:99 objectstack-ui/evals/analytics-inline-vs-dataset.json eval 1 dataset → skills/objectstack-ui/SKILL.md:9 objectstack-ui/evals/analytics-inline-vs-dataset.json eval 1 dimensions → skills/objectstack-ui/SKILL.md:211 objectstack-ui/evals/analytics-inline-vs-dataset.json eval 1 values → skills/objectstack-ui/SKILL.md:95 objectstack-ui/evals/analytics-inline-vs-dataset.json eval 2 window → skills/objectstack-ui/rules/dashboards.md:67 objectstack-ui/evals/analytics-inline-vs-dataset.json eval 2 Cube → skills/objectstack-ui/rules/dashboards.md:72 objectstack-ui/evals/analytics-inline-vs-dataset.json eval 3 rollup → skills/objectstack-ui/rules/dashboards.md:62 objectstack-ui/evals/analytics-inline-vs-dataset.json eval 3 to-many → skills/objectstack-ui/rules/dashboards.md:62 objectstack-ui/evals/analytics-inline-vs-dataset.json eval 4 filterBindings → skills/objectstack-ui/rules/dashboards.md:92 objectstack-ui/evals/analytics-inline-vs-dataset.json eval 5 ObjectChart → skills/objectstack-ui/rules/dashboards.md:101 objectstack-ui/evals/analytics-inline-vs-dataset.json eval 5 aggregate → skills/objectstack-ui/rules/dashboards.md:34 objectstack-ui/evals/analytics-inline-vs-dataset.json eval 5 groupBy → skills/objectstack-ui/rules/dashboards.md:110 objectstack-ui/evals/views-apps-actions-pages.json eval 1 defineView → skills/objectstack-ui/SKILL.md:148 objectstack-ui/evals/views-apps-actions-pages.json eval 1 provider: 'object' → skills/objectstack-ui/rules/list-views.md:15 objectstack-ui/evals/views-apps-actions-pages.json eval 1 listViews → skills/objectstack-ui/SKILL.md:206 objectstack-ui/evals/views-apps-actions-pages.json eval 1 groupByField → skills/objectstack-ui/rules/list-views.md:267 objectstack-ui/evals/views-apps-actions-pages.json eval 1 link: true → skills/objectstack-ui/SKILL.md:266 objectstack-ui/evals/views-apps-actions-pages.json eval 1 {current_user_id} → skills/objectstack-ui/SKILL.md:223 objectstack-ui/evals/views-apps-actions-pages.json eval 2 App.create → skills/objectstack-ui/SKILL.md:149 objectstack-ui/evals/views-apps-actions-pages.json eval 2 navigation → skills/objectstack-ui/SKILL.md:5 objectstack-ui/evals/views-apps-actions-pages.json eval 2 objectName → skills/objectstack-ui/SKILL.md:171 objectstack-ui/evals/views-apps-actions-pages.json eval 2 viewName → skills/objectstack-ui/SKILL.md:171 objectstack-ui/evals/views-apps-actions-pages.json eval 2 filters → skills/objectstack-ui/SKILL.md:150 objectstack-ui/evals/views-apps-actions-pages.json eval 2 requiresObject → skills/objectstack-ui/SKILL.md:180 objectstack-ui/evals/views-apps-actions-pages.json eval 2 requiredPermissions → skills/objectstack-ui/SKILL.md:164 objectstack-ui/evals/views-apps-actions-pages.json eval 3 defineAction → skills/objectstack-ui/rules/actions.md:31 objectstack-ui/evals/views-apps-actions-pages.json eval 3 locations → skills/objectstack-ui/SKILL.md:152 objectstack-ui/evals/views-apps-actions-pages.json eval 3 record_header → skills/objectstack-ui/rules/actions.md:9 objectstack-ui/evals/views-apps-actions-pages.json eval 3 list_toolbar → skills/objectstack-ui/rules/actions.md:14 objectstack-ui/evals/views-apps-actions-pages.json eval 3 visible → skills/objectstack-ui/SKILL.md:263 objectstack-ui/evals/views-apps-actions-pages.json eval 3 successMessage → skills/objectstack-ui/rules/actions.md:21 objectstack-ui/evals/views-apps-actions-pages.json eval 3 selectedIds → skills/objectstack-ui/rules/actions.md:14 objectstack-ui/evals/views-apps-actions-pages.json eval 4 definePage → skills/objectstack-ui/rules/navigation.md:102 objectstack-ui/evals/views-apps-actions-pages.json eval 4 type: 'record' → skills/objectstack-ui/rules/pages.md:25 objectstack-ui/evals/views-apps-actions-pages.json eval 4 regions → skills/objectstack-ui/SKILL.md:151 objectstack-ui/evals/views-apps-actions-pages.json eval 4 page:header → skills/objectstack-ui/SKILL.md:212 objectstack-ui/evals/views-apps-actions-pages.json eval 4 record:path → skills/objectstack-ui/rules/pages.md:50 objectstack-ui/evals/views-apps-actions-pages.json eval 4 src/docs/ → skills/objectstack-ui/SKILL.md:7 objectstack-ui/evals/views-apps-actions-pages.json eval 4 /docs/ → skills/objectstack-ui/SKILL.md:7 objectstack-ui/evals/views-apps-actions-pages.json eval 5 definePage → skills/objectstack-ui/rules/navigation.md:102 objectstack-ui/evals/views-apps-actions-pages.json eval 5 interfaceConfig → skills/objectstack-ui/rules/list-views.md:146 objectstack-ui/evals/views-apps-actions-pages.json eval 5 columns → skills/objectstack-ui/SKILL.md:41 objectstack-ui/evals/views-apps-actions-pages.json eval 5 allowedVisualizations → skills/objectstack-ui/rules/list-views.md:127 objectstack-ui/evals/views-apps-actions-pages.json eval 5 summary → skills/objectstack-ui/SKILL.md:95 objectstack-ui/evals/views-apps-actions-pages.json eval 5 dataset → skills/objectstack-ui/SKILL.md:9 objectstack-ui/evals/views-apps-actions-pages.json eval 6 type: 'wizard' → skills/objectstack-ui/SKILL.md:14 objectstack-ui/evals/views-apps-actions-pages.json eval 6 inlineEdit → skills/objectstack-ui/SKILL.md:64 objectstack-ui/evals/views-apps-actions-pages.json eval 6 formViews → skills/objectstack-ui/SKILL.md:14 objectstack-ui/evals/views-apps-actions-pages.json eval 6 master_detail → skills/objectstack-ui/SKILL.md:65 objectstack-upgrade/evals/protocol-major-upgrade.json eval 1 os migrate meta --from 16 → skills/objectstack-upgrade/SKILL.md:64 objectstack-upgrade/evals/protocol-major-upgrade.json eval 1 --out → skills/objectstack-upgrade/SKILL.md:62 objectstack-upgrade/evals/protocol-major-upgrade.json eval 1 tsc --noEmit → skills/objectstack-upgrade/SKILL.md:73 objectstack-upgrade/evals/protocol-major-upgrade.json eval 1 REPORT.md → skills/objectstack-upgrade/SKILL.md:75 objectstack-upgrade/evals/protocol-major-upgrade.json eval 1 applied → skills/objectstack-upgrade/SKILL.md:74 objectstack-upgrade/evals/protocol-major-upgrade.json eval 2 requiredWhen → skills/objectstack-upgrade/SKILL.md:551 objectstack-upgrade/evals/protocol-major-upgrade.json eval 2 os migrate meta → skills/objectstack-upgrade/SKILL.md:64 objectstack-upgrade/evals/protocol-major-upgrade.json eval 2 conversionId → skills/objectstack-upgrade/SKILL.md:50 objectstack-upgrade/evals/protocol-major-upgrade.json eval 2 tsc --noEmit → skills/objectstack-upgrade/SKILL.md:73 objectstack-upgrade/evals/protocol-major-upgrade.json eval 3 AWAITING DECISION → skills/objectstack-upgrade/SKILL.md:338 objectstack-upgrade/evals/protocol-major-upgrade.json eval 3 owner → skills/objectstack-upgrade/SKILL.md:7 objectstack-upgrade/evals/protocol-major-upgrade.json eval 3 never executed → skills/objectstack-upgrade/SKILL.md:298 objectstack-upgrade/evals/protocol-major-upgrade.json eval 3 transform → skills/objectstack-upgrade/SKILL.md:239 objectstack-upgrade/evals/protocol-major-upgrade.json eval 4 applied → skills/objectstack-upgrade/SKILL.md:74 objectstack-upgrade/evals/protocol-major-upgrade.json eval 4 --stored → skills/objectstack-upgrade/SKILL.md:179 objectstack-upgrade/evals/protocol-major-upgrade.json eval 4 --yes → skills/objectstack-upgrade/SKILL.md:181 objectstack-upgrade/evals/protocol-major-upgrade.json eval 4 field-required-notnull-explicit → skills/objectstack-upgrade/SKILL.md:431 objectstack-upgrade/evals/protocol-major-upgrade.json eval 4 applyConversionsToStoredItem → skills/objectstack-upgrade/SKILL.md:169 ``` --- _Generated by [Claude Code](https://claude.ai/code/session_0129ZpnaBcYZZ51rCvQiXg6C)_ --- _Generated by [Claude Code](https://claude.ai/code)_ --------- Co-authored-by: Claude <noreply@anthropic.com>
Fixes #18705
Clause-②: no
The
requires:section of the publishedskills/objectstack-platform/SKILL.mdcopied two numbers out of the platform capability vocabulary into prose — 「The other eight tokens in the vocabulary …」 and 「The authoritative list of all 28 isPLATFORM_CAPABILITY_TOKENS」 — and no gate reads either number againstpackages/spec/src/kernel/platform-capabilities.ts. PR #18694 (#18053) took the vocabulary 28 → 29 when it landed at 2026-09-17T16:10Z, so onorigin/mainboth sentences were already false when this branch was cut. This PR is the card's option A in the shape of the #16853 precedent (a256f18962, PR #17259 「cite the platform-tool registry instead of restating it」): the two counts become citations, and nothing is left in those two sentences that a registry change can falsify. No other sentence in the file moves. Thepackage-registryruntime half is #17676's and is not addressed here; #16767 (the example block's TypeScript range, same file) remains open and is not folded.维护者速读(草稿)
改了什么 — 发布给客户项目的
skills/objectstack-platform/SKILL.md里,requires:一节原来写死了两个数字(「the other eight tokens」「the authoritative list of all 28」)。本 PR 把这两句改成引用常量PLATFORM_CAPABILITY_TOKENS,不再写数字;其余 1221 行一字未动(diff 是 3 行增 / 3 行删)。为什么改 — 这两个数字是从
packages/spec的能力词汇表抄来的,没有任何门禁核对它们。#18694 落地后词汇表已是 29 个 token(新增package-registry),这两句在main上已经是假话,而客户项目里的 AI 每次加载这份 skill 都会读到。同一类缺陷在skills/objectstack-ai/SKILL.md上已由 #16853 / PR #17259 用同样的办法修过一次:引用注册表,不复述它。风险与代价(含回滚) — 纯文档改动,不发布代码,不改任何运行时行为;skill 的 token 计数 12980 → 12975,上限 12984 不动。回滚就是 revert 这一个提交。留下一处未动:同一节 :440 的「all 20 of its entries」仍是一个抄写的计数(今天为真,#17676 引擎侧落地时会变假),按派发令本卡不动其它句子——要不要顺手折进来由席位定,见下方 Acceptance notes。
席位意见 —
你要做的 — 这是受管面(
skills/**),按 Prime Directive #14 需要你亲自确认并合并;PR 保持 draft。读一眼 diff 里那两句(6 行),没有别的。Re-derived readings
All on
origin/main5941246b70(the branch point); none copied from the card.PLATFORM_CAPABILITY_TOKENSsizepackages/spec/src/kernel/platform-capabilities.ts;PLATFORM_CAPABILITY_PROVIDERShas the same 29 keysServe.CAPABILITY_PROVIDERSsize (the map the section describes)packages/cli/src/commands/serve.ts:1863–:2009; the skill's :442 table names the same 20 as a setaiai-studioi18nuiauthhierarchy-securityai-seatgovernance— the eight the section lists — pluspackage-registryGate reading — which gate surfaces read the constant name — with controls (
git grep -lat5941246b70):scripts/·packages/*/scripts/·.github/forPLATFORM_CAPABILITY_TOKENS: 0 files (exit 1)marketplaceinto an always-on core capability #18694 landed —.changeset/18053-package-registry-capability.mdandcontent/docs/releases/v16.mdxare the new hits)The two sentences, before / after
:452–:453 before:
after:
:463 before:
after:
The diff is 3 insertions / 3 deletions in one file.
The enumeration under :452, re-read against the constant at the tip
Every name the two bullets carry — tier-gated
ai,ai-studio,i18n,ui,auth(= the five keys ofServe.CAPABILITY_TO_TIERat :1577–:1585, verbatim); enterprise / cloudhierarchy-security,ai-seat,governance— is inPLATFORM_CAPABILITY_TOKENSat the tip, and none of the eight is aServe.CAPABILITY_PROVIDERSkey. So the list is kept as the list it is: no name dropped, no name added. The ninth not-in-map token,package-registry, is in the vocabulary and inPLATFORM_CAPABILITY_PROVIDERS(@objectstack/service-package, open edition) but has noServe.CAPABILITY_PROVIDERSrow yet — the constant's own comment says it is inert underobjectstack serveuntil #17676's runtime half lands. Per the card this PR documents no new token; the Acceptance notes say who holds that.The
marketplaceprovider line (:444,@objectstack/service-package) was read againstServe.CAPABILITY_PROVIDERS.marketplace.pkgat :1958 (@objectstack/service-package): it matches the tip and is not touched — repointing it is #17676's engine lane.Token ratchet
node scripts/check-skills-token-ratchet.mjs, convention ceil(utf8 bytes / 4):5941246b70)bef0dc6dfa)No ceiling moves. The published-skill readings the os-dev definition asks for: this file 1223 → 1223 lines and 12980 → 12975 tokens; the package (all ten
skills/*/SKILL.md) 6145 → 6145 lines and 70695 → 70690 tokens; the whole priced bundle 139987 → 139982 tokens. Lowering this file's ceiling to 12975 is the script's stated option, but it editsscripts/check-skills-token-ratchet.mjs, outside this card's one-file surface — left to the seat.Gates
Derived with
node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstackfrom the worktree (no hand-fed paths; change set read from the merge base5941246b70); every exit code captured redirect-then-$?; all runs atbef0dc6dfa.23 derived commands, every one exit 0:
node scripts/check-ci-filter-parity.mjs·node scripts/check-closing-keyword-parity.mjs·node scripts/check-closing-keyword-parity.mjs --self-test·node scripts/check-comment-mask-corpus.mjs·node scripts/check-doc-route-spelling.mjs --advisory·node scripts/check-doc-route-spelling.mjs --self-test·node scripts/check-skills-token-ratchet.mjs·node scripts/check-skills-token-ratchet.mjs --self-test·pnpm --filter @objectstack/spec run check:skill-docs·pnpm check:agent-test-spelling·pnpm check:corpus-claim-drift·pnpm check:cross-package-test-inputs·pnpm check:doc-authoring·pnpm check:driver-memory-census·pnpm check:nul-bytes·pnpm check:pm-governed-merges·pnpm check:refd-timer-probe·pnpm check:role-word·pnpm check:skill-compatibility·pnpm check:skill-frame-sync·pnpm check:skill-identifier-liveness·pnpm check:watch-hint-literal·pnpm --filter @objectstack/lint run check:doc-formula-expressionscheck:doc-formula-expressionsanswered exit 3 (PREREQUISITE NOT MET) on its first run, before any build; thenpnpm --workspace-concurrency=2 --filter '@objectstack/lint...' buildunderscripts/pm/os-verify-lock.sh(VERDICT command-exit 0, held 169s, waited 0s); the second run answered exit 0 — the 0 above is the second run.node scripts/pm/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.pnpm check:pm-skill-id-lintexit 0.pnpm lint(eslint . --no-inline-config) under the verify lock: VERDICT command-exit 0 (held 88s, waited 65s — shared-box seconds), atbef0dc6dfa.grep -naPover the C0/DEL range): 0 hits.Not owed locally, because the diff touches no package: no dependency-closure build, no package
test/typecheck. What stays CI's, as the derivation's stderr names it: 51 artifact-roster families, 11 wide-population families, 14 pending-changeset families, and the path-scheduledTest Corejob.Acceptance notes
POST /api/v1/packagesis registered in memory only — it does not survive a restart, and leaves its published metadata orphaned #17676's runtime half keyspackage-registryinServe.CAPABILITY_PROVIDERS. Kept out by the dispatch's 「no other sentence moves」. 承接者: the seat (a patch round on this PR — 「— all 20 of its entries:」 → 「— its entries:」 — pays for itself in tokens) or 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 PR, which must edit the :442 table anyway.package-registry(in the vocabulary since spec/kernel: carve the package-registry persistence out ofmarketplaceinto an always-on core capability #18694, no CLI provider row yet) is not documented in this section, so the enumeration of not-in-map tokens is one name short on the tip. Incompleteness, not a wrong instruction: an author never writes the token, it is always-on. It closes by itself when 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 adds the row (the enumeration is complete again and the :442 table gains a line). 承接者: 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 (open,domain:engine); the card's 「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's own text」 has no live holder — 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 is done and spec/kernel: carve the package-registry persistence out ofmarketplaceinto an always-on core capability #18694 landed without touching the skill.skills/**for exactly this shape isscripts/check-skill-identifier-liveness.mjsLeg 2 (its header: 「the missing row — a doc enumeration presented as exhaustive stopped growing when the schema did」); registering this section's enumeration (the :442 table plus the two bullets) againstPLATFORM_CAPABILITY_TOKENSthere would flagpackage-registrytoday, while a prose COUNT such as 「all 20」 is outside both of its legs (existence, not arithmetic) andcheck-skills-token-ratchet.mjsprices bytes, not claims.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 remains open — the example block's TypeScript range in this file is a different number and is not folded.Generated by Claude Code