[{"data":1,"prerenderedAt":408},["ShallowReactive",2],{"navigation":3,"\u002Foperations\u002Fruntime-first-upgrades":160,"\u002Foperations\u002Fruntime-first-upgrades-surround":403},[4,36,57,113,149],{"title":5,"icon":6,"path":7,"stem":8,"children":9,"page":35},"Getting Started","i-lucide-rocket","\u002Fgetting-started","1.getting-started",[10,15,20,25,30],{"title":11,"path":12,"stem":13,"icon":14},"Introduction","\u002Fgetting-started\u002Fintroduction","1.getting-started\u002F1.introduction","i-lucide-info",{"title":16,"path":17,"stem":18,"icon":19},"Install","\u002Fgetting-started\u002Finstall","1.getting-started\u002F2.install","i-lucide-download",{"title":21,"path":22,"stem":23,"icon":24},"Quickstart","\u002Fgetting-started\u002Fquickstart","1.getting-started\u002F3.quickstart","i-lucide-zap",{"title":26,"path":27,"stem":28,"icon":29},"Testing","\u002Fgetting-started\u002Ftesting","1.getting-started\u002F4.testing","i-lucide-flask-conical",{"title":31,"path":32,"stem":33,"icon":34},"CLI","\u002Fgetting-started\u002Fcli","1.getting-started\u002F5.cli","i-lucide-terminal",false,{"title":37,"icon":38,"path":39,"stem":40,"children":41,"page":35},"Concepts","i-lucide-boxes","\u002Fconcepts","2.concepts",[42,47,52],{"title":43,"path":44,"stem":45,"icon":46},"SQL-first contract","\u002Fconcepts\u002Fsql-first-contract","2.concepts\u002F1.sql-first-contract","i-lucide-database",{"title":48,"path":49,"stem":50,"icon":51},"Jobs and status","\u002Fconcepts\u002Fjobs-and-status","2.concepts\u002F2.jobs-and-status","i-lucide-list-checks",{"title":53,"path":54,"stem":55,"icon":56},"Fencing and settles","\u002Fconcepts\u002Ffencing-and-settles","2.concepts\u002F3.fencing-and-settles","i-lucide-shield",{"title":58,"icon":59,"path":60,"stem":61,"children":62,"page":35},"API","i-lucide-code-2","\u002Fapi","3.api",[63,68,73,78,83,88,93,98,103,108],{"title":64,"path":65,"stem":66,"icon":67},"Enqueue","\u002Fapi\u002Fenqueue","3.api\u002F1.enqueue","i-lucide-plus-circle",{"title":69,"path":70,"stem":71,"icon":72},"Trusted Effects","\u002Fapi\u002Ftrusted-effects","3.api\u002F10.trusted-effects","i-lucide-lock-keyhole",{"title":74,"path":75,"stem":76,"icon":77},"Claim and heartbeat","\u002Fapi\u002Fclaim-and-heartbeat","3.api\u002F2.claim-and-heartbeat","i-lucide-hand",{"title":79,"path":80,"stem":81,"icon":82},"Worker and handlers","\u002Fapi\u002Fworker-and-handlers","3.api\u002F3.worker-and-handlers","i-lucide-cpu",{"title":84,"path":85,"stem":86,"icon":87},"HTTP facade","\u002Fapi\u002Fhttp-facade","3.api\u002F4.http-facade","i-lucide-globe",{"title":89,"path":90,"stem":91,"icon":92},"Authorization","\u002Fapi\u002Fauthorization","3.api\u002F5.authorization","i-lucide-key-round",{"title":94,"path":95,"stem":96,"icon":97},"Follow-ups","\u002Fapi\u002Ffollow-ups","3.api\u002F6.follow-ups","i-lucide-git-branch",{"title":99,"path":100,"stem":101,"icon":102},"Workflows and schedules","\u002Fapi\u002Fworkflows-and-schedules","3.api\u002F7.workflows-and-schedules","i-lucide-workflow",{"title":104,"path":105,"stem":106,"icon":107},"Durable admission","\u002Fapi\u002Fdurable-admission","3.api\u002F8.durable-admission","i-lucide-ticket",{"title":109,"path":110,"stem":111,"icon":112},"Workflow Continuations","\u002Fapi\u002Fworkflow-continuations","3.api\u002F9.workflow-continuations","i-lucide-git-fork",{"title":114,"icon":115,"path":116,"stem":117,"children":118,"page":35},"Operations","i-lucide-activity","\u002Foperations","4.operations",[119,124,129,134,139,144],{"title":120,"path":121,"stem":122,"icon":123},"Standalone Scheduler","\u002Foperations\u002Fstandalone-scheduler","4.operations\u002F0.standalone-scheduler","i-lucide-calendar-clock",{"title":125,"path":126,"stem":127,"icon":128},"Housekeeping","\u002Foperations\u002Fhousekeeping","4.operations\u002F1.housekeeping","i-lucide-timer",{"title":130,"path":131,"stem":132,"icon":133},"Redrive and dead letters","\u002Foperations\u002Fredrive-and-dlq","4.operations\u002F2.redrive-and-dlq","i-lucide-rotate-ccw",{"title":135,"path":136,"stem":137,"icon":138},"Flow control","\u002Foperations\u002Fflow-control","4.operations\u002F3.flow-control","i-lucide-gauge",{"title":140,"path":141,"stem":142,"icon":143},"Queue Boundaries","\u002Foperations\u002Fqueue-boundaries","4.operations\u002F4.queue-boundaries","i-lucide-panels-top-left",{"title":145,"path":146,"stem":147,"icon":148},"Runtime-first upgrades","\u002Foperations\u002Fruntime-first-upgrades","4.operations\u002F5.runtime-first-upgrades","i-lucide-shield-check",{"title":150,"icon":151,"path":152,"stem":153,"children":154,"page":35},"Reference","i-lucide-book-marked","\u002Freference","5.reference",[155],{"title":156,"path":157,"stem":158,"icon":159},"Configuration","\u002Freference\u002Fconfiguration","5.reference\u002F1.configuration","i-lucide-settings",{"id":161,"title":145,"body":162,"description":396,"extension":397,"links":398,"meta":399,"navigation":400,"path":146,"seo":401,"stem":147,"__hash__":402},"docs\u002F4.operations\u002F5.runtime-first-upgrades.md",{"type":163,"value":164,"toc":391},"minimark",[165,169,184,189,229,333,338,342,345,356,360,363,381,387],[166,167,168],"p",{},"TaskQ has two independent version axes: the installed Python package and the\nSQL contract recorded in the target database. An artifact is ready only when\nits runtime declares the observed SQL contract in its closed compatibility\nset. A numerically newer contract is not automatically safe.",[166,170,171,172,176,177,180,181,183],{},"The ",[173,174,175],"code",{},"0.1.0a40"," release targets SQL contract ",[173,178,179],{},"0.6.12"," and declares\nexplicit compatibility with the earlier contracts needed for a staged\nruntime-first rollout. Runtimes older than a40 do not recognize ",[173,182,179],{}," and\nmay not map its queue-owner denial correctly.",[185,186,188],"h2",{"id":187},"required-order","Required order",[190,191,192,196,199,202,205,216,223,226],"ol",{},[193,194,195],"li",{},"Publish or otherwise approve one immutable wheel and source distribution.\nRecord their hashes and retain the previous artifact.",[193,197,198],{},"Regenerate every consumer lock from the published artifact and build each\ndeployable API, worker, scheduler, operator, migrator, and maintenance\nartifact once. Confirm the installed package reports the expected version.",[193,200,201],{},"Pause affected queues and schedules. Deploy the compatible runtime while the\ndatabase remains on its old, supported contract. Fence every older process\nso it cannot reconnect.",[193,203,204],{},"Run the release preflight against the exact target. Review package version,\nobserved SQL contract, target environment, installation identity, pending\nmigration fingerprints, queue state, and scheduler ownership.",[193,206,207,208,211,212,215],{},"Apply migrations only after the operator has independently established the\nruntime-first condition. With ",[173,209,210],{},"outlabs-release",", an existing TaskQ database\nwith pending migrations requires the explicit\n",[173,213,214],{},"--runtime-first-confirmed"," gate. The guard runs before Auth, TaskQ, or host\nmigrations mutate the database.",[193,217,218,219,222],{},"Require ",[173,220,221],{},"taskq db verify"," and post-migration attestation to report an exact\nmatch. Bind a new empty queue, or use adoption\u002Frotation only under the\npaused, quiesced recovery rules.",[193,224,225],{},"Prove owner and non-owner LOGIN admission, separate-housekeeper schedule\nfire, worker claim and settlement, replay denial, and the host application's\nauthorization boundary on the exact deployment artifacts.",[193,227,228],{},"Resume one queue and one bounded canary at a time. Record terminal counts,\nschedule occurrences, workflow identity, and application side effects\nbefore widening traffic.",[230,231,237],"pre",{"className":232,"code":233,"filename":234,"language":235,"meta":236,"style":236},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","outlabs-release preflight\n\n# Only after every compatible runtime is deployed and every older runtime is fenced:\noutlabs-release migrate \\\n  --database primary \\\n  --confirm \\\n  --runtime-first-confirmed\n\noutlabs-release attest\ntaskq --context production db verify\n","Terminal","bash","",[173,238,239,251,258,265,277,288,296,302,307,315],{"__ignoreMap":236},[240,241,244,247],"span",{"class":242,"line":243},"line",1,[240,245,210],{"class":246},"sBMFI",[240,248,250],{"class":249},"sfazB"," preflight\n",[240,252,254],{"class":242,"line":253},2,[240,255,257],{"emptyLinePlaceholder":256},true,"\n",[240,259,261],{"class":242,"line":260},3,[240,262,264],{"class":263},"sHwdD","# Only after every compatible runtime is deployed and every older runtime is fenced:\n",[240,266,268,270,273],{"class":242,"line":267},4,[240,269,210],{"class":246},[240,271,272],{"class":249}," migrate",[240,274,276],{"class":275},"sTEyZ"," \\\n",[240,278,280,283,286],{"class":242,"line":279},5,[240,281,282],{"class":249},"  --database",[240,284,285],{"class":249}," primary",[240,287,276],{"class":275},[240,289,291,294],{"class":242,"line":290},6,[240,292,293],{"class":249},"  --confirm",[240,295,276],{"class":275},[240,297,299],{"class":242,"line":298},7,[240,300,301],{"class":249},"  --runtime-first-confirmed\n",[240,303,305],{"class":242,"line":304},8,[240,306,257],{"emptyLinePlaceholder":256},[240,308,310,312],{"class":242,"line":309},9,[240,311,210],{"class":246},[240,313,314],{"class":249}," attest\n",[240,316,318,321,324,327,330],{"class":242,"line":317},10,[240,319,320],{"class":246},"taskq",[240,322,323],{"class":249}," --context",[240,325,326],{"class":249}," production",[240,328,329],{"class":249}," db",[240,331,332],{"class":249}," verify\n",[166,334,335,337],{},[173,336,214],{}," is an operator attestation, not an automatic\ndiscovery mechanism. Do not pass it because a deployment was requested; pass\nit only after process inventory and immutable-artifact evidence prove the\ncondition.",[185,339,341],{"id":340},"recovery-boundary","Recovery boundary",[166,343,344],{},"Before the SQL migration, restoring the previous artifact is a valid rollback\nwhile the database still reports a contract that artifact accepts. After a\nforward-only migration, pause queues and schedules and recover forward with a\ncompatible runtime. There is no supported schema downgrade or generic queue\nownership clear.",[166,346,347,348,351,352,355],{},"If the bound producer role was dropped or must be replaced, keep the queue\npaused and quiesced, attest the exact target, rotate to a new dedicated\n",[173,349,350],{},"taskq_producer"," member with a nonempty actor and reason, inspect the resulting\n",[173,353,354],{},"queue_audit"," row, and repeat catalog and LOGIN-boundary verification before\nresuming.",[185,357,359],{"id":358},"evidence-packet","Evidence packet",[166,361,362],{},"Keep the following values outside transient terminal scrollback and exclude\ncredentials and payloads:",[364,365,366,369,372,375,378],"ul",{},[193,367,368],{},"source commits, package versions, artifact hashes, and consumer lock hashes;",[193,370,371],{},"old and new SQL contracts, migration head, target environment, and\ninstallation ID;",[193,373,374],{},"old-process fencing, API\u002Fscheduler\u002Fworker process inventory, and queue states;",[193,376,377],{},"negative and positive database-role and host-authorization checks;",[193,379,380],{},"canary workflow\u002Fjob identities, terminal counts, committed side effects, and\nthe forward-recovery command.",[382,383,384],"caution",{},[166,385,386],{},"Do not migrate first. Do not use an \"ahead\" version comparison as a\ncompatibility decision. The installed runtime's explicit supported-contract\nset is the authority.",[388,389,390],"style",{},"html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}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 pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}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":236,"searchDepth":243,"depth":253,"links":392},[393,394,395],{"id":187,"depth":253,"text":188},{"id":340,"depth":253,"text":341},{"id":358,"depth":253,"text":359},"Upgrade every compatible runtime before applying a forward-only TaskQ SQL contract.","md",null,{},{"icon":148},{"title":145,"description":396},"e9Ol3sP2dAQ7iFx4cZ2tMIbFXd-2R8QgInaffCUsZyw",[404,406],{"title":140,"path":141,"stem":142,"description":405,"icon":143,"children":-1},"Design queues as independent operational bulkheads without confusing them with database or task-type boundaries.",{"title":156,"path":157,"stem":158,"description":407,"icon":159,"children":-1},"Queue profiles and WorkerSettings \u002F TASKQ_* knobs.",1789722416751]