[{"data":1,"prerenderedAt":3706},["ShallowReactive",2],{"navigation":3,"/chat/living-surfaces":879,"/chat/living-surfaces-surround":3701},[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":846,"body":881,"description":3694,"extension":3695,"links":3696,"meta":3697,"navigation":3698,"path":847,"seo":3699,"stem":848,"__hash__":3700},"docs/24.chat/20.living-surfaces.md",{"type":882,"value":883,"toc":3673},"minimark",[884,901,906,987,991,1001,1103,1109,1112,1472,1479,1484,1497,1501,1504,1557,1570,1610,1622,1625,1636,1753,1775,1779,1795,1799,1804,1808,1811,1853,1856,1859,2089,2096,2100,2113,2147,2166,2170,2173,2179,2205,2211,2317,2363,2776,2780,2805,2809,2862,2868,2872,3357,3361,3549,3553,3560,3564,3669],[885,886,887,888,892,893,895,896,900],"p",{},"A Living Surface is a page that is a running decision loop, not a finished screen. You give DGI an intent (\"keep the platform healthy\", \"incident room for the checkout outage\") and a scope. DGI grows the page from cards, keeps each card current, adds the read the data points to next, removes what stopped serving the intent, and retires the page when the job is done. The cards are the same ones the chat draws: see the ",[889,890,891],"a",{"href":842},"card catalog",". Living Surfaces are part of ",[889,894,851],{"href":59}," and are ",[897,898,899],"strong",{},"Alpha",".",[902,903,905],"h2",{"id":904},"tldr","TL;DR",[907,908,909,928,938,948,954,971,977],"ul",{},[910,911,912,915,916,920,921,920,924,927],"li",{},[897,913,914],{},"A surface is a tree of cards plus a policy."," Containers (",[917,918,919],"code",{},"grid",", ",[917,922,923],{},"stack",[917,925,926],{},"region",") hold blocks, and each block is a chat card with the read that produced it. The policy says which workflows the cards may read and how much DGI may change per step.",[910,929,930,933,934,937],{},[897,931,932],{},"One step is a tick."," ",[917,935,936],{},"dgi.surface.tick"," takes signals (an intent, a click, a dwell, an event), refreshes every card, decides what to add, remove or wait for, validates the patch and stores it.",[910,939,940,943,944,947],{},[897,941,942],{},"Jev first, the LLM off by default."," Jev answers typed questions (add, remove or wait; which read; which view). The LLM runs only when the policy sets ",[917,945,946],{},"llm_fallback: true",", within a budget.",[910,949,950,953],{},[897,951,952],{},"A heartbeat keeps it alive."," A schedule ticks every 5 minutes, pauses when nobody looks, and resumes on a view or an event.",[910,955,956,959,960,963,964,967,968,900],{},[897,957,958],{},"Live patches over a WebSocket."," Every stored patch is pushed on ",[917,961,962],{},"wss://stream.orkestia.dev/streaming/surface/{surface_uuid}"," as a ",[917,965,966],{},"surface.patch"," frame, resumable by ",[917,969,970],{},"seq",[910,972,973,976],{},[897,974,975],{},"Writes need a confirm."," A write becomes a confirm card with a hash. It runs only when the owner confirms that hash in their own tick. A scheduled tick never writes.",[910,978,979,982,983,986],{},[897,980,981],{},"Members only."," End users are refused (",[917,984,985],{},"surfaces_members_only",").",[902,988,990],{"id":989},"what-a-surface-is","What a surface is",[992,993,999],"pre",{"className":994,"code":996,"language":997,"meta":998},[995],"language-text","surface  {uuid, intent, status, rev, root: \"root\", nodes, policy}\n  root\n  ├─ grid \"Vitals\"\n  │   ├─ block  kpi    \"Runs today\"        source: audit.workflow-run.query\n  │   └─ block  chart  \"Failures by type\"  source: audit.workflow-run.query, group_by\n  └─ region \"Open findings\"\n      └─ block  table  \"Findings\"          source: audit.finding.list\n","text","",[917,1000,996],{"__ignoreMap":998},[1002,1003,1004,1017],"table",{},[1005,1006,1007],"thead",{},[1008,1009,1010,1014],"tr",{},[1011,1012,1013],"th",{},"Part",[1011,1015,1016],{},"Meaning",[1018,1019,1020,1031,1055,1065,1093],"tbody",{},[1008,1021,1022,1028],{},[1023,1024,1025],"td",{},[917,1026,1027],{},"intent",[1023,1029,1030],{},"What the surface is for, up to 200 characters. DGI may rewrite it",[1008,1032,1033,1038],{},[1023,1034,1035],{},[917,1036,1037],{},"status",[1023,1039,1040,1043,1044,1047,1048,1051,1052],{},[917,1041,1042],{},"live"," (DGI is still shaping it), ",[917,1045,1046],{},"stable"," (it stopped changing), ",[917,1049,1050],{},"crystallized"," (saved as a composition), ",[917,1053,1054],{},"retired",[1008,1056,1057,1062],{},[1023,1058,1059],{},[917,1060,1061],{},"rev",[1023,1063,1064],{},"The revision. Every stored patch adds one",[1008,1066,1067,1072],{},[1023,1068,1069],{},[917,1070,1071],{},"nodes",[1023,1073,1074,1075,920,1078,920,1080,920,1082,1084,1085,1088,1089,1092],{},"Containers (",[917,1076,1077],{},"root",[917,1079,919],{},[917,1081,923],{},[917,1083,926],{},", each with ",[917,1086,1087],{},"children",") and blocks. A block holds one card and its ",[917,1090,1091],{},"source",": the workflow, its input and the view",[1008,1094,1095,1100],{},[1023,1096,1097],{},[917,1098,1099],{},"policy",[1023,1101,1102],{},"The scope and the limits below",[885,1104,1105,1108],{},[897,1106,1107],{},"Recipe, not data."," The stored surface keeps the tree, each card's source and a signature of what it showed, never the card's data. Cards are read again, as the viewer, whenever they are shown. Row ids stay on the server.",[902,1110,53],{"id":1111},"workflows",[1002,1113,1114,1127],{},[1005,1115,1116],{},[1008,1117,1118,1121,1124],{},[1011,1119,1120],{},"Workflow",[1011,1122,1123],{},"Input",[1011,1125,1126],{},"Output",[1018,1128,1129,1183,1249,1276,1301,1323,1345,1386,1404,1434],{},[1008,1130,1131,1136,1167],{},[1023,1132,1133],{},[917,1134,1135],{},"dgi.surface.create",[1023,1137,1138,920,1141,1143,1144,920,1147,1150,1151,1154,1155,1158,1159,1162,1163,1166],{},[917,1139,1140],{},"intent?",[917,1142,1099],{}," (required), ",[917,1145,1146],{},"seed?",[917,1148,1149],{},"origin?"," (",[917,1152,1153],{},"user"," or ",[917,1156,1157],{},"event","), ",[917,1160,1161],{},"heartbeat?"," (default ",[917,1164,1165],{},"true",")",[1023,1168,1169,920,1172,920,1175,920,1177,920,1180],{},[917,1170,1171],{},"surface_uuid",[917,1173,1174],{},"surface",[917,1176,1061],{},[917,1178,1179],{},"heartbeat_schedule_uuid",[917,1181,1182],{},"heartbeat_status",[1008,1184,1185,1189,1203],{},[1023,1186,1187],{},[917,1188,936],{},[1023,1190,1191,1193,1194,1196,1197,920,1200],{},[917,1192,1171],{}," (or a ",[917,1195,1174],{}," object), ",[917,1198,1199],{},"signals?",[917,1201,1202],{},"lang?",[1023,1204,1205,1150,1208,920,1211,1154,1214,1158,1217,920,1220,920,1223,933,1226,920,1229,920,1232,920,1235,920,1238,920,1240,920,1242,920,1244,920,1247],{},[917,1206,1207],{},"decision_path",[917,1209,1210],{},"jev",[917,1212,1213],{},"llm",[917,1215,1216],{},"none",[917,1218,1219],{},"ops",[917,1221,1222],{},"why",[917,1224,1225],{},"continuation",[917,1227,1228],{},"{mode}",[917,1230,1231],{},"retry_after_seconds",[917,1233,1234],{},"usage",[917,1236,1237],{},"refused",[917,1239,1171],{},[917,1241,1061],{},[917,1243,970],{},[917,1245,1246],{},"persisted",[917,1248,1182],{},[1008,1250,1251,1256,1266],{},[1023,1252,1253],{},[917,1254,1255],{},"dgi.surface.signal",[1023,1257,1258,920,1260,920,1263],{},[917,1259,1171],{},[917,1261,1262],{},"signal",[917,1264,1265],{},"tick_now?",[1023,1267,1268,920,1271,920,1274],{},[917,1269,1270],{},"queued",[917,1272,1273],{},"tick_workflow_ref",[917,1275,1182],{},[1008,1277,1278,1283,1294],{},[1023,1279,1280],{},[917,1281,1282],{},"data.dgi.surface.get",[1023,1284,1285,920,1287,920,1290,1293],{},[917,1286,1171],{},[917,1288,1289],{},"since_seq?",[917,1291,1292],{},"limit?"," (up to 100)",[1023,1295,1296,920,1298],{},[917,1297,1174],{},[917,1299,1300],{},"timeline",[1008,1302,1303,1308,1315],{},[1023,1304,1305],{},[917,1306,1307],{},"data.dgi.surface.list",[1023,1309,1310,920,1313,1293],{},[917,1311,1312],{},"status?",[917,1314,1292],{},[1023,1316,1317,920,1320],{},[917,1318,1319],{},"surfaces",[917,1321,1322],{},"count",[1008,1324,1325,1330,1334],{},[1023,1326,1327],{},[917,1328,1329],{},"dgi.surface.archive",[1023,1331,1332],{},[917,1333,1171],{},[1023,1335,1336,920,1339,920,1341,920,1343],{},[917,1337,1338],{},"status: \"retired\"",[917,1340,1061],{},[917,1342,970],{},[917,1344,1182],{},[1008,1346,1347,1352,1362],{},[1023,1348,1349],{},[917,1350,1351],{},"dgi.surface.crystallize",[1023,1353,1354,920,1356,920,1359],{},[917,1355,1171],{},[917,1357,1358],{},"name?",[917,1360,1361],{},"action_input_hash?",[1023,1363,1364,1150,1366,1154,1369,1158,1371,920,1374,920,1377,920,1380,920,1383],{},[917,1365,1037],{},[917,1367,1368],{},"proposed",[917,1370,1050],{},[917,1372,1373],{},"proposal",[917,1375,1376],{},"component_descriptor",[917,1378,1379],{},"composition_uuid",[917,1381,1382],{},"crystallized_as",[917,1384,1385],{},"validation",[1008,1387,1388,1393,1397],{},[1023,1389,1390],{},[917,1391,1392],{},"dgi.surface.touch",[1023,1394,1395],{},[917,1396,1171],{},[1023,1398,1399,920,1402],{},[917,1400,1401],{},"last_viewed_at",[917,1403,1182],{},[1008,1405,1406,1411,1423],{},[1023,1407,1408],{},[917,1409,1410],{},"dgi.surface.apply",[1023,1412,1413,920,1415,920,1418,920,1420],{},[917,1414,1171],{},[917,1416,1417],{},"if_rev",[917,1419,1219],{},[917,1421,1422],{},"why?",[1023,1424,1425,920,1427,920,1429,920,1432],{},[917,1426,1061],{},[917,1428,970],{},[917,1430,1431],{},"accepted",[917,1433,1237],{},[1008,1435,1436,1441,1459],{},[1023,1437,1438],{},[917,1439,1440],{},"data.dgi.surface.row",[1023,1442,1443,920,1445,920,1448,920,1451,920,1454,920,1457],{},[917,1444,1171],{},[917,1446,1447],{},"ui_id",[917,1449,1450],{},"row",[917,1452,1453],{},"action?",[917,1455,1456],{},"kind?",[917,1458,1202],{},[1023,1460,1461,920,1464,920,1467,920,1470],{},[917,1462,1463],{},"render",[917,1465,1466],{},"renderer",[917,1468,1469],{},"title",[917,1471,997],{},[885,1473,1474,1475,1478],{},"Never pass ",[917,1476,1477],{},"organization_uuid",": it comes from the token (the heartbeat's scheduler stamps it on scheduled ticks).",[1480,1481,1483],"h3",{"id":1482},"create","Create",[885,1485,1486,1488,1489,1492,1493,1496],{},[917,1487,1135],{}," stores a new surface and registers its heartbeat. ",[917,1490,1491],{},"seed"," gives DGI cards to grow first: a list of reads ",[917,1494,1495],{},"{workflow_type, input, view: {kind, title, group_by?, chart?}}",", or a shared genome. Every seed read must be inside the policy. An empty surface with an intent starts with a vitals card.",[1480,1498,1500],{"id":1499},"tick","Tick",[885,1502,1503],{},"One tick, in order:",[1505,1506,1507,1513,1519,1525,1531,1537,1543],"ol",{},[910,1508,1509,1512],{},[897,1510,1511],{},"Signals."," Apply what happened: an intent, a dismiss, a dwell, a retire, crystallize or resolve, a restore, a confirm.",[910,1514,1515,1518],{},[897,1516,1517],{},"Refresh."," Read every card again. A card is replaced only when what it shows changed.",[910,1520,1521,1524],{},[897,1522,1523],{},"Seed."," An empty surface with an intent gets its first card.",[910,1526,1527,1530],{},[897,1528,1529],{},"Decide whether to think."," A tick thinks only after an intent, a user signal, an event, a data change or an add. It never thinks on an idle timer, and refresh failures alone never wake Jev or the model.",[910,1532,1533,1536],{},[897,1534,1535],{},"Decide."," Jev first, then the LLM when the policy allows it.",[910,1538,1539,1542],{},[897,1540,1541],{},"Schema gate."," Invented fields are dropped, identity fields stripped, and a read missing a required field is refused.",[910,1544,1545,1548,1549,1552,1553,1556],{},[897,1546,1547],{},"Validate the patch."," Every op passes four checks: structure, references (the policy's ",[917,1550,1551],{},"allowed_workflow_types","), compatibility (the card render limits; a confirm carries its hash) and budget (",[917,1554,1555],{},"mutation_budget"," structural ops per tick).",[885,1558,1559,1560,1563,1564,1566,1567,1569],{},"The result is stored as ",[917,1561,1562],{},"rev + 1"," with one timeline entry, and published to the live stream. A tick whose revision is stale is refused, so two ticks never overwrite each other. ",[917,1565,1222],{}," is one line saying why DGI did what it did, and ",[917,1568,1231],{}," is when it wants to look again.",[885,1571,1572,933,1575,1578,1579,1582,1583,920,1586,920,1589,920,1592,920,1595,1598,1599,920,1601,1603,1604,1606,1607,1609],{},[897,1573,1574],{},"Ops.",[917,1576,1577],{},"add"," (a node under a parent), ",[917,1580,1581],{},"replace"," (a block's card), ",[917,1584,1585],{},"remove",[917,1587,1588],{},"move",[917,1590,1591],{},"commit",[917,1593,1594],{},"set_intent",[917,1596,1597],{},"set_status",". ",[917,1600,1577],{},[917,1602,1585],{}," and ",[917,1605,1588],{}," are structural and count against ",[917,1608,1555],{},"; refreshes are free.",[1611,1612,1613],"note",{},[885,1614,1615,1616,1618,1619,1621],{},"A tick with only a ",[917,1617,1174],{}," object and no ",[917,1620,1171],{}," is stateless: it uses the tree and policy you send, never calls the LLM, never writes and stores nothing. Create the surface first for persistence, the heartbeat, the LLM fallback and writes.",[1480,1623,1624],{"id":1262},"Signal",[885,1626,1627,1629,1630,1598,1633,1635],{},[917,1628,1255],{}," queues a signal for the next tick, or starts one at once with ",[917,1631,1632],{},"tick_now: true",[917,1634,1262],{}," is one of:",[1002,1637,1638,1653],{},[1005,1639,1640],{},[1008,1641,1642,1647,1650],{},[1011,1643,1644],{},[917,1645,1646],{},"kind",[1011,1648,1649],{},"Shape",[1011,1651,1652],{},"Use",[1018,1654,1655,1669,1683,1698,1723,1738],{},[1008,1656,1657,1661,1666],{},[1023,1658,1659],{},[917,1660,1157],{},[1023,1662,1663],{},[917,1664,1665],{},"{kind: \"event\", source, payload?}",[1023,1667,1668],{},"Something happened outside, for example an alert",[1008,1670,1671,1675,1680],{},[1023,1672,1673],{},[917,1674,1027],{},[1023,1676,1677],{},[917,1678,1679],{},"{kind: \"intent\", text}",[1023,1681,1682],{},"The owner changes what the surface is for",[1008,1684,1685,1690,1695],{},[1023,1686,1687],{},[917,1688,1689],{},"dwell",[1023,1691,1692],{},[917,1693,1694],{},"{kind: \"dwell\", ui_id, ms}",[1023,1696,1697],{},"The viewer spent time on a card",[1008,1699,1700,1705,1720],{},[1023,1701,1702],{},[917,1703,1704],{},"user_action",[1023,1706,1707,1710,1711,920,1714,1154,1717],{},[917,1708,1709],{},"{kind: \"user_action\", ui_id, action, values?}"," with ",[917,1712,1713],{},"cancel",[917,1715,1716],{},"refresh",[917,1718,1719],{},"row_action",[1023,1721,1722],{},"The viewer dismissed, refreshed or acted on a card",[1008,1724,1725,1730,1735],{},[1023,1726,1727],{},[917,1728,1729],{},"restore",[1023,1731,1732],{},[917,1733,1734],{},"{kind: \"restore\", intent, cards}",[1023,1736,1737],{},"Rebuild from a saved genome",[1008,1739,1740,1745,1750],{},[1023,1741,1742],{},[917,1743,1744],{},"timer",[1023,1746,1747],{},[917,1748,1749],{},"{kind: \"timer\"}",[1023,1751,1752],{},"A plain wake-up",[885,1754,1755,1756,1758,1759,1761,1762,1603,1765,1598,1768,1770,1771,1774],{},"A confirm is never queued. It runs only in the confirming member's own ",[917,1757,936],{},", as a ",[917,1760,1704],{}," signal with ",[917,1763,1764],{},"action: \"confirm\"",[917,1766,1767],{},"values: {workflow_type, hash}",[917,1769,936],{}," also takes the ",[917,1772,1773],{},"query"," card action (sort, filter, page, controls) on its cards, the same as the chat.",[1480,1776,1778],{"id":1777},"get-and-list","Get and list",[885,1780,1781,1783,1784,1598,1787,1789,1790,1598,1792,1794],{},[917,1782,1282],{}," returns the surface (its recipe) and its timeline of decisions from ",[917,1785,1786],{},"since_seq",[917,1788,1307],{}," lists your surfaces and the ones visible to the whole organization, newest first, optionally by ",[917,1791,1037],{},[917,1793,1440],{}," opens one row of a table card: the server resolves the row from its position, so the id never leaves it.",[1480,1796,1798],{"id":1797},"archive","Archive",[885,1800,1801,1803],{},[917,1802,1329],{}," retires a surface you own. Its heartbeat schedule is deleted and the record is kept.",[1480,1805,1807],{"id":1806},"crystallize","Crystallize",[885,1809,1810],{},"When a surface stops changing, the owner can turn it into something permanent:",[1505,1812,1813,1832],{},[910,1814,1815,1816,1818,1819,1822,1823,1825,1826,1828,1829,900],{},"Call ",[917,1817,1351],{}," once. It returns ",[917,1820,1821],{},"status: \"proposed\"",", the ",[917,1824,1373],{}," (the cards' reads as one composition layer), a ",[917,1827,1376],{}," of the layout, and the proposal's ",[917,1830,1831],{},"action_input_hash",[910,1833,1834,1835,1838,1839,1842,1843,1846,1847,1150,1849,1852],{},"Call it again with that hash. The platform validates the ",[897,1836,1837],{},"stored"," proposal with ",[917,1840,1841],{},"composition.validate",", saves it with ",[917,1844,1845],{},"composition.save",", records ",[917,1848,1382],{},[917,1850,1851],{},"virtual.\u003Cuuid>@\u003Cversion>",") and stops the heartbeat.",[885,1854,1855],{},"Publishing the layout as an app is not part of crystallize yet.",[902,1857,1858],{"id":1099},"Policy",[1002,1860,1861,1874],{},[1005,1862,1863],{},[1008,1864,1865,1868,1871],{},[1011,1866,1867],{},"Field",[1011,1869,1870],{},"Values and default",[1011,1872,1873],{},"What it does",[1018,1875,1876,1894,1906,1966,1979,1995,2008,2021,2034,2050,2063,2076],{},[1008,1877,1878,1882,1891],{},[1023,1879,1880],{},[917,1881,1551],{},[1023,1883,1884,1887,1888],{},[897,1885,1886],{},"Required."," 1 to 50 names, exact or ",[917,1889,1890],{},"prefix.*",[1023,1892,1893],{},"The only workflows the cards may read, intersected with what the viewer may run",[1008,1895,1896,1900,1903],{},[1023,1897,1898],{},[917,1899,1555],{},[1023,1901,1902],{},"1 to 6, default 2",[1023,1904,1905],{},"Structural ops (add, remove, move) per tick",[1008,1907,1908,1913,1963],{},[1023,1909,1910],{},[917,1911,1912],{},"renderers",[1023,1914,1915,920,1918,920,1921,920,1923,920,1926,920,1929,1932,1933,920,1936,920,1939,920,1942,920,1944,920,1947,920,1950,1952,1953,920,1955,920,1957,920,1959,920,1961],{},[917,1916,1917],{},"kpi",[917,1919,1920],{},"chart",[917,1922,1002],{},[917,1924,1925],{},"logs",[917,1927,1928],{},"run",[917,1930,1931],{},"confirm"," and the newer views (",[917,1934,1935],{},"dag",[917,1937,1938],{},"schema",[917,1940,1941],{},"datagrid",[917,1943,1773],{},[917,1945,1946],{},"diff",[917,1948,1949],{},"detail",[917,1951,1300],{},"). Default: ",[917,1954,1917],{},[917,1956,1920],{},[917,1958,1002],{},[917,1960,1928],{},[917,1962,1931],{},[1023,1964,1965],{},"Which cards the surface may show",[1008,1967,1968,1973,1976],{},[1023,1969,1970],{},[917,1971,1972],{},"max_blocks",[1023,1974,1975],{},"1 to 12, default 6",[1023,1977,1978],{},"Cards on the surface at once",[1008,1980,1981,1986,1992],{},[1023,1982,1983],{},[917,1984,1985],{},"llm_fallback",[1023,1987,1988,1989],{},"Boolean, default ",[917,1990,1991],{},"false",[1023,1993,1994],{},"Off: Jev only. On: the LLM decides when Jev is not confident",[1008,1996,1997,2002,2005],{},[1023,1998,1999],{},[917,2000,2001],{},"llm_budget",[1023,2003,2004],{},"0 to 20, default 20",[1023,2006,2007],{},"LLM calls for the whole life of the surface. It can lower the cap of 20, never raise it",[1008,2009,2010,2015,2018],{},[1023,2011,2012],{},[917,2013,2014],{},"model",[1023,2016,2017],{},"A model id",[1023,2019,2020],{},"Pins the model the fallback uses",[1008,2022,2023,2028,2031],{},[1023,2024,2025],{},[917,2026,2027],{},"jev_threshold",[1023,2029,2030],{},"0.5 to 0.99, default 0.8",[1023,2032,2033],{},"Jev confidence needed to decide",[1008,2035,2036,2041,2047],{},[1023,2037,2038],{},[917,2039,2040],{},"jev_connection_uuid",[1023,2042,2043,2044,2046],{},"A ",[889,2045,292],{"href":293}," connection",[1023,2048,2049],{},"Which connection Jev decides with",[1008,2051,2052,2057,2060],{},[1023,2053,2054],{},[917,2055,2056],{},"chart_top_n",[1023,2058,2059],{},"1 to 60, default 12",[1023,2061,2062],{},"Bar and pie charts keep this many points and group the rest as \"Other\"",[1008,2064,2065,2070,2073],{},[1023,2066,2067],{},[917,2068,2069],{},"heartbeat_seconds",[1023,2071,2072],{},"300 to 86,400, default 300",[1023,2074,2075],{},"The heartbeat interval. Never under 5 minutes",[1008,2077,2078,2083,2086],{},[1023,2079,2080],{},[917,2081,2082],{},"idle_pause_seconds",[1023,2084,2085],{},"0 to 604,800, default 1,800",[1023,2087,2088],{},"With no viewer for this long, the heartbeat pauses",[885,2090,2091,2092,2095],{},"An invalid policy is refused with ",[917,2093,2094],{},"policy_invalid",". The LLM path is also bounded per organization per UTC day, and each call is capped at 3,000 output tokens. Every decision's usage is recorded on the timeline.",[902,2097,2099],{"id":2098},"heartbeat","Heartbeat",[885,2101,2102,2104,2105,2107,2108,2110,2111,900],{},[917,2103,1135],{}," registers a schedule that runs ",[917,2106,936],{}," every 5 minutes (",[917,2109,2069],{},", never under 300). The interval follows the tick's ",[917,2112,1231],{},[907,2114,2115,2124,2135,2141],{},[910,2116,2117,2120,2121,2123],{},[897,2118,2119],{},"Pause."," With no viewer for ",[917,2122,2082],{}," (30 minutes by default), the schedule pauses.",[910,2125,2126,2129,2130,2132,2133,900],{},[897,2127,2128],{},"Resume."," Call ",[917,2131,1392],{}," whenever someone opens the surface, or send an event with ",[917,2134,1255],{},[910,2136,2137,2140],{},[897,2138,2139],{},"Stop."," Archive, retire and crystallize delete the schedule.",[910,2142,2143,2146],{},[897,2144,2145],{},"No writes."," A scheduled tick never writes.",[885,2148,2149,2151,2152,920,2155,2158,2159,2162,2163,2165],{},[917,2150,1182],{}," in each output is ",[917,2153,2154],{},"active",[917,2156,2157],{},"paused",", or a failure note when the schedule could not be registered. Pass ",[917,2160,2161],{},"heartbeat: false"," to ",[917,2164,1135],{}," for a surface you tick yourself.",[902,2167,2169],{"id":2168},"the-patch-stream","The patch stream",[885,2171,2172],{},"Every stored patch is pushed to viewers over a WebSocket:",[992,2174,2177],{"className":2175,"code":2176,"language":997,"meta":998},[995],"wss://stream.orkestia.dev/streaming/surface/{surface_uuid}?after_seq=\u003Clast seq you applied>\n",[917,2178,2176],{"__ignoreMap":998},[885,2180,2181,2184,2185,2188,2189,2192,2193,2196,2197,2200,2201,2204],{},[897,2182,2183],{},"Authentication."," Send your member access token in the ",[917,2186,2187],{},"Sec-WebSocket-Protocol"," header as ",[917,2190,2191],{},"ltinteg-bearer.\u003Cbase64url(token)>",", and offer ",[917,2194,2195],{},"ltinteg-surface.v1"," too, which the server echoes back. Browsers can set this header through the ",[917,2198,2199],{},"protocols"," argument of ",[917,2202,2203],{},"new WebSocket(url, protocols)",", which keeps the token out of the URL. Only organization members hold such tokens, and the stream only ever reads your own organization's surfaces.",[885,2206,2207,2210],{},[897,2208,2209],{},"Frames"," (JSON):",[1002,2212,2213,2226],{},[1005,2214,2215],{},[1008,2216,2217,2222,2224],{},[1011,2218,2219],{},[917,2220,2221],{},"type",[1011,2223,1649],{},[1011,2225,1016],{},[1018,2227,2228,2247,2264,2286,2300],{},[1008,2229,2230,2235,2240],{},[1023,2231,2232],{},[917,2233,2234],{},"hello",[1023,2236,2237],{},[917,2238,2239],{},"{surface_uuid, organization_uuid, after_seq, latest_seq, at}",[1023,2241,2242,2243,2246],{},"Sent once. Compare ",[917,2244,2245],{},"latest_seq"," with the state you loaded",[1008,2248,2249,2253,2258],{},[1023,2250,2251],{},[917,2252,966],{},[1023,2254,2255],{},[917,2256,2257],{},"{surface_uuid, seq, ops, why, rev?, at}",[1023,2259,2260,2261,2263],{},"One stored patch, in ",[917,2262,970],{}," order",[1008,2265,2266,2271,2276],{},[1023,2267,2268],{},[917,2269,2270],{},"surface.resync",[1023,2272,2273],{},[917,2274,2275],{},"{surface_uuid, after_seq, at}",[1023,2277,2278,2279,2282,2283,2285],{},"Patches after your ",[917,2280,2281],{},"after_seq"," were trimmed. Read the surface again with ",[917,2284,1282],{},", then reconnect",[1008,2287,2288,2292,2297],{},[1023,2289,2290],{},[917,2291,2098],{},[1023,2293,2294],{},[917,2295,2296],{},"{at}",[1023,2298,2299],{},"Idle keep-alive",[1008,2301,2302,2307,2311],{},[1023,2303,2304],{},[917,2305,2306],{},"timeout",[1023,2308,2309],{},[917,2310,2296],{},[1023,2312,2313,2314,2316],{},"The socket reached its lifetime (one hour). Reconnect with ",[917,2315,2281],{}," and a fresh token",[907,2318,2319,2333,2346],{},[910,2320,2321,2323,2324,2326,2327,2329,2330,2332],{},[897,2322,2128],{}," Pass the last ",[917,2325,970],{}," you applied as ",[917,2328,2281],{},", and every retained patch after it is replayed first. ",[917,2331,970],{}," always increases per surface but can skip numbers. The stream keeps the newest 200 patches for 24 hours.",[910,2334,2335,2338,2339,2341,2342,2345],{},[897,2336,2337],{},"Renders are not in the frames."," A patch carries each op in its timeline form, with a card's render replaced by its signature. On a ",[917,2340,1581],{},", read that card again as yourself with ",[917,2343,2344],{},"dgi.view.render"," and the card's source.",[910,2347,2348,933,2351,2354,2355,2358,2359,2362],{},[897,2349,2350],{},"Close codes.",[917,2352,2353],{},"4401"," authentication, ",[917,2356,2357],{},"4404"," a malformed surface id, ",[917,2360,2361],{},"4500"," a server error.",[992,2364,2368],{"className":2365,"code":2366,"language":2367,"meta":998,"style":998},"language-ts shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","const token = btoa(accessToken).replace(/\\+/g, '-').replace(/\\//g, '_').replace(/=+$/, '')\nconst ws = new WebSocket(\n  `wss://stream.orkestia.dev/streaming/surface/${surfaceUuid}?after_seq=${lastSeq}`,\n  [`ltinteg-bearer.${token}`, 'ltinteg-surface.v1']\n)\nws.onmessage = (event) => {\n  const frame = JSON.parse(event.data)\n  if (frame.type === 'surface.patch' && frame.seq > lastSeq) {\n    applyOps(frame.ops)   // your reducer\n    lastSeq = frame.seq\n  } else if (frame.type === 'surface.resync' || frame.type === 'timeout') {\n    reloadAndReconnect()\n  }\n}\n","ts",[917,2369,2370,2481,2500,2532,2562,2567,2594,2625,2670,2691,2706,2755,2764,2770],{"__ignoreMap":998},[2371,2372,2375,2379,2383,2387,2391,2394,2396,2398,2401,2404,2407,2409,2413,2416,2419,2423,2426,2428,2430,2432,2434,2436,2439,2441,2443,2445,2447,2450,2452,2454,2456,2458,2460,2462,2464,2467,2471,2473,2475,2478],"span",{"class":2373,"line":2374},"line",1,[2371,2376,2378],{"class":2377},"spNyl","const",[2371,2380,2382],{"class":2381},"sTEyZ"," token ",[2371,2384,2386],{"class":2385},"sMK4o","=",[2371,2388,2390],{"class":2389},"s2Zo4"," btoa",[2371,2392,2393],{"class":2381},"(accessToken)",[2371,2395,900],{"class":2385},[2371,2397,1581],{"class":2389},[2371,2399,2400],{"class":2381},"(",[2371,2402,2403],{"class":2385},"/",[2371,2405,2406],{"class":2381},"\\+",[2371,2408,2403],{"class":2385},[2371,2410,2412],{"class":2411},"sbssI","g",[2371,2414,2415],{"class":2385},",",[2371,2417,2418],{"class":2385}," '",[2371,2420,2422],{"class":2421},"sfazB","-",[2371,2424,2425],{"class":2385},"'",[2371,2427,1166],{"class":2381},[2371,2429,900],{"class":2385},[2371,2431,1581],{"class":2389},[2371,2433,2400],{"class":2381},[2371,2435,2403],{"class":2385},[2371,2437,2438],{"class":2381},"\\/",[2371,2440,2403],{"class":2385},[2371,2442,2412],{"class":2411},[2371,2444,2415],{"class":2385},[2371,2446,2418],{"class":2385},[2371,2448,2449],{"class":2421},"_",[2371,2451,2425],{"class":2385},[2371,2453,1166],{"class":2381},[2371,2455,900],{"class":2385},[2371,2457,1581],{"class":2389},[2371,2459,2400],{"class":2381},[2371,2461,2403],{"class":2385},[2371,2463,2386],{"class":2421},[2371,2465,2466],{"class":2385},"+",[2371,2468,2470],{"class":2469},"s7zQu","$",[2371,2472,2403],{"class":2385},[2371,2474,2415],{"class":2385},[2371,2476,2477],{"class":2385}," ''",[2371,2479,2480],{"class":2381},")\n",[2371,2482,2484,2486,2489,2491,2494,2497],{"class":2373,"line":2483},2,[2371,2485,2378],{"class":2377},[2371,2487,2488],{"class":2381}," ws ",[2371,2490,2386],{"class":2385},[2371,2492,2493],{"class":2385}," new",[2371,2495,2496],{"class":2389}," WebSocket",[2371,2498,2499],{"class":2381},"(\n",[2371,2501,2503,2506,2509,2512,2515,2518,2521,2523,2526,2529],{"class":2373,"line":2502},3,[2371,2504,2505],{"class":2385},"  `",[2371,2507,2508],{"class":2421},"wss://stream.orkestia.dev/streaming/surface/",[2371,2510,2511],{"class":2385},"${",[2371,2513,2514],{"class":2381},"surfaceUuid",[2371,2516,2517],{"class":2385},"}",[2371,2519,2520],{"class":2421},"?after_seq=",[2371,2522,2511],{"class":2385},[2371,2524,2525],{"class":2381},"lastSeq",[2371,2527,2528],{"class":2385},"}`",[2371,2530,2531],{"class":2385},",\n",[2371,2533,2535,2538,2541,2544,2546,2549,2551,2553,2555,2557,2559],{"class":2373,"line":2534},4,[2371,2536,2537],{"class":2381},"  [",[2371,2539,2540],{"class":2385},"`",[2371,2542,2543],{"class":2421},"ltinteg-bearer.",[2371,2545,2511],{"class":2385},[2371,2547,2548],{"class":2381},"token",[2371,2550,2528],{"class":2385},[2371,2552,2415],{"class":2385},[2371,2554,2418],{"class":2385},[2371,2556,2195],{"class":2421},[2371,2558,2425],{"class":2385},[2371,2560,2561],{"class":2381},"]\n",[2371,2563,2565],{"class":2373,"line":2564},5,[2371,2566,2480],{"class":2381},[2371,2568,2570,2573,2575,2578,2581,2583,2586,2588,2591],{"class":2373,"line":2569},6,[2371,2571,2572],{"class":2381},"ws",[2371,2574,900],{"class":2385},[2371,2576,2577],{"class":2389},"onmessage",[2371,2579,2580],{"class":2385}," =",[2371,2582,1150],{"class":2385},[2371,2584,1157],{"class":2585},"sHdIc",[2371,2587,1166],{"class":2385},[2371,2589,2590],{"class":2377}," =>",[2371,2592,2593],{"class":2385}," {\n",[2371,2595,2597,2600,2603,2605,2608,2610,2613,2616,2618,2620,2623],{"class":2373,"line":2596},7,[2371,2598,2599],{"class":2377},"  const",[2371,2601,2602],{"class":2381}," frame",[2371,2604,2580],{"class":2385},[2371,2606,2607],{"class":2381}," JSON",[2371,2609,900],{"class":2385},[2371,2611,2612],{"class":2389},"parse",[2371,2614,2400],{"class":2615},"swJcz",[2371,2617,1157],{"class":2381},[2371,2619,900],{"class":2385},[2371,2621,2622],{"class":2381},"data",[2371,2624,2480],{"class":2615},[2371,2626,2628,2631,2633,2636,2638,2640,2643,2645,2647,2649,2652,2654,2656,2658,2661,2664,2667],{"class":2373,"line":2627},8,[2371,2629,2630],{"class":2469},"  if",[2371,2632,1150],{"class":2615},[2371,2634,2635],{"class":2381},"frame",[2371,2637,900],{"class":2385},[2371,2639,2221],{"class":2381},[2371,2641,2642],{"class":2385}," ===",[2371,2644,2418],{"class":2385},[2371,2646,966],{"class":2421},[2371,2648,2425],{"class":2385},[2371,2650,2651],{"class":2385}," &&",[2371,2653,2602],{"class":2381},[2371,2655,900],{"class":2385},[2371,2657,970],{"class":2381},[2371,2659,2660],{"class":2385}," >",[2371,2662,2663],{"class":2381}," lastSeq",[2371,2665,2666],{"class":2615},") ",[2371,2668,2669],{"class":2385},"{\n",[2371,2671,2673,2676,2678,2680,2682,2684,2687],{"class":2373,"line":2672},9,[2371,2674,2675],{"class":2389},"    applyOps",[2371,2677,2400],{"class":2615},[2371,2679,2635],{"class":2381},[2371,2681,900],{"class":2385},[2371,2683,1219],{"class":2381},[2371,2685,2686],{"class":2615},")   ",[2371,2688,2690],{"class":2689},"sHwdD","// your reducer\n",[2371,2692,2694,2697,2699,2701,2703],{"class":2373,"line":2693},10,[2371,2695,2696],{"class":2381},"    lastSeq",[2371,2698,2580],{"class":2385},[2371,2700,2602],{"class":2381},[2371,2702,900],{"class":2385},[2371,2704,2705],{"class":2381},"seq\n",[2371,2707,2709,2712,2715,2718,2720,2722,2724,2726,2728,2730,2732,2734,2737,2739,2741,2743,2745,2747,2749,2751,2753],{"class":2373,"line":2708},11,[2371,2710,2711],{"class":2385},"  }",[2371,2713,2714],{"class":2469}," else",[2371,2716,2717],{"class":2469}," if",[2371,2719,1150],{"class":2615},[2371,2721,2635],{"class":2381},[2371,2723,900],{"class":2385},[2371,2725,2221],{"class":2381},[2371,2727,2642],{"class":2385},[2371,2729,2418],{"class":2385},[2371,2731,2270],{"class":2421},[2371,2733,2425],{"class":2385},[2371,2735,2736],{"class":2385}," ||",[2371,2738,2602],{"class":2381},[2371,2740,900],{"class":2385},[2371,2742,2221],{"class":2381},[2371,2744,2642],{"class":2385},[2371,2746,2418],{"class":2385},[2371,2748,2306],{"class":2421},[2371,2750,2425],{"class":2385},[2371,2752,2666],{"class":2615},[2371,2754,2669],{"class":2385},[2371,2756,2758,2761],{"class":2373,"line":2757},12,[2371,2759,2760],{"class":2389},"    reloadAndReconnect",[2371,2762,2763],{"class":2615},"()\n",[2371,2765,2767],{"class":2373,"line":2766},13,[2371,2768,2769],{"class":2385},"  }\n",[2371,2771,2773],{"class":2373,"line":2772},14,[2371,2774,2775],{"class":2385},"}\n",[902,2777,2779],{"id":2778},"event-born-surfaces","Event-born surfaces",[885,2781,2782,2783,2786,2787,2789,2790,2792,2793,2796,2797,2800,2801,2804],{},"An event binding can create a surface with ",[917,2784,2785],{},"origin: \"event\"",", an intent and a ",[917,2788,1491],{}," (the incident's reads). The binding's owner owns it, and every member of the organization can see it. A ",[917,2791,1255],{}," event whose source is ",[917,2794,2795],{},"incident.resolved"," (or ",[917,2798,2799],{},"resolve",", or whose payload has ",[917,2802,2803],{},"resolved: true",") retires it on the next tick.",[902,2806,2808],{"id":2807},"security","Security",[907,2810,2811,2822,2831,2840,2856],{},[910,2812,2813,2815,2816,2818,2819,900],{},[897,2814,981],{}," An end-user principal is refused (",[917,2817,985],{},"). A surface is readable by its owner, or by every member of its organization when it is event-born. Anything else, including another organization's surface, reads as ",[917,2820,2821],{},"surface_not_found",[910,2823,2824,2827,2828,2830],{},[897,2825,2826],{},"Scope pinned."," Cards read only the policy's ",[917,2829,1551],{},", intersected with what the viewer may run, and are read again as the viewer.",[910,2832,2833,2836,2837,2839],{},[897,2834,2835],{},"The patch is the contract."," Jev and the LLM only propose. Every op is validated before it is applied, and refused ops are returned in ",[917,2838,1237],{}," with the phase that refused them.",[910,2841,2842,2844,2845,2848,2849,2851,2852,2855],{},[897,2843,975],{}," A write row action becomes a confirm card carrying ",[917,2846,2847],{},"sha256(canonical_json(input))",", and the proposal is stored on the server. It runs only when a ",[917,2850,1704],{}," confirm names the same workflow and hash, in the owner's own tick. A hash that names no stored proposal is refused (",[917,2853,2854],{},"ui_action_tampered","). Typed text and model output never confirm.",[910,2857,2858,2861],{},[897,2859,2860],{},"Ids stay on the server."," Row ids, row actions and confirm proposals never appear in the surface, the timeline or the stream.",[885,2863,2864,2867],{},[917,2865,2866],{},"surface_store_unavailable"," means surfaces are not enabled for your environment yet.",[902,2869,2871],{"id":2870},"example-curl","Example: curl",[992,2873,2877],{"className":2874,"code":2875,"language":2876,"meta":998,"style":998},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","API=\"https://workflow-api.orkestia.dev\"\nAUTH=\"Authorization: Bearer $TOKEN\"\n\nstart() {  # start a workflow and wait until it ends\n  wid=$(curl -s -X POST \"$API/api/workflows/start\" -H \"$AUTH\" -H 'Content-Type: application/json' \\\n          -d \"{\\\"workflow_type\\\": \\\"$1\\\", \\\"initial_data\\\": $2}\" | jq -r .workflow_id)\n  until curl -s \"$API/api/workflows/$wid\" -H \"$AUTH\" | jq -e '.is_terminal' >/dev/null; do sleep 1; done\n  curl -s \"$API/api/workflows/$wid\" -H \"$AUTH\" | jq .state_data\n}\n\n# 1. Create: Jev only (llm_fallback false), heartbeat every 5 minutes.\nstart dgi.surface.create '{\"intent\": \"keep the platform healthy\",\n  \"policy\": {\"allowed_workflow_types\": [\"audit.workflow-run.*\", \"audit.finding.*\", \"ticket.*\"],\n             \"mutation_budget\": 2, \"renderers\": [\"kpi\", \"chart\", \"table\", \"run\", \"confirm\"]}}'\n# -> {\"surface_uuid\": \"5f0c…\", \"rev\": 0, \"heartbeat_status\": \"active\", ...}\n\n# 2. Tick now (the heartbeat does the same every 5 minutes).\nstart dgi.surface.tick '{\"surface_uuid\": \"5f0c…\", \"signals\": [{\"kind\": \"timer\", \"at\": 0}]}'\n# -> {\"decision_path\": \"jev\", \"ops\": [{\"op\": \"add\", \"parent\": \"root\", \"node\": {\"kind\": \"block\",\n#       \"block\": {\"renderer\": \"kpi\", ...}, \"source\": {...}}}],\n#     \"why\": \"vitals first, no model needed\", \"continuation\": {\"mode\": \"continue\"},\n#     \"rev\": 1, \"seq\": 1, \"persisted\": true}\n\n# 3. The viewer dismisses a card; an alert wakes the surface.\nstart dgi.surface.tick '{\"surface_uuid\": \"5f0c…\", \"signals\": [{\"kind\": \"user_action\", \"ui_id\": \"ui-live-…\",\n  \"action\": \"cancel\", \"at\": 0}]}'\nstart dgi.surface.signal '{\"surface_uuid\": \"5f0c…\", \"signal\": {\"kind\": \"event\", \"source\": \"sentry.alert\"},\n  \"tick_now\": true}'\n\n# 4. Read it back, and open one table row (the row's id never leaves the server).\nstart data.dgi.surface.get '{\"surface_uuid\": \"5f0c…\", \"since_seq\": 0}'\nstart data.dgi.surface.row '{\"surface_uuid\": \"5f0c…\", \"ui_id\": \"ui-live-…\", \"row\": 0}'\n\n# 5. Done with it.\nstart dgi.surface.archive '{\"surface_uuid\": \"5f0c…\"}'\n","bash",[917,2878,2879,2895,2912,2918,2932,2986,3046,3112,3144,3148,3152,3157,3169,3174,3182,3188,3193,3199,3214,3220,3226,3232,3238,3243,3249,3261,3269,3282,3290,3295,3301,3316,3331,3336,3342],{"__ignoreMap":998},[2371,2880,2881,2884,2886,2889,2892],{"class":2373,"line":2374},[2371,2882,2883],{"class":2381},"API",[2371,2885,2386],{"class":2385},[2371,2887,2888],{"class":2385},"\"",[2371,2890,2891],{"class":2421},"https://workflow-api.orkestia.dev",[2371,2893,2894],{"class":2385},"\"\n",[2371,2896,2897,2900,2902,2904,2907,2910],{"class":2373,"line":2483},[2371,2898,2899],{"class":2381},"AUTH",[2371,2901,2386],{"class":2385},[2371,2903,2888],{"class":2385},[2371,2905,2906],{"class":2421},"Authorization: Bearer ",[2371,2908,2909],{"class":2381},"$TOKEN",[2371,2911,2894],{"class":2385},[2371,2913,2914],{"class":2373,"line":2502},[2371,2915,2917],{"emptyLinePlaceholder":2916},true,"\n",[2371,2919,2920,2923,2926,2929],{"class":2373,"line":2534},[2371,2921,2922],{"class":2389},"start",[2371,2924,2925],{"class":2385},"()",[2371,2927,2928],{"class":2385}," {",[2371,2930,2931],{"class":2689},"  # start a workflow and wait until it ends\n",[2371,2933,2934,2937,2940,2944,2947,2950,2953,2956,2959,2962,2964,2967,2969,2972,2974,2976,2978,2981,2983],{"class":2373,"line":2564},[2371,2935,2936],{"class":2381},"  wid",[2371,2938,2939],{"class":2385},"=$(",[2371,2941,2943],{"class":2942},"sBMFI","curl",[2371,2945,2946],{"class":2421}," -s",[2371,2948,2949],{"class":2421}," -X",[2371,2951,2952],{"class":2421}," POST",[2371,2954,2955],{"class":2385}," \"",[2371,2957,2958],{"class":2381},"$API",[2371,2960,2961],{"class":2421},"/api/workflows/start",[2371,2963,2888],{"class":2385},[2371,2965,2966],{"class":2421}," -H",[2371,2968,2955],{"class":2385},[2371,2970,2971],{"class":2381},"$AUTH",[2371,2973,2888],{"class":2385},[2371,2975,2966],{"class":2421},[2371,2977,2418],{"class":2385},[2371,2979,2980],{"class":2421},"Content-Type: application/json",[2371,2982,2425],{"class":2385},[2371,2984,2985],{"class":2381}," \\\n",[2371,2987,2988,2991,2993,2996,2999,3002,3004,3007,3009,3012,3014,3016,3018,3021,3023,3025,3028,3030,3032,3035,3038,3041,3044],{"class":2373,"line":2569},[2371,2989,2990],{"class":2421},"          -d",[2371,2992,2955],{"class":2385},[2371,2994,2995],{"class":2421},"{",[2371,2997,2998],{"class":2381},"\\\"",[2371,3000,3001],{"class":2421},"workflow_type",[2371,3003,2998],{"class":2381},[2371,3005,3006],{"class":2421},": ",[2371,3008,2998],{"class":2381},[2371,3010,3011],{"class":2585},"$1",[2371,3013,2998],{"class":2381},[2371,3015,920],{"class":2421},[2371,3017,2998],{"class":2381},[2371,3019,3020],{"class":2421},"initial_data",[2371,3022,2998],{"class":2381},[2371,3024,3006],{"class":2421},[2371,3026,3027],{"class":2585},"$2",[2371,3029,2517],{"class":2421},[2371,3031,2888],{"class":2385},[2371,3033,3034],{"class":2385}," |",[2371,3036,3037],{"class":2942}," jq",[2371,3039,3040],{"class":2421}," -r",[2371,3042,3043],{"class":2421}," .workflow_id",[2371,3045,2480],{"class":2385},[2371,3047,3048,3051,3054,3056,3058,3060,3063,3066,3068,3070,3072,3074,3076,3078,3080,3083,3085,3088,3090,3092,3095,3098,3101,3104,3107,3109],{"class":2373,"line":2596},[2371,3049,3050],{"class":2469},"  until",[2371,3052,3053],{"class":2942}," curl",[2371,3055,2946],{"class":2421},[2371,3057,2955],{"class":2385},[2371,3059,2958],{"class":2381},[2371,3061,3062],{"class":2421},"/api/workflows/",[2371,3064,3065],{"class":2381},"$wid",[2371,3067,2888],{"class":2385},[2371,3069,2966],{"class":2421},[2371,3071,2955],{"class":2385},[2371,3073,2971],{"class":2381},[2371,3075,2888],{"class":2385},[2371,3077,3034],{"class":2385},[2371,3079,3037],{"class":2942},[2371,3081,3082],{"class":2421}," -e",[2371,3084,2418],{"class":2385},[2371,3086,3087],{"class":2421},".is_terminal",[2371,3089,2425],{"class":2385},[2371,3091,2660],{"class":2385},[2371,3093,3094],{"class":2421},"/dev/null",[2371,3096,3097],{"class":2385},";",[2371,3099,3100],{"class":2469}," do",[2371,3102,3103],{"class":2942}," sleep",[2371,3105,3106],{"class":2411}," 1",[2371,3108,3097],{"class":2385},[2371,3110,3111],{"class":2469}," done\n",[2371,3113,3114,3117,3119,3121,3123,3125,3127,3129,3131,3133,3135,3137,3139,3141],{"class":2373,"line":2627},[2371,3115,3116],{"class":2942},"  curl",[2371,3118,2946],{"class":2421},[2371,3120,2955],{"class":2385},[2371,3122,2958],{"class":2381},[2371,3124,3062],{"class":2421},[2371,3126,3065],{"class":2381},[2371,3128,2888],{"class":2385},[2371,3130,2966],{"class":2421},[2371,3132,2955],{"class":2385},[2371,3134,2971],{"class":2381},[2371,3136,2888],{"class":2385},[2371,3138,3034],{"class":2385},[2371,3140,3037],{"class":2942},[2371,3142,3143],{"class":2421}," .state_data\n",[2371,3145,3146],{"class":2373,"line":2672},[2371,3147,2775],{"class":2385},[2371,3149,3150],{"class":2373,"line":2693},[2371,3151,2917],{"emptyLinePlaceholder":2916},[2371,3153,3154],{"class":2373,"line":2708},[2371,3155,3156],{"class":2689},"# 1. Create: Jev only (llm_fallback false), heartbeat every 5 minutes.\n",[2371,3158,3159,3161,3164,3166],{"class":2373,"line":2757},[2371,3160,2922],{"class":2942},[2371,3162,3163],{"class":2421}," dgi.surface.create",[2371,3165,2418],{"class":2385},[2371,3167,3168],{"class":2421},"{\"intent\": \"keep the platform healthy\",\n",[2371,3170,3171],{"class":2373,"line":2766},[2371,3172,3173],{"class":2421},"  \"policy\": {\"allowed_workflow_types\": [\"audit.workflow-run.*\", \"audit.finding.*\", \"ticket.*\"],\n",[2371,3175,3176,3179],{"class":2373,"line":2772},[2371,3177,3178],{"class":2421},"             \"mutation_budget\": 2, \"renderers\": [\"kpi\", \"chart\", \"table\", \"run\", \"confirm\"]}}",[2371,3180,3181],{"class":2385},"'\n",[2371,3183,3185],{"class":2373,"line":3184},15,[2371,3186,3187],{"class":2689},"# -> {\"surface_uuid\": \"5f0c…\", \"rev\": 0, \"heartbeat_status\": \"active\", ...}\n",[2371,3189,3191],{"class":2373,"line":3190},16,[2371,3192,2917],{"emptyLinePlaceholder":2916},[2371,3194,3196],{"class":2373,"line":3195},17,[2371,3197,3198],{"class":2689},"# 2. Tick now (the heartbeat does the same every 5 minutes).\n",[2371,3200,3202,3204,3207,3209,3212],{"class":2373,"line":3201},18,[2371,3203,2922],{"class":2942},[2371,3205,3206],{"class":2421}," dgi.surface.tick",[2371,3208,2418],{"class":2385},[2371,3210,3211],{"class":2421},"{\"surface_uuid\": \"5f0c…\", \"signals\": [{\"kind\": \"timer\", \"at\": 0}]}",[2371,3213,3181],{"class":2385},[2371,3215,3217],{"class":2373,"line":3216},19,[2371,3218,3219],{"class":2689},"# -> {\"decision_path\": \"jev\", \"ops\": [{\"op\": \"add\", \"parent\": \"root\", \"node\": {\"kind\": \"block\",\n",[2371,3221,3223],{"class":2373,"line":3222},20,[2371,3224,3225],{"class":2689},"#       \"block\": {\"renderer\": \"kpi\", ...}, \"source\": {...}}}],\n",[2371,3227,3229],{"class":2373,"line":3228},21,[2371,3230,3231],{"class":2689},"#     \"why\": \"vitals first, no model needed\", \"continuation\": {\"mode\": \"continue\"},\n",[2371,3233,3235],{"class":2373,"line":3234},22,[2371,3236,3237],{"class":2689},"#     \"rev\": 1, \"seq\": 1, \"persisted\": true}\n",[2371,3239,3241],{"class":2373,"line":3240},23,[2371,3242,2917],{"emptyLinePlaceholder":2916},[2371,3244,3246],{"class":2373,"line":3245},24,[2371,3247,3248],{"class":2689},"# 3. The viewer dismisses a card; an alert wakes the surface.\n",[2371,3250,3252,3254,3256,3258],{"class":2373,"line":3251},25,[2371,3253,2922],{"class":2942},[2371,3255,3206],{"class":2421},[2371,3257,2418],{"class":2385},[2371,3259,3260],{"class":2421},"{\"surface_uuid\": \"5f0c…\", \"signals\": [{\"kind\": \"user_action\", \"ui_id\": \"ui-live-…\",\n",[2371,3262,3264,3267],{"class":2373,"line":3263},26,[2371,3265,3266],{"class":2421},"  \"action\": \"cancel\", \"at\": 0}]}",[2371,3268,3181],{"class":2385},[2371,3270,3272,3274,3277,3279],{"class":2373,"line":3271},27,[2371,3273,2922],{"class":2942},[2371,3275,3276],{"class":2421}," dgi.surface.signal",[2371,3278,2418],{"class":2385},[2371,3280,3281],{"class":2421},"{\"surface_uuid\": \"5f0c…\", \"signal\": {\"kind\": \"event\", \"source\": \"sentry.alert\"},\n",[2371,3283,3285,3288],{"class":2373,"line":3284},28,[2371,3286,3287],{"class":2421},"  \"tick_now\": true}",[2371,3289,3181],{"class":2385},[2371,3291,3293],{"class":2373,"line":3292},29,[2371,3294,2917],{"emptyLinePlaceholder":2916},[2371,3296,3298],{"class":2373,"line":3297},30,[2371,3299,3300],{"class":2689},"# 4. Read it back, and open one table row (the row's id never leaves the server).\n",[2371,3302,3304,3306,3309,3311,3314],{"class":2373,"line":3303},31,[2371,3305,2922],{"class":2942},[2371,3307,3308],{"class":2421}," data.dgi.surface.get",[2371,3310,2418],{"class":2385},[2371,3312,3313],{"class":2421},"{\"surface_uuid\": \"5f0c…\", \"since_seq\": 0}",[2371,3315,3181],{"class":2385},[2371,3317,3319,3321,3324,3326,3329],{"class":2373,"line":3318},32,[2371,3320,2922],{"class":2942},[2371,3322,3323],{"class":2421}," data.dgi.surface.row",[2371,3325,2418],{"class":2385},[2371,3327,3328],{"class":2421},"{\"surface_uuid\": \"5f0c…\", \"ui_id\": \"ui-live-…\", \"row\": 0}",[2371,3330,3181],{"class":2385},[2371,3332,3334],{"class":2373,"line":3333},33,[2371,3335,2917],{"emptyLinePlaceholder":2916},[2371,3337,3339],{"class":2373,"line":3338},34,[2371,3340,3341],{"class":2689},"# 5. Done with it.\n",[2371,3343,3345,3347,3350,3352,3355],{"class":2373,"line":3344},35,[2371,3346,2922],{"class":2942},[2371,3348,3349],{"class":2421}," dgi.surface.archive",[2371,3351,2418],{"class":2385},[2371,3353,3354],{"class":2421},"{\"surface_uuid\": \"5f0c…\"}",[2371,3356,3181],{"class":2385},[902,3358,3360],{"id":3359},"example-python","Example: Python",[992,3362,3366],{"className":3363,"code":3364,"language":3365,"meta":998,"style":998},"language-python shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","import time\nimport requests\n\nAPI = \"https://workflow-api.orkestia.dev\"\nHEADERS = {\"Authorization\": f\"Bearer {TOKEN}\"}\n\n\ndef run(workflow_type: str, initial_data: dict) -> dict:\n    started = requests.post(f\"{API}/api/workflows/start\", headers=HEADERS,\n                            json={\"workflow_type\": workflow_type, \"initial_data\": initial_data}).json()\n    while True:\n        state = requests.get(f\"{API}/api/workflows/{started['workflow_id']}\", headers=HEADERS).json()\n        if state.get(\"is_terminal\"):\n            return state[\"state_data\"]\n        time.sleep(0.5)\n\n\nsurface = run(\"dgi.surface.create\", {\n    \"intent\": \"incident room\",\n    \"policy\": {\"allowed_workflow_types\": [\"audit.*\", \"ticket.*\"], \"llm_fallback\": True, \"llm_budget\": 10},\n    \"seed\": [{\"workflow_type\": \"audit.finding.list\", \"input\": {\"limit\": 20},\n              \"view\": {\"kind\": \"table\", \"title\": \"Open findings\"}}],\n})\nuuid = surface[\"surface_uuid\"]\ntick = run(\"dgi.surface.tick\", {\"surface_uuid\": uuid})\nfor op in tick[\"ops\"]:\n    print(op[\"op\"], op.get(\"node\", {}).get(\"block\", {}).get(\"title\"))\nprint(tick[\"decision_path\"], tick[\"why\"], tick[\"usage\"])\n\n# A write proposed as a confirm card runs only when the owner confirms the stored hash in their own tick.\nconfirm = next((op[\"node\"][\"block\"] for op in tick[\"ops\"]\n                if op[\"op\"] == \"add\" and op[\"node\"][\"block\"][\"renderer\"] == \"confirm\"), None)\nif confirm:\n    run(\"dgi.surface.tick\", {\"surface_uuid\": uuid, \"signals\": [{\n        \"kind\": \"user_action\", \"ui_id\": confirm[\"ui_id\"], \"action\": \"confirm\", \"at\": 0,\n        \"values\": {\"workflow_type\": confirm[\"pending_action\"][\"workflowType\"],\n                   \"hash\": confirm[\"pending_action\"][\"hash\"]}}]})\n","python",[917,3367,3368,3373,3378,3382,3387,3392,3396,3400,3405,3410,3415,3420,3425,3430,3435,3440,3444,3448,3453,3458,3463,3468,3473,3478,3483,3488,3493,3498,3503,3507,3512,3517,3522,3527,3532,3537,3543],{"__ignoreMap":998},[2371,3369,3370],{"class":2373,"line":2374},[2371,3371,3372],{},"import time\n",[2371,3374,3375],{"class":2373,"line":2483},[2371,3376,3377],{},"import requests\n",[2371,3379,3380],{"class":2373,"line":2502},[2371,3381,2917],{"emptyLinePlaceholder":2916},[2371,3383,3384],{"class":2373,"line":2534},[2371,3385,3386],{},"API = \"https://workflow-api.orkestia.dev\"\n",[2371,3388,3389],{"class":2373,"line":2564},[2371,3390,3391],{},"HEADERS = {\"Authorization\": f\"Bearer {TOKEN}\"}\n",[2371,3393,3394],{"class":2373,"line":2569},[2371,3395,2917],{"emptyLinePlaceholder":2916},[2371,3397,3398],{"class":2373,"line":2596},[2371,3399,2917],{"emptyLinePlaceholder":2916},[2371,3401,3402],{"class":2373,"line":2627},[2371,3403,3404],{},"def run(workflow_type: str, initial_data: dict) -> dict:\n",[2371,3406,3407],{"class":2373,"line":2672},[2371,3408,3409],{},"    started = requests.post(f\"{API}/api/workflows/start\", headers=HEADERS,\n",[2371,3411,3412],{"class":2373,"line":2693},[2371,3413,3414],{},"                            json={\"workflow_type\": workflow_type, \"initial_data\": initial_data}).json()\n",[2371,3416,3417],{"class":2373,"line":2708},[2371,3418,3419],{},"    while True:\n",[2371,3421,3422],{"class":2373,"line":2757},[2371,3423,3424],{},"        state = requests.get(f\"{API}/api/workflows/{started['workflow_id']}\", headers=HEADERS).json()\n",[2371,3426,3427],{"class":2373,"line":2766},[2371,3428,3429],{},"        if state.get(\"is_terminal\"):\n",[2371,3431,3432],{"class":2373,"line":2772},[2371,3433,3434],{},"            return state[\"state_data\"]\n",[2371,3436,3437],{"class":2373,"line":3184},[2371,3438,3439],{},"        time.sleep(0.5)\n",[2371,3441,3442],{"class":2373,"line":3190},[2371,3443,2917],{"emptyLinePlaceholder":2916},[2371,3445,3446],{"class":2373,"line":3195},[2371,3447,2917],{"emptyLinePlaceholder":2916},[2371,3449,3450],{"class":2373,"line":3201},[2371,3451,3452],{},"surface = run(\"dgi.surface.create\", {\n",[2371,3454,3455],{"class":2373,"line":3216},[2371,3456,3457],{},"    \"intent\": \"incident room\",\n",[2371,3459,3460],{"class":2373,"line":3222},[2371,3461,3462],{},"    \"policy\": {\"allowed_workflow_types\": [\"audit.*\", \"ticket.*\"], \"llm_fallback\": True, \"llm_budget\": 10},\n",[2371,3464,3465],{"class":2373,"line":3228},[2371,3466,3467],{},"    \"seed\": [{\"workflow_type\": \"audit.finding.list\", \"input\": {\"limit\": 20},\n",[2371,3469,3470],{"class":2373,"line":3234},[2371,3471,3472],{},"              \"view\": {\"kind\": \"table\", \"title\": \"Open findings\"}}],\n",[2371,3474,3475],{"class":2373,"line":3240},[2371,3476,3477],{},"})\n",[2371,3479,3480],{"class":2373,"line":3245},[2371,3481,3482],{},"uuid = surface[\"surface_uuid\"]\n",[2371,3484,3485],{"class":2373,"line":3251},[2371,3486,3487],{},"tick = run(\"dgi.surface.tick\", {\"surface_uuid\": uuid})\n",[2371,3489,3490],{"class":2373,"line":3263},[2371,3491,3492],{},"for op in tick[\"ops\"]:\n",[2371,3494,3495],{"class":2373,"line":3271},[2371,3496,3497],{},"    print(op[\"op\"], op.get(\"node\", {}).get(\"block\", {}).get(\"title\"))\n",[2371,3499,3500],{"class":2373,"line":3284},[2371,3501,3502],{},"print(tick[\"decision_path\"], tick[\"why\"], tick[\"usage\"])\n",[2371,3504,3505],{"class":2373,"line":3292},[2371,3506,2917],{"emptyLinePlaceholder":2916},[2371,3508,3509],{"class":2373,"line":3297},[2371,3510,3511],{},"# A write proposed as a confirm card runs only when the owner confirms the stored hash in their own tick.\n",[2371,3513,3514],{"class":2373,"line":3303},[2371,3515,3516],{},"confirm = next((op[\"node\"][\"block\"] for op in tick[\"ops\"]\n",[2371,3518,3519],{"class":2373,"line":3318},[2371,3520,3521],{},"                if op[\"op\"] == \"add\" and op[\"node\"][\"block\"][\"renderer\"] == \"confirm\"), None)\n",[2371,3523,3524],{"class":2373,"line":3333},[2371,3525,3526],{},"if confirm:\n",[2371,3528,3529],{"class":2373,"line":3338},[2371,3530,3531],{},"    run(\"dgi.surface.tick\", {\"surface_uuid\": uuid, \"signals\": [{\n",[2371,3533,3534],{"class":2373,"line":3344},[2371,3535,3536],{},"        \"kind\": \"user_action\", \"ui_id\": confirm[\"ui_id\"], \"action\": \"confirm\", \"at\": 0,\n",[2371,3538,3540],{"class":2373,"line":3539},36,[2371,3541,3542],{},"        \"values\": {\"workflow_type\": confirm[\"pending_action\"][\"workflowType\"],\n",[2371,3544,3546],{"class":2373,"line":3545},37,[2371,3547,3548],{},"                   \"hash\": confirm[\"pending_action\"][\"hash\"]}}]})\n",[902,3550,3552],{"id":3551},"ask-your-ai-assistant","Ask your AI assistant",[992,3554,3558],{"className":3555,"code":3556,"filename":3557,"language":997,"meta":998},[995],"Using https://docs.orkestia.dev/raw/chat/living-surfaces.md, draft a dgi.surface.create call for a surface that watches failed workflow runs and open tickets, Jev only, with at most 6 cards. Do not start it.\n\nShow me my live surfaces with data.dgi.surface.list and explain the last three decisions on the newest one.\n\nWrite a browser client that opens the surface patch stream, resumes from the last seq, and reloads on surface.resync.\n","prompts",[917,3559,3556],{"__ignoreMap":998},[902,3561,3563],{"id":3562},"for-ai-agents","For AI agents",[1002,3565,3566,3576],{},[1005,3567,3568],{},[1008,3569,3570,3573],{},[1011,3571,3572],{},"Rule",[1011,3574,3575],{},"Detail",[1018,3577,3578,3596,3604,3614,3625,3636,3653],{},[1008,3579,3580,3583],{},[1023,3581,3582],{},"Discover",[1023,3584,3585,1603,3588,3591,3592,3595],{},[917,3586,3587],{},"list_workflow_types(prefix=\"dgi.surface.\")",[917,3589,3590],{},"prefix=\"data.dgi.surface.\"",", then ",[917,3593,3594],{},"get_workflow_schema"," before proposing a call",[1008,3597,3598,3601],{},[1023,3599,3600],{},"Callers",[1023,3602,3603],{},"Organization members only. End users are refused",[1008,3605,3606,3609],{},[1023,3607,3608],{},"Scope",[1023,3610,3611,3612],{},"Never propose an empty ",[917,3613,1551],{},[1008,3615,3616,3619],{},[1023,3617,3618],{},"LLM",[1023,3620,3621,3622,3624],{},"Leave ",[917,3623,1985],{}," off unless the user asks: it spends the organization's tokens",[1008,3626,3627,3630],{},[1023,3628,3629],{},"Writes",[1023,3631,3632,3633,3635],{},"Never confirm for the user. A confirm is a ",[917,3634,1704],{}," with the stored hash, in the owner's own tick",[1008,3637,3638,3641],{},[1023,3639,3640],{},"Confirm with the user first",[1023,3642,3643,3645,3646,920,3648,920,3650,3652],{},[917,3644,1135],{}," (it registers a schedule), ",[917,3647,1410],{},[917,3649,1329],{},[917,3651,1351],{}," with a hash",[1008,3654,3655,3658],{},[1023,3656,3657],{},"Safe to start",[1023,3659,3660,920,3662,920,3664,920,3666,3668],{},[917,3661,1282],{},[917,3663,1307],{},[917,3665,1440],{},[917,3667,1351],{}," without a hash (it only proposes)",[3670,3671,3672],"style",{},"html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .s7zQu, html code.shiki .s7zQu{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#89DDFF;--shiki-default-font-style:italic;--shiki-dark:#89DDFF;--shiki-dark-font-style:italic}html pre.shiki code .sHdIc, html code.shiki .sHdIc{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#EEFFFF;--shiki-default-font-style:italic;--shiki-dark:#BABED8;--shiki-dark-font-style:italic}html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}html pre.shiki code .sHwdD, html code.shiki .sHwdD{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic}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);}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}",{"title":998,"searchDepth":2374,"depth":2483,"links":3674},[3675,3676,3677,3685,3686,3687,3688,3689,3690,3691,3692,3693],{"id":904,"depth":2483,"text":905},{"id":989,"depth":2483,"text":990},{"id":1111,"depth":2483,"text":53,"children":3678},[3679,3680,3681,3682,3683,3684],{"id":1482,"depth":2502,"text":1483},{"id":1499,"depth":2502,"text":1500},{"id":1262,"depth":2502,"text":1624},{"id":1777,"depth":2502,"text":1778},{"id":1797,"depth":2502,"text":1798},{"id":1806,"depth":2502,"text":1807},{"id":1099,"depth":2483,"text":1858},{"id":2098,"depth":2483,"text":2099},{"id":2168,"depth":2483,"text":2169},{"id":2778,"depth":2483,"text":2779},{"id":2807,"depth":2483,"text":2808},{"id":2870,"depth":2483,"text":2871},{"id":3359,"depth":2483,"text":3360},{"id":3551,"depth":2483,"text":3552},{"id":3562,"depth":2483,"text":3563},"A page of live cards that DGI grows, keeps current and retires by itself. Create, tick, signal, read, list, archive and crystallize a surface with dgi.surface.*, set its policy, run its heartbeat, and follow its patch stream over a WebSocket","md",null,{},{"icon":849},{"title":846,"description":3694},"qcwKWVh_wTsb8EaSq6vlrArkOfpaPJ94FjlvAtPAOdQ",[3702,3704],{"title":841,"path":842,"stem":843,"description":3703,"icon":844,"children":-1},"Every structured chat card DGI can return, what it shows and what the person can do with it. Forms, confirms with a diff, tables, charts, KPI tiles, logs, runs, links, compositions, documents, and the DAG, schema, datagrid, query console, diff, detail and timeline views, plus view controls and the query action",{"title":856,"path":852,"stem":853,"description":3705,"icon":61,"children":-1},"Orkestia is Orkestia.dev. DGI is Orkestia's decision layer. It turns what a person asks into your organization's own workflows, and answers with live cards (forms, confirms, tables, charts) instead of prose. Where you can use it, what it does, and what it never does",1790354064680]