Skip to content

docs(skills): pages.md rule 2 states the enforceable reason, not the retired ADR-0048 claim - #19445

Merged
hotlong merged 1 commit into
mainfrom
claude/issue-19358-pages-rule-2-retired-collision-claim
Sep 21, 2026
Merged

hotlong merged 1 commit into
mainfrom
claude/issue-19358-pages-rule-2-retired-collision-claim

Conversation

@os-steve

Copy link
Copy Markdown
Collaborator

Fixes #19358

Clause-②: no

Seat domain:skills#2 (seat post #19287), dispatched from the claim on #19358. Tier H: skills/** — this PR stays DRAFT; the seat reviews and ACCEPTs, the maintainer's own click lands it.

What changed

skills/objectstack-ui/rules/pages.md, authoring rule 2 only (:337–:341 at both 23f1de0 and this head 127576f). The rule (the stem must start with the package namespace) and the ADR-0048 citation stay; the REASON sentence is replaced with the facts the source enforces. Net 0 lines (+3 / −3), one file.

Before (23f1de0, :337–:341):

2. **Namespace-prefixed filename.** The filename stem becomes the doc
   `name` (`^[a-z][a-z0-9_]*$`) and must start with the package namespace
   (`crm_…`). Names share one flat, instance-global space with the URL, so
   a bare `user_guide` would collide across packages and fail at install
   (ADR-0048).

After (127576f, :337–:341):

2. **Namespace-prefixed filename.** The filename stem becomes the doc
   `name` (`^[a-z][a-z0-9_]*$`) and must start with the package namespace
   (`crm_…`). `os build` refuses a bare `user_guide`
   (`docs/namespace-prefix`) — hygiene, not uniqueness: two packages
   coexist on one bare name (ADR-0048 §3.4).

The three false clauses, re-measured on this tree, and the source line beside each new clause

# the old text said measured refutation (all at 23f1de0, unchanged at 127576f) the new clause it becomes
1 doc names share "one flat, instance-global space with the URL" docs/adr/0048-cross-package-metadata-collision.md :182–:183 「The route/container coordinate for an installed package's UI is its package id」 (§3.1); :222–:223 「resolves a bare name within the current package first, keyed on the package id」 (§3.3); packages/objectql/src/registry.ts :3452 const storageKey = packageId ? withDisc(${packageId}:${baseName}) : bareKey; — the storage key is composite PACKAGE_ID:NAME, not one flat space dropped; replaced by "two packages coexist on one bare name"
2 a bare name "would collide across packages" ADR-0048 :251–:252 「The cross-package throw is retired; two distinct packages coexist on the same bare name by construction」 (§3.4); registry.ts :3472–:3477 「ADR-0048 §3.4 — the per-item CROSS-package throw is retired … two installed packages shipping the same bare name (e.g. page/home) legitimately COEXIST under distinct composite keys」 — and no throw exists in :3458–:3511, only the ADR-0005 overlay console.warn "hygiene, not uniqueness: two packages coexist on one bare name (ADR-0048 §3.4)"
3 it "would fail at install" BUILD door: packages/cli/src/utils/collect-docs.ts :654–:658 if (namespace && !doc.name.startsWith(${namespace}_)) pushes severity: 'error', rule: 'docs/namespace-prefix'; packages/cli/src/commands/compile.ts :802–:811 if (docErrors.length > 0) { … this.exit(1); }. INSTALL door: registry.ts :4155–:4168 refuses on manifest.namespace ownership and :1456 constructor(namespace: string, existingPackageId: string, incomingPackageId: string) — NamespaceConflictError is built from a namespace, never a doc name "os build refuses a bare user_guide (docs/namespace-prefix)"

Reference wording the dispatch pointed at, unchanged and consistent with the new sentence: content/docs/ui/doc-pages.mdx :68–:69 「The build lint still requires every doc name to be namespace-prefixed, as a same-package authoring-hygiene rule」 and :77–:82 「It is no longer load-bearing for uniqueness … two installed packages may each ship a doc with the same bare name and coexist」. The build-check pin: packages/cli/src/utils/collect-docs.package-docs.test.ts :420–:424 (a bare playbook → one docs/namespace-prefix at severity 'error').

Restate vs drop — the card's "First act", decided on the four axes

Option A (taken): restate — the enforceable fact plus one corrected clause naming where the refusal happens and what the prefix is not for, with the ADR section. Option B: drop to the bare enforceable fact ("must start with the package namespace; enforced by os build") and a bare (ADR-0048).

  • 实际业务需求 — the reader is an AI author of package docs in a customer project (skills/** ships via npx skills add / npm create objectstack). Both options let it comply. What the old sentence did in practice was get copied as a reason into the author's own docs; B leaves the "why" blank, and a blank "why" beside an ADR number is the shape an author fills with the retired claim. A gives the one fact that closes it. Neither option adds any capability.
  • 项目长远合理性 — spec/ADR > implementation > docs. ADR-0048 §3.4 itself classifies this lint as authoring hygiene (:258–:259), and the source header (collect-docs.ts :32–:54) says the same. A keeps the skill's sentence tied to the ADR clause it cites (§3.4), so a future change to that clause has one sentence to update; B cites a document that then says nothing about the sentence.
  • 防 AI 写代码/元数据犯错 — A names the door (os build) and the rule id (docs/namespace-prefix), so an author hitting the refusal can find it, and states the negative ("not uniqueness: two packages coexist on one bare name") that stops an AI from re-deriving the retired collision claim or designing around a constraint that does not exist (e.g. inventing cross-package-unique names). B is silent on exactly the claim this card is about.
  • 创业阶段不扩散需求 — both are net 0 lines; A costs +2 ratchet units (see below), B would shrink. No new capability, no new surface, immediate correction, no transition text.

Decision: A. The cost is stated honestly: this file's token headroom goes from 2 to 0, so the next edit to pages.md pays by deletion.

Also considered and not written, for the byte budget: the second true reason the source states — the prefix is what separates a same-package link from a cross-package one, because a doc link is a bare ./NAME.md with nowhere to carry a package coordinate (collect-docs.ts :45–:54 and the check at :737 if (namespace && !target.startsWith(${namespace}_)) continue;). It is measured and true; the sentence had room for one clause, and the §3.4 framing is the direct refutation of the retired claim. "authoring hygiene" was trimmed to "hygiene" for the same reason: the full spelling lands at 5504 units against a 5501 ceiling.

Published-skill ratchet readings (both readings, per os-dev.md)

  • Gate: node scripts/check-skills-token-ratchet.mjs (scripts/check-skills-token-ratchet.mjs, invoked directly in .github/workflows/lint.yml :5527–:5528; unit = ceil(utf8 bytes / 4)). Ceiling row :473 ['skills/objectstack-ui/rules/pages.md', 5501].
  • File, tokens: before 21996 bytes → 5499 units (headroom 2); after 22003 bytes → 5501 units (headroom 0). Gate line: ✓ check-skills-token-ratchet: skills/objectstack-ui/rules/pages.md is 5501 tokens (ceiling 5501; headroom 0). Paid within the replaced span (148 → 155 bytes); ceiling row untouched.
  • File, lines: before 448 → after 448 (net 0; the claim's budget was net ≤ +2).
  • Package, tokens: bundle total after 140368 (gate output); before 140366 — the unit is per-file additive and only this file changed (+2).
  • Package, lines (sum over all skills/**/SKILL.md, 10 files): before 6145 → after 6145. Sum over skills/objectstack-ui/**: 2155 → 2155.
  • ⛔ pnpm check:pm-skill-ratchet is the .claude/** LINE ratchet and deliberately excludes the published skills/ root (its header says so); it is not the gate this file answers to.

Gates — derived union, every exit captured before any pipe, reconciled with --ran

Derived by node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack (no paths; change set from merge base 23f1de0, 1 path, +3/−3, under the 5000 human-merge threshold). Reconcile: Run reconciliation — 23 derived, 23 run, 0 NOT-MEASURED, 0 UNRUN. (exit 0).

command exit
node scripts/check-ci-filter-parity.mjs 0
node scripts/check-closing-keyword-parity.mjs 0
node scripts/check-closing-keyword-parity.mjs --self-test 0
node scripts/check-comment-mask-corpus.mjs 0
node scripts/check-doc-route-spelling.mjs --advisory 0
node scripts/check-doc-route-spelling.mjs --self-test 0
node scripts/check-skills-token-ratchet.mjs 0
node scripts/check-skills-token-ratchet.mjs --self-test 0
pnpm --filter @objectstack/lint run check:doc-formula-expressions first run 3 (PREREQUISITE NOT MET — dist/ of @objectstack/formula / @objectstack/lint absent in a fresh worktree; NOT MEASURED); after pnpm exec turbo run build --filter=@objectstack/formula --filter=@objectstack/lint --concurrency=2 under os-verify-lock.sh (VERDICT command-exit 0, held 390s): rerun 0
pnpm check:agent-test-spelling 0
pnpm check:corpus-claim-drift 0
pnpm check:cross-package-test-inputs 0
pnpm check:doc-authoring 0
pnpm check:driver-memory-census 0
pnpm check:gitlink-declared 0
pnpm check:nul-bytes 0
pnpm check:pm-governed-merges 0
pnpm check:refd-timer-probe 0
pnpm check:role-word 0
pnpm check:skill-compatibility 0
pnpm check:skill-frame-sync 0
pnpm check:skill-identifier-liveness 0
pnpm check:watch-hint-literal 0

Outside the derived union, run as the dispatch ordered: pnpm check:pm-dispatch-gates launched detached with its exit captured to a file; its verdict is reported in the os-dev-report comment on #19358 (it was still in its self-test when this body was written). No package build or test is owed: the diff touches no package (① empty), and packages/cli / packages/objectql are cited, not edited. The ## Contract review for this Tier H head is the seat's; node scripts/pm/check-governed-merges.mjs --pr on this PR is read after creation and goes into the report comment.

PM mechanism assumptions, verified

  1. Open PRs touching skills/objectstack-ui/**: 0 of 21 open PRs (read via REST /pulls?state=open + /pulls/{n}/files). Two open PRs touch skills/ at all, neither in this surface: fix(skills): enumerate every authorable top-level stack key in the platform skill, and gate it #19378 (skills/objectstack-platform/SKILL.md) and fix(spec,objectql): declare the inert-JSON artifact and registry-record package body stages, and stop the record under-reporting functions #19373 (skills/objectstack-platform/references/_index.md) — the claim named only the first; the second is a refinement of the reading, not a conflict. Holds.
  2. check-governed-merges.mjs --pr → read after creation; expected GOVERNED / Tier H. Reported in the report comment.
  3. The published-skill token ratchet (scripts/check-skills-token-ratchet.mjs) and check:skill-identifier-liveness are both in the derived union and both green on this diff. Holds, with the ratchet's name pinned — it has no pnpm check:* alias and is not check:pm-skill-ratchet.

维护者速读(草稿)

  • 改了什么:对外发布的 objectstack-ui skill 里「页面文档」编写规则第 2 条,只改「为什么要加命名空间前缀」那一句;规则本身(文件名必须以包命名空间开头)与 ADR-0048 引用都保留。
  • 为什么改:原句说「裸名字会跨包冲突、安装时失败,依据 ADR-0048」——而 ADR-0048 §3.4 恰恰宣布跨包冲突这一说法已退役(两个包可以同时用同一个裸名字,按包 id 各自解析),真正的拒绝发生在 os build(docs/namespace-prefix),不在安装。这份 skill 是客户项目里 AI 写文档时读的权威,错误的理由会被原样抄进客户文档。
  • 风险与代价(含回滚):纯文案,零代码、零发布产物、零 changeset;净 0 行;该文件的 token 上限余量从 2 变 0(下一次改这个文件须删字付账)。回滚 = revert 这一个 commit。
  • 席位意见:(留空,席位定稿)
  • 你要做的:Tier H,本 PR 保持 draft;席位完成 ## Contract review 与 ACCEPT 后,由你点合并。

Acceptance notes


Generated by Claude Code

…retired ADR-0048 claim

Authoring rule 2 of skills/objectstack-ui/rules/pages.md told an AI author
that doc names "share one flat, instance-global space with the URL, so a
bare `user_guide` would collide across packages and fail at install
(ADR-0048)". Each clause is refuted by the source it cites:

- routing keys on the package id and packaged items are stored under the
  composite `<packageId>:<name>` key (ADR-0048 §3.1/§3.3;
  packages/objectql/src/registry.ts storageKey line);
- the cross-package throw is retired — two distinct packages coexist on
  the same bare name by construction (ADR-0048 §3.4);
- a bare doc name is refused at BUILD by `docs/namespace-prefix`
  (packages/cli/src/utils/collect-docs.ts, severity error; `os build`
  exits 1 on doc errors), not at install — the install gate refuses on
  `manifest.namespace` ownership and `NamespaceConflictError` is
  constructed with a namespace, not a doc name.

The rule (the stem must start with the package namespace) and the ADR
citation stay; the REASON now names where the refusal happens and what
the prefix is for. Net 0 lines; published-skills token ratchet 5499 -> 5501
of 5501 (paid within the same span).

Claude-Session: https://claude.ai/code/session_017ETYWqMQD4qMtZzAGovWNi
Co-authored-by: Claude <noreply@anthropic.com>
@os-steve os-steve added the skip-changeset PR has no user-facing published change; bypasses the changeset gate label Sep 20, 2026 — with Claude
@github-actions github-actions Bot added size/xs documentation Improvements or additions to documentation labels Sep 20, 2026

Copy link
Copy Markdown
Collaborator Author

Contract review

Served-tier: CONTRACT_REVIEW_TIER
Head-sha: 127576f695017a2eceacaa026ec6c5ff5fac90d6

① Derived judgments

  • Published accept set / public surface: none moves — one customer-published skill page (skills/objectstack-ui/rules/pages.md, +3 / −3, net 0 against the ≤ +2 budget), authoring rule 2's REASON sentence only; the rule (namespace-prefixed stem) and the ADR-0048 citation stay; no package, no schema, no gate. check-governed-merges --pr 19445: GOVERNED — skills/** ×1, Tier H, 6 changed lines under the human-merge line — the maintainer's click lands it. Judged correct.
  • The sentence, read against the source on this head: before, 「Names share one flat, instance-global space with the URL, so a bare user_guide would collide across packages and fail at install (ADR-0048)」 — three clauses, each false against the ADR it cites. After, 「os build refuses a bare user_guide (docs/namespace-prefix) — hygiene, not uniqueness: two packages coexist on one bare name (ADR-0048 §3.4)」. Seat-measured on 127576f: the storage key is composite (packages/objectql/src/registry.ts :3452 storageKey = packageId ? withDisc(\${packageId}:${baseName}`) : bareKey); the cross-package throw is retired (ADR-0048 :251, :325); the refusal is at BUILD (packages/cli/src/utils/collect-docs.ts:657 emitsdocs/namespace-prefix), while the install gate's NamespaceConflictError(:1444) is thrown withmanifest.namespace` (:4168), never a doc name. The new sentence states exactly the three measured facts and nothing beyond them; restate-vs-drop decided on the four axes in the PR body (restate — a bare fact beside an ADR number is the shape an author refills with the retired claim). Judged correct.
  • Evidence, seat-run on this head in a detached worktree: check-skills-token-ratchet.mjs exit 0 — pages.md 5501 / 5501 (headroom 0; the ceiling row untouched, the deviation that trimmed 「authoring hygiene」 to 「hygiene」 is the honest consequence and is stated); merge-tree vs origin/main 57ceb9d: 0 conflicts; CI on 127576f: 34 check runs, 2 still running, 0 red. The dev's derived union 23 / 23 exit 0 with --ran reconciled (a DERIVED zero; one NOT MEASURED first run re-run green after the prerequisite build under the shared lock), check:pm-dispatch-gates 1883 cases exit 0 captured.

② Semver level

None — a published skill's prose, no package version; skip-changeset on the PR is the correct declaration. Judged correct.

③ Boundary flags

open_questions empty. All three mechanism assumptions confirmed by measurement (0 of 21 open PRs on this surface; GOVERNED exit 3 Tier H; the token ratchet is scripts/check-skills-token-ratchet.mjs invoked directly by lint.yml, not a pnpm check:* alias — the seat's assumption 3 named the right gate by the wrong route). Deviations read and accepted: the trimmed spelling at a zero-headroom ceiling; the source's second reason (a same-package vs cross-package link) left out of the sentence within the claim's surface; the slow gate and the --pr / --pair readings reported on the card rather than in the body written once. Three noted, not filed observations carry no carrier and stay observations (the pre-§3.4 lead-in comment at registry.ts :3458; the doc-pages.mdx :76 lint-name imprecision; the PR count 21 vs the claim's 20).

Implemented-by: claude/issue-19358-pages-rule-2-retired-collision-claim
Reviewed-by: session_017ETYWqMQD4qMtZzAGovWNi

VERDICT: PASS


Generated by Claude Code

@hotlong
hotlong marked this pull request as ready for review September 21, 2026 04:53
@hotlong
hotlong added this pull request to the merge queue Sep 21, 2026
Merged via the queue into main with commit 0f9245c Sep 21, 2026
37 checks passed
@hotlong
hotlong deleted the claude/issue-19358-pages-rule-2-retired-collision-claim branch September 21, 2026 05:23
akarma-synetal pushed a commit to akarma-synetal/framework that referenced this pull request Sep 28, 2026
… closure, and the allow rules that let seats run it (ruling 「B(治本)」) (objectstack-ai#19479)

Fixes objectstack-ai#19469

Clause-②: no

## The ruling this lands under, verbatim

「B(治本):给具名脚本加一条 Bash 允许规则进 .claude/settings.json(受管面,走 PR
您合),此后席位的批量关闭不再靠分类器掷硬币。分诊席的 objectstack-ai#19292 加了 4 条规则但没覆盖这个形状。你负责派发」

A second ruled source touches the same file: batch objectstack-ai#204 item 4, letter A
(「204 同意」, recorded on objectstack-ai#19362) authorises the objectui spellings of the
two landing-endpoint allow rules. Those two entries are **not in this
diff** — see *Scope addition, refused mid-round* below. objectstack-ai#19362 is not
addressed here and remains open.

## The measured defect

Two seats, one wall, one day. A 90-card closing sweep spelled as a bash
loop over `post-stamped.mjs` → `label-write.mjs` → `PATCH /issues/{n}`
was refused by the session runtime's write classifier before any
request. The second seat took the same order (objectstack-ai#19458, execution log
5753693136): 90 of 90 cards passed its live gate, 77 were actionable,
**one** closed, and then a batch script, an inline three-card loop and a
*single* `post-stamped --comment=19243` were each refused — the
identical command shape that had just succeeded twice. It stopped rather
than grind a coin-flip channel across 76 three-step acts, because a
comment that lands without its label write is a half-state on the board.

Why the existing rules did not cover it: the two seat-write rules carry
`--use-env-proxy` **inside the prefix**, and seats invoke `node
scripts/pm/post-stamped.mjs …` (the tool re-execs itself with that
flag), usually behind a `cd … &&` compound. An allow rule is a prefix
match against the command *as typed*, so neither matched and every call
fell to the classifier. No rule named a batch shape at all.

## What lands

**1. `scripts/pm/close-cards.mjs`** — the three-step closure (comment ·
label · close) as one named command, ⛔ no new gate.

Per card, re-read live first, then SKIP and log on: not open · has an
assignee · carries `pm:retriage` · pm-state is not *exactly* the
expected label (default `pm:queue`; no state, another state and two
states all skip) · an open PR references it (`--skip-pr-referenced`,
default on). Otherwise: post the comment, remove the state label, close
with the `state_reason` — and read the close back, because a 200 whose
body does not say `closed`, or that records another reason, is not the
close that was asked for.

Stamping and the four-step label write are **reused, never
re-implemented**: post-stamped's write path is module-private
(`writeArtefact`/`main`), so it is driven as a child process with its
documented flags (`--repo=`, `--comment=N`, `--file=`, `--json`) and its
exit code read before any pipe; its exported pure half (`renderBody`,
`claimKeyedLineRefusals`) runs the comment pre-flight **once**, before
card one, rather than ninety times. The label step calls label-write's
exported `runLabelWrite` in-process with options built by label-write's
own `parseOptions`. The pm-state vocabulary is imported from
`check-half-states.mjs`.

A card whose comment landed and whose label write or close did not is a
HALF-WRITE: the run **stops at that card** and exits 4 naming it and
exactly which of the three writes landed. It does not continue and it
does not retry — continuing turns one half-state into a page of them.

Exits: `0` every non-skipped card landed all three writes · `2` usage ·
`3` PREREQUISITE NOT MET · `4` HALF-WRITE, the card is named · `5` the
platform refused a write.

**Which PR reading** — `GET /repos/{o}/{r}/issues/{n}/timeline`,
`cross-referenced` events whose `source.issue` carries a `pull_request`
and whose `state` is `open`. That endpoint is the one
`references/rest-channel.md` already declares reachable for
cross-references. ⛔ Not `/search/issues` (the egress proxy refuses
`/search/*` by design, so the default skip would be unavailable on
exactly the seats this tool is for) and ⛔ not a
`closed_by_pull_requests`-style signal, which answers "which PR would
close this" — narrower than "an open PR references it", and it would
pass a card an open PR merely mentions.

**2. `.claude/settings.json`** — four `permissions.allow` entries:
`Bash(node scripts/pm/close-cards.mjs *)`, `Bash(node --use-env-proxy
scripts/pm/close-cards.mjs *)`, and the no-flag spellings of the two
existing seat-write rules, `Bash(node scripts/pm/post-stamped.mjs *)`
and `Bash(node scripts/pm/label-write.mjs *)`. `deny` is untouched; key
order and formatting unchanged.

**3. Usage** — in the script header, with the reason: invoke it **from
the repo root with nothing in front of `node`**, no `cd … &&` compound,
because the rule matches the command as typed.
`references/rest-channel.md` gets **no** line: `pnpm
check:pm-skill-ratchet` reports that file at 82 lines against a ceiling
of 82 — headroom 0 — so the header carries it alone, exactly as the
card's item 3 provides for.

**Minimal registration**, stated as the card asks:
`check:pm-close-cards` in the root `package.json` and one step in
`lint.yml`, beside the identical pair for post-stamped and label-write.
Without it the new self-test would ship unrun by CI, which is the state
`check:self-test-wired` exists to prevent — it now counts 220 scripts
and this one is in the population.

## A defect this found in its own first reading

The first dry run over the 90 cards exposed a truncation in the script's
own timeline read. Measured: of those 90 cards, **objectstack-ai#13799 carries more
than 100 timeline events**, so a single `?per_page=100` request returned
a truncated history at HTTP 200 with nothing saying so — and a
cross-reference on page 2 reads exactly like no cross-reference at all,
i.e. the open-PR skip answering "no" for a card that has one.

Fixed in the second commit: `readTimeline` walks by **page number**
until a short page (the spelling `references/rest-channel.md`
prescribes, cursor exhaustion having been measured on this platform to
stop early), and a card still returning full pages at the 30-page cap
**stops the run** rather than deciding on what it managed to read. The
fake board pages for real, so the truncation case is driven rather than
modelled.

## Verification

**`--self-test`** — `node scripts/pm/close-cards.mjs --self-test`, exit
0: `OK close-cards self-test: 102 cases pass across 11 batteries —
offline, no network, no token.` Battery roster, per-battery floor and
the verdict handshake all copied from the landed shape in
`label-write.mjs`.

**Three ablations, each with the mutation proved on disk and the restore
proved byte-identical** (`scripts/ablation-replace.mjs`, blob
`a04f59d49673` before and after every leg, `git diff HEAD` empty):

| leg | mutation | reading |
|---|---|---|
| A — a rule | delete the `pm:retriage` skip | blob `a04f59d49673` →
`f455f723528c`; self-test RED, 1 of 102, naming that case |
| B — the handshake | `return 0` before the verdict | blob →
`44141e535b3c`; dispatch refuses, exit 1, "selfTest() returned without
reaching its verdict" |
| C — the floor | delete one assertion | blob → `d0d6a6169a2b`; RED with
0 case failures and 1 floor problem, naming the battery that fell 8 → 7
|

**`--dry-run` over objectstack-ai#19458's 90 numbers** (a READ; it wrote nothing, on
any card), re-run at `901b26ea` after the pagination fix:

```
close-cards: DRY RUN — nothing will be written. objectstack-ai/objectstack · 90 card(s) · reason `not_planned` · expect-state `pm:queue` · open-PR skip ON
objectstack-ai#19408 SKIP an open PR references it (objectstack-ai#19445)
objectstack-ai#19325 SKIP not open (state closed/not_planned)
objectstack-ai#19146 SKIP has an assignee (`os-steve`) — somebody owns it
objectstack-ai#19240 SKIP an open PR references it (objectstack-ai#19335)
close-cards: DRY RUN — nothing was written. 90 read · 86 actionable · 4 skipped
```

**86 actionable / 4 skipped**, against the card's 77/13 read at 00:01Z.
The card provides for the move; the move is measured rather than
assumed. Probing every cross-referenced PR on the 86: **11 of those
cards had their referencing PR close after 2026-09-21T00:00Z** — objectstack-ai#19440,
objectstack-ai#19404, objectstack-ai#19396, objectstack-ai#19395, objectstack-ai#19390, objectstack-ai#19343, objectstack-ai#19336, objectstack-ai#19319, objectstack-ai#19309, objectstack-ai#19179
and objectstack-ai#18375, ten of them on PR objectstack-ai#19456 alone, closed 00:34:28Z. Of the
remaining two, objectstack-ai#19325 is the one card the triage seat closed before it
stopped, and objectstack-ai#19146 has since gained an assignee. The matrices agree;
the board moved.

**Gates** — derived with `node scripts/pm/dispatch-gates.mjs --commands
--repo objectstack-ai/objectstack` against the diff (68 commands, the
list identical before and after the second commit), each exit code
captured before any pipe. Green includes
`check:pm-settings-deny-roster`, `check:pm-widening-tells` (and the real
diff judged with `--declaration no --diff`: no tell, "no declared
surface covers it (4)"), `check:pm-skill-ratchet`,
`check:self-test-wired`, `check:self-test-workflow-commands`,
`check:pm-dispatch-gates`, `check:nul-bytes` and `check:pm-close-cards`.
**`pnpm lint` (`eslint . --no-inline-config`) is green over the whole
repo at exit 0 — no narrowing, so no narrowing to justify.**

Six derived families answer **PREREQUISITE NOT MET — a built tree is
required** and are NOT MEASURED locally: `check:dts-closure`,
`check:dual-build-cjs-loads`, `check:lean-entry-closure`,
`check:sourcemap-no-sources-content`, `check:type-check-debt` and the
lint package's `check:doc-formula-expressions`. Each reads `dist/`; this
diff contains no package source and produces no `dist/` byte, so it
cannot move any of them, and CI runs them on a built tree. ⛔ Recorded as
not measured, not as green.

## Scope addition, refused mid-round

A mid-round scope addition asked for two further `permissions.allow`
entries — the objectui spellings of the two landing-endpoint rules that
already exist for objectstack
(`.../objectui/pulls/*/ccr/ready_for_review` and
`.../objectui/pulls/*/ccr/auto_merge`), placed after their objectstack
twins.

**They are not in this diff.** Both attempts to write them were refused
by this session's own permission classifier with reason
`[Self-Modification]` — once through a scripted edit, once through the
editor tool — and a third route was not attempted. The working tree is
clean and nothing partial landed. This is the same classifier, on the
same file, that had permitted the four entries above earlier in the same
round: a third observation of the non-determinism this card was filed
for, now on a file surface rather than a write channel. A seat with a
channel adds those two lines, or the maintainer adds them at merge.

## Tier and landing

**Tier S by the register** (`GOVERNED_SURFACES` in
`scripts/pm/check-governed-merges.mjs`): the diff touches `.claude/**`.
Per the maintainer's directive above (「受管面,走 PR 您合」) **the maintainer
merges this by hand**. ⛔ This PR is not flipped to ready, not queued,
and auto-merge is not armed.

`Check Changeset` wants `skip-changeset`: no released package is
touched. The four paths are `.claude/settings.json`,
`scripts/pm/close-cards.mjs`, `.github/workflows/lint.yml` and the root
`package.json` (private, `@objectstack/spec-monorepo`, a `scripts` entry
only) — every one of them on the non-publishing fast track. The label is
the seat's to apply.

## Acceptance notes

Noted, not filed:

- `references/rest-channel.md` has **headroom 0** (82 lines, ceiling
82), and so does every other ceilinged file in that ratchet. The channel
table therefore cannot gain a row for this script without a ruled raise
or an equal deletion. Carrier: the next PR that raises that ceiling.
Observation, not a defect.
- `--dry-run` buys one card read per card and a timeline walk only for a
card that would otherwise be acted on. A future batch larger than this
one may want a `--json` summary for the completion comment; nothing
needs it today. Carrier: none.

## 维护者速读(草稿)

**改了什么** — 新增一个具名脚本 `scripts/pm/close-cards.mjs`,把「评论 · 摘标签 ·
关卡」这三步合成一条可被允许规则整条命中的命令;并在 `.claude/settings.json` 的 `permissions.allow`
里加了 4 条规则(这个脚本两种拼写,加上两个既有工具的无 flag 拼写)。`deny` 一个字没动。

**为什么改** — 批量关卡以前是 shell 循环,每一步都由会话的写分类器逐条判,判得不稳:同一条命令刚成功两次就被拒,90 张卡关到第
1 张就停了。停是对的——评论落了标签没落就是半状态——但代价是这批清理走不动。一条具名脚本 = 一条前缀,分类器不再掷硬币。

**风险与代价(含回滚)** — 风险最集中的一点是「半写」:脚本在第一张半写的卡上立刻停,退出码 4,并点名是哪张卡、哪几步落了,⛔
不继续、⛔ 不重试。回滚代价为零:删掉这个文件和那 4
行规则即回到今天,没有任何其它代码读它。另一项要请您留意的是,允许规则本身是放宽面——它放宽的是「跑本仓自己的三个 PM
脚本」,不是任何网络写端点。本轮还有 2 条 objectui 的规则被会话分类器当场拒写(见上节),不在这个 diff 里。

**席位意见** — (留空,待席位复审填写)

**你要做的** — 读一眼那 4 行允许规则是不是您想给的面,然后手工合。⛔ 本 PR 不翻 ready、不入队、不挂
auto-merge。合完之后,这批 90 张卡的关闭由分诊席跑一次 `--dry-run` 再跑一次实关,日志回贴 objectstack-ai#19458。

---
_Generated by [Claude
Code](https://claude.ai/code/session_012GcsUbuqFGBibkEDMRC1eE)_

---------

Co-authored-by: Claude <noreply@anthropic.com>
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/xs skip-changeset PR has no user-facing published change; bypasses the changeset gate

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[finding] a published skill teaches the ADR-0048 claim ADR-0048 retired — and cites ADR-0048 as its authority

2 participants