[{"data":1,"prerenderedAt":166},["ShallowReactive",2],{"\u002Fdocs\u002Fintegrations\u002Flinear":3},{"id":4,"title":5,"body":6,"description":158,"extension":159,"meta":160,"navigation":161,"path":162,"seo":163,"stem":164,"__hash__":165},"docs\u002Fdocs\u002Fintegrations\u002Flinear.md","Linear",{"type":7,"value":8,"toc":150},"minimark",[9,19,24,40,44,51,78,82,85,137,140,144],[10,11,12,13,18],"p",{},"CAF Orchestrator watches for status changes on Linear tickets via webhook, then\nqueues the matching phase. This page adds Linear-specific setup on top of the basics\ncovered in ",[14,15,17],"a",{"href":16},"\u002Fdocs\u002Fcaf-orchestrator","CAF Orchestrator",".",[20,21,23],"h2",{"id":22},"_1-create-an-api-key","1. Create an API key",[10,25,26,27,31,32,36,37,18],{},"In Linear, go to ",[28,29,30],"strong",{},"Settings → API → Personal API keys"," and create a new key with\nread access to your workspace. Add it to the Orchestrator's ",[33,34,35],"code",{},".env"," as\n",[33,38,39],{},"LINEAR_API_KEY",[20,41,43],{"id":42},"_2-register-a-webhook","2. Register a webhook",[10,45,46,47,50],{},"Under ",[28,48,49],{},"Settings → API → Webhooks",", add a new webhook:",[52,53,54,61,72],"ul",{},[55,56,57,58],"li",{},"URL: ",[33,59,60],{},"https:\u002F\u002F\u003Cyour-vps-host>\u002Fwebhooks\u002Flinear",[55,62,63,64,67,68,71],{},"Event: ",[33,65,66],{},"Issue"," — specifically status changes (",[33,69,70],{},"state changed",")",[55,73,74,75],{},"Secret: match this to the Orchestrator's ",[33,76,77],{},"WEBHOOK_SECRET",[20,79,81],{"id":80},"_3-agree-on-a-status-mapping","3. Agree on a status mapping",[10,83,84],{},"The Orchestrator triggers phases based on ticket status. A recommended convention:",[86,87,88,101],"table",{},[89,90,91],"thead",{},[92,93,94,98],"tr",{},[95,96,97],"th",{},"Linear status",[95,99,100],{},"Phase triggered",[102,103,104,113,121,129],"tbody",{},[92,105,106,110],{},[107,108,109],"td",{},"Ready for Plan",[107,111,112],{},"Plan",[92,114,115,118],{},[107,116,117],{},"Ready for Implement",[107,119,120],{},"Implement",[92,122,123,126],{},[107,124,125],{},"Ready for Verify",[107,127,128],{},"Verify",[92,130,131,134],{},[107,132,133],{},"In Review",[107,135,136],{},"Waiting for human review (no automatic trigger)",[10,138,139],{},"These status names are just a convention, not hardcoded — adjust them to match your\nteam's workflow in the Orchestrator's configuration.",[20,141,143],{"id":142},"what-happens-once-the-webhook-is-received","What happens once the webhook is received",[10,145,146,147,149],{},"The flow is the same as described in ",[14,148,17],{"href":16},": the\npayload gets verified, a job is queued in BullMQ, then a headless Claude Code agent\nfor that phase runs.",{"title":151,"searchDepth":152,"depth":152,"links":153},"",2,[154,155,156,157],{"id":22,"depth":152,"text":23},{"id":42,"depth":152,"text":43},{"id":80,"depth":152,"text":81},{"id":142,"depth":152,"text":143},"Connect CAF Orchestrator to Linear so your pipeline triggers automatically from ticket status.","md",{},true,"\u002Fdocs\u002Fintegrations\u002Flinear",{"title":5,"description":158},"docs\u002Fintegrations\u002Flinear","mYUgeKNOzdCE7eney7fKRhho6zVFIeC49umOSK5FVVY",1787621083882]