From e691e69dfe669088abadac49825c7c218c308c47 Mon Sep 17 00:00:00 2001 From: Claude Date: Mon, 28 Sep 2026 04:24:53 +0000 Subject: [PATCH 1/8] docs(spec): emit the docs title rule from the reference-page generator MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Generated reference pages get a PRIMARY-KEYWORD — QUALIFIER title in the 36-46 character band from one ladder per page kind (lib/page-title.ts), and keep their previous title as navTitle so the page tree is unchanged. Claude-Session: https://claude.ai/code/session_01ARcDurZ5j34RdqsGgc4jgH Co-authored-by: Claude --- packages/spec/scripts/build-docs.ts | 42 +++++- packages/spec/scripts/lib/page-title.ts | 172 +++++++++++++++++++++++ packages/spec/scripts/lib/root-index.ts | 5 +- packages/spec/scripts/page-title.test.ts | 170 ++++++++++++++++++++++ 4 files changed, 386 insertions(+), 3 deletions(-) create mode 100644 packages/spec/scripts/lib/page-title.ts create mode 100644 packages/spec/scripts/page-title.test.ts diff --git a/packages/spec/scripts/build-docs.ts b/packages/spec/scripts/build-docs.ts index cdecc6fad7a..055e0b37432 100644 --- a/packages/spec/scripts/build-docs.ts +++ b/packages/spec/scripts/build-docs.ts @@ -68,6 +68,12 @@ import { yamlDescription, type DescriptionSource, } from './lib/page-description'; +import { + categoryIndexTitle, + modulePageTitle, + titleFrontmatter, + type GeneratedPageTitle, +} from './lib/page-title'; import { API_SURFACE_DIR_NAME, readApiSurfaceFrom } from './lib/sharded-artifacts'; const SCHEMA_DIR = path.resolve(__dirname, '../json-schema'); @@ -464,6 +470,23 @@ const PAGE_SECTION_LEVEL = 2; /** Which rule of `lib/page-description.ts` produced each module page's description, tallied for the run summary. */ const descriptionSources: Record = { docblock: 0, 'docblock+schemas': 0, schemas: 0 }; +/** + * A page's `title` / `navTitle` under the docs title rule, or the build stops. + * + * The rule and its ladders live in `lib/page-title.ts` (#15403), which throws + * rather than emit a title outside the band; this turns that into the same + * named, exit-1 refusal `loadCategoryTitles` gives above instead of a stack + * trace from the middle of the page loop. + */ +function pageTitleOrExit(derive: () => GeneratedPageTitle): GeneratedPageTitle { + try { + return derive(); + } catch (err) { + console.error(`\n✗ ${err instanceof Error ? err.message : String(err)}`); + process.exit(1); + } +} + function generateZodFileMarkdown(zodFile: string, schemas: Array<{name: string, content: any}>, category: string): string { const zodTitle = zodFile.split('-').map(w => w.charAt(0).toUpperCase() + w.slice(1)).join(' '); @@ -493,8 +516,17 @@ function generateZodFileMarkdown(zodFile: string, schemas: Array<{name: string, }); descriptionSources[description.from]++; + // The search-facing title follows the docs title rule; `zodTitle`, the title + // this page carried before it, stays the sidebar label as `navTitle`. + const titles = pageTitleOrExit(() => + modulePageTitle( + { name: zodTitle, categoryTitle: CATEGORIES[category] }, + path.relative(REPO_ROOT, path.join(DOCS_ROOT, category, `${zodFile}.mdx`)), + ), + ); + let md = `---\n`; - md += `title: ${zodTitle}\n`; + md += titleFrontmatter(titles); md += `description: ${yamlDescription(description.text)}\n`; md += `---\n\n`; md += AUTO_GENERATED_BANNER; @@ -926,8 +958,14 @@ Object.entries(CATEGORIES).forEach(([category, title]) => { process.exit(1); } + // Same rule as the module pages; the category title stays the `navTitle` + // the footer's previous/next links show for this folder index page. + const titles = pageTitleOrExit(() => + categoryIndexTitle(title, path.relative(REPO_ROOT, path.join(DOCS_ROOT, category, 'index.mdx'))), + ); + let mdx = `---\n`; - mdx += `title: ${title}\n`; + mdx += titleFrontmatter(titles); mdx += `description: ${yamlDescription(categoryIndexDescription(title, cards.length))}\n`; mdx += `---\n\n`; mdx += AUTO_GENERATED_BANNER; diff --git a/packages/spec/scripts/lib/page-title.ts b/packages/spec/scripts/lib/page-title.ts new file mode 100644 index 00000000000..3fe85286f82 --- /dev/null +++ b/packages/spec/scripts/lib/page-title.ts @@ -0,0 +1,172 @@ +// Copyright (c) 2026 ObjectStack. Licensed under the Apache-2.0 license. + +/** + * The frontmatter `title` of a generated reference page, and the `navTitle` + * that keeps its sidebar label where it was. + * + * ## The rule this expresses + * + * The docs site has one page-title rule, approved on #12237 and landed for the + * authored pages by PR #20170 (its `## The rule` section is the text): + * + * - the shape is `PRIMARY-KEYWORD — QUALIFIER`, with ` — ` as the separator; + * - the frontmatter `title` string is 36–46 characters, so the rendered + * `` — the layout appends the 14-character ` | ObjectStack` — lands + * in 50–60, and no rendered title is over 60; + * - `ObjectStack` is never inside a title, because the suffix carries it; + * - the short label the sidebar shows goes in `navTitle`, whose fallback to + * `title` lives only in `navLabel()` in `apps/docs/lib/nav-title.ts`. + * + * The authored pages carry that rule by hand. The pages under + * `content/docs/references/` cannot: `build-docs.ts` rewrites every one of them + * on each run and `check:docs` goes red on a hand edit, so the rule has to live + * in the emitter (#15403). Before this module every generated title was the + * bare module or category name — measured on `main` at `862b6ce8`, 211 of 211 + * generated titles were outside the band (3 to 29 characters, median 11). + * + * ## Why a ladder, and why it is total over today's pages + * + * A generated title can only be composed from what the generator holds: the + * module's display name (`Agent`, from `agent.zod.ts`), its category's declared + * title (`AI Protocol`, `lib/category-title.ts`) and fixed words. Those names + * run from 3 to 29 characters and the categories from 11 to 20, so no single + * template lands every page inside an 11-character band. Each page kind + * therefore has a short ladder of candidates, LONGEST FIRST, and the title is + * the first candidate inside the band: + * + * module page `<Name> schema — <Category> property reference` (name + category + 29) + * `<Name> schema — <Category> reference` (name + category + 20) + * `<Name> — <Category> reference` (name + category + 13) + * `<Name> — <Category>` (name + category + 3) + * category index `<Category> — complete schema reference` (category + 28) + * `<Category> — schema reference` (category + 19) + * root index `Protocol reference — every schema by module` (fixed) + * + * The module ladder's rungs overlap end to end — together they cover every + * name + category length from 7 to 43, and the longest pair on the tree is 41 + * (`Schemaless Node Config` in `Automation Protocol`). The category ladder + * covers category titles of 8 to 27 characters, and the longest declared one + * is 25. The category keeps two same-named modules apart (`Plugin` is both a + * `kernel` and a `studio` page), so no two generated titles collide. + * + * A page no rung fits is REFUSED, never truncated: a cut title is an invented + * one, and a title outside the band is the defect this module exists to end. + * The refusal names the page and the candidates, and the remedy is a rung + * here — ⛔ never a hand edit of the page, which the next run reverts. + * + * ## What stays byte-identical: the page tree + * + * Each page's `navTitle` is exactly the string that used to be its `title`, so + * `navLabel()` hands the sidebar and the footer previous/next links the label + * they showed before. A category's folder label is its `meta.json` `title`, + * which this module does not touch; the category and root `index.mdx` pages + * still carry `navTitle` because the footer walks folder index pages too. + */ + +/** The shortest frontmatter `title` the rule allows. */ +export const TITLE_MIN = 36; +/** The longest frontmatter `title` the rule allows. */ +export const TITLE_MAX = 46; +/** Between the primary keyword and its qualifier, on every generated title. */ +export const TITLE_SEPARATOR = ' — '; +/** What `apps/docs/app/layout.tsx`'s title template appends to every page title. */ +export const RENDERED_TITLE_SUFFIX = ' | ObjectStack'; +/** The longest rendered `<title>` the rule allows. */ +export const RENDERED_TITLE_MAX = 60; + +/** The site name, which the suffix carries and a title never repeats. */ +const SITE_NAME = /objectstack/i; + +/** A generated page's two title keys. */ +export interface GeneratedPageTitle { + /** The search-facing title — `<h1>`, `<title>`, Open Graph, JSON-LD, `llms.txt`. */ + title: string; + /** The page-tree label — the sidebar entry and the footer links. */ + navTitle: string; +} + +/** Whether a title obeys the rule: inside the band, and without the site name. */ +export function titleInBand(title: string): boolean { + return title.length >= TITLE_MIN && title.length <= TITLE_MAX && !SITE_NAME.test(title); +} + +/** The rendered `<title>` a frontmatter `title` becomes. */ +export function renderedTitle(title: string): string { + return `${title}${RENDERED_TITLE_SUFFIX}`; +} + +/** + * The first candidate inside the band, or a thrown error naming the page and + * every candidate with its length. Never a truncation, never a fallback. + */ +export function firstTitleInBand(page: string, candidates: readonly string[]): string { + const title = candidates.find(titleInBand); + if (title !== undefined) return title; + throw new Error( + `No title candidate for ${page} is inside the docs title band (${TITLE_MIN}–${TITLE_MAX} characters, ` + + `no "ObjectStack"):\n\n` + + candidates.map(c => ` ${String(c.length).padStart(3)} ${c}`).join('\n') + + `\n\nThe generated reference pages take their title from the ladders in ` + + `packages/spec/scripts/lib/page-title.ts, longest candidate first. Add a rung there that brings this ` + + `page inside the band. Do not edit the page: the next gen:docs run rewrites it, and check:docs ` + + `reports the hand edit as drift.`, + ); +} + +/** One module's page, as its title needs it. */ +export interface ModuleTitleInput { + /** The module's display name — `Agent` for `agent.zod.ts`; the page's `navTitle`. */ + name: string; + /** The category's declared title — `AI Protocol`. */ + categoryTitle: string; +} + +/** The module-page ladder, longest first. */ +export function modulePageTitleCandidates({ name, categoryTitle }: ModuleTitleInput): string[] { + return [ + `${name} schema${TITLE_SEPARATOR}${categoryTitle} property reference`, + `${name} schema${TITLE_SEPARATOR}${categoryTitle} reference`, + `${name}${TITLE_SEPARATOR}${categoryTitle} reference`, + `${name}${TITLE_SEPARATOR}${categoryTitle}`, + ]; +} + +/** A module page's `title` under the rule, and its unchanged `navTitle`. */ +export function modulePageTitle(input: ModuleTitleInput, page: string): GeneratedPageTitle { + return { title: firstTitleInBand(page, modulePageTitleCandidates(input)), navTitle: input.name }; +} + +/** The category-index ladder, longest first. */ +export function categoryIndexTitleCandidates(categoryTitle: string): string[] { + return [ + `${categoryTitle}${TITLE_SEPARATOR}complete schema reference`, + `${categoryTitle}${TITLE_SEPARATOR}schema reference`, + ]; +} + +/** A category `index.mdx`'s `title` under the rule, and its unchanged `navTitle`. */ +export function categoryIndexTitle(categoryTitle: string, page: string): GeneratedPageTitle { + return { title: firstTitleInBand(page, categoryIndexTitleCandidates(categoryTitle)), navTitle: categoryTitle }; +} + +/** The root index's page-tree label — its title before the rule. */ +export const ROOT_INDEX_NAV_TITLE = 'Protocol Reference'; + +/** The root `references/index.mdx`'s `title` under the rule, and its unchanged `navTitle`. */ +export function rootIndexTitle(page = 'content/docs/references/index.mdx'): GeneratedPageTitle { + return { + title: firstTitleInBand(page, [`Protocol reference${TITLE_SEPARATOR}every schema by module`]), + navTitle: ROOT_INDEX_NAV_TITLE, + }; +} + +/** + * The two frontmatter lines, `title` then `navTitle` — the order the authored + * pages use. Plain scalars, the spelling the title line always had: every value + * is a module name, a declared category title or fixed words joined by ` — `, + * and `check:doc-frontmatter` holds both keys to a string on every page, so a + * value YAML would read as something else is refused there by name. + */ +export function titleFrontmatter({ title, navTitle }: GeneratedPageTitle): string { + return `title: ${title}\nnavTitle: ${navTitle}\n`; +} diff --git a/packages/spec/scripts/lib/root-index.ts b/packages/spec/scripts/lib/root-index.ts index 3cd863f3461..67a319d6290 100644 --- a/packages/spec/scripts/lib/root-index.ts +++ b/packages/spec/scripts/lib/root-index.ts @@ -60,6 +60,7 @@ */ import { AUTO_GENERATED_BANNER } from './generated-output'; +import { rootIndexTitle, titleFrontmatter } from './page-title'; /** One generated reference page, as the root index needs to describe it. */ export interface RootIndexPage { @@ -170,8 +171,10 @@ export function renderRootIndex(input: RootIndexInput): string { const totalPages = sections.reduce((n, s) => n + s.pages.length, 0); const totalSchemas = sections.reduce((n, s) => n + s.schemaCount, 0); + // The docs title rule, like every generated page (`lib/page-title.ts`); + // `Protocol Reference` stays this page's `navTitle`. let mdx = `---\n`; - mdx += `title: Protocol Reference\n`; + mdx += titleFrontmatter(rootIndexTitle()); mdx += `description: Every schema published by @objectstack/spec — ${totalSchemas} schemas across ${plural(sections.length, 'protocol module')}\n`; mdx += `---\n\n`; mdx += AUTO_GENERATED_BANNER; diff --git a/packages/spec/scripts/page-title.test.ts b/packages/spec/scripts/page-title.test.ts new file mode 100644 index 00000000000..ecedfc68544 --- /dev/null +++ b/packages/spec/scripts/page-title.test.ts @@ -0,0 +1,170 @@ +// Copyright (c) 2026 ObjectStack. Licensed under the Apache-2.0 license. + +/** + * Pin for the frontmatter `title` / `navTitle` of generated reference pages + * (#15403). + * + * `check:docs` compares the regenerated tree with the committed one, so it + * holds the OUTPUT still but says nothing about the rule: a regression that + * wrote every page back to its bare module name would regenerate, commit and + * stay green. These cases pin the rule itself — the band, the separator, no + * site name in a title, the ladder each page kind climbs, and that the sidebar + * label is the page's old title unchanged. + */ + +import { describe, expect, it } from 'vitest'; + +import { CATEGORY_TITLES } from './lib/category-title'; +import { + RENDERED_TITLE_MAX, + ROOT_INDEX_NAV_TITLE, + TITLE_MAX, + TITLE_MIN, + TITLE_SEPARATOR, + categoryIndexTitle, + categoryIndexTitleCandidates, + firstTitleInBand, + modulePageTitle, + modulePageTitleCandidates, + renderedTitle, + rootIndexTitle, + titleFrontmatter, + titleInBand, +} from './lib/page-title'; + +/** Every invariant the rule states, for one emitted title. */ +function expectRuleShaped(title: string) { + expect(title.length).toBeGreaterThanOrEqual(TITLE_MIN); + expect(title.length).toBeLessThanOrEqual(TITLE_MAX); + expect(renderedTitle(title).length).toBeGreaterThanOrEqual(50); + expect(renderedTitle(title).length).toBeLessThanOrEqual(RENDERED_TITLE_MAX); + expect(title.split(TITLE_SEPARATOR)).toHaveLength(2); + expect(title).not.toMatch(/objectstack/i); +} + +describe('the band', () => { + it('is 36–46 characters, which the 14-character suffix renders as 50–60', () => { + expect([TITLE_MIN, TITLE_MAX]).toEqual([36, 46]); + expect(renderedTitle('x'.repeat(TITLE_MIN))).toHaveLength(50); + expect(renderedTitle('x'.repeat(TITLE_MAX))).toHaveLength(RENDERED_TITLE_MAX); + }); + + it('refuses a title that names the site, whatever its length', () => { + expect(titleInBand('Agent schema — ObjectStack property reference')).toBe(false); + expect(titleInBand('Agent schema — objectstack property reference')).toBe(false); + expect(titleInBand('Agent schema — AI Protocol property reference')).toBe(true); + }); +}); + +/** + * Real `(module name, category title)` pairs from `content/docs/references/**` + * at `862b6ce8`, the name being the page's title before this rule — two per + * rung of the module ladder, including the tree's shortest name (`Mcp`, 3) and + * its two longest pairs (`Expression Bindable Text Keys` in UI, name 29; + * `Schemaless Node Config` in Automation, name + category 41). + */ +const MODULE_PAGES: Array<[name: string, categoryTitle: string, title: string]> = [ + ['Mcp', 'AI Protocol', 'Mcp schema — AI Protocol property reference'], + ['Agent', 'AI Protocol', 'Agent schema — AI Protocol property reference'], + ['Object', 'Data Protocol', 'Object schema — Data Protocol reference'], + ['Flow', 'Automation Protocol', 'Flow schema — Automation Protocol reference'], + ['Plugin Registry', 'Kernel Protocol', 'Plugin Registry — Kernel Protocol reference'], + ['Package Api Assembled', 'API Protocol', 'Package Api Assembled — API Protocol reference'], + ['Metadata Protection', 'Kernel Protocol', 'Metadata Protection — Kernel Protocol'], + ['Expression Bindable Text Keys', 'UI Protocol', 'Expression Bindable Text Keys — UI Protocol'], + ['Schemaless Node Config', 'Automation Protocol', 'Schemaless Node Config — Automation Protocol'], +]; + +describe('modulePageTitle', () => { + it.each(MODULE_PAGES)('%s (%s) → %s', (name, categoryTitle, title) => { + const out = modulePageTitle({ name, categoryTitle }, `references/x/${name}.mdx`); + expect(out).toEqual({ title, navTitle: name }); + expectRuleShaped(out.title); + }); + + it('takes the LONGEST rung inside the band', () => { + // `Agent` fits the first rung (45) and the second (36): the first wins. + const candidates = modulePageTitleCandidates({ name: 'Agent', categoryTitle: 'AI Protocol' }); + expect(candidates.filter(titleInBand)).toHaveLength(2); + expect(modulePageTitle({ name: 'Agent', categoryTitle: 'AI Protocol' }, 'p').title).toBe(candidates[0]); + }); + + it('keeps the rungs longest first, so the first fit is the longest fit', () => { + const lengths = modulePageTitleCandidates({ name: 'N', categoryTitle: 'C' }).map(c => c.length); + expect([...lengths].sort((a, b) => b - a)).toEqual(lengths); + }); + + it('is total for every declared category and every name that can fit beside it', () => { + // The ladder's rungs overlap end to end: every name + category length from + // 7 to 43 lands in the band. Swept over the real category titles, with + // every name length up to the limit that category leaves. + for (const categoryTitle of Object.values(CATEGORY_TITLES)) { + for (let n = 1; categoryTitle.length + n <= 43; n++) { + expectRuleShaped(modulePageTitle({ name: 'N'.repeat(n), categoryTitle }, 'p').title); + } + } + }); + + it('keeps two same-named modules in different categories apart', () => { + const kernel = modulePageTitle({ name: 'Plugin', categoryTitle: 'Kernel Protocol' }, 'p').title; + const studio = modulePageTitle({ name: 'Plugin', categoryTitle: 'Studio Protocol' }, 'p').title; + expect(kernel).not.toBe(studio); + }); + + it('refuses, naming the page, when no rung fits — never a truncated title', () => { + const tooLong = { name: 'An Exceedingly Long Module Display Name', categoryTitle: 'Integration Protocol' }; + expect(modulePageTitleCandidates(tooLong).some(titleInBand)).toBe(false); + expect(() => modulePageTitle(tooLong, 'content/docs/references/integration/long.mdx')).toThrow( + /content\/docs\/references\/integration\/long\.mdx/, + ); + }); +}); + +describe('categoryIndexTitle', () => { + it.each([ + ['AI Protocol', 'AI Protocol — complete schema reference'], + ['Identity Protocol', 'Identity Protocol — complete schema reference'], + ['Automation Protocol', 'Automation Protocol — schema reference'], + ['Marketplace Protocol', 'Marketplace Protocol — schema reference'], + ])('%s → %s', (categoryTitle, title) => { + const out = categoryIndexTitle(categoryTitle, `references/x/index.mdx`); + expect(out).toEqual({ title, navTitle: categoryTitle }); + expectRuleShaped(out.title); + }); + + it('is in the band for every declared category title', () => { + for (const categoryTitle of Object.values(CATEGORY_TITLES)) { + expectRuleShaped(categoryIndexTitle(categoryTitle, 'p').title); + } + }); + + it('keeps the rungs longest first', () => { + const lengths = categoryIndexTitleCandidates('C').map(c => c.length); + expect([...lengths].sort((a, b) => b - a)).toEqual(lengths); + }); +}); + +describe('rootIndexTitle', () => { + it('follows the rule and keeps "Protocol Reference" as the page-tree label', () => { + const out = rootIndexTitle(); + expect(out.navTitle).toBe(ROOT_INDEX_NAV_TITLE); + expect(ROOT_INDEX_NAV_TITLE).toBe('Protocol Reference'); + expectRuleShaped(out.title); + }); +}); + +describe('firstTitleInBand', () => { + it('answers the first candidate inside the band', () => { + expect(firstTitleInBand('p', ['short — one', 'A long enough title — with its qualifier', 'x'])).toBe( + 'A long enough title — with its qualifier', + ); + }); +}); + +describe('titleFrontmatter', () => { + it('writes title then navTitle, one line each', () => { + expect(titleFrontmatter({ title: 'Agent schema — AI Protocol property reference', navTitle: 'Agent' })).toBe( + 'title: Agent schema — AI Protocol property reference\nnavTitle: Agent\n', + ); + }); +}); From 0a2418934f8ce2d3ddd44f35e93a08a8bfbca860 Mon Sep 17 00:00:00 2001 From: Claude <noreply@anthropic.com> Date: Mon, 28 Sep 2026 04:28:58 +0000 Subject: [PATCH 2/8] docs(references): regenerate with the docs title rule and navTitle gen:docs output only: every generated reference page's title line is replaced by the rule-shaped title and a navTitle carrying the previous title, so the page tree is unchanged. Claude-Session: https://claude.ai/code/session_01ARcDurZ5j34RdqsGgc4jgH Co-authored-by: Claude <noreply@anthropic.com> --- content/docs/references/ai/agent.mdx | 3 ++- content/docs/references/ai/build-progress.mdx | 3 ++- content/docs/references/ai/conversation.mdx | 3 ++- content/docs/references/ai/embedding.mdx | 3 ++- content/docs/references/ai/index.mdx | 3 ++- content/docs/references/ai/knowledge-document.mdx | 3 ++- content/docs/references/ai/knowledge-source.mdx | 3 ++- content/docs/references/ai/mcp.mdx | 3 ++- content/docs/references/ai/model-registry.mdx | 3 ++- content/docs/references/ai/skill.mdx | 3 ++- content/docs/references/ai/solution-blueprint.mdx | 3 ++- content/docs/references/ai/tool.mdx | 3 ++- content/docs/references/ai/usage.mdx | 3 ++- content/docs/references/api/analytics.mdx | 3 ++- content/docs/references/api/auth-endpoints.mdx | 3 ++- content/docs/references/api/auth.mdx | 3 ++- content/docs/references/api/automation-api.mdx | 3 ++- content/docs/references/api/batch.mdx | 3 ++- content/docs/references/api/contract.mdx | 3 ++- content/docs/references/api/discovery.mdx | 3 ++- content/docs/references/api/dispatcher.mdx | 3 ++- content/docs/references/api/documentation.mdx | 3 ++- content/docs/references/api/endpoint.mdx | 3 ++- content/docs/references/api/error-code-ledger.mdx | 3 ++- content/docs/references/api/errors.mdx | 3 ++- content/docs/references/api/events.mdx | 3 ++- content/docs/references/api/export.mdx | 3 ++- content/docs/references/api/http-cache.mdx | 3 ++- content/docs/references/api/index.mdx | 3 ++- content/docs/references/api/metadata.mdx | 3 ++- content/docs/references/api/misc.mdx | 3 ++- content/docs/references/api/odata.mdx | 3 ++- content/docs/references/api/package-api-assembled.mdx | 3 ++- content/docs/references/api/package-api.mdx | 3 ++- content/docs/references/api/package-lifecycle.mdx | 3 ++- content/docs/references/api/plugin-rest-api.mdx | 3 ++- content/docs/references/api/protocol.mdx | 3 ++- content/docs/references/api/query-adapter.mdx | 3 ++- content/docs/references/api/realtime-shared.mdx | 3 ++- content/docs/references/api/realtime.mdx | 3 ++- content/docs/references/api/rest-server.mdx | 3 ++- content/docs/references/api/router.mdx | 3 ++- content/docs/references/api/sortability.mdx | 3 ++- content/docs/references/api/storage.mdx | 3 ++- content/docs/references/api/versioning.mdx | 3 ++- content/docs/references/api/websocket.mdx | 3 ++- content/docs/references/automation/approval.mdx | 3 ++- content/docs/references/automation/bpmn-interop.mdx | 3 ++- content/docs/references/automation/builtin-node-config.mdx | 3 ++- content/docs/references/automation/control-flow.mdx | 3 ++- content/docs/references/automation/execution.mdx | 3 ++- content/docs/references/automation/flow-function.mdx | 3 ++- content/docs/references/automation/flow.mdx | 3 ++- content/docs/references/automation/index.mdx | 3 ++- content/docs/references/automation/io-node-config.mdx | 3 ++- content/docs/references/automation/node-executor.mdx | 3 ++- content/docs/references/automation/schedule-organization.mdx | 3 ++- content/docs/references/automation/schemaless-node-config.mdx | 3 ++- content/docs/references/automation/state-machine.mdx | 3 ++- content/docs/references/automation/time-relative-trigger.mdx | 3 ++- content/docs/references/automation/webhook.mdx | 3 ++- content/docs/references/data/analytics.mdx | 3 ++- content/docs/references/data/context-tokens.mdx | 3 ++- content/docs/references/data/data-engine.mdx | 3 ++- content/docs/references/data/datasource.mdx | 3 ++- content/docs/references/data/date-macros.mdx | 3 ++- content/docs/references/data/document.mdx | 3 ++- content/docs/references/data/driver-common.mdx | 3 ++- content/docs/references/data/driver-memory.mdx | 3 ++- content/docs/references/data/driver-mongo.mdx | 3 ++- content/docs/references/data/driver-mysql.mdx | 3 ++- content/docs/references/data/driver-nosql.mdx | 3 ++- content/docs/references/data/driver-postgres.mdx | 3 ++- content/docs/references/data/driver-sql.mdx | 3 ++- content/docs/references/data/driver-sqlite.mdx | 3 ++- content/docs/references/data/driver-turso.mdx | 3 ++- content/docs/references/data/driver.mdx | 3 ++- content/docs/references/data/external-catalog.mdx | 3 ++- content/docs/references/data/feed.mdx | 3 ++- content/docs/references/data/field-value.mdx | 3 ++- content/docs/references/data/field.mdx | 3 ++- content/docs/references/data/filter.mdx | 3 ++- content/docs/references/data/hook-body.mdx | 3 ++- content/docs/references/data/hook.mdx | 3 ++- content/docs/references/data/index.mdx | 3 ++- content/docs/references/data/mapping.mdx | 3 ++- content/docs/references/data/object.mdx | 3 ++- content/docs/references/data/query.mdx | 3 ++- content/docs/references/data/seed-loader.mdx | 3 ++- content/docs/references/data/seed.mdx | 3 ++- content/docs/references/data/validation.mdx | 3 ++- content/docs/references/identity/eval-user.mdx | 3 ++- content/docs/references/identity/identity.mdx | 3 ++- content/docs/references/identity/index.mdx | 3 ++- content/docs/references/identity/organization.mdx | 3 ++- content/docs/references/identity/position.mdx | 3 ++- content/docs/references/identity/scim.mdx | 3 ++- content/docs/references/index.mdx | 3 ++- content/docs/references/integration/connector.mdx | 3 ++- content/docs/references/integration/index.mdx | 3 ++- content/docs/references/kernel/cli-extension.mdx | 3 ++- content/docs/references/kernel/cluster.mdx | 3 ++- content/docs/references/kernel/context.mdx | 3 ++- content/docs/references/kernel/dependency-resolution.mdx | 3 ++- content/docs/references/kernel/events-bus.mdx | 3 ++- content/docs/references/kernel/events-core.mdx | 3 ++- content/docs/references/kernel/events-dlq.mdx | 3 ++- content/docs/references/kernel/events-handlers.mdx | 3 ++- content/docs/references/kernel/events-integrations.mdx | 3 ++- content/docs/references/kernel/events-queue.mdx | 3 ++- content/docs/references/kernel/execution-context.mdx | 3 ++- content/docs/references/kernel/index.mdx | 3 ++- content/docs/references/kernel/manifest.mdx | 3 ++- content/docs/references/kernel/metadata-loader.mdx | 3 ++- content/docs/references/kernel/metadata-plugin.mdx | 3 ++- content/docs/references/kernel/metadata-protection.mdx | 3 ++- content/docs/references/kernel/package-artifact.mdx | 3 ++- content/docs/references/kernel/package-registry.mdx | 3 ++- content/docs/references/kernel/package-upgrade.mdx | 3 ++- content/docs/references/kernel/plugin-capability.mdx | 3 ++- content/docs/references/kernel/plugin-lifecycle-advanced.mdx | 3 ++- content/docs/references/kernel/plugin-loading.mdx | 3 ++- content/docs/references/kernel/plugin-registry.mdx | 3 ++- content/docs/references/kernel/plugin-security-advanced.mdx | 3 ++- content/docs/references/kernel/plugin-security.mdx | 3 ++- content/docs/references/kernel/plugin-structure.mdx | 3 ++- content/docs/references/kernel/plugin-validator.mdx | 3 ++- content/docs/references/kernel/plugin-versioning.mdx | 3 ++- content/docs/references/kernel/plugin.mdx | 3 ++- content/docs/references/kernel/service-registry.mdx | 3 ++- content/docs/references/kernel/startup-orchestrator.mdx | 3 ++- content/docs/references/marketplace/index.mdx | 3 ++- content/docs/references/marketplace/marketplace.mdx | 3 ++- content/docs/references/marketplace/package-version.mdx | 3 ++- content/docs/references/marketplace/package.mdx | 3 ++- content/docs/references/marketplace/template-manifest.mdx | 3 ++- content/docs/references/qa/index.mdx | 3 ++- content/docs/references/qa/testing.mdx | 3 ++- content/docs/references/security/explain.mdx | 3 ++- content/docs/references/security/index.mdx | 3 ++- content/docs/references/security/misc.mdx | 3 ++- content/docs/references/security/permission.mdx | 3 ++- content/docs/references/security/rls.mdx | 3 ++- content/docs/references/security/sharing.mdx | 3 ++- content/docs/references/shared/duration.mdx | 3 ++- content/docs/references/shared/enums.mdx | 3 ++- content/docs/references/shared/epoch.mdx | 3 ++- content/docs/references/shared/expression.mdx | 3 ++- content/docs/references/shared/http.mdx | 3 ++- content/docs/references/shared/identifiers.mdx | 3 ++- content/docs/references/shared/index.mdx | 3 ++- content/docs/references/shared/mapping.mdx | 3 ++- content/docs/references/shared/metadata-types.mdx | 3 ++- content/docs/references/shared/protection.mdx | 3 ++- content/docs/references/shared/value-domain.mdx | 3 ++- content/docs/references/studio/flow-builder.mdx | 3 ++- content/docs/references/studio/index.mdx | 3 ++- content/docs/references/studio/object-designer.mdx | 3 ++- content/docs/references/studio/plugin.mdx | 3 ++- content/docs/references/system/app-install.mdx | 3 ++- content/docs/references/system/auth-config.mdx | 3 ++- content/docs/references/system/book.mdx | 3 ++- content/docs/references/system/cache.mdx | 3 ++- content/docs/references/system/collaboration.mdx | 3 ++- content/docs/references/system/core-services.mdx | 3 ++- content/docs/references/system/deploy-bundle.mdx | 3 ++- content/docs/references/system/dev-login.mdx | 3 ++- content/docs/references/system/disaster-recovery.mdx | 3 ++- content/docs/references/system/doc.mdx | 3 ++- content/docs/references/system/email-config.mdx | 3 ++- content/docs/references/system/email-template.mdx | 3 ++- content/docs/references/system/encryption.mdx | 3 ++- content/docs/references/system/environment-artifact.mdx | 3 ++- content/docs/references/system/http-server.mdx | 3 ++- content/docs/references/system/index.mdx | 3 ++- content/docs/references/system/job.mdx | 3 ++- content/docs/references/system/license.mdx | 3 ++- content/docs/references/system/logging.mdx | 3 ++- content/docs/references/system/metadata-persistence.mdx | 3 ++- content/docs/references/system/metrics.mdx | 3 ++- content/docs/references/system/migration.mdx | 3 ++- content/docs/references/system/notification.mdx | 3 ++- content/docs/references/system/object-storage.mdx | 3 ++- content/docs/references/system/registry-config.mdx | 3 ++- content/docs/references/system/search-engine.mdx | 3 ++- content/docs/references/system/security-context.mdx | 3 ++- content/docs/references/system/settings-client.mdx | 3 ++- content/docs/references/system/settings-manifest.mdx | 3 ++- content/docs/references/system/stack-server.mdx | 3 ++- content/docs/references/system/supplier-security.mdx | 3 ++- content/docs/references/system/tenant.mdx | 3 ++- content/docs/references/system/tracing.mdx | 3 ++- content/docs/references/system/translation.mdx | 3 ++- content/docs/references/system/worker.mdx | 3 ++- content/docs/references/ui/action-params.mdx | 3 ++- content/docs/references/ui/action.mdx | 3 ++- content/docs/references/ui/app.mdx | 3 ++- content/docs/references/ui/bulk-action.mdx | 3 ++- content/docs/references/ui/chart.mdx | 3 ++- content/docs/references/ui/component.mdx | 3 ++- content/docs/references/ui/dashboard.mdx | 3 ++- content/docs/references/ui/dataset.mdx | 3 ++- content/docs/references/ui/expression-bindable-text-keys.mdx | 3 ++- content/docs/references/ui/i18n.mdx | 3 ++- content/docs/references/ui/index.mdx | 3 ++- content/docs/references/ui/notification.mdx | 3 ++- content/docs/references/ui/page.mdx | 3 ++- content/docs/references/ui/report.mdx | 3 ++- content/docs/references/ui/responsive.mdx | 3 ++- content/docs/references/ui/sharing.mdx | 3 ++- content/docs/references/ui/view.mdx | 3 ++- 211 files changed, 422 insertions(+), 211 deletions(-) diff --git a/content/docs/references/ai/agent.mdx b/content/docs/references/ai/agent.mdx index e9580a4713d..7c34d32323b 100644 --- a/content/docs/references/ai/agent.mdx +++ b/content/docs/references/ai/agent.mdx @@ -1,5 +1,6 @@ --- -title: Agent +title: Agent schema — AI Protocol property reference +navTitle: Agent description: "Agent schemas of the ObjectStack AI Protocol: AIModelConfig, Agent and 3 more — each property with its type, default and a TypeScript example." --- diff --git a/content/docs/references/ai/build-progress.mdx b/content/docs/references/ai/build-progress.mdx index 089e2c8f48c..750ef34cf44 100644 --- a/content/docs/references/ai/build-progress.mdx +++ b/content/docs/references/ai/build-progress.mdx @@ -1,5 +1,6 @@ --- -title: Build Progress +title: Build Progress schema — AI Protocol reference +navTitle: Build Progress description: "Build-progress PHASE vocabulary for the data-build-progress stream frame." --- diff --git a/content/docs/references/ai/conversation.mdx b/content/docs/references/ai/conversation.mdx index 5e7f4bb3bf1..b58d2c0785e 100644 --- a/content/docs/references/ai/conversation.mdx +++ b/content/docs/references/ai/conversation.mdx @@ -1,5 +1,6 @@ --- -title: Conversation +title: Conversation schema — AI Protocol reference +navTitle: Conversation description: "Multi-turn AI conversations with token budget management. Enables context preservation, conversation history, and token optimization." --- diff --git a/content/docs/references/ai/embedding.mdx b/content/docs/references/ai/embedding.mdx index 0a10e12d0e1..aa04d286bc9 100644 --- a/content/docs/references/ai/embedding.mdx +++ b/content/docs/references/ai/embedding.mdx @@ -1,5 +1,6 @@ --- -title: Embedding +title: Embedding schema — AI Protocol reference +navTitle: Embedding description: "Embedding & Vector Store Primitives — Platform contract for configuring embedding models and vector stores." --- diff --git a/content/docs/references/ai/index.mdx b/content/docs/references/ai/index.mdx index 5cfe216b034..5a31b887674 100644 --- a/content/docs/references/ai/index.mdx +++ b/content/docs/references/ai/index.mdx @@ -1,5 +1,6 @@ --- -title: AI Protocol +title: AI Protocol — complete schema reference +navTitle: AI Protocol description: "The ObjectStack AI Protocol in 12 reference pages: every schema in @objectstack/spec with its properties, types, defaults and a TypeScript example." --- diff --git a/content/docs/references/ai/knowledge-document.mdx b/content/docs/references/ai/knowledge-document.mdx index 99b9368a38a..9492bc5ac9b 100644 --- a/content/docs/references/ai/knowledge-document.mdx +++ b/content/docs/references/ai/knowledge-document.mdx @@ -1,5 +1,6 @@ --- -title: Knowledge Document +title: Knowledge Document — AI Protocol reference +navTitle: Knowledge Document description: "Knowledge Document / Chunk / Hit — canonical shapes shared by every IKnowledgeAdapter implementation." --- diff --git a/content/docs/references/ai/knowledge-source.mdx b/content/docs/references/ai/knowledge-source.mdx index ef6b0aa183e..2dbd61810f5 100644 --- a/content/docs/references/ai/knowledge-source.mdx +++ b/content/docs/references/ai/knowledge-source.mdx @@ -1,5 +1,6 @@ --- -title: Knowledge Source +title: Knowledge Source — AI Protocol reference +navTitle: Knowledge Source description: "Knowledge Source — declarative metadata describing what to index and which adapter to use." --- diff --git a/content/docs/references/ai/mcp.mdx b/content/docs/references/ai/mcp.mdx index 99ec93985a0..ff824d67cc1 100644 --- a/content/docs/references/ai/mcp.mdx +++ b/content/docs/references/ai/mcp.mdx @@ -1,5 +1,6 @@ --- -title: Mcp +title: Mcp schema — AI Protocol property reference +navTitle: Mcp description: "Model Context Protocol (MCP) — Reference & Binding Primitives — MCP itself is an external protocol defined by Anthropic." --- diff --git a/content/docs/references/ai/model-registry.mdx b/content/docs/references/ai/model-registry.mdx index e0769c3531f..d2540a94b9b 100644 --- a/content/docs/references/ai/model-registry.mdx +++ b/content/docs/references/ai/model-registry.mdx @@ -1,5 +1,6 @@ --- -title: Model Registry +title: Model Registry schema — AI Protocol reference +navTitle: Model Registry description: "Centralized registry for managing AI models, prompt templates, and model versioning." --- diff --git a/content/docs/references/ai/skill.mdx b/content/docs/references/ai/skill.mdx index c403c02d60a..d2b0757a8d1 100644 --- a/content/docs/references/ai/skill.mdx +++ b/content/docs/references/ai/skill.mdx @@ -1,5 +1,6 @@ --- -title: Skill +title: Skill schema — AI Protocol property reference +navTitle: Skill description: "Defines programmatic conditions under which a skill becomes active. Allows context-aware activation based on object type, user role, etc." --- diff --git a/content/docs/references/ai/solution-blueprint.mdx b/content/docs/references/ai/solution-blueprint.mdx index 43f230506bb..c42eab5d310 100644 --- a/content/docs/references/ai/solution-blueprint.mdx +++ b/content/docs/references/ai/solution-blueprint.mdx @@ -1,5 +1,6 @@ --- -title: Solution Blueprint +title: Solution Blueprint — AI Protocol reference +navTitle: Solution Blueprint description: "The structured-output target an AI agent emits for a high-level goal (\"build me a project-management system\") instead of transcribing a field list." --- diff --git a/content/docs/references/ai/tool.mdx b/content/docs/references/ai/tool.mdx index a687ac2e80d..ca0bf5725bc 100644 --- a/content/docs/references/ai/tool.mdx +++ b/content/docs/references/ai/tool.mdx @@ -1,5 +1,6 @@ --- -title: Tool +title: Tool schema — AI Protocol property reference +navTitle: Tool description: "Tool schemas of the ObjectStack AI Protocol: Tool — each property with its type, default and a TypeScript example." --- diff --git a/content/docs/references/ai/usage.mdx b/content/docs/references/ai/usage.mdx index 585fe961a46..9499bec1dd4 100644 --- a/content/docs/references/ai/usage.mdx +++ b/content/docs/references/ai/usage.mdx @@ -1,5 +1,6 @@ --- -title: Usage +title: Usage schema — AI Protocol property reference +navTitle: Usage description: "AI Usage Primitives — Platform contract for measuring AI consumption. Reference for AIUsageRecord, TokenUsage: every property with its type and default." --- diff --git a/content/docs/references/api/analytics.mdx b/content/docs/references/api/analytics.mdx index 922ac444d0c..04247636123 100644 --- a/content/docs/references/api/analytics.mdx +++ b/content/docs/references/api/analytics.mdx @@ -1,5 +1,6 @@ --- -title: Analytics +title: Analytics schema — API Protocol reference +navTitle: Analytics description: "Defines the HTTP interface for the Semantic Layer. Provides endpoints for executing analytical queries and discovering metadata." --- diff --git a/content/docs/references/api/auth-endpoints.mdx b/content/docs/references/api/auth-endpoints.mdx index 8b54c5b337b..f0e77ba4937 100644 --- a/content/docs/references/api/auth-endpoints.mdx +++ b/content/docs/references/api/auth-endpoints.mdx @@ -1,5 +1,6 @@ --- -title: Auth Endpoints +title: Auth Endpoints schema — API Protocol reference +navTitle: Auth Endpoints description: "Defines the canonical HTTP endpoints for the authentication service. Based on better-auth v1.4.18 endpoint conventions." --- diff --git a/content/docs/references/api/auth.mdx b/content/docs/references/api/auth.mdx index e0169fa8106..c9b7f3e424e 100644 --- a/content/docs/references/api/auth.mdx +++ b/content/docs/references/api/auth.mdx @@ -1,5 +1,6 @@ --- -title: Auth +title: Auth schema — API Protocol property reference +navTitle: Auth description: "Defines the standard API contracts for Identity, Session Management, and Access Control." --- diff --git a/content/docs/references/api/automation-api.mdx b/content/docs/references/api/automation-api.mdx index 4c595094cfa..8b603415414 100644 --- a/content/docs/references/api/automation-api.mdx +++ b/content/docs/references/api/automation-api.mdx @@ -1,5 +1,6 @@ --- -title: Automation Api +title: Automation Api schema — API Protocol reference +navTitle: Automation Api description: "Defines REST CRUD endpoint schemas for managing automation flows, triggering executions, and querying execution history." --- diff --git a/content/docs/references/api/batch.mdx b/content/docs/references/api/batch.mdx index 33f1fee7754..60167c78989 100644 --- a/content/docs/references/api/batch.mdx +++ b/content/docs/references/api/batch.mdx @@ -1,5 +1,6 @@ --- -title: Batch +title: Batch schema — API Protocol property reference +navTitle: Batch description: "Batch Operations API — Provides efficient bulk data operations with transaction support." --- diff --git a/content/docs/references/api/contract.mdx b/content/docs/references/api/contract.mdx index 3865605e8b8..7c166b8ee97 100644 --- a/content/docs/references/api/contract.mdx +++ b/content/docs/references/api/contract.mdx @@ -1,5 +1,6 @@ --- -title: Contract +title: Contract schema — API Protocol reference +navTitle: Contract description: "Contract schemas of the ObjectStack API Protocol: ApiError, BaseResponse and 14 more — each property with its type, default and a TypeScript example." --- diff --git a/content/docs/references/api/discovery.mdx b/content/docs/references/api/discovery.mdx index d78599e4018..973416597c1 100644 --- a/content/docs/references/api/discovery.mdx +++ b/content/docs/references/api/discovery.mdx @@ -1,5 +1,6 @@ --- -title: Discovery +title: Discovery schema — API Protocol reference +navTitle: Discovery description: "Discovery schemas of the ObjectStack API Protocol: ApiRoutes, CapabilityDescriptor and 9 more — each property with its type, default and a TypeScript example." --- diff --git a/content/docs/references/api/dispatcher.mdx b/content/docs/references/api/dispatcher.mdx index c0b84510b1d..0d4dd2bfed2 100644 --- a/content/docs/references/api/dispatcher.mdx +++ b/content/docs/references/api/dispatcher.mdx @@ -1,5 +1,6 @@ --- -title: Dispatcher +title: Dispatcher schema — API Protocol reference +navTitle: Dispatcher description: "Defines how the ObjectStack HttpDispatcher routes incoming API requests to the correct kernel service based on URL prefix matching." --- diff --git a/content/docs/references/api/documentation.mdx b/content/docs/references/api/documentation.mdx index 82944bd23d8..be6ed8a03e6 100644 --- a/content/docs/references/api/documentation.mdx +++ b/content/docs/references/api/documentation.mdx @@ -1,5 +1,6 @@ --- -title: Documentation +title: Documentation schema — API Protocol reference +navTitle: Documentation description: "Provides schemas for generating interactive API documentation and testing interfaces similar to Swagger UI, Postman, etc." --- diff --git a/content/docs/references/api/endpoint.mdx b/content/docs/references/api/endpoint.mdx index 1cbb5985e5c..8d3998015c0 100644 --- a/content/docs/references/api/endpoint.mdx +++ b/content/docs/references/api/endpoint.mdx @@ -1,5 +1,6 @@ --- -title: Endpoint +title: Endpoint schema — API Protocol reference +navTitle: Endpoint description: "Endpoint schemas of the ObjectStack API Protocol: ApiEndpoint, ApiMapping — each property with its type, default and a TypeScript example." --- diff --git a/content/docs/references/api/error-code-ledger.mdx b/content/docs/references/api/error-code-ledger.mdx index c78e3768026..1593341d531 100644 --- a/content/docs/references/api/error-code-ledger.mdx +++ b/content/docs/references/api/error-code-ledger.mdx @@ -1,5 +1,6 @@ --- -title: Error Code Ledger +title: Error Code Ledger — API Protocol reference +navTitle: Error Code Ledger description: "Error-Code Ledger. Reference for ErrorCode, ProvenanceWaiver, StandardSynonymWaiver: every property with its type and default." --- diff --git a/content/docs/references/api/errors.mdx b/content/docs/references/api/errors.mdx index f62adbe9aa9..120c6a230b3 100644 --- a/content/docs/references/api/errors.mdx +++ b/content/docs/references/api/errors.mdx @@ -1,5 +1,6 @@ --- -title: Errors +title: Errors schema — API Protocol reference +navTitle: Errors description: "Provides consistent, machine-readable error codes across the platform." --- diff --git a/content/docs/references/api/events.mdx b/content/docs/references/api/events.mdx index f207f8c1327..1b8de25194d 100644 --- a/content/docs/references/api/events.mdx +++ b/content/docs/references/api/events.mdx @@ -1,5 +1,6 @@ --- -title: Events +title: Events schema — API Protocol reference +navTitle: Events description: "Events schemas of the ObjectStack API Protocol: BulkDataEvent, BulkDataEventType and 4 more — each property with its type, default and a TypeScript example." --- diff --git a/content/docs/references/api/export.mdx b/content/docs/references/api/export.mdx index d979268dc8d..45cfda13d1a 100644 --- a/content/docs/references/api/export.mdx +++ b/content/docs/references/api/export.mdx @@ -1,5 +1,6 @@ --- -title: Export +title: Export schema — API Protocol reference +navTitle: Export description: "Defines the export file formats, import validation, template-based field mapping, and the asynchronous import-job contracts." --- diff --git a/content/docs/references/api/http-cache.mdx b/content/docs/references/api/http-cache.mdx index ff8c23d5302..a23193b1147 100644 --- a/content/docs/references/api/http-cache.mdx +++ b/content/docs/references/api/http-cache.mdx @@ -1,5 +1,6 @@ --- -title: Http Cache +title: Http Cache schema — API Protocol reference +navTitle: Http Cache description: "HTTP Metadata Cache Protocol — Implements efficient HTTP-level metadata caching with ETag support." --- diff --git a/content/docs/references/api/index.mdx b/content/docs/references/api/index.mdx index 3dc9b8c2dab..c3fb44b2172 100644 --- a/content/docs/references/api/index.mdx +++ b/content/docs/references/api/index.mdx @@ -1,5 +1,6 @@ --- -title: API Protocol +title: API Protocol — complete schema reference +navTitle: API Protocol description: "The ObjectStack API Protocol in 32 reference pages: every schema in @objectstack/spec with its properties, types, defaults and a TypeScript example." --- diff --git a/content/docs/references/api/metadata.mdx b/content/docs/references/api/metadata.mdx index c2f18636d18..b43699d486e 100644 --- a/content/docs/references/api/metadata.mdx +++ b/content/docs/references/api/metadata.mdx @@ -1,5 +1,6 @@ --- -title: Metadata +title: Metadata schema — API Protocol reference +navTitle: Metadata description: "Defines the standard API contracts for the @objectstack/metadata package." --- diff --git a/content/docs/references/api/misc.mdx b/content/docs/references/api/misc.mdx index 8ba46b7349a..b940848feb4 100644 --- a/content/docs/references/api/misc.mdx +++ b/content/docs/references/api/misc.mdx @@ -1,5 +1,6 @@ --- -title: Misc +title: Misc schema — API Protocol property reference +navTitle: Misc description: "Misc schemas of the ObjectStack API Protocol: ResolvedBook, ResolvedEntry, ResolvedGroup — each property with its type, default and a TypeScript example." --- diff --git a/content/docs/references/api/odata.mdx b/content/docs/references/api/odata.mdx index 8d093bcfb62..5851840af64 100644 --- a/content/docs/references/api/odata.mdx +++ b/content/docs/references/api/odata.mdx @@ -1,5 +1,6 @@ --- -title: Odata +title: Odata schema — API Protocol property reference +navTitle: Odata description: "Open Data Protocol (OData) v4 is an industry-standard protocol for building and consuming RESTful APIs." --- diff --git a/content/docs/references/api/package-api-assembled.mdx b/content/docs/references/api/package-api-assembled.mdx index e5e53d6950f..e64a6d72ed2 100644 --- a/content/docs/references/api/package-api-assembled.mdx +++ b/content/docs/references/api/package-api-assembled.mdx @@ -1,5 +1,6 @@ --- -title: Package Api Assembled +title: Package Api Assembled — API Protocol reference +navTitle: Package Api Assembled description: "The Package API declarations that carry the ASSEMBLED package body. Published from @objectstack/spec/api-assembled, never from @objectstack/spec/api." --- diff --git a/content/docs/references/api/package-api.mdx b/content/docs/references/api/package-api.mdx index 9a99b64db09..cad00f891e3 100644 --- a/content/docs/references/api/package-api.mdx +++ b/content/docs/references/api/package-api.mdx @@ -1,5 +1,6 @@ --- -title: Package Api +title: Package Api schema — API Protocol reference +navTitle: Package Api description: "Package API Protocol — REST API endpoint schemas for package lifecycle management." --- diff --git a/content/docs/references/api/package-lifecycle.mdx b/content/docs/references/api/package-lifecycle.mdx index 6ab899ee019..2a1059da128 100644 --- a/content/docs/references/api/package-lifecycle.mdx +++ b/content/docs/references/api/package-lifecycle.mdx @@ -1,5 +1,6 @@ --- -title: Package Lifecycle +title: Package Lifecycle — API Protocol reference +navTitle: Package Lifecycle description: "Response payloads for the dispatcher-served packages.* lifecycle routes — the ADR-0067 commit timeline, the ADR-0033 draft batch doors." --- diff --git a/content/docs/references/api/plugin-rest-api.mdx b/content/docs/references/api/plugin-rest-api.mdx index 31f1d4e0524..24b76d440f9 100644 --- a/content/docs/references/api/plugin-rest-api.mdx +++ b/content/docs/references/api/plugin-rest-api.mdx @@ -1,5 +1,6 @@ --- -title: Plugin Rest Api +title: Plugin Rest Api — API Protocol reference +navTitle: Plugin Rest Api description: "Defines the schema for REST API plugins that register Discovery, Metadata, Data CRUD, Batch, and Permission routes with the HTTP Dispatcher." --- diff --git a/content/docs/references/api/protocol.mdx b/content/docs/references/api/protocol.mdx index 06d5955e633..0dde8d7af02 100644 --- a/content/docs/references/api/protocol.mdx +++ b/content/docs/references/api/protocol.mdx @@ -1,5 +1,6 @@ --- -title: Protocol +title: Protocol schema — API Protocol reference +navTitle: Protocol description: "Protocol schemas of the ObjectStack API Protocol: AiAgentCapabilities and 133 more — each property with its type, default and a TypeScript example." --- diff --git a/content/docs/references/api/query-adapter.mdx b/content/docs/references/api/query-adapter.mdx index fbc9b7a970c..cbe499d7fe2 100644 --- a/content/docs/references/api/query-adapter.mdx +++ b/content/docs/references/api/query-adapter.mdx @@ -1,5 +1,6 @@ --- -title: Query Adapter +title: Query Adapter schema — API Protocol reference +navTitle: Query Adapter description: "Defines mapping rules between the internal unified query DSL (defined in data/query.zod.ts) and external API protocol formats: REST and OData." --- diff --git a/content/docs/references/api/realtime-shared.mdx b/content/docs/references/api/realtime-shared.mdx index 8525a185612..91ef1900909 100644 --- a/content/docs/references/api/realtime-shared.mdx +++ b/content/docs/references/api/realtime-shared.mdx @@ -1,5 +1,6 @@ --- -title: Realtime Shared +title: Realtime Shared — API Protocol reference +navTitle: Realtime Shared description: "Realtime Shared Protocol — Shared schemas and types for real-time communication protocols." --- diff --git a/content/docs/references/api/realtime.mdx b/content/docs/references/api/realtime.mdx index e79243b7977..f97a57ba518 100644 --- a/content/docs/references/api/realtime.mdx +++ b/content/docs/references/api/realtime.mdx @@ -1,5 +1,6 @@ --- -title: Realtime +title: Realtime schema — API Protocol reference +navTitle: Realtime description: "Realtime schemas of the ObjectStack API Protocol: RealtimeConfig, RealtimeEvent and 5 more — each property with its type, default and a TypeScript example." --- diff --git a/content/docs/references/api/rest-server.mdx b/content/docs/references/api/rest-server.mdx index 4d054df308f..faf10ede3a6 100644 --- a/content/docs/references/api/rest-server.mdx +++ b/content/docs/references/api/rest-server.mdx @@ -1,5 +1,6 @@ --- -title: Rest Server +title: Rest Server schema — API Protocol reference +navTitle: Rest Server description: "Defines the REST API server configuration for automatically generating RESTful CRUD endpoints, metadata endpoints, and batch operations." --- diff --git a/content/docs/references/api/router.mdx b/content/docs/references/api/router.mdx index 57c0e049674..5864807f10f 100644 --- a/content/docs/references/api/router.mdx +++ b/content/docs/references/api/router.mdx @@ -1,5 +1,6 @@ --- -title: Router +title: Router schema — API Protocol reference +navTitle: Router description: "Router schemas of the ObjectStack API Protocol: ConflictResolutionStrategy and 4 more — each property with its type, default and a TypeScript example." --- diff --git a/content/docs/references/api/sortability.mdx b/content/docs/references/api/sortability.mdx index 4d656a5c1f7..b805bd800e0 100644 --- a/content/docs/references/api/sortability.mdx +++ b/content/docs/references/api/sortability.mdx @@ -1,5 +1,6 @@ --- -title: Sortability +title: Sortability schema — API Protocol reference +navTitle: Sortability description: "The per-column SORTABILITY projection served with object metadata — the one signal a grid reads to decide whether a column header offers a sort click." --- diff --git a/content/docs/references/api/storage.mdx b/content/docs/references/api/storage.mdx index 62f61b56267..5c75ff1aa28 100644 --- a/content/docs/references/api/storage.mdx +++ b/content/docs/references/api/storage.mdx @@ -1,5 +1,6 @@ --- -title: Storage +title: Storage schema — API Protocol reference +navTitle: Storage description: "Storage Service Protocol — Defines the API contract for client-side file operations." --- diff --git a/content/docs/references/api/versioning.mdx b/content/docs/references/api/versioning.mdx index 0f82637ea89..0840491c239 100644 --- a/content/docs/references/api/versioning.mdx +++ b/content/docs/references/api/versioning.mdx @@ -1,5 +1,6 @@ --- -title: Versioning +title: Versioning schema — API Protocol reference +navTitle: Versioning description: "Defines how API versions are negotiated between client and server. Supports multiple versioning strategies and deprecation lifecycle management." --- diff --git a/content/docs/references/api/websocket.mdx b/content/docs/references/api/websocket.mdx index a7365f49c48..26c9a6cf228 100644 --- a/content/docs/references/api/websocket.mdx +++ b/content/docs/references/api/websocket.mdx @@ -1,5 +1,6 @@ --- -title: Websocket +title: Websocket schema — API Protocol reference +navTitle: Websocket description: "Defines the schema for WebSocket-based real-time communication in ObjectStack." --- diff --git a/content/docs/references/automation/approval.mdx b/content/docs/references/automation/approval.mdx index 493ff01aa27..b5183c1810f 100644 --- a/content/docs/references/automation/approval.mdx +++ b/content/docs/references/automation/approval.mdx @@ -1,5 +1,6 @@ --- -title: Approval +title: Approval — Automation Protocol reference +navTitle: Approval description: "Approval schemas of the ObjectStack Automation Protocol: ApprovalDecision and 5 more — each property with its type, default and a TypeScript example." --- diff --git a/content/docs/references/automation/bpmn-interop.mdx b/content/docs/references/automation/bpmn-interop.mdx index 6bd227ce8e4..45f73c991ea 100644 --- a/content/docs/references/automation/bpmn-interop.mdx +++ b/content/docs/references/automation/bpmn-interop.mdx @@ -1,5 +1,6 @@ --- -title: Bpmn Interop +title: Bpmn Interop — Automation Protocol reference +navTitle: Bpmn Interop description: "Defines the specification for importing and exporting BPMN 2.0 XML process definitions." --- diff --git a/content/docs/references/automation/builtin-node-config.mdx b/content/docs/references/automation/builtin-node-config.mdx index bb0f4ff26e1..705cfd80431 100644 --- a/content/docs/references/automation/builtin-node-config.mdx +++ b/content/docs/references/automation/builtin-node-config.mdx @@ -1,5 +1,6 @@ --- -title: Builtin Node Config +title: Builtin Node Config — Automation Protocol +navTitle: Builtin Node Config description: "Config contracts for the remaining flat builtins — the CRUD quartet (get_record / create_record / update_record / delete_record), screen, map." --- diff --git a/content/docs/references/automation/control-flow.mdx b/content/docs/references/automation/control-flow.mdx index e551d664cf9..c950862bed9 100644 --- a/content/docs/references/automation/control-flow.mdx +++ b/content/docs/references/automation/control-flow.mdx @@ -1,5 +1,6 @@ --- -title: Control Flow +title: Control Flow — Automation Protocol reference +navTitle: Control Flow description: "Structured control-flow constructs — the native + AI-authored flow model: a loop container, a parallel block, and structured try/catch/retry." --- diff --git a/content/docs/references/automation/execution.mdx b/content/docs/references/automation/execution.mdx index 0e00a4199a4..6966ae70a3a 100644 --- a/content/docs/references/automation/execution.mdx +++ b/content/docs/references/automation/execution.mdx @@ -1,5 +1,6 @@ --- -title: Execution +title: Execution — Automation Protocol reference +navTitle: Execution description: "Defines schemas for execution logging, error tracking, checkpointing, concurrency control, and scheduled execution persistence." --- diff --git a/content/docs/references/automation/flow-function.mdx b/content/docs/references/automation/flow-function.mdx index 1fa5a109bf9..3b6a6ea04e6 100644 --- a/content/docs/references/automation/flow-function.mdx +++ b/content/docs/references/automation/flow-function.mdx @@ -1,5 +1,6 @@ --- -title: Flow Function +title: Flow Function — Automation Protocol reference +navTitle: Flow Function description: "The contract for a named handler function a script node invokes — contributed by defineStack({ functions }) and resolved by name at execute time." --- diff --git a/content/docs/references/automation/flow.mdx b/content/docs/references/automation/flow.mdx index 64e71e4eeed..02c7fdb7ce7 100644 --- a/content/docs/references/automation/flow.mdx +++ b/content/docs/references/automation/flow.mdx @@ -1,5 +1,6 @@ --- -title: Flow +title: Flow schema — Automation Protocol reference +navTitle: Flow description: "Flow schemas of the ObjectStack Automation Protocol: Flow, FlowEdge, FlowNode and 3 more — each property with its type, default and a TypeScript example." --- diff --git a/content/docs/references/automation/index.mdx b/content/docs/references/automation/index.mdx index 74343ae441a..e9c873bc3a0 100644 --- a/content/docs/references/automation/index.mdx +++ b/content/docs/references/automation/index.mdx @@ -1,5 +1,6 @@ --- -title: Automation Protocol +title: Automation Protocol — schema reference +navTitle: Automation Protocol description: "The ObjectStack Automation Protocol in 14 reference pages: every schema in @objectstack/spec with its properties, types, defaults and a TypeScript example." --- diff --git a/content/docs/references/automation/io-node-config.mdx b/content/docs/references/automation/io-node-config.mdx index dc7af9ad9b8..8874c3246a5 100644 --- a/content/docs/references/automation/io-node-config.mdx +++ b/content/docs/references/automation/io-node-config.mdx @@ -1,5 +1,6 @@ --- -title: Io Node Config +title: Io Node Config — Automation Protocol reference +navTitle: Io Node Config description: "Config contracts for the flat IO builtins — notify and http. Reference for HttpConfig, NotifyConfig: every property with its type and default." --- diff --git a/content/docs/references/automation/node-executor.mdx b/content/docs/references/automation/node-executor.mdx index 563acd046d0..0d843f47037 100644 --- a/content/docs/references/automation/node-executor.mdx +++ b/content/docs/references/automation/node-executor.mdx @@ -1,5 +1,6 @@ --- -title: Node Executor +title: Node Executor — Automation Protocol reference +navTitle: Node Executor description: "Defines the specification for node executor plugins, with a focus on the wait node executor that supports flow pause and external-event resume." --- diff --git a/content/docs/references/automation/schedule-organization.mdx b/content/docs/references/automation/schedule-organization.mdx index f5abeaae448..214f0ee2db2 100644 --- a/content/docs/references/automation/schedule-organization.mdx +++ b/content/docs/references/automation/schedule-organization.mdx @@ -1,5 +1,6 @@ --- -title: Schedule Organization +title: Schedule Organization — Automation Protocol +navTitle: Schedule Organization description: "The ACTING ORGANIZATION of a time-triggered flow — the one start-node key that says which organization a scheduled run executes as." --- diff --git a/content/docs/references/automation/schemaless-node-config.mdx b/content/docs/references/automation/schemaless-node-config.mdx index debe18cda04..30f4b5c9023 100644 --- a/content/docs/references/automation/schemaless-node-config.mdx +++ b/content/docs/references/automation/schemaless-node-config.mdx @@ -1,5 +1,6 @@ --- -title: Schemaless Node Config +title: Schemaless Node Config — Automation Protocol +navTitle: Schemaless Node Config description: "Config contracts for the descriptor-schemaless builtins whose designer form lives ONLY in objectui's hand-written FLOW_NODE_CONFIG table — script." --- diff --git a/content/docs/references/automation/state-machine.mdx b/content/docs/references/automation/state-machine.mdx index b3d2e833501..f3941e1fb10 100644 --- a/content/docs/references/automation/state-machine.mdx +++ b/content/docs/references/automation/state-machine.mdx @@ -1,5 +1,6 @@ --- -title: State Machine +title: State Machine — Automation Protocol reference +navTitle: State Machine description: "XState-inspired State Machine Protocol — hierarchical states, guarded transitions, entry/exit actions." --- diff --git a/content/docs/references/automation/time-relative-trigger.mdx b/content/docs/references/automation/time-relative-trigger.mdx index e7a62beeb5b..538305cdbf3 100644 --- a/content/docs/references/automation/time-relative-trigger.mdx +++ b/content/docs/references/automation/time-relative-trigger.mdx @@ -1,5 +1,6 @@ --- -title: Time Relative Trigger +title: Time Relative Trigger — Automation Protocol +navTitle: Time Relative Trigger description: "A declarative trigger for time-relative business rules — \"act on records whose date field is coming up (or overdue) relative to today\"." --- diff --git a/content/docs/references/automation/webhook.mdx b/content/docs/references/automation/webhook.mdx index 9c7f6e2e6f4..fc95e269132 100644 --- a/content/docs/references/automation/webhook.mdx +++ b/content/docs/references/automation/webhook.mdx @@ -1,5 +1,6 @@ --- -title: Webhook +title: Webhook schema — Automation Protocol reference +navTitle: Webhook description: "Webhook schemas of the ObjectStack Automation Protocol: Webhook, WebhookTriggerType — each property with its type, default and a TypeScript example." --- diff --git a/content/docs/references/data/analytics.mdx b/content/docs/references/data/analytics.mdx index a63e902cd29..9f55a4c5d3f 100644 --- a/content/docs/references/data/analytics.mdx +++ b/content/docs/references/data/analytics.mdx @@ -1,5 +1,6 @@ --- -title: Analytics +title: Analytics schema — Data Protocol reference +navTitle: Analytics description: "Defines the \"Business Logic\" for data analysis. Inspired by Cube.dev, LookML, and dbt MetricFlow." --- diff --git a/content/docs/references/data/context-tokens.mdx b/content/docs/references/data/context-tokens.mdx index bb7285b66d3..6ab90d4a8df 100644 --- a/content/docs/references/data/context-tokens.mdx +++ b/content/docs/references/data/context-tokens.mdx @@ -1,5 +1,6 @@ --- -title: Context Tokens +title: Context Tokens — Data Protocol reference +navTitle: Context Tokens description: "Context Tokens — the declarative placeholders that resolve against the caller's session (who am I, which org am I in) rather than the clock." --- diff --git a/content/docs/references/data/data-engine.mdx b/content/docs/references/data/data-engine.mdx index ff78ba644f7..24b7f231127 100644 --- a/content/docs/references/data/data-engine.mdx +++ b/content/docs/references/data/data-engine.mdx @@ -1,5 +1,6 @@ --- -title: Data Engine +title: Data Engine schema — Data Protocol reference +navTitle: Data Engine description: "Defines the standard interface for data persistence engines in ObjectStack." --- diff --git a/content/docs/references/data/datasource.mdx b/content/docs/references/data/datasource.mdx index 901673f178e..c1297f9dfde 100644 --- a/content/docs/references/data/datasource.mdx +++ b/content/docs/references/data/datasource.mdx @@ -1,5 +1,6 @@ --- -title: Datasource +title: Datasource schema — Data Protocol reference +navTitle: Datasource description: "Datasource schemas of the ObjectStack Data Protocol: Datasource, DriverDefinition and 3 more — each property with its type, default and a TypeScript example." --- diff --git a/content/docs/references/data/date-macros.mdx b/content/docs/references/data/date-macros.mdx index c3dee7f3d29..f0f0d0a7732 100644 --- a/content/docs/references/data/date-macros.mdx +++ b/content/docs/references/data/date-macros.mdx @@ -1,5 +1,6 @@ --- -title: Date Macros +title: Date Macros schema — Data Protocol reference +navTitle: Date Macros description: "Date Macro Tokens — the declarative placeholders the UI substitutes into filter values before sending a query to the data engine." --- diff --git a/content/docs/references/data/document.mdx b/content/docs/references/data/document.mdx index 452f9a57c08..6f876bf9b26 100644 --- a/content/docs/references/data/document.mdx +++ b/content/docs/references/data/document.mdx @@ -1,5 +1,6 @@ --- -title: Document +title: Document schema — Data Protocol reference +navTitle: Document description: "Document schemas of the ObjectStack Data Protocol: Document, DocumentTemplate and 2 more — each property with its type, default and a TypeScript example." --- diff --git a/content/docs/references/data/driver-common.mdx b/content/docs/references/data/driver-common.mdx index c97884fdcde..3ce3622c32a 100644 --- a/content/docs/references/data/driver-common.mdx +++ b/content/docs/references/data/driver-common.mdx @@ -1,5 +1,6 @@ --- -title: Driver Common +title: Driver Common schema — Data Protocol reference +navTitle: Driver Common description: "Shared building blocks for the per-driver datasource.config shapes. Reference for DriverSslToggle, SqlAutoMigrate: every property with its type and default." --- diff --git a/content/docs/references/data/driver-memory.mdx b/content/docs/references/data/driver-memory.mdx index c07b5654f14..c81cc69d3cb 100644 --- a/content/docs/references/data/driver-memory.mdx +++ b/content/docs/references/data/driver-memory.mdx @@ -1,5 +1,6 @@ --- -title: Driver Memory +title: Driver Memory schema — Data Protocol reference +navTitle: Driver Memory description: "Defines the configuration options for the in-memory driver. Reference: objectql/packages/drivers/memory (Mingo-powered production-ready driver)." --- diff --git a/content/docs/references/data/driver-mongo.mdx b/content/docs/references/data/driver-mongo.mdx index 23393a3bb45..930ad567127 100644 --- a/content/docs/references/data/driver-mongo.mdx +++ b/content/docs/references/data/driver-mongo.mdx @@ -1,5 +1,6 @@ --- -title: Driver Mongo +title: Driver Mongo schema — Data Protocol reference +navTitle: Driver Mongo description: "Describes the MongoDB connection settings and capabilities. ENFORCED as of #4410." --- diff --git a/content/docs/references/data/driver-mysql.mdx b/content/docs/references/data/driver-mysql.mdx index cb77848be11..e05d84058ba 100644 --- a/content/docs/references/data/driver-mysql.mdx +++ b/content/docs/references/data/driver-mysql.mdx @@ -1,5 +1,6 @@ --- -title: Driver Mysql +title: Driver Mysql schema — Data Protocol reference +navTitle: Driver Mysql description: "MySQL / MariaDB driver configuration — the config slot of a datasource whose driver resolves to mysql (mysql2)." --- diff --git a/content/docs/references/data/driver-nosql.mdx b/content/docs/references/data/driver-nosql.mdx index 66fd0bc1cb0..4f7c1b7bc99 100644 --- a/content/docs/references/data/driver-nosql.mdx +++ b/content/docs/references/data/driver-nosql.mdx @@ -1,5 +1,6 @@ --- -title: Driver Nosql +title: Driver Nosql schema — Data Protocol reference +navTitle: Driver Nosql description: "Driver Nosql schemas of the ObjectStack Data Protocol: AggregationPipeline and 13 more — each property with its type, default and a TypeScript example." --- diff --git a/content/docs/references/data/driver-postgres.mdx b/content/docs/references/data/driver-postgres.mdx index 806cc1662e2..d2c7a8bc37b 100644 --- a/content/docs/references/data/driver-postgres.mdx +++ b/content/docs/references/data/driver-postgres.mdx @@ -1,5 +1,6 @@ --- -title: Driver Postgres +title: Driver Postgres — Data Protocol reference +navTitle: Driver Postgres description: "PostgreSQL driver configuration — the config slot of a datasource whose driver resolves to postgres (pg / postgresql)." --- diff --git a/content/docs/references/data/driver-sql.mdx b/content/docs/references/data/driver-sql.mdx index aee15e0fb85..052b725ae2b 100644 --- a/content/docs/references/data/driver-sql.mdx +++ b/content/docs/references/data/driver-sql.mdx @@ -1,5 +1,6 @@ --- -title: Driver Sql +title: Driver Sql schema — Data Protocol reference +navTitle: Driver Sql description: "Driver Sql schemas of the ObjectStack Data Protocol: DataTypeMapping, SQLDialect and 2 more — each property with its type, default and a TypeScript example." --- diff --git a/content/docs/references/data/driver-sqlite.mdx b/content/docs/references/data/driver-sqlite.mdx index 9cfdf2e8b8b..39357e237b8 100644 --- a/content/docs/references/data/driver-sqlite.mdx +++ b/content/docs/references/data/driver-sqlite.mdx @@ -1,5 +1,6 @@ --- -title: Driver Sqlite +title: Driver Sqlite schema — Data Protocol reference +navTitle: Driver Sqlite description: "SQLite driver configuration — the config slot of a datasource whose driver resolves to sqlite or to sqlite-wasm (pure-JS)." --- diff --git a/content/docs/references/data/driver-turso.mdx b/content/docs/references/data/driver-turso.mdx index c52a6fcb5b9..a6a8c86f9a6 100644 --- a/content/docs/references/data/driver-turso.mdx +++ b/content/docs/references/data/driver-turso.mdx @@ -1,5 +1,6 @@ --- -title: Driver Turso +title: Driver Turso schema — Data Protocol reference +navTitle: Driver Turso description: "Turso / libSQL Driver Protocol. Reference for TursoConfig, TursoTransportMode: every property with its type and default." --- diff --git a/content/docs/references/data/driver.mdx b/content/docs/references/data/driver.mdx index 52232ddcfc8..1f1babbd574 100644 --- a/content/docs/references/data/driver.mdx +++ b/content/docs/references/data/driver.mdx @@ -1,5 +1,6 @@ --- -title: Driver +title: Driver schema — Data Protocol reference +navTitle: Driver description: "Driver schemas of the ObjectStack Data Protocol: DriverCapabilities, DriverConfig and 2 more — each property with its type, default and a TypeScript example." --- diff --git a/content/docs/references/data/external-catalog.mdx b/content/docs/references/data/external-catalog.mdx index 97f8bc6f80c..e17233e5bf1 100644 --- a/content/docs/references/data/external-catalog.mdx +++ b/content/docs/references/data/external-catalog.mdx @@ -1,5 +1,6 @@ --- -title: External Catalog +title: External Catalog — Data Protocol reference +navTitle: External Catalog description: "ExternalCatalog — cached remote-schema snapshot for a federated datasource." --- diff --git a/content/docs/references/data/feed.mdx b/content/docs/references/data/feed.mdx index d10a7140885..35cc813ba06 100644 --- a/content/docs/references/data/feed.mdx +++ b/content/docs/references/data/feed.mdx @@ -1,5 +1,6 @@ --- -title: Feed +title: Feed schema — Data Protocol property reference +navTitle: Feed description: "Activity-timeline UI config enums, and the sys_activity.type built-in set." --- diff --git a/content/docs/references/data/field-value.mdx b/content/docs/references/data/field-value.mdx index 7dcd142cd8b..548da8fa359 100644 --- a/content/docs/references/data/field-value.mdx +++ b/content/docs/references/data/field-value.mdx @@ -1,5 +1,6 @@ --- -title: Field Value +title: Field Value schema — Data Protocol reference +navTitle: Field Value description: "Field runtime VALUE-shape contract. Reference for Address, AddressValue, CalendarDateValue, ClockTimeValue and 6 more: every property with its type and default." --- diff --git a/content/docs/references/data/field.mdx b/content/docs/references/data/field.mdx index 51aae976e08..565d840d854 100644 --- a/content/docs/references/data/field.mdx +++ b/content/docs/references/data/field.mdx @@ -1,5 +1,6 @@ --- -title: Field +title: Field schema — Data Protocol reference +navTitle: Field description: "Field schemas of the ObjectStack Data Protocol: CurrencyConfig, CurrencyValue, Field and 7 more — each property with its type, default and a TypeScript example." --- diff --git a/content/docs/references/data/filter.mdx b/content/docs/references/data/filter.mdx index f89c0e83aef..edbb0b79c07 100644 --- a/content/docs/references/data/filter.mdx +++ b/content/docs/references/data/filter.mdx @@ -1,5 +1,6 @@ --- -title: Filter +title: Filter schema — Data Protocol reference +navTitle: Filter description: "Unified Query DSL Specification. Reference for ComparisonOperator, EqualityOperator, FieldOperators and 9 more: every property with its type and default." --- diff --git a/content/docs/references/data/hook-body.mdx b/content/docs/references/data/hook-body.mdx index 7f5a64f7e83..ae570d492d5 100644 --- a/content/docs/references/data/hook-body.mdx +++ b/content/docs/references/data/hook-body.mdx @@ -1,5 +1,6 @@ --- -title: Hook Body +title: Hook Body schema — Data Protocol reference +navTitle: Hook Body description: "Hook Body schemas of the ObjectStack Data Protocol: ExpressionBody, HookBody and 2 more — each property with its type, default and a TypeScript example." --- diff --git a/content/docs/references/data/hook.mdx b/content/docs/references/data/hook.mdx index efac49827bd..f1b32f40c27 100644 --- a/content/docs/references/data/hook.mdx +++ b/content/docs/references/data/hook.mdx @@ -1,5 +1,6 @@ --- -title: Hook +title: Hook schema — Data Protocol property reference +navTitle: Hook description: "Hook schemas of the ObjectStack Data Protocol: Hook, HookContext, HookEvent — each property with its type, default and a TypeScript example." --- diff --git a/content/docs/references/data/index.mdx b/content/docs/references/data/index.mdx index 7cdf0f0fd15..543ec10bbdf 100644 --- a/content/docs/references/data/index.mdx +++ b/content/docs/references/data/index.mdx @@ -1,5 +1,6 @@ --- -title: Data Protocol +title: Data Protocol — complete schema reference +navTitle: Data Protocol description: "The ObjectStack Data Protocol in 29 reference pages: every schema in @objectstack/spec with its properties, types, defaults and a TypeScript example." --- diff --git a/content/docs/references/data/mapping.mdx b/content/docs/references/data/mapping.mdx index d7fd4cccd15..632a481169b 100644 --- a/content/docs/references/data/mapping.mdx +++ b/content/docs/references/data/mapping.mdx @@ -1,5 +1,6 @@ --- -title: Mapping +title: Mapping schema — Data Protocol reference +navTitle: Mapping description: "Mapping schemas of the ObjectStack Data Protocol: ImportFieldMapping, Mapping, TransformType — each property with its type, default and a TypeScript example." --- diff --git a/content/docs/references/data/object.mdx b/content/docs/references/data/object.mdx index 8d68ea931e7..1b1f509a6d1 100644 --- a/content/docs/references/data/object.mdx +++ b/content/docs/references/data/object.mdx @@ -1,5 +1,6 @@ --- -title: Object +title: Object schema — Data Protocol reference +navTitle: Object description: "Object schemas of the ObjectStack Data Protocol: ApiMethod, ApiOperation, Index and 13 more — each property with its type, default and a TypeScript example." --- diff --git a/content/docs/references/data/query.mdx b/content/docs/references/data/query.mdx index e0b3ad9e35b..8a7e4b211f5 100644 --- a/content/docs/references/data/query.mdx +++ b/content/docs/references/data/query.mdx @@ -1,5 +1,6 @@ --- -title: Query +title: Query schema — Data Protocol reference +navTitle: Query description: "QueryAST — Abstract Syntax Tree for data queries. Reference for AggregationFunction, AggregationNode and 6 more: every property with its type and default." --- diff --git a/content/docs/references/data/seed-loader.mdx b/content/docs/references/data/seed-loader.mdx index 83b3ae0efff..175ed6f882a 100644 --- a/content/docs/references/data/seed-loader.mdx +++ b/content/docs/references/data/seed-loader.mdx @@ -1,5 +1,6 @@ --- -title: Seed Loader +title: Seed Loader schema — Data Protocol reference +navTitle: Seed Loader description: "Defines the schemas for metadata-driven seed data loading with automatic relationship resolution, dependency ordering, and multi-pass insertion." --- diff --git a/content/docs/references/data/seed.mdx b/content/docs/references/data/seed.mdx index 6acc3045cb4..9492a46ad3b 100644 --- a/content/docs/references/data/seed.mdx +++ b/content/docs/references/data/seed.mdx @@ -1,5 +1,6 @@ --- -title: Seed +title: Seed schema — Data Protocol property reference +navTitle: Seed description: "Seed schemas of the ObjectStack Data Protocol: Seed, SeedMode — each property with its type, default and a TypeScript example." --- diff --git a/content/docs/references/data/validation.mdx b/content/docs/references/data/validation.mdx index f99714955c6..707da62b410 100644 --- a/content/docs/references/data/validation.mdx +++ b/content/docs/references/data/validation.mdx @@ -1,5 +1,6 @@ --- -title: Validation +title: Validation schema — Data Protocol reference +navTitle: Validation description: "This module defines the validation schema protocol for ObjectStack, providing a comprehensive type-safe validation system similar to Salesforce's validation…" --- diff --git a/content/docs/references/identity/eval-user.mdx b/content/docs/references/identity/eval-user.mdx index 37e43fa6e7b..c33297b06bb 100644 --- a/content/docs/references/identity/eval-user.mdx +++ b/content/docs/references/identity/eval-user.mdx @@ -1,5 +1,6 @@ --- -title: Eval User +title: Eval User schema — Identity Protocol reference +navTitle: Eval User description: "EvalUser — the one user-context contract. Reference for EvalUser: every property with its type and default." --- diff --git a/content/docs/references/identity/identity.mdx b/content/docs/references/identity/identity.mdx index a077d24199b..d0cf6582f15 100644 --- a/content/docs/references/identity/identity.mdx +++ b/content/docs/references/identity/identity.mdx @@ -1,5 +1,6 @@ --- -title: Identity +title: Identity schema — Identity Protocol reference +navTitle: Identity description: "Defines the standard user, account, and session data models for ObjectStack. These schemas represent \"who is logged in\" and their associated data." --- diff --git a/content/docs/references/identity/index.mdx b/content/docs/references/identity/index.mdx index c23515d55fd..d745fb7f3ca 100644 --- a/content/docs/references/identity/index.mdx +++ b/content/docs/references/identity/index.mdx @@ -1,5 +1,6 @@ --- -title: Identity Protocol +title: Identity Protocol — complete schema reference +navTitle: Identity Protocol description: "The ObjectStack Identity Protocol in 5 reference pages: every schema in @objectstack/spec with its properties, types, defaults and a TypeScript example." --- diff --git a/content/docs/references/identity/organization.mdx b/content/docs/references/identity/organization.mdx index 0382457dfe4..88606a23e6c 100644 --- a/content/docs/references/identity/organization.mdx +++ b/content/docs/references/identity/organization.mdx @@ -1,5 +1,6 @@ --- -title: Organization +title: Organization — Identity Protocol reference +navTitle: Organization description: "Defines the standard organization/workspace model for ObjectStack. Supports B2B SaaS scenarios where users belong to multiple teams/workspaces." --- diff --git a/content/docs/references/identity/position.mdx b/content/docs/references/identity/position.mdx index 0b8558a9dd7..0a619287f3e 100644 --- a/content/docs/references/identity/position.mdx +++ b/content/docs/references/identity/position.mdx @@ -1,5 +1,6 @@ --- -title: Position +title: Position schema — Identity Protocol reference +navTitle: Position description: "Position schemas of the ObjectStack Identity Protocol: Position — each property with its type, default and a TypeScript example." --- diff --git a/content/docs/references/identity/scim.mdx b/content/docs/references/identity/scim.mdx index 0ac78da94d6..89c02258d86 100644 --- a/content/docs/references/identity/scim.mdx +++ b/content/docs/references/identity/scim.mdx @@ -1,5 +1,6 @@ --- -title: Scim +title: Scim schema — Identity Protocol reference +navTitle: Scim description: "System for Cross-domain Identity Management (SCIM) 2.0 specification implementation for ObjectStack." --- diff --git a/content/docs/references/index.mdx b/content/docs/references/index.mdx index fbd5465c59f..bcef97b0712 100644 --- a/content/docs/references/index.mdx +++ b/content/docs/references/index.mdx @@ -1,5 +1,6 @@ --- -title: Protocol Reference +title: Protocol reference — every schema by module +navTitle: Protocol Reference description: Every schema published by @objectstack/spec — 1523 schemas across 14 protocol modules --- diff --git a/content/docs/references/integration/connector.mdx b/content/docs/references/integration/connector.mdx index e2b6e8a1c90..a0069c81104 100644 --- a/content/docs/references/integration/connector.mdx +++ b/content/docs/references/integration/connector.mdx @@ -1,5 +1,6 @@ --- -title: Connector +title: Connector — Integration Protocol reference +navTitle: Connector description: "Defines the standard connector specification for external system integration." --- diff --git a/content/docs/references/integration/index.mdx b/content/docs/references/integration/index.mdx index 0e5ff80e345..ae64c832146 100644 --- a/content/docs/references/integration/index.mdx +++ b/content/docs/references/integration/index.mdx @@ -1,5 +1,6 @@ --- -title: Integration Protocol +title: Integration Protocol — schema reference +navTitle: Integration Protocol description: "The ObjectStack Integration Protocol in 1 reference page: every schema in @objectstack/spec with its properties, types, defaults and a TypeScript example." --- diff --git a/content/docs/references/kernel/cli-extension.mdx b/content/docs/references/kernel/cli-extension.mdx index c7671b3e706..172f6ce19e8 100644 --- a/content/docs/references/kernel/cli-extension.mdx +++ b/content/docs/references/kernel/cli-extension.mdx @@ -1,5 +1,6 @@ --- -title: Cli Extension +title: Cli Extension — Kernel Protocol reference +navTitle: Cli Extension description: "Defines the contract for plugins that extend the ObjectStack CLI with custom commands." --- diff --git a/content/docs/references/kernel/cluster.mdx b/content/docs/references/kernel/cluster.mdx index 9aed3b3bb51..127a9752f4f 100644 --- a/content/docs/references/kernel/cluster.mdx +++ b/content/docs/references/kernel/cluster.mdx @@ -1,5 +1,6 @@ --- -title: Cluster +title: Cluster schema — Kernel Protocol reference +navTitle: Cluster description: "Defines the runtime semantics required for ObjectStack to behave correctly when more than one Node.js process is involved." --- diff --git a/content/docs/references/kernel/context.mdx b/content/docs/references/kernel/context.mdx index 0044683301e..483e7e7cd66 100644 --- a/content/docs/references/kernel/context.mdx +++ b/content/docs/references/kernel/context.mdx @@ -1,5 +1,6 @@ --- -title: Context +title: Context schema — Kernel Protocol reference +navTitle: Context description: "Context schemas of the ObjectStack Kernel Protocol: KernelContext, RuntimeMode and 1 more — each property with its type, default and a TypeScript example." --- diff --git a/content/docs/references/kernel/dependency-resolution.mdx b/content/docs/references/kernel/dependency-resolution.mdx index e5f580496bc..7e2187a4244 100644 --- a/content/docs/references/kernel/dependency-resolution.mdx +++ b/content/docs/references/kernel/dependency-resolution.mdx @@ -1,5 +1,6 @@ --- -title: Dependency Resolution +title: Dependency Resolution — Kernel Protocol +navTitle: Dependency Resolution description: "Defines schemas for runtime dependency resolution when installing, upgrading, or managing packages." --- diff --git a/content/docs/references/kernel/events-bus.mdx b/content/docs/references/kernel/events-bus.mdx index 999b991d950..f44dafa6f7d 100644 --- a/content/docs/references/kernel/events-bus.mdx +++ b/content/docs/references/kernel/events-bus.mdx @@ -1,5 +1,6 @@ --- -title: Events Bus +title: Events Bus schema — Kernel Protocol reference +navTitle: Events Bus description: "Events Bus schemas of the ObjectStack Kernel Protocol: EventBusConfig — each property with its type, default and a TypeScript example." --- diff --git a/content/docs/references/kernel/events-core.mdx b/content/docs/references/kernel/events-core.mdx index 7ed291994eb..67e81d3cc28 100644 --- a/content/docs/references/kernel/events-core.mdx +++ b/content/docs/references/kernel/events-core.mdx @@ -1,5 +1,6 @@ --- -title: Events Core +title: Events Core schema — Kernel Protocol reference +navTitle: Events Core description: "Events Core schemas of the ObjectStack Kernel Protocol: Event, EventMetadata and 2 more — each property with its type, default and a TypeScript example." --- diff --git a/content/docs/references/kernel/events-dlq.mdx b/content/docs/references/kernel/events-dlq.mdx index 21969464225..de3674e207e 100644 --- a/content/docs/references/kernel/events-dlq.mdx +++ b/content/docs/references/kernel/events-dlq.mdx @@ -1,5 +1,6 @@ --- -title: Events Dlq +title: Events Dlq schema — Kernel Protocol reference +navTitle: Events Dlq description: "Events Dlq schemas of the ObjectStack Kernel Protocol: DeadLetterQueueEntry, EventLogEntry — each property with its type, default and a TypeScript example." --- diff --git a/content/docs/references/kernel/events-handlers.mdx b/content/docs/references/kernel/events-handlers.mdx index 6a214fa957b..d08764824bd 100644 --- a/content/docs/references/kernel/events-handlers.mdx +++ b/content/docs/references/kernel/events-handlers.mdx @@ -1,5 +1,6 @@ --- -title: Events Handlers +title: Events Handlers — Kernel Protocol reference +navTitle: Events Handlers description: "Events Handlers schemas of the ObjectStack Kernel Protocol: EventHandler and 2 more — each property with its type, default and a TypeScript example." --- diff --git a/content/docs/references/kernel/events-integrations.mdx b/content/docs/references/kernel/events-integrations.mdx index 5e983ba7000..18ced1dcfb8 100644 --- a/content/docs/references/kernel/events-integrations.mdx +++ b/content/docs/references/kernel/events-integrations.mdx @@ -1,5 +1,6 @@ --- -title: Events Integrations +title: Events Integrations — Kernel Protocol +navTitle: Events Integrations description: "Events Integrations schemas of the ObjectStack Kernel Protocol — each property with its type, default and a TypeScript example." --- diff --git a/content/docs/references/kernel/events-queue.mdx b/content/docs/references/kernel/events-queue.mdx index 6c6ade8e2c1..9bd88c4bdc8 100644 --- a/content/docs/references/kernel/events-queue.mdx +++ b/content/docs/references/kernel/events-queue.mdx @@ -1,5 +1,6 @@ --- -title: Events Queue +title: Events Queue — Kernel Protocol reference +navTitle: Events Queue description: "Events Queue schemas of the ObjectStack Kernel Protocol: EventQueueConfig and 2 more — each property with its type, default and a TypeScript example." --- diff --git a/content/docs/references/kernel/execution-context.mdx b/content/docs/references/kernel/execution-context.mdx index 4caf25005fb..898b44e3313 100644 --- a/content/docs/references/kernel/execution-context.mdx +++ b/content/docs/references/kernel/execution-context.mdx @@ -1,5 +1,6 @@ --- -title: Execution Context +title: Execution Context — Kernel Protocol reference +navTitle: Execution Context description: "Execution Context schemas of the ObjectStack Kernel Protocol: ExecutionContext — each property with its type, default and a TypeScript example." --- diff --git a/content/docs/references/kernel/index.mdx b/content/docs/references/kernel/index.mdx index 86f7bdfe4f6..7f8b012e72b 100644 --- a/content/docs/references/kernel/index.mdx +++ b/content/docs/references/kernel/index.mdx @@ -1,5 +1,6 @@ --- -title: Kernel Protocol +title: Kernel Protocol — complete schema reference +navTitle: Kernel Protocol description: "The ObjectStack Kernel Protocol in 30 reference pages: every schema in @objectstack/spec with its properties, types, defaults and a TypeScript example." --- diff --git a/content/docs/references/kernel/manifest.mdx b/content/docs/references/kernel/manifest.mdx index 84da4fb7507..da36f94a415 100644 --- a/content/docs/references/kernel/manifest.mdx +++ b/content/docs/references/kernel/manifest.mdx @@ -1,5 +1,6 @@ --- -title: Manifest +title: Manifest schema — Kernel Protocol reference +navTitle: Manifest description: "Manifest schemas of the ObjectStack Kernel Protocol: Manifest, ManifestPermissions and 5 more — each property with its type, default and a TypeScript example." --- diff --git a/content/docs/references/kernel/metadata-loader.mdx b/content/docs/references/kernel/metadata-loader.mdx index c12d5ab5395..3557d6f1757 100644 --- a/content/docs/references/kernel/metadata-loader.mdx +++ b/content/docs/references/kernel/metadata-loader.mdx @@ -1,5 +1,6 @@ --- -title: Metadata Loader +title: Metadata Loader — Kernel Protocol reference +navTitle: Metadata Loader description: "How the runtime MetadataManager is wired: which datasource backs sys_metadata, what to fall back to when that datasource is unreachable." --- diff --git a/content/docs/references/kernel/metadata-plugin.mdx b/content/docs/references/kernel/metadata-plugin.mdx index ad899131ac2..f7310d3a2be 100644 --- a/content/docs/references/kernel/metadata-plugin.mdx +++ b/content/docs/references/kernel/metadata-plugin.mdx @@ -1,5 +1,6 @@ --- -title: Metadata Plugin +title: Metadata Plugin — Kernel Protocol reference +navTitle: Metadata Plugin description: "Defines the specification for the Metadata Plugin — the central authority responsible for managing ALL metadata across the ObjectStack platform." --- diff --git a/content/docs/references/kernel/metadata-protection.mdx b/content/docs/references/kernel/metadata-protection.mdx index d1798d84893..deed96255eb 100644 --- a/content/docs/references/kernel/metadata-protection.mdx +++ b/content/docs/references/kernel/metadata-protection.mdx @@ -1,5 +1,6 @@ --- -title: Metadata Protection +title: Metadata Protection — Kernel Protocol +navTitle: Metadata Protection description: "Phase 1 introduces the item-level lock (_lock) and the provenance / package tags that drive it." --- diff --git a/content/docs/references/kernel/package-artifact.mdx b/content/docs/references/kernel/package-artifact.mdx index 8d89881d534..035cb848b47 100644 --- a/content/docs/references/kernel/package-artifact.mdx +++ b/content/docs/references/kernel/package-artifact.mdx @@ -1,5 +1,6 @@ --- -title: Package Artifact +title: Package Artifact — Kernel Protocol reference +navTitle: Package Artifact description: "Defines the standard structure of a package artifact (.tgz) produced by the build pipeline." --- diff --git a/content/docs/references/kernel/package-registry.mdx b/content/docs/references/kernel/package-registry.mdx index 036b0c2c616..e68d26166bf 100644 --- a/content/docs/references/kernel/package-registry.mdx +++ b/content/docs/references/kernel/package-registry.mdx @@ -1,5 +1,6 @@ --- -title: Package Registry +title: Package Registry — Kernel Protocol reference +navTitle: Package Registry description: "Defines the runtime state and lifecycle operations for installed packages." --- diff --git a/content/docs/references/kernel/package-upgrade.mdx b/content/docs/references/kernel/package-upgrade.mdx index d024e056860..e9f1f59696b 100644 --- a/content/docs/references/kernel/package-upgrade.mdx +++ b/content/docs/references/kernel/package-upgrade.mdx @@ -1,5 +1,6 @@ --- -title: Package Upgrade +title: Package Upgrade — Kernel Protocol reference +navTitle: Package Upgrade description: "Defines the complete lifecycle for upgrading installed packages, including pre-upgrade analysis, snapshot/backup, execution, validation." --- diff --git a/content/docs/references/kernel/plugin-capability.mdx b/content/docs/references/kernel/plugin-capability.mdx index 21cfd8641b3..7afdef64152 100644 --- a/content/docs/references/kernel/plugin-capability.mdx +++ b/content/docs/references/kernel/plugin-capability.mdx @@ -1,5 +1,6 @@ --- -title: Plugin Capability +title: Plugin Capability — Kernel Protocol reference +navTitle: Plugin Capability description: "Defines the standard way plugins declare their capabilities, implementations, and conformance levels to ensure interoperability across vendors." --- diff --git a/content/docs/references/kernel/plugin-lifecycle-advanced.mdx b/content/docs/references/kernel/plugin-lifecycle-advanced.mdx index 028462ab953..2bc5ca3d130 100644 --- a/content/docs/references/kernel/plugin-lifecycle-advanced.mdx +++ b/content/docs/references/kernel/plugin-lifecycle-advanced.mdx @@ -1,5 +1,6 @@ --- -title: Plugin Lifecycle Advanced +title: Plugin Lifecycle Advanced — Kernel Protocol +navTitle: Plugin Lifecycle Advanced description: "Declares the INPUT contracts of the host-driven lifecycle classes exported by @objectstack/core — PluginHealthMonitor." --- diff --git a/content/docs/references/kernel/plugin-loading.mdx b/content/docs/references/kernel/plugin-loading.mdx index ac2ccd08bf0..9548ad31fb3 100644 --- a/content/docs/references/kernel/plugin-loading.mdx +++ b/content/docs/references/kernel/plugin-loading.mdx @@ -1,5 +1,6 @@ --- -title: Plugin Loading +title: Plugin Loading — Kernel Protocol reference +navTitle: Plugin Loading description: "What remains of this module is the observational half: the lifecycle event a loader would emit." --- diff --git a/content/docs/references/kernel/plugin-registry.mdx b/content/docs/references/kernel/plugin-registry.mdx index 4aae3bdd534..dfbecac3494 100644 --- a/content/docs/references/kernel/plugin-registry.mdx +++ b/content/docs/references/kernel/plugin-registry.mdx @@ -1,5 +1,6 @@ --- -title: Plugin Registry +title: Plugin Registry — Kernel Protocol reference +navTitle: Plugin Registry description: "Plugin Registry Protocol — Defines the schema for the plugin discovery and registry system." --- diff --git a/content/docs/references/kernel/plugin-security-advanced.mdx b/content/docs/references/kernel/plugin-security-advanced.mdx index 0ba0c75994a..559e7726b59 100644 --- a/content/docs/references/kernel/plugin-security-advanced.mdx +++ b/content/docs/references/kernel/plugin-security-advanced.mdx @@ -1,5 +1,6 @@ --- -title: Plugin Security Advanced +title: Plugin Security Advanced — Kernel Protocol +navTitle: Plugin Security Advanced description: "Defines comprehensive security mechanisms for plugin isolation, permission management, and threat protection in the ObjectStack ecosystem." --- diff --git a/content/docs/references/kernel/plugin-security.mdx b/content/docs/references/kernel/plugin-security.mdx index 50305930dd0..dd2c1885a9f 100644 --- a/content/docs/references/kernel/plugin-security.mdx +++ b/content/docs/references/kernel/plugin-security.mdx @@ -1,5 +1,6 @@ --- -title: Plugin Security +title: Plugin Security — Kernel Protocol reference +navTitle: Plugin Security description: "Provides comprehensive security scanning, vulnerability management, and dependency resolution for the ObjectStack plugin ecosystem." --- diff --git a/content/docs/references/kernel/plugin-structure.mdx b/content/docs/references/kernel/plugin-structure.mdx index 2e738e946f9..a1c295993b4 100644 --- a/content/docs/references/kernel/plugin-structure.mdx +++ b/content/docs/references/kernel/plugin-structure.mdx @@ -1,5 +1,6 @@ --- -title: Plugin Structure +title: Plugin Structure — Kernel Protocol reference +navTitle: Plugin Structure description: "Formal Zod definitions for the Plugin Directory Structure and File Naming conventions. This can be used by the CLI or IDE extensions to lint project structure." --- diff --git a/content/docs/references/kernel/plugin-validator.mdx b/content/docs/references/kernel/plugin-validator.mdx index 4c5431e2338..8518daa07f7 100644 --- a/content/docs/references/kernel/plugin-validator.mdx +++ b/content/docs/references/kernel/plugin-validator.mdx @@ -1,5 +1,6 @@ --- -title: Plugin Validator +title: Plugin Validator — Kernel Protocol reference +navTitle: Plugin Validator description: "Zod schemas for plugin validation data structures. These schemas align with the IPluginValidator contract interface." --- diff --git a/content/docs/references/kernel/plugin-versioning.mdx b/content/docs/references/kernel/plugin-versioning.mdx index 871b14fb006..916deb41a5e 100644 --- a/content/docs/references/kernel/plugin-versioning.mdx +++ b/content/docs/references/kernel/plugin-versioning.mdx @@ -1,5 +1,6 @@ --- -title: Plugin Versioning +title: Plugin Versioning — Kernel Protocol reference +navTitle: Plugin Versioning description: "Defines comprehensive versioning, compatibility checking, and dependency resolution mechanisms for the plugin ecosystem." --- diff --git a/content/docs/references/kernel/plugin.mdx b/content/docs/references/kernel/plugin.mdx index ec36298808a..3154d2848c6 100644 --- a/content/docs/references/kernel/plugin.mdx +++ b/content/docs/references/kernel/plugin.mdx @@ -1,5 +1,6 @@ --- -title: Plugin +title: Plugin schema — Kernel Protocol reference +navTitle: Plugin description: "Plugin schemas of the ObjectStack Kernel Protocol: Plugin — each property with its type, default and a TypeScript example." --- diff --git a/content/docs/references/kernel/service-registry.mdx b/content/docs/references/kernel/service-registry.mdx index cb6c5392371..11a9f3e65cb 100644 --- a/content/docs/references/kernel/service-registry.mdx +++ b/content/docs/references/kernel/service-registry.mdx @@ -1,5 +1,6 @@ --- -title: Service Registry +title: Service Registry — Kernel Protocol reference +navTitle: Service Registry description: "Zod schemas for service registry data structures. These schemas align with the IServiceRegistry contract interface." --- diff --git a/content/docs/references/kernel/startup-orchestrator.mdx b/content/docs/references/kernel/startup-orchestrator.mdx index 33bc2067086..a1115238cbe 100644 --- a/content/docs/references/kernel/startup-orchestrator.mdx +++ b/content/docs/references/kernel/startup-orchestrator.mdx @@ -1,5 +1,6 @@ --- -title: Startup Orchestrator +title: Startup Orchestrator — Kernel Protocol +navTitle: Startup Orchestrator description: "One schema, describing the one startup datum the kernel actually produces." --- diff --git a/content/docs/references/marketplace/index.mdx b/content/docs/references/marketplace/index.mdx index eca20dab134..b5ba880b76d 100644 --- a/content/docs/references/marketplace/index.mdx +++ b/content/docs/references/marketplace/index.mdx @@ -1,5 +1,6 @@ --- -title: Marketplace Protocol +title: Marketplace Protocol — schema reference +navTitle: Marketplace Protocol description: "The ObjectStack Marketplace Protocol in 4 reference pages: every schema in @objectstack/spec with its properties, types, defaults and a TypeScript example." --- diff --git a/content/docs/references/marketplace/marketplace.mdx b/content/docs/references/marketplace/marketplace.mdx index 8802e5029be..c758ca8e7ee 100644 --- a/content/docs/references/marketplace/marketplace.mdx +++ b/content/docs/references/marketplace/marketplace.mdx @@ -1,5 +1,6 @@ --- -title: Marketplace +title: Marketplace — Marketplace Protocol reference +navTitle: Marketplace description: "Marketplace Protocol — Defines the core schemas for the plugin marketplace ecosystem." --- diff --git a/content/docs/references/marketplace/package-version.mdx b/content/docs/references/marketplace/package-version.mdx index ec09f3e594e..3d3f4b5d378 100644 --- a/content/docs/references/marketplace/package-version.mdx +++ b/content/docs/references/marketplace/package-version.mdx @@ -1,5 +1,6 @@ --- -title: Package Version +title: Package Version — Marketplace Protocol +navTitle: Package Version description: "Package Version Protocol — A package version is an immutable release snapshot of a package." --- diff --git a/content/docs/references/marketplace/package.mdx b/content/docs/references/marketplace/package.mdx index 5f7d44701dc..2fbc43d4c03 100644 --- a/content/docs/references/marketplace/package.mdx +++ b/content/docs/references/marketplace/package.mdx @@ -1,5 +1,6 @@ --- -title: Package +title: Package — Marketplace Protocol reference +navTitle: Package description: "A package (also called a Solution in Power Platform, an Unlocked Package in Salesforce, or an Application in ServiceNow) is the first-class unit of…" --- diff --git a/content/docs/references/marketplace/template-manifest.mdx b/content/docs/references/marketplace/template-manifest.mdx index e1a164974b5..2281f384c54 100644 --- a/content/docs/references/marketplace/template-manifest.mdx +++ b/content/docs/references/marketplace/template-manifest.mdx @@ -1,5 +1,6 @@ --- -title: Template Manifest +title: Template Manifest — Marketplace Protocol +navTitle: Template Manifest description: "objectstack.manifest.json — on-disk descriptor for a template / package source tree." --- diff --git a/content/docs/references/qa/index.mdx b/content/docs/references/qa/index.mdx index 793a86a3ee3..f2705ba4a6f 100644 --- a/content/docs/references/qa/index.mdx +++ b/content/docs/references/qa/index.mdx @@ -1,5 +1,6 @@ --- -title: QA Protocol +title: QA Protocol — complete schema reference +navTitle: QA Protocol description: "The ObjectStack QA Protocol in 1 reference page: every schema in @objectstack/spec with its properties, types, defaults and a TypeScript example." --- diff --git a/content/docs/references/qa/testing.mdx b/content/docs/references/qa/testing.mdx index 6611fca5f4c..f94eebcb9d2 100644 --- a/content/docs/references/qa/testing.mdx +++ b/content/docs/references/qa/testing.mdx @@ -1,5 +1,6 @@ --- -title: Testing +title: Testing schema — QA Protocol reference +navTitle: Testing description: "Testing schemas of the ObjectStack QA Protocol: TestAction, TestActionType and 6 more — each property with its type, default and a TypeScript example." --- diff --git a/content/docs/references/security/explain.mdx b/content/docs/references/security/explain.mdx index cda660cb7a4..6813a6568da 100644 --- a/content/docs/references/security/explain.mdx +++ b/content/docs/references/security/explain.mdx @@ -1,5 +1,6 @@ --- -title: Explain +title: Explain schema — Security Protocol reference +navTitle: Explain description: "Access-explanation contract — explain(principal, object, operation) as a first-class API." --- diff --git a/content/docs/references/security/index.mdx b/content/docs/references/security/index.mdx index a44978aea1d..bf57ca81b46 100644 --- a/content/docs/references/security/index.mdx +++ b/content/docs/references/security/index.mdx @@ -1,5 +1,6 @@ --- -title: Security Protocol +title: Security Protocol — complete schema reference +navTitle: Security Protocol description: "The ObjectStack Security Protocol in 5 reference pages: every schema in @objectstack/spec with its properties, types, defaults and a TypeScript example." --- diff --git a/content/docs/references/security/misc.mdx b/content/docs/references/security/misc.mdx index 7f41986fc44..dd931eb4f50 100644 --- a/content/docs/references/security/misc.mdx +++ b/content/docs/references/security/misc.mdx @@ -1,5 +1,6 @@ --- -title: Misc +title: Misc schema — Security Protocol reference +navTitle: Misc description: "Misc schemas of the ObjectStack Security Protocol: CapabilityDeclaration and 4 more — each property with its type, default and a TypeScript example." --- diff --git a/content/docs/references/security/permission.mdx b/content/docs/references/security/permission.mdx index 278379bb828..948286594d8 100644 --- a/content/docs/references/security/permission.mdx +++ b/content/docs/references/security/permission.mdx @@ -1,5 +1,6 @@ --- -title: Permission +title: Permission — Security Protocol reference +navTitle: Permission description: "Permission schemas of the ObjectStack Security Protocol: AdminScope and 5 more — each property with its type, default and a TypeScript example." --- diff --git a/content/docs/references/security/rls.mdx b/content/docs/references/security/rls.mdx index 362d1393007..e5c4781335c 100644 --- a/content/docs/references/security/rls.mdx +++ b/content/docs/references/security/rls.mdx @@ -1,5 +1,6 @@ --- -title: Rls +title: Rls schema — Security Protocol reference +navTitle: Rls description: "Implements fine-grained record-level access control inspired by PostgreSQL RLS and Salesforce Criteria-Based Sharing Rules." --- diff --git a/content/docs/references/security/sharing.mdx b/content/docs/references/security/sharing.mdx index 33bedb6c632..53581b611c7 100644 --- a/content/docs/references/security/sharing.mdx +++ b/content/docs/references/security/sharing.mdx @@ -1,5 +1,6 @@ --- -title: Sharing +title: Sharing schema — Security Protocol reference +navTitle: Sharing description: "Sharing schemas of the ObjectStack Security Protocol: CriteriaSharingRule, OWDModel and 4 more — each property with its type, default and a TypeScript example." --- diff --git a/content/docs/references/shared/duration.mdx b/content/docs/references/shared/duration.mdx index 7d9c6739dfd..a082f908385 100644 --- a/content/docs/references/shared/duration.mdx +++ b/content/docs/references/shared/duration.mdx @@ -1,5 +1,6 @@ --- -title: Duration +title: Duration schema — Shared Protocol reference +navTitle: Duration description: "Duration schemas of the ObjectStack Shared Protocol: DurationMs, DurationSeconds — each property with its type, default and a TypeScript example." --- diff --git a/content/docs/references/shared/enums.mdx b/content/docs/references/shared/enums.mdx index 3f9cec7feff..220f173ad47 100644 --- a/content/docs/references/shared/enums.mdx +++ b/content/docs/references/shared/enums.mdx @@ -1,5 +1,6 @@ --- -title: Enums +title: Enums schema — Shared Protocol reference +navTitle: Enums description: "Enums schemas of the ObjectStack Shared Protocol: IsolationLevelEnum and 3 more — each property with its type, default and a TypeScript example." --- diff --git a/content/docs/references/shared/epoch.mdx b/content/docs/references/shared/epoch.mdx index d0c0cfd2b2e..89733063f19 100644 --- a/content/docs/references/shared/epoch.mdx +++ b/content/docs/references/shared/epoch.mdx @@ -1,5 +1,6 @@ --- -title: Epoch +title: Epoch schema — Shared Protocol reference +navTitle: Epoch description: "Epoch schemas of the ObjectStack Shared Protocol: EpochMs — each property with its type, default and a TypeScript example." --- diff --git a/content/docs/references/shared/expression.mdx b/content/docs/references/shared/expression.mdx index 14df836618e..64d93f556bb 100644 --- a/content/docs/references/shared/expression.mdx +++ b/content/docs/references/shared/expression.mdx @@ -1,5 +1,6 @@ --- -title: Expression +title: Expression schema — Shared Protocol reference +navTitle: Expression description: "Canonical wire format for all \"expression\"-shaped metadata across ObjectStack." --- diff --git a/content/docs/references/shared/http.mdx b/content/docs/references/shared/http.mdx index 04d43f16bbc..c31df75baa7 100644 --- a/content/docs/references/shared/http.mdx +++ b/content/docs/references/shared/http.mdx @@ -1,5 +1,6 @@ --- -title: Http +title: Http schema — Shared Protocol reference +navTitle: Http description: "Common HTTP-related schemas used across API and System protocols. These schemas ensure consistency across different parts of the stack." --- diff --git a/content/docs/references/shared/identifiers.mdx b/content/docs/references/shared/identifiers.mdx index a9194c84d3b..369f200ef5c 100644 --- a/content/docs/references/shared/identifiers.mdx +++ b/content/docs/references/shared/identifiers.mdx @@ -1,5 +1,6 @@ --- -title: Identifiers +title: Identifiers schema — Shared Protocol reference +navTitle: Identifiers description: "Identifiers schemas of the ObjectStack Shared Protocol: MetadataItemName and 2 more — each property with its type, default and a TypeScript example." --- diff --git a/content/docs/references/shared/index.mdx b/content/docs/references/shared/index.mdx index afb6384eb8e..d746dfcd632 100644 --- a/content/docs/references/shared/index.mdx +++ b/content/docs/references/shared/index.mdx @@ -1,5 +1,6 @@ --- -title: Shared Protocol +title: Shared Protocol — complete schema reference +navTitle: Shared Protocol description: "The ObjectStack Shared Protocol in 10 reference pages: every schema in @objectstack/spec with its properties, types, defaults and a TypeScript example." --- diff --git a/content/docs/references/shared/mapping.mdx b/content/docs/references/shared/mapping.mdx index 07b62544fba..73f2928447e 100644 --- a/content/docs/references/shared/mapping.mdx +++ b/content/docs/references/shared/mapping.mdx @@ -1,5 +1,6 @@ --- -title: Mapping +title: Mapping schema — Shared Protocol reference +navTitle: Mapping description: "This module provides the canonical field mapping schema used across ObjectStack for data synchronization." --- diff --git a/content/docs/references/shared/metadata-types.mdx b/content/docs/references/shared/metadata-types.mdx index f77374950f6..6f9cd00fb46 100644 --- a/content/docs/references/shared/metadata-types.mdx +++ b/content/docs/references/shared/metadata-types.mdx @@ -1,5 +1,6 @@ --- -title: Metadata Types +title: Metadata Types — Shared Protocol reference +navTitle: Metadata Types description: "Metadata Types schemas of the ObjectStack Shared Protocol: BaseMetadataRecord, MetadataFormat — each property with its type, default and a TypeScript example." --- diff --git a/content/docs/references/shared/protection.mdx b/content/docs/references/shared/protection.mdx index 6a99bf70f14..86d2dbe1d19 100644 --- a/content/docs/references/shared/protection.mdx +++ b/content/docs/references/shared/protection.mdx @@ -1,5 +1,6 @@ --- -title: Protection +title: Protection schema — Shared Protocol reference +navTitle: Protection description: "Public, type-safe author surface for package authors to declare how much of one of their metadata items the runtime." --- diff --git a/content/docs/references/shared/value-domain.mdx b/content/docs/references/shared/value-domain.mdx index 5d7ae56507c..96d55e69380 100644 --- a/content/docs/references/shared/value-domain.mdx +++ b/content/docs/references/shared/value-domain.mdx @@ -1,5 +1,6 @@ --- -title: Value Domain +title: Value Domain — Shared Protocol reference +navTitle: Value Domain description: "Standard value domains: one closed vocabulary and one membership predicate for settings and fields." --- diff --git a/content/docs/references/studio/flow-builder.mdx b/content/docs/references/studio/flow-builder.mdx index 6bcec3db5a8..901a278b188 100644 --- a/content/docs/references/studio/flow-builder.mdx +++ b/content/docs/references/studio/flow-builder.mdx @@ -1,5 +1,6 @@ --- -title: Flow Builder +title: Flow Builder — Studio Protocol reference +navTitle: Flow Builder description: "Studio Flow Builder Protocol. Reference for FlowBuilderConfig, FlowCanvasEdge, FlowCanvasEdgeStyle and 5 more: every property with its type and default." --- diff --git a/content/docs/references/studio/index.mdx b/content/docs/references/studio/index.mdx index 0b74fe5ecbd..1e3dd268991 100644 --- a/content/docs/references/studio/index.mdx +++ b/content/docs/references/studio/index.mdx @@ -1,5 +1,6 @@ --- -title: Studio Protocol +title: Studio Protocol — complete schema reference +navTitle: Studio Protocol description: "The ObjectStack Studio Protocol in 3 reference pages: every schema in @objectstack/spec with its properties, types, defaults and a TypeScript example." --- diff --git a/content/docs/references/studio/object-designer.mdx b/content/docs/references/studio/object-designer.mdx index 9fe34e201ec..53949360d8b 100644 --- a/content/docs/references/studio/object-designer.mdx +++ b/content/docs/references/studio/object-designer.mdx @@ -1,5 +1,6 @@ --- -title: Object Designer +title: Object Designer — Studio Protocol reference +navTitle: Object Designer description: "Defines the specification for the Object Designer experience within ObjectStack Studio." --- diff --git a/content/docs/references/studio/plugin.mdx b/content/docs/references/studio/plugin.mdx index d1b48282401..a6361415bde 100644 --- a/content/docs/references/studio/plugin.mdx +++ b/content/docs/references/studio/plugin.mdx @@ -1,5 +1,6 @@ --- -title: Plugin +title: Plugin schema — Studio Protocol reference +navTitle: Plugin description: "Defines the specification for Studio plugins — a VS Code-like extension model that allows each metadata type to contribute custom viewers, designers." --- diff --git a/content/docs/references/system/app-install.mdx b/content/docs/references/system/app-install.mdx index 3dcd6ed0b9b..aab8111f8d4 100644 --- a/content/docs/references/system/app-install.mdx +++ b/content/docs/references/system/app-install.mdx @@ -1,5 +1,6 @@ --- -title: App Install +title: App Install schema — System Protocol reference +navTitle: App Install description: "Defines the schemas for installing marketplace apps into tenant databases." --- diff --git a/content/docs/references/system/auth-config.mdx b/content/docs/references/system/auth-config.mdx index ccc9251327b..b048cd0af14 100644 --- a/content/docs/references/system/auth-config.mdx +++ b/content/docs/references/system/auth-config.mdx @@ -1,5 +1,6 @@ --- -title: Auth Config +title: Auth Config schema — System Protocol reference +navTitle: Auth Config description: "Auth Config schemas of the ObjectStack System Protocol: AdvancedAuthConfig and 10 more — each property with its type, default and a TypeScript example." --- diff --git a/content/docs/references/system/book.mdx b/content/docs/references/system/book.mdx index 9ba2e16117a..66d4f7065ed 100644 --- a/content/docs/references/system/book.mdx +++ b/content/docs/references/system/book.mdx @@ -1,5 +1,6 @@ --- -title: Book +title: Book schema — System Protocol reference +navTitle: Book description: "Package Documentation Navigation — the book element. A book is the spine of a table of contents: an ordered set of groups (sections) plus identity and access." --- diff --git a/content/docs/references/system/cache.mdx b/content/docs/references/system/cache.mdx index 21198a4bd0e..150a6049cf5 100644 --- a/content/docs/references/system/cache.mdx +++ b/content/docs/references/system/cache.mdx @@ -1,5 +1,6 @@ --- -title: Cache +title: Cache schema — System Protocol reference +navTitle: Cache description: "Multi-tier caching strategy for application data. Supports Memory, Redis, Memcached, and CDN." --- diff --git a/content/docs/references/system/collaboration.mdx b/content/docs/references/system/collaboration.mdx index 2246cda6faf..a5e5e728f33 100644 --- a/content/docs/references/system/collaboration.mdx +++ b/content/docs/references/system/collaboration.mdx @@ -1,5 +1,6 @@ --- -title: Collaboration +title: Collaboration — System Protocol reference +navTitle: Collaboration description: "Real-Time Collaboration Protocol — Defines schemas for real-time collaborative editing in ObjectStack." --- diff --git a/content/docs/references/system/core-services.mdx b/content/docs/references/system/core-services.mdx index 9a381de4779..24c92f6fb6e 100644 --- a/content/docs/references/system/core-services.mdx +++ b/content/docs/references/system/core-services.mdx @@ -1,5 +1,6 @@ --- -title: Core Services +title: Core Services — System Protocol reference +navTitle: Core Services description: "Defines the standard built-in services that constitute the ObjectStack Kernel." --- diff --git a/content/docs/references/system/deploy-bundle.mdx b/content/docs/references/system/deploy-bundle.mdx index b9db04fd0a3..4eac4152a52 100644 --- a/content/docs/references/system/deploy-bundle.mdx +++ b/content/docs/references/system/deploy-bundle.mdx @@ -1,5 +1,6 @@ --- -title: Deploy Bundle +title: Deploy Bundle — System Protocol reference +navTitle: Deploy Bundle description: "Defines the schemas for metadata-driven deployment: Schema Push → Zod Validate → Diff → DDL Sync → Register." --- diff --git a/content/docs/references/system/dev-login.mdx b/content/docs/references/system/dev-login.mdx index da9cf0da79d..56a063419c1 100644 --- a/content/docs/references/system/dev-login.mdx +++ b/content/docs/references/system/dev-login.mdx @@ -1,5 +1,6 @@ --- -title: Dev Login +title: Dev Login schema — System Protocol reference +navTitle: Dev Login description: "Dev Login schemas of the ObjectStack System Protocol: DevLogin — each property with its type, default and a TypeScript example." --- diff --git a/content/docs/references/system/disaster-recovery.mdx b/content/docs/references/system/disaster-recovery.mdx index e3d91fe63ba..d4f88e019d2 100644 --- a/content/docs/references/system/disaster-recovery.mdx +++ b/content/docs/references/system/disaster-recovery.mdx @@ -1,5 +1,6 @@ --- -title: Disaster Recovery +title: Disaster Recovery — System Protocol reference +navTitle: Disaster Recovery description: "Disaster Recovery schemas of the ObjectStack System Protocol: BackupConfig and 7 more — each property with its type, default and a TypeScript example." --- diff --git a/content/docs/references/system/doc.mdx b/content/docs/references/system/doc.mdx index 2ed88455ad1..5410e3ae27d 100644 --- a/content/docs/references/system/doc.mdx +++ b/content/docs/references/system/doc.mdx @@ -1,5 +1,6 @@ --- -title: Doc +title: Doc schema — System Protocol reference +navTitle: Doc description: "One doc item per Markdown file under the package's flat src/docs/ directory (no subdirectories — flatness is the contract that keeps cross-references stable)." --- diff --git a/content/docs/references/system/email-config.mdx b/content/docs/references/system/email-config.mdx index e8a66857b98..35f258f5d2d 100644 --- a/content/docs/references/system/email-config.mdx +++ b/content/docs/references/system/email-config.mdx @@ -1,5 +1,6 @@ --- -title: Email Config +title: Email Config — System Protocol reference +navTitle: Email Config description: "Operator-facing configuration that selects the outbound email transport for the EmailServicePlugin." --- diff --git a/content/docs/references/system/email-template.mdx b/content/docs/references/system/email-template.mdx index 8a47bb72f59..a3a85945af8 100644 --- a/content/docs/references/system/email-template.mdx +++ b/content/docs/references/system/email-template.mdx @@ -1,5 +1,6 @@ --- -title: Email Template +title: Email Template — System Protocol reference +navTitle: Email Template description: "Declarative template definition consumed by IEmailService.sendTemplate() to render outbound mail." --- diff --git a/content/docs/references/system/encryption.mdx b/content/docs/references/system/encryption.mdx index b72055a20b9..21a080ea6b5 100644 --- a/content/docs/references/system/encryption.mdx +++ b/content/docs/references/system/encryption.mdx @@ -1,5 +1,6 @@ --- -title: Encryption +title: Encryption schema — System Protocol reference +navTitle: Encryption description: "Encryption schemas of the ObjectStack System Protocol: EncryptionAlgorithm and 4 more — each property with its type, default and a TypeScript example." --- diff --git a/content/docs/references/system/environment-artifact.mdx b/content/docs/references/system/environment-artifact.mdx index 5288b58110c..6f3c681d191 100644 --- a/content/docs/references/system/environment-artifact.mdx +++ b/content/docs/references/system/environment-artifact.mdx @@ -1,5 +1,6 @@ --- -title: Environment Artifact +title: Environment Artifact — System Protocol +navTitle: Environment Artifact description: "THE single declaration of the environment artifact envelope. @objectstack/spec/system is now its ONLY entry point." --- diff --git a/content/docs/references/system/http-server.mdx b/content/docs/references/system/http-server.mdx index 046d6e886d7..e166b5d9b70 100644 --- a/content/docs/references/system/http-server.mdx +++ b/content/docs/references/system/http-server.mdx @@ -1,5 +1,6 @@ --- -title: Http Server +title: Http Server schema — System Protocol reference +navTitle: Http Server description: "Route-registration metadata, middleware declaration and the server-side lifecycle/status vocabulary for HTTP server implementations." --- diff --git a/content/docs/references/system/index.mdx b/content/docs/references/system/index.mdx index 0bfa0f90fae..5fd4a81fa22 100644 --- a/content/docs/references/system/index.mdx +++ b/content/docs/references/system/index.mdx @@ -1,5 +1,6 @@ --- -title: System Protocol +title: System Protocol — complete schema reference +navTitle: System Protocol description: "The ObjectStack System Protocol in 34 reference pages: every schema in @objectstack/spec with its properties, types, defaults and a TypeScript example." --- diff --git a/content/docs/references/system/job.mdx b/content/docs/references/system/job.mdx index 9877e12211c..dec324a3d7c 100644 --- a/content/docs/references/system/job.mdx +++ b/content/docs/references/system/job.mdx @@ -1,5 +1,6 @@ --- -title: Job +title: Job schema — System Protocol reference +navTitle: Job description: "Job schemas of the ObjectStack System Protocol: CronSchedule, IntervalSchedule, Job and 5 more — each property with its type, default and a TypeScript example." --- diff --git a/content/docs/references/system/license.mdx b/content/docs/references/system/license.mdx index 1cd1aff7318..0d081641ac1 100644 --- a/content/docs/references/system/license.mdx +++ b/content/docs/references/system/license.mdx @@ -1,5 +1,6 @@ --- -title: License +title: License schema — System Protocol reference +navTitle: License description: "License schemas of the ObjectStack System Protocol: Feature, License, LicenseMetricType, Plan — each property with its type, default and a TypeScript example." --- diff --git a/content/docs/references/system/logging.mdx b/content/docs/references/system/logging.mdx index cdf75fa63e8..53dfac65190 100644 --- a/content/docs/references/system/logging.mdx +++ b/content/docs/references/system/logging.mdx @@ -1,5 +1,6 @@ --- -title: Logging +title: Logging schema — System Protocol reference +navTitle: Logging description: "Logging Protocol - Comprehensive Observability Logging. Reference for ConsoleDestinationConfig and 13 more: every property with its type and default." --- diff --git a/content/docs/references/system/metadata-persistence.mdx b/content/docs/references/system/metadata-persistence.mdx index e30d0647f1b..1c33b6e1252 100644 --- a/content/docs/references/system/metadata-persistence.mdx +++ b/content/docs/references/system/metadata-persistence.mdx @@ -1,5 +1,6 @@ --- -title: Metadata Persistence +title: Metadata Persistence — System Protocol +navTitle: Metadata Persistence description: "Metadata Persistence schemas of the ObjectStack System Protocol — each property with its type, default and a TypeScript example." --- diff --git a/content/docs/references/system/metrics.mdx b/content/docs/references/system/metrics.mdx index c2fbe9e9e55..0b4cfb71300 100644 --- a/content/docs/references/system/metrics.mdx +++ b/content/docs/references/system/metrics.mdx @@ -1,5 +1,6 @@ --- -title: Metrics +title: Metrics schema — System Protocol reference +navTitle: Metrics description: "Metrics Protocol - Performance and Operational Metrics. Reference for HistogramBucketConfig and 13 more: every property with its type and default." --- diff --git a/content/docs/references/system/migration.mdx b/content/docs/references/system/migration.mdx index 9047ffb7e48..73221926c10 100644 --- a/content/docs/references/system/migration.mdx +++ b/content/docs/references/system/migration.mdx @@ -1,5 +1,6 @@ --- -title: Migration +title: Migration schema — System Protocol reference +navTitle: Migration description: "Migration protocol — the two kinds of migration, kept apart on purpose." --- diff --git a/content/docs/references/system/notification.mdx b/content/docs/references/system/notification.mdx index 1ed16aa56b5..5592a995d10 100644 --- a/content/docs/references/system/notification.mdx +++ b/content/docs/references/system/notification.mdx @@ -1,5 +1,6 @@ --- -title: Notification +title: Notification — System Protocol reference +navTitle: Notification description: "Notification schemas of the ObjectStack System Protocol: NotificationChannel — each property with its type, default and a TypeScript example." --- diff --git a/content/docs/references/system/object-storage.mdx b/content/docs/references/system/object-storage.mdx index 0da0cf2f21b..fe193352b92 100644 --- a/content/docs/references/system/object-storage.mdx +++ b/content/docs/references/system/object-storage.mdx @@ -1,5 +1,6 @@ --- -title: Object Storage +title: Object Storage — System Protocol reference +navTitle: Object Storage description: "Object Storage Protocol. Reference for AccessControlConfig, BucketConfig, FileMetadata, LifecycleAction and 11 more: every property with its type and default." --- diff --git a/content/docs/references/system/registry-config.mdx b/content/docs/references/system/registry-config.mdx index dee2d2faad7..321eaef9b6a 100644 --- a/content/docs/references/system/registry-config.mdx +++ b/content/docs/references/system/registry-config.mdx @@ -1,5 +1,6 @@ --- -title: Registry Config +title: Registry Config — System Protocol reference +navTitle: Registry Config description: "Defines the configuration for the ObjectStack Registry Service. Includes federation, synchronization, and storage settings." --- diff --git a/content/docs/references/system/search-engine.mdx b/content/docs/references/system/search-engine.mdx index 6bf1cfd89ed..56523c31b7f 100644 --- a/content/docs/references/system/search-engine.mdx +++ b/content/docs/references/system/search-engine.mdx @@ -1,5 +1,6 @@ --- -title: Search Engine +title: Search Engine — System Protocol reference +navTitle: Search Engine description: "Search Engine schemas of the ObjectStack System Protocol: AnalyzerConfig and 4 more — each property with its type, default and a TypeScript example." --- diff --git a/content/docs/references/system/security-context.mdx b/content/docs/references/system/security-context.mdx index 84511202817..3a2e872370c 100644 --- a/content/docs/references/system/security-context.mdx +++ b/content/docs/references/system/security-context.mdx @@ -1,5 +1,6 @@ --- -title: Security Context +title: Security Context — System Protocol reference +navTitle: Security Context description: "Provides a central governance layer that correlates and unifies the four independent security subsystems it was designed against." --- diff --git a/content/docs/references/system/settings-client.mdx b/content/docs/references/system/settings-client.mdx index b029eca43d2..2893ca6258f 100644 --- a/content/docs/references/system/settings-client.mdx +++ b/content/docs/references/system/settings-client.mdx @@ -1,5 +1,6 @@ --- -title: Settings Client +title: Settings Client — System Protocol reference +navTitle: Settings Client description: "SettingsClient — reactive consumer contract for runtime settings. Reference for SettingsChangeEvent: every property with its type and default." --- diff --git a/content/docs/references/system/settings-manifest.mdx b/content/docs/references/system/settings-manifest.mdx index 110e92e6021..d68faa3b98c 100644 --- a/content/docs/references/system/settings-manifest.mdx +++ b/content/docs/references/system/settings-manifest.mdx @@ -1,5 +1,6 @@ --- -title: Settings Manifest +title: Settings Manifest — System Protocol reference +navTitle: Settings Manifest description: "Declarative description of a single namespace of platform settings (e.g. mail, branding, feature_flags)." --- diff --git a/content/docs/references/system/stack-server.mdx b/content/docs/references/system/stack-server.mdx index b9e41c8549e..4f44c4164cf 100644 --- a/content/docs/references/system/stack-server.mdx +++ b/content/docs/references/system/stack-server.mdx @@ -1,5 +1,6 @@ --- -title: Stack Server +title: Stack Server — System Protocol reference +navTitle: Stack Server description: "defineStack({ server }) — the authorable server-facing configuration. Reference for ServerRateLimitConfig and 2 more: every property with its type and default." --- diff --git a/content/docs/references/system/supplier-security.mdx b/content/docs/references/system/supplier-security.mdx index 32f52f22274..3f7959759de 100644 --- a/content/docs/references/system/supplier-security.mdx +++ b/content/docs/references/system/supplier-security.mdx @@ -1,5 +1,6 @@ --- -title: Supplier Security +title: Supplier Security — System Protocol reference +navTitle: Supplier Security description: "Defines schemas for supplier information security management including risk assessment, security requirements, monitoring, and change control." --- diff --git a/content/docs/references/system/tenant.mdx b/content/docs/references/system/tenant.mdx index 00ff5ded788..45a61b0f9c9 100644 --- a/content/docs/references/system/tenant.mdx +++ b/content/docs/references/system/tenant.mdx @@ -1,5 +1,6 @@ --- -title: Tenant +title: Tenant schema — System Protocol reference +navTitle: Tenant description: "Tenant Schema (Multi-Tenant Architecture) — Defines the tenant/tenancy model for ObjectStack SaaS deployments." --- diff --git a/content/docs/references/system/tracing.mdx b/content/docs/references/system/tracing.mdx index d57fc95a859..caf2176a405 100644 --- a/content/docs/references/system/tracing.mdx +++ b/content/docs/references/system/tracing.mdx @@ -1,5 +1,6 @@ --- -title: Tracing +title: Tracing schema — System Protocol reference +navTitle: Tracing description: "Tracing Protocol - Distributed Tracing & Observability. Reference for OpenTelemetryCompatibility and 17 more: every property with its type and default." --- diff --git a/content/docs/references/system/translation.mdx b/content/docs/references/system/translation.mdx index d56e3e81f46..708a0fa54ec 100644 --- a/content/docs/references/system/translation.mdx +++ b/content/docs/references/system/translation.mdx @@ -1,5 +1,6 @@ --- -title: Translation +title: Translation schema — System Protocol reference +navTitle: Translation description: "Translation schemas of the ObjectStack System Protocol — each property with its type, default and a TypeScript example." --- diff --git a/content/docs/references/system/worker.mdx b/content/docs/references/system/worker.mdx index c1d5c1e3ceb..d145d4b6301 100644 --- a/content/docs/references/system/worker.mdx +++ b/content/docs/references/system/worker.mdx @@ -1,5 +1,6 @@ --- -title: Worker +title: Worker schema — System Protocol reference +navTitle: Worker description: "Background task processing system with queues, priorities, and retry logic." --- diff --git a/content/docs/references/ui/action-params.mdx b/content/docs/references/ui/action-params.mdx index 9802fbeb8e6..dfdbf4e8601 100644 --- a/content/docs/references/ui/action-params.mdx +++ b/content/docs/references/ui/action-params.mdx @@ -1,5 +1,6 @@ --- -title: Action Params +title: Action Params schema — UI Protocol reference +navTitle: Action Params description: "The action DISPATCH contract: what the platform validates on the way in, and what it hands the handler on the way out." --- diff --git a/content/docs/references/ui/action.mdx b/content/docs/references/ui/action.mdx index 0006bbc6692..184b89545df 100644 --- a/content/docs/references/ui/action.mdx +++ b/content/docs/references/ui/action.mdx @@ -1,5 +1,6 @@ --- -title: Action +title: Action schema — UI Protocol property reference +navTitle: Action description: "Action schemas of the ObjectStack UI Protocol: Action, ActionAi, ActionLocation and 3 more — each property with its type, default and a TypeScript example." --- diff --git a/content/docs/references/ui/app.mdx b/content/docs/references/ui/app.mdx index 6e029fe11f0..7dfbfe19587 100644 --- a/content/docs/references/ui/app.mdx +++ b/content/docs/references/ui/app.mdx @@ -1,5 +1,6 @@ --- -title: App +title: App schema — UI Protocol property reference +navTitle: App description: "App schemas of the ObjectStack UI Protocol: ActionNavItem, App, AppBranding and 12 more — each property with its type, default and a TypeScript example." --- diff --git a/content/docs/references/ui/bulk-action.mdx b/content/docs/references/ui/bulk-action.mdx index 2f7c8cd5e0b..4e17bbc55d6 100644 --- a/content/docs/references/ui/bulk-action.mdx +++ b/content/docs/references/ui/bulk-action.mdx @@ -1,5 +1,6 @@ --- -title: Bulk Action +title: Bulk Action schema — UI Protocol reference +navTitle: Bulk Action description: "The vocabulary of a list view's bulkActionDefs — one entry per button in the multi-select toolbar." --- diff --git a/content/docs/references/ui/chart.mdx b/content/docs/references/ui/chart.mdx index a6efba2915c..6def1716ac2 100644 --- a/content/docs/references/ui/chart.mdx +++ b/content/docs/references/ui/chart.mdx @@ -1,5 +1,6 @@ --- -title: Chart +title: Chart schema — UI Protocol property reference +navTitle: Chart description: "Shared by Dashboard and Report widgets. Provides a comprehensive set of chart types for data visualization." --- diff --git a/content/docs/references/ui/component.mdx b/content/docs/references/ui/component.mdx index 3a4672382c6..c8d195f8b8f 100644 --- a/content/docs/references/ui/component.mdx +++ b/content/docs/references/ui/component.mdx @@ -1,5 +1,6 @@ --- -title: Component +title: Component schema — UI Protocol reference +navTitle: Component description: "Component schemas of the ObjectStack UI Protocol: AIChatWindowProps and 37 more — each property with its type, default and a TypeScript example." --- diff --git a/content/docs/references/ui/dashboard.mdx b/content/docs/references/ui/dashboard.mdx index 0c314fcd8f5..ab180d49341 100644 --- a/content/docs/references/ui/dashboard.mdx +++ b/content/docs/references/ui/dashboard.mdx @@ -1,5 +1,6 @@ --- -title: Dashboard +title: Dashboard schema — UI Protocol reference +navTitle: Dashboard description: "Dashboard schemas of the ObjectStack UI Protocol: Dashboard, DashboardHeader and 8 more — each property with its type, default and a TypeScript example." --- diff --git a/content/docs/references/ui/dataset.mdx b/content/docs/references/ui/dataset.mdx index c50f57db52b..123cb60758a 100644 --- a/content/docs/references/ui/dataset.mdx +++ b/content/docs/references/ui/dataset.mdx @@ -1,5 +1,6 @@ --- -title: Dataset +title: Dataset schema — UI Protocol reference +navTitle: Dataset description: "Analytics Dataset — the one semantic layer. Reference for Dataset, DatasetDimension, DatasetMeasure, DerivedMeasureOp: every property with its type and default." --- diff --git a/content/docs/references/ui/expression-bindable-text-keys.mdx b/content/docs/references/ui/expression-bindable-text-keys.mdx index 495729d4bcb..03d8c447a36 100644 --- a/content/docs/references/ui/expression-bindable-text-keys.mdx +++ b/content/docs/references/ui/expression-bindable-text-keys.mdx @@ -1,5 +1,6 @@ --- -title: Expression Bindable Text Keys +title: Expression Bindable Text Keys — UI Protocol +navTitle: Expression Bindable Text Keys description: "Expression-bindable text keys — the CLOSED vocabulary of top-level text keys a SchemaRenderer evaluation memo evaluates." --- diff --git a/content/docs/references/ui/i18n.mdx b/content/docs/references/ui/i18n.mdx index bb49fe0bb88..849cf12a48b 100644 --- a/content/docs/references/ui/i18n.mdx +++ b/content/docs/references/ui/i18n.mdx @@ -1,5 +1,6 @@ --- -title: I18n +title: I18n schema — UI Protocol property reference +navTitle: I18n description: "Display-label and ARIA-label primitives shared by every ui/ shape. Reference for AriaProps, I18nLabel and 1 more: every property with its type and default." --- diff --git a/content/docs/references/ui/index.mdx b/content/docs/references/ui/index.mdx index 6b1577f570d..439864ca820 100644 --- a/content/docs/references/ui/index.mdx +++ b/content/docs/references/ui/index.mdx @@ -1,5 +1,6 @@ --- -title: UI Protocol +title: UI Protocol — complete schema reference +navTitle: UI Protocol description: "The ObjectStack UI Protocol in 16 reference pages: every schema in @objectstack/spec with its properties, types, defaults and a TypeScript example." --- diff --git a/content/docs/references/ui/notification.mdx b/content/docs/references/ui/notification.mdx index be04ddf433e..83be49ca064 100644 --- a/content/docs/references/ui/notification.mdx +++ b/content/docs/references/ui/notification.mdx @@ -1,5 +1,6 @@ --- -title: Notification +title: Notification schema — UI Protocol reference +navTitle: Notification description: "Notification schemas of the ObjectStack UI Protocol: NotificationPosition and 2 more — each property with its type, default and a TypeScript example." --- diff --git a/content/docs/references/ui/page.mdx b/content/docs/references/ui/page.mdx index 136a163bef0..c761c535a75 100644 --- a/content/docs/references/ui/page.mdx +++ b/content/docs/references/ui/page.mdx @@ -1,5 +1,6 @@ --- -title: Page +title: Page schema — UI Protocol property reference +navTitle: Page description: "Page schemas of the ObjectStack UI Protocol: ElementDataSource, InterfacePageConfig and 6 more — each property with its type, default and a TypeScript example." --- diff --git a/content/docs/references/ui/report.mdx b/content/docs/references/ui/report.mdx index 2df257fa2f4..7ef75d94fd4 100644 --- a/content/docs/references/ui/report.mdx +++ b/content/docs/references/ui/report.mdx @@ -1,5 +1,6 @@ --- -title: Report +title: Report schema — UI Protocol property reference +navTitle: Report description: "Report schemas of the ObjectStack UI Protocol: JoinedReportBlock, Report and 3 more — each property with its type, default and a TypeScript example." --- diff --git a/content/docs/references/ui/responsive.mdx b/content/docs/references/ui/responsive.mdx index b308c811c46..db834659154 100644 --- a/content/docs/references/ui/responsive.mdx +++ b/content/docs/references/ui/responsive.mdx @@ -1,5 +1,6 @@ --- -title: Responsive +title: Responsive schema — UI Protocol reference +navTitle: Responsive description: "Responsive schemas of the ObjectStack UI Protocol: ResponsiveStyles, StyleMap — each property with its type, default and a TypeScript example." --- diff --git a/content/docs/references/ui/sharing.mdx b/content/docs/references/ui/sharing.mdx index a9bab3944e4..ec15af0c872 100644 --- a/content/docs/references/ui/sharing.mdx +++ b/content/docs/references/ui/sharing.mdx @@ -1,5 +1,6 @@ --- -title: Sharing +title: Sharing schema — UI Protocol reference +navTitle: Sharing description: "Sharing & Embedding Protocol — Public-link sharing of a form view. Reference for SharingConfig: every property with its type and default." --- diff --git a/content/docs/references/ui/view.mdx b/content/docs/references/ui/view.mdx index d22414c5fa3..308f26173d0 100644 --- a/content/docs/references/ui/view.mdx +++ b/content/docs/references/ui/view.mdx @@ -1,5 +1,6 @@ --- -title: View +title: View schema — UI Protocol property reference +navTitle: View description: "View protocol schemas — the view metadata type and its three persisted body spellings." --- From a61335f93f40294f85d645e4efe8255b5ae589b8 Mon Sep 17 00:00:00 2001 From: Claude <noreply@anthropic.com> Date: Mon, 28 Sep 2026 05:53:36 +0000 Subject: [PATCH 3/8] docs(references): regenerate the four pages main changed, on the merged tree The merge of origin/main deferred content/docs/references/{data/field, data/object,shared/value-domain,system/migration}.mdx to regeneration. Regenerated with gen:schema + gen:docs on the merged sources: main's body changes plus this branch's title/navTitle lines. Claude-Session: https://claude.ai/code/session_01ARcDurZ5j34RdqsGgc4jgH Co-authored-by: Claude <noreply@anthropic.com> --- content/docs/references/data/field.mdx | 4 +--- content/docs/references/data/object.mdx | 4 ++-- content/docs/references/shared/value-domain.mdx | 3 +-- content/docs/references/system/migration.mdx | 4 ++-- 4 files changed, 6 insertions(+), 9 deletions(-) diff --git a/content/docs/references/data/field.mdx b/content/docs/references/data/field.mdx index 565d840d854..7abf549506a 100644 --- a/content/docs/references/data/field.mdx +++ b/content/docs/references/data/field.mdx @@ -28,7 +28,6 @@ const result = CurrencyConfigSchema.parse(data); | Property | Type | Required | Description | | :--- | :--- | :--- | :--- | -| **precision** | `integer` | optional (default: `2`) | Decimal precision (default: 2) | | **currencyMode** | `Enum<'dynamic' \| 'fixed'>` | optional (default: `"dynamic"`) | Currency mode. `fixed`: the field has one currency, `defaultCurrency`. `dynamic` (the default): the field has no currency of its own — amounts display in the tenant default currency (the `localization.currency` setting; a plain number when none is set) and `defaultCurrency` is not read. Neither mode is a per-record choice: the value is a bare number either way. | | **defaultCurrency** | `string` | optional (default: `"CNY"`) | The currency code (ISO 4217, e.g. USD, CNY, EUR) of a `fixed`-mode field: its one currency. Not read under `dynamic` (the default), where amounts display in the tenant default currency. | @@ -99,7 +98,7 @@ const result = CurrencyConfigSchema.parse(data); | **summaryOperations** | `{ object: string; field: string; function: Enum<'count' \| 'sum' \| 'min' \| 'max' \| 'avg'>; relationshipField?: string; … }` | optional | Roll-up summary definition. The engine recomputes the value when child records are inserted/updated/deleted. | | **language** | `string` | optional | Programming language for syntax highlighting (e.g., javascript, python, sql) | | **step** | `number` | optional | Step increment for slider (default: 1) | -| **currencyConfig** | `{ precision?: integer; currencyMode?: Enum<'dynamic' \| 'fixed'>; defaultCurrency?: string }` | optional | Configuration for currency field type | +| **currencyConfig** | `{ currencyMode?: Enum<'dynamic' \| 'fixed'>; defaultCurrency?: string }` | optional | Configuration for currency field type | | **dimensions** | `integer` | optional | Vector dimensionality (e.g., 1536 for OpenAI embeddings) | | **trackHistory** | `boolean` | optional | Render this field's value changes as human-readable entries on the record activity timeline (ADR-0052 §5b). Opt-in per field. | | **group** | `string` | optional | Field group name for organizing fields in forms and layouts (e.g., "contact_info", "billing", "system") | @@ -236,7 +235,6 @@ const result = CurrencyConfigSchema.parse(data); | Property | Type | Required | Description | | :--- | :--- | :--- | :--- | -| **precision** | `integer` | optional (default: `2`) | Decimal precision (default: 2) | | **currencyMode** | `Enum<'dynamic' \| 'fixed'>` | optional (default: `"dynamic"`) | Currency mode. `fixed`: the field has one currency, `defaultCurrency`. `dynamic` (the default): the field has no currency of its own — amounts display in the tenant default currency (the `localization.currency` setting; a plain number when none is set) and `defaultCurrency` is not read. Neither mode is a per-record choice: the value is a bare number either way. | | **defaultCurrency** | `string` | optional (default: `"CNY"`) | The currency code (ISO 4217, e.g. USD, CNY, EUR) of a `fixed`-mode field: its one currency. Not read under `dynamic` (the default), where amounts display in the tenant default currency. | diff --git a/content/docs/references/data/object.mdx b/content/docs/references/data/object.mdx index 1b1f509a6d1..3c2703256f7 100644 --- a/content/docs/references/data/object.mdx +++ b/content/docs/references/data/object.mdx @@ -261,7 +261,7 @@ const result = ApiMethod.parse(data); | **summaryOperations** | `{ object: string; field: string; function: Enum<'count' \| 'sum' \| 'min' \| 'max' \| 'avg'>; relationshipField?: string; … }` | optional | Roll-up summary definition. The engine recomputes the value when child records are inserted/updated/deleted. | | **language** | `string` | optional | Programming language for syntax highlighting (e.g., javascript, python, sql) | | **step** | `number` | optional | Step increment for slider (default: 1) | -| **currencyConfig** | `{ precision?: integer; currencyMode?: Enum<'dynamic' \| 'fixed'>; defaultCurrency?: string }` | optional | Configuration for currency field type | +| **currencyConfig** | `{ currencyMode?: Enum<'dynamic' \| 'fixed'>; defaultCurrency?: string }` | optional | Configuration for currency field type | | **dimensions** | `integer` | optional | Vector dimensionality (e.g., 1536 for OpenAI embeddings) | | **trackHistory** | `boolean` | optional | Render this field's value changes as human-readable entries on the record activity timeline (ADR-0052 §5b). Opt-in per field. | | **group** | `string` | optional | Field group name for organizing fields in forms and layouts (e.g., "contact_info", "billing", "system") | @@ -593,7 +593,7 @@ const result = ApiMethod.parse(data); | **summaryOperations** | `{ object: string; field: string; function: Enum<'count' \| 'sum' \| 'min' \| 'max' \| 'avg'>; relationshipField?: string; … }` | optional | Roll-up summary definition. The engine recomputes the value when child records are inserted/updated/deleted. | | **language** | `string` | optional | Programming language for syntax highlighting (e.g., javascript, python, sql) | | **step** | `number` | optional | Step increment for slider (default: 1) | -| **currencyConfig** | `{ precision?: integer; currencyMode?: Enum<'dynamic' \| 'fixed'>; defaultCurrency?: string }` | optional | Configuration for currency field type | +| **currencyConfig** | `{ currencyMode?: Enum<'dynamic' \| 'fixed'>; defaultCurrency?: string }` | optional | Configuration for currency field type | | **dimensions** | `integer` | optional | Vector dimensionality (e.g., 1536 for OpenAI embeddings) | | **trackHistory** | `boolean` | optional | Render this field's value changes as human-readable entries on the record activity timeline (ADR-0052 §5b). Opt-in per field. | | **group** | `string` | optional | Field group name for organizing fields in forms and layouts (e.g., "contact_info", "billing", "system") | diff --git a/content/docs/references/shared/value-domain.mdx b/content/docs/references/shared/value-domain.mdx index 96d55e69380..3c07cdf68ed 100644 --- a/content/docs/references/shared/value-domain.mdx +++ b/content/docs/references/shared/value-domain.mdx @@ -27,8 +27,7 @@ shape — nothing consuming it moved). Prime Directive #2 keeps business logic out of the spec, and the earlier TSDoc of this vocabulary read that as "the list does not live here". The ruling above settles it the other way for this one predicate, on the same -footing as the package's existing shared verdicts: `currencyPrecisionContradiction` -(a checked-in CLDR table and the rule read over it), `filterVerdict`, the +footing as the package's existing shared verdicts: `filterVerdict`, the comparand-shape door. Each is a pure, dependency-free function two or more doors must answer IDENTICALLY — and "the same answer on both doors" is exactly what a shared contract is for. The predicate takes no I/O, holds no diff --git a/content/docs/references/system/migration.mdx b/content/docs/references/system/migration.mdx index 73221926c10..a3fb8a74187 100644 --- a/content/docs/references/system/migration.mdx +++ b/content/docs/references/system/migration.mdx @@ -99,7 +99,7 @@ Add a new field to an existing object | **summaryOperations** | `{ object: string; field: string; function: Enum<'count' \| 'sum' \| 'min' \| 'max' \| 'avg'>; relationshipField?: string; … }` | optional | Roll-up summary definition. The engine recomputes the value when child records are inserted/updated/deleted. | | **language** | `string` | optional | Programming language for syntax highlighting (e.g., javascript, python, sql) | | **step** | `number` | optional | Step increment for slider (default: 1) | -| **currencyConfig** | `{ precision?: integer; currencyMode?: Enum<'dynamic' \| 'fixed'>; defaultCurrency?: string }` | optional | Configuration for currency field type | +| **currencyConfig** | `{ currencyMode?: Enum<'dynamic' \| 'fixed'>; defaultCurrency?: string }` | optional | Configuration for currency field type | | **dimensions** | `integer` | optional | Vector dimensionality (e.g., 1536 for OpenAI embeddings) | | **trackHistory** | `boolean` | optional | Render this field's value changes as human-readable entries on the record activity timeline (ADR-0052 §5b). Opt-in per field. | | **group** | `string` | optional | Field group name for organizing fields in forms and layouts (e.g., "contact_info", "billing", "system") | @@ -519,7 +519,7 @@ Add a new field to an existing object | **summaryOperations** | `{ object: string; field: string; function: Enum<'count' \| 'sum' \| 'min' \| 'max' \| 'avg'>; relationshipField?: string; … }` | optional | Roll-up summary definition. The engine recomputes the value when child records are inserted/updated/deleted. | | **language** | `string` | optional | Programming language for syntax highlighting (e.g., javascript, python, sql) | | **step** | `number` | optional | Step increment for slider (default: 1) | -| **currencyConfig** | `{ precision?: integer; currencyMode?: Enum<'dynamic' \| 'fixed'>; defaultCurrency?: string }` | optional | Configuration for currency field type | +| **currencyConfig** | `{ currencyMode?: Enum<'dynamic' \| 'fixed'>; defaultCurrency?: string }` | optional | Configuration for currency field type | | **dimensions** | `integer` | optional | Vector dimensionality (e.g., 1536 for OpenAI embeddings) | | **trackHistory** | `boolean` | optional | Render this field's value changes as human-readable entries on the record activity timeline (ADR-0052 §5b). Opt-in per field. | | **group** | `string` | optional | Field group name for organizing fields in forms and layouts (e.g., "contact_info", "billing", "system") | From 41b0f68326ec9faeb6542ae72d66b0b36b7deb8c Mon Sep 17 00:00:00 2001 From: Claude <noreply@anthropic.com> Date: Mon, 28 Sep 2026 07:38:15 +0000 Subject: [PATCH 4/8] docs(spec): offer the property-reference title rung only to a page with a Properties table An enum-only module (data/feed) rendered no Properties table yet took the 'property reference' rung. The rung now reads rendersPropertiesTable(), the section renderer's own condition, shared through declaresProperties(); a page without a table starts at the next rung. Pinned in page-title.test.ts, including agreement with renderSchemaSection per schema shape. Claude-Session: https://claude.ai/code/session_01ARcDurZ5j34RdqsGgc4jgH Co-authored-by: Claude <noreply@anthropic.com> --- packages/spec/scripts/build-docs.ts | 13 +- packages/spec/scripts/lib/page-title.ts | 25 +++- packages/spec/scripts/lib/schema-section.ts | 41 +++++- packages/spec/scripts/page-title.test.ts | 144 ++++++++++++++++---- 4 files changed, 183 insertions(+), 40 deletions(-) diff --git a/packages/spec/scripts/build-docs.ts b/packages/spec/scripts/build-docs.ts index 055e0b37432..3152dfab62a 100644 --- a/packages/spec/scripts/build-docs.ts +++ b/packages/spec/scripts/build-docs.ts @@ -61,7 +61,7 @@ import { } from './lib/schema-index'; import { schemaNameFromExportKey } from './lib/schema-name'; import { formatSplitEntryCoverage, splitEntryCoverage } from './lib/split-entries'; -import { renderSchemaSection } from './lib/schema-section'; +import { renderSchemaSection, rendersPropertiesTable } from './lib/schema-section'; import { categoryIndexDescription, modulePageDescription, @@ -517,10 +517,17 @@ function generateZodFileMarkdown(zodFile: string, schemas: Array<{name: string, descriptionSources[description.from]++; // The search-facing title follows the docs title rule; `zodTitle`, the title - // this page carried before it, stays the sidebar label as `navTitle`. + // this page carried before it, stays the sidebar label as `navTitle`. A page + // is called a `property reference` only when one of its sections renders a + // `### Properties` table — the renderer's own condition, asked of the same + // schemas the loop below renders. const titles = pageTitleOrExit(() => modulePageTitle( - { name: zodTitle, categoryTitle: CATEGORIES[category] }, + { + name: zodTitle, + categoryTitle: CATEGORIES[category], + documentsProperties: schemas.some(s => rendersPropertiesTable(s.name, s.content)), + }, path.relative(REPO_ROOT, path.join(DOCS_ROOT, category, `${zodFile}.mdx`)), ), ); diff --git a/packages/spec/scripts/lib/page-title.ts b/packages/spec/scripts/lib/page-title.ts index 3fe85286f82..38277b23f72 100644 --- a/packages/spec/scripts/lib/page-title.ts +++ b/packages/spec/scripts/lib/page-title.ts @@ -35,6 +35,7 @@ * the first candidate inside the band: * * module page `<Name> schema — <Category> property reference` (name + category + 29) + * (offered only when the page renders a `### Properties` table) * `<Name> schema — <Category> reference` (name + category + 20) * `<Name> — <Category> reference` (name + category + 13) * `<Name> — <Category>` (name + category + 3) @@ -49,6 +50,18 @@ * is 25. The category keeps two same-named modules apart (`Plugin` is both a * `kernel` and a `studio` page), so no two generated titles collide. * + * The first module rung is CONDITIONAL. `property reference` is a claim about + * the page, and a page that renders no `### Properties` table — an enum-only + * module such as `data/feed`, whose two schemas render `### Allowed Values` + * only — would be misdescribed by it. So that rung is offered only when at + * least one of the page's schemas renders a property table + * (`rendersPropertiesTable` in `lib/schema-section.ts`, the renderer's own + * condition); otherwise the page starts at the second rung. Without the first + * rung the ladder covers name + category lengths from 16 to 43 rather than 7: + * the shortest property-less pair on the tree is 17 (`Feed` in `Data + * Protocol`), and a shorter one would be refused by name — the remedy is a rung + * here, the same as for any page no rung fits. + * * A page no rung fits is REFUSED, never truncated: a cut title is an invented * one, and a title outside the band is the defect this module exists to end. * The refusal names the page and the candidates, and the remedy is a rung @@ -119,12 +132,18 @@ export interface ModuleTitleInput { name: string; /** The category's declared title — `AI Protocol`. */ categoryTitle: string; + /** + * Whether the page renders at least one `### Properties` table — required, + * never defaulted: the `property reference` rung is a claim about the page, + * and a caller that does not know must not get it by omission. + */ + documentsProperties: boolean; } -/** The module-page ladder, longest first. */ -export function modulePageTitleCandidates({ name, categoryTitle }: ModuleTitleInput): string[] { +/** The module-page ladder, longest first; the first rung only for a page with a property table. */ +export function modulePageTitleCandidates({ name, categoryTitle, documentsProperties }: ModuleTitleInput): string[] { return [ - `${name} schema${TITLE_SEPARATOR}${categoryTitle} property reference`, + ...(documentsProperties ? [`${name} schema${TITLE_SEPARATOR}${categoryTitle} property reference`] : []), `${name} schema${TITLE_SEPARATOR}${categoryTitle} reference`, `${name}${TITLE_SEPARATOR}${categoryTitle} reference`, `${name}${TITLE_SEPARATOR}${categoryTitle}`, diff --git a/packages/spec/scripts/lib/schema-section.ts b/packages/spec/scripts/lib/schema-section.ts index a92ba895b1f..857c11129cf 100644 --- a/packages/spec/scripts/lib/schema-section.ts +++ b/packages/spec/scripts/lib/schema-section.ts @@ -90,6 +90,39 @@ export function selectRootDef(schemaName: string, schema: any): any { return mainDef; } +/** + * Whether a node renders as a `### Properties` table: an object that declares + * its properties. The ONE spelling of that condition — {@link renderSchemaSection} + * branches on it for the schema root and for each union arm, and + * {@link rendersPropertiesTable} asks it for the page title. + */ +export function declaresProperties(node: any): boolean { + return node?.type === 'object' && !!node.properties; +} + +/** + * Whether {@link renderSchemaSection} gives this schema at least one + * `### Properties` table — at its root, or in an arm of its `### Union Options`. + * + * Read by the page title (`lib/page-title.ts`, #15403): a module page is titled + * a `property reference` only when one of its schemas really renders a property + * table. An enum-only module (`data/feed`: two string enums, `### Allowed Values` + * only) documents no property, and a title saying it does misdescribes the page. + * + * Same branch order as the renderer: an object root with properties renders its + * table; a string enum renders `### Allowed Values` and nothing else, even when + * it also carries a union; a union renders a table for each arm that declares + * properties; every other root renders one type line. `page-title.test.ts` holds + * this answer equal to what the renderer emits, shape by shape. + */ +export function rendersPropertiesTable(schemaName: string, schema: any): boolean { + const mainDef = selectRootDef(schemaName, schema); + if (declaresProperties(mainDef)) return true; + if (mainDef.type === 'string' && mainDef.enum) return false; + const variants = mainDef.anyOf || mainDef.oneOf; + return Array.isArray(variants) && variants.some(declaresProperties); +} + /** * Character budget for a default value spelled inside the Required cell. * @@ -555,7 +588,7 @@ export function renderSchemaSection(schemaName: string, schema: any, ctx: Sectio return t; }; - if (mainDef.type === 'object' && mainDef.properties) { + if (declaresProperties(mainDef)) { md += renderProperties(mainDef.properties, new Set(mainDef.required || [])); } else if (mainDef.type === 'string' && mainDef.enum) { @@ -571,9 +604,7 @@ export function renderSchemaSection(schemaName: string, schema: any, ctx: Sectio // branch below calls `renderProperties`, and only `renderProperties` // emits `### Nested Shape:` / `### Allowed Values:` headings. An `enum`, // `$ref` or scalar arm prints one line and can collide with nothing. - const emitsHeadings: boolean[] = variants.map( - (variant: any) => variant?.type === 'object' && !!variant.properties, - ); + const emitsHeadings: boolean[] = variants.map(declaresProperties); const emitters = emitsHeadings.filter(Boolean).length; // Fewer than two and there is nothing to tell apart: a lone object arm's // headings are already unique on the page, so it keeps the exact bytes it @@ -588,7 +619,7 @@ export function renderSchemaSection(schemaName: string, schema: any, ctx: Sectio md += `#### ${variantTitle}\n\n`; if (variant.description) md += `${escapeMdxDescription(variant.description)}\n\n`; - if (variant.type === 'object' && variant.properties) { + if (declaresProperties(variant)) { if (variant.properties.type && variant.properties.type.const) { md += `**Type:** \`${variant.properties.type.const}\`\n\n`; } diff --git a/packages/spec/scripts/page-title.test.ts b/packages/spec/scripts/page-title.test.ts index ecedfc68544..73f853eb66b 100644 --- a/packages/spec/scripts/page-title.test.ts +++ b/packages/spec/scripts/page-title.test.ts @@ -2,7 +2,8 @@ /** * Pin for the frontmatter `title` / `navTitle` of generated reference pages - * (#15403). + * (#15403), and for the one page fact the title reads besides names: whether + * the page renders a `### Properties` table. * * `check:docs` compares the regenerated tree with the committed one, so it * holds the OUTPUT still but says nothing about the rule: a regression that @@ -15,6 +16,7 @@ import { describe, expect, it } from 'vitest'; import { CATEGORY_TITLES } from './lib/category-title'; +import { declaresProperties, renderSchemaSection, rendersPropertiesTable } from './lib/schema-section'; import { RENDERED_TITLE_MAX, ROOT_INDEX_NAV_TITLE, @@ -57,62 +59,89 @@ describe('the band', () => { }); /** - * Real `(module name, category title)` pairs from `content/docs/references/**` - * at `862b6ce8`, the name being the page's title before this rule — two per - * rung of the module ladder, including the tree's shortest name (`Mcp`, 3) and - * its two longest pairs (`Expression Bindable Text Keys` in UI, name 29; - * `Schemaless Node Config` in Automation, name + category 41). + * Real `(module name, category title, renders a Properties table)` triples from + * `content/docs/references/**`, the name being the page's title before this + * rule — two per rung of the module ladder, including the tree's shortest name + * (`Mcp`, 3), its two longest pairs (`Expression Bindable Text Keys` in UI, name + * 29; `Schemaless Node Config` in Automation, name + category 41), and + * `data/feed`, the one page the first rung reached without a property table. */ -const MODULE_PAGES: Array<[name: string, categoryTitle: string, title: string]> = [ - ['Mcp', 'AI Protocol', 'Mcp schema — AI Protocol property reference'], - ['Agent', 'AI Protocol', 'Agent schema — AI Protocol property reference'], - ['Object', 'Data Protocol', 'Object schema — Data Protocol reference'], - ['Flow', 'Automation Protocol', 'Flow schema — Automation Protocol reference'], - ['Plugin Registry', 'Kernel Protocol', 'Plugin Registry — Kernel Protocol reference'], - ['Package Api Assembled', 'API Protocol', 'Package Api Assembled — API Protocol reference'], - ['Metadata Protection', 'Kernel Protocol', 'Metadata Protection — Kernel Protocol'], - ['Expression Bindable Text Keys', 'UI Protocol', 'Expression Bindable Text Keys — UI Protocol'], - ['Schemaless Node Config', 'Automation Protocol', 'Schemaless Node Config — Automation Protocol'], +const MODULE_PAGES: Array<[name: string, categoryTitle: string, documentsProperties: boolean, title: string]> = [ + ['Mcp', 'AI Protocol', true, 'Mcp schema — AI Protocol property reference'], + ['Agent', 'AI Protocol', true, 'Agent schema — AI Protocol property reference'], + ['Feed', 'Data Protocol', false, 'Feed schema — Data Protocol reference'], + ['Object', 'Data Protocol', true, 'Object schema — Data Protocol reference'], + ['Flow', 'Automation Protocol', true, 'Flow schema — Automation Protocol reference'], + ['Plugin Registry', 'Kernel Protocol', true, 'Plugin Registry — Kernel Protocol reference'], + ['Package Api Assembled', 'API Protocol', true, 'Package Api Assembled — API Protocol reference'], + ['Metadata Protection', 'Kernel Protocol', false, 'Metadata Protection — Kernel Protocol'], + ['Expression Bindable Text Keys', 'UI Protocol', false, 'Expression Bindable Text Keys — UI Protocol'], + ['Schemaless Node Config', 'Automation Protocol', true, 'Schemaless Node Config — Automation Protocol'], ]; describe('modulePageTitle', () => { - it.each(MODULE_PAGES)('%s (%s) → %s', (name, categoryTitle, title) => { - const out = modulePageTitle({ name, categoryTitle }, `references/x/${name}.mdx`); + it.each(MODULE_PAGES)('%s (%s, properties: %s) → %s', (name, categoryTitle, documentsProperties, title) => { + const out = modulePageTitle({ name, categoryTitle, documentsProperties }, `references/x/${name}.mdx`); expect(out).toEqual({ title, navTitle: name }); expectRuleShaped(out.title); }); it('takes the LONGEST rung inside the band', () => { // `Agent` fits the first rung (45) and the second (36): the first wins. - const candidates = modulePageTitleCandidates({ name: 'Agent', categoryTitle: 'AI Protocol' }); + const agent = { name: 'Agent', categoryTitle: 'AI Protocol', documentsProperties: true }; + const candidates = modulePageTitleCandidates(agent); expect(candidates.filter(titleInBand)).toHaveLength(2); - expect(modulePageTitle({ name: 'Agent', categoryTitle: 'AI Protocol' }, 'p').title).toBe(candidates[0]); + expect(modulePageTitle(agent, 'p').title).toBe(candidates[0]); + }); + + it('offers `property reference` only to a page that renders a Properties table', () => { + // The same name and category, the one fact flipped: `data/feed` renders two + // enums (`### Allowed Values`) and no property, so it starts at the second rung. + const feed = { name: 'Feed', categoryTitle: 'Data Protocol' }; + const withTable = modulePageTitleCandidates({ ...feed, documentsProperties: true }); + const withoutTable = modulePageTitleCandidates({ ...feed, documentsProperties: false }); + expect(withTable[0]).toBe('Feed schema — Data Protocol property reference'); + expect(withoutTable.some(c => c.includes('property'))).toBe(false); + expect(withoutTable).toEqual(withTable.slice(1)); + expect(modulePageTitle({ ...feed, documentsProperties: false }, 'p').title).toBe('Feed schema — Data Protocol reference'); }); it('keeps the rungs longest first, so the first fit is the longest fit', () => { - const lengths = modulePageTitleCandidates({ name: 'N', categoryTitle: 'C' }).map(c => c.length); - expect([...lengths].sort((a, b) => b - a)).toEqual(lengths); + for (const documentsProperties of [true, false]) { + const lengths = modulePageTitleCandidates({ name: 'N', categoryTitle: 'C', documentsProperties }).map(c => c.length); + expect([...lengths].sort((a, b) => b - a)).toEqual(lengths); + } }); it('is total for every declared category and every name that can fit beside it', () => { - // The ladder's rungs overlap end to end: every name + category length from - // 7 to 43 lands in the band. Swept over the real category titles, with - // every name length up to the limit that category leaves. + // With a Properties table the rungs overlap end to end from name + category + // 7 to 43; without one, from 16 to 43. Swept over the real category titles, + // with every name length up to the limit that category leaves. for (const categoryTitle of Object.values(CATEGORY_TITLES)) { for (let n = 1; categoryTitle.length + n <= 43; n++) { - expectRuleShaped(modulePageTitle({ name: 'N'.repeat(n), categoryTitle }, 'p').title); + expectRuleShaped(modulePageTitle({ name: 'N'.repeat(n), categoryTitle, documentsProperties: true }, 'p').title); + if (categoryTitle.length + n >= 16) { + expectRuleShaped(modulePageTitle({ name: 'N'.repeat(n), categoryTitle, documentsProperties: false }, 'p').title); + } } } }); + it('refuses a property-less page too short for the second rung, naming it', () => { + // name + category 15: the second rung is 35, one under the band. + expect(() => + modulePageTitle({ name: 'Abcd', categoryTitle: 'AI Protocol', documentsProperties: false }, 'content/docs/references/ai/abcd.mdx'), + ).toThrow(/content\/docs\/references\/ai\/abcd\.mdx/); + }); + it('keeps two same-named modules in different categories apart', () => { - const kernel = modulePageTitle({ name: 'Plugin', categoryTitle: 'Kernel Protocol' }, 'p').title; - const studio = modulePageTitle({ name: 'Plugin', categoryTitle: 'Studio Protocol' }, 'p').title; + const kernel = modulePageTitle({ name: 'Plugin', categoryTitle: 'Kernel Protocol', documentsProperties: true }, 'p').title; + const studio = modulePageTitle({ name: 'Plugin', categoryTitle: 'Studio Protocol', documentsProperties: true }, 'p').title; expect(kernel).not.toBe(studio); }); it('refuses, naming the page, when no rung fits — never a truncated title', () => { - const tooLong = { name: 'An Exceedingly Long Module Display Name', categoryTitle: 'Integration Protocol' }; + const tooLong = { name: 'An Exceedingly Long Module Display Name', categoryTitle: 'Integration Protocol', documentsProperties: true }; expect(modulePageTitleCandidates(tooLong).some(titleInBand)).toBe(false); expect(() => modulePageTitle(tooLong, 'content/docs/references/integration/long.mdx')).toThrow( /content\/docs\/references\/integration\/long\.mdx/, @@ -120,6 +149,63 @@ describe('modulePageTitle', () => { }); }); +/** + * The fact the first module rung reads — whether a schema renders a + * `### Properties` table — held equal to what the renderer really emits, one + * JSON Schema shape per branch of `renderSchemaSection`. If a branch changes + * what it renders and the predicate does not follow, this goes red instead of + * a title quietly claiming a table its page lacks. + */ +const SECTION_SHAPES: Array<[shape: string, name: string, schema: any, rendersTable: boolean]> = [ + ['object root with properties', 'Agent', { type: 'object', properties: { name: { type: 'string' } }, required: ['name'] }, true], + ['string enum (data/feed FeedFilterMode)', 'FeedFilterMode', { type: 'string', enum: ['all', 'comments_only', 'changes_only', 'tasks_only'] }, false], + ['string enum (data/feed FeedItemType)', 'FeedItemType', { type: 'string', enum: ['comment', 'field_change', 'task'] }, false], + [ + 'union with an object arm', + 'Trigger', + { anyOf: [{ type: 'object', properties: { type: { type: 'string', const: 'cron' }, expr: { type: 'string' } } }, { type: 'string' }] }, + true, + ], + ['oneOf with an object arm', 'Source', { oneOf: [{ type: 'object', properties: { url: { type: 'string' } } }, { type: 'number' }] }, true], + ['union of an enum and a scalar', 'Mode', { anyOf: [{ type: 'string', enum: ['a', 'b'] }, { type: 'number' }] }, false], + [ + 'string enum that also carries a union (the enum branch wins)', + 'Kind', + { type: 'string', enum: ['a'], anyOf: [{ type: 'object', properties: { x: { type: 'string' } } }] }, + false, + ], + ['bare scalar', 'ObjectName', { type: 'string', description: 'Machine name' }, false], + ['record map (additionalProperties, no properties)', 'Labels', { type: 'object', additionalProperties: { type: 'string' } }, false], + ['array of objects', 'Rows', { type: 'array', items: { type: 'object', properties: { id: { type: 'string' } } } }, false], + [ + 'definitions entry under its own name', + 'Wrapped', + { $ref: '#/definitions/Wrapped', definitions: { Wrapped: { type: 'object', properties: { a: { type: 'number' } } } } }, + true, + ], +]; + +describe('rendersPropertiesTable', () => { + it.each(SECTION_SHAPES)('%s → %s', (_shape, name, schema, rendersTable) => { + expect(rendersPropertiesTable(name, schema)).toBe(rendersTable); + // The renderer's own output agrees, whatever the expectation above says. + expect(/^### Properties$/m.test(renderSchemaSection(name, schema))).toBe(rendersTable); + }); + + it('answers the data/feed page as having no property table', () => { + const feed = SECTION_SHAPES.filter(([shape]) => shape.includes('data/feed')); + expect(feed).toHaveLength(2); + expect(feed.some(([, name, schema]) => rendersPropertiesTable(name, schema))).toBe(false); + }); + + it('declaresProperties is the object-with-properties test and nothing wider', () => { + expect(declaresProperties({ type: 'object', properties: { a: { type: 'string' } } })).toBe(true); + expect(declaresProperties({ type: 'object' })).toBe(false); + expect(declaresProperties({ properties: { a: {} } })).toBe(false); + expect(declaresProperties(undefined)).toBe(false); + }); +}); + describe('categoryIndexTitle', () => { it.each([ ['AI Protocol', 'AI Protocol — complete schema reference'], From 0ea42f4543ef6e22978779fa386cbd95ebcce421 Mon Sep 17 00:00:00 2001 From: Claude <noreply@anthropic.com> Date: Mon, 28 Sep 2026 07:43:58 +0000 Subject: [PATCH 5/8] docs(references): regenerate data/feed with the conditional property-reference rung gen:docs output only: data/feed renders two enums and no Properties table, so its title drops to the next rung. No other page moves. Claude-Session: https://claude.ai/code/session_01ARcDurZ5j34RdqsGgc4jgH Co-authored-by: Claude <noreply@anthropic.com> --- content/docs/references/data/feed.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/docs/references/data/feed.mdx b/content/docs/references/data/feed.mdx index 35cc813ba06..6f7ea641cad 100644 --- a/content/docs/references/data/feed.mdx +++ b/content/docs/references/data/feed.mdx @@ -1,5 +1,5 @@ --- -title: Feed schema — Data Protocol property reference +title: Feed schema — Data Protocol reference navTitle: Feed description: "Activity-timeline UI config enums, and the sys_activity.type built-in set." --- From 1ba9d84cead7a7158e655d6abcc715f49b1042c0 Mon Sep 17 00:00:00 2001 From: Claude <noreply@anthropic.com> Date: Mon, 28 Sep 2026 07:47:41 +0000 Subject: [PATCH 6/8] docs(references): regenerate security/{permission,rls} on the merged tree The merge of origin/main deferred these two generated pages. Regenerated with gen:schema + gen:docs on the merged sources: main's retired-key rows plus this branch's title/navTitle lines. Claude-Session: https://claude.ai/code/session_01ARcDurZ5j34RdqsGgc4jgH Co-authored-by: Claude <noreply@anthropic.com> --- content/docs/references/security/permission.mdx | 2 +- content/docs/references/security/rls.mdx | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/content/docs/references/security/permission.mdx b/content/docs/references/security/permission.mdx index 948286594d8..344f23c30d7 100644 --- a/content/docs/references/security/permission.mdx +++ b/content/docs/references/security/permission.mdx @@ -173,7 +173,7 @@ const result = AdminScopeSchema.parse(data); | **positions** | `string[]` | optional | Positions this policy applies to (omit for all) | | **enabled** | `boolean` | optional (default: `true`) | Whether this policy is active | | **priority** | `never` | optional | [REMOVED] `rowLevelSecurity[].priority` was removed in @objectstack/spec 17.0.0. It never had an effect. Delete the key — policy outcomes are unchanged. Run `os migrate meta --from 16` to list the mechanical edits for existing sources; apply them by hand. | -| **tags** | `string[]` | optional | Policy categorization tags | +| **tags** | `never` | optional | [REMOVED] `rowLevelSecurity[].tags` was removed in @objectstack/spec 17.5.0 (ADR-0049 enforce-or-remove) — nothing ever read it: the RLS compiler never consulted a policy's tags and nothing else acted on them, so a tag scoped, restricted and reported nothing. Delete the key. A tag never limited whom a policy applies to; to do that, list the positions in `positions`. A policy is identified by its `name` and its `object`; say why it exists in `description`. Run `os migrate meta --from 17` to list the mechanical edits for existing sources; apply them by hand. | ### Nested Shape: `PermissionSet.adminScope` diff --git a/content/docs/references/security/rls.mdx b/content/docs/references/security/rls.mdx index e5c4781335c..411389d91d1 100644 --- a/content/docs/references/security/rls.mdx +++ b/content/docs/references/security/rls.mdx @@ -181,7 +181,7 @@ const result = RLSEvaluationResultSchema.parse(data); | **positions** | `string[]` | optional | Positions this policy applies to (omit for all) | | **enabled** | `boolean` | optional (default: `true`) | Whether this policy is active | | **priority** | `never` | optional | [REMOVED] `rowLevelSecurity[].priority` was removed in @objectstack/spec 17.0.0. It never had an effect. Delete the key — policy outcomes are unchanged. Run `os migrate meta --from 16` to list the mechanical edits for existing sources; apply them by hand. | -| **tags** | `string[]` | optional | Policy categorization tags | +| **tags** | `never` | optional | [REMOVED] `rowLevelSecurity[].tags` was removed in @objectstack/spec 17.5.0 (ADR-0049 enforce-or-remove) — nothing ever read it: the RLS compiler never consulted a policy's tags and nothing else acted on them, so a tag scoped, restricted and reported nothing. Delete the key. A tag never limited whom a policy applies to; to do that, list the positions in `positions`. A policy is identified by its `name` and its `object`; say why it exists in `description`. Run `os migrate meta --from 17` to list the mechanical edits for existing sources; apply them by hand. | --- From 2da3e2394d3c0f5604c000a891d8b9665313fb72 Mon Sep 17 00:00:00 2001 From: Claude <noreply@anthropic.com> Date: Mon, 28 Sep 2026 08:45:16 +0000 Subject: [PATCH 7/8] docs(references): regenerate data/object, kernel/metadata-plugin, ui/action on the merged tree The merge of origin/main deferred these three generated pages. Regenerated with gen:schema + gen:docs on the merged sources: main's body changes plus this branch's unchanged title/navTitle lines. Claude-Session: https://claude.ai/code/session_01ARcDurZ5j34RdqsGgc4jgH Co-authored-by: Claude <noreply@anthropic.com> --- content/docs/references/data/object.mdx | 2 +- content/docs/references/kernel/metadata-plugin.mdx | 2 +- content/docs/references/ui/action.mdx | 10 +--------- 3 files changed, 3 insertions(+), 11 deletions(-) diff --git a/content/docs/references/data/object.mdx b/content/docs/references/data/object.mdx index 3c2703256f7..ae640847fcf 100644 --- a/content/docs/references/data/object.mdx +++ b/content/docs/references/data/object.mdx @@ -479,7 +479,7 @@ const result = ApiMethod.parse(data); | **opensInNewTab** | `boolean` | optional | Open the action result in a new tab. The renderer pre-opens the tab synchronously on click (popup-blocker-safe) and navigates it to the handler's redirectUrl. | | **newTabUrl** | `string` | optional | Direct new-tab URL template (`{recordId}` placeholder). When set with opensInNewTab, the renderer navigates the pre-opened tab here immediately — no action POST. The endpoint must enforce auth itself. | | **onSuccess** | `{ navigate: string; openIn?: Enum<'self' \| 'newTab'> }` | optional | Post-success navigation for type:'api' and type:'script' actions. `navigate` is a route/URL template interpolating $`{param.*}`, $`{ctx.*}` and $`{result.*}` (the server response); `openIn` defaults 'self'. The handler-return convention (`{ redirectUrl }` without openIn) keeps its 17.0.0 new-tab behavior. | -| **aria** | `{ ariaLabel?: string \| Record<string, string>; ariaDescribedBy?: string; role?: string }` | optional | ARIA accessibility attributes | +| **aria** | `never` | optional | [REMOVED] `action.aria` was removed in @objectstack/spec 17.5.0 (ADR-0049 enforce-or-remove) — no action surface ever applied it: the button, icon, menu, group and bar renderers, the row and bulk action menus and the record quick-actions toolbar all take the accessible name from the action's `label` and never read this block, so ARIA attributes declared here parsed and then silently did not reach the DOM. Delete the key. The accessible name that IS applied is the action's required `label` — the visible button or menu-item text, and the `aria-label` of an icon-only action — so write the name you meant there. To name the region that PLACES the actions, author `ariaLabel` / `ariaDescribedBy` / `role` in the `aria` block of the placing node: `page.components[].aria` (the component that renders the actions) or the list view `aria`. Run `os migrate meta --from 17` to list the mechanical edits for existing sources; apply them by hand. | | **_lock** | `Enum<'none' \| 'no-overlay' \| 'no-delete' \| 'full'>` | optional | Item-level lock — controls overlay & delete (ADR-0010). | | **_lockReason** | `string` | optional | Human-readable reason shown when a write is refused by _lock. | | **_lockSource** | `Enum<'artifact' \| 'package' \| 'env-forced'>` | optional | Layer that set _lock (artifact \| package \| env-forced). | diff --git a/content/docs/references/kernel/metadata-plugin.mdx b/content/docs/references/kernel/metadata-plugin.mdx index f7310d3a2be..6167587d71a 100644 --- a/content/docs/references/kernel/metadata-plugin.mdx +++ b/content/docs/references/kernel/metadata-plugin.mdx @@ -349,7 +349,7 @@ const result = MetadataBulkResultSchema.parse(data); | **opensInNewTab** | `boolean` | optional | Open the action result in a new tab. The renderer pre-opens the tab synchronously on click (popup-blocker-safe) and navigates it to the handler's redirectUrl. | | **newTabUrl** | `string` | optional | Direct new-tab URL template (`{recordId}` placeholder). When set with opensInNewTab, the renderer navigates the pre-opened tab here immediately — no action POST. The endpoint must enforce auth itself. | | **onSuccess** | `{ navigate: string; openIn?: Enum<'self' \| 'newTab'> }` | optional | Post-success navigation for type:'api' and type:'script' actions. `navigate` is a route/URL template interpolating $`{param.*}`, $`{ctx.*}` and $`{result.*}` (the server response); `openIn` defaults 'self'. The handler-return convention (`{ redirectUrl }` without openIn) keeps its 17.0.0 new-tab behavior. | -| **aria** | `{ ariaLabel?: string \| Record<string, string>; ariaDescribedBy?: string; role?: string }` | optional | ARIA accessibility attributes | +| **aria** | `never` | optional | [REMOVED] `action.aria` was removed in @objectstack/spec 17.5.0 (ADR-0049 enforce-or-remove) — no action surface ever applied it: the button, icon, menu, group and bar renderers, the row and bulk action menus and the record quick-actions toolbar all take the accessible name from the action's `label` and never read this block, so ARIA attributes declared here parsed and then silently did not reach the DOM. Delete the key. The accessible name that IS applied is the action's required `label` — the visible button or menu-item text, and the `aria-label` of an icon-only action — so write the name you meant there. To name the region that PLACES the actions, author `ariaLabel` / `ariaDescribedBy` / `role` in the `aria` block of the placing node: `page.components[].aria` (the component that renders the actions) or the list view `aria`. Run `os migrate meta --from 17` to list the mechanical edits for existing sources; apply them by hand. | | **_lock** | `Enum<'none' \| 'no-overlay' \| 'no-delete' \| 'full'>` | optional | Item-level lock — controls overlay & delete (ADR-0010). | | **_lockReason** | `string` | optional | Human-readable reason shown when a write is refused by _lock. | | **_lockSource** | `Enum<'artifact' \| 'package' \| 'env-forced'>` | optional | Layer that set _lock (artifact \| package \| env-forced). | diff --git a/content/docs/references/ui/action.mdx b/content/docs/references/ui/action.mdx index 184b89545df..a3bcd5660b4 100644 --- a/content/docs/references/ui/action.mdx +++ b/content/docs/references/ui/action.mdx @@ -68,7 +68,7 @@ const result = ActionSchema.parse(data); | **opensInNewTab** | `boolean` | optional | Open the action result in a new tab. The renderer pre-opens the tab synchronously on click (popup-blocker-safe) and navigates it to the handler's redirectUrl. | | **newTabUrl** | `string` | optional | Direct new-tab URL template (`{recordId}` placeholder). When set with opensInNewTab, the renderer navigates the pre-opened tab here immediately — no action POST. The endpoint must enforce auth itself. | | **onSuccess** | `{ navigate: string; openIn?: Enum<'self' \| 'newTab'> }` | optional | Post-success navigation for type:'api' and type:'script' actions. `navigate` is a route/URL template interpolating $`{param.*}`, $`{ctx.*}` and $`{result.*}` (the server response); `openIn` defaults 'self'. The handler-return convention (`{ redirectUrl }` without openIn) keeps its 17.0.0 new-tab behavior. | -| **aria** | `{ ariaLabel?: string \| Record<string, string>; ariaDescribedBy?: string; role?: string }` | optional | ARIA accessibility attributes | +| **aria** | `never` | optional | [REMOVED] `action.aria` was removed in @objectstack/spec 17.5.0 (ADR-0049 enforce-or-remove) — no action surface ever applied it: the button, icon, menu, group and bar renderers, the row and bulk action menus and the record quick-actions toolbar all take the accessible name from the action's `label` and never read this block, so ARIA attributes declared here parsed and then silently did not reach the DOM. Delete the key. The accessible name that IS applied is the action's required `label` — the visible button or menu-item text, and the `aria-label` of an icon-only action — so write the name you meant there. To name the region that PLACES the actions, author `ariaLabel` / `ariaDescribedBy` / `role` in the `aria` block of the placing node: `page.components[].aria` (the component that renders the actions) or the list view `aria`. Run `os migrate meta --from 17` to list the mechanical edits for existing sources; apply them by hand. | | **_lock** | `Enum<'none' \| 'no-overlay' \| 'no-delete' \| 'full'>` | optional | Item-level lock — controls overlay & delete (ADR-0010). | | **_lockReason** | `string` | optional | Human-readable reason shown when a write is refused by _lock. | | **_lockSource** | `Enum<'artifact' \| 'package' \| 'env-forced'>` | optional | Layer that set _lock (artifact \| package \| env-forced). | @@ -149,14 +149,6 @@ L2 sandboxed JS body — runs inside an isolated VM with declared capabilities | **navigate** | `string` | ✅ | Route/URL template navigated to after the action succeeds. Interpolates $`{param.*}` (params-dialog values), $`{ctx.*}` (origin/apiBase/user/org/recordId/selection) and $`{result.*}` (the action's server response payload — NEW with this key, e.g. $`{result.id}`). Relative = SPA route hop; renderers MUST encodeURIComponent values in query positions. | | **openIn** | `Enum<'self' \| 'newTab'>` | optional (default: `"self"`) | Where to perform the post-success navigation: 'self' (default — in-place SPA navigation, immune to popup blocking) or 'newTab'. Closed enum — no general navigation DSL. | -### Nested Shape: `Action.aria` - -| Property | Type | Required | Description | -| :--- | :--- | :--- | :--- | -| **ariaLabel** | `string \| Record<string, string>` | optional | Accessible label for screen readers (WAI-ARIA aria-label). Plain string, or an inline locale map — no translation-bundle slot addresses this key, so a plain string is announced in the source language. | -| **ariaDescribedBy** | `string` | optional | ID of element providing additional description (WAI-ARIA aria-describedby) | -| **role** | `string` | optional | WAI-ARIA role attribute (e.g., "dialog", "navigation", "alert") | - --- From 1773c29a7ee45e553c98faf06162520772d00cc0 Mon Sep 17 00:00:00 2001 From: Claude <noreply@anthropic.com> Date: Mon, 28 Sep 2026 10:55:32 +0000 Subject: [PATCH 8/8] docs(references): regenerate five pages on the merged tree The merge of origin/main deferred automation/schemaless-node-config, data/analytics, index, integration/connector and system/auth-config. Regenerated with gen:schema + gen:docs on the merged sources: main's body changes plus this branch's unchanged title/navTitle lines. Claude-Session: https://claude.ai/code/session_01ARcDurZ5j34RdqsGgc4jgH Co-authored-by: Claude <noreply@anthropic.com> --- .../automation/schemaless-node-config.mdx | 28 +- content/docs/references/data/analytics.mdx | 2 +- content/docs/references/index.mdx | 10 +- .../docs/references/integration/connector.mdx | 273 ++---------------- .../docs/references/system/auth-config.mdx | 4 +- 5 files changed, 52 insertions(+), 265 deletions(-) diff --git a/content/docs/references/automation/schemaless-node-config.mdx b/content/docs/references/automation/schemaless-node-config.mdx index 30f4b5c9023..401f6b4a3f6 100644 --- a/content/docs/references/automation/schemaless-node-config.mdx +++ b/content/docs/references/automation/schemaless-node-config.mdx @@ -67,13 +67,18 @@ The two halves reach different audiences, which is why they shipped together: nothing read — and then refuses, naming the `function` it does not have, instead of logging a line and reporting success as it used to. -`decision` stays export-only: nothing parses it at run time. It may carry no -`conditions` at all when it branches purely on edge predicates, its executor -reads `conditions` and nothing else, and its one other key — `mode` — is -declared AHEAD of the engine change that reads it (#15429; see -`DecisionConfigSchema`). Its enforcement remains the objectui -reconciliation test, which is what #4278 was actually about (a form -authoring keys nothing reads). +`decision` is parsed at **registration**, for one key (#15429): the +automation engine's `registerFlow` runs every decision node's config through +`DecisionConfigSchema` and refuses the flow on any issue rooted at +`mode` — a value outside the closed pair, or a `mode` beside a non-empty +`conditions` list — with this schema's own sentence, and `os validate` +reports the same issues as `flow-decision-mode-invalid`, so the two doors +cannot disagree. A decision may carry no `conditions` at all when it +branches purely on edge predicates; its executor reads `conditions` and +nothing else, and the engine's traversal reads `mode`. Its strictness +(unknown keys) still binds at authoring, in the published JSON Schema and in +the objectui reconciliation test, which is what #4278 was actually about (a +form authoring keys nothing reads). Undeclared aliases are NOT part of these contracts: `subflow`'s historical `flow` spelling graduated into the ADR-0087 D2 conversion @@ -97,9 +102,10 @@ door in front of its author, and the class it structurally could not cover is precisely the class with no second door. Closing these shapes is therefore not a duplicate check for `script` and `subflow`; it is their first one. -`decision` is still export-only, so its strictness binds at authoring -(`tsc`), in the published JSON Schema, and in objectui's reconciliation — -not at run time. It is closed anyway, because the campaign's whole finding +`decision`'s strictness binds at authoring (`tsc`), in the published JSON +Schema, and in objectui's reconciliation — not at run time, where the +registration reader judges `mode` alone (#15429). It is closed anyway, +because the campaign's whole finding is that a shape left open accretes a test, a form and a fixture that assert the openness, and then closing it is a migration instead of an edit. @@ -138,7 +144,7 @@ const result = DecisionConditionSchema.parse(data); | Property | Type | Required | Description | | :--- | :--- | :--- | :--- | | **conditions** | `{ label: string; expression: string }[]` | optional | Ordered decision branches (first true expression wins; omit to branch purely on edge conditions) | -| **mode** | `Enum<'exclusive' \| 'inclusive'>` | optional | Declares how many out-edges an edge-branched decision takes when more than one out-edge condition holds: 'exclusive' = only the first, in the order the edges are declared (what an omitted mode means); 'inclusive' = every one that holds. Declared ahead of the engine change that reads it: until that lands, an edge-branched decision takes every out-edge whose condition holds, whatever this says. Refused beside a non-empty conditions list, which is first-match on its own: delete mode there, or move the branches onto the out-edges, delete conditions, and keep mode. | +| **mode** | `Enum<'exclusive' \| 'inclusive'>` | optional | Declares how many out-edges an edge-branched decision takes when more than one out-edge condition holds: 'exclusive' = only the first, in the order the edges are declared (what an omitted mode means; the siblings after it are not evaluated and record a skipped step); 'inclusive' = every one that holds, one after another. When none holds the isDefault edge runs either way. Refused beside a non-empty conditions list, which is first-match on its own: delete mode there, or move the branches onto the out-edges, delete conditions, and keep mode. Authored sources written while every true branch ran keep that behaviour through the os migrate meta --from 17 conversion, which writes mode: inclusive onto every edge-branched decision with two or more conditioned out-edges; a flow stored in sys_metadata is not rewritten and takes the first-match reading on upgrade (os migrate meta --stored lists those decisions). | ### Nested Shape: `DecisionConfig.conditions[number]` diff --git a/content/docs/references/data/analytics.mdx b/content/docs/references/data/analytics.mdx index 9f55a4c5d3f..cc64d3c013a 100644 --- a/content/docs/references/data/analytics.mdx +++ b/content/docs/references/data/analytics.mdx @@ -130,7 +130,7 @@ Type: `[string, string]` | **dimensions** | `Record<string, { name: string; label: string; description?: string; type: Enum<'string' \| 'number' \| 'boolean' \| 'time' \| 'geo'>; … }>` | ✅ | Qualitative attributes | | **joins** | `Record<string, { name: string }>` | optional | | | **refreshKey** | `{ every?: string; sql?: string }` | optional | | -| **public** | `boolean` | optional (default: `false`) | | +| **public** | `boolean` | optional (default: `true`) | Whether the analytics API exposes this cube. Default true (visible). false hides it from GET /analytics/meta and refuses POST /analytics/query and /analytics/sql for it (CUBE_NOT_FOUND). Visibility only: the underlying object's permissions and row-level security still govern its records on every door. | | **_lock** | `Enum<'none' \| 'no-overlay' \| 'no-delete' \| 'full'>` | optional | Item-level lock — controls overlay & delete (ADR-0010). | | **_lockReason** | `string` | optional | Human-readable reason shown when a write is refused by _lock. | | **_lockSource** | `Enum<'artifact' \| 'package' \| 'env-forced'>` | optional | Layer that set _lock (artifact \| package \| env-forced). | diff --git a/content/docs/references/index.mdx b/content/docs/references/index.mdx index bcef97b0712..ca3560cf403 100644 --- a/content/docs/references/index.mdx +++ b/content/docs/references/index.mdx @@ -1,7 +1,7 @@ --- title: Protocol reference — every schema by module navTitle: Protocol Reference -description: Every schema published by @objectstack/spec — 1523 schemas across 14 protocol modules +description: Every schema published by @objectstack/spec — 1516 schemas across 14 protocol modules --- {/* ⚠️ AUTO-GENERATED — DO NOT EDIT. Run build-docs.ts to regenerate. Hand-written docs live in the module folders under content/docs/. */} @@ -25,7 +25,7 @@ counts are sums of the rows they head. Regenerate with | [Automation Protocol](/docs/references/automation) | 14 | 75 | Flows and their nodes, approvals, ETL pipelines, webhooks, state machines, execution records. | | [Data Protocol](/docs/references/data) | 29 | 175 | Objects, fields, queries, filters, datasources and drivers — the ObjectQL layer. | | [Identity Protocol](/docs/references/identity) | 5 | 27 | Users and accounts, organizations, positions, SCIM provisioning. | -| [Integration Protocol](/docs/references/integration) | 1 | 24 | The single connector protocol (ADR-0097) — catalog descriptors and provider-bound instances. | +| [Integration Protocol](/docs/references/integration) | 1 | 17 | The single connector protocol (ADR-0097) — catalog descriptors and provider-bound instances. | | [Kernel Protocol](/docs/references/kernel) | 30 | 157 | Plugin lifecycle and manifests, capabilities and security, metadata loading, service registry. | | [Marketplace Protocol](/docs/references/marketplace) | 4 | 30 | The package & marketplace format — package identity and versions, listing, publish, review, search, install, template manifests. | | [QA Protocol](/docs/references/qa) | 1 | 8 | Declarative test suites — scenarios, steps, actions and assertions. | @@ -34,7 +34,7 @@ counts are sums of the rows they head. Regenerate with | [Studio Protocol](/docs/references/studio) | 3 | 35 | Studio designer metadata — the authoring surfaces for the protocols above. | | [System Protocol](/docs/references/system) | 34 | 275 | The runtime environment — logging, jobs, cache, metrics, notifications, i18n and compliance. | | [UI Protocol](/docs/references/ui) | 16 | 159 | Apps, pages, views, dashboards, reports, actions and themes — the ObjectUI layer. | -| **Total** | **196** | **1523** | 14 protocol modules | +| **Total** | **196** | **1516** | 14 protocol modules | --- @@ -187,13 +187,13 @@ Users and accounts, organizations, positions, SCIM provisioning. ## Integration Protocol -**Source:** `packages/spec/src/integration/` · **Import:** `@objectstack/spec/integration` · **1 page, 24 schemas** +**Source:** `packages/spec/src/integration/` · **Import:** `@objectstack/spec/integration` · **1 page, 17 schemas** The single connector protocol (ADR-0097) — catalog descriptors and provider-bound instances. | File | Schemas | | :--- | :--- | -| [`connector.zod.ts`](/docs/references/integration/connector) | `CircuitBreakerConfig`, `Connector`, `ConnectorAction`, `ConnectorActionEffect`, `ConnectorConflictResolution`, `ConnectorFieldMapping`, `ConnectorHealth`, `ConnectorInstanceAPIKeyAuth`, `ConnectorInstanceAuth`, `ConnectorInstanceBasicAuth`, `ConnectorInstanceBearerAuth`, `ConnectorInstanceNoAuth`, `ConnectorRetryStrategy`, `ConnectorStatus`, `ConnectorTrigger`, `ConnectorType`, `DataSyncConfig`, `DeclarativeConnectorEntry`, `HealthCheckConfig`, `RetryConfig`, `SyncStrategy`, `WebhookConfig`, `WebhookEvent`, `WebhookSignatureAlgorithm` | +| [`connector.zod.ts`](/docs/references/integration/connector) | `Connector`, `ConnectorAction`, `ConnectorActionEffect`, `ConnectorConflictResolution`, `ConnectorFieldMapping`, `ConnectorInstanceAPIKeyAuth`, `ConnectorInstanceAuth`, `ConnectorInstanceBasicAuth`, `ConnectorInstanceBearerAuth`, `ConnectorInstanceNoAuth`, `ConnectorRetryStrategy`, `ConnectorTrigger`, `ConnectorType`, `DataSyncConfig`, `DeclarativeConnectorEntry`, `RetryConfig`, `SyncStrategy` | --- diff --git a/content/docs/references/integration/connector.mdx b/content/docs/references/integration/connector.mdx index a0069c81104..4be4d46991d 100644 --- a/content/docs/references/integration/connector.mdx +++ b/content/docs/references/integration/connector.mdx @@ -21,11 +21,13 @@ reason, that no engine ever executed them: L1 "Simple Sync" - **Enterprise Connector** (THIS FILE) - System integrators - Full SAP integration; connector-attached sync via `syncConfig` **SCOPE: Most comprehensive integration layer.** -Includes authentication, webhooks, field mapping, bidirectional sync, -retry policies, and complete lifecycle management. +Includes authentication, field mapping, bidirectional sync, retry policies, +and complete lifecycle management. This protocol supports multiple authentication strategies, bidirectional sync, -field mapping, webhooks, and comprehensive retry and resilience policies. +field mapping, and an executed retry policy. It declares no health probe, no +circuit breaker, no authored status and no webhooks of its own — see "What +this layer does NOT provide" below. ## What this layer does NOT provide @@ -56,10 +58,18 @@ construction. ⚠️ Retrying a `429` is not throttling it: a retry policy spaces out the calls you already made, it does not cap the rate, so the sentence above about rate limiting stands unchanged. -⛔ **One exception remains, still inert and still `dead` in -`packages/spec/liveness/connector.json`:** `health.circuitBreaker` — every -sub-key is unread and no breaker ever opens; implement circuit breaking in -the connector provider. +**There is no connector health probe and no circuit breaker.** The +`health` block (`healthCheck` and `circuitBreaker`) was removed in +`@objectstack/spec` 17 (ADR-0049 enforce-or-remove) together with the +authored `status` and the nested `webhooks` array: nothing ever scheduled a +probe, opened a breaker, read an authored status or delivered a webhook +declared inside a connector. Implement probes and circuit breaking in the +connector provider or an upstream gateway; whether a registered connector can +be dispatched is the computed `state` (`ready` / `degraded`) that +`GET /api/v1/automation/connectors` reports; and a webhook that is actually +delivered is declared in the stack's top-level `webhooks:` collection. The +"REMOVED: `health`, `status` and the nested `webhooks`" section below records +the measurement. `connectionTimeoutMs` used to be the second exception and is now **removed** (ADR-0049, the narrower second decision that surface was owed): it was @@ -114,12 +124,11 @@ Authentication is now imported from the canonical `auth/config.zod.ts`. - Building enterprise-grade connectors (e.g., Salesforce, SAP, Oracle) - Complex OAuth2/SAML authentication required - Bidirectional sync with field mapping (`dataType` / `syncMode` per field — it moves values, it does not transform them) -- Webhook management required - Full CRUD operations and data synchronization - Need comprehensive retry strategies and error handling **Examples:** -- Full Salesforce integration with webhooks +- Full Salesforce integration - SAP ERP connector with CDC (Change Data Capture) - Microsoft Dynamics 365 connector @@ -154,32 +163,13 @@ an exception for itself.) ## TypeScript Usage ```typescript -import { CircuitBreakerConfigSchema, ConnectorSchema, ConnectorActionSchema, ConnectorActionEffectSchema, ConnectorConflictResolutionSchema, ConnectorFieldMappingSchema, ConnectorHealthSchema, ConnectorInstanceAPIKeyAuthSchema, ConnectorInstanceAuthSchema, ConnectorInstanceBasicAuthSchema, ConnectorInstanceBearerAuthSchema, ConnectorInstanceNoAuthSchema, ConnectorRetryStrategySchema, ConnectorStatusSchema, ConnectorTriggerSchema, ConnectorTypeSchema, DataSyncConfigSchema, DeclarativeConnectorEntrySchema, HealthCheckConfigSchema, RetryConfigSchema, SyncStrategySchema, WebhookConfigSchema, WebhookEventSchema, WebhookSignatureAlgorithmSchema } from '@objectstack/spec/integration'; -import type { CircuitBreakerConfig, Connector, ConnectorAction, ConnectorActionEffect, ConnectorConflictResolution, ConnectorFieldMapping, ConnectorHealth, ConnectorInstanceAPIKeyAuth, ConnectorInstanceAuth, ConnectorInstanceBasicAuth, ConnectorInstanceBearerAuth, ConnectorInstanceNoAuth, ConnectorRetryStrategy, ConnectorStatus, ConnectorTrigger, ConnectorType, DataSyncConfig, DeclarativeConnectorEntry, HealthCheckConfig, RetryConfig, SyncStrategy, WebhookConfig, WebhookEvent, WebhookSignatureAlgorithm } from '@objectstack/spec/integration'; +import { ConnectorSchema, ConnectorActionSchema, ConnectorActionEffectSchema, ConnectorConflictResolutionSchema, ConnectorFieldMappingSchema, ConnectorInstanceAPIKeyAuthSchema, ConnectorInstanceAuthSchema, ConnectorInstanceBasicAuthSchema, ConnectorInstanceBearerAuthSchema, ConnectorInstanceNoAuthSchema, ConnectorRetryStrategySchema, ConnectorTriggerSchema, ConnectorTypeSchema, DataSyncConfigSchema, DeclarativeConnectorEntrySchema, RetryConfigSchema, SyncStrategySchema } from '@objectstack/spec/integration'; +import type { Connector, ConnectorAction, ConnectorActionEffect, ConnectorConflictResolution, ConnectorFieldMapping, ConnectorInstanceAPIKeyAuth, ConnectorInstanceAuth, ConnectorInstanceBasicAuth, ConnectorInstanceBearerAuth, ConnectorInstanceNoAuth, ConnectorRetryStrategy, ConnectorTrigger, ConnectorType, DataSyncConfig, DeclarativeConnectorEntry, RetryConfig, SyncStrategy } from '@objectstack/spec/integration'; // Validate data -const result = CircuitBreakerConfigSchema.parse(data); +const result = ConnectorSchema.parse(data); ``` ---- - -## CircuitBreakerConfig - -Circuit breaker configuration - -### Properties - -| Property | Type | Required | Description | -| :--- | :--- | :--- | :--- | -| **enabled** | `boolean` | ✅ | Enable circuit breaker | -| **failureThreshold** | `number` | optional (default: `5`) | Failures before opening circuit | -| **resetTimeoutMs** | `number` | optional (default: `30000`) | Time in open state before half-open | -| **halfOpenMaxRequests** | `number` | optional (default: `1`) | Requests allowed in half-open state | -| **monitoringWindowMs** | `number` | optional (default: `60000`) | Rolling window for failure count in ms | -| **monitoringWindow** | `never` | optional | [REMOVED] `CircuitBreakerConfig.monitoringWindow` was renamed to `monitoringWindowMs` in @objectstack/spec 17 — the unit of a duration-shaped number lives in the key name, not only in the describe prose. Rename the key to `monitoringWindowMs`; the value (milliseconds) and the 60000 default are unchanged. Run `os migrate meta --from 17` to list the mechanical edits for existing sources; apply them by hand. | -| **fallbackStrategy** | `Enum<'cache' \| 'default_value' \| 'error' \| 'queue'>` | optional | Fallback strategy when circuit is open | - - --- ## Connector @@ -201,15 +191,15 @@ Circuit breaker configuration | **triggers** | `{ key: string; label: string; description?: string; type: Enum<'polling' \| 'webhook'>; … }[]` | optional | Trigger definitions | | **syncConfig** | `{ strategy: Enum<'full' \| 'incremental' \| 'upsert' \| 'append_only'>; direction: Enum<'import' \| 'export' \| 'bidirectional'>; realtimeSync: boolean; timestampField?: string; … }` | optional | Data sync configuration | | **fieldMappings** | `{ source: string; target: string; defaultValue?: any; dataType?: Enum<'string' \| 'number' \| 'boolean' \| 'date' \| 'datetime' \| 'json' \| 'array'>; … }[]` | optional | Field mapping rules | -| **webhooks** | `{ name: string; label?: string; object?: string; triggers?: Enum<'create' \| 'update' \| 'delete' \| 'bulk_update' \| 'bulk_delete'>[]; … }[]` | optional | Webhook configurations | +| **webhooks** | `never` | optional | [REMOVED] `connector.webhooks` was removed in @objectstack/spec 17 (ADR-0049 enforce-or-remove) — a webhook nested inside a connector was never registered as a `webhook` item, so it was never materialized into `sys_webhook` and never delivered, and nothing emits the connector events its `events` list could name (`sync.completed`, `auth.expired` and the rest). Delete the key; the nested shape leaves with it (`WebhookConfig`, `WebhookEvent`, `WebhookSignatureAlgorithm`). To have a webhook actually sent, declare it in the stack's top-level `webhooks:` collection, which is materialized into `sys_webhook` and delivered on record events — note that doing so STARTS deliveries this connector never made. Run `os migrate meta --from 17` to list the mechanical edits for existing sources; apply them by hand. | | **rateLimitConfig** | `never` | optional | [REMOVED] `connector.rateLimitConfig` was removed in @objectstack/spec 17.0.0 (ADR-0049 D2) — the entire shape is gone, not just this key: `ConnectorRateLimitConfig` and its `RateLimitStrategy` enum were removed with it, because no outbound rate-limiting engine ever existed. The platform's only token bucket (runtime `security/rate-limit.ts`) throttles INBOUND requests to us; nothing throttled the calls a connector makes out, so every knob here was inert while reading like a configured cap. Delete the key. Do NOT substitute `shared` `RateLimitConfig` — that is the inbound limiter and would cap the wrong direction; until an outbound throttle exists, rate-limit at the connector provider or upstream gateway. Run `os migrate meta --from 16` to list the mechanical edits for existing sources; apply them by hand. | | **retryConfig** | `{ strategy: Enum<'exponential_backoff' \| 'linear_backoff' \| 'fixed_delay' \| 'no_retry'>; maxAttempts: number; initialDelayMs: number; maxDelayMs: number; … }` | optional | Retry configuration | | **connectionTimeoutMs** | `never` | optional | [REMOVED] `connector.connectionTimeoutMs` was removed in @objectstack/spec 17 (ADR-0049 enforce-or-remove) — the platform never honoured it and cannot honour it where it was declared: a connector's outbound call is a WHATWG `fetch`, whose only cancellation surface is one `AbortSignal` over the whole operation, so nothing there observes the connection phase separately, and the value only ever travelled (onto the reported def and the materialization fingerprint) without ever bounding a connect. Delete the key. Use `requestTimeoutMs` for the deadline the platform does keep — it is applied as `resilientFetch`'s per-attempt timeout — and bound the connect phase at a connector provider or upstream gateway on a transport that can separate the phases. Run `os migrate meta --from 17` to list the mechanical edits for existing sources; apply them by hand. | | **requestTimeoutMs** | `number` | optional (default: `30000`) | Request timeout in ms | -| **status** | `Enum<'active' \| 'inactive' \| 'error' \| 'configuring'>` | optional (default: `"inactive"`) | Connector status | +| **status** | `never` | optional | [REMOVED] `connector.status` was removed in @objectstack/spec 17 (ADR-0049 enforce-or-remove) — nothing ever read it: `status: 'active'` neither enabled nor advertised a connector, and `'error'` or `'configuring'` changed nothing either. Delete the key; the `ConnectorStatus` enum leaves with it. On a declarative entry, `enabled: false` is what withdraws a materialized instance or marks a catalog-only descriptor, and whether a registered connector can be dispatched is computed by the runtime and reported as `state` (`ready` or `degraded`) on `GET /api/v1/automation/connectors` — no authored value sets it. Run `os migrate meta --from 17` to list the mechanical edits for existing sources; apply them by hand. | | **enabled** | `boolean` | optional (default: `true`) | Enable connector. On declarative stack entries, false marks a deliberate catalog-only descriptor. | | **errorMapping** | `never` | optional | [REMOVED] `connector.errorMapping` was removed in @objectstack/spec 17 (ADR-0049 enforce-or-remove) — nothing ever read it: no provider, dispatcher or materializer mapped an external error through the rules, so `unmappedBehavior` configured nothing and a rule's `userMessage` was never shown to anyone (that spelling is the live API-error channel, `ApiError.userMessage`, which a thrown HTTP error declares — not connector metadata). Delete the key; the whole shape leaves with it (`ErrorMappingConfig`, `ErrorMappingRule` and the `ConnectorErrorCategory` enum). There is no replacement, because no error-mapping engine exists: a connector's failures reach callers as the provider's own errors (ADR-0097). Run `os migrate meta --from 17` to list the mechanical edits for existing sources; apply them by hand. | -| **health** | `{ healthCheck?: object; circuitBreaker?: object }` | optional | Health and resilience configuration | +| **health** | `never` | optional | [REMOVED] `connector.health` was removed in @objectstack/spec 17 (ADR-0049 enforce-or-remove) — no connector health probe or circuit breaker ever existed: nothing scheduled a `healthCheck` request, counted consecutive failures against a threshold, or opened, half-opened or closed a `circuitBreaker`, and no `fallbackStrategy` was ever applied, so every key in the block configured nothing. That includes `circuitBreaker.monitoringWindowMs` and the `monitoringWindow` spelling it was renamed from: the renamed key is removed with the rest. Delete the key; the whole shape leaves with it (`ConnectorHealth`, `HealthCheckConfig`, `CircuitBreakerConfig`). Whether a connector can be dispatched is computed, not authored: `GET /api/v1/automation/connectors` reports each connector's `state` (`ready` or `degraded`). Put health probes and circuit breaking in the connector provider or an upstream gateway. Run `os migrate meta --from 17` to list the mechanical edits for existing sources; apply them by hand. | | **metadata** | `Record<string, any>` | optional | Custom connector metadata | | **_lock** | `Enum<'none' \| 'no-overlay' \| 'no-delete' \| 'full'>` | optional | Item-level lock — controls overlay & delete (ADR-0010). | | **_lockReason** | `string` | optional | Human-readable reason shown when a write is refused by _lock. | @@ -328,32 +318,6 @@ Circuit breaker configuration | **required** | `boolean` | optional (default: `false`) | Field is required | | **syncMode** | `Enum<'read_only' \| 'write_only' \| 'bidirectional'>` | optional (default: `"bidirectional"`) | Sync mode | -### Nested Shape: `Connector.webhooks[number]` - -| Property | Type | Required | Description | -| :--- | :--- | :--- | :--- | -| **name** | `string` | ✅ | Webhook name, unique per organization (lowercase snake_case) | -| **label** | `string` | optional | Human-readable webhook label | -| **object** | `string` | optional | Object whose record events (create/update/delete, bulk_update/bulk_delete) trigger this webhook | -| **triggers** | `Enum<'create' \| 'update' \| 'delete' \| 'bulk_update' \| 'bulk_delete'>[]` | optional | Events that trigger execution | -| **url** | `string` | ✅ | External webhook endpoint URL | -| **method** | `Enum<'GET' \| 'POST' \| 'PUT' \| 'PATCH' \| 'DELETE'>` | optional (default: `"POST"`) | HTTP method | -| **headers** | `Record<string, string>` | optional | Custom HTTP headers | -| **timeoutMs** | `integer` | optional (default: `30000`) | Request timeout in milliseconds | -| **secret** | `string` | optional | Signing secret for HMAC signature verification | -| **isActive** | `boolean` | optional (default: `true`) | Whether webhook is active | -| **description** | `string` | optional | Webhook description | -| **protection** | `{ lock: Enum<'none' \| 'no-overlay' \| 'no-delete' \| 'full'>; reason: string; docsUrl?: string }` | optional | Package author protection block — lock policy for this webhook. | -| **_lock** | `Enum<'none' \| 'no-overlay' \| 'no-delete' \| 'full'>` | optional | Item-level lock — controls overlay & delete (ADR-0010). | -| **_lockReason** | `string` | optional | Human-readable reason shown when a write is refused by _lock. | -| **_lockSource** | `Enum<'artifact' \| 'package' \| 'env-forced'>` | optional | Layer that set _lock (artifact \| package \| env-forced). | -| **_provenance** | `Enum<'package' \| 'org' \| 'env-forced'>` | optional | Origin of the item (package \| org \| env-forced). | -| **_packageId** | `string` | optional | Owning package machine id. | -| **_packageVersion** | `string` | optional | Owning package version. | -| **_lockDocsUrl** | `string` | optional | Optional documentation link surfaced next to _lockReason. | -| **events** | `Enum<'record.created' \| 'record.updated' \| 'record.deleted' \| 'sync.started' \| …>[]` | optional | Connector events to subscribe to | -| **signatureAlgorithm** | `Enum<'hmac_sha256' \| 'hmac_sha512' \| 'none'>` | optional (default: `"hmac_sha256"`) | Webhook signature algorithm | - ### Nested Shape: `Connector.retryConfig` | Property | Type | Required | Description | @@ -367,13 +331,6 @@ Circuit breaker configuration | **retryOnNetworkError** | `boolean` | optional (default: `true`) | Retry on network errors | | **jitter** | `boolean` | optional (default: `true`) | Add jitter to retry delays | -### Nested Shape: `Connector.health` - -| Property | Type | Required | Description | -| :--- | :--- | :--- | :--- | -| **healthCheck** | `{ enabled: boolean; intervalMs: number; timeoutMs: number; endpoint?: string; … }` | optional | Health check configuration | -| **circuitBreaker** | `{ enabled: boolean; failureThreshold: number; resetTimeoutMs: number; halfOpenMaxRequests: number; … }` | optional | Circuit breaker configuration | - --- @@ -434,45 +391,6 @@ Conflict resolution strategy | **syncMode** | `Enum<'read_only' \| 'write_only' \| 'bidirectional'>` | optional (default: `"bidirectional"`) | Sync mode | ---- - -## ConnectorHealth - -Connector health configuration - -### Properties - -| Property | Type | Required | Description | -| :--- | :--- | :--- | :--- | -| **healthCheck** | `{ enabled: boolean; intervalMs: number; timeoutMs: number; endpoint?: string; … }` | optional | Health check configuration | -| **circuitBreaker** | `{ enabled: boolean; failureThreshold: number; resetTimeoutMs: number; halfOpenMaxRequests: number; … }` | optional | Circuit breaker configuration | - -### Nested Shape: `ConnectorHealth.healthCheck` - -| Property | Type | Required | Description | -| :--- | :--- | :--- | :--- | -| **enabled** | `boolean` | ✅ | Enable health checks | -| **intervalMs** | `number` | optional (default: `60000`) | Health check interval in milliseconds | -| **timeoutMs** | `number` | optional (default: `5000`) | Health check timeout in milliseconds | -| **endpoint** | `string` | optional | Health check endpoint path | -| **method** | `Enum<'GET' \| 'HEAD' \| 'OPTIONS'>` | optional | HTTP method for health check | -| **expectedStatus** | `number` | optional (default: `200`) | Expected HTTP status code | -| **unhealthyThreshold** | `number` | optional (default: `3`) | Consecutive failures before marking unhealthy | -| **healthyThreshold** | `number` | optional (default: `1`) | Consecutive successes before marking healthy | - -### Nested Shape: `ConnectorHealth.circuitBreaker` - -| Property | Type | Required | Description | -| :--- | :--- | :--- | :--- | -| **enabled** | `boolean` | ✅ | Enable circuit breaker | -| **failureThreshold** | `number` | optional (default: `5`) | Failures before opening circuit | -| **resetTimeoutMs** | `number` | optional (default: `30000`) | Time in open state before half-open | -| **halfOpenMaxRequests** | `number` | optional (default: `1`) | Requests allowed in half-open state | -| **monitoringWindowMs** | `number` | optional (default: `60000`) | Rolling window for failure count in ms | -| **monitoringWindow** | `never` | optional | [REMOVED] `CircuitBreakerConfig.monitoringWindow` was renamed to `monitoringWindowMs` in @objectstack/spec 17 — the unit of a duration-shaped number lives in the key name, not only in the describe prose. Rename the key to `monitoringWindowMs`; the value (milliseconds) and the 60000 default are unchanged. Run `os migrate meta --from 17` to list the mechanical edits for existing sources; apply them by hand. | -| **fallbackStrategy** | `Enum<'cache' \| 'default_value' \| 'error' \| 'queue'>` | optional | Fallback strategy when circuit is open | - - --- ## ConnectorInstanceAPIKeyAuth @@ -600,20 +518,6 @@ Retry strategy * `no_retry` ---- - -## ConnectorStatus - -Connector status - -### Allowed Values - -* `active` -* `inactive` -* `error` -* `configuring` - - --- ## ConnectorTrigger @@ -685,15 +589,15 @@ Connector type | **triggers** | `{ key: string; label: string; description?: string; type: Enum<'polling' \| 'webhook'>; … }[]` | optional | Trigger definitions | | **syncConfig** | `{ strategy: Enum<'full' \| 'incremental' \| 'upsert' \| 'append_only'>; direction: Enum<'import' \| 'export' \| 'bidirectional'>; realtimeSync: boolean; timestampField?: string; … }` | optional | Data sync configuration | | **fieldMappings** | `{ source: string; target: string; defaultValue?: any; dataType?: Enum<'string' \| 'number' \| 'boolean' \| 'date' \| 'datetime' \| 'json' \| 'array'>; … }[]` | optional | Field mapping rules | -| **webhooks** | `{ name: string; label?: string; object?: string; triggers?: Enum<'create' \| 'update' \| 'delete' \| 'bulk_update' \| 'bulk_delete'>[]; … }[]` | optional | Webhook configurations | +| **webhooks** | `never` | optional | [REMOVED] `connector.webhooks` was removed in @objectstack/spec 17 (ADR-0049 enforce-or-remove) — a webhook nested inside a connector was never registered as a `webhook` item, so it was never materialized into `sys_webhook` and never delivered, and nothing emits the connector events its `events` list could name (`sync.completed`, `auth.expired` and the rest). Delete the key; the nested shape leaves with it (`WebhookConfig`, `WebhookEvent`, `WebhookSignatureAlgorithm`). To have a webhook actually sent, declare it in the stack's top-level `webhooks:` collection, which is materialized into `sys_webhook` and delivered on record events — note that doing so STARTS deliveries this connector never made. Run `os migrate meta --from 17` to list the mechanical edits for existing sources; apply them by hand. | | **rateLimitConfig** | `never` | optional | [REMOVED] `connector.rateLimitConfig` was removed in @objectstack/spec 17.0.0 (ADR-0049 D2) — the entire shape is gone, not just this key: `ConnectorRateLimitConfig` and its `RateLimitStrategy` enum were removed with it, because no outbound rate-limiting engine ever existed. The platform's only token bucket (runtime `security/rate-limit.ts`) throttles INBOUND requests to us; nothing throttled the calls a connector makes out, so every knob here was inert while reading like a configured cap. Delete the key. Do NOT substitute `shared` `RateLimitConfig` — that is the inbound limiter and would cap the wrong direction; until an outbound throttle exists, rate-limit at the connector provider or upstream gateway. Run `os migrate meta --from 16` to list the mechanical edits for existing sources; apply them by hand. | | **retryConfig** | `{ strategy: Enum<'exponential_backoff' \| 'linear_backoff' \| 'fixed_delay' \| 'no_retry'>; maxAttempts: number; initialDelayMs: number; maxDelayMs: number; … }` | optional | Retry configuration | | **connectionTimeoutMs** | `never` | optional | [REMOVED] `connector.connectionTimeoutMs` was removed in @objectstack/spec 17 (ADR-0049 enforce-or-remove) — the platform never honoured it and cannot honour it where it was declared: a connector's outbound call is a WHATWG `fetch`, whose only cancellation surface is one `AbortSignal` over the whole operation, so nothing there observes the connection phase separately, and the value only ever travelled (onto the reported def and the materialization fingerprint) without ever bounding a connect. Delete the key. Use `requestTimeoutMs` for the deadline the platform does keep — it is applied as `resilientFetch`'s per-attempt timeout — and bound the connect phase at a connector provider or upstream gateway on a transport that can separate the phases. Run `os migrate meta --from 17` to list the mechanical edits for existing sources; apply them by hand. | | **requestTimeoutMs** | `number` | optional (default: `30000`) | Request timeout in ms | -| **status** | `Enum<'active' \| 'inactive' \| 'error' \| 'configuring'>` | optional (default: `"inactive"`) | Connector status | +| **status** | `never` | optional | [REMOVED] `connector.status` was removed in @objectstack/spec 17 (ADR-0049 enforce-or-remove) — nothing ever read it: `status: 'active'` neither enabled nor advertised a connector, and `'error'` or `'configuring'` changed nothing either. Delete the key; the `ConnectorStatus` enum leaves with it. On a declarative entry, `enabled: false` is what withdraws a materialized instance or marks a catalog-only descriptor, and whether a registered connector can be dispatched is computed by the runtime and reported as `state` (`ready` or `degraded`) on `GET /api/v1/automation/connectors` — no authored value sets it. Run `os migrate meta --from 17` to list the mechanical edits for existing sources; apply them by hand. | | **enabled** | `boolean` | optional (default: `true`) | Enable connector. On declarative stack entries, false marks a deliberate catalog-only descriptor. | | **errorMapping** | `never` | optional | [REMOVED] `connector.errorMapping` was removed in @objectstack/spec 17 (ADR-0049 enforce-or-remove) — nothing ever read it: no provider, dispatcher or materializer mapped an external error through the rules, so `unmappedBehavior` configured nothing and a rule's `userMessage` was never shown to anyone (that spelling is the live API-error channel, `ApiError.userMessage`, which a thrown HTTP error declares — not connector metadata). Delete the key; the whole shape leaves with it (`ErrorMappingConfig`, `ErrorMappingRule` and the `ConnectorErrorCategory` enum). There is no replacement, because no error-mapping engine exists: a connector's failures reach callers as the provider's own errors (ADR-0097). Run `os migrate meta --from 17` to list the mechanical edits for existing sources; apply them by hand. | -| **health** | `{ healthCheck?: object; circuitBreaker?: object }` | optional | Health and resilience configuration | +| **health** | `never` | optional | [REMOVED] `connector.health` was removed in @objectstack/spec 17 (ADR-0049 enforce-or-remove) — no connector health probe or circuit breaker ever existed: nothing scheduled a `healthCheck` request, counted consecutive failures against a threshold, or opened, half-opened or closed a `circuitBreaker`, and no `fallbackStrategy` was ever applied, so every key in the block configured nothing. That includes `circuitBreaker.monitoringWindowMs` and the `monitoringWindow` spelling it was renamed from: the renamed key is removed with the rest. Delete the key; the whole shape leaves with it (`ConnectorHealth`, `HealthCheckConfig`, `CircuitBreakerConfig`). Whether a connector can be dispatched is computed, not authored: `GET /api/v1/automation/connectors` reports each connector's `state` (`ready` or `degraded`). Put health probes and circuit breaking in the connector provider or an upstream gateway. Run `os migrate meta --from 17` to list the mechanical edits for existing sources; apply them by hand. | | **metadata** | `Record<string, any>` | optional | Custom connector metadata | | **_lock** | `Enum<'none' \| 'no-overlay' \| 'no-delete' \| 'full'>` | optional | Item-level lock — controls overlay & delete (ADR-0010). | | **_lockReason** | `string` | optional | Human-readable reason shown when a write is refused by _lock. | @@ -812,32 +716,6 @@ Connector type | **required** | `boolean` | optional (default: `false`) | Field is required | | **syncMode** | `Enum<'read_only' \| 'write_only' \| 'bidirectional'>` | optional (default: `"bidirectional"`) | Sync mode | -### Nested Shape: `DeclarativeConnectorEntry.webhooks[number]` - -| Property | Type | Required | Description | -| :--- | :--- | :--- | :--- | -| **name** | `string` | ✅ | Webhook name, unique per organization (lowercase snake_case) | -| **label** | `string` | optional | Human-readable webhook label | -| **object** | `string` | optional | Object whose record events (create/update/delete, bulk_update/bulk_delete) trigger this webhook | -| **triggers** | `Enum<'create' \| 'update' \| 'delete' \| 'bulk_update' \| 'bulk_delete'>[]` | optional | Events that trigger execution | -| **url** | `string` | ✅ | External webhook endpoint URL | -| **method** | `Enum<'GET' \| 'POST' \| 'PUT' \| 'PATCH' \| 'DELETE'>` | optional (default: `"POST"`) | HTTP method | -| **headers** | `Record<string, string>` | optional | Custom HTTP headers | -| **timeoutMs** | `integer` | optional (default: `30000`) | Request timeout in milliseconds | -| **secret** | `string` | optional | Signing secret for HMAC signature verification | -| **isActive** | `boolean` | optional (default: `true`) | Whether webhook is active | -| **description** | `string` | optional | Webhook description | -| **protection** | `{ lock: Enum<'none' \| 'no-overlay' \| 'no-delete' \| 'full'>; reason: string; docsUrl?: string }` | optional | Package author protection block — lock policy for this webhook. | -| **_lock** | `Enum<'none' \| 'no-overlay' \| 'no-delete' \| 'full'>` | optional | Item-level lock — controls overlay & delete (ADR-0010). | -| **_lockReason** | `string` | optional | Human-readable reason shown when a write is refused by _lock. | -| **_lockSource** | `Enum<'artifact' \| 'package' \| 'env-forced'>` | optional | Layer that set _lock (artifact \| package \| env-forced). | -| **_provenance** | `Enum<'package' \| 'org' \| 'env-forced'>` | optional | Origin of the item (package \| org \| env-forced). | -| **_packageId** | `string` | optional | Owning package machine id. | -| **_packageVersion** | `string` | optional | Owning package version. | -| **_lockDocsUrl** | `string` | optional | Optional documentation link surfaced next to _lockReason. | -| **events** | `Enum<'record.created' \| 'record.updated' \| 'record.deleted' \| 'sync.started' \| …>[]` | optional | Connector events to subscribe to | -| **signatureAlgorithm** | `Enum<'hmac_sha256' \| 'hmac_sha512' \| 'none'>` | optional (default: `"hmac_sha256"`) | Webhook signature algorithm | - ### Nested Shape: `DeclarativeConnectorEntry.retryConfig` | Property | Type | Required | Description | @@ -851,33 +729,6 @@ Connector type | **retryOnNetworkError** | `boolean` | optional (default: `true`) | Retry on network errors | | **jitter** | `boolean` | optional (default: `true`) | Add jitter to retry delays | -### Nested Shape: `DeclarativeConnectorEntry.health` - -| Property | Type | Required | Description | -| :--- | :--- | :--- | :--- | -| **healthCheck** | `{ enabled: boolean; intervalMs: number; timeoutMs: number; endpoint?: string; … }` | optional | Health check configuration | -| **circuitBreaker** | `{ enabled: boolean; failureThreshold: number; resetTimeoutMs: number; halfOpenMaxRequests: number; … }` | optional | Circuit breaker configuration | - - ---- - -## HealthCheckConfig - -Health check configuration - -### Properties - -| Property | Type | Required | Description | -| :--- | :--- | :--- | :--- | -| **enabled** | `boolean` | ✅ | Enable health checks | -| **intervalMs** | `number` | optional (default: `60000`) | Health check interval in milliseconds | -| **timeoutMs** | `number` | optional (default: `5000`) | Health check timeout in milliseconds | -| **endpoint** | `string` | optional | Health check endpoint path | -| **method** | `Enum<'GET' \| 'HEAD' \| 'OPTIONS'>` | optional | HTTP method for health check | -| **expectedStatus** | `number` | optional (default: `200`) | Expected HTTP status code | -| **unhealthyThreshold** | `number` | optional (default: `3`) | Consecutive failures before marking unhealthy | -| **healthyThreshold** | `number` | optional (default: `1`) | Consecutive successes before marking healthy | - --- @@ -913,73 +764,3 @@ Synchronization strategy --- -## WebhookConfig - -### Properties - -| Property | Type | Required | Description | -| :--- | :--- | :--- | :--- | -| **name** | `string` | ✅ | Webhook name, unique per organization (lowercase snake_case) | -| **label** | `string` | optional | Human-readable webhook label | -| **object** | `string` | optional | Object whose record events (create/update/delete, bulk_update/bulk_delete) trigger this webhook | -| **triggers** | `Enum<'create' \| 'update' \| 'delete' \| 'bulk_update' \| 'bulk_delete'>[]` | optional | Events that trigger execution | -| **url** | `string` | ✅ | External webhook endpoint URL | -| **method** | `Enum<'GET' \| 'POST' \| 'PUT' \| 'PATCH' \| 'DELETE'>` | optional (default: `"POST"`) | HTTP method | -| **headers** | `Record<string, string>` | optional | Custom HTTP headers | -| **timeoutMs** | `integer` | optional (default: `30000`) | Request timeout in milliseconds | -| **secret** | `string` | optional | Signing secret for HMAC signature verification | -| **isActive** | `boolean` | optional (default: `true`) | Whether webhook is active | -| **description** | `string` | optional | Webhook description | -| **protection** | `{ lock: Enum<'none' \| 'no-overlay' \| 'no-delete' \| 'full'>; reason: string; docsUrl?: string }` | optional | Package author protection block — lock policy for this webhook. | -| **_lock** | `Enum<'none' \| 'no-overlay' \| 'no-delete' \| 'full'>` | optional | Item-level lock — controls overlay & delete (ADR-0010). | -| **_lockReason** | `string` | optional | Human-readable reason shown when a write is refused by _lock. | -| **_lockSource** | `Enum<'artifact' \| 'package' \| 'env-forced'>` | optional | Layer that set _lock (artifact \| package \| env-forced). | -| **_provenance** | `Enum<'package' \| 'org' \| 'env-forced'>` | optional | Origin of the item (package \| org \| env-forced). | -| **_packageId** | `string` | optional | Owning package machine id. | -| **_packageVersion** | `string` | optional | Owning package version. | -| **_lockDocsUrl** | `string` | optional | Optional documentation link surfaced next to _lockReason. | -| **events** | `Enum<'record.created' \| 'record.updated' \| 'record.deleted' \| 'sync.started' \| 'sync.completed' \| 'sync.failed' \| 'auth.expired' \| 'rate_limit.exceeded'>[]` | optional | Connector events to subscribe to | -| **signatureAlgorithm** | `Enum<'hmac_sha256' \| 'hmac_sha512' \| 'none'>` | optional (default: `"hmac_sha256"`) | Webhook signature algorithm | - -### Nested Shape: `WebhookConfig.protection` - -| Property | Type | Required | Description | -| :--- | :--- | :--- | :--- | -| **lock** | `Enum<'none' \| 'no-overlay' \| 'no-delete' \| 'full'>` | ✅ | Lock policy — none \| no-overlay \| no-delete \| full. | -| **reason** | `string` | ✅ | User-visible reason shown when the lock blocks an action. | -| **docsUrl** | `string` | optional | Optional URL the Studio banner links to for more context. | - - ---- - -## WebhookEvent - -Webhook event type - -### Allowed Values - -* `record.created` -* `record.updated` -* `record.deleted` -* `sync.started` -* `sync.completed` -* `sync.failed` -* `auth.expired` -* `rate_limit.exceeded` - - ---- - -## WebhookSignatureAlgorithm - -Webhook signature algorithm - -### Allowed Values - -* `hmac_sha256` -* `hmac_sha512` -* `none` - - ---- - diff --git a/content/docs/references/system/auth-config.mdx b/content/docs/references/system/auth-config.mdx index b048cd0af14..1c8c62f64a5 100644 --- a/content/docs/references/system/auth-config.mdx +++ b/content/docs/references/system/auth-config.mdx @@ -52,7 +52,7 @@ Advanced / low-level Better-Auth options | Property | Type | Required | Description | | :--- | :--- | :--- | :--- | -| **posture** | `Enum<'invite_only' \| 'email_domain' \| 'open'>` | optional (default: `"invite_only"`) | Who may self-register into this environment: invite_only (default — operator acts only), email_domain (allowlisted email domains), or open (anyone). Any posture other than invite_only forces email verification on. | +| **posture** | `Enum<'invite_only' \| 'email_domain' \| 'open'>` | optional (default: `"invite_only"`) | Who may self-register into this environment: invite_only (default — operator acts only), email_domain (allowlisted email domains), or open (anyone). email_domain forces email verification on; open forces it on unless the deployment explicitly sets emailAndPassword.requireEmailVerification to false. | | **allowedEmailDomains** | `string[]` | optional | Email domains admitted to self-register under posture email_domain (exact, case-insensitive match; subdomains need their own entries). Required non-empty for email_domain; refused under other postures. | | **selfRegistrationPermissionSet** | `string` | optional | sys_permission_set name granted to each self-registrant. Required when posture is email_domain or open; refused for invite_only. admin_full_access is refused. | @@ -169,7 +169,7 @@ OIDC / Generic OAuth2 provider configuration for enterprise SSO | Property | Type | Required | Description | | :--- | :--- | :--- | :--- | -| **posture** | `Enum<'invite_only' \| 'email_domain' \| 'open'>` | optional (default: `"invite_only"`) | Who may self-register into this environment: invite_only (default — operator acts only), email_domain (allowlisted email domains), or open (anyone). Any posture other than invite_only forces email verification on. | +| **posture** | `Enum<'invite_only' \| 'email_domain' \| 'open'>` | optional (default: `"invite_only"`) | Who may self-register into this environment: invite_only (default — operator acts only), email_domain (allowlisted email domains), or open (anyone). email_domain forces email verification on; open forces it on unless the deployment explicitly sets emailAndPassword.requireEmailVerification to false. | | **allowedEmailDomains** | `string[]` | optional | Email domains admitted to self-register under posture email_domain (exact, case-insensitive match; subdomains need their own entries). Required non-empty for email_domain; refused under other postures. | | **selfRegistrationPermissionSet** | `string` | optional | sys_permission_set name granted to each self-registrant. Required when posture is email_domain or open; refused for invite_only. admin_full_access is refused. |