[{"data":1,"prerenderedAt":487},["ShallowReactive",2],{"navigation":3,"\u002Fgetting-started\u002Finstall":115,"\u002Fgetting-started\u002Finstall-surround":482},[4,36,57,88,104],{"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],{"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},"Claim and heartbeat","\u002Fapi\u002Fclaim-and-heartbeat","3.api\u002F2.claim-and-heartbeat","i-lucide-hand",{"title":74,"path":75,"stem":76,"icon":77},"Worker and handlers","\u002Fapi\u002Fworker-and-handlers","3.api\u002F3.worker-and-handlers","i-lucide-cpu",{"title":79,"path":80,"stem":81,"icon":82},"HTTP facade","\u002Fapi\u002Fhttp-facade","3.api\u002F4.http-facade","i-lucide-globe",{"title":84,"path":85,"stem":86,"icon":87},"Authorization","\u002Fapi\u002Fauthorization","3.api\u002F5.authorization","i-lucide-key-round",{"title":89,"icon":90,"path":91,"stem":92,"children":93,"page":35},"Operations","i-lucide-activity","\u002Foperations","4.operations",[94,99],{"title":95,"path":96,"stem":97,"icon":98},"Housekeeping","\u002Foperations\u002Fhousekeeping","4.operations\u002F1.housekeeping","i-lucide-timer",{"title":100,"path":101,"stem":102,"icon":103},"Redrive and dead letters","\u002Foperations\u002Fredrive-and-dlq","4.operations\u002F2.redrive-and-dlq","i-lucide-rotate-ccw",{"title":105,"icon":106,"path":107,"stem":108,"children":109,"page":35},"Reference","i-lucide-book-marked","\u002Freference","5.reference",[110],{"title":111,"path":112,"stem":113,"icon":114},"Configuration","\u002Freference\u002Fconfiguration","5.reference\u002F1.configuration","i-lucide-settings",{"id":116,"title":16,"body":117,"description":475,"extension":476,"links":477,"meta":478,"navigation":479,"path":17,"seo":480,"stem":18,"__hash__":481},"docs\u002F1.getting-started\u002F2.install.md",{"type":118,"value":119,"toc":470},"minimark",[120,176,189,194,259,271,275,278,315,362,377,381,384,457,466],[121,122,127],"pre",{"className":123,"code":124,"language":125,"meta":126,"style":126},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","pip install outlabs-taskq           # core: SQL client + worker runtime\npip install outlabs-taskq[http]     # + FastAPI facade \u002F HTTP worker client\npip install outlabs-taskq[outlabs]  # + outlabs-auth adapter for facade auth\n","bash","",[128,129,130,150,163],"code",{"__ignoreMap":126},[131,132,135,139,143,146],"span",{"class":133,"line":134},"line",1,[131,136,138],{"class":137},"sBMFI","pip",[131,140,142],{"class":141},"sfazB"," install",[131,144,145],{"class":141}," outlabs-taskq",[131,147,149],{"class":148},"sHwdD","           # core: SQL client + worker runtime\n",[131,151,153,155,157,160],{"class":133,"line":152},2,[131,154,138],{"class":137},[131,156,142],{"class":141},[131,158,159],{"class":141}," outlabs-taskq[http]",[131,161,162],{"class":148},"     # + FastAPI facade \u002F HTTP worker client\n",[131,164,166,168,170,173],{"class":133,"line":165},3,[131,167,138],{"class":137},[131,169,142],{"class":141},[131,171,172],{"class":141}," outlabs-taskq[outlabs]",[131,174,175],{"class":148},"  # + outlabs-auth adapter for facade auth\n",[177,178,179,180,184,185,188],"p",{},"Requires ",[181,182,183],"strong",{},"Python 3.12+"," and ",[181,186,187],{},"PostgreSQL 16+"," (18 is the preferred deploy target).",[190,191,193],"h2",{"id":192},"dependency-tiers","Dependency tiers",[195,196,197,212],"table",{},[198,199,200],"thead",{},[201,202,203,206,209],"tr",{},[204,205,16],"th",{},[204,207,208],{},"What you get",[204,210,211],{},"Hard deps",[213,214,215,233,246],"tbody",{},[201,216,217,223,226],{},[218,219,220],"td",{},[128,221,222],{},"outlabs-taskq",[218,224,225],{},"Migrator, models, asyncio SQL client, worker loop, CLI",[218,227,228,229,232],{},"pydantic, sqlalchemy",[131,230,231],{},"asyncio",", asyncpg, croniter",[201,234,235,240,243],{},[218,236,237],{},[128,238,239],{},"[http]",[218,241,242],{},"Facade app + HTTP clients + claim-wait hub",[218,244,245],{},"fastapi, httpx",[201,247,248,253,256],{},[218,249,250],{},[128,251,252],{},"[outlabs]",[218,254,255],{},"OutLabs queue authorizer + IAM provisioning",[218,257,258],{},"outlabs-auth",[260,261,262],"note",{},[177,263,264,267,268,270],{},[128,265,266],{},"import taskq"," must succeed without FastAPI and without ",[128,269,258],{},".",[190,272,274],{"id":273},"install-the-schema","Install the schema",[177,276,277],{},"Use the CLI (preferred) or call the migrator from your host migration tool:",[121,279,281],{"className":123,"code":280,"language":125,"meta":126,"style":126},"taskq migrate \"postgresql:\u002F\u002Fpostgres:postgres@localhost:5432\u002Fmyapp\"\ntaskq verify  \"postgresql:\u002F\u002Fpostgres:postgres@localhost:5432\u002Fmyapp\"\n",[128,282,283,301],{"__ignoreMap":126},[131,284,285,288,291,295,298],{"class":133,"line":134},[131,286,287],{"class":137},"taskq",[131,289,290],{"class":141}," migrate",[131,292,294],{"class":293},"sMK4o"," \"",[131,296,297],{"class":141},"postgresql:\u002F\u002Fpostgres:postgres@localhost:5432\u002Fmyapp",[131,299,300],{"class":293},"\"\n",[131,302,303,305,308,311,313],{"class":133,"line":152},[131,304,287],{"class":137},[131,306,307],{"class":141}," verify",[131,309,310],{"class":293},"  \"",[131,312,297],{"class":141},[131,314,300],{"class":293},[121,316,320],{"className":317,"code":318,"language":319,"meta":126,"style":126},"language-python shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","from taskq.sql import migrate_sync, verify_sync\n\ndef upgrade():\n    # Alembic \u002F host revision — run as a Postgres admin that can create roles\n    migrate_sync(op.get_bind())\n    report = verify_sync(op.get_bind())\n    assert report.ok\n","python",[128,321,322,327,333,338,344,350,356],{"__ignoreMap":126},[131,323,324],{"class":133,"line":134},[131,325,326],{},"from taskq.sql import migrate_sync, verify_sync\n",[131,328,329],{"class":133,"line":152},[131,330,332],{"emptyLinePlaceholder":331},true,"\n",[131,334,335],{"class":133,"line":165},[131,336,337],{},"def upgrade():\n",[131,339,341],{"class":133,"line":340},4,[131,342,343],{},"    # Alembic \u002F host revision — run as a Postgres admin that can create roles\n",[131,345,347],{"class":133,"line":346},5,[131,348,349],{},"    migrate_sync(op.get_bind())\n",[131,351,353],{"class":133,"line":352},6,[131,354,355],{},"    report = verify_sync(op.get_bind())\n",[131,357,359],{"class":133,"line":358},7,[131,360,361],{},"    assert report.ok\n",[177,363,364,365,368,369,372,373,376],{},"There is no ",[128,366,367],{},"install()"," helper. ",[128,370,371],{},"migrate"," applies packaged SQL under an advisory lock; ",[128,374,375],{},"verify"," is the read-only drift oracle (catalog, grants, checksums).",[190,378,380],{"id":379},"capability-roles","Capability roles",[177,382,383],{},"The installer creates six roles (ADR-010):",[195,385,386,396],{},[198,387,388],{},[201,389,390,393],{},[204,391,392],{},"Role",[204,394,395],{},"Purpose",[213,397,398,408,417,427,437,447],{},[201,399,400,405],{},[218,401,402],{},[128,403,404],{},"taskq_owner",[218,406,407],{},"Owns schema objects",[201,409,410,415],{},[218,411,412],{},[128,413,414],{},"taskq_producer",[218,416,64],{},[201,418,419,424],{},[218,420,421],{},[128,422,423],{},"taskq_runner",[218,425,426],{},"Claim \u002F heartbeat \u002F settle",[201,428,429,434],{},[218,430,431],{},[128,432,433],{},"taskq_observer",[218,435,436],{},"Stats \u002F read views",[201,438,439,444],{},[218,440,441],{},[128,442,443],{},"taskq_operator",[218,445,446],{},"Redrive \u002F cancel \u002F control",[201,448,449,454],{},[218,450,451],{},[128,452,453],{},"taskq_housekeeper",[218,455,456],{},"Tick \u002F reaper",[177,458,459,460,462,463,465],{},"Host apps call ",[128,461,371],{}," \u002F ",[128,464,375],{}," — do not fork the SQL in-tree.",[467,468,469],"style",{},"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}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 .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}",{"title":126,"searchDepth":134,"depth":152,"links":471},[472,473,474],{"id":192,"depth":152,"text":193},{"id":273,"depth":152,"text":274},{"id":379,"depth":152,"text":380},"Install the package and choose the right extras.","md",null,{},{"icon":19},{"title":16,"description":475},"teDkgQzE6INQIXwsUyqcU2duBgAqEwqyCp0ki6hSaXI",[483,485],{"title":11,"path":12,"stem":13,"description":484,"icon":14,"children":-1},"What OutlabsTaskq is, and what problems it is built to solve.",{"title":21,"path":22,"stem":23,"description":486,"icon":24,"children":-1},"Migrate, register a task, enqueue, and run a worker.",1784549299452]