Skip to content

docs(skills): navigation.md states the measured behaviour of colSpan and span: 'full', drops the deprecated claim - #18674

Merged
os-zhuang merged 1 commit into
mainfrom
claude/issue-18496-navigation-span-colspan
Sep 18, 2026
Merged

os-zhuang merged 1 commit into
mainfrom
claude/issue-18496-navigation-span-colspan

Conversation

@os-justin

Copy link
Copy Markdown
Collaborator

Fixes #18496

Clause-②: no

One bullet in one published rule file. skills/objectstack-ui/rules/navigation.md (the 「Field width」 bullet, :136–:139 on origin/main 30be2ac0b) prescribed span: 'full' as "the whole row" and told authors not to use colSpan because "it only lines up at one width and is deprecated". #17328 measured both rendering claims false in Chromium at 390 / 720 / 1700, PR #18492 removed them from packages/spec and the generated reference page, and nothing in packages/spec deprecates colSpan. This was the last prescriptive carrier in the tree, and the one npx skills add objectstack-ai/objectstack/skills ships to customer projects. The bullet now says what the spec declares and the measurement found; it prescribes no preference between the two keys, because the spec does not (PR #18492: 「The preference between the two keys is removed, not reversed」).

The bullet, before and after

Before (origin/main 30be2ac0b, :136–:139):

- **Field width.** Use the relative **`span: 'full'`** to make a field take the
  whole row; otherwise **omit it** (`auto` sizes by widget type × current columns —
  textarea / rich-text / file take the row automatically). Do **not** use the
  absolute `colSpan` — it only lines up at one width and is deprecated.

After (7155de6ac, :136–:141):

- **Field width.** **Omit it** (`auto` sizes by widget type × current columns —
  textarea / rich-text / file take the row). Both keys are valid: `colSpan`
  (1–4) is clamped to the current column count, grid-aligned at every width;
  `span: 'full'` resolves to the form grid's full column count, but the shipped
  renderer emits it at the widest tier only (a 3-column form: one cell of two
  in a modal).

Two restatements in the same section are deleted to pay the token ratchet (below); no other line moves:

  • 「Overlay width」 :142–:143 → :144: the parenthetical 「(they can't be chosen without knowing the client viewport)」 is gone. It restated the section intro :127–:128 「because an author (especially an AI) cannot know the client's screen」. The 「width / drawerWidth are deprecated」 clause it hung on stays, and it is true: packages/spec/src/ui/view.zod.ts:3539–:3540 carries @deprecated on drawerWidth and the describe opens [DEPRECATED → size buckets].
  • 「Column count」 :146–:147 → :147: the closing 「; the columns adapt themselves」 is gone. It restated the bullet's own first sentence, 「Not authored. The form grid follows its real rendered width via container queries」.

What the spec declares — packages/spec/src/ui/view.zod.ts at 30be2ac0b

  • :2664 colSpan: z.number().int().min(1).max(4).optional(), describe: 「Absolute column span (1-4). The renderer clamps it to the form grid's current column count, so the cell starts at a real column boundary at every surface width and never overflows (colSpan: 4 in a 3-column grid renders as 3); a colSpan within the column count renders as authored, and colSpan: 1 emits no span class at all.」
  • :2676 span: z.enum(['auto', 'full']).default('auto'), describe: 「'auto' (default — omit it): the renderer sizes the field from its widget type × the current column count (wide widgets like textarea/richtext/json/file/subform take the whole row). 'full': resolves to the form grid's full column count. How far down the container-query tiers that span is emitted is the renderer's, not this key's: at the .objectui-sha pin 53ded82bf7 only the widest tier's class is emitted (@2xl:col-span-3 for a 3-column grid), so at intermediate widths the field took a single cell, not the row (one of two at the 720px modal width; measured in Chromium at viewport widths 390, 720 and 1700).」
  • :2665–:2675 the TSDoc above span: objectui#9253 (objectui bd09957380, 2026-09-12) is 「ahead of that pin」 and the block says 「re-read this block at the pin bump that absorbs it」.
  • Nothing deprecates colSpan, measured over packages/spec/src: .deprecated( → 0 files; retiredKey( calls naming colSpan → 0; UNKNOWN_KEY_GUIDANCE (7 files) and RETIRED_KEY_GUIDANCE (8 files) → 0 colSpan lines inside them; the ADR-0087 registries packages/spec/src/conversions/* and packages/spec/src/migrations/* → 0 colSpan lines (positive control: namespace / tableName / sourceView hit conversions/registry.ts ×3, apply.ts ×2, types.ts ×2, stored.ts ×1); colSpan lines co-occurring with deprecat|retire|legacy → 0. The changeset PR docs(spec,ui): colSpan and span state their measured behaviour — the two claims #17328 falsified are gone #18492 landed (.changeset/17670-colspan-span-measured-behaviour.md) states 「Nothing an author writes moves. Both keys are unchanged, both still parse」.
  • The generated reference page content/docs/references/ui/view.mdx:201–:202 and content/docs/ui/views.mdx:449–:450 say the same two sentences; content/docs/protocol/objectui/layout-dsl.mdx:254–:262 (「Custom Span Widths」) says 「widest tier only at objectui 53ded82bf7 … one clamped class per tier since objectui#9253」.

What the measurement found — #17328, Chromium at 390 / 720 / 1700

From the card's geometry table (hotcrm at 427c98535d, @objectstack/* 17.4.0, one 3-column section, helpful_count cell):

authored 390 (1 col) 720 (2 cols) 1700 (3 cols) emitted class
none 358 285 495 —
colSpan: 2 358 586 (2 of 2) 1006 (2 of 3) @md:col-span-2
span: 'full' 358 285 (1 of 2 — pixel-identical to none) 1517 @2xl:col-span-3
colSpan: 4 358 285 1517 @2xl:col-span-3 (identical to span: 'full')
colSpan: 1 358 285 495 none

Overflow 0px in every configuration at every width. So: colSpan is clamped and grid-aligned at every width (the old bullet's 「only lines up at one width」 is contradicted at all three), and span: 'full' at the pinned renderer is one cell of two at the modal width (the old bullet's 「the whole row」 is false there). The bullet's parenthetical 「a 3-column form: one cell of two in a modal」 is that row; it is qualified to a 3-column form because a 2-column form grid resolves 'full' to 2 and emits @md:col-span-2, which is the row at 720.

Is the pin state still the shipped state on 30be2ac0b? .objectui-sha = 53ded82bf7a494f54e344e19099dbf00854b8694, untouched since PR #18492 merged (git log 3a9ad22ecf..HEAD -- .objectui-sha is empty). In the objectui clone (git rev-parse --is-shallow-repository = false): git merge-base --is-ancestor bd09957380 53ded82bf7 → exit 1; control leg PIN~5 (83c77dc30, 2026-09-05) → exit 0; reverse is-ancestor 53ded82bf7 bd09957380 → exit 0; git tag --contains bd09957380 → 0 tags. The span-ladder fix is ahead of the pin and unreleased, so 「the shipped renderer emits it at the widest tier only」 is true today. It stops being true at the pin bump that absorbs bd09957380 — the same event the spec TSDoc :2675 tells its own reader to re-read at; see acceptance note 3.

Why no preference is prescribed

The dispatch left the direction to the measurement: 「If the measurement says neither spelling is to be discouraged, say so; if it says colSpan is the safer primitive, say that」. At the pin, colSpan is the one that does what it says at every width, and a rule could say so — but the spec (the protocol, per 「我们的项目以objectstack 协议为准,文档应该以实际实现为准」) declares both keys without preference after PR #18492's at-tier contract review, and the renderer half is already fixed ahead of the pin (objectui#9253), after which 'full' is the whole row at every multi-column tier and a colSpan-first rule would need reversing again. So the bullet states each key's declared behaviour and the measured caveat, and lets the author choose; it calls neither deprecated because the spec does not.

Token ratchet — scripts/check-skills-token-ratchet.mjs:472 ['skills/objectstack-ui/rules/navigation.md', 2273], unchanged

Convention ceil(utf8 bytes / 4). Before: 9092 bytes → 2273 tokens (ceiling 2273, headroom 0). After (7155de6ac): 9091 bytes → 2273 tokens (ceiling 2273; headroom 0) — the gate's own line: 「✓ check-skills-token-ratchet: skills/objectstack-ui/rules/navigation.md is 2273 tokens (ceiling 2273; headroom 0).」 Arithmetic: bullet 319 → 411 bytes (+92); the two deletions −61 and −32 (−93); net −1 byte. Row not raised, not lowered. File 162 → 162 lines; widest line in the section 84 (file-wide 181, a code example, unchanged).

Sweep — git grep -z -l -F, excluding content/docs/releases/ and **/CHANGELOG.md, files

phrase before (30be2ac0b) after (7155de6ac)
only lines up at 2 — skills/objectstack-ui/rules/navigation.md, .changeset/17670-colspan-span-measured-behaviour.md 1 — the changeset only
at any column count 1 — the changeset 1 — the changeset
lint-discouraged 1 — examples/app-showcase/src/ui/views/task.view.ts (carrier 2, boundary) 1 — unchanged, not this PR's
is deprecated 40 files; in navigation.md 1 line 39 files; in navigation.md 0
files carrying both colSpan and is deprecated 3 — view.zod.ts, references/ui/view.mdx, navigation.md 2 — view.zod.ts, view.mdx (there 「is deprecated」 is on other keys; 0 same-line hits with colSpan)
lit control colSpan 35 35
dark control zzz-no-such-token 0 0

The changeset carries the two old phrases as quotations of the wording it removed — a historical record by construction, consumed into CHANGELOG.md at release (which the exclusion set already exempts); it is not a prescription and is not touched.

Gates (worktree at 7155de6ac)

node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack — change set derived from git, 1 path vs merge base 30be2ac0b — derived 22 commands; every one run with redirect-then-$? capture; --ran reconcile: 「22 derived, 22 run, 0 NOT-MEASURED, 0 UNRUN」, exit 0.

node scripts/check-ci-filter-parity.mjs :: exit 0
node scripts/check-closing-keyword-parity.mjs :: exit 0
node scripts/check-closing-keyword-parity.mjs --self-test :: exit 0
node scripts/check-comment-mask-corpus.mjs :: exit 0
node scripts/check-doc-route-spelling.mjs --advisory :: exit 0
node scripts/check-doc-route-spelling.mjs --self-test :: exit 0
node scripts/check-skills-token-ratchet.mjs :: exit 0
node scripts/check-skills-token-ratchet.mjs --self-test :: exit 0
pnpm check:agent-test-spelling :: exit 0
pnpm check:corpus-claim-drift :: exit 0
pnpm check:cross-package-test-inputs :: exit 0
pnpm check:doc-authoring :: exit 0
pnpm check:driver-memory-census :: exit 0
pnpm check:nul-bytes :: exit 0
pnpm check:pm-governed-merges :: exit 0
pnpm check:refd-timer-probe :: exit 0
pnpm check:role-word :: exit 0
pnpm check:skill-compatibility :: exit 0
pnpm check:skill-frame-sync :: exit 0
pnpm check:skill-identifier-liveness :: exit 0
pnpm check:watch-hint-literal :: exit 0
pnpm --filter @objectstack/lint run check:doc-formula-expressions :: exit 0

Named verdicts: check:doc-authoring 「44 published skill files clean — no internal issue-id references」; check-skills-token-ratchet --self-test 「65 cases pass」; check:skill-identifier-liveness --self-test OK and the gate exit 0; check:skill-compatibility 「10 SKILL.md file(s) reconciled against 81 workspace packages」; check:nul-bytes exit 0. check:doc-formula-expressions was run after pnpm --filter '@objectstack/lint...' build under scripts/pm/os-verify-lock.sh (「VERDICT command-exit 0 · held the lock 186s · waited 0s」). Not owed locally: no ① dependency-closure build and no ② package test (the diff touches no package); the 51 artifact-roster, 11 wide-population and 2 workflow-valued families are CI's own.

Governed: node scripts/pm/check-governed-merges.mjs --test skills/objectstack-ui/rules/navigation.md → exit 3, 「GOVERNED — a human merge is the review record for this PR … skills/** ×1 — the published skills catalog」. Recorded as GOVERNED, not as a failure. Draft; no seat flips it ready, queues it or arms auto-merge; the maintainer's approval lands it (Prime Directive #14).

Control characters: grep -naP over the touched file → no match (exit 1).

Changeset — skip-changeset, by measurement

83 tracked package.json manifests read: 0 carry a files[] entry naming a skills path (positive control: 70 name dist); skills/*/package.json → 0; the catalog ships from the GitHub tree (skills/README.md:9 npx skills add objectstack-ai/objectstack/skills; packages/create-objectstack/src/skills-install.ts:62 SKILLS_CATALOG = 'objectstack-ai/objectstack/skills'), never inside an npm tarball; .github/workflows/pr-automation.yml:799 names skills/** among the releases-nothing paths.

Acceptance notes

Out of this PR's scope; nothing is filed by this PR.

  1. noted, not filed — 承接者: the card's own routing round. Carrier 2, examples/app-showcase/src/ui/views/task.view.ts:363–:366 (「'full' = whole row at any / derived column count — the primary primitive; absolute colSpan / is legacy and lint-discouraged」, wrapped across comment lines; the lint rule it names was withdrawn by [finding] absolute-colspan-discouraged asserts a misalignment that does not happen — measured in Chromium at all three surface widths, and its recommended alternative span: 'full' is the spelling that misrenders #17328). skills/objectstack-ui/rules/navigation.md still prescribes span over colSpan on the basis #17328 measured false, and calls colSpan deprecated when nothing in packages/spec deprecates it #18496 records it as a boundary, not an expansion; left exactly as found, and the sweep row above keeps it visible.
  2. noted, not filed — 承接者: the pin-bump PR that absorbs objectui bd09957380 (PR docs(spec,ui): colSpan and span state their measured behaviour — the two claims #17328 falsified are gone #18492's acceptance note 5 names the same event; dedupe words spanLadderFor, objectui#9253, span-full-tier-ladder). The new bullet's 「the shipped renderer emits it at the widest tier only」 is anchored to the current pin the way the spec describe is, but no gate watches skills/** for pin-state prose (packages/spec/scripts/check-objectui-pin-citations.ts scans packages/spec/src only), so that PR must re-read navigation.md:139–:141 alongside view.zod.ts:2665–:2676.
  3. noted, not filed — 承接者: whoever next edits that interface block (PR docs(spec,ui): colSpan and span state their measured behaviour — the two claims #17328 falsified are gone #18492 note 4 says the same). content/docs/protocol/objectui/layout-dsl.mdx:850 lists a FormField interface with colSpan and no span — incompleteness, not an error; the card's own refs exclude it.
  4. noted, not filed — 承接者: 无. .changeset/17670-colspan-span-measured-behaviour.md still carries 「only lines up at」 and 「at any column count」 as quotations of the removed spec wording; release consumes it into CHANGELOG.md, where the exclusion set already expects them.

维护者速读(草稿)

改了什么:skills/objectstack-ui/rules/navigation.md「Record Presentation」一节的「Field width」要点重写:不再规定「用 span: 'full' 占满整行、别用 colSpan,它只在一种宽度对齐且已弃用」,改为按 packages/spec 的声明陈述两个键——默认省略(auto);两个键都合法;colSpan(1–4)被渲染器夹到当前列数、在每个宽度都对齐网格;span: 'full' 解析为表单网格的满列数,但当前出货的渲染器只在最宽一档发出它(3 列表单在弹窗里只占两格中的一格)。为了守住 token 棘轮(该文件上限 2273、余量 0),同一节删掉两处重复表述:「Overlay width」里的括号原因句(节首已说过同一理由)和「Column count」末尾的「the columns adapt themselves」(该要点首句已说)。棘轮行不动,实测仍是 2273。

为什么改:#17328 在 Chromium 三个宽度实测:colSpan 被夹紧、每个宽度都对齐;而被推荐的 span: 'full' 在弹窗宽度只占一格、与不写一样。PR #18492 已把这两句从 spec 与生成的参考页移掉,并明确「两键之间的偏好是移除、不是反转」。这一条是树里最后一处仍在规定旧说法的载体,而且随 npx skills add 出货到客户项目;「deprecated」一句更是独立于实测就是假的——spec 里没有任何东西弃用 colSpan(.deprecated() 0、retiredKey 0、ADR-0087 转换表 0、UNKNOWN_KEY_GUIDANCE 0)。

风险与代价(含回滚):① 新要点的「当前出货的渲染器只在最宽一档发出」锚定在 .objectui-sha 53ded82bf7(objectui 修复 bd09957380 在 pin 之后、尚未发布,双腿实测);pin 升级吸收该修复时这句要跟着重读,spec 的 TSDoc 对自己也写了同一句提醒,但 skills/** 没有门禁盯 pin 状态的散文——已记在验收备注 2,承接者是 pin 升级 PR。② 不再给作者一个「首选拼法」,由作者按两句事实自选;这与 spec 现状一致。③ 同节另两处删除只删重复表述,不删事实。回滚 = revert 单个提交(单文件,无发布物,无 changeset)。

席位意见:

你要做的(一个动作):批准并合并本 PR(受管面 skills/**,需你点合并)。


Generated by Claude Code

…ure as, drops the deprecated claim

The Field width bullet in skills/objectstack-ui/rules/navigation.md
prescribed span: 'full' as the whole row and called colSpan deprecated
and misaligned at every width but one. Browser measurement at three
surface widths found the opposite: colSpan is clamped to the current
column count and grid-aligned at every width, while span: 'full' is
emitted by the pinned renderer at the widest tier only. Nothing in
packages/spec deprecates colSpan.

The bullet now states both keys as packages/spec declares them, with
the tier caveat the spec anchors to the objectui pin. Two restatements
in the same section are deleted to hold the token ceiling: the overlay
bullet's reason clause (already the section intro's) and the column
bullet's closing clause (already its first sentence).

Claude-Session: https://claude.ai/code/session_01Gqi43smmqjJ5sUrhfoPeKu
Co-authored-by: Claude <noreply@anthropic.com>

Copy link
Copy Markdown
Collaborator Author

维护者速读(终稿)

skills 席 session_01Gqi43smmqjJ5sUrhfoPeKu,2026-09-17T14:12Z。对照本席自己读的 diff 校正 dev 草稿;席位意见已填。

改了什么 — 只改发布技能 skills/objectstack-ui/rules/navigation.md 一节(+8 / −8,162 行不变,token 棘轮 2273/2273 零余量守住)。「Field width」那条从「用相对的 span: 'full'……⛔ 别用绝对的 colSpan,它只在一种宽度下对齐且已弃用」改为:默认省略(auto);两个键都有效:colSpan(1–4)按当前列数钳制、每种宽度都对齐网格;span: 'full' 解析为表单网格的满列数,但当前出货的渲染器只在最宽档位输出(3 列表单在弹窗里占两格中的一格)。为了在零余量下塞进真话,同节删了两句重复(Overlay 宽度的括号解释、Column count 的收尾句),PR 正文逐句点名了各自重复的原句。

为什么改 — #17328 实测把这两条主张判为假,PR #18492 已从 packages/spec 和生成的参考页里移除;这一行是树上最后一处还在规定它们的地方,而且它是规定性的、随产品出货到客户项目、规定的正是测量判在更差一侧的拼法。「已弃用」独立于 #17328 也是假的:packages/spec 里没有任何东西弃用 colSpan(本席核对了 :2664 / :2676 的 describe)。

风险与代价(含回滚) — 受管发布面,只改文本;不动 spec、不动示例、不抬棘轮。新句里「渲染器只在最宽档位输出」锚在当前 .objectui-sha 钉(53ded82bf7,objectui#9253 的修复在钉之前),与 spec 自己的 describe 同样锚定 —— 抬钉的 PR 要回来重读这一条(dev 已记,本席也记)。回滚 = revert 一个提交。

席位意见 — 荐合。它把规则改成 spec 和测量说的话,不是把旧句反过来;偏好被移除而非反转,与 PR #18492 一致。

你要做的(一个动作) — Approve 本 PR(或直接人工合并);席位随后按裁定 C 落地。若你希望技能明确偏好某一个键,Request changes 并说哪个,本席另起。


Generated by Claude Code

@os-zhuang
os-zhuang marked this pull request as ready for review September 18, 2026 01:12
@os-zhuang
os-zhuang added this pull request to the merge queue Sep 18, 2026
Merged via the queue into main with commit 62b114f Sep 18, 2026
44 checks passed
@os-zhuang
os-zhuang deleted the claude/issue-18496-navigation-span-colspan branch September 18, 2026 01:44
akarma-synetal pushed a commit to akarma-synetal/framework that referenced this pull request Sep 28, 2026
…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>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

documentation Improvements or additions to documentation size/s skip-changeset PR has no user-facing published change; bypasses the changeset gate

Projects

None yet

2 participants