Skip to content

Commit a1afbb9

Browse files
feat(spec)!: retire five inert objectstack.manifest.json keys (name, specVersion, skills, scaffold, visibility) (#31064)
<!-- claude-projects-attribution: {"github_login":"os-tesla"} --> _Requested by **Tesla** · [project thread](https://claude.ai/code/project/chan_01AXsQkLFKRdQCqQ3RTr6Jao?thread=cmsg_01AXsQkLFKRdQCqQ3RTr6JaoVRhC8knfxw74e3SpmzvPw4)_ Clause-②: no (narrowing) — five authorable keys of `TemplateManifestSchema` become tombstones, and `os package publish` refuses the file's `visibility` by name Metadata-protocol: narrowed Skills-docs: none — no `skills/**` page teaches `objectstack.manifest.json`; the docs pages that did are updated here Part of #31035 ## 维护者速读 - 改了什么:`objectstack.manifest.json` 里五个没人读的键(`name`、`specVersion`、`skills`、`scaffold`、`visibility`)改成 `retiredKey()` 墓碑:tsc 和 schema 解析都按键名拒绝并给出替代做法;`os package publish` 遇到文件里的 `visibility` 直接拒绝(指向 `--visibility`),其余四个只警告让作者删除;blank 模板、三个 connector 应用的清单和脚手架不再写这些键;版本同步脚本不再盖 `specVersion`。 - 为什么改:ADR-0049「要么执行要么删除」。逐键实测(见 #31035 的逐键表):这四个键在 CLI、create-objectstack、hotcrm 里都没有读者,`visibility` 只被读来警告「我忽略你」。`publisher` / `isStarter` 有 hotcrm 的服务模式发送链,不在本 PR,等单独的决策卡。 - 风险与回滚:收窄(BREAKING 横幅 + adr-0087 登记)。还写着这五个键的旧清单在 schema 解析时被拒;`os package publish` 只对 `visibility` 拒绝,其他四个继续发布并警告,所以老脚手架项目还能发。hotcrm 的清单和版本测试在它下次升级平台时要删这几个键(与 `category` 同一载体)。回滚即 revert。 - 先看:`packages/spec/src/marketplace/template-manifest.zod.ts`(五个墓碑和提示语);`packages/cli/src/commands/package/publish.ts`(`visibility` 拒绝 + 四键警告);`scripts/sync-template-versions.mjs`(去掉 `specVersion` 盖章,自测基线重测)。 - 两分钟验证:`pnpm --filter @objectstack/spec exec vitest run --project repo src/marketplace/template-manifest-inert-keys-retirement.test.ts`,预期 12 个用例全绿(逐键拒绝、两条替代指引、`publisher`/`isStarter` 对照、tsc 墓碑、登记、全树清单扫描)。 - 需要你做的:无,席位落地。 ## What changes - **Spec (`TemplateManifestSchema`).** `name`, `specVersion`, `skills`, `scaffold` and `visibility` become `retiredKey()` tombstones. The schema is non-strict, so a bare delete would strip silently; a tombstone refuses each key at its own path with the prescription `` `TemplateManifest.<key>` was removed in @objectstack/spec 18 (ADR-0049) — … ``. `visibility` names `os package publish --visibility`; `specVersion` names `manifest.engines.protocol`. - **ADR-0087 bookkeeping.** Five `RETIRED_KEYS_BY_MAJOR[18]` rows (`marketplace/TemplateManifest:<key>`), one D3 semantic entry `marketplace-template-manifest-inert-keys-retired` naming all five, and its STEP18_RATIONALE fragment. No D2 conversion: this file is not a stack collection member (the `category` precedent on the same schema), so `os migrate meta` has nothing to rewrite. - **Liveness.** The five `template_manifest` rows stay `dead` with a REMOVED note; the `scaffold.*` children are removed. `publisher` / `isStarter` notes now say they are pending a maintainer decision (hotcrm is a producer). - **`os package publish`.** A manifest declaring `visibility` is refused before any network call (`retiredVisibilityRefusal()`, the `category` shape). `name`, `specVersion`, `skills` and `scaffold` get a non-fatal warning naming them for deletion; the warning list no longer carries `visibility`. - **create-objectstack.** The blank template's manifest drops `name`, `specVersion`, `skills` and `scaffold`; scaffolding strips every retired key (`category` and these five) from the template's manifest via `stripRetiredManifestKeys` instead of writing `name`; the key list `RETIRED_TEMPLATE_MANIFEST_KEYS` is pinned to the spec's `RETIRED_KEYS_BY_MAJOR` rows by `scaffold-retired-manifest-keys.test.ts`. - **Release tooling.** `scripts/sync-template-versions.mjs` no longer stamps `specVersion`; its self-test battery floors are re-measured (Control A 14, Control C 4, Control I now pins `engines.protocol` at 9), and the create-objectstack version tests follow. - **Shipped manifests.** `packages/apps/connector-{docusign,github,stripe}/objectstack.manifest.json` drop `name` and `specVersion`. - **Pins.** `template-manifest-inert-keys-retirement.test.ts` (spec, repo project): refusal per key at its own path with its prescription, the `--visibility` and `engines.protocol` pointers, a `publisher` / `isStarter` control, `@ts-expect-error` tsc pins, the ADR-0087 registration (five rows, one D3 entry, no D2 conversion), and a tree-scoped walk of every `objectstack.manifest.json` under `packages/` and `examples/` (at least 4 found, none declaring a retired key). It is listed in `vitest.repo-tests.json` and is a `heldBy` witness in `scripts/cross-package-test-inputs.mjs`. `check:template-manifests`' self-test base drops the retired keys and gains a RED `specVersion` fixture. Spec, CLI and create-objectstack fixtures that still wrote the keys are trimmed. - **Docs.** Getting-started tree, upgrading guide (step 3 is now `engines.protocol` only), marketplace handbook and CLI reference. The `content/docs/references/` page is regenerated, not hand-edited. - **Changeset.** `@objectstack/spec` minor, `@objectstack/cli` minor, `create-objectstack` patch, with both declaration lines, the BREAKING banner, the FROM → TO list and the adr-0087 marker. ## Why ADR-0049 enforce-or-remove. Measured on `origin/main` 115a43a (per-key table on #31035): no reader of the file's `name`, `specVersion`, `skills` or `scaffold` exists in the CLI, create-objectstack or hotcrm; create-objectstack wrote `name` and never read it back, the protocol check reads the artifact's `engines.protocol`, and the skills install is the whole catalog. `os package publish` read `visibility` only to warn that it ignores it. ## Verification All runs on head `4f2f3c85` in a dedicated worktree, base `origin/main` `115a43ad`, except where the rework block below says `5da9dd3c`. **Rework on `5da9dd3c`** (contract-review should-fix, commits `073cd355` + `5da9dd3c`): create-objectstack `vitest run` Test Files 25 passed (25), Tests 374 passed (374), `pnpm typecheck` :: exit 0; `dispatch-gates --commands` 136 derived, 136 run, 0 NOT-MEASURED, all exit 0 (record `/mnt/project-files/spec-seat-1/r2026-11-06/out/31035-gates-ran-5da9dd3c.list`). Ablations restored after each: the call site back to `delete m.name` → 1 red; dropping `category` from the list → 2 red; `specVersion` added to connector-github's manifest → `check:template-manifests` exit 1. <details><summary>Tests</summary> - `pnpm --filter @objectstack/spec test` (local project): Test Files 820 passed (820), Tests 25908 passed, 1 todo - `pnpm --filter @objectstack/spec test:repo` (repo project, which now carries the new pin): Test Files 91 passed (91), Tests 1551 passed (1551) - `pnpm --filter @objectstack/spec check:test-typecheck` :: exit 0; `check:generated` :: exit 0 after a declaration build - create-objectstack `vitest run`: Test Files 24 passed (24), Tests 369 passed (369); `pnpm typecheck` :: exit 0 - `@objectstack/cli` unit project: Test Files 396 passed (5 of them re-run after a declaration build; their first local run was red on a dts-less build, not on the diff), `pnpm typecheck` :: exit 0 - `packages/apps/connector-{docusign,github,stripe}` `pnpm test` (`objectstack validate && vitest run`): 28, 14 and 20 tests passed - `node scripts/sync-template-versions.mjs --self-test` :: exit 0, 44 assertions The CLI, create-objectstack and connector runs are on `58b292e7`; `4f2f3c85` only adds the new test's path to `packages/spec/vitest.repo-tests.json`. </details> <details><summary>Ablations</summary> Through `scripts/ablation-replace.mjs`, each restored to the committed blob afterwards: - Visibility refusal guard in `publish.ts` disabled (`if (false && …)`): 1 test red (`the retired visibility › refuses …`); restored, green. - `specVersion` tombstone swapped back to `z.string().optional()`: 2 tests red (refusal at its own path; the `engines.protocol` prescription); restored, green. </details> <details><summary>Derived gates</summary> `node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack` derived 134 families for the 41-path change set; all 134 ran with exit 0. `--ran` reconciliation: 134 derived, 134 run, 0 NOT-MEASURED, 0 UNRUN. One finding on the first pass, fixed in `4f2f3c85`: `check:cross-package-test-inputs` asked for the new tree-walking test to be listed in `vitest.repo-tests.json`. Four first runs answered exit 3 (prerequisite, nothing measured) and were re-run green after the prerequisite: `check-plugin-teardown-shape --self-test` (pinned fixture commit fetched), `check:skill-examples`, `check:dual-build-cjs-loads` and `check:i18n-coverage` (declaration build of `./packages/*` and `./packages/*/*`). `check-platform-checklist --changed-from origin/main` :: exit 0 (no anchored file in the change set). Record: `/mnt/project-files/spec-seat-1/r2026-11-06/out/31035-gates-ran-4f2f3c85.list`. </details> Dogfood: full battery on `4f2f3c85` (`pnpm --filter @objectstack/dogfood test`, no shard, closure built first, under the verify lock): Test Files 429 passed, 3 skipped (432); Tests 3569 passed, 41 skipped (3610); lock VERDICT command-exit 0. ## Acceptance notes - **`publisher` and `isStarter` are excluded**, pending their own decision card: hotcrm's `scripts/lib/marketplace-listing.mjs#packageUpsertBody` sends both from its manifest in service mode, so their fate is a maintainer decision. The control case in the new test holds that this PR did not take them. - **Known downstream follow-up (hotcrm carrier, next platform bump, same carrier as `category`).** hotcrm's `objectstack.manifest.json` still writes `name`, `specVersion` and `skills`, and its `test/docs-declared-versions.test.ts` and `test/marketplace-listing.test.ts` parse or stamp them; both go red on the first hotcrm bump to a spec carrying this change. - **Design choice the seat may strike:** the four inert keys only warn in `os package publish` (every project scaffolded from the blank template before this release carries them); only `visibility` refuses. - `check:template-manifests` now walks create-objectstack's templates and `packages/apps/*` (a zero-file guard per root; 4 manifests parsed), so the three connector manifests are gated by `check:generated` too. The new test's tree-scoped walk also covers them and is registered as a `heldBy` witness in `scripts/cross-package-test-inputs.mjs`. - `.github/workflows/release.yml` still has a comment mentioning the manifest stamp. It is a governed file, so it is left for a maintainer edit; nothing executes it. - The Claim said `Metadata-protocol: none`; a tombstone is `narrowed`, declared here per the seat's ruling. - The harness assignee / reviewer step is skipped: the PR is opened through the relay as a draft, and the seat lands it. ## Human Minimum - [x] 1. Schemas start as Zod; `packages/spec` holds no runtime logic. - [x] 2. Every name I added uses the casing for its kind. - [x] 3. No formatter ran; `pnpm lint` passes (CI-owned). - [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: its generated artifacts are regenerated and committed. - [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. 🤖 Generated with [Claude Code](https://claude.com/claude-code) https://claude.ai/code/session_01L9qibz5AiZzgut2WFyXVqW <!-- signed: domain:spec#1 · os-tesla · session_01L9qibzzqHZdAVqgBAvxXKB --> --------- Co-authored-by: Claude <noreply@anthropic.com>
1 parent 5210acf commit a1afbb9

44 files changed

Lines changed: 750 additions & 288 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
---
2+
'@objectstack/spec': minor
3+
'@objectstack/cli': minor
4+
'create-objectstack': patch
5+
---
6+
7+
feat(spec)!: retire five `objectstack.manifest.json` keys nothing read — `name`, `specVersion`, `skills`, `scaffold` and `visibility` (#31035)
8+
9+
Clause-②: no (narrowing) — five authorable keys of `TemplateManifestSchema` become tombstones, and `os package publish` refuses the file's `visibility` by name
10+
Metadata-protocol: narrowed
11+
12+
<!-- adr-0087: registered marketplace-template-manifest-inert-keys-retired -->
13+
14+
**BREAKING** for an `objectstack.manifest.json` that still writes any of the five keys, and for `os package publish` run on a manifest that declares `visibility`.
15+
16+
- **Retired (ADR-0049 enforce-or-remove).** `TemplateManifest.name`, `.specVersion`, `.skills`, `.scaffold` and `.visibility` are `retiredKey()` tombstones: `tsc` refuses them and a parse of `TemplateManifestSchema` refuses each with its prescription. None ever had an effect: no reader of the file's `name`, `specVersion`, `skills` or `scaffold` existed, and `os package publish` read `visibility` only to warn that it ignores it. `RETIRED_KEYS_BY_MAJOR[18]` lists the five keys and the upgrade guide carries the semantic entry `marketplace-template-manifest-inert-keys-retired`. No ADR-0087 conversion: this file is not a stack collection member, so `os migrate meta` has nothing to rewrite; a runtime boot never reads it. The publish request's own `visibility` (`CreatePackageRequestSchema`) is unchanged.
17+
- **Migration** — FROM → TO, in `objectstack.manifest.json`:
18+
- `name` → delete it. The project slug is `package.json` `name`; the published package id is `manifestId` (or the one `os package publish` derives from the compiled artifact).
19+
- `specVersion` → delete it. The protocol your package needs is `manifest.engines.protocol` in `objectstack.config.ts`; the spec release it builds against is its `@objectstack/spec` dependency.
20+
- `skills` → delete it. create-objectstack installs the whole skills catalog.
21+
- `scaffold` → delete it. Nothing prompted for `scaffold.variables` or ran `scaffold.postInstall`.
22+
- `visibility` → delete it and pass `os package publish --visibility <private|org|marketplace>`.
23+
- **`@objectstack/cli`.** `os package publish` refuses a manifest declaring `visibility` before any network call, naming `--visibility`. It names the other four in a warning for deletion and still publishes, because every project scaffolded from the blank template before this release carries them.
24+
- **`create-objectstack`.** The blank template's manifest drops the five keys it wrote (`name`, `specVersion`, `skills`, `scaffold`), and scaffolding strips every retired key (`category` and these five, one list pinned to the spec's registry rows) from the template's manifest instead of writing `name`, so a template authored before this release still scaffolds a manifest the schema accepts. The release version pass (`scripts/sync-template-versions.mjs`) no longer stamps `specVersion`.
25+
- **Not retired here:** `publisher` and `isStarter`. A first-party publish script sends both to the hosted packages route, so their fate is a maintainer decision.

‎content/docs/deployment/cli.mdx‎

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3307,7 +3307,9 @@ checked against the spec's schema before anything is sent, and a declared
33073307
`solutionType` against the built artifact: a `template` needs the `unmanaged`
33083308
install mode, a `connector` a declared connector. The retired `category` — in
33093309
the file, or as `--category` — is refused before any network call, with the
3310-
facets that replace the value it held. `tags` has no flag and is
3310+
facets that replace the value it held, and so is a `visibility` in the file
3311+
(pass `--visibility`). The retired `name`, `specVersion`, `skills` and
3312+
`scaffold`, which nothing ever read, are named in a warning for deletion. `tags` has no flag and is
33113313
sent as written: the control plane judges the list, and a refusal is its 400,
33123314
printed as it is. A top-level `tagline` is used only as the description, when
33133315
neither `--description` nor the file's `description` gives one; otherwise it is

‎content/docs/deployment/marketplace-handbook.mdx‎

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -96,6 +96,9 @@ with no image to caption. The schema also accepts `publisher` and `isStarter`,
9696
but the platform decides both: an author's value has no effect, so
9797
`os package publish` never sends them and prints a warning naming each one the
9898
file declares. `tags` is different: it is sent as written (see the table above).
99+
The file no longer accepts `visibility` (pass `--visibility`; publish refuses the
100+
key by name) nor `name`, `specVersion`, `skills` or `scaffold`, which nothing
101+
ever read: publish names each one still present so you can delete it.
99102
Put the icon, the description, the tags, the tagline and the README where the
100103
table above says, and nothing else.
101104
</Callout>
@@ -139,10 +142,11 @@ npx os verify # boots the app in-process and proves it through the real H
139142
npm run build # os build -> dist/objectstack.json
140143
```
141144

142-
Two declarations name the platform major your app is authored against:
143-
`engines.protocol` in the `defineStack` manifest, and `specVersion` in
144-
`objectstack.manifest.json`. A runtime outside the `engines.protocol` range
145-
refuses the app rather than half-loading it. See
145+
One declaration names the platform major your app is authored against:
146+
`engines.protocol` in the `defineStack` manifest. A runtime outside that range
147+
refuses the app rather than half-loading it. (The `specVersion` an older
148+
scaffold wrote into `objectstack.manifest.json` was never read, and spec 18
149+
retired it: delete it.) See
146150
[Validating metadata](/docs/deployment/validating-metadata) for what the checks
147151
cover.
148152

@@ -261,8 +265,8 @@ loaded, and the app's page shows **Not loaded** with the protocol range it
261265
targets.
262266

263267
To move, run `os migrate meta --from <the major you authored against>` on your
264-
source, apply what it lists, update `engines.protocol` and `specVersion`,
265-
rebuild, and publish a new version. [Upgrading](/docs/upgrading#the-metadata-app)
268+
source, apply what it lists, update `engines.protocol`, rebuild, and publish a
269+
new version. [Upgrading](/docs/upgrading#the-metadata-app)
266270
owns the loop.
267271

268272
## Extras: dependencies and modules

‎content/docs/getting-started/your-first-project.mdx‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -104,7 +104,7 @@ between all four entry points by the artifact you want rather than by the word.
104104
```
105105
my-app/
106106
├── objectstack.config.ts # defineStack() — the single entry point
107-
├── objectstack.manifest.json # name, namespace, specVersion
107+
├── objectstack.manifest.json # displayName, namespace — the package listing
108108
├── package.json
109109
├── tsconfig.json
110110
├── note.test.ts # the starter test `npm test` runs

‎content/docs/references/marketplace/template-manifest.mdx‎

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,8 @@ description: "objectstack.manifest.json — on-disk descriptor for a template /
88

99
`objectstack.manifest.json` — on-disk descriptor for a template / package
1010
source tree. Strict projection of `CreatePackageRequestSchema` (server-
11-
managed fields excluded) plus scaffold-time extras (name slug,
12-
specVersion, namespace, skills, preview, scaffold, readmePath), with
11+
managed fields excluded) plus scaffold-time extras (namespace, preview,
12+
readmePath), with
1313
`manifestId` locally relaxed to OPTIONAL — this file is a source tree, not
1414
a publish request (#7319; the field's own TSDoc carries the measurement).
1515

@@ -44,7 +44,7 @@ objectstack.manifest.json — template / package source descriptor
4444
| :--- | :--- | :--- | :--- |
4545
| **displayName** | `string` | ✅ | Display name shown in Studio and Marketplace |
4646
| **description** | `string` | optional | Short package description |
47-
| **visibility** | `Enum<'private' \| 'org' \| 'marketplace'>` | optional | Package visibility: private = owner org only; org = all envs in owner org; marketplace = public registry |
47+
| **visibility** | `never` | optional | [REMOVED] `TemplateManifest.visibility` was removed in @objectstack/spec 18 (ADR-0049) — `os package publish` never read it from this file. Delete the key and pass `--visibility` (`private`, `org` or `marketplace`) to `os package publish`. |
4848
| **category** | `never` | optional | [REMOVED] `TemplateManifest.category` was removed in @objectstack/spec 18 (ADR-0087) — one category had to say both who a package is for and what it is, and the platform and the cloud catalog spelled it from lists that disagreed. Delete the key. Declare `businessFunctions` (1-3 business functions, the primary one first), optionally `industries` (up to 3; absent means cross-industry) and `solutionType` (`app`, `template` or `connector`; absent means `app`). `LEGACY_CATEGORY_MAPPING` in @objectstack/spec/marketplace gives the facets for every old category value. |
4949
| **businessFunctions** | `Enum<'sales' \| 'marketing' \| 'customer-service' \| 'finance' \| 'hr' \| 'supply-chain' \| 'administration' \| 'project' \| 'legal' \| 'it' \| 'collaboration'>[]` | optional | Business functions the package serves: 1-3 distinct values, the first is primary |
5050
| **industries** | `Enum<'manufacturing' \| 'trade-distribution' \| 'retail' \| 'logistics' \| 'professional-services' \| 'financial-services' \| 'healthcare' \| 'education' \| 'public-sector' \| 'real-estate-construction'>[]` | optional | Industries the package is built for: up to 3 distinct values; absent means cross-industry |
@@ -58,12 +58,12 @@ objectstack.manifest.json — template / package source descriptor
5858
| **isStarter** | `boolean` | optional | |
5959
| **translations** | `Record<string, { displayName?: string; description?: string; readme?: string; tagline?: string; … }>` | optional | Locale-keyed overrides; missing keys fall back to base columns |
6060
| **manifestId** | `string` | optional | Optional declarative default for the published package id (reverse-domain, e.g. com.acme.crm). Absent on a template source tree: `objectstack package publish` falls back to --manifest-id and then to a derived `local.<slug>`. NOT optional on the publish request itself |
61-
| **name** | `string` | ✅ | CLI slug (kebab-case, no namespace prefix) |
62-
| **specVersion** | `string` | ✅ | Compatible @objectstack/spec semver range |
61+
| **name** | `never` | optional | [REMOVED] `TemplateManifest.name` was removed in @objectstack/spec 18 (ADR-0049) — nothing read it: `os package publish` addresses the package by `manifestId` (or derives one from the compiled artifact), and a project's slug is its `package.json` `name`. Delete the key. |
62+
| **specVersion** | `never` | optional | [REMOVED] `TemplateManifest.specVersion` was removed in @objectstack/spec 18 (ADR-0049) — nothing read it. Delete the key. The protocol a package needs is `manifest.engines.protocol` in `objectstack.config.ts` (the handshake the runtime checks), and the spec release it builds against is the `@objectstack/spec` version in `package.json`. |
6363
| **namespace** | `string` | optional | Scaffold-only: the template’s own metadata namespace, rewritten by create-objectstack at scaffold time and read back as the fallback source for the template’s original namespace. NOT the publish namespace — publish reads that off the compiled artifact’s manifest.namespace (ADR-0048 addendum §A.2) |
64-
| **skills** | `string[]` | optional | Skill ids exercised by this template (for docs / picker) |
64+
| **skills** | `never` | optional | [REMOVED] `TemplateManifest.skills` was removed in @objectstack/spec 18 (ADR-0049) — nothing read it: create-objectstack installs the whole `@objectstack/skills` catalog whatever this file lists. Delete the key. |
6565
| **preview** | `{ screenshots?: string[]; demoUrl?: string }` | optional | |
66-
| **scaffold** | `{ variables?: Record<string, any>; postInstall?: string[] }` | optional | |
66+
| **scaffold** | `never` | optional | [REMOVED] `TemplateManifest.scaffold` was removed in @objectstack/spec 18 (ADR-0049) — nothing read it: create-objectstack never prompted for `scaffold.variables` nor ran `scaffold.postInstall`. Delete the key. |
6767
| **readmePath** | `string` | optional | Path (relative to manifest) to long-form README |
6868

6969
### Nested Shape: `TemplateManifest.translations[string]`

‎content/docs/upgrading.mdx‎

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -83,11 +83,12 @@ command for this move; it is four steps you run yourself.
8383
what older scaffolds wrote) moves entirely here. Read whatever
8484
peer-dependency warnings this prints — the `--frozen-lockfile` install your CI
8585
runs skips resolution and will never print them.
86-
3. **Check the two protocol declarations your app ships** — `specVersion` in
87-
`objectstack.manifest.json`, and `engines.protocol` in your `defineStack`
88-
manifest. Both name the protocol **major**, so a move inside one major leaves
89-
both alone, and a major boundary is where they change. Move them deliberately
90-
when you cross one; never edit them to silence a mismatch.
86+
3. **Check the protocol declaration your app ships** — `engines.protocol` in
87+
your `defineStack` manifest. It names the protocol **major**, so a move inside
88+
one major leaves it alone, and a major boundary is where it changes. Move it
89+
deliberately when you cross one; never edit it to silence a mismatch. (An
90+
older scaffold also wrote `specVersion` into `objectstack.manifest.json`.
91+
Nothing ever read it, and spec 18 retired it: delete it.)
9192
4. **Re-install the AI skills from the moved catalog, and commit them.** The
9293
skills your coding agent reads come from the `@objectstack/skills` dev
9394
dependency, which moves only with the other `@objectstack/*` packages — in

‎docs/audits/2026-07-unknown-key-strictness-ledger.counts/marketplace.md‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,4 +19,4 @@ hand-patch a number here** — fix the code or the verdict and regenerate.
1919

2020
| Dir | Sites |
2121
|---|---|
22-
| `marketplace/` | 31 |
22+
| `marketplace/` | 30 |

‎packages/apps/connector-docusign/objectstack.manifest.json‎

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,6 @@
11
{
22
"$schema": "https://schemas.objectstack.dev/template-manifest.json",
33
"manifestId": "app.objectstack.connector-docusign",
4-
"name": "connector-docusign",
5-
"specVersion": "^18.0.0",
64
"displayName": "DocuSign eSignature",
75
"description": "Send documents for signature, read envelopes and follow their signature status from flows, over DocuSign's eSignature OpenAPI document. Developer sandbox; your administrator registers their own DocuSign integration key.",
86
"businessFunctions": ["collaboration", "legal"],

‎packages/apps/connector-github/objectstack.manifest.json‎

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,6 @@
11
{
22
"$schema": "https://schemas.objectstack.dev/template-manifest.json",
33
"manifestId": "app.objectstack.connector-github",
4-
"name": "connector-github",
5-
"specVersion": "^18.0.0",
64
"displayName": "GitHub",
75
"description": "Search and read GitHub issues and pull requests from flows, through GitHub's remote MCP server. Read only.",
86
"businessFunctions": ["it"],

‎packages/apps/connector-stripe/objectstack.manifest.json‎

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,6 @@
11
{
22
"$schema": "https://schemas.objectstack.dev/template-manifest.json",
33
"manifestId": "app.objectstack.connector-stripe",
4-
"name": "connector-stripe",
5-
"specVersion": "^18.0.0",
64
"displayName": "Stripe",
75
"description": "Read Stripe customers, charges, invoices and payment intents from flows, over Stripe's own OpenAPI document. Read only.",
86
"businessFunctions": ["finance"],

0 commit comments

Comments
 (0)