One versioning primitive underpins the platform. Presets, access-control policies,
and authored agents do not each carry their own history machinery — they are typed
views over a single generic versioned-document store. Learn the spine once and it
explains all three.
The versioned-document store is a kind-discriminated, body-opaque persistence
primitive: append-only version rows over an opaque JSONB body, an active-version
pointer, and rollback. Its identity is (kind, name) throughout, and every write
is one transaction. The store knows nothing about presets, policies, or agents — it
never inspects the body; the caller owns its shape.Because identity is (kind, name), a document can be re-keyed: rename
moves the active document (kind, name) to (kind, new_name) in one atomic
write. The whole version history, every per-version tags label, and the
active-version pointer move untouched — versions key on the document, not the
name, so nothing is copied and the body is never inspected. It raises loudly if
the source has no active row, or if the target name is already a live document. A
preset rename rides exactly this method.It is a runtime_checkable Protocol, reached from the assembled app as
app.versioning.store, with its own record models (DocumentRecord,
DocumentVersion) and typed errors. Every method raises loudly on a missing,
duplicate, or invalid target rather than returning a silent default.
Each view owns the shape of its body and gets versioning, rollback, and
per-version tags from the spine for free. Because they share one primitive, a new
versioned kind is a new view — not a new subsystem.
The spine’s rows live in the framework’s versioned-document tables, created by
the core migration chain the runner applies:
tai db migrate
tags on a version is the generic per-version grouping label the store provides.
It is distinct from any categorization a particular kind’s body carries — a
preset’s own fields, for example.
{"docsConfig":{"theme":"mint","$schema":"https://mintlify.com/docs.json","name":"TAI42","description":"tai is an open-source runtime for MCP tools, agents, and workflows — the server that hosts tools, agents, extensions, connectors, hooks, and storage for the TAI42 ecosystem.","colors":{"primary":"#DC143C","light":"#F4718A","dark":"#A01030"},"logo":{"light":"https://mintcdn.com/tai42/8zNeABFQpXRG0k_n/logo/light.png?fit=max\u0026auto=format\u0026n=8zNeABFQpXRG0k_n\u0026q=85\u0026s=2140f77615492c689d62fcb3a5df2d31","dark":"https://mintcdn.com/tai42/8zNeABFQpXRG0k_n/logo/dark.png?fit=max\u0026auto=format\u0026n=8zNeABFQpXRG0k_n\u0026q=85\u0026s=22db5fbcb0ff42b44dd8057f0edbb842"},"favicon":{"light":"https://mintcdn.com/tai42/8zNeABFQpXRG0k_n/logo/icon.png?fit=max\u0026auto=format\u0026n=8zNeABFQpXRG0k_n\u0026q=85\u0026s=93b0ca22f7b4a2c0a6a18f49aedbfd73","dark":"https://mintcdn.com/tai42/6-OGKPd0gfVyDs4N/logo/icon-dark.png?fit=max\u0026auto=format\u0026n=6-OGKPd0gfVyDs4N\u0026q=85\u0026s=e1630da05506747fe41cf300761cf3cf"},"appearance":{"default":"light"},"navbar":{"links":[{"icon":"github","href":"https://github.com/tai42ai/tai42","label":"GitHub"}],"primary":{"type":"button","label":"Get started","href":"/getting-started/installation"}},"footer":{"socials":{"github":"https://github.com/tai42ai","website":"https://tai42.ai"},"links":[{"header":"Project","items":[{"label":"Contributing","href":"/contributing"}]}]},"search":{"prompt":"Search the TAI42 docs"},"seo":{"metatags":{"og:title":"TAI42 — the OS for AI tools","og:description":"An open-source runtime for MCP tools, agents, and workflows.","og:image":"/images/og-image.svg","og:type":"website","twitter:card":"summary_large_image","twitter:title":"TAI42 — the OS for AI tools","twitter:image":"/images/og-image.svg"},"indexing":"navigable"},"fonts":{"heading":{"family":"Geist"},"body":{"family":"Inter"}},"contextual":{"options":["copy","view","chatgpt","claude"],"display":"header"},"styling":{"latex":true},"navigation":{"pages":[]}},"deployment":{"deploymentMetadataValue":{"subdomain":"tai42","hasAudioNarration":false,"actualSubdomain":"tai42","customDomains":["docs.tai42.ai"],"gitSource":{"type":"github","owner":"tai42ai","repo":"tai-docs","deployBranch":"main","contentDirectory":"","isPrivate":false,"mountPath":"","label":""},"chroma":{"collectionId":"70c7974a-74c7-4ee5-8636-97a098b8bbe6","liveDeploymentHistoryId":"6aeca718754501e0c6b68d06","schemaVersion":"v3","latestBuiltDeploymentHistoryId":"6aeca718754501e0c6b68d06"},"entitlements":{"AI_CHAT":{"status":"DISABLED"}},"buildId":"6aecafc07e5e99a1eb7058ad","clientVersion":"0.0.4071","searchFilterCounts":[{"language":"default","tag":"Reference","count":356},{"language":"default","tag":"HTTP API","count":260},{"language":"default","tag":"Docs","count":124},{"language":"default","tag":"CLI","count":46},{"language":"default","tag":"Python SDK","count":38},{"language":"default","tag":"Concepts","count":35},{"language":"default","tag":"access-control","count":35},{"language":"default","tag":"states","count":33},{"language":"default","tag":"Plugins","count":30},{"language":"default","tag":"conversations","count":22}]},"assistantConfig":{"enableAskAiButton":false,"enableStarterQuestions":false,"enableContextualStarterQuestions":false,"enableAskAiSearchBar":true},"basePath":"","hasChatPermissions":false,"hasWebMcpPermissions":false,"toggles":[{"name":"kill-isr","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-mintlify-slack","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-integrations-settings","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"rbac-expansion","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-pr-grouping","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"custom-prefix","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"analytics-v7","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"user-flows-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"no-publish-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-onboarding","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"llms-txt-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving-live","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"stripTemperatureMiddleware","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"support-platform-pylon-zendesk","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"instant-rollback","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications-server","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-fable","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fixed-ai-action-pricing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automation-resolve-merge-conflict","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"scoped-publishing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"mintql","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"page-level-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-version-history-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-page-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"full-page-search","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workspace-projects","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"assistant-v5","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fork-pr-previews","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"revalidation-jwt","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"vite-origin","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-sso-scim","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"hobby-abuse-scan","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"dashboard-inbox","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-signup","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"turbopuffer-dual-write","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-enabled","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"approve-review-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"sso-setup-deadline-banner","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"turbopuffer-serve","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"live-agents","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false}],"googleFontsInlined":true},"customCss":[],"page":{"pagePath":"concepts/versioning-spine","slug":"/concepts/versioning-spine","pageMetadata":{"title":"The versioning spine","description":"One versioned-store primitive, many kinds.","icon":"code-branch","href":"/concepts/versioning-spine"},"description":{"compiledSource":"\"use strict\";\nconst {jsx: _jsx} = arguments[0];\nconst {useMDXComponents: _provideComponents} = arguments[0];\nfunction _createMdxContent(props) {\n const _components = {\n p: \"p\",\n ..._provideComponents(),\n ...props.components\n };\n return _jsx(_components.p, {\n children: \"One versioned-store primitive, many kinds.\"\n });\n}\nfunction MDXContent(props = {}) {\n const {wrapper: MDXLayout} = {\n ..._provideComponents(),\n ...props.components\n };\n return MDXLayout ? _jsx(MDXLayout, {\n ...props,\n children: _jsx(_createMdxContent, {\n ...props\n })\n }) : _createMdxContent(props);\n}\nreturn {\n default: MDXContent\n};\n","frontmatter":{},"scope":{}},"pageType":"default","mdx":{"mdxSource":{"compiledSource":"\"use strict\";const{Fragment:_Fragment,jsx:_jsx,jsxs:_jsxs}=arguments[0];const{useMDXComponents:_provideComponents}=arguments[0];function _createMdxContent(props){const _components={a:`a`,code:`code`,li:`li`,p:`p`,pre:`pre`,span:`span`,strong:`strong`,ul:`ul`,..._provideComponents(),...props.components},{CodeBlock,Heading,Mermaid,Note}=_components;if(!CodeBlock)_missingMdxReference(`CodeBlock`,true);if(!Heading)_missingMdxReference(`Heading`,true);if(!Mermaid)_missingMdxReference(`Mermaid`,true);if(!Note)_missingMdxReference(`Note`,true);return _jsxs(_Fragment,{children:[_jsx(_components.p,{children:`One versioning primitive underpins the platform. Presets, access-control policies,\nand authored agents do not each carry their own history machinery — they are typed\nviews over a single generic versioned-document store. Learn the spine once and it\nexplains all three.`}),`\n`,_jsx(Mermaid,{chart:`flowchart TD\n subgraph views[\"Typed views\"]\n P[\"presets\u003cbr/>kind=preset\"]\n A[\"AC policies\u003cbr/>kind=ac_policy\"]\n G[\"authored agents\"]\n end\n P --> S\n A --> S\n G --> S\n S[\"VersionedStore\u003cbr/>(kind, name) · opaque body · versions · rollback\"]`}),`\n`,_jsx(Heading,{level:`2`,id:`the-store-primitive`,children:`The store primitive`}),`\n`,_jsxs(_components.p,{children:[`The versioned-document store is a `,_jsx(_components.code,{children:`kind`}),`-discriminated, body-opaque persistence\nprimitive: append-only version rows over an opaque JSONB body, an active-version\npointer, and rollback. Its identity is `,_jsx(_components.code,{children:`(kind, name)`}),` throughout, and every write\nis one transaction. The store knows nothing about presets, policies, or agents — it\nnever inspects the body; the caller owns its shape.`]}),`\n`,_jsxs(_components.p,{children:[`Because identity is `,_jsx(_components.code,{children:`(kind, name)`}),`, a document can be `,_jsx(_components.strong,{children:`re-keyed`}),`: `,_jsx(_components.code,{children:`rename`}),`\nmoves the active document `,_jsx(_components.code,{children:`(kind, name)`}),` to `,_jsx(_components.code,{children:`(kind, new_name)`}),` in one atomic\nwrite. The whole version history, every per-version `,_jsx(_components.code,{children:`tags`}),` label, and the\nactive-version pointer move untouched — versions key on the document, not the\nname, so nothing is copied and the body is never inspected. It raises loudly if\nthe source has no active row, or if the target name is already a live document. A\n`,_jsx(_components.a,{href:`/concepts/presets`,children:`preset`}),` rename rides exactly this method.`]}),`\n`,_jsxs(_components.p,{children:[`It is a `,_jsx(_components.code,{children:`runtime_checkable`}),` Protocol, reached from the assembled app as\n`,_jsx(_components.code,{children:`app.versioning.store`}),`, with its own record models (`,_jsx(_components.code,{children:`DocumentRecord`}),`,\n`,_jsx(_components.code,{children:`DocumentVersion`}),`) and typed errors. Every method raises loudly on a missing,\nduplicate, or invalid target rather than returning a silent default.`]}),`\n`,_jsx(Heading,{level:`2`,id:`typed-views-ride-the-spine`,children:`Typed views ride the spine`}),`\n`,_jsxs(_components.p,{children:[`A feature that needs history layers a typed view over the store under its own\n`,_jsx(_components.code,{children:`kind`}),`:`]}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:_jsx(_components.a,{href:`/concepts/presets`,children:`Presets`})}),` — `,_jsx(_components.code,{children:`kind=\"preset\"`}),`.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:_jsx(_components.a,{href:`/concepts/access-control`,children:`Access-control policies`})}),` — `,_jsx(_components.code,{children:`kind=\"ac_policy\"`}),`.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:_jsx(_components.a,{href:`/concepts/agents`,children:`Authored agents`})}),` — a spec that versions the same way.`]}),`\n`]}),`\n`,_jsx(_components.p,{children:`Each view owns the shape of its body and gets versioning, rollback, and\nper-version tags from the spine for free. Because they share one primitive, a new\nversioned kind is a new view — not a new subsystem.`}),`\n`,_jsx(Heading,{level:`2`,id:`where-versions-live`,children:`Where versions live`}),`\n`,_jsx(_components.p,{children:`The spine’s rows live in the framework’s versioned-document tables, created by\nthe core migration chain the runner applies:`}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`1`,language:`shellscript`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`shellscript`,children:_jsxs(_components.code,{language:`shellscript`,numberOfLines:`1`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:`tai`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` db`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` migrate`})]}),`\n`]})})}),`\n`,_jsx(Note,{children:_jsxs(_components.p,{children:[_jsx(_components.code,{children:`tags`}),` on a version is the generic per-version grouping label the store provides.\nIt is distinct from any categorization a particular kind’s body carries — a\npreset’s own fields, for example.`]})}),`\n`,_jsxs(_components.p,{children:[`See `,_jsx(_components.a,{href:`/concepts/presets`,children:`presets`}),` and `,_jsx(_components.a,{href:`/concepts/access-control`,children:`access control`}),`\nfor the views in use, and the `,_jsx(_components.a,{href:`/reference/python-sdk/index`,children:`Python SDK reference`}),`\nfor the `,_jsx(_components.code,{children:`VersionedStore`}),` Protocol and its record models.`]})]})}function MDXContent(props={}){const{wrapper:MDXLayout}={..._provideComponents(),...props.components};return MDXLayout?_jsx(MDXLayout,{...props,children:_jsx(_createMdxContent,{...props})}):_createMdxContent(props)}return{default:MDXContent};function _missingMdxReference(id,component){throw new Error(`Expected `+(component?`component`:`object`)+\" `\"+id+\"` to be defined: you likely forgot to import, pass, or provide it.\")}","frontmatter":{},"scope":{"config":{},"pageMetadata":{"title":"The versioning spine","description":"One versioned-store primitive, many kinds.","icon":"code-branch","href":"/concepts/versioning-spine"}}},"mdxSourceWithNoJs":null},"mdxExtracts":{"tableOfContents":[{"title":"The store primitive","slug":"the-store-primitive","depth":2,"children":[]},{"title":"Typed views ride the spine","slug":"typed-views-ride-the-spine","depth":2,"children":[]},{"title":"Where versions live","slug":"where-versions-live","depth":2,"children":[]}],"codeExamples":{}},"jsLinks":[],"subdomain":"tai42","siteName":"TAI42","title":"TAI42 — the OS for AI tools","navMaps":{"firstHrefInVersion":{},"firstHrefInLanguage":{}},"lastModified":"2026-08-06T02:31:55.632Z","originalFileLocation":"concepts/versioning-spine.mdx"},"headHtml":"\u003cscript data-mint-head>(function(){var d=document.documentElement,p=null;if(!p){try{p=localStorage.getItem(\"isDarkMode\")}catch(e){}if(p==='true')p='dark';else if(p==='false')p='light';if(p!=='light'\u0026\u0026p!=='dark'\u0026\u0026p!=='system')p=\"light\"}var r=p==='system'?(matchMedia(\"(prefers-color-scheme: dark)\").matches?'dark':'light'):p;d.classList.remove(r==='dark'?'light':'dark');d.classList.add(r);d.setAttribute(\"data-theme-preference\",p)})();\u003c/script>\u003cmeta data-mint-head name=\"description\" content=\"One versioned-store primitive, many kinds.\">\u003cmeta data-mint-head name=\"application-name\" content=\"TAI42\">\u003cmeta data-mint-head name=\"generator\" content=\"Mintlify\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/tai42/Czx60dmBXmcmJLcB/_generated/favicon/android-chrome-192x192.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"apple-touch-icon\" type=\"image/png\" sizes=\"180x180\" href=\"/mintlify-assets/_mintlify/favicons/tai42/Czx60dmBXmcmJLcB/_generated/favicon/apple-touch-icon.png\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/tai42/Czx60dmBXmcmJLcB/_generated/favicon/favicon-16x16.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/tai42/Czx60dmBXmcmJLcB/_generated/favicon/favicon-32x32.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/tai42/Czx60dmBXmcmJLcB/_generated/favicon/favicon.ico\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/tai42/Czx60dmBXmcmJLcB/_generated/favicon-dark/android-chrome-192x192.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/tai42/Czx60dmBXmcmJLcB/_generated/favicon-dark/favicon-16x16.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/tai42/Czx60dmBXmcmJLcB/_generated/favicon-dark/favicon-32x32.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/tai42/Czx60dmBXmcmJLcB/_generated/favicon-dark/favicon.ico\" media=\"(prefers-color-scheme: dark)\">\u003cmeta data-mint-head property=\"og:title\" content=\"TAI42 — the OS for AI tools\">\u003cmeta data-mint-head property=\"og:description\" content=\"An open-source runtime for MCP tools, agents, and workflows.\">\u003cmeta data-mint-head property=\"og:site_name\" content=\"TAI42\">\u003cmeta data-mint-head property=\"og:url\" content=\"https://docs.tai42.ai/concepts/versioning-spine\">\u003cmeta data-mint-head property=\"og:type\" content=\"website\">\u003cmeta data-mint-head property=\"og:image\" content=\"https://tai42.mintlify.app/images/og-image.svg\">\u003cmeta data-mint-head property=\"og:image:width\" content=\"1200\">\u003cmeta data-mint-head property=\"og:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"twitter:card\" content=\"summary_large_image\">\u003cmeta data-mint-head name=\"twitter:title\" content=\"TAI42 — the OS for AI tools\">\u003cmeta data-mint-head name=\"twitter:description\" content=\"An open-source runtime for MCP tools, agents, and workflows.\">\u003cmeta data-mint-head name=\"twitter:image\" content=\"https://tai42.mintlify.app/images/og-image.svg\">\u003cmeta data-mint-head name=\"twitter:image:width\" content=\"1200\">\u003cmeta data-mint-head name=\"twitter:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"msapplication-config\" content=\"/mintlify-assets/_mintlify/favicons/tai42/Czx60dmBXmcmJLcB/_generated/favicon/browserconfig.xml\">\u003cmeta data-mint-head name=\"apple-mobile-web-app-title\" content=\"TAI42\">\u003cmeta data-mint-head name=\"msapplication-TileColor\" content=\"#DC143C\">\u003clink data-mint-head rel=\"canonical\" href=\"https://docs.tai42.ai/concepts/versioning-spine\">\u003clink data-mint-head rel=\"alternate\" type=\"application/xml\" href=\"/sitemap.xml\">\u003clink data-mint-head rel=\"alternate\" type=\"text/markdown\" href=\"/concepts/versioning-spine.md\">\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@graph\":[{\"@type\":\"Organization\",\"@id\":\"https://docs.tai42.ai/#organization\",\"name\":\"TAI42\",\"url\":\"https://docs.tai42.ai\",\"logo\":{\"@type\":\"ImageObject\",\"url\":\"https://mintcdn.com/tai42/8zNeABFQpXRG0k_n/logo/light.png?fit=max\u0026auto=format\u0026n=8zNeABFQpXRG0k_n\u0026q=85\u0026s=2140f77615492c689d62fcb3a5df2d31\"}},{\"@type\":\"WebSite\",\"@id\":\"https://docs.tai42.ai#website\",\"name\":\"TAI42\",\"url\":\"https://docs.tai42.ai\",\"publisher\":{\"@id\":\"https://docs.tai42.ai/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https://docs.tai42.ai/concepts/versioning-spine#webpage\",\"url\":\"https://docs.tai42.ai/concepts/versioning-spine\",\"name\":\"The versioning spine\",\"description\":\"One versioned-store primitive, many kinds.\",\"dateModified\":\"2026-08-06T02:31:55.632Z\",\"isPartOf\":{\"@id\":\"https://docs.tai42.ai#website\"},\"breadcrumb\":{\"@id\":\"https://docs.tai42.ai/concepts/versioning-spine#breadcrumb\"}},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://docs.tai42.ai/concepts/versioning-spine#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Concepts\",\"item\":\"https://docs.tai42.ai/concepts/index\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Platform surfaces\",\"item\":\"https://docs.tai42.ai/concepts/access-control\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"The versioning spine\",\"item\":\"https://docs.tai42.ai/concepts/versioning-spine\"}]},{\"@type\":[\"Article\",\"TechArticle\"],\"@id\":\"https://docs.tai42.ai/concepts/versioning-spine#article\",\"headline\":\"The versioning spine\",\"name\":\"The versioning spine\",\"description\":\"One versioned-store primitive, many kinds.\",\"url\":\"https://docs.tai42.ai/concepts/versioning-spine\",\"mainEntityOfPage\":{\"@id\":\"https://docs.tai42.ai/concepts/versioning-spine#webpage\"},\"image\":\"https://docs.tai42.ai/images/og-image.svg\",\"dateModified\":\"2026-08-06T02:31:55.632Z\",\"publisher\":{\"@id\":\"https://docs.tai42.ai/#organization\"},\"isPartOf\":{\"@id\":\"https://docs.tai42.ai#website\"}}]}\u003c/script>\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@type\":\"WebSite\",\"name\":\"TAI42\",\"creator\":{\"@type\":\"Organization\",\"name\":\"Mintlify\",\"url\":\"https://mintlify.com\"}}\u003c/script>","siteName":"TAI42","nav":{"global":null,"tabs":[{"tab":"Docs","groups":[{"group":"Get started","icon":"rocket","pages":[{"title":"TAI42 — the OS for AI tools","sidebarTitle":"Welcome","icon":"house","mode":"wide","href":""},{"title":"Installation","icon":"download","href":"/getting-started/installation"},{"title":"Quickstart","icon":"rocket","href":"/getting-started/quickstart"},{"title":"Mental model","icon":"brain","href":"/getting-started/mental-model"}]},{"group":"Concepts","icon":"lightbulb","pages":[{"title":"Concepts","icon":"compass","href":"/concepts/index"},{"group":"Foundations","icon":"sitemap","pages":[{"title":"The layering","icon":"sitemap","href":"/concepts/layering"},{"title":"The manifest","icon":"scroll","href":"/concepts/manifest"},{"title":"Tools and extensions","icon":"wrench","href":"/concepts/tools-and-extensions"},{"title":"Presets","icon":"layer-group","href":"/concepts/presets"},{"title":"Tool organization","icon":"folder-tree","href":"/concepts/tool-organization"}]},{"group":"Agents","icon":"robot","pages":[{"title":"Agents","icon":"robot","href":"/concepts/agents"},{"title":"Deep agents","icon":"diagram-project","href":"/concepts/deep-agents"},{"title":"Classifiers","icon":"scale-balanced","href":"/concepts/classifiers"},{"title":"Client conversations","icon":"comments","href":"/concepts/client-conversations"}]},{"group":"Around the tool","icon":"wrench","pages":[{"title":"Interactions","icon":"comments","href":"/concepts/interactions"},{"title":"Asking the caller","icon":"reply","href":"/concepts/asking-the-caller"},{"title":"Notifications","icon":"bell","href":"/concepts/notifications"},{"title":"Connectors","icon":"plug","href":"/concepts/connectors"},{"title":"Hooks","icon":"anchor","href":"/concepts/hooks"},{"title":"Triggers and webhook verifiers","icon":"bolt","href":"/concepts/triggers-and-webhooks"},{"title":"Storage and resources","icon":"database","href":"/concepts/storage-and-resources"},{"title":"Backends","icon":"server","href":"/concepts/backends"},{"title":"Sandbox","icon":"box","href":"/concepts/sandbox"}]},{"group":"Platform surfaces","icon":"shield-halved","pages":[{"title":"Access control","icon":"shield-halved","href":"/concepts/access-control"},{"title":"Accounts","icon":"user-lock","href":"/concepts/accounts"},{"title":"Member actions","icon":"user-gear","href":"/concepts/member-actions"},{"title":"User types and permissions","icon":"user-shield","href":"/concepts/permissions"},{"title":"Owned keys","icon":"share-nodes","href":"/concepts/owned-keys"},{"title":"Config and secrets","icon":"key","href":"/concepts/config-and-secrets"},{"title":"Secret values","icon":"user-secret","href":"/concepts/secret-values"},{"title":"Transports","icon":"network-wired","href":"/concepts/transports"},{"title":"Private tool sets","icon":"box","href":"/concepts/private-tool-sets"},{"title":"The MCP-citizen surface","description":"MCP-native features and the FastMCP escape hatch.","icon":"diagram-project","href":"/concepts/mcp-citizen-surface"},{"title":"The versioning spine","icon":"code-branch","href":"/concepts/versioning-spine"},{"title":"Live operations","description":"Operate a server without a restart.","icon":"gauge-high","href":"/concepts/live-operations"},{"title":"The worker bus","icon":"tower-broadcast","href":"/concepts/worker-bus"},{"title":"States","icon":"database","href":"/concepts/states"},{"title":"jq variables","icon":"dollar-sign","href":"/concepts/jq-variables"},{"title":"The marketplace","icon":"store","href":"/concepts/marketplace"}]}]},{"group":"Guides","icon":"map","pages":[{"title":"Guides","icon":"map","href":"/guides/index"},{"group":"Using the OS","icon":"wrench","pages":[{"title":"Build a tool","icon":"wrench","href":"/guides/build-a-tool"},{"title":"Bring an MCP server","icon":"plug","href":"/guides/bring-an-mcp-server"},{"title":"Connect an OAuth provider","icon":"key","href":"/guides/connect-an-oauth-provider"},{"title":"Apply an extension","icon":"puzzle-piece","href":"/guides/apply-an-extension"},{"title":"Create and version a preset","icon":"layer-group","href":"/guides/create-and-version-a-preset"},{"title":"Author an agent","icon":"robot","href":"/guides/author-an-agent"},{"title":"Use the ready-made agents","icon":"wand-magic-sparkles","href":"/guides/use-the-ready-made-agents"},{"title":"Use interactions","icon":"comments","href":"/guides/use-interactions"},{"title":"The standard toolbox","icon":"toolbox","href":"/guides/standard-toolbox"},{"title":"Set up access control","icon":"shield-halved","href":"/guides/access-control"},{"title":"Use owned keys","icon":"share-nodes","href":"/guides/owned-keys"},{"title":"Schedule a tool","icon":"clock","href":"/guides/schedule-a-tool"},{"title":"Fire a tool from a webhook","icon":"bolt","href":"/guides/fire-a-tool-from-a-webhook"},{"title":"WhatsApp to an agent","icon":"whatsapp","href":"/guides/whatsapp-to-agent"},{"title":"Telegram / Slack to an agent","icon":"hashtag","href":"/guides/telegram-slack-to-agent"},{"title":"Link a person across channels","icon":"link","href":"/guides/link-a-person-across-channels"},{"title":"Connect your own system","icon":"webhook","href":"/guides/connect-your-own-system"},{"title":"One bot, many skills","icon":"sitemap","href":"/guides/one-bot-many-skills"},{"title":"Manage stored content and templates","icon":"database","href":"/guides/manage-stored-content"},{"title":"Expose a private tool set","icon":"box","href":"/guides/private-tool-set"}]}]},{"group":"Operate","icon":"server","pages":[{"title":"Operate","icon":"server","href":"/operate/index"},{"group":"Run and operate","icon":"cloud-arrow-up","pages":[{"title":"Deploy","icon":"cloud-arrow-up","href":"/operate/deploy"},{"title":"Infrastructure by feature","icon":"layer-group","href":"/operate/infrastructure"},{"title":"Deploying the Studio","icon":"cloud-arrow-up","href":"/operate/studio"},{"title":"Embed in your own ASGI process","icon":"server","href":"/operate/embed"},{"title":"Manage a fleet","icon":"server","href":"/operate/manage-a-fleet"},{"title":"Observe","icon":"chart-line","href":"/operate/observe"},{"title":"Back up and restore","icon":"floppy-disk","href":"/operate/backup-and-restore"},{"title":"Checkpoints and retention","icon":"clock-rotate-left","href":"/operate/checkpoints"}]},{"group":"Plugin setup","icon":"puzzle-piece","pages":[{"title":"Task backends","icon":"server","href":"/operate/backends"},{"title":"Sandbox","icon":"box","href":"/operate/sandbox"},{"title":"Storage providers","icon":"database","href":"/operate/storage"},{"title":"Accounts and sign-in","icon":"user-lock","href":"/operate/accounts"}]}]},{"group":"Self-hosted","icon":"box","pages":[{"title":"Self-hosted","icon":"box","href":"/self-hosted/index"},{"title":"Quickstart","icon":"docker","href":"/self-hosted/quickstart"},{"title":"Web stacks","icon":"window","href":"/self-hosted/web-stacks"},{"title":"Upgrades","icon":"arrow-up-right-dots","href":"/self-hosted/upgrades"},{"title":"Verify artifacts","icon":"shield-check","href":"/self-hosted/verify"},{"title":"Ops notes","icon":"screwdriver-wrench","href":"/self-hosted/ops"}]},{"group":"Marketplace","icon":"store","pages":[{"title":"Marketplace","icon":"store","href":"/marketplace/index"},{"title":"Browse and search","icon":"magnifying-glass","href":"/marketplace/browse"},{"title":"Install a plugin","icon":"download","href":"/marketplace/install"},{"title":"Advisories","icon":"triangle-exclamation","href":"/marketplace/advisories"},{"title":"Author plugin docs","icon":"file-lines","href":"/marketplace/authoring-docs"},{"title":"Publish a connector without code","icon":"file-code","href":"/plugins/authoring-descriptor-plugins"}]},{"group":"Integrations","icon":"plug","pages":[{"title":"Integrations","icon":"plug","href":"/integrations/index"},{"title":"Claude Desktop","icon":"comment","href":"/integrations/claude-desktop"},{"title":"Cursor","icon":"arrow-pointer","href":"/integrations/cursor"},{"title":"MCP clients","icon":"plug","href":"/integrations/mcp-clients"}]},{"group":"Babelfish","icon":"fish","pages":[{"title":"Babelfish","icon":"fish","href":"/babelfish/index"},{"title":"Flows editor","icon":"pen-ruler","href":"/babelfish/studio"},{"title":"The agenda state template","icon":"list-checks","href":"/babelfish/agenda"},{"title":"Visual jq in flows","icon":"diagram-project","href":"/babelfish/jq-editor"},{"title":"Wiring an outcome by hand","icon":"diagram-next","href":"/babelfish/wire-form"}]},{"group":"Plugins","icon":"puzzle-piece","pages":[{"title":"Plugins","icon":"puzzle-piece","href":"/plugins/index"},{"group":"Tools","icon":"wrench","pages":[{"title":"toolbox","href":"/plugins/tai42/toolbox"},{"title":"tools-github","href":"/plugins/tai42/tools-github"},{"title":"tools-stripe","href":"/plugins/tai42/tools-stripe"},{"title":"tools-twilio","href":"/plugins/tai42/tools-twilio"},{"title":"tools-whatsapp","href":"/plugins/tai42/tools-whatsapp"}]},{"group":"Identity","icon":"id-card","pages":[{"title":"accounts-postgres","href":"/plugins/tai42/accounts-postgres"},{"title":"identity-redis","href":"/plugins/tai42/identity-redis"}]},{"group":"Agents","icon":"robot","pages":[{"title":"agents","href":"/plugins/tai42/agents"}]},{"group":"Backends","icon":"server","pages":[{"title":"backend-arq","href":"/plugins/tai42/backend-arq"},{"title":"backend-celery","href":"/plugins/tai42/backend-celery"},{"title":"backend-rq","href":"/plugins/tai42/backend-rq"}]},{"group":"Sandboxes","icon":"box","pages":[{"title":"sandbox-docker","href":"/plugins/tai42/sandbox-docker"},{"title":"sandbox-local","href":"/plugins/tai42/sandbox-local"}]},{"group":"Channels","icon":"paper-plane","pages":[{"title":"channel-slack","href":"/plugins/tai42/channel-slack"},{"title":"channel-telegram","href":"/plugins/tai42/channel-telegram"},{"title":"channel-twilio","href":"/plugins/tai42/channel-twilio"},{"title":"channel-web","href":"/plugins/tai42/channel-web"},{"title":"channel-whatsapp","href":"/plugins/tai42/channel-whatsapp"}]},{"group":"Monitoring","icon":"chart-line","pages":[{"title":"monitoring-langfuse","href":"/plugins/tai42/monitoring-langfuse"}]},{"group":"Storage","icon":"database","pages":[{"title":"storage-github","href":"/plugins/tai42/storage-github"},{"title":"storage-local","href":"/plugins/tai42/storage-local"},{"title":"storage-s3","href":"/plugins/tai42/storage-s3"}]},{"group":"Webhook verifiers","icon":"bolt","pages":[{"title":"webhook-verifier-github","href":"/plugins/tai42/webhook-verifier-github"},{"title":"webhook-verifier-stripe","href":"/plugins/tai42/webhook-verifier-stripe"}]},{"group":"Connect outside systems","icon":"plug","pages":[{"title":"Atlassian","href":"/plugins/tai42/connector-atlassian"},{"title":"GitHub","href":"/plugins/tai42/connector-github"},{"title":"Google","href":"/plugins/tai42/connector-google"},{"title":"Slack","href":"/plugins/tai42/connector-slack"},{"title":"mcp-dynamic-postgres","href":"/plugins/tai42/mcp-dynamic-postgres"}]}]}]},{"tab":"Studio","pages":[{"title":"Studio","href":"/studio"}]},{"tab":"Reference","pages":[{"title":"Reference","href":"/reference/api"}]}]},"basePath":"","title":"TAI42 — the OS for AI tools","buildId":"dpl_GZsjphRpnhWkstV12jxWNcMHFyox","deploymentId":"dpl_GZsjphRpnhWkstV12jxWNcMHFyox","dynamics":[],"chunks":[]}