[{"data":1,"prerenderedAt":922},["ShallowReactive",2],{"navigation_docs":3,"-develop-build-a-vertical":388,"-develop-build-a-vertical-surround":917},[4,82,147,173,202,259,298,355],{"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],{"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},"First API call","\u002Fcookbook\u002Ffirst-api-call","10.cookbook\u002F2.first-api-call",{"title":120,"path":121,"stem":122},"Python client","\u002Fcookbook\u002Fmodel-api-python","10.cookbook\u002F3.model-api-python",{"title":124,"path":125,"stem":126},"Anthropic Messages","\u002Fcookbook\u002Fanthropic-messages","10.cookbook\u002F4.anthropic-messages",{"title":128,"path":129,"stem":130},"Check credits","\u002Fcookbook\u002Fcheck-credits","10.cookbook\u002F5.check-credits",{"title":132,"path":133,"stem":134},"Query data via MCP","\u002Fcookbook\u002Fmcp-query-data","10.cookbook\u002F6.mcp-query-data",{"title":136,"path":137,"stem":138},"Drive an agent via MCP","\u002Fcookbook\u002Fmcp-drive-agent","10.cookbook\u002F7.mcp-drive-agent",{"title":140,"path":141,"stem":142},"Install the client","\u002Fcookbook\u002Finstall-client","10.cookbook\u002F8.install-client",{"title":144,"path":145,"stem":146},"Use another API host","\u002Fcookbook\u002Fpoint-client-at-host","10.cookbook\u002F9.point-client-at-host",{"title":148,"icon":149,"redirect":150,"path":151,"stem":152,"children":153,"page":73},"Agent operations","i-lucide-network","\u002Ffleet\u002Foverview","\u002Ffleet","11.fleet",[154,157,161,165,169],{"title":155,"path":150,"stem":156},"Running agent work","11.fleet\u002F0.overview",{"title":158,"path":159,"stem":160},"Workstreams and issues","\u002Ffleet\u002Fworkstreams-and-issues","11.fleet\u002F1.workstreams-and-issues",{"title":162,"path":163,"stem":164},"Agent lifecycle","\u002Ffleet\u002Fagent-lifecycle","11.fleet\u002F2.agent-lifecycle",{"title":166,"path":167,"stem":168},"Supervision and recovery","\u002Ffleet\u002Fsupervision","11.fleet\u002F3.supervision",{"title":170,"path":171,"stem":172},"An application workstream from request to delivery","\u002Ffleet\u002Fapplication-workstream","11.fleet\u002F4.application-workstream",{"title":174,"icon":175,"redirect":176,"path":177,"stem":178,"children":179,"page":73},"Architecture","i-lucide-layers","\u002Finfrastructure\u002Foverview","\u002Finfrastructure","3.infrastructure",[180,182,186,190,194,198],{"title":174,"path":176,"stem":181},"3.infrastructure\u002F0.overview",{"title":183,"path":184,"stem":185},"A request through the platform","\u002Finfrastructure\u002Frequest-path","3.infrastructure\u002F11.request-path",{"title":187,"path":188,"stem":189},"Agent work and durable state","\u002Finfrastructure\u002Fagent-work","3.infrastructure\u002F12.agent-work",{"title":191,"path":192,"stem":193},"Data and pipelines","\u002Finfrastructure\u002Fdata","3.infrastructure\u002F3.data",{"title":195,"path":196,"stem":197},"AI and agents","\u002Finfrastructure\u002Fai","3.infrastructure\u002F4.ai",{"title":199,"path":200,"stem":201},"Managed deployment","\u002Finfrastructure\u002Fdeployment","3.infrastructure\u002F7.deployment",{"title":203,"icon":204,"redirect":205,"path":206,"stem":207,"children":208,"page":73},"API","i-lucide-book-marked","\u002Freference\u002Fauthentication","\u002Freference","4.reference",[209,212,216,220,224,228,232,236,240,244,248],{"title":210,"path":205,"stem":211},"Authentication","4.reference\u002F1.authentication",{"title":213,"path":214,"stem":215},"Security disclosure policy","\u002Freference\u002Fsecurity-disclosure","4.reference\u002F11.security-disclosure",{"title":217,"path":218,"stem":219},"Model API","\u002Freference\u002Fllm-api","4.reference\u002F2.llm-api",{"title":221,"path":222,"stem":223},"MCP server","\u002Freference\u002Fmcp","4.reference\u002F2.mcp",{"title":225,"path":226,"stem":227},"Data platform preview","\u002Freference\u002Fdata-platform-preview","4.reference\u002F3.data-platform-preview",{"title":229,"path":230,"stem":231},"Terminal client","\u002Freference\u002Fcli","4.reference\u002F6.cli",{"title":233,"path":234,"stem":235},"Pipeline manifest preview","\u002Freference\u002Fpipeline-preview","4.reference\u002F7.pipeline-preview",{"title":237,"path":238,"stem":239},"Limits and retries","\u002Freference\u002Flimits","4.reference\u002F8.limits",{"title":241,"path":242,"stem":243},"API contract details","\u002Freference\u002Fapi-contracts","4.reference\u002F9.api-contracts",{"title":245,"path":246,"stem":247},"Errors","\u002Freference\u002Ferrors","4.reference\u002F9.errors",{"title":249,"icon":250,"visibility":251,"path":252,"stem":253,"children":254,"page":73},"Public API","i-lucide-route","public","\u002Freference\u002Froutes","4.reference\u002Froutes",[255],{"title":256,"path":257,"stem":258},"V1 routes","\u002Freference\u002Froutes\u002Fv1","4.reference\u002Froutes\u002Fv1",{"title":260,"icon":261,"visibility":25,"redirect":262,"path":263,"stem":264,"children":265,"page":73},"Develop","i-lucide-code","\u002Fdevelop\u002Fpipeline-apps\u002Foverview","\u002Fdevelop","5.develop",[266,270,286,290,294],{"title":267,"path":268,"stem":269},"Author a batch transform","\u002Fdevelop\u002Fauthor-a-batch-transform","5.develop\u002F10.author-a-batch-transform",{"title":271,"visibility":251,"redirect":262,"path":272,"stem":273,"children":274,"page":73},"Pipeline Apps","\u002Fdevelop\u002Fpipeline-apps","5.develop\u002F11.pipeline-apps",[275,278,282],{"title":276,"path":262,"stem":277},"Pipeline apps","5.develop\u002F11.pipeline-apps\u002F1.overview",{"title":279,"path":280,"stem":281},"Collaborative board walkthrough","\u002Fdevelop\u002Fpipeline-apps\u002Fcollaborative-board","5.develop\u002F11.pipeline-apps\u002F2.collaborative-board",{"title":283,"path":284,"stem":285},"Release and security lifecycle","\u002Fdevelop\u002Fpipeline-apps\u002Frelease-lifecycle","5.develop\u002F11.pipeline-apps\u002F3.release-lifecycle",{"title":287,"path":288,"stem":289},"Build a vertical","\u002Fdevelop\u002Fbuild-a-vertical","5.develop\u002F5.build-a-vertical",{"title":291,"path":292,"stem":293},"Managed application artifacts","\u002Fdevelop\u002Fscaffold-a-narrow-app","5.develop\u002F7.scaffold-a-narrow-app",{"title":295,"path":296,"stem":297},"Import your data","\u002Fdevelop\u002Fimport-your-data","5.develop\u002F8.import-your-data",{"title":299,"icon":300,"redirect":301,"path":302,"stem":303,"children":304,"page":73},"Guides","i-lucide-layout-grid","\u002Fapplications\u002Fai-agents\u002Foverview","\u002Fapplications","7.applications",[305,309,329,341],{"title":306,"path":307,"stem":308},"Application maturity catalog","\u002Fapplications\u002Fcatalog","7.applications\u002F0.catalog",{"title":310,"visibility":251,"path":311,"stem":312,"children":313,"page":73},"AI Agents","\u002Fapplications\u002Fai-agents","7.applications\u002F1.ai-agents",[314,317,321,325],{"title":315,"path":301,"stem":316},"Coding agents","7.applications\u002F1.ai-agents\u002F01.overview",{"title":318,"path":319,"stem":320},"GitHub App automation","\u002Fapplications\u002Fai-agents\u002Fgithub-app-automation","7.applications\u002F1.ai-agents\u002F04.github-app-automation",{"title":322,"path":323,"stem":324},"agent-cli assistance","\u002Fapplications\u002Fai-agents\u002Fagent-cli-assistance","7.applications\u002F1.ai-agents\u002F05.agent-cli-assistance",{"title":326,"path":327,"stem":328},"Agent REST control","\u002Fapplications\u002Fai-agents\u002Frest-agent-control","7.applications\u002F1.ai-agents\u002F06.rest-agent-control",{"title":330,"visibility":251,"path":331,"stem":332,"children":333,"page":73},"Tickets","\u002Fapplications\u002Ftickets","7.applications\u002F2.tickets",[334,337],{"title":330,"path":335,"stem":336},"\u002Fapplications\u002Ftickets\u002Foverview","7.applications\u002F2.tickets\u002F01.overview",{"title":338,"path":339,"stem":340},"API walkthrough","\u002Fapplications\u002Ftickets\u002Fapi-walkthrough","7.applications\u002F2.tickets\u002F02.api-walkthrough",{"title":342,"icon":343,"visibility":251,"path":344,"stem":345,"children":346,"page":73},"Case studies","i-lucide-book-open-check","\u002Fapplications\u002Fcase-studies","7.applications\u002F6.case-studies",[347,351],{"title":348,"path":349,"stem":350},"Case study: owner-scoped tickets","\u002Fapplications\u002Fcase-studies\u002Ftickets","7.applications\u002F6.case-studies\u002F01.tickets",{"title":352,"path":353,"stem":354},"Case study: repository review and correction","\u002Fapplications\u002Fcase-studies\u002Frepository-review","7.applications\u002F6.case-studies\u002F02.repository-review",{"title":356,"icon":357,"redirect":358,"path":359,"stem":360,"children":361,"page":73},"Resources","i-lucide-library","\u002Fresources\u002Fglossary","\u002Fresources","9.resources",[362,365,369,373,377,380,384],{"title":363,"path":358,"stem":364},"Glossary","9.resources\u002F1.glossary",{"title":366,"path":367,"stem":368},"Terms of Service","\u002Fresources\u002Fterms","9.resources\u002F2.terms",{"title":370,"path":371,"stem":372},"Privacy Policy","\u002Fresources\u002Fprivacy","9.resources\u002F3.privacy",{"title":374,"path":375,"stem":376},"Acceptable Use Policy","\u002Fresources\u002Facceptable-use","9.resources\u002F4.acceptable-use",{"title":79,"path":378,"stem":379},"\u002Fresources\u002Ffaq","9.resources\u002F5.faq",{"title":381,"path":382,"stem":383},"Documentation feedback","\u002Fresources\u002Fdocs-feedback","9.resources\u002F6.docs-feedback",{"title":385,"path":386,"stem":387},"Refund and Cancellation Policy","\u002Fresources\u002Frefund-cancellation","9.resources\u002F7.refund-cancellation",{"id":389,"title":287,"access":390,"audience":391,"body":392,"description":908,"extension":909,"last_verified":910,"links":911,"maturity":912,"meta":913,"navigation":914,"path":288,"seo":915,"stem":289,"__hash__":916},"docs\u002F5.develop\u002F5.build-a-vertical.md","onboarding","developer",{"type":393,"value":394,"toc":894},"minimark",[395,399,403,406,411,419,422,428,432,451,457,461,488,491,699,702,706,709,731,744,754,758,787,801,816,820,827,833,840,844,851,855,858,862,873,877],[396,397,398],"caution",{},"Developer preview — pipeline applications are coordinated directly as a managed service. Customers review the Git-authored schema, manifest, transform, tests, and API contract; Redgold handles publication, dataset provisioning, deployment, and runtime operations.",[400,401,402],"p",{},"A \"vertical\" is an application domain built on top of the platform — AI agents, identity, real estate, or market data. Each vertical reuses the same base capabilities: signed rows, content-addressed primary keys, pipeline manifests, the dataflow runtime, and executor isolation tiers. It contributes its own Rust-native serde schema types, ingestion adapters, transforms, datasets, and optional UI.",[400,404,405],{},"The order matters. Schema first, ingestion second, transforms third, service surface fourth, UI fifth, deployment last.",[407,408,410],"h2",{"id":409},"_1-define-the-rust-native-schema-types","1. Define the Rust-native schema types",[400,412,413,414,418],{},"Define stored rows, IPC payloads, and long-lived state as serde types in a focused\ncomponent micro-crate under ",[415,416,417],"code",{},"crates\u002Fshared\u002Fschema\u002F",". Use the component's stable\npackage and public module path, CBOR for row\u002FIPC bytes, and Arrow\u002FLance for the\nstorage projection. Greenfield identity fields may be required; fields added\nafter release stay optional. The schema remains a checked-in Rust serde contract,\nwith canonical CBOR for stored and transported bytes.",[400,420,421],{},"Two things you need from the start: a raw response type (the typed equivalent of whatever JSON or binary payload the source returns) and a per-record type that flattens the response into one row per logical event. If a source returns \"an array of N prices at N timestamps in one HTTP response\", the raw type holds the whole array exactly as the source returned it, and the per-record type is one price at one timestamp. The DAQ pipeline saves the raw before any transformation runs and the per-record is what the data lake ends up indexing.",[400,423,424,425,427],{},"Your domain types may also need to participate in the signed primary key system. Reuse the focused primary-key schema crate and the data model at ",[415,426,192],{},"; any older generated-schema implementation there is a migration boundary, not a pattern for new application code.",[407,429,431],{"id":430},"_2-define-the-dataset-reference","2. Define the dataset reference",[400,433,434,435,438,439,442,443,446,447,450],{},"Every dataset in the data lake carries a resolvable ",[415,436,437],{},"DatasetReference",". Stable,\nhigh-frequency platform record classes may use a ",[415,440,441],{},"RecordElementDataType"," enum\nvariant and its globally unique ",[415,444,445],{},"dataset_name()",". Generic or application-owned\ndatasets use the generic record class plus a globally unique ",[415,448,449],{},"type_url",", which\navoids consuming a central enum slot. The same reference can carry a content\nhash for content-addressed schema evolution.",[400,452,453,454,456],{},"The transaction envelope needs enough information to resolve the dataset and\nschema. Choose the enum path for an established platform class and the\n",[415,455,449],{}," path for an ad-hoc or independently evolving application dataset.",[407,458,460],{"id":459},"_3-ingestion-crate-if-applicable","3. Ingestion crate (if applicable)",[400,462,463,464,467,468,471,472,475,476,479,480,483,484,487],{},"If your vertical pulls data from external APIs, websocket feeds, or file sources, add a collector crate under ",[415,465,466],{},"crates\u002Fdata\u002Fdaq\u002F\u003Csource>\u002F",". Existing collectors to study: ",[415,469,470],{},"weather"," and ",[415,473,474],{},"real-estate"," (non-finance domains), ",[415,477,478],{},"macro"," (REST polling), ",[415,481,482],{},"public-records"," (file sources), and the market-data collectors under ",[415,485,486],{},"crates\u002Fdata\u002Fdaq\u002F"," covering REST, websocket-only, and paid authenticated sources.",[400,489,490],{},"The implementation contract:",[492,493,494,498,501,688],"ul",{},[495,496,497],"li",{},"Define serde structs for the upstream format. Keep a durable raw type when the source payload itself is part of the stored contract.",[495,499,500],{},"Save raw JSONL to disk before any transformation. The DAQ framework provides the writer; use it. This protects you against the source changing its response shape — you can re-parse historical raw files against an updated schema.",[495,502,503,504,507,508,615,616,687],{},"Convert raw to your typed native record, attach a ",[415,505,506],{},"PrimaryKeyId"," carrying both the source-reported timestamp ",[509,510,513,542],"span",{"className":511},[512],"katex",[509,514,517],{"className":515},[516],"katex-mathml",[518,519,521],"math",{"xmlns":520},"http:\u002F\u002Fwww.w3.org\u002F1998\u002FMath\u002FMathML",[522,523,524,537],"semantics",{},[525,526,527],"mrow",{},[528,529,530,534],"msub",{},[531,532,533],"mi",{},"t",[531,535,536],{},"r",[538,539,541],"annotation",{"encoding":540},"application\u002Fx-tex","t_r",[509,543,547],{"className":544,"ariaHidden":546},[545],"katex-html","true",[509,548,551,556],{"className":549},[550],"base",[509,552],{"className":553,"style":555},[554],"strut","height:0.7651em;vertical-align:-0.15em;",[509,557,560,564],{"className":558},[559],"mord",[509,561,533],{"className":562},[559,563],"mathnormal",[509,565,568],{"className":566},[567],"msupsub",[509,569,573,606],{"className":570},[571,572],"vlist-t","vlist-t2",[509,574,577,601],{"className":575},[576],"vlist-r",[509,578,582],{"className":579,"style":581},[580],"vlist","height:0.1514em;",[509,583,585,590],{"style":584},"top:-2.55em;margin-left:0em;margin-right:0.05em;",[509,586],{"className":587,"style":589},[588],"pstrut","height:2.7em;",[509,591,597],{"className":592},[593,594,595,596],"sizing","reset-size6","size3","mtight",[509,598,536],{"className":599,"style":600},[559,563,596],"margin-right:0.0278em;",[509,602,605],{"className":603},[604],"vlist-s","​",[509,607,609],{"className":608},[576],[509,610,613],{"className":611,"style":612},[580],"height:0.15em;",[509,614],{}," and the observation timestamp ",[509,617,619,638],{"className":618},[512],[509,620,622],{"className":621},[516],[518,623,624],{"xmlns":520},[522,625,626,635],{},[525,627,628],{},[528,629,630,632],{},[531,631,533],{},[531,633,634],{},"o",[538,636,637],{"encoding":540},"t_o",[509,639,641],{"className":640,"ariaHidden":546},[545],[509,642,644,647],{"className":643},[550],[509,645],{"className":646,"style":555},[554],[509,648,650,653],{"className":649},[559],[509,651,533],{"className":652},[559,563],[509,654,656],{"className":655},[567],[509,657,659,679],{"className":658},[571,572],[509,660,662,676],{"className":661},[576],[509,663,665],{"className":664,"style":581},[580],[509,666,667,670],{"style":584},[509,668],{"className":669,"style":589},[588],[509,671,673],{"className":672},[593,594,595,596],[509,674,634],{"className":675},[559,563,596],[509,677,605],{"className":678},[604],[509,680,682],{"className":681},[576],[509,683,685],{"className":684,"style":612},[580],[509,686],{},", and write through the shared storage layer.",[495,689,690,691,694,695,698],{},"Implement the ",[415,692,693],{},"DataSource"," trait so the daq-crawler runtime can drive your collector. See ",[415,696,697],{},"crates\u002Fdata\u002Fdaq\u002Fweather\u002Fsrc\u002Fingestion.rs"," for a worked example.",[400,700,701],{},"The crawler itself does not featurize data. Its only job is raw retrieval, typed conversion, and write-through.",[407,703,705],{"id":704},"_4-transforms","4. Transforms",[400,707,708],{},"Transforms are how your raw rows become useful rows. Choose the tier from the code's trust boundary:",[492,710,711,714,721,724],{},[495,712,713],{},"Built-in operators run in-process for platform-owned operations.",[495,715,716,717,720],{},"Trusted Rust batch transforms are content-addressed dynamic libraries loaded through the ",[415,718,719],{},"NATIVE_DYLIB"," tier.",[495,722,723],{},"Capability-limited WASM UDFs run in process through the default-on Wasmtime sandbox, with fuel, memory, and wall-time bounds and no WASI access.",[495,725,726,727,730],{},"Untrusted native and Python functions run through the ",[415,728,729],{},"MICROVM"," tier on opted-in KVM nodes, using a Firecracker sandbox.",[400,732,733,734,471,739,743],{},"The dataflow executor has no GPU UDF backend. Model serving uses a separate GPU lane. The server request-handler WASM host is also a separate component preview and is not selected by production routes. See the ",[735,736,738],"a",{"href":737},"\u002Finfrastructure\u002Foverview#current-capability-matrix","capability matrix",[735,740,742],{"href":741},"\u002Fdevelop\u002Fpipeline-apps\u002Foverview#runtime-placement","Pipeline Apps runtime placement"," for the maintained status.",[400,745,746,747,750,751,753],{},"Either way the transform shows up in the dataflow plan as a stage, and the canonical stage ordering is ",[415,748,749],{},"Filter -> Transform -> Aggregate -> Merge -> Sort"," with backward cycles allowed when iterating. See ",[735,752,191],{"href":192}," for the public execution model.",[407,755,757],{"id":756},"_5-domain-logic-crate","5. Domain logic crate",[400,759,760,761,764,765,764,768,764,771,774,775,778,779,782,783,786],{},"Add a crate under the right subgroup. The major divisions are ",[415,762,763],{},"crates\u002Fai\u002F",", ",[415,766,767],{},"crates\u002Fintegrations\u002F",[415,769,770],{},"crates\u002Ffeed\u002F",[415,772,773],{},"crates\u002Fosint\u002F",", and ",[415,776,777],{},"crates\u002Fdata\u002Fidentity\u002F"," — pick the one that matches your domain or add a sibling if your vertical does not fit existing groupings. Use the ",[415,780,781],{},"crates\u002Ftemplate"," directory as the starting point per ",[415,784,785],{},"CLAUDE.md",".",[400,788,789,790,764,793,796,797,800],{},"Keep the crate independently buildable. Depend on schema sub-crates (",[415,791,792],{},"redgold-schema-base",[415,794,795],{},"redgold-schema-error",") rather than the superset ",[415,798,799],{},"redgold-schema"," where you can — the dev branch CI builds independent microservices and the superset is for local-dev convenience and release builds. Compile time is a real cost here; the superset graph is enormous.",[400,802,803,804,807,808,811,812,815],{},"Set ",[415,805,806],{},"publish = false"," and rely on ",[415,809,810],{},".workspace = true"," for shared deps. New crates almost always want ",[415,813,814],{},"redgold-schema-base.workspace = true"," at minimum.",[407,817,819],{"id":818},"_6-declare-routes-in-the-pipeline-manifest","6. Declare routes in the pipeline manifest",[400,821,822,823,826],{},"New HTTP and WebSocket routes are authored under ",[415,824,825],{},"pipelines\u002Froutes\u002F\u003Cdomain>\u002F",". Route discovery traverses domain folders recursively. The manifest declares the method, path, authentication requirement, request and response schema types, dataset binding, and executor operation. The stateless edge resolves the route and caller identity, then relays the invocation to the executor. Use DTS HTTP\u002FWS, engine subscriptions, or iroh where ready.",[400,828,829,830,832],{},"A specialized service crate is appropriate when the application needs a separately operated workload or protocol that the pipeline executor cannot provide. Ordinary application reads, writes, transforms, and subscriptions stay on the manifest path. ",[735,831,291],{"href":292}," defines the customer-reviewed contract.",[400,834,835,836,839],{},"Route reachability has two separate gates. The generated ",[735,837,838],{"href":257},"V1 route inventory","\nis the authority for self-service routes: today it lists the model API only.\nPipeline-app routes are onboarding\u002Fmanaged-preview routes and remain unavailable\nto a general API-key caller until the repository, dataset, publication, and\nenvironment have been approved and provisioned.",[407,841,843],{"id":842},"_7-ui","7. UI",[400,845,846,847,850],{},"The Vue 3 UI lives under ",[415,848,849],{},"ui\u002F",". Stream has a normal, scrollable chronological conversation lane with the shared composer and status rail. Its optional ambient bubble canvas uses a force-directed, non-scrolling layout inside the canvas. New event views should choose the lane or canvas behavior that matches their content.",[407,852,854],{"id":853},"_8-deployment","8. Deployment",[400,856,857],{},"Pipeline applications deploy through the Git-backed build path. During the managed preview, Redgold provisions the dataset and publication boundary, then the normal review and CI path publishes the approved manifest and workload state. Keep the schema, pipeline manifest, transform pin, tests, and application contract in the repository so validation can evaluate the complete change.",[407,859,861],{"id":860},"_9-docs","9. Docs",[400,863,864,865,868,869,872],{},"Add a section under ",[415,866,867],{},"\u002Fapplications\u002F\u003Cyour-vertical>\u002F"," covering what the vertical does, which schema types it introduces, which ingestion sources it pulls from, and where its API surface lives. The AI-agents section under ",[415,870,871],{},"docs\u002Fcontent\u002F7.applications\u002F1.ai-agents\u002F"," is the model — it covers motivation, the problems the vertical solves, and the implementation walk-through, which is the shape most verticals should follow.",[407,874,876],{"id":875},"concrete-examples","Concrete examples",[400,878,879,880,883,884,764,887,774,890,893],{},"AI agents are the most active native-schema conversion area, with component crates under ",[415,881,882],{},"crates\u002Fshared\u002Fschema\u002Fai\u002F"," and agent-plane crates under ",[415,885,886],{},"crates\u002Fservice\u002Fagent-controller\u002F",[415,888,889],{},"agent-pod-proxy\u002F",[415,891,892],{},"session-babysitter\u002F",". Remaining generated-schema paths are legacy migration inventory rather than examples for new work.",{"title":895,"searchDepth":896,"depth":896,"links":897},"",2,[898,899,900,901,902,903,904,905,906,907],{"id":409,"depth":896,"text":410},{"id":430,"depth":896,"text":431},{"id":459,"depth":896,"text":460},{"id":704,"depth":896,"text":705},{"id":756,"depth":896,"text":757},{"id":818,"depth":896,"text":819},{"id":842,"depth":896,"text":843},{"id":853,"depth":896,"text":854},{"id":860,"depth":896,"text":861},{"id":875,"depth":896,"text":876},"How to build an application vertical on the platform, in order — Rust schema, ingestion, transforms, service surface, UI, then deployment.","md","2026-08-14",null,"preview",{"toc":914,"visibility":251},true,{"title":287,"description":908},"_GdyIhP1Bp3faBCHvovkGG-zoEkAKBNhymQMNw_tN6Q",[918,920],{"title":283,"path":284,"stem":285,"description":919,"children":-1},"How portable pipeline apps are hashed, signed, validated, installed, permissioned, upgraded, shared, forked, and revoked.",{"title":291,"path":292,"stem":293,"description":921,"children":-1},"The schema, pipeline TOML, Rust transform, tests, and API contract reviewed for a managed pipeline application.",1789873213247]