[{"data":1,"prerenderedAt":1116},["ShallowReactive",2],{"navigation_docs":3,"-develop-pipeline-apps-webhook-relay":451,"-develop-pipeline-apps-webhook-relay-surround":1111},[4,82,155,181,196,225,294,353,418],{"title":5,"icon":6,"redirect":7,"path":8,"stem":9,"children":10,"page":73},"Start","i-lucide-compass","\u002Fintro\u002Fquickstart","\u002Fintro","1.intro",[11,14,18,22,74,78],{"title":12,"path":7,"stem":13},"Quickstart","1.intro\u002F0.quickstart",{"title":15,"path":16,"stem":17},"Pipeline Applications","\u002Fintro\u002Fpipeline-app-walkthrough","1.intro\u002F1.pipeline-app-walkthrough",{"title":19,"path":20,"stem":21},"How Redgold works","\u002Fintro\u002Foverview","1.intro\u002F2.overview",{"title":23,"icon":24,"visibility":25,"redirect":26,"path":27,"stem":28,"children":29,"page":73},"Comparison","i-lucide-scale","private","\u002Fintro\u002Fcomparison\u002Fpositioning","\u002Fintro\u002Fcomparison","1.intro\u002F3.comparison",[30,33,37,41,45,49,53,57,61,65,69],{"title":31,"path":26,"stem":32},"Positioning","1.intro\u002F3.comparison\u002F1.positioning",{"title":34,"path":35,"stem":36},"vs Lovable","\u002Fintro\u002Fcomparison\u002Fvs-lovable","1.intro\u002F3.comparison\u002F10.vs-lovable",{"title":38,"path":39,"stem":40},"vs Cloudflare OS","\u002Fintro\u002Fcomparison\u002Fvs-cloudflare-os","1.intro\u002F3.comparison\u002F11.vs-cloudflare-os",{"title":42,"path":43,"stem":44},"vs a backend-as-a-service","\u002Fintro\u002Fcomparison\u002Fvs-baas","1.intro\u002F3.comparison\u002F2.vs-baas",{"title":46,"path":47,"stem":48},"vs serverless compute","\u002Fintro\u002Fcomparison\u002Fvs-serverless-compute","1.intro\u002F3.comparison\u002F3.vs-serverless-compute",{"title":50,"path":51,"stem":52},"vs a do-it-yourself data stack","\u002Fintro\u002Fcomparison\u002Fvs-diy-data-stack","1.intro\u002F3.comparison\u002F4.vs-diy-data-stack",{"title":54,"path":55,"stem":56},"vs Rama","\u002Fintro\u002Fcomparison\u002Fvs-rama","1.intro\u002F3.comparison\u002F5.vs-rama",{"title":58,"path":59,"stem":60},"vs Apache Spark","\u002Fintro\u002Fcomparison\u002Fvs-spark","1.intro\u002F3.comparison\u002F6.vs-spark",{"title":62,"path":63,"stem":64},"vs Apache DataFusion","\u002Fintro\u002Fcomparison\u002Fvs-datafusion","1.intro\u002F3.comparison\u002F7.vs-datafusion",{"title":66,"path":67,"stem":68},"vs Heroku","\u002Fintro\u002Fcomparison\u002Fvs-heroku","1.intro\u002F3.comparison\u002F8.vs-heroku",{"title":70,"path":71,"stem":72},"vs AI model providers","\u002Fintro\u002Fcomparison\u002Fvs-ai-providers","1.intro\u002F3.comparison\u002F9.vs-ai-providers",false,{"title":75,"path":76,"stem":77},"Common tasks","\u002Fintro\u002Fstarting-points","1.intro\u002F4.starting-points",{"title":79,"path":80,"stem":81},"FAQ","\u002Fintro\u002Ffaq","1.intro\u002F5.faq",{"title":83,"icon":84,"redirect":85,"path":86,"stem":87,"children":88,"page":73},"Examples","i-lucide-chef-hat","\u002Fcookbook\u002Foverview","\u002Fcookbook","10.cookbook",[89,91,95,99,103,107,111,115,119,123,127,131,135,139,143,147,151],{"title":83,"path":85,"stem":90},"10.cookbook\u002F1.overview",{"title":92,"path":93,"stem":94},"One-shot task in CI","\u002Fcookbook\u002Fone-shot-ci","10.cookbook\u002F10.one-shot-ci",{"title":96,"path":97,"stem":98},"Rate-limit retries","\u002Fcookbook\u002Fretry-rate-limits","10.cookbook\u002F11.retry-rate-limits",{"title":100,"path":101,"stem":102},"Connect GitHub review automation","\u002Fcookbook\u002Fconnect-github-app","10.cookbook\u002F12.connect-github-app",{"title":104,"path":105,"stem":106},"Delegate a task to another agent","\u002Fcookbook\u002Fdelegate-agent-task","10.cookbook\u002F13.delegate-agent-task",{"title":108,"path":109,"stem":110},"Validate a pipeline application change","\u002Fcookbook\u002Fvalidate-pipeline-app","10.cookbook\u002F14.validate-pipeline-app",{"title":112,"path":113,"stem":114},"Verify a managed application deployment","\u002Fcookbook\u002Fverify-managed-deploy","10.cookbook\u002F15.verify-managed-deploy",{"title":116,"path":117,"stem":118},"Build, launch, and grow one project","\u002Fcookbook\u002Flaunch-and-grow","10.cookbook\u002F16.launch-and-grow",{"title":120,"path":121,"stem":122},"Set up managed reviews and project memory","\u002Fcookbook\u002Fmanaged-review","10.cookbook\u002F17.managed-review",{"title":124,"path":125,"stem":126},"First API call","\u002Fcookbook\u002Ffirst-api-call","10.cookbook\u002F2.first-api-call",{"title":128,"path":129,"stem":130},"Python client","\u002Fcookbook\u002Fmodel-api-python","10.cookbook\u002F3.model-api-python",{"title":132,"path":133,"stem":134},"Anthropic Messages","\u002Fcookbook\u002Fanthropic-messages","10.cookbook\u002F4.anthropic-messages",{"title":136,"path":137,"stem":138},"Check credits","\u002Fcookbook\u002Fcheck-credits","10.cookbook\u002F5.check-credits",{"title":140,"path":141,"stem":142},"Query data via MCP","\u002Fcookbook\u002Fmcp-query-data","10.cookbook\u002F6.mcp-query-data",{"title":144,"path":145,"stem":146},"Run a pipeline via MCP","\u002Fcookbook\u002Fmcp-drive-agent","10.cookbook\u002F7.mcp-drive-agent",{"title":148,"path":149,"stem":150},"Install the client","\u002Fcookbook\u002Finstall-client","10.cookbook\u002F8.install-client",{"title":152,"path":153,"stem":154},"Use another API host","\u002Fcookbook\u002Fpoint-client-at-host","10.cookbook\u002F9.point-client-at-host",{"title":156,"icon":157,"redirect":158,"path":159,"stem":160,"children":161,"page":73},"Agent operations","i-lucide-network","\u002Ffleet\u002Foverview","\u002Ffleet","11.fleet",[162,165,169,173,177],{"title":163,"path":158,"stem":164},"Running agent work","11.fleet\u002F0.overview",{"title":166,"path":167,"stem":168},"Workstreams and issues","\u002Ffleet\u002Fworkstreams-and-issues","11.fleet\u002F1.workstreams-and-issues",{"title":170,"path":171,"stem":172},"Agent lifecycle","\u002Ffleet\u002Fagent-lifecycle","11.fleet\u002F2.agent-lifecycle",{"title":174,"path":175,"stem":176},"Supervision and recovery","\u002Ffleet\u002Fsupervision","11.fleet\u002F3.supervision",{"title":178,"path":179,"stem":180},"An application workstream from request to delivery","\u002Ffleet\u002Fapplication-workstream","11.fleet\u002F4.application-workstream",{"title":182,"icon":183,"visibility":25,"redirect":184,"path":185,"stem":186,"children":187,"page":73},"Users","i-lucide-user","\u002Fusers\u002Finstall\u002Fagent-tools","\u002Fusers","2.users",[188],{"title":189,"path":190,"stem":191,"children":192,"page":73},"Install","\u002Fusers\u002Finstall","2.users\u002F1.install",[193],{"title":194,"path":184,"stem":195},"Agent tools setup","2.users\u002F1.install\u002F4.agent-tools",{"title":197,"icon":198,"redirect":199,"path":200,"stem":201,"children":202,"page":73},"Architecture","i-lucide-layers","\u002Finfrastructure\u002Foverview","\u002Finfrastructure","3.infrastructure",[203,205,209,213,217,221],{"title":197,"path":199,"stem":204},"3.infrastructure\u002F0.overview",{"title":206,"path":207,"stem":208},"A request through the platform","\u002Finfrastructure\u002Frequest-path","3.infrastructure\u002F11.request-path",{"title":210,"path":211,"stem":212},"Agent work and durable state","\u002Finfrastructure\u002Fagent-work","3.infrastructure\u002F12.agent-work",{"title":214,"path":215,"stem":216},"Data and pipelines","\u002Finfrastructure\u002Fdata","3.infrastructure\u002F3.data",{"title":218,"path":219,"stem":220},"AI and agents","\u002Finfrastructure\u002Fai","3.infrastructure\u002F4.ai",{"title":222,"path":223,"stem":224},"Managed deployment","\u002Finfrastructure\u002Fdeployment","3.infrastructure\u002F7.deployment",{"title":226,"icon":227,"redirect":228,"path":229,"stem":230,"children":231,"page":73},"API","i-lucide-book-marked","\u002Freference\u002Fauthentication","\u002Freference","4.reference",[232,235,239,243,247,251,255,259,263,267,271,275],{"title":233,"path":228,"stem":234},"Authentication","4.reference\u002F1.authentication",{"title":236,"path":237,"stem":238},"Security disclosure policy","\u002Freference\u002Fsecurity-disclosure","4.reference\u002F11.security-disclosure",{"title":240,"path":241,"stem":242},"RAC command guide","\u002Freference\u002Frac","4.reference\u002F13.rac",{"title":244,"path":245,"stem":246},"Model API","\u002Freference\u002Fllm-api","4.reference\u002F2.llm-api",{"title":248,"path":249,"stem":250},"MCP server","\u002Freference\u002Fmcp","4.reference\u002F2.mcp",{"title":252,"path":253,"stem":254},"Data platform preview","\u002Freference\u002Fdata-platform-preview","4.reference\u002F3.data-platform-preview",{"title":256,"path":257,"stem":258},"Terminal client","\u002Freference\u002Fcli","4.reference\u002F6.cli",{"title":260,"path":261,"stem":262},"Pipeline manifest preview","\u002Freference\u002Fpipeline-preview","4.reference\u002F7.pipeline-preview",{"title":264,"path":265,"stem":266},"Limits and retries","\u002Freference\u002Flimits","4.reference\u002F8.limits",{"title":268,"path":269,"stem":270},"API contract details","\u002Freference\u002Fapi-contracts","4.reference\u002F9.api-contracts",{"title":272,"path":273,"stem":274},"Errors","\u002Freference\u002Ferrors","4.reference\u002F9.errors",{"title":276,"icon":277,"visibility":278,"path":279,"stem":280,"children":281,"page":73},"Public API","i-lucide-route","public","\u002Freference\u002Froutes","4.reference\u002Froutes",[282,286,290],{"title":283,"path":284,"stem":285},"Memory routes","\u002Freference\u002Froutes\u002Fmemory","4.reference\u002Froutes\u002Fmemory",{"title":287,"path":288,"stem":289},"V1 routes","\u002Freference\u002Froutes\u002Fv1","4.reference\u002Froutes\u002Fv1",{"title":291,"path":292,"stem":293},"Voice routes","\u002Freference\u002Froutes\u002Fvoice","4.reference\u002Froutes\u002Fvoice",{"title":295,"icon":296,"visibility":25,"redirect":297,"path":298,"stem":299,"children":300,"page":73},"Develop","i-lucide-code","\u002Fdevelop\u002Fpipeline-apps\u002Foverview","\u002Fdevelop","5.develop",[301,305,337,341,345,349],{"title":302,"path":303,"stem":304},"Author a batch transform","\u002Fdevelop\u002Fauthor-a-batch-transform","5.develop\u002F10.author-a-batch-transform",{"title":306,"visibility":278,"redirect":297,"path":307,"stem":308,"children":309,"page":73},"Pipeline Apps","\u002Fdevelop\u002Fpipeline-apps","5.develop\u002F11.pipeline-apps",[310,313,317,321,325,329,333],{"title":311,"path":297,"stem":312},"Pipeline apps","5.develop\u002F11.pipeline-apps\u002F1.overview",{"title":314,"path":315,"stem":316},"Collaborative board walkthrough","\u002Fdevelop\u002Fpipeline-apps\u002Fcollaborative-board","5.develop\u002F11.pipeline-apps\u002F2.collaborative-board",{"title":318,"path":319,"stem":320},"Release and security lifecycle","\u002Fdevelop\u002Fpipeline-apps\u002Frelease-lifecycle","5.develop\u002F11.pipeline-apps\u002F3.release-lifecycle",{"title":322,"path":323,"stem":324},"Incident Triage","\u002Fdevelop\u002Fpipeline-apps\u002Fincident-triage","5.develop\u002F11.pipeline-apps\u002F4.incident-triage",{"title":326,"path":327,"stem":328},"App layout and authoring previews","\u002Fdevelop\u002Fpipeline-apps\u002Fpresentation","5.develop\u002F11.pipeline-apps\u002F5.presentation",{"title":330,"path":331,"stem":332},"Metrics Notebook","\u002Fdevelop\u002Fpipeline-apps\u002Fmetrics-notebook","5.develop\u002F11.pipeline-apps\u002F6.metrics-notebook",{"title":334,"path":335,"stem":336},"Webhook Relay","\u002Fdevelop\u002Fpipeline-apps\u002Fwebhook-relay","5.develop\u002F11.pipeline-apps\u002F7.webhook-relay",{"title":338,"path":339,"stem":340},"Tasks, repositories and applications from RAC","\u002Fdevelop\u002Fagent-task-cli","5.develop\u002F13.agent-task-cli",{"title":342,"path":343,"stem":344},"Build a vertical","\u002Fdevelop\u002Fbuild-a-vertical","5.develop\u002F5.build-a-vertical",{"title":346,"path":347,"stem":348},"Managed application artifacts","\u002Fdevelop\u002Fscaffold-a-narrow-app","5.develop\u002F7.scaffold-a-narrow-app",{"title":350,"path":351,"stem":352},"Import your data","\u002Fdevelop\u002Fimport-your-data","5.develop\u002F8.import-your-data",{"title":354,"icon":355,"redirect":356,"path":357,"stem":358,"children":359,"page":73},"Guides","i-lucide-layout-grid","\u002Fapplications\u002Fai-agents\u002Foverview","\u002Fapplications","7.applications",[360,364,384,396],{"title":361,"path":362,"stem":363},"Application maturity catalog","\u002Fapplications\u002Fcatalog","7.applications\u002F0.catalog",{"title":365,"visibility":278,"path":366,"stem":367,"children":368,"page":73},"AI Agents","\u002Fapplications\u002Fai-agents","7.applications\u002F1.ai-agents",[369,372,376,380],{"title":370,"path":356,"stem":371},"Coding agents","7.applications\u002F1.ai-agents\u002F01.overview",{"title":373,"path":374,"stem":375},"GitHub App automation","\u002Fapplications\u002Fai-agents\u002Fgithub-app-automation","7.applications\u002F1.ai-agents\u002F04.github-app-automation",{"title":377,"path":378,"stem":379},"agent-cli assistance","\u002Fapplications\u002Fai-agents\u002Fagent-cli-assistance","7.applications\u002F1.ai-agents\u002F05.agent-cli-assistance",{"title":381,"path":382,"stem":383},"Agent REST control","\u002Fapplications\u002Fai-agents\u002Frest-agent-control","7.applications\u002F1.ai-agents\u002F06.rest-agent-control",{"title":385,"visibility":278,"path":386,"stem":387,"children":388,"page":73},"Tickets","\u002Fapplications\u002Ftickets","7.applications\u002F2.tickets",[389,392],{"title":385,"path":390,"stem":391},"\u002Fapplications\u002Ftickets\u002Foverview","7.applications\u002F2.tickets\u002F01.overview",{"title":393,"path":394,"stem":395},"API walkthrough","\u002Fapplications\u002Ftickets\u002Fapi-walkthrough","7.applications\u002F2.tickets\u002F02.api-walkthrough",{"title":397,"icon":398,"visibility":278,"path":399,"stem":400,"children":401,"page":73},"Case studies","i-lucide-book-open-check","\u002Fapplications\u002Fcase-studies","7.applications\u002F6.case-studies",[402,406,410,414],{"title":403,"path":404,"stem":405},"Case study: owner-scoped tickets","\u002Fapplications\u002Fcase-studies\u002Ftickets","7.applications\u002F6.case-studies\u002F01.tickets",{"title":407,"path":408,"stem":409},"Case study: repository review and correction","\u002Fapplications\u002Fcase-studies\u002Frepository-review","7.applications\u002F6.case-studies\u002F02.repository-review",{"title":411,"path":412,"stem":413},"Case study: repairing crawlability on Redgold’s website","\u002Fapplications\u002Fcase-studies\u002Fpublic-website-seo","7.applications\u002F6.case-studies\u002F03.public-website-seo",{"title":415,"path":416,"stem":417},"Workflow account: Elusive reviews and managed CI","\u002Fapplications\u002Fcase-studies\u002Felusive-managed-review","7.applications\u002F6.case-studies\u002F04.elusive-managed-review",{"title":419,"icon":420,"redirect":421,"path":422,"stem":423,"children":424,"page":73},"Resources","i-lucide-library","\u002Fresources\u002Fglossary","\u002Fresources","9.resources",[425,428,432,436,440,443,447],{"title":426,"path":421,"stem":427},"Glossary","9.resources\u002F1.glossary",{"title":429,"path":430,"stem":431},"Terms of Service","\u002Fresources\u002Fterms","9.resources\u002F2.terms",{"title":433,"path":434,"stem":435},"Privacy Policy","\u002Fresources\u002Fprivacy","9.resources\u002F3.privacy",{"title":437,"path":438,"stem":439},"Acceptable Use Policy","\u002Fresources\u002Facceptable-use","9.resources\u002F4.acceptable-use",{"title":79,"path":441,"stem":442},"\u002Fresources\u002Ffaq","9.resources\u002F5.faq",{"title":444,"path":445,"stem":446},"Documentation feedback","\u002Fresources\u002Fdocs-feedback","9.resources\u002F6.docs-feedback",{"title":448,"path":449,"stem":450},"Refund and Cancellation Policy","\u002Fresources\u002Frefund-cancellation","9.resources\u002F7.refund-cancellation",{"id":452,"title":334,"access":278,"audience":453,"body":454,"description":1102,"extension":1103,"last_verified":1104,"links":1105,"maturity":1106,"meta":1107,"navigation":1108,"path":335,"seo":1109,"stem":336,"__hash__":1110},"docs\u002F5.develop\u002F11.pipeline-apps\u002F7.webhook-relay.md","developer",{"type":455,"value":456,"toc":1095},"minimark",[457,470,479,484,492,499,505,573,577,675,696,700,846,857,861,864,868,871,1091],[458,459,460,461,465,466,469],"p",{},"Webhook Relay keeps a list of relay rules. Each rule matches recorded webhook\nevents by event type and names a target URL. For every matched event you can\nqueue a delivery and then record its outcome. The app ships no dedicated host\npage, renderer component or app-specific runtime branch. Its source is\n",[462,463,464],"code",{},"apps\u002Fwebhook-relay\u002Fapp.toml","; the native records are in\n",[462,467,468],{},"crates\u002Fshared\u002Fschema\u002Fapp-webhook-relay\u002Fsrc\u002Flib.rs",".",[458,471,472,473,478],{},"This release records delivery state. It does not send the outbound HTTP\nrequest itself, and nothing runs automatically when an event is written. The\n",[474,475,477],"a",{"href":476},"#friction-log","friction log"," explains which parts of the app contract stop it.",[480,481,483],"h2",{"id":482},"supported-workflow","Supported workflow",[458,485,486,487,491],{},"The relay starts empty. ",[488,489,490],"strong",{},"New rule"," opens a dialog that takes a name, a source\nlabel, the event type to match and a target URL. New rules are enabled.",[458,493,494,495,498],{},"The ",[488,496,497],{},"Inbound events"," form on the home page records an event: source, event\ntype and a raw JSON payload. The server sets the receive time. A person or an\nagent with the app's write grant fills this in; there is no public webhook\nendpoint.",[458,500,501,504],{},[488,502,503],{},"Open"," on a rule shows its page:",[506,507,508,515,525,551],"ul",{},[509,510,511,514],"li",{},[488,512,513],{},"Find matching events"," lists the 50 newest events whose type equals the\nrule's event type.",[509,516,517,520,521,524],{},[488,518,519],{},"Queue delivery"," on a matched event records a ",[462,522,523],{},"pending"," delivery for that\nevent under the rule. Paused rules hide this button.",[509,526,527,530,531,534,535,538,539,542,543,546,547,550],{},[488,528,529],{},"Show deliveries"," lists the rule's deliveries, newest first. Each one has\n",[488,532,533],{},"Mark delivered",", ",[488,536,537],{},"Retry"," (status ",[462,540,541],{},"retrying",") and ",[488,544,545],{},"Record failure",",\nwhich stores an error message with status ",[462,548,549],{},"failed",". The list reloads after\nevery change.",[509,552,553,556,557,560,561,564,565,568,569,572],{},[488,554,555],{},"Pause rule"," and ",[488,558,559],{},"Resume rule"," switch ",[462,562,563],{},"enabled",". ",[488,566,567],{},"Edit rule"," changes the\nname, source, event type and target URL. ",[488,570,571],{},"Delete rule"," hides the rule.",[480,574,576],{"id":575},"one-package-existing-host","One package, existing host",[578,579,580,593],"table",{},[581,582,583],"thead",{},[584,585,586,590],"tr",{},[587,588,589],"th",{},"Package declaration",[587,591,592],{},"Shared implementation",[594,595,596,615,626,643,651,665],"tbody",{},[584,597,598,612],{},[599,600,601,602,534,605,556,608,611],"td",{},"Native ",[462,603,604],{},"RelayRule",[462,606,607],{},"WebhookEvent",[462,609,610],{},"Delivery"," schemas",[599,613,614],{},"Descriptor validation, typed CBOR records and per-field merge",[584,616,617,623],{},[599,618,619,622],{},[462,620,621],{},"relay-rule-list"," pipeline",[599,624,625],{},"Authorized dataset read, filters, deterministic sort and projection",[584,627,628,637],{},[599,629,630,556,633,636],{},[462,631,632],{},"event-matches",[462,634,635],{},"delivery-list"," pipelines",[599,638,494,639,642],{},[462,640,641],{},"invoke_pipeline"," action with one signed input binding, applied as an overlay filter",[584,644,645,648],{},[599,646,647],{},"Rule, event and delivery actions",[599,649,650],{},"Durable entity operations, optimistic projection for rules and explicit field masks",[584,652,653,656],{},[599,654,655],{},"Write-then-read delivery actions",[599,657,658,659,662,663],{},"One action flow chaining ",[462,660,661],{},"apply_entity_operation"," into ",[462,664,641],{},[584,666,667,672],{},[599,668,669],{},[462,670,671],{},"foreground_snapshot_v1",[599,673,674],{},"The installed host's bounded foreground refresh scheduler",[458,676,677,678,681,682,556,685,688,689,692,693,695],{},"The release requests read and write access to ",[462,679,680],{},"app.webhook_relay.RelayRule",",\n",[462,683,684],{},"app.webhook_relay.WebhookEvent",[462,686,687],{},"app.webhook_relay.Delivery",", and\ninvocation of the three pipelines. Like the other ",[462,690,691],{},"app.*"," datasets, these are\nserved by DES's portable ",[462,694,691],{}," adapter and read owner-scoped. The release\nrequests no network, secret, background, notification or infrastructure\ncapability.",[480,697,699],{"id":698},"author-build-and-install","Author, build and install",[701,702,707],"pre",{"className":703,"code":704,"language":705,"meta":706,"style":706},"language-bash shiki shiki-themes github-light github-light github-dark","rac app validate apps\u002Fwebhook-relay\u002Fapp.toml\nrac app build apps\u002Fwebhook-relay\u002Fapp.toml\nrac des spec publish --manifest apps\u002Fwebhook-relay\u002Fpipelines\u002Frelay-rule-list.toml\nrac des spec publish --manifest apps\u002Fwebhook-relay\u002Fpipelines\u002Fevent-matches.toml\nrac des spec publish --manifest apps\u002Fwebhook-relay\u002Fpipelines\u002Fdelivery-list.toml\nrac app publish apps\u002Fwebhook-relay\u002Fapp.toml\nrac app install webhook-relay --version 0.1.0 \\\n  --installation-id webhook-relay-example \\\n  --grant relay-read,relay-write,relay-pipelines\n","bash","",[462,708,709,728,740,761,777,793,804,826,837],{"__ignoreMap":706},[710,711,714,718,722,725],"span",{"class":712,"line":713},"line",1,[710,715,717],{"class":716},"snPdu","rac",[710,719,721],{"class":720},"sIIMD"," app",[710,723,724],{"class":720}," validate",[710,726,727],{"class":720}," apps\u002Fwebhook-relay\u002Fapp.toml\n",[710,729,731,733,735,738],{"class":712,"line":730},2,[710,732,717],{"class":716},[710,734,721],{"class":720},[710,736,737],{"class":720}," build",[710,739,727],{"class":720},[710,741,743,745,748,751,754,758],{"class":712,"line":742},3,[710,744,717],{"class":716},[710,746,747],{"class":720}," des",[710,749,750],{"class":720}," spec",[710,752,753],{"class":720}," publish",[710,755,757],{"class":756},"sBjJW"," --manifest",[710,759,760],{"class":720}," apps\u002Fwebhook-relay\u002Fpipelines\u002Frelay-rule-list.toml\n",[710,762,764,766,768,770,772,774],{"class":712,"line":763},4,[710,765,717],{"class":716},[710,767,747],{"class":720},[710,769,750],{"class":720},[710,771,753],{"class":720},[710,773,757],{"class":756},[710,775,776],{"class":720}," apps\u002Fwebhook-relay\u002Fpipelines\u002Fevent-matches.toml\n",[710,778,780,782,784,786,788,790],{"class":712,"line":779},5,[710,781,717],{"class":716},[710,783,747],{"class":720},[710,785,750],{"class":720},[710,787,753],{"class":720},[710,789,757],{"class":756},[710,791,792],{"class":720}," apps\u002Fwebhook-relay\u002Fpipelines\u002Fdelivery-list.toml\n",[710,794,796,798,800,802],{"class":712,"line":795},6,[710,797,717],{"class":716},[710,799,721],{"class":720},[710,801,753],{"class":720},[710,803,727],{"class":720},[710,805,807,809,811,814,817,820,823],{"class":712,"line":806},7,[710,808,717],{"class":716},[710,810,721],{"class":720},[710,812,813],{"class":720}," install",[710,815,816],{"class":720}," webhook-relay",[710,818,819],{"class":756}," --version",[710,821,822],{"class":756}," 0.1.0",[710,824,825],{"class":756}," \\\n",[710,827,829,832,835],{"class":712,"line":828},8,[710,830,831],{"class":756},"  --installation-id",[710,833,834],{"class":720}," webhook-relay-example",[710,836,825],{"class":756},[710,838,840,843],{"class":712,"line":839},9,[710,841,842],{"class":756},"  --grant",[710,844,845],{"class":720}," relay-read,relay-write,relay-pipelines\n",[458,847,848,849,852,853,856],{},"Publication requires the same registry authority and grant review described in\nthe ",[474,850,851],{"href":319},"release lifecycle",". Only\n",[462,854,855],{},"build\u002Fapp-release.json"," is checked in.",[480,858,860],{"id":859},"bounds","Bounds",[458,862,863],{},"The rule list returns at most 200 live rules, sorted by name. Matching returns\nthe 50 newest events of one type, and the delivery list returns 100 rows for\none rule. Match and list filters are fixed when the pipelines are signed; the\nonly value chosen at run time is the rule's event type or identity.",[480,865,867],{"id":866},"friction-log","Friction log",[458,869,870],{},"These are the problems we hit while building the app. We describe them here\nwithout filing tickets. The ticket asked for ingest, routing, compute-on-write\nand outbound delivery with retry. Ingest and routing work; the other two do\nnot fit the current contract.",[506,872,873,920,935,994,1007,1031,1041,1050,1063,1077],{},[509,874,875,878,879,681,882,534,885,534,888,534,891,534,894,681,897,534,900,534,903,534,906,534,909,556,912,915,916,919],{},[488,876,877],{},"No inbound webhook endpoint."," The app TOML's top-level keys are ",[462,880,881],{},"app",[462,883,884],{},"agent",[462,886,887],{},"deployment",[462,889,890],{},"background_jobs",[462,892,893],{},"entities",[462,895,896],{},"pipelines",[462,898,899],{},"functions",[462,901,902],{},"capabilities",[462,904,905],{},"actions",[462,907,908],{},"views",[462,910,911],{},"assets",[462,913,914],{},"dependencies","\n(",[462,917,918],{},"crates\u002Fshared\u002Fschema\u002Fapp-manifest\u002Fsrc\u002Ftoml_projection.rs:15-38","). None of\nthem declares an HTTP ingress route. Events are therefore written through the\nauthenticated entity write path, from the app form or by an agent with the\nwrite grant. A third party cannot POST to the app.",[509,921,922,925,926,928,929,932,933,469],{},[488,923,924],{},"No compute-on-write."," The same key list has no write trigger, so recording\nan event cannot start matching or queue deliveries. The nearest thing is\n",[462,927,890],{},": a signed schedule that invokes a declared pipeline every\n1 minute to 30 days (",[462,930,931],{},"crates\u002Fshared\u002Fschema\u002Fapp-manifest\u002Fsrc\u002Fbackground.rs:26-31",").\nThat is polling, not a reaction to a write, so we left it out of this minimal\nloop. Matching runs when someone presses ",[488,934,513],{},[509,936,937,940,941,944,945,948,949,952,953,956,957],{},[488,938,939],{},"Outbound egress exists but cannot record its own result."," A pipeline can\ncontain an ",[462,942,943],{},"http_fetch"," stage with a method and body template. Release\nresolution requires a ",[462,946,947],{},"network_request"," capability that covers the stage's\n",[462,950,951],{},"url_template"," (",[462,954,955],{},"crates\u002Fshared\u002Fschema\u002Fapp-manifest\u002Fsrc\u002Fresolve\u002Fpipeline_validation.rs:586-603",").\nThree things kept it out of this app:\n",[958,959,960,978,988],"ol",{},[509,961,962,963,966,967,970,971,974,975,977],{},"Capability patterns are exact strings or ",[462,964,965],{},"*","-suffixed prefixes\n(",[462,968,969],{},"crates\u002Fshared\u002Fschema\u002Fapp-manifest\u002Fsrc\u002Fvalidate\u002Fpins.rs:24-30",") checked\nagainst the signed template. A per-rule, user-entered ",[462,972,973],{},"target_url"," needs\neither one host fixed at signing or a ",[462,976,965],{}," pattern that allows egress to\nany host.",[509,979,980,981,984,985,987],{},"DES rejects storage sinks on HTTP nodes (\"HTTP pipeline node storage sinks\nrequire a publication workflow\",\n",[462,982,983],{},"crates\u002Fservice\u002Fdata-engine-service\u002Fsrc\u002Fpipeline_executor_runner.rs:88-94",").\nA delivery pipeline therefore cannot write the ",[462,986,610],{}," outcome itself.\nA client action would have to read the response and write it back.",[509,989,990,991,993],{},"We did not verify that a portable ",[462,992,641],{}," from the browser host\nreaches the executor's HTTP runner, or what happens to a failed request.",[509,995,996,999,1000,1003,1004,1006],{},[488,997,998],{},"No automatic retry."," The background scheduler says that uncertain effects\n\"require reconciliation, never an automatic retry\"\n(",[462,1001,1002],{},"crates\u002Fservice\u002Fdata-engine-service\u002Fsrc\u002Fapp_background.rs:1-2","). Retry is\nrecorded state (",[462,1005,541],{},") that an operator or external worker acts on.",[509,1008,1009,1012,1015,1016,915,1019,1022,1023,1026,1027,1030],{},[488,1010,1011],{},"No arithmetic in action flows, and server time only on create.",[462,1013,1014],{},"entity_operation_now_ms_field"," is accepted only for ",[462,1017,1018],{},"create",[462,1020,1021],{},"crates\u002Fshared\u002Fschema\u002Fapp-manifest\u002Fsrc\u002Fvalidate\u002Faction.rs:266-280","), so\n",[462,1024,1025],{},"updated_at_ms"," is the time the delivery was queued and never changes.\nBindings copy values without computing them, so ",[462,1028,1029],{},"attempts"," cannot be\nincremented. It stays at the value it was created with (0).",[509,1032,1033,1036,1037,1040],{},[488,1034,1035],{},"One parameter per pipeline invocation."," Matching filters on event type\nonly, and the rule's ",[462,1038,1039],{},"source"," is a label. A match on (source, event_type)\nneeds two filter bindings or a join against the rule, and the overlay\nsupports one binding.",[509,1042,1043,1046,1047,1049],{},[488,1044,1045],{},"Pipeline results are not live collections."," Matches and deliveries are\nflat result rows in local state. Optimistic projection needs a grouped,\nhydrated collection, so every delivery change chains a ",[462,1048,635],{}," run\nto show the new state.",[509,1051,1052,1055,1056,1058,1059,1062],{},[488,1053,1054],{},"Enablement is display-only."," A paused rule hides ",[488,1057,519],{}," through\n",[462,1060,1061],{},"v-if",". Nothing on the server stops a write that references a paused rule.",[509,1064,1065,1068,1069,1072,1073,1076],{},[488,1066,1067],{},"Host tests need a remount."," Rows written into local state by an action do\nnot re-render an already-mounted page in the test harness, so\n",[462,1070,1071],{},"webhookRelay.test.ts"," remounts the page after each pipeline run, as\n",[462,1074,1075],{},"metricsNotebook.test.ts"," does.",[509,1078,1079,1082,1083,1086,1087,1090],{},[488,1080,1081],{},"Badge labels need a binding."," ",[462,1084,1085],{},"label=\"{{ $item.status }}\""," renders the\nliteral text; ",[462,1088,1089],{},":label=\"$item.status\""," binds the value.",[1092,1093,1094],"style",{},"html pre.shiki code .snPdu, html code.shiki .snPdu{--shiki-light:#6F42C1;--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .sIIMD, html code.shiki .sIIMD{--shiki-light:#032F62;--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .sBjJW, html code.shiki .sBjJW{--shiki-light:#005CC5;--shiki-default:#005CC5;--shiki-dark:#79B8FF}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":706,"searchDepth":730,"depth":730,"links":1096},[1097,1098,1099,1100,1101],{"id":482,"depth":730,"text":483},{"id":575,"depth":730,"text":576},{"id":698,"depth":730,"text":699},{"id":859,"depth":730,"text":860},{"id":866,"depth":730,"text":867},"A gallery app that records inbound webhook events, matches them to relay rules and tracks each delivery's status on the shared host.","md","2026-10-25",null,"preview",{"toc":1108,"visibility":278},true,{"title":334,"description":1102},"aDUPqVTCdE7iIywKv-1uQlp7ocJwwpIxqIHzsmyqr4M",[1112,1114],{"title":330,"path":331,"stem":332,"description":1113,"children":-1},"A gallery app that saves named metric queries and runs them through signed, parameterized pipelines on the shared host.",{"title":338,"path":339,"stem":340,"description":1115,"children":-1},"Use RAC from a laptop, CI job or agent with your platform identity. The commands\ncall authenticated public APIs; the service prepares the checkout, environment\nand chosen harness. No local Kubernetes access or operator forge token is needed.",1793335582683]