Repository navigation
Commit 789b2ae
docs(skills): platform skill describes the blank starter as shipped — requires automation+triggers, seven barrels via exportsOf (#20410)
Fixes #20385
Clause-②: no
## What was false, and what the skill now says
`skills/objectstack-platform/SKILL.md` 〈The Template〉 said the blank
starter declares `requires: ['automation']` and said nothing about the
barrel wiring. Read on the branch base `df3ba164` (`origin/main` at
claim time),
`packages/create-objectstack/src/templates/blank/objectstack.config.ts`
declares `requires: ['automation', 'triggers']` (line 51), keeps the
three generic connector executors in `plugins:` (lines 61–65:
`ConnectorRestPlugin`, `ConnectorOpenApiPlugin`, `ConnectorMcpPlugin`),
and hands all seven generator barrels (`objects`, `views`, `actions`,
`flows`, `dashboards`, `apps`, `skills`) to the stack key of the same
name through `exportsOf` (lines 73–79; six of the barrels are `export
{};`). #20363 landed the template change; the card behind it, #20333, is
not addressed here.
The bullet now states those facts and points at the scaffolded
`AGENTS.md` for how to add to the barrels — one pointer, not a second
spelling of its rule (the claim's judgement). The pointer names the file
without a rule number so a later renumbering of that list cannot make
the skill stale again.
## Sentence-by-sentence audit of the starter's description (the
execution note)
| Where (line on the base) | Sentence | Verdict |
|:--|:--|:--|
| 192–194, 〈The Template〉 | `requires: ['automation']` plus the three
connector executors | FALSE on `requires` (no `triggers`) and SILENT on
the seven barrels → rewritten |
| same bullet | "the three generic connector executors in `plugins:`" |
TRUE (lines 61–65 of the template) → kept |
| same bullet | "The memory driver and the Hono server are NOT in the
file — the CLI auto-registers both at boot" | TRUE (no driver or server
plugin in the file) → kept |
| 357–366, `requires:` table | `triggers` row | already present
(`@objectstack/trigger-record-change`, plus `trigger-schedule` and
`trigger-api`) → no row added; its bold "Pair it with `job`" clause
restated rule 5 under the same table → dropped from the row, rule 5
keeps it in full |
| 399, the five rules | "Keep `automation` whenever `plugins:` lists a
connector" | TRUE for the starter → unchanged |
| 401, the five rules | "Pair `triggers` with `job`" | TRUE → unchanged,
now the one spelling |
| 225, the directory tree | `flows/ # Optional: automation flows` | a
project convention, not the starter → unchanged |
| 245, naming table | `Object.values(imported)` | still true —
`exportsOf` is a typed `Object.values` → unchanged |
| `references/bootstrap.md` § Scaffolding Command | "blank is the
default, and the only, template" | TRUE → unchanged |
## Paying the skills token ratchet (headroom 2 → 4)
Net content added by the rewritten bullet is paid by deleting redundancy
in the same file, nothing moved elsewhere and the ceiling untouched:
- The retired-templates paragraph (four lines) is one sentence. The CLI
already prints `Template "NAME" has been retired and is no longer
available.` when one is asked for by name
(`packages/create-objectstack/src/index.ts`, line 414), so the skill
needs the fact, not the marketplace history.
- The `triggers` table row drops the "Pair it with `job` — schedule and
time-relative triggers run on the job service" clause; rule 5 directly
under the table says the same thing with its consequence, and every
other row in that table lists providers only.
- "works offline, no network fetch" → "no network fetch" (one claim,
said once).
## Readings
### line_budget
| Scope | before | after |
|:--|--:|--:|
| file lines (`skills/objectstack-platform/SKILL.md`) | 487 | 489 |
| file bytes | 23321 | 23313 |
| file tokens (ratchet, ceil bytes/4) — ceiling 5833 | 5831 (headroom 2)
| 5829 (headroom 4) |
| package: lines over every `skills/**/SKILL.md` (10 files) | 4402 |
4404 |
| package: authored bundle tokens (ratchet total / ceiling) | 143456 /
154938 | 143454 / 154938 |
| package: bundle total tokens (whole shipped tree) | 153970 | 153968 |
### gates
Derived with `node scripts/pm/dispatch-gates.mjs --repo
objectstack-ai/objectstack --commands` at `7ac5e9f4` (1 path vs merge
base `df3ba164`; 25 commands). Every exit code captured before any pipe
(`cmd > log 2>&1; EXIT=$?`). `--ran` reconciliation with exit codes: 25
derived, 25 run, 0 NOT-MEASURED, 0 UNRUN.
| Command | exit | verdict line |
|:--|--:|:--|
| `node scripts/check-ci-filter-parity.mjs` | 0 | pass |
| `node scripts/check-closing-keyword-parity.mjs` | 0 | pass |
| `node scripts/check-closing-keyword-parity.mjs --self-test` | 0 | pass
|
| `node scripts/check-comment-mask-corpus.mjs` | 0 | pass |
| `node scripts/check-doc-route-spelling.mjs --advisory` | 0 | pass |
| `node scripts/check-doc-route-spelling.mjs --self-test` | 0 | pass |
| `node scripts/check-skills-token-ratchet.mjs` | 0 |
`skills/objectstack-platform/SKILL.md is 5829 tokens (ceiling 5833;
headroom 4)` · `54 authored bundle file(s) within their ceilings` |
| `node scripts/check-skills-token-ratchet.mjs --self-test` | 0 | pass |
| `pnpm --filter @objectstack/lint run check:doc-formula-expressions` |
3 then 0 | first run: PREREQUISITE NOT MET (`@objectstack/formula` and
`@objectstack/lint` not built — nothing measured); built both under the
verify lock (`turbo run build --filter=@objectstack/formula
--filter=@objectstack/lint --concurrency=2`, VERDICT command-exit 0);
re-run: `22 record-scoped formula example(s) across 456 files / 1383 TS
blocks judged clean` |
| `pnpm --filter @objectstack/spec run check:skill-docs` | 0 | `Skill
docs in sync` |
| `pnpm check:agent-test-spelling` | 0 | pass |
| `pnpm check:corpus-claim-drift` | 0 | pass |
| `pnpm check:cross-package-test-inputs` | 0 | pass |
| `pnpm check:doc-authoring` | 0 | `53 published skill files clean — no
internal issue-id references` |
| `pnpm check:driver-memory-census` | 0 | pass |
| `pnpm check:gitlink-declared` | 0 | pass |
| `pnpm check:nul-bytes` | 0 | `OK (scanned 9892 text file(s) … no raw
ASCII control bytes)` |
| `pnpm check:pm-governed-merges` | 0 | self-test, 454 assertions (what
CI runs for this family) |
| `pnpm check:refd-timer-probe` | 0 | pass |
| `pnpm check:role-word` | 0 | pass |
| `pnpm check:skill-compatibility` | 0 | pass |
| `pnpm check:skill-frame-sync` | 0 | pass |
| `pnpm check:skill-identifier-liveness` | 0 | pass |
| `pnpm check:skill-top-level-keys` | 0 | pass |
| `pnpm check:watch-hint-literal` | 0 | pass |
Also run outside the derivation: `grep -naP
'[\x00-\x08\x0b\x0c\x0e-\x1f\x7f]' skills/objectstack-platform/SKILL.md`
→ no match.
### tests
`Test Core` is path-scheduled by `skills/**`. The diff touches no
package, so no dependency closure (①) and no package suite (②) is owed;
run locally instead are the test files whose code reads the `skills/`
root (the only tests a prose change here can move), under the verify
lock (VERDICT command-exit 0, held 33s, waited 0s), each invocation
checked for a non-zero file count:
| Command | exit | result |
|:--|--:|:--|
| `pnpm --filter create-objectstack exec vitest run --maxWorkers=2
src/template-consistency.test.ts` | 0 | 1 file, 37 tests passed |
| `pnpm --filter @objectstack/formula exec vitest run --maxWorkers=2
src/skill-catalog-sync.test.ts` | 0 | 1 file, 1 test passed |
| `pnpm --filter @objectstack/rest exec vitest run --maxWorkers=2
src/meta-state-route-doc-spelling.test.ts` | 0 | 1 file, 8 tests passed
|
| `pnpm --filter @objectstack/spec exec vitest run --maxWorkers=2
scripts/dist-freshness-adoption.test.ts scripts/export-list.test.ts
scripts/query-pointer-row.test.ts
scripts/solution-blueprint-header-row.test.ts` | 0 | 4 files, 26 tests
passed |
NOT MEASURED, declared to CI: the full `Test Core` shards;
`packages/cli/test/generate-skill.e2e.test.ts` (integration tier — it
spawns the CLI; the diff touches no spawn entry); the four type-check
lanes (no TypeScript touched); shard attestation and test-completeness
(values exist only in a CI run); the 55 artifact-roster, 11
wide-population and 14 pending-changeset families the derivation lists
outside its runnable total.
### changeset
`skip-changeset`. No published package's `files[]` names `skills/**`
(read over every `packages/**/package.json`: zero); the catalog reaches
customers by `npx skills add objectstack-ai/objectstack/skills` from
this repository (`packages/create-objectstack/src/skills-install.ts`,
line 62), not from an npm tarball. Measured after building
`create-objectstack` (the only package that names the catalog at all):
the edited sentence's phrase `generic connector executors in` hits 0
files across its `files[]` paths (`dist`, `README.md`, `CHANGELOG.md`)
and 0 files across the 5 `dist/` trees present on disk; positive control
`exportsOf` hits 2 files in that same `dist`.
### deviations
- None of the derived families was narrowed or skipped. The one exit 3
(`check:doc-formula-expressions`) was a declared prerequisite, cleared
by building and re-running; recorded above as 3 then 0.
- The commit's attribution trailer is the model-free pair AGENTS.md
prescribes (`Claude-Session:` + `Co-authored-by: Claude`), not the
harness-suggested model-named form.
### files_changed
- `skills/objectstack-platform/SKILL.md` (+11 / −9)
## Acceptance notes (observed, not filed)
- `## Project Structure Conventions` (lines 209–232) lists no
`src/skills/` directory, while the starter now ships one with its own
barrel. That section describes a project convention, not the starter;
class: none of a/b/c; carrier: none.
- Line 245's naming row spells the barrel hand-off as
`Object.values(imported)`; the starter spells it `exportsOf(barrel)`, a
typed `Object.values`. Both true; carrier: none.
- "Bundled with `create-objectstack` — no network fetch" describes the
template itself; the scaffold's separate skills-install step (`npx -y
skills add …`) does fetch. Pre-existing claim, shortened here without
changing its substance; carrier: none.
## 维护者速读(草稿)
**改了什么**:平台技能(`skills/objectstack-platform/SKILL.md`)里描述 `blank`
起步模板的那一段,改成与实际发出的模板一致:`requires` 现在是 `['automation',
'triggers']`,并说明七个目录
barrel(objects/views/actions/flows/dashboards/apps/skills)都已经通过
`exportsOf` 接到同名 stack 键,加一句指向脚手架生成的 `AGENTS.md` 说明怎么往里加东西。为了不超过技能包的
token 上限,同一文件里删了三处重复表述(退役模板段落压成一句、`triggers` 表格行不再重复规则 5、"works offline
/ no network fetch" 只说一次)。
**为什么改**:技能是 AI 写应用时读的说明书;这句话过时后,AI 按它描述起步项目会漏掉 `triggers`(`objectstack
generate flow` 生成的 flow 装不上),也不知道 barrel 已经接好,可能手加 stack 键而不是从 barrel
导出。
**风险与代价(含回滚)**:纯文档改动,不动代码、不动发布包(`skills/**` 不在任何已发布包的 `files[]`
里,已实测);风险只在措辞被误读,已逐句对照模板文件核过并列在上表。回滚:revert 本 PR 的一个 commit 即可,无其它依赖。
**席位意见**:
**你要做的**:审阅并 APPROVE 本 PR(`skills/**` 属 Tier H,需要维护者的批准),之后由席位落地。
---
_Generated by [Claude
Code](https://claude.ai/code/session_01MjvgiFAmjHqsxy1XLiVYfH)_
Co-authored-by: os-steve <steve@objectstack.ai>
Co-authored-by: Claude <noreply@anthropic.com>1 parent 34ec30d commit 789b2ae
1 file changed
Lines changed: 11 additions & 9 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
188 | 188 | | |
189 | 189 | | |
190 | 190 | | |
191 | | - | |
192 | | - | |
193 | | - | |
194 | | - | |
| 191 | + | |
| 192 | + | |
| 193 | + | |
| 194 | + | |
| 195 | + | |
| 196 | + | |
| 197 | + | |
| 198 | + | |
195 | 199 | | |
196 | 200 | | |
197 | | - | |
198 | | - | |
199 | | - | |
200 | | - | |
| 201 | + | |
| 202 | + | |
201 | 203 | | |
202 | 204 | | |
203 | 205 | | |
| |||
369 | 371 | | |
370 | 372 | | |
371 | 373 | | |
372 | | - | |
| 374 | + | |
373 | 375 | | |
374 | 376 | | |
375 | 377 | | |
| |||
0 commit comments