Repository navigation
Commit e863251
docs(skills): name ignore as the seed mode default and the minimal-preset job/queue exception; correct three capability comments (#31377)
<!-- claude-projects-attribution: {"github_login":"huangyiirene"} -->
_Requested by **Irene** · [project
thread](https://claude.ai/code/project/chan_01TJXtQ1tVD26ecLDZxFS67x?thread=cmsg_01TJXtQ1tVD26ecLDZxFS67xMHHsB36x9Uqo5Pp94AzKsu)_
Fixes #31299
Clause-②: no
Metadata-protocol: none
`dispatch-gates --tier` reads a contract-review model mandate for
`skills/**` (clause ①). That mandate is waived by the maintainer's
standing order in this project (2026-11-03). This card ran on the
project's default model, and the dispatching seat (domain:skills#3) runs
the contract review.
## 维护者速读
- 改了什么:平台技能 § Seed Data 把 `mode` 的默认值从 `upsert` 改为 `ignore`;§
`requires:` 说明 `--preset minimal` 在有 `email`、`approvals` 或 `auth` 时仍保留
`job` 和 `queue`。自动化技能 DocuSign 评测用例 1 的 `expected_output` 不再含它自己禁止的
`connector-esign`,回调写成 `type: 'api'` 流程,并按技能所教用 `config.signature` 校验
DocuSign Connect 自己的签名头。另外三处只改注释:spec 里 `package-registry` 的说明、`os
serve` 里 `requires: ['mcp']` 那一句、`app-showcase` 的注释;`app-showcase` 的
`requires` 去掉常开的 `messaging` 和 `job`。
- 为什么改:这六处与 `main` 的代码不符,会教代理错误的默认值和过时的“需要显式开启”读法(#31299,来自 #31297
契约复核的“其他位置”)。
- 风险与回滚:不改行为。技能文字、一条评测用例和注释;`app-showcase` 少列两个常开能力,默认预设下照样挂载。平台
SKILL.md 删掉 Turso 行里重复的一句来付字节,净 -40 字节(5994 / 6011 tokens),不动棘轮。发版
`@objectstack/skills` patch;回滚即 revert。
- 先看:`skills/objectstack-platform/SKILL.md` L296 与 L366;然后
`skills/objectstack-automation/evals/integrations-declared.json` 用例 1。
- 两分钟验证:对照 `packages/spec/src/data/seed.zod.ts`
L207(`SeedMode.default('ignore')`)和
`packages/core/src/capability-composition.ts`
L86、L135–L138(`NEEDS_JOB_AND_QUEUE`)读两行;`node
scripts/check-skills-token-ratchet.mjs`(平台 5994 / 6011)。
- 需要你做的:批准。`check-governed-merges` 判为 Tier H(`skills/**`),需 `os-zhuang`
或 `hotlong` 批准;契约复核全量 PASS 6717563682、增量 PASS 6717774623(`Head-sha`
`1ff1c115`),席位已 ACCEPT。
## The six sites, before and after
| # | Site | Before | After | Proof on `main` `e2e6ec7dc` |
|:--|:--|:--|:--|:--|
| 1 | `skills/objectstack-platform/SKILL.md` L366, § Seed Data |
`upsert` named as the `mode` default | `ignore` named as the default;
all five modes still listed (byte-neutral swap) |
`packages/spec/src/data/seed.zod.ts` L207 `mode:
SeedMode.default('ignore')`;
`skills/objectstack-data/references/seeds.md` § Import modes already
says `ignore` (default) |
| 2 | same file L296, § `requires:` | "`--preset minimal` drops exactly
those" | "`--preset minimal` drops them; `email`, `approvals` or `auth`
keeps `job` and `queue`" | `packages/core/src/capability-composition.ts`
L86 `NEEDS_JOB_AND_QUEUE = ['email', 'approvals', 'auth']`, L130-L138:
the slate is skipped under `minimal`, then `job` and `queue` are put
back when any of those tokens is present; its callers are `serve.ts`
L3016, `verify/src/required-providers.ts` L138 and
`cli/src/utils/schema-migration-plugins.ts` L2012 |
| 3 | `skills/objectstack-automation/evals/integrations-declared.json`
case 1 | `expected_output` used the forbidden `connector-esign` and
lacked the required `type: 'api'`; it also named a "gap" (Connect's own
header unverified, status polled) | "not a new connector package"; "a
`type: 'api'` flow with a start-node `secretRef`, and its
`config.signature` names DocuSign Connect's own header (…), so status
changes arrive verified instead of polled"; the gap sentence is gone.
Assertions unchanged | `skills/objectstack-automation/SKILL.md` L364
("Vendor-signed: `config.signature` replaces it (recipe 4)"), L419-L420;
`references/integration-recipes.md` L130-L133 (the
`X-DocuSign-Signature-1` block);
`packages/spec/src/automation/api-trigger-signature.test.ts` L86 |
| 4 | `packages/spec/src/kernel/platform-capabilities.ts` L385-L392, the
`'package-registry'` slate note | "That registry keys `marketplace`, not
this token, so under `objectstack serve` this entry is inert until the
runtime half … lands" | the CLI mounts it through `CAPABILITY_PROVIDERS`
(`@objectstack/core`), which keys this token at `PackageServicePlugin`,
the provider the spec row declares and the same one `marketplace`
resolves to; a stock boot mounts it, one instance when `marketplace` is
also declared | `packages/core/src/capability-providers.ts` L174-L178
(`'package-registry'` row) and L164-L173; `serve.ts` L5161-L5167
(`resolverMounted`); `capability-composition.ts` L130-L133. Comment only
|
| 5 | `packages/cli/src/commands/serve.ts` L3002 | "Explicit `requires:
['mcp']` in config works regardless of the env var." | "Explicit
`requires: ['mcp']` still mounts the plugin, but with the env var off
the route is not served: `isMcpServerEnabled()` alone decides it." (an
authenticated caller gets 404; an anonymous one is refused with 401
first, `mcp.ts` L107-L110) | `packages/runtime/src/domains/mcp.ts`
L112-L114 (404 whenever `isMcpServerEnabled()` is false);
`core/src/capability-providers.ts` L154-L158 (a declared `mcp` mounts
`MCPServerPlugin`); CHANGELOG "New single decision point
`isMcpServerEnabled()`" (`packages/cli/CHANGELOG.md` L42383). Comment
only |
| 6 | `examples/app-showcase` | `objectstack.config.ts` L95-L101
described `messaging` and `job` as needed, L109 listed both;
`src/automation/flows/index.ts` L163-L165, L423, L647 told the reader to
install them | the two bullets are gone, a comment above `requires` says
both are always-on, that a `--preset minimal` boot drops `messaging` and
drops `job` only when `email`, `approvals` or `auth` is absent (this app
declares `approvals`), and to list there what it drops, and both entries
are removed from `requires`; the three flow comments say the same |
`packages/spec/src/kernel/platform-capabilities.ts`
`PLATFORM_ALWAYS_ON_CAPABILITIES`; `capability-composition.ts` L130-L133
|
Case 3, in diff form (one JSON line, shown as the changed phrases):
```diff
-A declarative instance inside the app, not a platform plugin and not a `connector-esign` family:
+A declarative instance inside the app, not a platform plugin and not a new connector package:
-the callback is an `api` flow with a start-node `secretRef`.
+the callback is a `type: 'api'` flow with a start-node `secretRef`, and its `config.signature` names DocuSign Connect's own header (`signs: 'body'`, `header: 'X-DocuSign-Signature-1'`, `algorithm: 'hmac-sha256'`, `encoding: 'base64'`), so status changes arrive verified instead of polled.
- One gap is named plainly: DocuSign Connect signs its own header, which the `api` door does not verify, so status is polled until vendor schemes are verified.
```
After the edit every `must_contain` entry is in the case's
`expected_output` and no `must_not_contain` entry is. The
`must_not_contain` list keeps `connector-esign` unchanged, so the case
still fails an answer that proposes that package. The gap sentence was
removed because the skill now teaches the opposite: a vendor-signed
callback is verified through `config.signature`, and recipe 4 gives
DocuSign's own header as the example. No assertion was added for the
signature block, since the prompt does not name the header.
## `app-showcase`: entries removed, and why
`messaging` and `job` are on `PLATFORM_ALWAYS_ON_CAPABILITIES`, so every
boot the example is served under (`os dev` / `os serve`, default preset,
as in CI's e2e job) mounts both whether listed or not. The platform
skill teaches listing them only under `--preset minimal`
(`skills/objectstack-automation/SKILL.md` L351). Nothing else reads the
example's `requires` list: no example test, `e2e`, `qa` or `scripts`
file reads it (grep for `.requires`, `'messaging'`, `'job'`), and no
dogfood test boots the example under `--preset minimal`. The one effect
of dropping a declared token is that a missing provider would warn
instead of failing boot. Both providers are dependencies of
`@objectstack/cli` (`packages/cli/package.json` L94, L96), so that
cannot happen here. The example's tests and typecheck were run after the
change (Gates).
## Token readings (`scripts/check-skills-token-ratchet.mjs`, tokens =
ceil((bytes − 20) / 4))
| File | `main` `e2e6ec7dc` | This PR | Ceiling |
|:--|:--|:--|:--|
| `skills/objectstack-platform/SKILL.md` | 24034 B = 6004 | 23994 B =
5994 | 6011 (unchanged) |
- Site 1: 0 B (two mode names swap places).
- Site 2: +47 B.
- **Deletion (-87 B):** the Turso row of § Driver Selection Guide (L206)
loses " — ships with the ObjectStack cloud / enterprise distribution,
not the open framework". Fact it held: Turso ships only in the cloud /
enterprise distribution, not the open framework. Surviving homes: the
same cell's "**Cloud / EE only**" and its next sentence ("The open-core
CLI recognizes `libsql://` URLs but **fails loudly**"), and
`skills/objectstack-platform/references/operations.md` L152
(`driver-turso` (**cloud / EE only**)). § Driver Selection Guide is not
registered in `check-skill-identifier-liveness.mjs` or
`check-skill-top-level-keys.mjs`, and no script or test greps the cut
text.
Net -40 B. No remainder, so `scripts/check-skills-token-ratchet.mjs` is
untouched. No rewrap: every untouched line is byte-identical to `main`.
L333 (`auth` implies `email`) and L338 (pair `triggers` with `job` under
minimal) stay true and are not restated: under `minimal`, `triggers`
alone still mounts no `job`.
The case-3 sentence removal is the seat's ruling (no objection,
2026-11-08): it sits inside case 1, and the skill now teaches
`config.signature` verification
(`skills/objectstack-automation/SKILL.md` L364,
`references/integration-recipes.md` L130-L133).
## Deviations
- should-fix from review 6717563682 applied in 1ff1c11 (two comments)
## Sweep
- `skills/objectstack-platform/evals/` and `skills/objectstack-data/`
for a seed `upsert` default: none.
`objectstack-data/references/seeds.md` § Import modes and the generated
`content/docs/references/data/seed.mdx` already say `ignore` (default).
- `skills/**` for "drops exactly" or another unqualified minimal-preset
claim: `objectstack-platform/evals/config-plugins-ops.json` case 3 says
"Only a `--preset minimal` boot drops them" of `job` and `messaging`.
Its prompt involves no `email`, `approvals` or `auth`, so it stays true;
left alone. The case at L340 (`storage`, `settings`) is outside the
exception.
- `skills/**` and every eval for `connector-esign`: only the case fixed
here.
- Tests, ADRs and docs for a claim that an explicit `requires: ['mcp']`
serves the route with the env flag off: none.
`content/docs/ai/connect-mcp.mdx` L542 already says the 404 means the
surface is disabled. So item 5 stays a comment fix, not a
`domain:server` card.
- No generator emits the spec note: it is a `//` comment inside the
array, not a TSDoc block, and no file under `content/docs/` carries its
old text. `check:docs` and `check:skill-refs` exit 0.
## Other sites found (not edited)
- `packages/spec/src/kernel/platform-capabilities.ts` L348, the TSDoc of
`PLATFORM_ALWAYS_ON_CAPABILITIES`: "`objectstack serve --preset minimal`
opts out entirely". That is true of the slate but leaves out the `job` /
`queue` put-back of `NEEDS_JOB_AND_QUEUE`. It is outside this card's
one-comment surface.
## Changeset
`.changeset/platform-skill-seed-default-minimal-preset.md`:
`'@objectstack/skills': patch`, with `Clause-②: no` and
`Metadata-protocol: none`. No `@objectstack/spec` or `@objectstack/cli`
entry: their edits are comments only, `Check Changeset` counts
changesets per PR (one is present), and AGENTS.md § Post-Task Checklist
step 3 asks for one for a change that publishes behaviour.
`examples/app-showcase` is `private`.
## Gates
`node scripts/pm/dispatch-gates.mjs --commands --repo
objectstack-ai/objectstack` derived 103 commands against merge base
`e2e6ec7dc`. All 103 ran on head `0ab1aaaa`, and again, re-derived
identical, on head `1ff1c115` (the contract review's should-fix, two
comment edits) after a full `pnpm build` (exit 0), under
`NODE_OPTIONS=--max-old-space-size=8192`: **103 × exit 0, 0 NOT
MEASURED** among the listed commands. The CI-only families
dispatch-gates names as not locally measurable (shard attestation, Build
Core steps, type-check lanes, dogfood jobs) are left to CI. Per-command
records: project files `card-31299/gates-0ab1aaaa.txt` and
`card-31299/gates-1ff1c115.txt` (the latter also carries
`example-showcase` and `cli` typecheck, exit 0).
The order's named checks: `pnpm check:skill-identifier-liveness`, `pnpm
--filter @objectstack/spec run check:skill-refs` and `node
scripts/check-skills-token-ratchet.mjs` (platform 5994 / 6011) are in
that list and exit 0. Run beside it, since dispatch-gates derives no
test family for these paths:
- `pnpm --filter @objectstack/spec run check:skill-examples` :: exit 0
- `pnpm --filter @objectstack/example-showcase run typecheck` :: exit 0
- `pnpm --filter @objectstack/example-showcase test` :: exit 0 (544
passed)
- `pnpm --filter @objectstack/cli run typecheck` :: exit 0
- `pnpm --filter @objectstack/spec exec tsc --noEmit` :: exit 0
- `node scripts/check-commit-card-trailers.mjs --range
origin/main..HEAD` :: exit 0
- `node scripts/pm/check-governed-merges.mjs --branch HEAD` :: Tier H
(`skills/**` ×2)
`origin/main` moved to `f4b4c8aeb` during the run. Only `serve.ts`
changed underneath this diff, away from the edited sentence, and `git
merge-tree` merges cleanly.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
https://claude.ai/code/session_01J8VVAmBZAddKTWUJs6Xnq2
<!-- signed: domain:skills#3 · huangyiirene ·
session_01J8VVAj7CvjkGXvgXzd6RZ7 -->
---------
Co-authored-by: Claude <noreply@anthropic.com>1 parent 405a78e commit e863251
7 files changed
Lines changed: 36 additions & 26 deletions
File tree
- .changeset
- examples/app-showcase
- src/automation/flows
- packages
- cli/src/commands
- spec/src/kernel
- skills
- objectstack-automation/evals
- objectstack-platform
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
| 1 | + | |
| 2 | + | |
| 3 | + | |
| 4 | + | |
| 5 | + | |
| 6 | + | |
| 7 | + | |
| 8 | + | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
92 | 92 | | |
93 | 93 | | |
94 | 94 | | |
95 | | - | |
96 | | - | |
97 | | - | |
98 | 95 | | |
99 | 96 | | |
100 | | - | |
101 | | - | |
102 | 97 | | |
103 | 98 | | |
104 | 99 | | |
105 | 100 | | |
106 | 101 | | |
107 | 102 | | |
108 | 103 | | |
109 | | - | |
| 104 | + | |
| 105 | + | |
| 106 | + | |
| 107 | + | |
| 108 | + | |
| 109 | + | |
110 | 110 | | |
111 | 111 | | |
112 | 112 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
160 | 160 | | |
161 | 161 | | |
162 | 162 | | |
163 | | - | |
164 | | - | |
165 | | - | |
| 163 | + | |
| 164 | + | |
| 165 | + | |
166 | 166 | | |
167 | 167 | | |
168 | 168 | | |
| |||
420 | 420 | | |
421 | 421 | | |
422 | 422 | | |
423 | | - | |
424 | | - | |
| 423 | + | |
| 424 | + | |
| 425 | + | |
425 | 426 | | |
426 | 427 | | |
427 | 428 | | |
| |||
643 | 644 | | |
644 | 645 | | |
645 | 646 | | |
646 | | - | |
647 | | - | |
| 647 | + | |
| 648 | + | |
648 | 649 | | |
649 | 650 | | |
650 | 651 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
2999 | 2999 | | |
3000 | 3000 | | |
3001 | 3001 | | |
3002 | | - | |
| 3002 | + | |
| 3003 | + | |
3003 | 3004 | | |
3004 | 3005 | | |
3005 | 3006 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
382 | 382 | | |
383 | 383 | | |
384 | 384 | | |
385 | | - | |
386 | | - | |
387 | | - | |
388 | | - | |
389 | | - | |
390 | | - | |
391 | | - | |
392 | | - | |
| 385 | + | |
| 386 | + | |
| 387 | + | |
| 388 | + | |
| 389 | + | |
| 390 | + | |
| 391 | + | |
| 392 | + | |
393 | 393 | | |
394 | 394 | | |
395 | 395 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
4 | 4 | | |
5 | 5 | | |
6 | 6 | | |
7 | | - | |
| 7 | + | |
8 | 8 | | |
9 | 9 | | |
10 | 10 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
203 | 203 | | |
204 | 204 | | |
205 | 205 | | |
206 | | - | |
| 206 | + | |
207 | 207 | | |
208 | 208 | | |
209 | 209 | | |
| |||
293 | 293 | | |
294 | 294 | | |
295 | 295 | | |
296 | | - | |
| 296 | + | |
297 | 297 | | |
298 | 298 | | |
299 | 299 | | |
| |||
363 | 363 | | |
364 | 364 | | |
365 | 365 | | |
366 | | - | |
| 366 | + | |
367 | 367 | | |
368 | 368 | | |
369 | 369 | | |
| |||
0 commit comments