[{"data":1,"prerenderedAt":1977},["ShallowReactive",2],{"navigation":3,"/appdata/append":879,"/appdata/append-surround":1972},[4,22,45,115,156,187,214,235,264,295,318,361,389,418,436,470,491,534,548,571,632,670,693,757,850],{"title":5,"path":6,"stem":7,"children":8,"icon":11},"Introduction","/introduction","01.introduction/1.index",[9,12,17],{"title":10,"path":6,"stem":7,"icon":11},"What is Orkestia?","i-lucide-sparkles",{"title":13,"path":14,"stem":15,"icon":16},"Core Philosophy","/introduction/core-philosophy","01.introduction/2.core-philosophy","i-lucide-shield-check",{"title":18,"path":19,"stem":20,"icon":21},"Key Benefits","/introduction/key-benefits","01.introduction/3.key-benefits","i-lucide-trophy",{"title":23,"path":24,"stem":25,"children":26,"icon":29},"Getting Started","/getting-started","02.getting-started/1.index",[27,30,35,40],{"title":28,"path":24,"stem":25,"icon":29},"Quick Start","i-lucide-rocket",{"title":31,"path":32,"stem":33,"icon":34},"Architecture Overview","/getting-started/architecture-overview","02.getting-started/2.architecture-overview","i-lucide-layout-dashboard",{"title":36,"path":37,"stem":38,"icon":39},"Concepts at a Glance","/getting-started/concepts","02.getting-started/3.concepts","i-lucide-list",{"title":41,"path":42,"stem":43,"icon":44},"Connect an AI Assistant","/getting-started/connect-an-ai-assistant","02.getting-started/4.connect-an-ai-assistant","i-lucide-bot",{"title":46,"path":47,"stem":48,"children":49,"icon":51},"Core Concepts","/concepts","03.concepts/01.index",[50,52,57,62,67,71,76,81,86,91,96,100,105,110],{"title":46,"path":47,"stem":48,"icon":51},"i-lucide-book-open",{"title":53,"path":54,"stem":55,"icon":56},"Workflows","/concepts/workflows","03.concepts/02.workflows","i-lucide-workflow",{"title":58,"path":59,"stem":60,"icon":61},"DGI — Dialog Generative Interface","/concepts/dgi","03.concepts/03.dgi","i-lucide-brain",{"title":63,"path":64,"stem":65,"icon":66},"Staff & AI Workforce Governance","/concepts/staff-governance","03.concepts/04.staff-governance","i-lucide-users-round",{"title":68,"path":69,"stem":70,"icon":44},"Agents — the execution substrate","/concepts/agents-platform","03.concepts/05.agents-platform",{"title":72,"path":73,"stem":74,"icon":75},"Runners & Execution Environments","/concepts/runners","03.concepts/06.runners","i-lucide-server-cog",{"title":77,"path":78,"stem":79,"icon":80},"Lumen Observability","/concepts/lumen","03.concepts/07.lumen","i-lucide-activity",{"title":82,"path":83,"stem":84,"icon":85},"Identity & Multi-Tenancy","/concepts/identity-multi-tenancy","03.concepts/08.identity-multi-tenancy","i-lucide-users",{"title":87,"path":88,"stem":89,"icon":90},"Billing, Pricing & Seats","/concepts/billing-and-seats","03.concepts/09.billing-and-seats","i-lucide-credit-card",{"title":92,"path":93,"stem":94,"icon":95},"App Data","/concepts/appdata","03.concepts/10.appdata","i-lucide-database",{"title":97,"path":98,"stem":99,"icon":61},"Engram","/concepts/engram","03.concepts/11.engram",{"title":101,"path":102,"stem":103,"icon":104},"DevKit","/concepts/devkit","03.concepts/12.devkit","i-lucide-terminal",{"title":106,"path":107,"stem":108,"icon":109},"App Host","/concepts/app-host","03.concepts/13.app-host","i-lucide-globe",{"title":111,"path":112,"stem":113,"icon":114},"Agent Exchange","/concepts/agent-exchange","03.concepts/14.agent-exchange","i-lucide-landmark",{"title":116,"path":117,"stem":118,"children":119,"icon":121},"Guides","/guides","04.guides/1.index",[120,122,127,132,137,142,147,151],{"title":116,"path":117,"stem":118,"icon":121},"i-lucide-compass",{"title":123,"path":124,"stem":125,"icon":126},"Building with DGI","/guides/building-with-dgi","04.guides/2.building-with-dgi","i-lucide-brain-circuit",{"title":128,"path":129,"stem":130,"icon":131},"Creating & Exposing Virtual Workflows","/guides/virtual-workflows","04.guides/4.virtual-workflows","i-lucide-blocks",{"title":133,"path":134,"stem":135,"icon":136},"Runner Management & Provisioning","/guides/runner-management","04.guides/5.runner-management","i-lucide-server",{"title":138,"path":139,"stem":140,"icon":141},"Security & Compliance","/guides/security-and-compliance","04.guides/7.security-and-compliance","i-lucide-shield",{"title":143,"path":144,"stem":145,"icon":146},"Tickets & Software Delivery","/guides/tickets-and-software-delivery","04.guides/8.tickets-and-software-delivery","i-lucide-ticket",{"title":148,"path":149,"stem":150},"Orkestia for AI-driven cloud infrastructure automation","/guides/cloud-automation-alternatives","04.guides/9.cloud-automation-alternatives",{"title":152,"path":153,"stem":154,"icon":155},"Typed decisions with TypeSafe","/guides/typed-decisions-with-typesafe","04.guides/9.typed-decisions-with-typesafe","i-lucide-git-branch",{"title":157,"path":158,"stem":159,"children":160,"icon":162},"Reference","/reference","05.reference/1.index",[161,163,168,173,177,182],{"title":157,"path":158,"stem":159,"icon":162},"i-lucide-library",{"title":164,"path":165,"stem":166,"icon":167},"Workflow Types & Registry","/reference/workflow-types-registry","05.reference/2.workflow-types-registry","i-lucide-list-tree",{"title":169,"path":170,"stem":171,"icon":172},"MCP Integration","/reference/mcp-integration","05.reference/3.mcp-integration","i-lucide-plug-zap",{"title":174,"path":175,"stem":176,"icon":104},"API & Tooling","/reference/api-tooling","05.reference/4.api-tooling",{"title":178,"path":179,"stem":180,"icon":181},"Integrations Catalog","/reference/integrations-catalog","05.reference/6.integrations-catalog","i-lucide-plug",{"title":183,"path":184,"stem":185,"icon":186},"Platform Services","/reference/platform-services","05.reference/7.platform-services","i-lucide-boxes",{"title":188,"path":189,"stem":190,"children":191,"icon":193},"Advanced Topics","/advanced","06.advanced/1.index",[192,194,199,204,209],{"title":188,"path":189,"stem":190,"icon":193},"i-lucide-flask-conical",{"title":195,"path":196,"stem":197,"icon":198},"Hybrid AI + Deterministic Execution","/advanced/hybrid-execution-model","06.advanced/2.hybrid-execution-model","i-lucide-git-merge",{"title":200,"path":201,"stem":202,"icon":203},"Drift Detection & Self-Healing","/advanced/drift-detection-self-healing","06.advanced/3.drift-detection-self-healing","i-lucide-heart-pulse",{"title":205,"path":206,"stem":207,"icon":208},"Governance & Approvals","/advanced/governance-and-approvals","06.advanced/4.governance-and-approvals","i-lucide-scale",{"title":210,"path":211,"stem":212,"icon":213},"Cost & Performance Optimization","/advanced/cost-and-performance","06.advanced/5.cost-and-performance","i-lucide-zap",{"title":215,"path":216,"stem":217,"children":218,"icon":220},"Operations","/operations","07.operations/1.index",[219,221,225,230],{"title":215,"path":216,"stem":217,"icon":220},"i-lucide-settings-2",{"title":222,"path":223,"stem":224,"icon":186},"Deployment Models","/operations/deployment-models","07.operations/2.deployment-models",{"title":226,"path":227,"stem":228,"icon":229},"Monitoring & Debugging","/operations/monitoring-and-debugging","07.operations/3.monitoring-and-debugging","i-lucide-bug",{"title":231,"path":232,"stem":233,"icon":234},"Best Practices","/operations/best-practices","07.operations/4.best-practices","i-lucide-check-check",{"title":236,"path":237,"stem":238,"children":239,"icon":241},"AWS Connections","/aws-connections","08.aws-connections/1.index",[240,242,245,250,255,260],{"title":236,"path":237,"stem":238,"icon":241},"i-simple-icons-amazonaws",{"title":23,"path":243,"stem":244,"icon":29},"/aws-connections/getting-started","08.aws-connections/2.getting-started",{"title":246,"path":247,"stem":248,"icon":249},"Setup Methods","/aws-connections/setup-methods","08.aws-connections/3.setup-methods","i-lucide-wrench",{"title":251,"path":252,"stem":253,"icon":254},"Managing Connections","/aws-connections/managing-connections","08.aws-connections/4.managing-connections","i-lucide-settings",{"title":256,"path":257,"stem":258,"icon":259},"Security Best Practices","/aws-connections/security-best-practices","08.aws-connections/5.security-best-practices","i-lucide-lock",{"title":261,"path":262,"stem":263,"icon":229},"Troubleshooting","/aws-connections/troubleshooting","08.aws-connections/6.troubleshooting",{"title":265,"path":266,"stem":267,"children":268,"icon":270},"Cloud Connections","/cloud-connections","09.cloud-connections/1.index",[269,271,276,281,286,291],{"title":265,"path":266,"stem":267,"icon":270},"i-lucide-cable",{"title":272,"path":273,"stem":274,"icon":275},"Google Cloud (GCP)","/cloud-connections/gcp","09.cloud-connections/2.gcp","i-simple-icons-googlecloud",{"title":277,"path":278,"stem":279,"icon":280},"Microsoft Azure","/cloud-connections/azure","09.cloud-connections/3.azure","i-simple-icons-microsoftazure",{"title":282,"path":283,"stem":284,"icon":285},"Magalu Cloud","/cloud-connections/magalu","09.cloud-connections/4.magalu","i-lucide-cloud",{"title":287,"path":288,"stem":289,"icon":290},"Kubernetes","/cloud-connections/kubernetes","09.cloud-connections/5.kubernetes","i-simple-icons-kubernetes",{"title":292,"path":293,"stem":294,"icon":208},"TypeSafe","/cloud-connections/typesafe","09.cloud-connections/6.typesafe",{"title":296,"path":297,"stem":298,"children":299,"icon":136},"DNS Providers","/dns-providers","10.dns-providers/1.index",[300,302,305,308,311,315],{"title":301,"path":297,"stem":298,"icon":136},"DNS Provider Connections",{"title":23,"path":303,"stem":304,"icon":29},"/dns-providers/getting-started","10.dns-providers/2.getting-started",{"title":246,"path":306,"stem":307,"icon":249},"/dns-providers/setup-methods","10.dns-providers/3.setup-methods",{"title":251,"path":309,"stem":310,"icon":254},"/dns-providers/managing-connections","10.dns-providers/4.managing-connections",{"title":312,"path":313,"stem":314,"icon":39},"Zones and Records","/dns-providers/zones-and-records","10.dns-providers/5.zones-and-records",{"title":261,"path":316,"stem":317,"icon":229},"/dns-providers/troubleshooting","10.dns-providers/6.troubleshooting",{"title":319,"path":320,"stem":321,"children":322,"icon":29},"Cloud Deploy","/cloud-deploy","11.cloud-deploy/01.index",[323,324,327,332,336,341,345,349,354,358],{"title":319,"path":320,"stem":321,"icon":29},{"title":23,"path":325,"stem":326,"icon":29},"/cloud-deploy/getting-started","11.cloud-deploy/02.getting-started",{"title":328,"path":329,"stem":330,"icon":331},"Creating a Site","/cloud-deploy/creating-a-site","11.cloud-deploy/03.creating-a-site","i-lucide-plus-circle",{"title":333,"path":334,"stem":335,"icon":34},"Site Overview and Deployments","/cloud-deploy/site-overview","11.cloud-deploy/04.site-overview",{"title":337,"path":338,"stem":339,"icon":340},"Deployment Progress and Success","/cloud-deploy/deployment-progress","11.cloud-deploy/05.deployment-progress","i-lucide-loader",{"title":342,"path":343,"stem":344,"icon":254},"Settings","/cloud-deploy/settings","11.cloud-deploy/06.settings",{"title":346,"path":347,"stem":348,"icon":109},"Custom Domains","/cloud-deploy/custom-domains","11.cloud-deploy/07.custom-domains",{"title":350,"path":351,"stem":352,"icon":353},"Resources, Releases, and Danger Zone","/cloud-deploy/resources-releases","11.cloud-deploy/08.resources-releases","i-lucide-package",{"title":355,"path":356,"stem":357,"icon":141},"Admin Dashboard","/cloud-deploy/admin-dashboard","11.cloud-deploy/09.admin-dashboard",{"title":261,"path":359,"stem":360,"icon":229},"/cloud-deploy/troubleshooting","11.cloud-deploy/10.troubleshooting",{"title":362,"path":363,"stem":364,"children":365,"icon":368},"User Onboarding","/user-onboarding","12.user-onboarding/1.index",[366,369,372,377,382,386],{"title":367,"path":363,"stem":364,"icon":368},"User Creation and Onboarding","i-lucide-user-plus",{"title":23,"path":370,"stem":371,"icon":29},"/user-onboarding/getting-started","12.user-onboarding/2.getting-started",{"title":373,"path":374,"stem":375,"icon":376},"Creating Your Organization","/user-onboarding/onboarding","12.user-onboarding/3.onboarding","i-lucide-building-2",{"title":378,"path":379,"stem":380,"icon":381},"Invitations","/user-onboarding/invitations","12.user-onboarding/4.invitations","i-lucide-mail",{"title":383,"path":384,"stem":385,"icon":254},"Managing Your Account","/user-onboarding/managing-account","12.user-onboarding/5.managing-account",{"title":261,"path":387,"stem":388,"icon":229},"/user-onboarding/troubleshooting","12.user-onboarding/6.troubleshooting",{"title":342,"path":390,"stem":391,"children":392,"icon":394},"/settings","13.settings/1.index",[393,395,400,404,409,413],{"title":342,"path":390,"stem":391,"icon":394},"i-lucide-sliders-horizontal",{"title":396,"path":397,"stem":398,"icon":399},"General Settings","/settings/general","13.settings/2.general","i-lucide-user",{"title":401,"path":402,"stem":403,"icon":85},"Members Settings","/settings/members","13.settings/3.members",{"title":405,"path":406,"stem":407,"icon":408},"Notifications Settings","/settings/notifications","13.settings/4.notifications","i-lucide-bell",{"title":410,"path":411,"stem":412,"icon":141},"Security Settings","/settings/security","13.settings/5.security",{"title":414,"path":415,"stem":416,"icon":417},"Signing Keys","/settings/keys","13.settings/6.keys","i-lucide-key-round",{"title":419,"path":420,"stem":421,"children":422,"icon":29},"App Enablement","/app-enablement","14.app-enablement/1.index",[423,424,428,432],{"title":419,"path":420,"stem":421,"icon":29},{"title":425,"path":426,"stem":427,"icon":417},"Sign in with Orkestia","/app-enablement/sign-in-with-orkestia","14.app-enablement/2.sign-in-with-orkestia",{"title":429,"path":430,"stem":431,"icon":95},"End-user data","/app-enablement/end-user-data","14.app-enablement/3.end-user-data",{"title":433,"path":434,"stem":435,"icon":131},"Compositions — use, invoke, share","/app-enablement/compositions","14.app-enablement/4.compositions",{"title":437,"path":438,"stem":439,"children":440,"icon":80},"Lumen","/lumen","15.lumen/1.index",[441,442,447,452,457,461,465],{"title":437,"path":438,"stem":439,"icon":80},{"title":443,"path":444,"stem":445,"icon":446},"Enable Lumen","/lumen/enable","15.lumen/2.enable","i-lucide-power",{"title":448,"path":449,"stem":450,"icon":451},"Send data","/lumen/send-data","15.lumen/3.send-data","i-lucide-upload",{"title":453,"path":454,"stem":455,"icon":456},"Collector","/lumen/collector","15.lumen/4.collector","i-lucide-container",{"title":458,"path":459,"stem":460,"icon":34},"Use Lumen","/lumen/observe","15.lumen/5.observe",{"title":462,"path":463,"stem":464,"icon":44},"Lumen MCP","/lumen/mcp","15.lumen/6.mcp",{"title":466,"path":467,"stem":468,"icon":469},"Query API","/lumen/query-api","15.lumen/7.query-api","i-lucide-search",{"title":471,"path":472,"stem":473,"children":474,"icon":476},"SDKs","/sdks","16.sdks/1.index",[475,477,482,487],{"title":471,"path":472,"stem":473,"icon":476},"i-lucide-code",{"title":478,"path":479,"stem":480,"icon":481},"Workflows SDK — Node / TypeScript","/sdks/workflows-nodejs","16.sdks/2.workflows-nodejs","i-lucide-file-ts",{"title":483,"path":484,"stem":485,"icon":486},"Workflows SDK — Python","/sdks/workflows-python","16.sdks/3.workflows-python","i-simple-icons-python",{"title":488,"path":489,"stem":490,"icon":417},"Auth SDK — Sign in with Orkestia","/sdks/auth","16.sdks/4.auth",{"title":92,"path":492,"stem":493,"children":494,"icon":95},"/appdata","17.appdata/1.index",[495,496,501,506,510,515,520,525,530],{"title":92,"path":492,"stem":493,"icon":95},{"title":497,"path":498,"stem":499,"icon":500},"Declare structures","/appdata/declare","17.appdata/2.declare","i-lucide-table",{"title":502,"path":503,"stem":504,"icon":505},"Records & Data API","/appdata/data-api","17.appdata/3.data-api","i-lucide-rows-3",{"title":507,"path":508,"stem":509,"icon":376},"Ownership & workspaces","/appdata/ownership","17.appdata/4.ownership",{"title":511,"path":512,"stem":513,"icon":514},"Expose App Data to end-users","/appdata/expose","17.appdata/5.expose","i-lucide-app-window",{"title":516,"path":517,"stem":518,"icon":519},"PostgREST HTTP","/appdata/postgrest","17.appdata/6.postgrest","i-lucide-unplug",{"title":521,"path":522,"stem":523,"icon":524},"Ordered append","/appdata/append","17.appdata/7.append","i-lucide-list-ordered",{"title":526,"path":527,"stem":528,"icon":529},"Databases and instances","/appdata/instances","17.appdata/8.instances","i-lucide-hard-drive",{"title":531,"path":532,"stem":533,"icon":104},"Query console and SQL","/appdata/query","17.appdata/9.query",{"title":97,"path":535,"stem":536,"children":537,"icon":61},"/engram","18.engram/1.index",[538,539,543],{"title":97,"path":535,"stem":536,"icon":61},{"title":540,"path":541,"stem":542,"icon":155},"Write & recall","/engram/write-recall","18.engram/2.write-recall",{"title":544,"path":545,"stem":546,"icon":547},"Field & feed","/engram/agent-memory","18.engram/3.agent-memory","i-lucide-radio",{"title":101,"path":549,"stem":550,"children":551,"icon":104},"/devkit","19.devkit/1.index",[552,553,558,562,567],{"title":101,"path":549,"stem":550,"icon":104},{"title":554,"path":555,"stem":556,"icon":557},"Install DevKit","/devkit/install","19.devkit/2.install","i-lucide-download",{"title":559,"path":560,"stem":561,"icon":519},"Hook redirect","/devkit/hooks","19.devkit/3.hooks",{"title":563,"path":564,"stem":565,"icon":566},"Local coding runner","/devkit/local-runner","19.devkit/4.local-runner","i-lucide-cpu",{"title":568,"path":569,"stem":570,"icon":131},"Compositions from DevKit","/devkit/compositions","19.devkit/5.compositions",{"title":572,"path":573,"stem":574,"children":575,"icon":44},"Staff & Agents","/staff-and-agents","20.staff-and-agents/01.index",[576,577,582,586,590,594,598,602,606,611,615,620,625,629],{"title":572,"path":573,"stem":574,"icon":44},{"title":578,"path":579,"stem":580,"icon":581},"Prerequisites","/staff-and-agents/prerequisites","20.staff-and-agents/02.prerequisites","i-lucide-list-checks",{"title":583,"path":584,"stem":585,"icon":368},"Hire an actor","/staff-and-agents/hire-an-actor","20.staff-and-agents/03.hire-an-actor",{"title":587,"path":588,"stem":589,"icon":34},"Console","/staff-and-agents/console","20.staff-and-agents/04.console",{"title":591,"path":592,"stem":593,"icon":11},"Configs, skills, and MCP","/staff-and-agents/configs-skills-mcp","20.staff-and-agents/05.configs-skills-mcp",{"title":595,"path":596,"stem":597,"icon":136},"Agent runner groups","/staff-and-agents/runner-groups","20.staff-and-agents/06.runner-groups",{"title":599,"path":600,"stem":601,"icon":16},"Governance","/staff-and-agents/governance","20.staff-and-agents/07.governance",{"title":603,"path":604,"stem":605,"icon":417},"Identity and tokens","/staff-and-agents/identity","20.staff-and-agents/08.identity",{"title":607,"path":608,"stem":609,"icon":610},"Memory and cost","/staff-and-agents/memory-and-cost","20.staff-and-agents/09.memory-and-cost","i-lucide-wallet",{"title":612,"path":613,"stem":614,"icon":155},"Coding agents","/staff-and-agents/coding-agents","20.staff-and-agents/10.coding-agents",{"title":616,"path":617,"stem":618,"icon":619},"Wire a repository for coding agents","/staff-and-agents/wire-a-repository","20.staff-and-agents/11.wire-a-repository","i-lucide-link",{"title":621,"path":622,"stem":623,"icon":624},"Run a ticket end to end","/staff-and-agents/run-a-ticket","20.staff-and-agents/12.run-a-ticket","i-lucide-play",{"title":626,"path":627,"stem":628,"icon":66},"Build a product team of actors","/staff-and-agents/build-a-product-team","20.staff-and-agents/13.build-a-product-team",{"title":261,"path":630,"stem":631,"icon":249},"/staff-and-agents/troubleshooting","20.staff-and-agents/14.troubleshooting",{"title":106,"path":633,"stem":634,"children":635,"icon":109},"/app-host","21.app-host/1.index",[636,637,641,644,649,653,658,662,666],{"title":106,"path":633,"stem":634,"icon":109},{"title":638,"path":639,"stem":640,"icon":514},"Your app and site","/app-host/your-app","21.app-host/2.your-app",{"title":92,"path":642,"stem":643,"icon":95},"/app-host/app-data","21.app-host/3.app-data",{"title":645,"path":646,"stem":647,"icon":648},"Website and process","/app-host/hosting","21.app-host/4.hosting","i-lucide-cloud-upload",{"title":650,"path":651,"stem":652,"icon":547},"Buzz","/app-host/buzz","21.app-host/5.buzz",{"title":654,"path":655,"stem":656,"icon":657},"Files","/app-host/files","21.app-host/6.files","i-lucide-folder",{"title":659,"path":660,"stem":661,"icon":109},"Your own domain","/app-host/your-domain","21.app-host/7.your-domain",{"title":663,"path":664,"stem":665,"icon":229},"Troubleshooting App Host","/app-host/troubleshooting","21.app-host/8.troubleshooting",{"title":667,"path":668,"stem":669,"icon":417},"Signing keys","/app-host/signing-keys","21.app-host/9.signing-keys",{"title":111,"path":671,"stem":672,"children":673,"icon":114},"/agent-exchange","22.agent-exchange/01.index",[674,675,678,682,686,690],{"title":111,"path":671,"stem":672,"icon":114},{"title":583,"path":676,"stem":677,"icon":368},"/agent-exchange/hire","22.agent-exchange/02.hire",{"title":679,"path":680,"stem":681,"icon":208},"List an actor","/agent-exchange/list","22.agent-exchange/03.list",{"title":683,"path":684,"stem":685,"icon":104},"Invoke & leases","/agent-exchange/invoke","22.agent-exchange/04.invoke",{"title":687,"path":688,"stem":689,"icon":141},"Settlement & trust","/agent-exchange/settlement","22.agent-exchange/05.settlement",{"title":53,"path":691,"stem":692,"icon":56},"/agent-exchange/workflows","22.agent-exchange/06.workflows",{"title":694,"path":695,"stem":696,"children":697,"icon":75},"Runners","/runners","23.runners/1.index",[698,700,704,709,713,717,721,726,730,734,738,741,745,749,753],{"title":699,"path":695,"stem":696,"icon":75},"Runner groups",{"title":701,"path":702,"stem":703,"icon":275},"Cloud Run","/runners/cloud-run","23.runners/10.cloud-run",{"title":705,"path":706,"stem":707,"icon":708},"DigitalOcean App Job","/runners/do-app-job","23.runners/11.do-app-job","i-simple-icons-digitalocean",{"title":710,"path":711,"stem":712,"icon":708},"DigitalOcean Droplet","/runners/do-droplet","23.runners/12.do-droplet",{"title":714,"path":715,"stem":716,"icon":285},"Magalu Cloud VM","/runners/magalu-vm","23.runners/13.magalu-vm",{"title":101,"path":718,"stem":719,"icon":720},"/runners/devkit","23.runners/14.devkit","i-lucide-laptop",{"title":722,"path":723,"stem":724,"icon":725},"Purposes & integrations","/runners/purposes","23.runners/16.purposes","i-lucide-layers",{"title":727,"path":728,"stem":729,"icon":241},"Fargate","/runners/fargate","23.runners/2.fargate",{"title":731,"path":732,"stem":733,"icon":241},"EC2 Auto Scaling","/runners/ec2-auto-scaling","23.runners/3.ec2-auto-scaling",{"title":735,"path":736,"stem":737,"icon":241},"EC2 VM","/runners/ec2-vm","23.runners/4.ec2-vm",{"title":287,"path":739,"stem":740,"icon":290},"/runners/kubernetes","23.runners/5.kubernetes",{"title":742,"path":743,"stem":744,"icon":280},"Azure Container Apps","/runners/azure-container-apps","23.runners/6.azure-container-apps",{"title":746,"path":747,"stem":748,"icon":280},"Azure VMSS","/runners/azure-vmss","23.runners/7.azure-vmss",{"title":750,"path":751,"stem":752,"icon":280},"Azure VM","/runners/azure-vm","23.runners/8.azure-vm",{"title":754,"path":755,"stem":756,"icon":275},"GCE","/runners/gce","23.runners/9.gce",{"title":758,"path":759,"stem":760,"children":761,"icon":763},"Chat","/chat","24.chat/01.index",[762,764,768,773,777,782,787,791,796,800,805,810,814,819,824,828,832,836,840,845],{"title":758,"path":759,"stem":760,"icon":763},"i-lucide-messages-square",{"title":765,"path":766,"stem":767,"icon":446},"Enable and publish","/chat/enable-and-publish","24.chat/02.enable-and-publish",{"title":769,"path":770,"stem":771,"icon":772},"Theme and customization","/chat/theme-and-customization","24.chat/03.theme-and-customization","i-lucide-palette",{"title":774,"path":775,"stem":776,"icon":85},"Members and moderation","/chat/members-and-moderation","24.chat/04.members-and-moderation",{"title":778,"path":779,"stem":780,"icon":781},"Channels","/chat/channels","24.chat/05.channels","i-lucide-hash",{"title":783,"path":784,"stem":785,"icon":786},"Using the chat","/chat/using-the-chat","24.chat/06.using-the-chat","i-lucide-message-circle",{"title":788,"path":789,"stem":790,"icon":44},"Actors in chat","/chat/actors-in-chat","24.chat/07.actors-in-chat",{"title":792,"path":793,"stem":794,"icon":795},"Internal support actor","/chat/internal-support-actor","24.chat/08.internal-support-actor","i-lucide-life-buoy",{"title":797,"path":798,"stem":799,"icon":104},"API and console","/chat/api-and-console","24.chat/09.api-and-console",{"title":801,"path":802,"stem":803,"icon":804},"Limits","/chat/limits","24.chat/10.limits","i-lucide-triangle-alert",{"title":806,"path":807,"stem":808,"icon":809},"Structured chat with DGI","/chat/structured-chat","24.chat/11.structured-chat","i-lucide-layout-list",{"title":811,"path":812,"stem":813,"icon":109},"Option A: hosted chat with DGI","/chat/option-a-hosted-chat","24.chat/12.option-a-hosted-chat",{"title":815,"path":816,"stem":817,"icon":818},"Option B: embed the chat component","/chat/option-b-embed-component","24.chat/13.option-b-embed-component","i-lucide-component",{"title":820,"path":821,"stem":822,"icon":823},"Option C: custom client (wire contract)","/chat/option-c-custom-client","24.chat/14.option-c-custom-client","i-lucide-braces",{"title":825,"path":826,"stem":827,"icon":394},"Responder configuration reference","/chat/responder-reference","24.chat/15.responder-reference",{"title":829,"path":830,"stem":831,"icon":547},"Cards, live updates and proactive posts","/chat/cards-live-and-proactive","24.chat/16.cards-live-and-proactive",{"title":833,"path":834,"stem":835,"icon":16},"Structured chat security model","/chat/structured-chat-security","24.chat/17.structured-chat-security",{"title":837,"path":838,"stem":839,"icon":181},"Option D: any app or API (dgi.chat)","/chat/option-d-chat-api","24.chat/18.option-d-chat-api",{"title":841,"path":842,"stem":843,"icon":844},"Card catalog","/chat/card-catalog","24.chat/19.card-catalog","i-lucide-layout-grid",{"title":846,"path":847,"stem":848,"icon":849},"Living Surfaces","/chat/living-surfaces","24.chat/20.living-surfaces","i-lucide-sprout",{"title":851,"path":852,"stem":853,"children":854,"icon":61},"DGI","/dgi","25.dgi/1.index",[855,857,862,866,870,874],{"title":856,"path":852,"stem":853,"icon":61},"What is DGI",{"title":858,"path":859,"stem":860,"icon":861},"How DGI works","/dgi/how-it-works","25.dgi/2.how-it-works","i-lucide-cog",{"title":863,"path":864,"stem":865,"icon":844},"Interfaces","/dgi/interfaces","25.dgi/3.interfaces",{"title":867,"path":868,"stem":869,"icon":29},"Quickstart","/dgi/quickstart","25.dgi/4.quickstart",{"title":871,"path":872,"stem":873,"icon":16},"Trust and safety","/dgi/trust-and-safety","25.dgi/5.trust-and-safety",{"title":875,"path":876,"stem":877,"icon":878},"FAQ","/dgi/faq","25.dgi/6.faq","i-lucide-circle-help",{"id":880,"title":521,"body":881,"description":1965,"extension":1966,"links":1967,"meta":1968,"navigation":1969,"path":522,"seo":1970,"stem":523,"__hash__":1971},"docs/17.appdata/7.append.md",{"type":882,"value":883,"toc":1953},"minimark",[884,893,912,934,942,947,1239,1307,1317,1321,1324,1384,1391,1395,1427,1441,1451,1455,1458,1465,1472,1476,1483,1497,1500,1504,1512,1557,1566,1581,1588,1595,1605,1861,1885,1899,1910,1914,1936,1940,1949],[885,886,887,888,892],"p",{},"Some tables are a ",[889,890,891],"strong",{},"log",", not a set: chat messages, run events, an outbox. They need three things a plain insert cannot give you.",[885,894,895,896,899,900,903,904,907,908,911],{},"This is a ",[889,897,898],{},"platform data primitive"," (compiler + trigger + membership RLS). It is ",[889,901,902],{},"not"," ",[905,906,650],"a",{"href":651}," and not a hosted Chat Relay. Buzz is a Nostr websocket on another hostname. If your product stores conversations, declare them here, ",[905,909,910],{"href":512},"expose"," the virtuals, and optionally also turn on Buzz for Nostr clients.",[913,914,915,922,928],"ol",{},[916,917,918,921],"li",{},[889,919,920],{},"A position the caller cannot choose."," Two writers must never claim the same slot, and a client must not be able to place itself anywhere it likes.",[916,923,924,927],{},[889,925,926],{},"A replay that is exactly once."," A response lost after the commit must be recoverable by retrying the same request, without writing a second row.",[916,929,930,933],{},[889,931,932],{},"An order a consumer can trust."," A reader that has advanced past position 41 must never be shown a 39 afterwards.",[885,935,936,937,941],{},"Declare an ",[938,939,940],"code",{},"append"," policy on the table and the compiler emits all three.",[943,944,946],"h2",{"id":945},"declare","Declare",[948,949,954],"pre",{"className":950,"code":951,"language":952,"meta":953,"style":953},"language-yaml shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","databases:\n  - slug: relay\n    tables:\n      - slug: conversation_messages\n        append:\n          position_field: sequence\n          scope: [conversation_id]\n          idempotency:\n            key_fields: [request_id]\n            fingerprint_field: payload_hash\n        fields:\n          - { slug: conversation_id, type: uuid, required: true }\n          - { slug: request_id, type: text, required: true }\n          - { slug: payload_hash, type: text }\n          - { slug: sequence, type: number, required: true }\n          - { slug: content, type: text }\n","yaml","",[938,955,956,969,985,993,1006,1014,1025,1042,1050,1065,1076,1084,1125,1158,1182,1215],{"__ignoreMap":953},[957,958,961,965],"span",{"class":959,"line":960},"line",1,[957,962,964],{"class":963},"swJcz","databases",[957,966,968],{"class":967},"sMK4o",":\n",[957,970,972,975,978,981],{"class":959,"line":971},2,[957,973,974],{"class":967},"  -",[957,976,977],{"class":963}," slug",[957,979,980],{"class":967},":",[957,982,984],{"class":983},"sfazB"," relay\n",[957,986,988,991],{"class":959,"line":987},3,[957,989,990],{"class":963},"    tables",[957,992,968],{"class":967},[957,994,996,999,1001,1003],{"class":959,"line":995},4,[957,997,998],{"class":967},"      -",[957,1000,977],{"class":963},[957,1002,980],{"class":967},[957,1004,1005],{"class":983}," conversation_messages\n",[957,1007,1009,1012],{"class":959,"line":1008},5,[957,1010,1011],{"class":963},"        append",[957,1013,968],{"class":967},[957,1015,1017,1020,1022],{"class":959,"line":1016},6,[957,1018,1019],{"class":963},"          position_field",[957,1021,980],{"class":967},[957,1023,1024],{"class":983}," sequence\n",[957,1026,1028,1031,1033,1036,1039],{"class":959,"line":1027},7,[957,1029,1030],{"class":963},"          scope",[957,1032,980],{"class":967},[957,1034,1035],{"class":967}," [",[957,1037,1038],{"class":983},"conversation_id",[957,1040,1041],{"class":967},"]\n",[957,1043,1045,1048],{"class":959,"line":1044},8,[957,1046,1047],{"class":963},"          idempotency",[957,1049,968],{"class":967},[957,1051,1053,1056,1058,1060,1063],{"class":959,"line":1052},9,[957,1054,1055],{"class":963},"            key_fields",[957,1057,980],{"class":967},[957,1059,1035],{"class":967},[957,1061,1062],{"class":983},"request_id",[957,1064,1041],{"class":967},[957,1066,1068,1071,1073],{"class":959,"line":1067},10,[957,1069,1070],{"class":963},"            fingerprint_field",[957,1072,980],{"class":967},[957,1074,1075],{"class":983}," payload_hash\n",[957,1077,1079,1082],{"class":959,"line":1078},11,[957,1080,1081],{"class":963},"        fields",[957,1083,968],{"class":967},[957,1085,1087,1090,1093,1095,1097,1100,1103,1106,1108,1111,1113,1116,1118,1122],{"class":959,"line":1086},12,[957,1088,1089],{"class":967},"          -",[957,1091,1092],{"class":967}," {",[957,1094,977],{"class":963},[957,1096,980],{"class":967},[957,1098,1099],{"class":983}," conversation_id",[957,1101,1102],{"class":967},",",[957,1104,1105],{"class":963}," type",[957,1107,980],{"class":967},[957,1109,1110],{"class":983}," uuid",[957,1112,1102],{"class":967},[957,1114,1115],{"class":963}," required",[957,1117,980],{"class":967},[957,1119,1121],{"class":1120},"sfNiH"," true",[957,1123,1124],{"class":967}," }\n",[957,1126,1128,1130,1132,1134,1136,1139,1141,1143,1145,1148,1150,1152,1154,1156],{"class":959,"line":1127},13,[957,1129,1089],{"class":967},[957,1131,1092],{"class":967},[957,1133,977],{"class":963},[957,1135,980],{"class":967},[957,1137,1138],{"class":983}," request_id",[957,1140,1102],{"class":967},[957,1142,1105],{"class":963},[957,1144,980],{"class":967},[957,1146,1147],{"class":983}," text",[957,1149,1102],{"class":967},[957,1151,1115],{"class":963},[957,1153,980],{"class":967},[957,1155,1121],{"class":1120},[957,1157,1124],{"class":967},[957,1159,1161,1163,1165,1167,1169,1172,1174,1176,1178,1180],{"class":959,"line":1160},14,[957,1162,1089],{"class":967},[957,1164,1092],{"class":967},[957,1166,977],{"class":963},[957,1168,980],{"class":967},[957,1170,1171],{"class":983}," payload_hash",[957,1173,1102],{"class":967},[957,1175,1105],{"class":963},[957,1177,980],{"class":967},[957,1179,1147],{"class":983},[957,1181,1124],{"class":967},[957,1183,1185,1187,1189,1191,1193,1196,1198,1200,1202,1205,1207,1209,1211,1213],{"class":959,"line":1184},15,[957,1186,1089],{"class":967},[957,1188,1092],{"class":967},[957,1190,977],{"class":963},[957,1192,980],{"class":967},[957,1194,1195],{"class":983}," sequence",[957,1197,1102],{"class":967},[957,1199,1105],{"class":963},[957,1201,980],{"class":967},[957,1203,1204],{"class":983}," number",[957,1206,1102],{"class":967},[957,1208,1115],{"class":963},[957,1210,980],{"class":967},[957,1212,1121],{"class":1120},[957,1214,1124],{"class":967},[957,1216,1218,1220,1222,1224,1226,1229,1231,1233,1235,1237],{"class":959,"line":1217},16,[957,1219,1089],{"class":967},[957,1221,1092],{"class":967},[957,1223,977],{"class":963},[957,1225,980],{"class":967},[957,1227,1228],{"class":983}," content",[957,1230,1102],{"class":967},[957,1232,1105],{"class":963},[957,1234,980],{"class":967},[957,1236,1147],{"class":983},[957,1238,1124],{"class":967},[1240,1241,1242,1255],"table",{},[1243,1244,1245],"thead",{},[1246,1247,1248,1252],"tr",{},[1249,1250,1251],"th",{},"Key",[1249,1253,1254],{},"Meaning",[1256,1257,1258,1269,1283,1293],"tbody",{},[1246,1259,1260,1266],{},[1261,1262,1263],"td",{},[938,1264,1265],{},"position_field",[1261,1267,1268],{},"The column the server allocates. Whatever the caller sends here is discarded.",[1246,1270,1271,1276],{},[1261,1272,1273],{},[938,1274,1275],{},"scope",[1261,1277,1278,1279,1282],{},"The fields the order is counted ",[889,1280,1281],{},"within"," — one counter per conversation, thread or stream, so positions stay dense per scope rather than per table.",[1246,1284,1285,1290],{},[1261,1286,1287],{},[938,1288,1289],{},"idempotency.key_fields",[1261,1291,1292],{},"What identifies a repeat of the same request.",[1246,1294,1295,1300],{},[1261,1296,1297],{},[938,1298,1299],{},"idempotency.fingerprint_field",[1261,1301,1302,1303,1306],{},"The payload digest. Same key + same fingerprint replays; same key + ",[889,1304,1305],{},"different"," payload is a conflict, not a silent overwrite.",[885,1308,1309,1310,1313,1314,1316],{},"Apply it the same way as any other structure change, with ",[938,1311,1312],{},"data.appdata.structure.apply",". See ",[905,1315,497],{"href":498},".",[943,1318,1320],{"id":1319},"what-you-get","What you get",[885,1322,1323],{},"Applying the policy emits, per table:",[1325,1326,1327,1334,1340,1346,1355,1367],"ul",{},[916,1328,1329,1330,1333],{},"a ",[889,1331,1332],{},"counter relation"," keyed by the scope columns;",[916,1335,1336,1339],{},[938,1337,1338],{},"UNIQUE (scope…, position)"," — the order invariant;",[916,1341,1342,1345],{},[938,1343,1344],{},"UNIQUE (scope…, key_fields…)"," — the replay key;",[916,1347,1329,1348,1354],{},[889,1349,1350,1353],{},[938,1351,1352],{},"BEFORE INSERT"," trigger"," that allocates the position;",[916,1356,1357,1358,1363,1364,1316],{},"an ",[889,1359,1360],{},[938,1361,1362],{},"append_\u003Ctable>(payload jsonb)"," function returning ",[938,1365,1366],{},"{record_uuid, position, replayed}",[916,1368,1369,1370,1373,1374,1379,1380,1383],{},"when ",[938,1371,1372],{},"append.effects"," is declared, the same function takes ",[889,1375,1376],{},[938,1377,1378],{},"(payload jsonb, effects jsonb)"," and writes companion rows in the ",[889,1381,1382],{},"same transaction",". Failure of an effect rolls the message back.",[885,1385,1386,1387,1390],{},"Both are ",[938,1388,1389],{},"SECURITY INVOKER",", so nothing here raises your privilege.",[943,1392,1394],{"id":1393},"two-ways-to-write","Two ways to write",[948,1396,1400],{"className":1397,"code":1398,"language":1399,"meta":953,"style":953},"language-sql shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","-- Through the function: you get the replay indicator back.\nselect append_conversation_messages(\n  '{\"conversation_id\":\"…\",\"request_id\":\"req-1\",\"payload_hash\":\"…\",\"content\":\"hi\"}'::jsonb\n);\n-- → {\"record_uuid\": \"…\", \"position\": 42, \"replayed\": false}\n","sql",[938,1401,1402,1407,1412,1417,1422],{"__ignoreMap":953},[957,1403,1404],{"class":959,"line":960},[957,1405,1406],{},"-- Through the function: you get the replay indicator back.\n",[957,1408,1409],{"class":959,"line":971},[957,1410,1411],{},"select append_conversation_messages(\n",[957,1413,1414],{"class":959,"line":987},[957,1415,1416],{},"  '{\"conversation_id\":\"…\",\"request_id\":\"req-1\",\"payload_hash\":\"…\",\"content\":\"hi\"}'::jsonb\n",[957,1418,1419],{"class":959,"line":995},[957,1420,1421],{},");\n",[957,1423,1424],{"class":959,"line":1008},[957,1425,1426],{},"-- → {\"record_uuid\": \"…\", \"position\": 42, \"replayed\": false}\n",[885,1428,1429,1430,903,1433,1436,1437,1440],{},"A plain insert — including a direct ",[905,1431,1432],{"href":517},"PostgREST",[938,1434,1435],{},"POST"," — still works and still gets a server-allocated position, because the trigger fires on every insert path. You just don't get the ",[938,1438,1439],{},"replayed"," flag back.",[1442,1443,1444],"note",{},[885,1445,1446,1447,1450],{},"Sending ",[938,1448,1449],{},"sequence"," yourself is not an error and not a hint. The trigger overwrites it. That is the point: the position is un-choosable rather than merely discouraged.",[943,1452,1454],{"id":1453},"why-a-counter-and-not-a-sequence","Why a counter and not a sequence",[885,1456,1457],{},"An identity column or a Postgres sequence looks like the obvious answer. It fails requirement 3, and it fails by construction rather than by accident.",[885,1459,1460,1461,1464],{},"A sequence hands out its number ",[889,1462,1463],{},"outside"," the transaction. So two writers can take 41 and 42, the holder of 42 can commit first, a consumer can advance its watermark past 42, and only then does 41 commit — appearing below a point the reader has already passed. Measured, not assumed.",[885,1466,1467,1468,1471],{},"The allocation is therefore a counter ",[889,1469,1470],{},"row lock held until commit",": allocation order is commit order, so a position can never surface late.",[943,1473,1475],{"id":1474},"replay","Replay",[885,1477,1478,1479,1482],{},"Same key, same fingerprint → the original row comes back with ",[938,1480,1481],{},"replayed: true",". Nothing is written twice.",[885,1484,1485,1486,1488,1489,1492,1493,1496],{},"Same key, ",[889,1487,1305],{}," payload → ",[938,1490,1491],{},"appdata_idempotency_conflict",", surfaced over HTTP as a ",[938,1494,1495],{},"409",". A changed payload under a used key is a bug in the caller, and silently accepting either version would hide it.",[885,1498,1499],{},"Concurrency is handled: when several first-time callers race, one insert wins and the rest replay the winner's row rather than surfacing a unique violation.",[943,1501,1503],{"id":1502},"membership-scoped-rows","Membership-scoped rows",[885,1505,1506,1507,1511],{},"Owner scoping answers \"is this row mine\". A conversation needs \"am I ",[1508,1509,1510],"em",{},"in"," this conversation\" — a fact that lives in another table.",[948,1513,1515],{"className":950,"code":1514,"language":952,"meta":953,"style":953},"      - slug: conversation_messages\n        membership:\n          via: conversation_participants\n          match: [conversation_id]\n",[938,1516,1517,1527,1534,1544],{"__ignoreMap":953},[957,1518,1519,1521,1523,1525],{"class":959,"line":960},[957,1520,998],{"class":967},[957,1522,977],{"class":963},[957,1524,980],{"class":967},[957,1526,1005],{"class":983},[957,1528,1529,1532],{"class":959,"line":971},[957,1530,1531],{"class":963},"        membership",[957,1533,968],{"class":967},[957,1535,1536,1539,1541],{"class":959,"line":987},[957,1537,1538],{"class":963},"          via",[957,1540,980],{"class":967},[957,1542,1543],{"class":983}," conversation_participants\n",[957,1545,1546,1549,1551,1553,1555],{"class":959,"line":995},[957,1547,1548],{"class":963},"          match",[957,1550,980],{"class":967},[957,1552,1035],{"class":967},[957,1554,1038],{"class":983},[957,1556,1041],{"class":967},[885,1558,1559,1560,1563,1564,1316],{},"The row is visible only when the caller holds a live row in ",[938,1561,1562],{},"conversation_participants"," matching on ",[938,1565,1038],{},[885,1567,1568,1569,1572,1573,1576,1577,1580],{},"This compiles to a ",[889,1570,1571],{},"RESTRICTIVE"," row-level policy scoped to your app's end-user role. Restrictive matters: permissive policies OR together, so they can only ever ",[1508,1574,1575],{},"widen"," what an end-user reaches. Membership has to narrow, and ",[938,1578,1579],{},"AS RESTRICTIVE"," is the only thing in Postgres that ANDs with the tenant predicate instead.",[885,1582,1583,1584,1587],{},"By default the membership row is matched on ",[938,1585,1586],{},"owner_end_user_uuid",". The membership table cannot itself be membership-scoped — that is what makes the check terminate.",[943,1589,1591,1592,1594],{"id":1590},"companion-rows-appendeffects","Companion rows (",[938,1593,1372],{},")",[885,1596,1597,1598,1601,1602,1316],{},"A message and its delivery-intent must commit together. Declare ",[938,1599,1600],{},"effects"," on the append policy so the compiler emits ",[938,1603,1604],{},"append_\u003Ctable>(payload jsonb, effects jsonb)",[948,1606,1608],{"className":950,"code":1607,"language":952,"meta":953,"style":953},"      - slug: conversation_messages\n        append:\n          position_field: sequence\n          scope: [conversation_id]\n          idempotency:\n            key_fields: [request_id]\n            fingerprint_field: payload_hash\n          effects:\n            - table: delivery_intents\n              carry:\n                conversation_id: conversation_id\n                message_uuid: record_uuid\n        fields:\n          - { slug: conversation_id, type: uuid, required: true }\n          - { slug: request_id, type: text, required: true }\n          - { slug: payload_hash, type: text }\n          - { slug: sequence, type: number, required: true }\n          - { slug: content, type: text }\n",[938,1609,1610,1620,1626,1634,1646,1652,1664,1672,1679,1692,1699,1709,1719,1725,1755,1785,1807,1838],{"__ignoreMap":953},[957,1611,1612,1614,1616,1618],{"class":959,"line":960},[957,1613,998],{"class":967},[957,1615,977],{"class":963},[957,1617,980],{"class":967},[957,1619,1005],{"class":983},[957,1621,1622,1624],{"class":959,"line":971},[957,1623,1011],{"class":963},[957,1625,968],{"class":967},[957,1627,1628,1630,1632],{"class":959,"line":987},[957,1629,1019],{"class":963},[957,1631,980],{"class":967},[957,1633,1024],{"class":983},[957,1635,1636,1638,1640,1642,1644],{"class":959,"line":995},[957,1637,1030],{"class":963},[957,1639,980],{"class":967},[957,1641,1035],{"class":967},[957,1643,1038],{"class":983},[957,1645,1041],{"class":967},[957,1647,1648,1650],{"class":959,"line":1008},[957,1649,1047],{"class":963},[957,1651,968],{"class":967},[957,1653,1654,1656,1658,1660,1662],{"class":959,"line":1016},[957,1655,1055],{"class":963},[957,1657,980],{"class":967},[957,1659,1035],{"class":967},[957,1661,1062],{"class":983},[957,1663,1041],{"class":967},[957,1665,1666,1668,1670],{"class":959,"line":1027},[957,1667,1070],{"class":963},[957,1669,980],{"class":967},[957,1671,1075],{"class":983},[957,1673,1674,1677],{"class":959,"line":1044},[957,1675,1676],{"class":963},"          effects",[957,1678,968],{"class":967},[957,1680,1681,1684,1687,1689],{"class":959,"line":1052},[957,1682,1683],{"class":967},"            -",[957,1685,1686],{"class":963}," table",[957,1688,980],{"class":967},[957,1690,1691],{"class":983}," delivery_intents\n",[957,1693,1694,1697],{"class":959,"line":1067},[957,1695,1696],{"class":963},"              carry",[957,1698,968],{"class":967},[957,1700,1701,1704,1706],{"class":959,"line":1078},[957,1702,1703],{"class":963},"                conversation_id",[957,1705,980],{"class":967},[957,1707,1708],{"class":983}," conversation_id\n",[957,1710,1711,1714,1716],{"class":959,"line":1086},[957,1712,1713],{"class":963},"                message_uuid",[957,1715,980],{"class":967},[957,1717,1718],{"class":983}," record_uuid\n",[957,1720,1721,1723],{"class":959,"line":1127},[957,1722,1081],{"class":963},[957,1724,968],{"class":967},[957,1726,1727,1729,1731,1733,1735,1737,1739,1741,1743,1745,1747,1749,1751,1753],{"class":959,"line":1160},[957,1728,1089],{"class":967},[957,1730,1092],{"class":967},[957,1732,977],{"class":963},[957,1734,980],{"class":967},[957,1736,1099],{"class":983},[957,1738,1102],{"class":967},[957,1740,1105],{"class":963},[957,1742,980],{"class":967},[957,1744,1110],{"class":983},[957,1746,1102],{"class":967},[957,1748,1115],{"class":963},[957,1750,980],{"class":967},[957,1752,1121],{"class":1120},[957,1754,1124],{"class":967},[957,1756,1757,1759,1761,1763,1765,1767,1769,1771,1773,1775,1777,1779,1781,1783],{"class":959,"line":1184},[957,1758,1089],{"class":967},[957,1760,1092],{"class":967},[957,1762,977],{"class":963},[957,1764,980],{"class":967},[957,1766,1138],{"class":983},[957,1768,1102],{"class":967},[957,1770,1105],{"class":963},[957,1772,980],{"class":967},[957,1774,1147],{"class":983},[957,1776,1102],{"class":967},[957,1778,1115],{"class":963},[957,1780,980],{"class":967},[957,1782,1121],{"class":1120},[957,1784,1124],{"class":967},[957,1786,1787,1789,1791,1793,1795,1797,1799,1801,1803,1805],{"class":959,"line":1217},[957,1788,1089],{"class":967},[957,1790,1092],{"class":967},[957,1792,977],{"class":963},[957,1794,980],{"class":967},[957,1796,1171],{"class":983},[957,1798,1102],{"class":967},[957,1800,1105],{"class":963},[957,1802,980],{"class":967},[957,1804,1147],{"class":983},[957,1806,1124],{"class":967},[957,1808,1810,1812,1814,1816,1818,1820,1822,1824,1826,1828,1830,1832,1834,1836],{"class":959,"line":1809},17,[957,1811,1089],{"class":967},[957,1813,1092],{"class":967},[957,1815,977],{"class":963},[957,1817,980],{"class":967},[957,1819,1195],{"class":983},[957,1821,1102],{"class":967},[957,1823,1105],{"class":963},[957,1825,980],{"class":967},[957,1827,1204],{"class":983},[957,1829,1102],{"class":967},[957,1831,1115],{"class":963},[957,1833,980],{"class":967},[957,1835,1121],{"class":1120},[957,1837,1124],{"class":967},[957,1839,1841,1843,1845,1847,1849,1851,1853,1855,1857,1859],{"class":959,"line":1840},18,[957,1842,1089],{"class":967},[957,1844,1092],{"class":967},[957,1846,977],{"class":963},[957,1848,980],{"class":967},[957,1850,1228],{"class":983},[957,1852,1102],{"class":967},[957,1854,1105],{"class":963},[957,1856,980],{"class":967},[957,1858,1147],{"class":983},[957,1860,1124],{"class":967},[885,1862,1863,1864,1866,1867,1870,1871,1874,1875,1878,1879,1882,1883,1316],{},"Apply with ",[938,1865,1312],{}," (",[938,1868,1869],{},"dry_run: false",") on a ",[889,1872,1873],{},"new"," App. Introspect until the function is ",[938,1876,1877],{},"append_conversation_messages(payload jsonb, effects jsonb)",". One call writes both rows; a constraint failure on the intent leaves ",[889,1880,1881],{},"zero"," message rows for that ",[938,1884,1062],{},[885,1886,1887,1888,1891,1892,1894,1895,1898],{},"Two separate ",[938,1889,1890],{},"transaction.apply"," ops are ",[889,1893,902],{}," this contract. ",[938,1896,1897],{},"data.appdata.record.append"," is not registered — use the serving function.",[885,1900,1901,1902,1905,1906,1909],{},"The compiler only emits the two-argument signature when ",[938,1903,1904],{},"policy.effects"," is non-empty. A table with append but no effects stays ",[938,1907,1908],{},"(payload jsonb)"," only.",[943,1911,1913],{"id":1912},"what-you-never-do","What you never do",[1325,1915,1916,1919,1926,1929],{},[916,1917,1918],{},"Allocate the position in your client and send it. It will be discarded, and any ordering you inferred from it is wrong.",[916,1920,1921,1922,1925],{},"Use a ",[938,1923,1924],{},"uuid"," or a timestamp as the cursor for a log a consumer replays. Neither gives you a dense, gap-free, commit-ordered position.",[916,1927,1928],{},"Reuse an idempotency key across payloads. That is a conflict by design.",[916,1930,1931,1932,1935],{},"Reach for membership when ",[938,1933,1934],{},"owner"," already answers the question. Restrictive policies compose; every one you add is another predicate on every read.",[943,1937,1939],{"id":1938},"related","Related",[885,1941,1942,1944,1945,1944,1947],{},[905,1943,497],{"href":498}," · ",[905,1946,507],{"href":508},[905,1948,516],{"href":517},[1950,1951,1952],"style",{},"html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .sfNiH, html code.shiki .sfNiH{--shiki-light:#FF5370;--shiki-default:#FF9CAC;--shiki-dark:#FF9CAC}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":953,"searchDepth":960,"depth":971,"links":1954},[1955,1956,1957,1958,1959,1960,1961,1963,1964],{"id":945,"depth":971,"text":946},{"id":1319,"depth":971,"text":1320},{"id":1393,"depth":971,"text":1394},{"id":1453,"depth":971,"text":1454},{"id":1474,"depth":971,"text":1475},{"id":1502,"depth":971,"text":1503},{"id":1590,"depth":971,"text":1962},"Companion rows (append.effects)",{"id":1912,"depth":971,"text":1913},{"id":1938,"depth":971,"text":1939},"Server-allocated positions, replay-safe writes, and membership-scoped rows for streams and conversations","md",null,{},{"icon":524},{"title":521,"description":1965},"ythUCJWDhYToOrj7CpMBUnbVro85LCoadYFYoAdUR-4",[1973,1975],{"title":516,"path":517,"stem":518,"description":1974,"icon":519,"children":-1},"Point a standard PostgREST client at App Data using an Orkestia end-user JWT and the public JWKS — no DSN, no minted HS256 secret.",{"title":526,"path":527,"stem":528,"description":1976,"icon":529,"children":-1},"Logical App Data databases versus the physical Postgres instance — shared plane, dedicated dbhost, provision, migrate, pause, and resume",1790354054661]