Repository navigation
Commit e269d3b
docs(skills): objectstack-automation says a paused screen's Next / Submit and step count are engine-served (#26812)
<!-- claude-projects-attribution: {"github_login":"os-steve"} -->
_Requested by **Steve** · [project
thread](https://claude.ai/code/project/chan_01FdL1XeUyvVNxLreh3F4Qi9?thread=cmsg_01FdL1XeUyvVNxLreh3F4Qi9BRKZ9NNWRYqPQ1aXdmbQ7s)_
Fixes #26756
Clause-②: no
Metadata-protocol: none
## 维护者速读
- **改了什么**:`skills/objectstack-automation/SKILL.md` 的 `screen`
节点行加一句:「下一步 / 提交」按钮和「第 N 步,共 M 步」不是作者写的,是引擎在屏幕暂停时读流程图给出的
`progress`(`nextScreen` `none` / `possible` / `certain`,只有每条路径一致时才带
`step` / `stepCount`);屏幕后面接 `decision`、`fault`
边、回环、非屏幕暂停(`approval`、`wait`)或 `subflow` 一律答 `possible`(显示「下一步」、不计步);节点
`config` 里写 `progress` 会被拒,也不要把按钮文字或步数手写进 `fields`。
- **为什么改**:PR #26752 落地后运行时已经这样服务,但技能没教,按技能写向导的 agent 会手搓「提交」标签或「第 2
步」字段,或试图在屏幕节点上写 `progress`,没有任何门禁拦它。
- **风险与回滚**:只改已发布技能文本、token 上限行与一份 patch changeset,无 schema、键或行为变化;回滚即
revert 本 PR。
- **先看**:`skills/objectstack-automation/SKILL.md` 第 91 行的 `screen`
行(新增句),`scripts/check-skills-token-ratchet.mjs` 的 automation 行(6358 →
6466,算术在注释里),`.changeset/26756-automation-skill-screen-progress.md`。
- **两分钟验证**:`node scripts/check-skills-token-ratchet.mjs`,预期
`skills/objectstack-automation/SKILL.md is 6466 tokens (ceiling 6466;
headroom 0)`。
- **需要你做的**:批准本 PR(`skills/**` 为 Tier H,需 GOVERNED_APPROVERS 的 APPROVED
review;本 PR 保持 draft,席位不 ready / 不入队)。
## What changes
- **`skills/objectstack-automation/SKILL.md`, the `screen` node row**
(the delta's "~L91" choice over L48: the node row is where an author
declares `config.fields[]`, so it is where a hand-rolled label or
counter would be written). One addition, in the row's own register: Next
/ Submit and "Step N of M" are not authored — when the screen pauses the
engine reads the graph and serves `progress` (`nextScreen: 'none' |
'possible' | 'certain'`; `step` / `stepCount` only when every path
agrees), which alone labels the button and draws the counter; a
`decision`, `fault` edge, loop back, non-screen pause (`approval`,
`wait`) or `subflow` after a screen answers `possible` — "Next", no
count; `progress` in a node `config` is refused; never hand-roll a
button label or step counter into `fields`. Every key and value is read
off `origin/main`: `ScreenProgressSpec` in
`packages/spec/src/contracts/automation-service.ts`, its wire shape
`screenProgressSpecShape` in
`packages/spec/src/api/automation-api.zod.ts`, the engine's
`readScreenProgress` in
`packages/services/service-automation/src/builtin/screen-nodes.ts`
(plain reachability for `none`, fewest surely-pausing screens for
`certain`, else `possible`; counts only when exact), the runner's
reading in `ui/packages/app-shell/src/views/FlowRunner.tsx` (`certain` /
`possible` → Next, `none` → Submit, counter only with both `step` and
`stepCount`), and `ScreenConfigSchema` in
`packages/spec/src/automation/builtin-node-config.zod.ts` (a
`strictObject`, so an authored `progress` is a named parse error, not a
silent drop).
- **Paid under the standing ruling 「A:先削重复,余额按实测提高」** — fold restated
wording first, then re-pin the ceiling at the measurement. Three
restatements folded, each with its surviving home named:
- Filter-operands bullet, "every other `{…}` token is refused, and" (-42
bytes) — Valid-but-silently-wrong item 1 lists "every CRUD `filter`
operand" among the slots where a `{…}` token is refused. The trimmed
bullet is re-wrapped (-2 bytes of indentation whitespace; the wrap
bought nothing, the row's addition is paid by the cuts and the raise).
- Trigger Configuration lead-in, "The binding is the START NODE — this
is that node" → "This is the start node alone" (-23 bytes) — the
Triggers intro already says the binding lives entirely in the flow's
`start` node `config`, and the heading says "on the `start` node".
- Valid-but-silently-wrong item 3, "; flow functions don't" (-22 bytes)
— the item's own bold lead says a flow `function` does NOT read/write
the database.
- **`scripts/check-skills-token-ratchet.mjs`**: the automation row moves
6358 → 6466, pinned AT the measurement, with the arithmetic in the row
comment: 25429 → 25864 priced bytes (+524 added, -89 cut, +435 net) →
ceil(25864 / 4) = 6466; headroom was 3 bytes (0 tokens), so the ceiling
moves +108.
- **`.changeset/26756-automation-skill-screen-progress.md`**:
`@objectstack/skills` patch (the catalog ships from `skills/**`), both
declaration lines at line start.
- **No eval prompt.** `evals/flows-triggers-approvals.json` measures
2734 tokens against a 2734 ceiling (headroom 0), so a prompt fits only
with a raise, which the card excludes; said here and in the report.
### Skills readings (whole file and whole package)
| Reading | Before (`origin/main` 8b27638) | After (270df42) |
|:--|--:|--:|
| `skills/objectstack-automation/SKILL.md` lines | 452 | 451 |
| `skills/objectstack-automation/SKILL.md` tokens (priced, stamp
excluded) | 6358 | 6466 |
| All 11 `skills/*/SKILL.md` lines | 4606 | 4605 |
| All 11 `skills/*/SKILL.md` tokens (ceil bytes/4, stamp included) |
56135 | 56243 |
## Why
Once #26752 landed, a paused screen carries an engine-served `progress`,
and the Console's FlowRunner labels the button Next or Submit and draws
"Step N of M" from it. An agent authoring a wizard from the skill was
told none of this: it could hand-roll a label or a counter into
`fields`, or author `progress` on the screen node, and the skill did not
say the runtime answers both from the graph. The docs half landed in
#26752 (`content/docs/automation/flows.mdx`); this is the owed skill
half.
## Tests
No test file changes: the diff is published skill text, a ratchet row
and a changeset. `node scripts/check-skills-token-ratchet.mjs` and its
`--self-test` pass on the head (readings under Verification).
## Acceptance notes
- The eval file's headroom 0 is why no eval prompt is added; a later
card that raises that file's ceiling under the same ruling can add one
asserting that an answer never spells a "Submit" / "Next" label or a
step counter into `fields`.
- `origin/main` moved to 0f0b9f5 after this branch was cut;
`dispatch-gates` reports none of the visible upstream commits touched
what the gate list derives from, so `main` is not merged in (AGENTS.md
§10: merge only on a reported conflict, a `main`-caused red or a queue
removal).
## Verification
Local verification on head `270df422` (worktree
`objectstack-issue-26756`, base `origin/main` 8b27638):
- **Build closure**: `bash scripts/pm/os-verify-lock.sh -c "pnpm exec
turbo run build --concurrency=2 --filter='./packages/**'"` → `VERDICT
command-exit 0`, 75/75 tasks, 8m43s under the lock (needed for the
dist-reading gates below).
- **Derived gates**: `node scripts/pm/dispatch-gates.mjs --commands
--repo objectstack-ai/objectstack` derived 63 commands from the 3-path
change set; each ran serially with stdin closed and its exit code
captured before any pipe; every one exited 0. Reconciliation:
`dispatch-gates --ran` → "63 derived, 63 run, 0 NOT-MEASURED, 0 UNRUN".
<details><summary>Readings worth quoting</summary>
- `node scripts/check-skills-token-ratchet.mjs` →
`skills/objectstack-automation/SKILL.md is 6466 tokens (ceiling 6466;
headroom 0)`; `81 authored bundle file(s) within their ceilings`;
`--self-test` exit 0.
- `pnpm --filter @objectstack/spec run check:skill-docs` → `✓
skills/README.md`, `✓ content/docs/ai/skills-reference.mdx`.
- `node scripts/check-empty-changeset.mjs --base origin/main` → `1
declaring changeset(s) added`, none from the merge base modified.
- `pnpm check:pm-skill-id-lint`, `pnpm check:doc-authoring`, `pnpm
check:nul-bytes`, `pnpm check:skill-compatibility`, `pnpm
check:skill-frame-sync`, `pnpm check:skill-identifier-liveness`, `pnpm
--filter @objectstack/lint run check:doc-formula-expressions`, `pnpm
check:dual-build-cjs-loads`, `pnpm check:dts-closure`, `pnpm
check:pm-dispatch-gates`: exit 0 each.
- Model tier line (`dispatch-gates --tier`): MANDATORY — `skills/**`,
clause ①, no one-line exit; changed lines 48 (+40 / -8) vs the 3000
threshold.
</details>
- **CI**: `pnpm lint` and the repo-wide farm are CI's runs; the PR's
check-runs are the record for them.
## Human Minimum
- [x] 1. Schemas start as Zod; `packages/spec` holds no runtime logic.
(No schema touched.)
- [x] 2. Every name I added uses the casing for its kind. (No new
identifiers; the keys named are the spec's own.)
- [x] 3. No formatter ran; `pnpm lint` is CI's run (not in the derived
local list).
- [x] 4. One issue, one branch off an up-to-date `main`, one pull
request.
- [x] 5. A change that publishes carries a changeset, and both
declaration lines are filled in here and in the changeset.
- [x] 6. `packages/spec` touched: n/a.
- [x] 7. No hand edits to `content/docs/references/`,
`packages/*/CHANGELOG.md` or `content/docs/releases/`.
- [x] 8. Title, body and comments are in English (the maintainer digest
is Chinese by AGENTS.md › Communication).
- [x] The *Before Submitting* list in CONTRIBUTING.md is done.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
https://claude.ai/code/session_01ADHkmS7nPHShBb87HjHRf4
Co-authored-by: Claude <noreply@anthropic.com>1 parent 40264be commit e269d3b
3 files changed
Lines changed: 40 additions & 8 deletions
File tree
- .changeset
- scripts
- skills/objectstack-automation
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
| 1 | + | |
| 2 | + | |
| 3 | + | |
| 4 | + | |
| 5 | + | |
| 6 | + | |
| 7 | + | |
| 8 | + | |
| 9 | + | |
| 10 | + | |
| 11 | + | |
| 12 | + | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
420 | 420 | | |
421 | 421 | | |
422 | 422 | | |
423 | | - | |
| 423 | + | |
| 424 | + | |
| 425 | + | |
| 426 | + | |
| 427 | + | |
| 428 | + | |
| 429 | + | |
| 430 | + | |
| 431 | + | |
| 432 | + | |
| 433 | + | |
| 434 | + | |
| 435 | + | |
| 436 | + | |
| 437 | + | |
| 438 | + | |
| 439 | + | |
| 440 | + | |
| 441 | + | |
| 442 | + | |
| 443 | + | |
| 444 | + | |
424 | 445 | | |
425 | 446 | | |
426 | 447 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
88 | 88 | | |
89 | 89 | | |
90 | 90 | | |
91 | | - | |
| 91 | + | |
92 | 92 | | |
93 | 93 | | |
94 | 94 | | |
| |||
217 | 217 | | |
218 | 218 | | |
219 | 219 | | |
220 | | - | |
221 | | - | |
222 | | - | |
223 | | - | |
| 220 | + | |
| 221 | + | |
| 222 | + | |
224 | 223 | | |
225 | 224 | | |
226 | 225 | | |
| |||
299 | 298 | | |
300 | 299 | | |
301 | 300 | | |
302 | | - | |
| 301 | + | |
303 | 302 | | |
304 | 303 | | |
305 | 304 | | |
| |||
381 | 380 | | |
382 | 381 | | |
383 | 382 | | |
384 | | - | |
| 383 | + | |
385 | 384 | | |
386 | 385 | | |
387 | 386 | | |
| |||
0 commit comments