[{"data":1,"prerenderedAt":371},["ShallowReactive",2],{"navigation":3,"\u002Fconcepts\u002Fsql-first-contract":115,"\u002Fconcepts\u002Fsql-first-contract-surround":366},[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":43,"body":117,"description":359,"extension":360,"links":361,"meta":362,"navigation":363,"path":44,"seo":364,"stem":45,"__hash__":365},"docs\u002F2.concepts\u002F1.sql-first-contract.md",{"type":118,"value":119,"toc":350},"minimark",[120,133,138,202,206,283,297,301,339,343],[121,122,123,124,128,129,132],"p",{},"The protocol is a set of functions in schema ",[125,126,127],"code",{},"taskq",". The Python library, the HTTP facade, and ",[125,130,131],{},"psql"," are equal clients.",[134,135,137],"h2",{"id":136},"schema-and-migrations","Schema and migrations",[139,140,141,154],"table",{},[142,143,144],"thead",{},[145,146,147,151],"tr",{},[148,149,150],"th",{},"Item",[148,152,153],{},"Value",[155,156,157,168,185],"tbody",{},[145,158,159,163],{},[160,161,162],"td",{},"Schema name",[160,164,165,167],{},[125,166,127],{}," (fixed — ADR-002)",[145,169,170,173],{},[160,171,172],{},"Packaged migrations",[160,174,175,178,179,178,182],{},[125,176,177],{},"0001_initial",", ",[125,180,181],{},"0002_contract_0_1_1",[125,183,184],{},"0003_contract_0_1_2",[145,186,187,190],{},[160,188,189],{},"Drift oracle",[160,191,192,195,196,195,199],{},[125,193,194],{},"taskq verify"," \u002F ",[125,197,198],{},"verify()",[125,200,201],{},"verify_sync()",[134,203,205],{"id":204},"capability-roles","Capability roles",[139,207,208,218],{},[142,209,210],{},[145,211,212,215],{},[148,213,214],{},"Role",[148,216,217],{},"Rights",[155,219,220,230,243,253,263,273],{},[145,221,222,227],{},[160,223,224],{},[125,225,226],{},"taskq_owner",[160,228,229],{},"Owns schema objects; migration target ownership",[145,231,232,237],{},[160,233,234],{},[125,235,236],{},"taskq_producer",[160,238,239,242],{},[125,240,241],{},"EXECUTE"," enqueue paths",[145,244,245,250],{},[160,246,247],{},[125,248,249],{},"taskq_runner",[160,251,252],{},"Claim, heartbeat, settle",[145,254,255,260],{},[160,256,257],{},[125,258,259],{},"taskq_observer",[160,261,262],{},"Stats \u002F read views",[145,264,265,270],{},[160,266,267],{},[125,268,269],{},"taskq_operator",[160,271,272],{},"Redrive, cancel, control",[145,274,275,280],{},[160,276,277],{},[125,278,279],{},"taskq_housekeeper",[160,281,282],{},"Tick \u002F reaper",[121,284,285,286,288,289,292,293,296],{},"Functions are owned by ",[125,287,226],{},", pin ",[125,290,291],{},"search_path",", revoke ",[125,294,295],{},"PUBLIC"," execute, and grant to a capability role. Because raw table DML is denied to runners, every documented flow has a function.",[134,298,300],{"id":299},"what-lives-where","What lives where",[139,302,303,313],{},[142,304,305],{},[145,306,307,310],{},[148,308,309],{},"Layer",[148,311,312],{},"Owns",[155,314,315,323,331],{},[145,316,317,320],{},[160,318,319],{},"Postgres",[160,321,322],{},"Claim, fencing, retry budget, uniqueness, concurrency admission",[145,324,325,328],{},[160,326,327],{},"Python",[160,329,330],{},"Models, worker loop, handler DX, optional HTTP transport",[145,332,333,336],{},[160,334,335],{},"Host app",[160,337,338],{},"Job handlers, domain side effects, IAM wiring",[134,340,342],{"id":341},"typed-results-everywhere","Typed results everywhere",[121,344,345,346,349],{},"Enqueue and settle never return silent ",[125,347,348],{},"null"," success. Expected races return structured statuses so network retries are safe.",{"title":351,"searchDepth":352,"depth":353,"links":354},"",1,2,[355,356,357,358],{"id":136,"depth":353,"text":137},{"id":204,"depth":353,"text":205},{"id":299,"depth":353,"text":300},{"id":341,"depth":353,"text":342},"Why PL\u002FpgSQL functions are the source of truth.","md",null,{},{"icon":46},{"title":43,"description":359},"X9IK9oVcaMw1SMCvakE9d6Bui2_10bwhmpnwBqMDc2Q",[367,369],{"title":31,"path":32,"stem":33,"description":368,"icon":34,"children":-1},"migrate, verify, worker, auth, and taskq-bench.",{"title":48,"path":49,"stem":50,"description":370,"icon":51,"children":-1},"The six job statuses and what they mean.",1784549300044]