Repository navigation
docs(skills): navigation.md states the measured behaviour of colSpan and span: 'full', drops the deprecated claim - #18674
Conversation
…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>
维护者速读(终稿)skills 席 改了什么 — 只改发布技能 为什么改 — #17328 实测把这两条主张判为假,PR #18492 已从 风险与代价(含回滚) — 受管发布面,只改文本;不动 spec、不动示例、不抬棘轮。新句里「渲染器只在最宽档位输出」锚在当前 席位意见 — 荐合。它把规则改成 spec 和测量说的话,不是把旧句反过来;偏好被移除而非反转,与 PR #18492 一致。 你要做的(一个动作) — Approve 本 PR(或直接人工合并);席位随后按裁定 C 落地。若你希望技能明确偏好某一个键,Request changes 并说哪个,本席另起。 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 #18496
Clause-②: no
One bullet in one published rule file.
skills/objectstack-ui/rules/navigation.md(the 「Field width」 bullet,:136–:139onorigin/main30be2ac0b) prescribedspan: 'full'as "the whole row" and told authors not to usecolSpanbecause "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 frompackages/specand the generated reference page, and nothing inpackages/specdeprecatescolSpan. This was the last prescriptive carrier in the tree, and the onenpx skills add objectstack-ai/objectstack/skillsships 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/main30be2ac0b,:136–:139):After (
7155de6ac,:136–:141):Two restatements in the same section are deleted to pay the token ratchet (below); no other line moves:
: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/drawerWidthare deprecated」 clause it hung on stays, and it is true:packages/spec/src/ui/view.zod.ts:3539–:3540carries@deprecatedondrawerWidthand the describe opens[DEPRECATED → size buckets].: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.tsat30be2ac0b:2664colSpan: 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: 4in a 3-column grid renders as 3); acolSpanwithin the column count renders as authored, andcolSpan: 1emits no span class at all.」:2676span: 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-shapin53ded82bf7only the widest tier's class is emitted (@2xl:col-span-3for 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–:2675the TSDoc abovespan: objectui#9253 (objectuibd09957380, 2026-09-12) is 「ahead of that pin」 and the block says 「re-read this block at the pin bump that absorbs it」.colSpan, measured overpackages/spec/src:.deprecated(→ 0 files;retiredKey(calls namingcolSpan→ 0;UNKNOWN_KEY_GUIDANCE(7 files) andRETIRED_KEY_GUIDANCE(8 files) → 0colSpanlines inside them; the ADR-0087 registriespackages/spec/src/conversions/*andpackages/spec/src/migrations/*→ 0colSpanlines (positive control:namespace/tableName/sourceViewhitconversions/registry.ts×3,apply.ts×2,types.ts×2,stored.ts×1);colSpanlines co-occurring withdeprecat|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」.content/docs/references/ui/view.mdx:201–:202andcontent/docs/ui/views.mdx:449–:450say the same two sentences;content/docs/protocol/objectui/layout-dsl.mdx:254–:262(「Custom Span Widths」) says 「widest tier only at objectui53ded82bf7… 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_countcell):colSpan: 2@md:col-span-2span: 'full'@2xl:col-span-3colSpan: 4@2xl:col-span-3(identical tospan: 'full')colSpan: 1Overflow 0px in every configuration at every width. So:
colSpanis clamped and grid-aligned at every width (the old bullet's 「only lines up at one width」 is contradicted at all three), andspan: '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-shais empty). In the objectui clone (git rev-parse --is-shallow-repository= false):git merge-base --is-ancestor bd09957380 53ded82bf7→ exit 1; control legPIN~5(83c77dc30, 2026-09-05) → exit 0; reverseis-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 absorbsbd09957380— the same event the spec TSDoc:2675tells 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
colSpanis the safer primitive, say that」. At the pin,colSpanis 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 acolSpan-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], unchangedConvention
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, excludingcontent/docs/releases/and**/CHANGELOG.md, files30be2ac0b)7155de6ac)only lines up atskills/objectstack-ui/rules/navigation.md,.changeset/17670-colspan-span-measured-behaviour.mdat any column countlint-discouragedexamples/app-showcase/src/ui/views/task.view.ts(carrier 2, boundary)is deprecatednavigation.md1 linenavigation.md0colSpanandis deprecatedview.zod.ts,references/ui/view.mdx,navigation.mdview.zod.ts,view.mdx(there 「is deprecated」 is on other keys; 0 same-line hits withcolSpan)colSpanzzz-no-such-tokenThe changeset carries the two old phrases as quotations of the wording it removed — a historical record by construction, consumed into
CHANGELOG.mdat 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 base30be2ac0b— derived 22 commands; every one run with redirect-then-$?capture;--ranreconcile: 「22 derived, 22 run, 0 NOT-MEASURED, 0 UNRUN」, 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 OKand the gate exit 0;check:skill-compatibility「10 SKILL.md file(s) reconciled against 81 workspace packages」;check:nul-bytesexit 0.check:doc-formula-expressionswas run afterpnpm --filter '@objectstack/lint...' buildunderscripts/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 -naPover the touched file → no match (exit 1).Changeset —
skip-changeset, by measurement83 tracked
package.jsonmanifests read: 0 carry afiles[]entry naming askillspath (positive control: 70 namedist);skills/*/package.json→ 0; the catalog ships from the GitHub tree (skills/README.md:9npx skills add objectstack-ai/objectstack/skills;packages/create-objectstack/src/skills-install.ts:62SKILLS_CATALOG = 'objectstack-ai/objectstack/skills'), never inside an npm tarball;.github/workflows/pr-automation.yml:799namesskills/**among the releases-nothing paths.Acceptance notes
Out of this PR's scope; nothing is filed by this PR.
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.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 wordsspanLadderFor,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 watchesskills/**for pin-state prose (packages/spec/scripts/check-objectui-pin-citations.tsscanspackages/spec/srconly), so that PR must re-readnavigation.md:139–:141alongsideview.zod.ts:2665–:2676.content/docs/protocol/objectui/layout-dsl.mdx:850lists aFormFieldinterface withcolSpanand nospan— incompleteness, not an error; the card's own refs exclude it..changeset/17670-colspan-span-measured-behaviour.mdstill carries 「only lines up at」 and 「at any column count」 as quotations of the removed spec wording; release consumes it intoCHANGELOG.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、retiredKey0、ADR-0087 转换表 0、UNKNOWN_KEY_GUIDANCE0)。风险与代价(含回滚):① 新要点的「当前出货的渲染器只在最宽一档发出」锚定在
.objectui-sha53ded82bf7(objectui 修复bd09957380在 pin 之后、尚未发布,双腿实测);pin 升级吸收该修复时这句要跟着重读,spec 的 TSDoc 对自己也写了同一句提醒,但skills/**没有门禁盯 pin 状态的散文——已记在验收备注 2,承接者是 pin 升级 PR。② 不再给作者一个「首选拼法」,由作者按两句事实自选;这与 spec 现状一致。③ 同节另两处删除只删重复表述,不删事实。回滚 = revert 单个提交(单文件,无发布物,无 changeset)。席位意见:
你要做的(一个动作):批准并合并本 PR(受管面
skills/**,需你点合并)。Generated by Claude Code