Skip to content

Commit 514bf3c

Browse files
docs(spec): the protocol upgrade guide's public address is one docs-site page per protocol major; docs/protocol-upgrade-guide.md becomes a pointer stub (#22449 B′, condition 2) (#22556)
Fixes #22483 Clause-②: no The protocol upgrade guide now has a public address: **the docs site, one page per protocol major**, at `https://objectstack.ai/docs/protocol-upgrade/MAJOR`, with an index at `https://objectstack.ai/docs/protocol-upgrade`. The pages are generated at docs build from the ADR-0087 registries and never committed. `docs/protocol-upgrade-guide.md` stays at its path as a short, hand-written pointer stub naming that address. That is condition (2) of ruling `6078203801` on #22449 (B′), and the two notes in triage `6081410390`. ## The address: the seat's three hypotheses, measured first | | Stable across releases | No GitHub login | Versioned per major | Verdict | |---|---|---|---|---| | H1: Release attachment | **no**: one URL per VERSION | yes (public repo) | per version, not per major | fails | | H2: docs-site page, generated at docs build | yes | yes (public site) | yes: one page per major | **taken** | | H3: npm CDN (`unpkg`/`jsDelivr`) | n/a | n/a | keyed by the npm range, not a protocol major | not chosen (outside the ruling's two options) | **H1, measured.** The newest spec Release, `@objectstack/spec@17.7.0`, carries one asset, `spec-changes.json`, at `https://github.com/objectstack-ai/objectstack/releases/download/%40objectstack/spec%4017.7.0/spec-changes.json` (302 to the asset store, no auth). One URL per VERSION. `releases/latest` answers 302 to `releases/tag/@objectstack/verify@17.7.0`, another package's Release. `releases/latest/download/spec-changes.json` redirects to `.../download/@objectstack/verify@17.7.0/spec-changes.json`, which is 404. So no GitHub URL resolves to "the newest spec release of a major". Also, no Release carries the guide yet: the 17.7.0 tarball holds `spec-changes.json` and no guide, because the publish lane from #22533 landed after it. **H2, measured.** - **The build can run a spec script.** `apps/docs`'s `build` already runs `@objectstack/spec`'s `gen:schema` and `gen:docs` before `next build`. Vercel runs `pnpm turbo run build --filter=@objectstack/docs` (`apps/docs/vercel.json`), and CI's `Build Docs` evaluates that same string. This PR adds `gen:upgrade-guide` to that chain. - **The URLs.** `SITE_ORIGIN` is `https://objectstack.ai` (`apps/docs/lib/site.ts`) and the docs `baseUrl` is `/docs` (`apps/docs/lib/source.ts`). So the pages are `/docs/protocol-upgrade`, `/docs/protocol-upgrade/17` and `/docs/protocol-upgrade/18`. - **The build sees unreleased majors.** `main` carries `PROTOCOL_VERSION` `18.0.0` while `packages/spec/package.json` says `17.7.0`. npm's `latest` is `17.7.0`, whose tarball carries protocol `17.0.0` (read from its `dist`). So the 17 → 18 hop is unreleased, and the docs site builds from `main`. - **Choice: mark, never hide.** Every page carries one state line, judged from the tree's own `@objectstack/spec` version under the lockstep contract in `src/kernel/protocol-version.ts`: - spec major below the page's major: **Not released yet** (the pre-mode pending major); - equal major on a prerelease version: **Prerelease**; - otherwise: **Released**. Every page also says it is generated from `main`, ahead of the release that ships a newly landed entry. Why mark rather than hide: 1. `objectstack migrate meta` already replays the chain up to the highest registered major, so the page shows what the tool prints. 2. The `18.0.0-next.N` line (`.changeset/22080-v18-line-opens.md`) has readers, and hiding the page would leave them no address. 3. Even a released major's page gains entries between releases, because launch-window minors register under the current major. "Released majors only" would still not equal "what shipped". The shipped copy stays the one in the tarball and on the Release, and every page says so. - **The local build, with and without the pages.** Same box, one run each, `rm -rf .next` before each. Each run was under the verify lock, but unlocked sibling work was running beside it: | | `next build` exit | compiled | static pages | peak `next-build` RSS | |---|---|---|---|---| | with the pages | 0 | 105 s | 1255 in 35.5 s | 6,166,396 kB | | without | 0 | 103 s | 1246 in 33.3 s | 6,653,292 kB | So the pages add no measurable peak memory: noise between the two runs is larger than the effect. Rendered sizes: `protocol-upgrade/18.html` 3.48 MB, `17.html` 1.20 MB, the index 235 KB. The sidebar shows "Protocol Upgrade Guide" after "Upgrading". - **Login-free.** The site is public. A live probe of `objectstack.ai` is NOT MEASURED: this container's proxy refuses CONNECT to that host (403). **H3, measured.** Not chosen: the ruling names two options and this one is outside them. It also does not key by protocol major: `npm view @objectstack/spec@18 version` answers `E404 No match found for version 18`, because protocol 18 ships as `18.0.0-next.N` and a bare `@18` range never matches a prerelease. `@17` resolves to `17.7.0`, which carries no guide, and pre mode cuts no further 17.x. Live CDN reachability is NOT MEASURED: the proxy refuses CONNECT to `unpkg.com` and `cdn.jsdelivr.net` (403). ## What changed - **`packages/spec/scripts/build-upgrade-guide.ts`**: `build()` is split into section renderers: - `howToUpgrade`, `hopSection` and `footer`; - the single-file guide `--out` writes is byte-identical to before, except its second header comment. That comment now names the command that writes the file (`exec tsx scripts/build-upgrade-guide.ts --out FILE`), because `gen:upgrade-guide` no longer does. Measured: `diff` of the base's and this branch's `--out` output is that one line. - **No flag** (`gen:upgrade-guide`) now writes the docs pages into `content/docs/protocol-upgrade/`, never `docs/protocol-upgrade-guide.md`, so the stub cannot be overwritten. `--docs DIR` writes them elsewhere. - `--check` and `--out` are unchanged. - **`packages/spec/scripts/lib/upgrade-guide-docs.ts`** (new) assembles the tree: `index.md`, one `MAJOR.md` per hop the chain carries, and a `meta.json` listing them newest first. - A page holds the shared how-to, its own hop section verbatim from the same renderer, and the footer. It has no body h1, and its frontmatter is quoted so YAML never reads a colon or an arrow as structure. - The writer removes only files it wrote. A page whose hop fell below the support floor does not linger, and a directory holding anything else is refused untouched. - **`apps/docs/package.json`**: `build` runs `gen:upgrade-guide` before `next build`. - **`content/docs/meta.json`**: `protocol-upgrade` is listed after `upgrading`. When the folder is absent (a checkout that has not run the docs build), fumadocs skips the entry. Measured in `fumadocs-core`'s `resolveFolderItem`: an item that resolves to no node returns without one. - **`.gitignore`**: `content/docs/protocol-upgrade/`. - **`docs/protocol-upgrade-guide.md`**: the stub. It names the index, one line per major today (17 and 18), and the pattern for the next one. It also says where a release's shipped copy lives, and how to generate either form. - **`packages/spec/scripts/check-generated.ts`**: the `check:upgrade-guide` row names the docs pages as its artifact. - **`packages/spec/scripts/lib/projection-cli.ts`**: `committedPath` is optional. The guide no longer has a committed copy, so its runner passes none. A bare run without one is a usage error (exit 2) that builds nothing. - **`.gitattributes` / `scripts/regen-artifacts.mjs`** (seat answer `6092165230`, option B): the guide's `merge=os-regen` route and its `REGEN_ARTIFACTS` row are removed. `gen:upgrade-guide` is recorded as `NOT_DRIVER_MANAGED` for `content/docs/protocol-upgrade/**` (untracked). The header prose no longer calls the guide a generated single file. The `spec-changes.json` route stays for #22485. - **`scripts/check-role-word.mjs`** (seat answer `6093145489`, Q2 → A): `content/docs/protocol-upgrade` is in `SKIP_SUBTREES`, for the reason `content/docs/references` is: generated prose whose fix site, the registry `.ts`, this markdown gate cannot reach. - The self-test now accepts an untracked tree that `NOT_DRIVER_MANAGED` declares where it required one on disk, and it requires every such tree under a ROOT to be skipped. - A new program-level battery runs the gate over a fixture page inside each skipped tree (exit 0, nothing read), one level up (NEW use, exit 1), and in a sibling directory sharing the prefix (NEW use, exit 1). - Both directions hold: with the pages on disk the gate exits 0, and a violation planted in `content/docs/build-without-code.mdx` still exits 1, the only problem reported. - Ablation, dropping the entry: exit 1, with 3 failures with the pages on disk and 2 without, restored to blob == HEAD. - **`.changeset/22483-upgrade-guide-docs-address.md`**: `@objectstack/spec` `patch`. The shipped `protocol-upgrade-guide.md` changes by its header comment, and the address is user-facing news. `apps/docs` is private. ## Every published pointer, with its resolves check Every pointer spells the repo path `docs/protocol-upgrade-guide.md` as text, never as a URL (`git grep -o` over the tree: 71 bare `docs/protocol-upgrade-guide.md` spellings, no `github.com`, `raw.githubusercontent.com` or `objectstack.ai` form). The check is the same for each: - the path exists on this branch and is the stub; - the stub names `https://objectstack.ai/docs/protocol-upgrade`; - for the one pointer that names an entry id, that id is on the page the stub sends the reader to. On GitHub, `blob/claude/issue-22483-upgrade-guide-address/docs/protocol-upgrade-guide.md` and its `raw.githubusercontent.com` form both answer 200, and the fetched bytes name the address 4 times. | Pointer (file · mentions · first line) | Shipped in its package | Resolves | |---|---|---| | `packages/client/README.md` · 1 · `:141` (cites `batch-options-validate-only-retired`) | yes (`files[]` has `README.md`) | ✓ stub → `/docs/protocol-upgrade/17`; that id is on the 17 page (3 hits in the built `17.html`) | | `packages/cli/CHANGELOG.md` · 3 · `:14221` | yes | ✓ stub | | `packages/client/CHANGELOG.md` · 4 · `:5655` | yes | ✓ stub | | `packages/core/CHANGELOG.md` · 1 · `:2013` | yes | ✓ stub | | `packages/create-objectstack/CHANGELOG.md` · 1 · `:1544` | yes | ✓ stub | | `packages/metadata-protocol/CHANGELOG.md` · 2 · `:14511` | yes | ✓ stub | | `packages/runtime/CHANGELOG.md` · 3 · `:10073` | yes | ✓ stub | | `packages/services/service-automation/CHANGELOG.md` · 2 · `:9260` | yes | ✓ stub | | `packages/services/service-package/CHANGELOG.md` · 1 · `:3432` | yes | ✓ stub | | `packages/spec/CHANGELOG.md` · 41 · `:1825` | yes | ✓ stub. Some of its mentions are the bare `protocol-upgrade-guide.md`, the in-package file, which still ships | | `packages/spec/src/migrations/entries/README.md` · 1 · `:99` | no (`files[]` ships `src/**/*.zod.ts` only) | ✓ stub | These are the eleven of the ruling: ten shipped files plus the entries README. No CHANGELOG is edited. The in-repo, unpublished mentions keep resolving through the same stub: ADR-0087 `:348`, `docs/audits/2026-08-partial-retirement-annotation-signal.md:94`, the #22482 changeset, and scripts. ## File surface Inside the claim: the stub, `build-upgrade-guide.ts` and its tests, the docs wiring that generates the address (`apps/docs/package.json`, `content/docs/meta.json`, `.gitignore`), `check-generated.ts`'s row (named by the dispatch), and one changeset. Beyond it, each named here: - **`scripts/check-future-spec-major.mjs`**: deleted one `QUOTATION_EXEMPTIONS` row. This was forced: with the stub in place the gate went red, `QUOTATION_EXEMPTIONS entry 6 (docs/protocol-upgrade-guide.md, major 4997) matched NOTHING … Re-point it or delete it.` The row excused the generated copy of one entry's evidence sentence, and the stub no longer carries it. After the deletion the gate reads `7 witnessed ledger entr(y|ies), every witness still matching`, and `--self-test` reports 29 cases. - **`packages/spec/scripts/lib/projection-cli.ts`**: the optional `committedPath` above. This is the no-flag contract of `build-upgrade-guide.ts`'s default write target, the item the claim names. - **`packages/spec/scripts/lib/upgrade-guide-docs.ts`** and **`upgrade-guide-docs.test.ts`**: new files in the same scripts tree. - **`.gitattributes`** (the guide's route line, and the header prose from `:20`) and **`scripts/regen-artifacts.mjs`** (the row moves to `NOT_DRIVER_MANAGED`), per seat answer `6092165230`. - **`scripts/check-role-word.mjs`** (seat answer `6093145489`): a local docs build made the gate report 99 NEW uses (17.md 56, 18.md 43) that CI never saw, because the tree is gitignored. **Removed here (seat answer `6092165230`, option B).** `.gitattributes` drops the guide's route, and its header no longer calls the guide a generated single file. `regen-artifacts.mjs` drops the row and records `gen:upgrade-guide` as `NOT_DRIVER_MANAGED` `content/docs/protocol-upgrade/**` (untracked). `check:merge-driver` reads 17 routed paths, 42 generators with a disposition, and 4 untracked dispositions. The `spec-changes.json` route stays for #22485. Why it went here: the route was actively wrong for a hand-written file. Before the removal, `scripts/pm/os-regen-merge.sh` twice put main's generated guide back over the stub (`bd5a3284d0`), and the stub was restored by blob (`9473b0f21f`). The scratch merge after the removal measured three cases: - From a checkout carrying this PR, merging a branch with a regenerated guide CONFLICTS on the stub. With the route (`8f4ae58944`), the same merge was silent. - A branch forked before this PR still defers on its own route at its first plain `git merge` of `main`. Its next commit and push are then refused, where with the route they passed and the stub was lost. So no direction stays silent. - This PR's own merge of `main` at `bf6942b723` conflicted on the stub and kept it. ## Verification All at `7bc190c714` unless a line says otherwise. The last merge of `origin/main` is `bf6942b723`, which brought in `96e4be4829`, whose `20e7d52097` regenerated the guide; it conflicted on the stub, which was kept (blob `9473b0f21f`). `origin/main` has stayed at `99801d831f` since, and GitHub reports the PR mergeable. - **Spec suites**, under `scripts/pm/os-verify-lock.sh`, VERDICT command-exit 0: - at `87a9a3435e`: `vitest run --project local --maxWorkers=2`: 636 files passed, 18970 tests passed, 1 todo; - at `87a9a3435e`: `--project repo`: 54 files, 915 tests passed; - at `bf6942b723`: `build-schemas-check-mode.test.ts` (repo project) 88/88; - at `7bc190c714`: the five generator and ledger test files, 50/50. - **`pnpm --filter @objectstack/spec typecheck`**: VERDICT command-exit 0. `tsc -p tsconfig.scripts.json --listFiles` lists all five touched or new script files, tests included. - **The new and changed tests**: `upgrade-guide-docs.test.ts` (15) and `projection-cli.test.ts` (12, one new), 27 of 27 passing. The real-generator block proves three things: - every page's hop section is the single file's section verbatim, and pages exist for exactly the file's hops; - `--docs` is deterministic; - `--docs` with `--check`, with `--out`, or with no directory exits 2 and writes nothing; - a directory holding a hand-written file exits 1 with nothing removed. - **Gates**: `node scripts/pm/dispatch-gates.mjs --commands` derived 128 at `7bc190c714`. All ran with the gitignored docs pages on disk (`gen:upgrade-guide` first), and `--ran` reports 128 derived, 128 run, 0 NOT-MEASURED, 0 UNRUN. All 128 exit 0, `check:role-word` included. Without the pages (CI's tree) `check:role-word` also exits 0, and it reads 254 files either way. Among them: `check:generated` ("All 15 generated artifacts are up to date"), `check:upgrade-guide`, `check:spec-changes`, `check:future-spec-major`, `check:merge-driver`, `check:cross-package-test-inputs`, `check:doc-frontmatter`, `check:nul-bytes` and `check:pm-dispatch-gates`. - **ESLint, narrowed and measured.** - Population: the 9 changed JS/TS files (adding `scripts/regen-artifacts.mjs` and `scripts/check-role-word.mjs`), measured at `7bc190c714`, all matched by `eslint.config.mjs`'s `**/*.{ts,tsx,mts,cts,js,jsx,mjs,cjs}` object. - `--no-inline-config --format json` reports 9 files, 0 errors and 0 warnings. - The config sets no `parserOptions.project`, so no type-aware rule can move a verdict on a file this diff does not touch. - The repo-wide `pnpm lint` is CI's. - **Docs build**: `apps/docs` `pnpm build` (gen chain plus `next build`), exit 0, at `278751de7a` (this PR's content, before the merge). See H2. `pnpm turbo run build --concurrency=2` gave 73/73 tasks with `@objectstack/docs#build` at `bf6942b723` (6m23s), and 73/73, all cached, at `7bc190c714`. ## Acceptance notes - **A stale branch after this lands (carrier #22485, pointer `6093148255`).** A branch forked before this PR that carries a regenerated guide defers it at its first plain `git merge` of `main`. Its next commit and push are then refused by `check-regen-pending.mjs`, with a remedy that cannot apply: "absent from scripts/regen-artifacts.mjs (cannot verify)". Restoring the stub does not clear it; deleting the pending marker by hand does. #22485's route removal creates the same state for `spec-changes.json`. - **ADR-0087's true-up note** (`40735ea58d`, #22561) still says the guide's route goes in #22485 and that `gen:upgrade-guide` writes the committed copy. Per seat answer `6093145489` (Q3 → A), #22485 corrects it in its governed ADR edit. - **CI's `docs` path filter** (`ci.yml`) does not list `packages/spec/**`. So a registry entry whose prose the docs build cannot compile would surface in Vercel's production build, not in `Build Docs`. The pages are `.md` (CommonMark, no JSX), which parses arbitrary text, and `gen:docs` has the same pre-existing exposure. - **Raw angle brackets in prose**: 8 lines of the generated prose carry raw angle-bracket tokens outside code spans, for example the entry that writes the field key as `('field', OBJECT.NAME)` with the two names in angle brackets. A Markdown renderer reads those as HTML. That is a property of the registry text, not of this change, and its rendering on the site is not measured here. - **The floor**: a hop leaves the site when the support floor rises past it (ADR-0087 D3), and the stub says so. The next major needs no stub edit to be found: the index lists it, and the stub states the per-major pattern. --- _Generated by [Claude Code](https://claude.ai/code/session_01VZqqwTj2wsihZEbfT6yyYN)_ --------- Co-authored-by: Claude <noreply@anthropic.com>
1 parent 874a38d commit 514bf3c

15 files changed

Lines changed: 860 additions & 1696 deletions
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
---
2+
'@objectstack/spec': patch
3+
---
4+
5+
docs(spec): the protocol upgrade guide has a public address, one docs-site page per protocol major
6+
7+
Clause-②: no
8+
9+
The guide is published on the docs site, one page per protocol major, at `https://objectstack.ai/docs/protocol-upgrade/N`; `https://objectstack.ai/docs/protocol-upgrade` lists them all. A link to one major keeps resolving after the next major opens. The site builds from `main`, so each page says whether its major is released, in prerelease, or not released yet.
10+
11+
`docs/protocol-upgrade-guide.md` in the repository, which earlier READMEs and changelog entries point at, is now a short pointer naming that address.
12+
13+
What a release shipped is unchanged: `protocol-upgrade-guide.md` inside the package and attached to its GitHub Release. Its only change is the header comment, which now names the command that writes the file.
14+
15+
Nothing changes for an author, and nothing is renamed or removed.

‎.gitattributes‎

Lines changed: 27 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -17,22 +17,37 @@
1717
# stay routed here as directories: the driver still owns a same-category
1818
# collision, which is the residue sharding cannot remove.
1919
#
20-
# Two entries below are still SINGLE files — spec-changes.json and
21-
# docs/protocol-upgrade-guide.md — and #8344 asked what the driver-less queue does
22-
# to them. MEASURED (2026-08-13, the real in-flight case plus four synthetic pairs,
23-
# each merged in a clone with no merge.os-regen.driver): it never leaves them
24-
# stale-but-clean. Both are sorted unions and an ADR-0087 registration is
25-
# insertion-only, so the queue's text merge either takes both sides — byte-identical
26-
# to the regeneration, gates green — or conflicts outright. It conflicts only when
27-
# the two in-flight entries are ADJACENT in registry sort order; one existing entry
28-
# between them is already enough to merge clean AND current.
29-
#
30-
# Sharding them would not buy back an ejection, which is why they are still single
31-
# files: every conflicting case also conflicts in
20+
# One entry below is still a SINGLE file — spec-changes.json — and #8344 asked
21+
# what the driver-less queue does to it. MEASURED (2026-08-13, the real in-flight
22+
# case plus four synthetic pairs, each merged in a clone with no
23+
# merge.os-regen.driver, over it and the protocol upgrade guide, then a second
24+
# committed single file): the queue leaves neither stale-but-clean. Both were sorted
25+
# unions and an ADR-0087 registration is insertion-only, so the queue's text merge
26+
# either takes both sides — byte-identical to the regeneration, gates green — or
27+
# conflicts outright. It conflicts only when the two in-flight entries are ADJACENT
28+
# in registry sort order; one existing entry between them is already enough to
29+
# merge clean AND current.
30+
#
31+
# Sharding it would not buy back an ejection, which is why it is still a single
32+
# file: every conflicting case also conflicts in
3233
# packages/spec/src/migrations/registry.ts — generated, committed, unsharded,
3334
# NOT_DRIVER_MANAGED — and every registration touches it by construction. The table
3435
# and the reproduction are in packages/spec/src/migrations/entries/README.md.
3536
#
37+
# docs/protocol-upgrade-guide.md LEFT this list at #22483 because nothing generates
38+
# it any more. It is a hand-written pointer stub naming the guide's public address,
39+
# and `gen:upgrade-guide` writes the gitignored docs pages under
40+
# content/docs/protocol-upgrade/ instead (NOT_DRIVER_MANAGED records that path). A
41+
# route there was harmful, not idle: the driver kept OURS whole, and the pre-commit
42+
# discharge then passed it, because `check:upgrade-guide` compares no committed
43+
# copy — so a branch carrying a generated guide merged the stub away in silence.
44+
# Unrouted, a merge made from a checkout that carries this file conflicts on the
45+
# stub. ⚠️ git reads the route from the checkout DOING the merge, so a branch
46+
# forked before #22483 still defers the guide on its first merge of main; the merged
47+
# tree has no row to discharge it against, so the next commit and the push are
48+
# refused instead of passed (measured on PR #22556 with the previous head as the
49+
# control, both merge directions).
50+
#
3651
# `merge=os-regen` hands those paths to `scripts/git-merge-regen.mjs`, which does
3752
# NOT text-merge them. See that file for why it also does not regenerate them
3853
# in place (git runs merge drivers BEFORE the sources are merged, so anything
@@ -173,7 +188,6 @@ packages/spec/src/meta-spelling/meta-url-data.generated.ts merge=os-regen
173188
packages/spec/export-origins/** merge=os-regen
174189
packages/spec/declaration-map/** merge=os-regen
175190
packages/spec/api-surface-signatures.json merge=os-regen
176-
docs/protocol-upgrade-guide.md merge=os-regen
177191
docs/audits/2026-07-unknown-key-strictness-ledger.counts/** merge=os-regen
178192
content/docs/references/** merge=os-regen
179193
content/docs/permissions/system-context.mdx merge=os-regen

‎.gitignore‎

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -103,6 +103,9 @@ next-env.d.ts
103103
.source/
104104
apps/*/. source/
105105
apps/*/.next/docs/
106+
# The protocol upgrade guide's docs pages: generated at docs build by
107+
# `pnpm --filter @objectstack/spec gen:upgrade-guide`, never committed.
108+
content/docs/protocol-upgrade/
106109
.turbo
107110

108111
# Local env overrides (may contain secrets)

‎apps/docs/package.json‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
"license": "Apache-2.0",
77
"scripts": {
88
"dev": "next dev",
9-
"build": "pnpm --filter @objectstack/spec gen:schema && pnpm --filter @objectstack/spec gen:docs && NODE_OPTIONS='--max-old-space-size=4096' next build",
9+
"build": "pnpm --filter @objectstack/spec gen:schema && pnpm --filter @objectstack/spec gen:docs && pnpm --filter @objectstack/spec gen:upgrade-guide && NODE_OPTIONS='--max-old-space-size=4096' next build",
1010
"start": "next start",
1111
"site:lint": "next lint",
1212
"postinstall": "fumadocs-mdx",

‎content/docs/meta.json‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
"ai",
1515
"api",
1616
"upgrading",
17+
"protocol-upgrade",
1718
"---Platform---",
1819
"deployment",
1920
"plugins",

0 commit comments

Comments
 (0)