[{"data":1,"prerenderedAt":2426},["ShallowReactive",2],{"navigation":3,"\u002Fdocs\u002Fconfiguration\u002Fcore-config":314,"\u002Fdocs\u002Fconfiguration\u002Fcore-config-surround":2421},[4,38,86,149,176,219,257,273],{"title":5,"path":6,"stem":7,"children":8,"icon":37},"Getting Started","\u002Fdocs\u002Fgetting-started","1.docs\u002F1.getting-started\u002F1.index",[9,12,17,22,27,32],{"title":10,"path":6,"stem":7,"icon":11},"Getting started","i-lucide-flag",{"title":13,"path":14,"stem":15,"icon":16},"Modules overview","\u002Fdocs\u002Fgetting-started\u002Fmodules-overview","1.docs\u002F1.getting-started\u002F2.modules-overview","i-lucide-boxes",{"title":18,"path":19,"stem":20,"icon":21},"Installation","\u002Fdocs\u002Fgetting-started\u002Finstallation","1.docs\u002F1.getting-started\u002F3.installation","i-lucide-download",{"title":23,"path":24,"stem":25,"icon":26},"License configuration","\u002Fdocs\u002Fgetting-started\u002Flicense-configuration","1.docs\u002F1.getting-started\u002F4.license-configuration","i-lucide-key-round",{"title":28,"path":29,"stem":30,"icon":31},"Your first app","\u002Fdocs\u002Fgetting-started\u002Ffirst-app","1.docs\u002F1.getting-started\u002F5.first-app","i-lucide-square-play",{"title":33,"path":34,"stem":35,"icon":36},"Project setup","\u002Fdocs\u002Fgetting-started\u002Fproject-setup","1.docs\u002F1.getting-started\u002F6.project-setup","i-lucide-package",false,{"title":39,"path":40,"stem":41,"children":42,"icon":45},"Core Concepts","\u002Fdocs\u002Fconcepts","1.docs\u002F2.concepts\u002F1.index",[43,46,51,56,61,66,71,76,81],{"title":44,"path":40,"stem":41,"icon":45},"Core concepts","i-lucide-book-open",{"title":47,"path":48,"stem":49,"icon":50},"Architecture","\u002Fdocs\u002Fconcepts\u002Farchitecture","1.docs\u002F2.concepts\u002F2.architecture","i-lucide-layers",{"title":52,"path":53,"stem":54,"icon":55},"Exactly-once semantics","\u002Fdocs\u002Fconcepts\u002Fexactly-once","1.docs\u002F2.concepts\u002F3.exactly-once","i-lucide-shield-check",{"title":57,"path":58,"stem":59,"icon":60},"Lanes and parallelism","\u002Fdocs\u002Fconcepts\u002Flanes-and-parallelism","1.docs\u002F2.concepts\u002F4.lanes-and-parallelism","i-lucide-split",{"title":62,"path":63,"stem":64,"icon":65},"State and thread-safety","\u002Fdocs\u002Fconcepts\u002Fstate-and-thread-safety","1.docs\u002F2.concepts\u002F5.state-and-thread-safety","i-lucide-lock",{"title":67,"path":68,"stem":69,"icon":70},"Event time and watermarks","\u002Fdocs\u002Fconcepts\u002Fevent-time-and-watermarks","1.docs\u002F2.concepts\u002F6.event-time-and-watermarks","i-lucide-clock",{"title":72,"path":73,"stem":74,"icon":75},"The configuration model","\u002Fdocs\u002Fconcepts\u002Fconfiguration-model","1.docs\u002F2.concepts\u002F7.configuration-model","i-lucide-sliders-horizontal",{"title":77,"path":78,"stem":79,"icon":80},"The error-handling model","\u002Fdocs\u002Fconcepts\u002Ferror-handling-model","1.docs\u002F2.concepts\u002F8.error-handling-model","i-lucide-triangle-alert",{"title":82,"path":83,"stem":84,"icon":85},"How StoatFlow differs from Kafka Streams","\u002Fdocs\u002Fconcepts\u002Fhow-stoatflow-differs-from-ks","1.docs\u002F2.concepts\u002F9.how-stoatflow-differs-from-ks","i-lucide-arrow-left-right",{"title":87,"path":88,"stem":89,"children":90,"icon":93},"Building Topologies","\u002Fdocs\u002Fbuilding","1.docs\u002F3.building\u002F1.index",[91,94,99,104,109,114,119,124,129,134,139,144],{"title":92,"path":88,"stem":89,"icon":93},"Building topologies","i-lucide-blocks",{"title":95,"path":96,"stem":97,"icon":98},"Error handling and DLQ","\u002Fdocs\u002Fbuilding\u002Ferror-handling-dlq","1.docs\u002F3.building\u002F10.error-handling-dlq","i-lucide-circle-x",{"title":100,"path":101,"stem":102,"icon":103},"State stores","\u002Fdocs\u002Fbuilding\u002Fstate-stores","1.docs\u002F3.building\u002F11.state-stores","i-lucide-database",{"title":105,"path":106,"stem":107,"icon":108},"Testing topologies","\u002Fdocs\u002Fbuilding\u002Ftesting","1.docs\u002F3.building\u002F12.testing","i-lucide-flask-conical",{"title":110,"path":111,"stem":112,"icon":113},"Sources and sinks","\u002Fdocs\u002Fbuilding\u002Fstreams-builder","1.docs\u002F3.building\u002F2.streams-builder","i-lucide-import",{"title":115,"path":116,"stem":117,"icon":118},"KStream and KTable operations","\u002Fdocs\u002Fbuilding\u002Fkstream-ktable","1.docs\u002F3.building\u002F3.kstream-ktable","i-lucide-waypoints",{"title":120,"path":121,"stem":122,"icon":123},"Aggregations","\u002Fdocs\u002Fbuilding\u002Faggregations","1.docs\u002F3.building\u002F4.aggregations","i-lucide-sigma",{"title":125,"path":126,"stem":127,"icon":128},"Windowing","\u002Fdocs\u002Fbuilding\u002Fwindowing","1.docs\u002F3.building\u002F5.windowing","i-lucide-calendar-clock",{"title":130,"path":131,"stem":132,"icon":133},"Joins","\u002Fdocs\u002Fbuilding\u002Fjoins","1.docs\u002F3.building\u002F6.joins","i-lucide-git-merge",{"title":135,"path":136,"stem":137,"icon":138},"The Processor API","\u002Fdocs\u002Fbuilding\u002Fprocessor-api","1.docs\u002F3.building\u002F7.processor-api","i-lucide-cpu",{"title":140,"path":141,"stem":142,"icon":143},"Scheduled sources","\u002Fdocs\u002Fbuilding\u002Fscheduled-sources","1.docs\u002F3.building\u002F8.scheduled-sources","i-lucide-timer",{"title":145,"path":146,"stem":147,"icon":148},"Serdes and Avro","\u002Fdocs\u002Fbuilding\u002Fserdes","1.docs\u002F3.building\u002F9.serdes","i-lucide-binary",{"title":150,"path":151,"stem":152,"children":153,"icon":75},"Configuration","\u002Fdocs\u002Fconfiguration","1.docs\u002F4.configuration\u002F1.index",[154,156,161,166,171],{"title":155,"path":151,"stem":152,"icon":75},"How configuration works",{"title":157,"path":158,"stem":159,"icon":160},"Engine configuration (:core)","\u002Fdocs\u002Fconfiguration\u002Fcore-config","1.docs\u002F4.configuration\u002F2.core-config","i-lucide-settings-2",{"title":162,"path":163,"stem":164,"icon":165},"Runtime configuration (:runtime)","\u002Fdocs\u002Fconfiguration\u002Fruntime-config","1.docs\u002F4.configuration\u002F3.runtime-config","i-lucide-server-cog",{"title":167,"path":168,"stem":169,"icon":170},"Defaults, adaptivity, and presets","\u002Fdocs\u002Fconfiguration\u002Fdefaults-and-presets","1.docs\u002F4.configuration\u002F4.defaults-and-presets","i-lucide-gauge",{"title":172,"path":173,"stem":174,"icon":175},"Kafka client configuration","\u002Fdocs\u002Fconfiguration\u002Fkafka-client-config","1.docs\u002F4.configuration\u002F5.kafka-client-config","i-lucide-plug",{"title":177,"path":178,"stem":179,"children":180,"icon":183},"Running in Production","\u002Fdocs\u002Fruntime","1.docs\u002F5.runtime\u002F1.index",[181,184,189,194,199,204,209,214],{"title":182,"path":178,"stem":179,"icon":183},"The runtime","i-lucide-server",{"title":185,"path":186,"stem":187,"icon":188},"The REST API","\u002Fdocs\u002Fruntime\u002Frest-api","1.docs\u002F5.runtime\u002F2.rest-api","i-lucide-globe",{"title":190,"path":191,"stem":192,"icon":193},"Health checks","\u002Fdocs\u002Fruntime\u002Fhealth-checks","1.docs\u002F5.runtime\u002F3.health-checks","i-lucide-heart-pulse",{"title":195,"path":196,"stem":197,"icon":198},"Metrics","\u002Fdocs\u002Fruntime\u002Fmetrics","1.docs\u002F5.runtime\u002F4.metrics","i-lucide-activity",{"title":200,"path":201,"stem":202,"icon":203},"Pause and resume","\u002Fdocs\u002Fruntime\u002Fpause-unpause","1.docs\u002F5.runtime\u002F5.pause-unpause","i-lucide-pause",{"title":205,"path":206,"stem":207,"icon":208},"Plugins and lifecycle hooks","\u002Fdocs\u002Fruntime\u002Fplugins","1.docs\u002F5.runtime\u002F6.plugins","i-lucide-puzzle",{"title":210,"path":211,"stem":212,"icon":213},"Docker images","\u002Fdocs\u002Fruntime\u002Fdocker","1.docs\u002F5.runtime\u002F7.docker","i-lucide-container",{"title":215,"path":216,"stem":217,"icon":218},"GraalVM native image","\u002Fdocs\u002Fruntime\u002Fnative-image","1.docs\u002F5.runtime\u002F8.native-image","i-lucide-zap",{"title":220,"path":221,"stem":222,"children":223,"icon":226},"Deploying & Operating","\u002Fdocs\u002Foperating","1.docs\u002F6.operating\u002F1.index",[224,227,232,237,242,247,252],{"title":225,"path":221,"stem":222,"icon":226},"Deploying and operating","i-lucide-life-buoy",{"title":228,"path":229,"stem":230,"icon":231},"Running on Kubernetes","\u002Fdocs\u002Foperating\u002Fkubernetes","1.docs\u002F6.operating\u002F2.kubernetes","i-lucide-ship",{"title":233,"path":234,"stem":235,"icon":236},"High availability","\u002Fdocs\u002Foperating\u002Fhigh-availability","1.docs\u002F6.operating\u002F3.high-availability","i-lucide-copy",{"title":238,"path":239,"stem":240,"icon":241},"Liveness and readiness probes","\u002Fdocs\u002Foperating\u002Fprobes","1.docs\u002F6.operating\u002F4.probes","i-lucide-stethoscope",{"title":243,"path":244,"stem":245,"icon":246},"Observability","\u002Fdocs\u002Foperating\u002Fobservability","1.docs\u002F6.operating\u002F5.observability","i-lucide-telescope",{"title":248,"path":249,"stem":250,"icon":251},"Tuning under load","\u002Fdocs\u002Foperating\u002Ftuning","1.docs\u002F6.operating\u002F6.tuning","i-lucide-sliders",{"title":253,"path":254,"stem":255,"icon":256},"Production checklist","\u002Fdocs\u002Foperating\u002Fproduction-checklist","1.docs\u002F6.operating\u002F7.production-checklist","i-lucide-clipboard-check",{"title":258,"path":259,"stem":260,"children":261,"icon":85},"Migrating from Kafka Streams","\u002Fdocs\u002Fmigration","1.docs\u002F7.migration\u002F1.index",[262,263,268],{"title":258,"path":259,"stem":260,"icon":85},{"title":264,"path":265,"stem":266,"icon":267},"Migration without carrying state","\u002Fdocs\u002Fmigration\u002Fwithout-data-migration","1.docs\u002F7.migration\u002F2.without-data-migration","i-lucide-sparkles",{"title":269,"path":270,"stem":271,"icon":272},"Migration carrying state","\u002Fdocs\u002Fmigration\u002Fwith-data-migration","1.docs\u002F7.migration\u002F3.with-data-migration","i-lucide-database-backup",{"title":274,"path":275,"stem":276,"children":277,"icon":279},"Reference","\u002Fdocs\u002Freference","1.docs\u002F8.reference\u002F1.index",[278,280,285,290,295,300,305,309],{"title":274,"path":275,"stem":276,"icon":279},"i-lucide-list",{"title":281,"path":282,"stem":283,"icon":284},"Configuration reference","\u002Fdocs\u002Freference\u002Fconfiguration-reference","1.docs\u002F8.reference\u002F2.configuration-reference","i-lucide-table",{"title":286,"path":287,"stem":288,"icon":289},"REST API reference","\u002Fdocs\u002Freference\u002Frest-api-reference","1.docs\u002F8.reference\u002F3.rest-api-reference","i-lucide-network",{"title":291,"path":292,"stem":293,"icon":294},"Gradle plugin reference","\u002Fdocs\u002Freference\u002Fgradle-plugin-reference","1.docs\u002F8.reference\u002F4.gradle-plugin-reference","i-lucide-box",{"title":296,"path":297,"stem":298,"icon":299},"Maven reference","\u002Fdocs\u002Freference\u002Fmaven-reference","1.docs\u002F8.reference\u002F5.maven-reference","i-simple-icons-apachemaven",{"title":301,"path":302,"stem":303,"icon":304},"Kafka Streams compatibility matrix","\u002Fdocs\u002Freference\u002Fks-compatibility-matrix","1.docs\u002F8.reference\u002F6.ks-compatibility-matrix","i-lucide-table-2",{"title":306,"path":307,"stem":308,"icon":170},"Metrics reference","\u002Fdocs\u002Freference\u002Fmetrics-reference","1.docs\u002F8.reference\u002F7.metrics-reference",{"title":310,"path":311,"stem":312,"icon":313},"Glossary","\u002Fdocs\u002Freference\u002Fglossary","1.docs\u002F8.reference\u002F8.glossary","i-lucide-book-a",{"id":315,"title":157,"body":316,"description":2414,"extension":2415,"meta":2416,"navigation":2417,"pageType":2418,"path":158,"seo":2419,"stem":159,"__hash__":2420},"docs\u002F1.docs\u002F4.configuration\u002F2.core-config.md",{"type":317,"value":318,"toc":2400},"minimark",[319,355,437,457,462,473,542,588,603,607,625,674,681,859,889,907,911,917,1010,1049,1053,1072,1232,1291,1306,1324,1340,1343,1346,1378,1415,1436,1442,1446,1454,1459,1638,1693,1697,1818,1856,1877,1881,1886,2031,2086,2101,2105,2111,2342,2346,2396],[320,321,322,323,327,328,331,332,335,336,339,340,343,344,346,347,350,351,354],"p",{},"These are the ",[324,325,326],"code",{},":core"," engine settings — the stream-processing knobs that exist whether you embed ",[324,329,330],{},"stoatflow-core"," directly or run on the batteries-included ",[324,333,334],{},"stoatflow-runtime",". On the runtime they live under the ",[324,337,338],{},"stoatflow:"," block of ",[324,341,342],{},"application.yaml","; in plain ",[324,345,326],{}," code you set the same values on ",[324,348,349],{},"StreamsConfig"," (or its ",[324,352,353],{},"Builder","). This page groups the ones you'll actually reach for, with their defaults.",[356,357,358],"tldr-panel",{},[359,360,361,381,399,411,428],"ul",{},[362,363,364,368,369,372,373,376,377,380],"li",{},[365,366,367],"strong",{},"Required:"," ",[324,370,371],{},"application-id"," (consumer group + transactional id) is the only mandatory key. ",[324,374,375],{},"bootstrap-servers"," defaults to ",[324,378,379],{},"localhost:9092"," — you'll almost always override it.",[362,382,383,386,387,390,391,394,395,398],{},[365,384,385],{},"Cadence:"," the commit barrier self-tunes between ",[324,388,389],{},"commit-barrier.min-interval-ms"," and ",[324,392,393],{},"max-interval-ms",", seeded by ",[324,396,397],{},"interval-ms",".",[362,400,401,368,404,376,407,410],{},[365,402,403],{},"Parallelism:",[324,405,406],{},"lanes.count",[324,408,409],{},"max(2, CPU cores)","; raise it for per-key parallelism.",[362,412,413,368,416,419,420,423,424,427],{},[365,414,415],{},"Guarantee:",[324,417,418],{},"processing-guarantee"," is ",[324,421,422],{},"EXACTLY_ONCE"," by default; switch to ",[324,425,426],{},"AT_LEAST_ONCE"," for lower commit latency.",[362,429,430,433,434,398],{},[365,431,432],{},"Full key list:"," the exhaustive reference is ",[435,436,281],"a",{"href":282},[438,439,442],"callout",{"color":440,"icon":441},"info","i-lucide-info",[320,443,444,445,447,448,450,451,390,454,398],{},"This page covers the settings most apps touch. Many more ",[324,446,326],{}," knobs exist (dispatch tuning, restoration sizing, RocksDB presets, FK-join, caching, hot-standby HA). For every key with its type and bounds, see ",[435,449,281],{"href":282},". For the layered merge model behind YAML overrides and Kafka client passthrough, see ",[435,452,453],{"href":73},"Configuration model",[435,455,456],{"href":173},"Kafka client config",[458,459,461],"h2",{"id":460},"identity-and-connection","Identity and connection",[320,463,464,465,467,468,376,470,472],{},"Only ",[324,466,371],{}," is required — it has no default, so the engine won't start without it. ",[324,469,375],{},[324,471,379],{},", which is fine for local development but you'll set it explicitly for any real broker.",[474,475,476,497],"table",{},[477,478,479],"thead",{},[480,481,482,486,491,494],"tr",{},[483,484,485],"th",{},"YAML key",[483,487,488,490],{},[324,489,349],{}," field",[483,492,493],{},"Default",[483,495,496],{},"Notes",[498,499,500,523],"tbody",{},[480,501,502,508,513,516],{},[503,504,505],"td",{},[324,506,507],{},"stoatflow.application-id",[503,509,510],{},[324,511,512],{},"applicationId",[503,514,515],{},"— (required)",[503,517,518,519,522],{},"Used for the consumer group ",[365,520,521],{},"and"," the transactional id. Pick a stable value; changing it starts a fresh consumer group.",[480,524,525,530,535,539],{},[503,526,527],{},[324,528,529],{},"stoatflow.bootstrap-servers",[503,531,532],{},[324,533,534],{},"bootstrapServers",[503,536,537],{},[324,538,379],{},[503,540,541],{},"Comma-separated broker list. Override for any non-local broker.",[543,544,549],"pre",{"className":545,"code":546,"language":547,"meta":548,"style":548},"language-yaml shiki shiki-themes vitesse-light","stoatflow:\n  application-id: order-processor\n  bootstrap-servers: kafka-1:9092,kafka-2:9092,kafka-3:9092\n","yaml","",[324,550,551,564,577],{"__ignoreMap":548},[552,553,556,560],"span",{"class":554,"line":555},"line",1,[552,557,559],{"class":558},"su6XF","stoatflow",[552,561,563],{"class":562},"sYZai",":\n",[552,565,567,570,573],{"class":554,"line":566},2,[552,568,569],{"class":558},"  application-id",[552,571,572],{"class":562},":",[552,574,576],{"class":575},"spphp"," order-processor\n",[552,578,580,583,585],{"class":554,"line":579},3,[552,581,582],{"class":558},"  bootstrap-servers",[552,584,572],{"class":562},[552,586,587],{"class":575}," kafka-1:9092,kafka-2:9092,kafka-3:9092\n",[438,589,590],{"color":440,"icon":441},[320,591,592,593,595,596,599,600,398],{},"StoatFlow is single-instance — exactly one process owns all partitions. Startup validates complete partition assignment and (optionally) checks for other live group members. See ",[435,594,57],{"href":58}," and the ",[324,597,598],{},"validation.*"," block in the ",[435,601,602],{"href":282},"reference",[458,604,606],{"id":605},"default-serdes","Default serdes",[320,608,609,610,613,614,613,617,620,621,624],{},"When an operator doesn't specify a serde via ",[324,611,612],{},"Consumed",", ",[324,615,616],{},"Produced",[324,618,619],{},"Materialized",", etc., these defaults apply. Both default to ",[324,622,623],{},"ByteArray"," — set them to the type your topology mostly uses.",[474,626,627,639],{},[477,628,629],{},[480,630,631,633,637],{},[483,632,485],{},[483,634,635,490],{},[324,636,349],{},[483,638,493],{},[498,640,641,658],{},[480,642,643,648,653],{},[503,644,645],{},[324,646,647],{},"stoatflow.default-key-serde",[503,649,650],{},[324,651,652],{},"defaultKeySerde",[503,654,655],{},[324,656,657],{},"Serdes.ByteArray()",[480,659,660,665,670],{},[503,661,662],{},[324,663,664],{},"stoatflow.default-value-serde",[503,666,667],{},[324,668,669],{},"defaultValueSerde",[503,671,672],{},[324,673,657],{},[320,675,676,677,680],{},"In YAML the values are fully qualified serde class names; in code you pass ",[324,678,679],{},"Serde"," instances:",[682,683,685,766],"code-tabs",{"group":684},"lang",[543,686,691],{"className":687,"code":688,"filename":689,"language":690,"meta":548,"style":548},"language-kotlin shiki shiki-themes vitesse-light","val config = StreamsConfig.builder(\"order-processor\", \"localhost:9092\")\n    .defaultKeySerde(Serdes.String())\n    .defaultValueSerde(Serdes.String())\n    .build()\n","Kotlin","kotlin",[324,692,693,727,743,755],{"__ignoreMap":548},[552,694,695,699,703,706,709,713,716,719,721,724],{"class":554,"line":555},[552,696,698],{"class":697},"sbBg2","val",[552,700,702],{"class":701},"suHK_"," config ",[552,704,705],{"class":562},"=",[552,707,708],{"class":701}," StreamsConfig.",[552,710,712],{"class":711},"sySUi","builder",[552,714,715],{"class":701},"(",[552,717,718],{"class":575},"\"order-processor\"",[552,720,613],{"class":701},[552,722,723],{"class":575},"\"localhost:9092\"",[552,725,726],{"class":701},")\n",[552,728,729,732,734,737,740],{"class":554,"line":566},[552,730,731],{"class":701},"    .",[552,733,652],{"class":711},[552,735,736],{"class":701},"(Serdes.",[552,738,739],{"class":711},"String",[552,741,742],{"class":701},"())\n",[552,744,745,747,749,751,753],{"class":554,"line":579},[552,746,731],{"class":701},[552,748,669],{"class":711},[552,750,736],{"class":701},[552,752,739],{"class":711},[552,754,742],{"class":701},[552,756,758,760,763],{"class":554,"line":757},4,[552,759,731],{"class":701},[552,761,762],{"class":711},"build",[552,764,765],{"class":701},"()\n",[543,767,772],{"className":768,"code":769,"filename":770,"language":771,"meta":548,"style":548},"language-java shiki shiki-themes vitesse-light","var config = StreamsConfig.builder(\"order-processor\", \"localhost:9092\")\n    .defaultKeySerde(Serdes.String())\n    .defaultValueSerde(Serdes.String())\n    .build();\n","Java","java",[324,773,774,817,834,850],{"__ignoreMap":548},[552,775,776,780,784,787,790,792,794,796,800,803,805,808,811,813,815],{"class":554,"line":555},[552,777,779],{"class":778},"si04Y","var",[552,781,783],{"class":782},"svycV"," config",[552,785,786],{"class":562}," =",[552,788,789],{"class":782}," StreamsConfig",[552,791,398],{"class":562},[552,793,712],{"class":711},[552,795,715],{"class":562},[552,797,799],{"class":798},"sSP4y","\"",[552,801,802],{"class":575},"order-processor",[552,804,799],{"class":798},[552,806,807],{"class":562},",",[552,809,810],{"class":798}," \"",[552,812,379],{"class":575},[552,814,799],{"class":798},[552,816,726],{"class":562},[552,818,819,821,823,825,828,830,832],{"class":554,"line":566},[552,820,731],{"class":562},[552,822,652],{"class":711},[552,824,715],{"class":562},[552,826,827],{"class":782},"Serdes",[552,829,398],{"class":562},[552,831,739],{"class":711},[552,833,742],{"class":562},[552,835,836,838,840,842,844,846,848],{"class":554,"line":579},[552,837,731],{"class":562},[552,839,669],{"class":711},[552,841,715],{"class":562},[552,843,827],{"class":782},[552,845,398],{"class":562},[552,847,739],{"class":711},[552,849,742],{"class":562},[552,851,852,854,856],{"class":554,"line":757},[552,853,731],{"class":562},[552,855,762],{"class":711},[552,857,858],{"class":562},"();\n",[543,860,862],{"className":545,"code":861,"language":547,"meta":548,"style":548},"stoatflow:\n  default-key-serde: org.apache.kafka.common.serialization.Serdes$StringSerde\n  default-value-serde: org.apache.kafka.common.serialization.Serdes$StringSerde\n",[324,863,864,870,880],{"__ignoreMap":548},[552,865,866,868],{"class":554,"line":555},[552,867,559],{"class":558},[552,869,563],{"class":562},[552,871,872,875,877],{"class":554,"line":566},[552,873,874],{"class":558},"  default-key-serde",[552,876,572],{"class":562},[552,878,879],{"class":575}," org.apache.kafka.common.serialization.Serdes$StringSerde\n",[552,881,882,885,887],{"class":554,"line":579},[552,883,884],{"class":558},"  default-value-serde",[552,886,572],{"class":562},[552,888,879],{"class":575},[438,890,891],{"color":440,"icon":441},[320,892,893,894,897,898,900,901,904,905,398],{},"On the runtime, the cleaner way to set typed default serdes is ",[324,895,896],{},"streamsConfigOverrides { ... }"," in code — see ",[435,899,28],{"href":29},". Using Schema Registry serdes? Set ",[324,902,903],{},"stoatflow.schema-registry-url","; it's propagated to default serdes automatically. More in ",[435,906,827],{"href":146},[458,908,910],{"id":909},"lanes-parallelism","Lanes (parallelism)",[320,912,913,914,916],{},"Lanes are the engine's virtual partitions — records with the same key always route to the same lane, preserving per-key order while running many keys in parallel. See ",[435,915,57],{"href":58}," for the why.",[474,918,919,933],{},[477,920,921],{},[480,922,923,925,929,931],{},[483,924,485],{},[483,926,927,490],{},[324,928,349],{},[483,930,493],{},[483,932,496],{},[498,934,935,957,977],{},[480,936,937,942,947,951],{},[503,938,939],{},[324,940,941],{},"stoatflow.lanes.count",[503,943,944],{},[324,945,946],{},"numLanes",[503,948,949],{},[324,950,409],{},[503,952,953,954,398],{},"More lanes = more per-key parallelism, at the cost of more queues. Start at the default; I\u002FO-bound workloads commonly go 4×–8× cores — see ",[435,955,956],{"href":249},"Tuning",[480,958,959,964,969,974],{},[503,960,961],{},[324,962,963],{},"stoatflow.lanes.queue-capacity",[503,965,966],{},[324,967,968],{},"laneQueueCapacity",[503,970,971],{},[324,972,973],{},"300",[503,975,976],{},"Per-lane queue depth (backpressure). Minimum 32.",[480,978,979,984,989,994],{},[503,980,981],{},[324,982,983],{},"stoatflow.lanes.thread-type",[503,985,986],{},[324,987,988],{},"laneThreadType",[503,990,991],{},[324,992,993],{},"VIRTUAL",[503,995,996,998,999,1002,1003,1005,1006,1009],{},[324,997,993],{}," (Project Loom) or ",[324,1000,1001],{},"PLATFORM"," (OS threads). Keep ",[324,1004,993],{}," unless you've switched the RocksDB backend to ",[324,1007,1008],{},"JNI"," and pinning is a concern.",[543,1011,1013],{"className":545,"code":1012,"language":547,"meta":548,"style":548},"stoatflow:\n  lanes:\n    count: 32\n    queue-capacity: 500\n",[324,1014,1015,1021,1028,1039],{"__ignoreMap":548},[552,1016,1017,1019],{"class":554,"line":555},[552,1018,559],{"class":558},[552,1020,563],{"class":562},[552,1022,1023,1026],{"class":554,"line":566},[552,1024,1025],{"class":558},"  lanes",[552,1027,563],{"class":562},[552,1029,1030,1033,1035],{"class":554,"line":579},[552,1031,1032],{"class":558},"    count",[552,1034,572],{"class":562},[552,1036,1038],{"class":1037},"s-TwI"," 32\n",[552,1040,1041,1044,1046],{"class":554,"line":757},[552,1042,1043],{"class":558},"    queue-capacity",[552,1045,572],{"class":562},[552,1047,1048],{"class":1037}," 500\n",[458,1050,1052],{"id":1051},"commit-barrier-cadence","Commit-barrier cadence",[320,1054,1055,1056,1059,1060,1062,1063,390,1066,1068,1069,1071],{},"The commit barrier is what makes StoatFlow exactly-once: when a barrier flows through the topology, state flushes and the Kafka transaction commits as one atomic unit. The cadence ",[365,1057,1058],{},"self-tunes"," at runtime within the bounds you set — ",[324,1061,397],{}," is the seed, and the engine adapts between ",[324,1064,1065],{},"min-interval-ms",[324,1067,393],{},". You set the envelope, not the algorithm; how the engine schedules within it is an implementation concern (see ",[435,1070,47],{"href":48},").",[474,1073,1074,1088],{},[477,1075,1076],{},[480,1077,1078,1080,1084,1086],{},[483,1079,485],{},[483,1081,1082,490],{},[324,1083,349],{},[483,1085,493],{},[483,1087,496],{},[498,1089,1090,1110,1130,1150,1178,1214],{},[480,1091,1092,1097,1102,1107],{},[503,1093,1094],{},[324,1095,1096],{},"stoatflow.commit-barrier.interval-ms",[503,1098,1099],{},[324,1100,1101],{},"barrierIntervalMs",[503,1103,1104],{},[324,1105,1106],{},"500",[503,1108,1109],{},"Seed interval. The runtime adjusts from here.",[480,1111,1112,1117,1122,1127],{},[503,1113,1114],{},[324,1115,1116],{},"stoatflow.commit-barrier.min-interval-ms",[503,1118,1119],{},[324,1120,1121],{},"barrierMinIntervalMs",[503,1123,1124],{},[324,1125,1126],{},"150",[503,1128,1129],{},"Floor on barrier-to-barrier time.",[480,1131,1132,1137,1142,1147],{},[503,1133,1134],{},[324,1135,1136],{},"stoatflow.commit-barrier.max-interval-ms",[503,1138,1139],{},[324,1140,1141],{},"barrierMaxIntervalMs",[503,1143,1144],{},[324,1145,1146],{},"5000",[503,1148,1149],{},"Ceiling on barrier-to-barrier time.",[480,1151,1152,1157,1162,1167],{},[503,1153,1154],{},[324,1155,1156],{},"stoatflow.commit-barrier.interval-factor",[503,1158,1159],{},[324,1160,1161],{},"barrierIntervalFactor",[503,1163,1164],{},[324,1165,1166],{},"1.5",[503,1168,1169,1170,1173,1174,1177],{},"Multiplier applied to recent commit duration when spacing barriers, clamped to ",[324,1171,1172],{},"[min, max]"," (",[324,1175,1176],{},">= 1.0","). Rarely changed.",[480,1179,1180,1185,1190,1195],{},[503,1181,1182],{},[324,1183,1184],{},"stoatflow.commit-barrier.timeout-ms",[503,1186,1187],{},[324,1188,1189],{},"barrierTimeoutMs",[503,1191,1192],{},[324,1193,1194],{},"60000",[503,1196,1197,1198,368,1201,1203,1204,613,1207,1210,1211,398],{},"Bounds the commit path. Must be ",[365,1199,1200],{},"greater than",[324,1202,397],{},". Also cascades to the Kafka producer's ",[324,1205,1206],{},"transaction.timeout.ms",[324,1208,1209],{},"max.block.ms",", and ",[324,1212,1213],{},"delivery.timeout.ms",[480,1215,1216,1221,1226,1229],{},[503,1217,1218],{},[324,1219,1220],{},"stoatflow.commit-barrier.max-epoch-records",[503,1222,1223],{},[324,1224,1225],{},"barrierMaxEpochRecords",[503,1227,1228],{},"unset (no hard cap)",[503,1230,1231],{},"Optional hard cap on records committed per barrier. Leave unset unless you need a strict bound.",[543,1233,1235],{"className":545,"code":1234,"language":547,"meta":548,"style":548},"stoatflow:\n  commit-barrier:\n    interval-ms: 500\n    min-interval-ms: 150\n    max-interval-ms: 5000\n    timeout-ms: 60000\n",[324,1236,1237,1243,1250,1259,1269,1280],{"__ignoreMap":548},[552,1238,1239,1241],{"class":554,"line":555},[552,1240,559],{"class":558},[552,1242,563],{"class":562},[552,1244,1245,1248],{"class":554,"line":566},[552,1246,1247],{"class":558},"  commit-barrier",[552,1249,563],{"class":562},[552,1251,1252,1255,1257],{"class":554,"line":579},[552,1253,1254],{"class":558},"    interval-ms",[552,1256,572],{"class":562},[552,1258,1048],{"class":1037},[552,1260,1261,1264,1266],{"class":554,"line":757},[552,1262,1263],{"class":558},"    min-interval-ms",[552,1265,572],{"class":562},[552,1267,1268],{"class":1037}," 150\n",[552,1270,1272,1275,1277],{"class":554,"line":1271},5,[552,1273,1274],{"class":558},"    max-interval-ms",[552,1276,572],{"class":562},[552,1278,1279],{"class":1037}," 5000\n",[552,1281,1283,1286,1288],{"class":554,"line":1282},6,[552,1284,1285],{"class":558},"    timeout-ms",[552,1287,572],{"class":562},[552,1289,1290],{"class":1037}," 60000\n",[438,1292,1293],{"color":440,"icon":170},[320,1294,1295,1298,1299,390,1301,1303,1304,398],{},[365,1296,1297],{},"Tighter latency vs. lower overhead."," Lowering ",[324,1300,1065],{},[324,1302,393],{}," commits more often (lower end-to-end latency, more transaction overhead). Raising them batches more work per commit (higher throughput, higher tail latency). The defaults are a balanced starting point — tune from observed commit duration. See ",[435,1305,956],{"href":249},[438,1307,1310],{"color":1308,"icon":1309},"warning","i-lucide-shield-alert",[320,1311,1312,1313,1316,1317,1319,1320,1323],{},"A stalled commit is not silent: if a barrier can't complete within ",[324,1314,1315],{},"timeout-ms",", the commit aborts and the process restarts cleanly. On restart, state recovers to the last committed barrier — no loss, no duplication under exactly-once. The barrier scheduling cadence and the commit protocol's internals are engine concerns; see ",[435,1318,47],{"href":48}," for the boundary, and ",[435,1321,1322],{"href":53},"Exactly-once"," for the guarantee.",[320,1325,1326,1327,1330,1331,613,1334,1337,1338,398],{},"There are several finer self-tuning knobs under ",[324,1328,1329],{},"commit-barrier.*"," (e.g. ",[324,1332,1333],{},"commit-duration-ema-alpha",[324,1335,1336],{},"initial-max-epoch-records","). They have sensible defaults and rarely need changing — the full list is in the ",[435,1339,602],{"href":282},[458,1341,1342],{"id":418},"Processing guarantee",[320,1344,1345],{},"Controls the commit protocol. Both modes use barriers for state-flush and offset-commit synchronization; the difference is the transaction boundary.",[474,1347,1348,1360],{},[477,1349,1350],{},[480,1351,1352,1354,1358],{},[483,1353,485],{},[483,1355,1356,490],{},[324,1357,349],{},[483,1359,493],{},[498,1361,1362],{},[480,1363,1364,1369,1374],{},[503,1365,1366],{},[324,1367,1368],{},"stoatflow.processing-guarantee",[503,1370,1371],{},[324,1372,1373],{},"processingGuarantee",[503,1375,1376],{},[324,1377,422],{},[474,1379,1380,1390],{},[477,1381,1382],{},[480,1383,1384,1387],{},[483,1385,1386],{},"Value",[483,1388,1389],{},"Behaviour",[498,1391,1392,1402],{},[480,1393,1394,1399],{},[503,1395,1396,1398],{},[324,1397,422],{}," (default)",[503,1400,1401],{},"Kafka transactions commit output, changelog, and consumer offsets atomically. No duplicates or loss on crash recovery. Higher per-commit cost.",[480,1403,1404,1408],{},[503,1405,1406],{},[324,1407,426],{},[503,1409,1410,1411,1414],{},"Non-transactional producer with ",[324,1412,1413],{},"consumer.commitSync()",". Lower commit latency. Output records may be duplicated on crash recovery; windowed aggregations may over-count.",[543,1416,1418],{"className":545,"code":1417,"language":547,"meta":548,"style":548},"stoatflow:\n  processing-guarantee: EXACTLY_ONCE\n",[324,1419,1420,1426],{"__ignoreMap":548},[552,1421,1422,1424],{"class":554,"line":555},[552,1423,559],{"class":558},[552,1425,563],{"class":562},[552,1427,1428,1431,1433],{"class":554,"line":566},[552,1429,1430],{"class":558},"  processing-guarantee",[552,1432,572],{"class":562},[552,1434,1435],{"class":575}," EXACTLY_ONCE\n",[320,1437,1438,1439,1441],{},"See ",[435,1440,1322],{"href":53}," for the full semantics and the at-least-once recovery contract.",[458,1443,1445],{"id":1444},"state-and-changelog","State and changelog",[320,1447,1448,1449,390,1451,398],{},"State stores are RocksDB-backed by default and durably backed by Kafka changelog topics, so state survives restarts. See ",[435,1450,100],{"href":101},[435,1452,1453],{"href":63},"State and thread safety",[1455,1456,1458],"h3",{"id":1457},"state-directory-and-memory","State directory and memory",[474,1460,1461,1475],{},[477,1462,1463],{},[480,1464,1465,1467,1471,1473],{},[483,1466,485],{},[483,1468,1469,490],{},[324,1470,349],{},[483,1472,493],{},[483,1474,496],{},[498,1476,1477,1497,1518,1549,1573,1603],{},[480,1478,1479,1484,1489,1494],{},[503,1480,1481],{},[324,1482,1483],{},"stoatflow.state.dir",[503,1485,1486],{},[324,1487,1488],{},"stateDir",[503,1490,1491],{},[324,1492,1493],{},"${java.io.tmpdir}\u002Fstoatflow",[503,1495,1496],{},"Put this on fast local storage (SSD). In Kubernetes, mount a PV — the default temp dir is wiped on pod restart, forcing full restoration.",[480,1498,1499,1504,1509,1515],{},[503,1500,1501],{},[324,1502,1503],{},"stoatflow.state.uncommitted-max-bytes",[503,1505,1506],{},[324,1507,1508],{},"stateStoreUncommittedMaxBytes",[503,1510,1511,1514],{},[324,1512,1513],{},"268435456"," (256 MB)",[503,1516,1517],{},"Global cap on buffered uncommitted state; exceeding it triggers an early barrier.",[480,1519,1520,1525,1530,1535],{},[503,1521,1522],{},[324,1523,1524],{},"stoatflow.state.segment-checkpoint-records",[503,1526,1527],{},[324,1528,1529],{},"segmentCheckpointRecords",[503,1531,1532],{},[324,1533,1534],{},"100000",[503,1536,1537,1538,1541,1542,1545,1546,398],{},"Periodic checkpoint cadence (record count) for segmented window\u002Fsession stores, which run WAL-off and would otherwise be durable only on ",[324,1539,1540],{},"close()",". Bounds how much changelog an ungraceful restart — or a ",[435,1543,1544],{"href":234},"hot-standby"," promotion — re-applies. Whichever-first with ",[324,1547,1548],{},"segment-checkpoint-ms",[480,1550,1551,1556,1561,1567],{},[503,1552,1553],{},[324,1554,1555],{},"stoatflow.state.segment-checkpoint-ms",[503,1557,1558],{},[324,1559,1560],{},"segmentCheckpointMs",[503,1562,1563,1566],{},[324,1564,1565],{},"30000"," (30 s)",[503,1568,1569,1570,398],{},"The same checkpoint cadence by wall-clock time; whichever-first with ",[324,1571,1572],{},"segment-checkpoint-records",[480,1574,1575,1580,1585,1590],{},[503,1576,1577],{},[324,1578,1579],{},"stoatflow.rocks-db.preset",[503,1581,1582],{},[324,1583,1584],{},"rocksDbConfig",[503,1586,1587,1514],{},[324,1588,1589],{},"DEFAULT",[503,1591,1592,1594,1595,1598,1599,1602],{},[324,1593,1589],{}," \u002F ",[324,1596,1597],{},"LOW_MEMORY"," (64 MB) \u002F ",[324,1600,1601],{},"HIGH_PERFORMANCE"," (1 GB) total RocksDB memory.",[480,1604,1605,1610,1615,1620],{},[503,1606,1607],{},[324,1608,1609],{},"stoatflow.rocks-db.backend",[503,1611,1612],{},[324,1613,1614],{},"rocksDbBackendType",[503,1616,1617],{},[324,1618,1619],{},"AUTO",[503,1621,1622,1624,1625,1628,1629,1631,1632,1634,1635,1637],{},[324,1623,1619],{}," picks ",[324,1626,1627],{},"FFM"," (Foreign Function & Memory — no virtual-thread pinning) on the JVM and ",[324,1630,1008],{}," under a native image; set ",[324,1633,1627],{}," or ",[324,1636,1008],{}," to force one.",[543,1639,1641],{"className":545,"code":1640,"language":547,"meta":548,"style":548},"stoatflow:\n  state:\n    dir: \u002Fvar\u002Flib\u002Fstoatflow\u002Fstate\n    uncommitted-max-bytes: 268435456\n  rocks-db:\n    preset: DEFAULT\n",[324,1642,1643,1649,1656,1666,1676,1683],{"__ignoreMap":548},[552,1644,1645,1647],{"class":554,"line":555},[552,1646,559],{"class":558},[552,1648,563],{"class":562},[552,1650,1651,1654],{"class":554,"line":566},[552,1652,1653],{"class":558},"  state",[552,1655,563],{"class":562},[552,1657,1658,1661,1663],{"class":554,"line":579},[552,1659,1660],{"class":558},"    dir",[552,1662,572],{"class":562},[552,1664,1665],{"class":575}," \u002Fvar\u002Flib\u002Fstoatflow\u002Fstate\n",[552,1667,1668,1671,1673],{"class":554,"line":757},[552,1669,1670],{"class":558},"    uncommitted-max-bytes",[552,1672,572],{"class":562},[552,1674,1675],{"class":1037}," 268435456\n",[552,1677,1678,1681],{"class":554,"line":1271},[552,1679,1680],{"class":558},"  rocks-db",[552,1682,563],{"class":562},[552,1684,1685,1688,1690],{"class":554,"line":1282},[552,1686,1687],{"class":558},"    preset",[552,1689,572],{"class":562},[552,1691,1692],{"class":575}," DEFAULT\n",[1455,1694,1696],{"id":1695},"changelog-topics","Changelog topics",[474,1698,1699,1713],{},[477,1700,1701],{},[480,1702,1703,1705,1709,1711],{},[483,1704,485],{},[483,1706,1707,490],{},[324,1708,349],{},[483,1710,493],{},[483,1712,496],{},[498,1714,1715,1735,1754,1779,1799],{},[480,1716,1717,1722,1727,1732],{},[503,1718,1719],{},[324,1720,1721],{},"stoatflow.changelog.enabled",[503,1723,1724],{},[324,1725,1726],{},"changelogEnabled",[503,1728,1729],{},[324,1730,1731],{},"true",[503,1733,1734],{},"When on, state mutations are written to changelog topics inside the same transaction.",[480,1736,1737,1742,1747,1751],{},[503,1738,1739],{},[324,1740,1741],{},"stoatflow.changelog.create-topics-if-not-exist",[503,1743,1744],{},[324,1745,1746],{},"createChangelogTopicsIfNotExist",[503,1748,1749],{},[324,1750,1731],{},[503,1752,1753],{},"Auto-creates compacted changelog topics on startup.",[480,1755,1756,1761,1766,1772],{},[503,1757,1758],{},[324,1759,1760],{},"stoatflow.changelog.replication-factor",[503,1762,1763],{},[324,1764,1765],{},"changelogReplicationFactor",[503,1767,1768,1771],{},[324,1769,1770],{},"-1"," (broker default)",[503,1773,1774,1775,1778],{},"Set explicitly (e.g. ",[324,1776,1777],{},"3",") for production durability.",[480,1780,1781,1786,1791,1796],{},[503,1782,1783],{},[324,1784,1785],{},"stoatflow.changelog.num-partitions",[503,1787,1788],{},[324,1789,1790],{},"changelogNumPartitions",[503,1792,1793],{},[324,1794,1795],{},"1",[503,1797,1798],{},"One partition is usually sufficient for single-instance.",[480,1800,1801,1806,1811,1815],{},[503,1802,1803],{},[324,1804,1805],{},"stoatflow.state.restoration-enabled",[503,1807,1808],{},[324,1809,1810],{},"stateRestorationEnabled",[503,1812,1813],{},[324,1814,1731],{},[503,1816,1817],{},"Restore state from changelog on startup when local state is missing.",[543,1819,1821],{"className":545,"code":1820,"language":547,"meta":548,"style":548},"stoatflow:\n  changelog:\n    enabled: true\n    replication-factor: 3\n",[324,1822,1823,1829,1836,1846],{"__ignoreMap":548},[552,1824,1825,1827],{"class":554,"line":555},[552,1826,559],{"class":558},[552,1828,563],{"class":562},[552,1830,1831,1834],{"class":554,"line":566},[552,1832,1833],{"class":558},"  changelog",[552,1835,563],{"class":562},[552,1837,1838,1841,1843],{"class":554,"line":579},[552,1839,1840],{"class":558},"    enabled",[552,1842,572],{"class":562},[552,1844,1845],{"class":697}," true\n",[552,1847,1848,1851,1853],{"class":554,"line":757},[552,1849,1850],{"class":558},"    replication-factor",[552,1852,572],{"class":562},[552,1854,1855],{"class":1037}," 3\n",[438,1857,1858],{"color":1308,"icon":103},[320,1859,1860,1861,1864,1865,1867,1868,1871,1872,595,1875,398],{},"For production, set ",[324,1862,1863],{},"changelog.replication-factor"," to at least ",[324,1866,1777],{}," and put ",[324,1869,1870],{},"state.dir"," on a persistent volume — together they keep restoration fast (delta, not full) across pod restarts. See ",[435,1873,1874],{"href":229},"Kubernetes",[435,1876,253],{"href":254},[458,1878,1880],{"id":1879},"event-time-and-watermarks","Event-time and watermarks",[320,1882,1883,1884,398],{},"Watermarks track event-time progress for windowing, late-record handling, and event-time timers. The engine auto-detects whether your topology needs event-time tracking and bypasses it on the hot path when it doesn't. See ",[435,1885,67],{"href":68},[474,1887,1888,1902],{},[477,1889,1890],{},[480,1891,1892,1894,1898,1900],{},[483,1893,485],{},[483,1895,1896,490],{},[324,1897,349],{},[483,1899,493],{},[483,1901,496],{},[498,1903,1904,1925,1950,1970,1999],{},[480,1905,1906,1911,1916,1922],{},[503,1907,1908],{},[324,1909,1910],{},"stoatflow.watermark.max-out-of-orderness-ms",[503,1912,1913],{},[324,1914,1915],{},"maxOutOfOrderness",[503,1917,1918,1921],{},[324,1919,1920],{},"10000"," (10 s)",[503,1923,1924],{},"How far out of order events may arrive before being treated as late.",[480,1926,1927,1932,1937,1943],{},[503,1928,1929],{},[324,1930,1931],{},"stoatflow.watermark.idleness-timeout-ms",[503,1933,1934],{},[324,1935,1936],{},"watermarkIdlenessTimeout",[503,1938,1939,1942],{},[324,1940,1941],{},"300000"," (5 min)",[503,1944,1945,1946,1949],{},"Partitions idle this long are excluded from the global watermark. ",[324,1947,1948],{},"0"," disables.",[480,1951,1952,1957,1962,1967],{},[503,1953,1954],{},[324,1955,1956],{},"stoatflow.watermark.auto-interval-ms",[503,1958,1959],{},[324,1960,1961],{},"autoWatermarkIntervalMs",[503,1963,1964],{},[324,1965,1966],{},"200",[503,1968,1969],{},"Periodic watermark emission interval.",[480,1971,1972,1977,1982,1986],{},[503,1973,1974],{},[324,1975,1976],{},"stoatflow.processing.timestamp-coordination-mode",[503,1978,1979],{},[324,1980,1981],{},"timestampCoordinationMode",[503,1983,1984],{},[324,1985,1619],{},[503,1987,1988,1990,1991,1994,1995,1998],{},[324,1989,1619],{}," (derive from topology), ",[324,1992,1993],{},"ENABLED"," (force on), ",[324,1996,1997],{},"DISABLED"," (force off, benchmarking).",[480,2000,2001,2006,2011,2015],{},[503,2002,2003],{},[324,2004,2005],{},"stoatflow.processing.max-task-idle-ms",[503,2007,2008],{},[324,2009,2010],{},"maxTaskIdleMs",[503,2012,2013],{},[324,2014,1948],{},[503,2016,2017,2018,2020,2021,2023,2024,2027,2028,398],{},"Cross-partition timestamp-ordering wait. ",[324,2019,1770],{}," disables (max throughput); ",[324,2022,1948],{}," waits only while the broker has data; ",[324,2025,2026],{},">0"," adds extra wait. Mirrors KS ",[324,2029,2030],{},"max.task.idle.ms",[543,2032,2034],{"className":545,"code":2033,"language":547,"meta":548,"style":548},"stoatflow:\n  watermark:\n    max-out-of-orderness-ms: 10000\n    idleness-timeout-ms: 300000\n  processing:\n    timestamp-coordination-mode: AUTO\n",[324,2035,2036,2042,2049,2059,2069,2076],{"__ignoreMap":548},[552,2037,2038,2040],{"class":554,"line":555},[552,2039,559],{"class":558},[552,2041,563],{"class":562},[552,2043,2044,2047],{"class":554,"line":566},[552,2045,2046],{"class":558},"  watermark",[552,2048,563],{"class":562},[552,2050,2051,2054,2056],{"class":554,"line":579},[552,2052,2053],{"class":558},"    max-out-of-orderness-ms",[552,2055,572],{"class":562},[552,2057,2058],{"class":1037}," 10000\n",[552,2060,2061,2064,2066],{"class":554,"line":757},[552,2062,2063],{"class":558},"    idleness-timeout-ms",[552,2065,572],{"class":562},[552,2067,2068],{"class":1037}," 300000\n",[552,2070,2071,2074],{"class":554,"line":1271},[552,2072,2073],{"class":558},"  processing",[552,2075,563],{"class":562},[552,2077,2078,2081,2083],{"class":554,"line":1282},[552,2079,2080],{"class":558},"    timestamp-coordination-mode",[552,2082,572],{"class":562},[552,2084,2085],{"class":575}," AUTO\n",[438,2087,2088],{"color":440,"icon":441},[320,2089,2090,2093,2094,2096,2097,2100],{},[324,2091,2092],{},"timestamp-coordination-mode: AUTO"," is correct for almost all topologies — override it only for debugging or benchmarking. Per-source watermark behaviour is configured on ",[324,2095,612],{}," with a ",[324,2098,2099],{},"WatermarkStrategy","; these settings are the engine-wide defaults.",[458,2102,2104],{"id":2103},"putting-it-together","Putting it together",[320,2106,2107,2108,2110],{},"A representative production ",[324,2109,338],{}," block:",[543,2112,2114],{"className":545,"code":2113,"language":547,"meta":548,"style":548},"stoatflow:\n  application-id: order-processor\n  bootstrap-servers: kafka-1:9092,kafka-2:9092,kafka-3:9092\n\n  default-key-serde: org.apache.kafka.common.serialization.Serdes$StringSerde\n  default-value-serde: org.apache.kafka.common.serialization.Serdes$StringSerde\n\n  processing-guarantee: EXACTLY_ONCE\n\n  lanes:\n    count: 32\n    queue-capacity: 500\n\n  commit-barrier:\n    interval-ms: 500\n    min-interval-ms: 150\n    max-interval-ms: 5000\n    timeout-ms: 60000\n\n  state:\n    dir: \u002Fvar\u002Flib\u002Fstoatflow\u002Fstate\n    uncommitted-max-bytes: 268435456\n\n  changelog:\n    enabled: true\n    replication-factor: 3\n\n  watermark:\n    max-out-of-orderness-ms: 10000\n    idleness-timeout-ms: 300000\n",[324,2115,2116,2122,2130,2138,2144,2152,2160,2165,2174,2179,2186,2195,2204,2209,2216,2225,2234,2243,2252,2257,2264,2273,2282,2287,2294,2303,2312,2317,2324,2333],{"__ignoreMap":548},[552,2117,2118,2120],{"class":554,"line":555},[552,2119,559],{"class":558},[552,2121,563],{"class":562},[552,2123,2124,2126,2128],{"class":554,"line":566},[552,2125,569],{"class":558},[552,2127,572],{"class":562},[552,2129,576],{"class":575},[552,2131,2132,2134,2136],{"class":554,"line":579},[552,2133,582],{"class":558},[552,2135,572],{"class":562},[552,2137,587],{"class":575},[552,2139,2140],{"class":554,"line":757},[552,2141,2143],{"emptyLinePlaceholder":2142},true,"\n",[552,2145,2146,2148,2150],{"class":554,"line":1271},[552,2147,874],{"class":558},[552,2149,572],{"class":562},[552,2151,879],{"class":575},[552,2153,2154,2156,2158],{"class":554,"line":1282},[552,2155,884],{"class":558},[552,2157,572],{"class":562},[552,2159,879],{"class":575},[552,2161,2163],{"class":554,"line":2162},7,[552,2164,2143],{"emptyLinePlaceholder":2142},[552,2166,2168,2170,2172],{"class":554,"line":2167},8,[552,2169,1430],{"class":558},[552,2171,572],{"class":562},[552,2173,1435],{"class":575},[552,2175,2177],{"class":554,"line":2176},9,[552,2178,2143],{"emptyLinePlaceholder":2142},[552,2180,2182,2184],{"class":554,"line":2181},10,[552,2183,1025],{"class":558},[552,2185,563],{"class":562},[552,2187,2189,2191,2193],{"class":554,"line":2188},11,[552,2190,1032],{"class":558},[552,2192,572],{"class":562},[552,2194,1038],{"class":1037},[552,2196,2198,2200,2202],{"class":554,"line":2197},12,[552,2199,1043],{"class":558},[552,2201,572],{"class":562},[552,2203,1048],{"class":1037},[552,2205,2207],{"class":554,"line":2206},13,[552,2208,2143],{"emptyLinePlaceholder":2142},[552,2210,2212,2214],{"class":554,"line":2211},14,[552,2213,1247],{"class":558},[552,2215,563],{"class":562},[552,2217,2219,2221,2223],{"class":554,"line":2218},15,[552,2220,1254],{"class":558},[552,2222,572],{"class":562},[552,2224,1048],{"class":1037},[552,2226,2228,2230,2232],{"class":554,"line":2227},16,[552,2229,1263],{"class":558},[552,2231,572],{"class":562},[552,2233,1268],{"class":1037},[552,2235,2237,2239,2241],{"class":554,"line":2236},17,[552,2238,1274],{"class":558},[552,2240,572],{"class":562},[552,2242,1279],{"class":1037},[552,2244,2246,2248,2250],{"class":554,"line":2245},18,[552,2247,1285],{"class":558},[552,2249,572],{"class":562},[552,2251,1290],{"class":1037},[552,2253,2255],{"class":554,"line":2254},19,[552,2256,2143],{"emptyLinePlaceholder":2142},[552,2258,2260,2262],{"class":554,"line":2259},20,[552,2261,1653],{"class":558},[552,2263,563],{"class":562},[552,2265,2267,2269,2271],{"class":554,"line":2266},21,[552,2268,1660],{"class":558},[552,2270,572],{"class":562},[552,2272,1665],{"class":575},[552,2274,2276,2278,2280],{"class":554,"line":2275},22,[552,2277,1670],{"class":558},[552,2279,572],{"class":562},[552,2281,1675],{"class":1037},[552,2283,2285],{"class":554,"line":2284},23,[552,2286,2143],{"emptyLinePlaceholder":2142},[552,2288,2290,2292],{"class":554,"line":2289},24,[552,2291,1833],{"class":558},[552,2293,563],{"class":562},[552,2295,2297,2299,2301],{"class":554,"line":2296},25,[552,2298,1840],{"class":558},[552,2300,572],{"class":562},[552,2302,1845],{"class":697},[552,2304,2306,2308,2310],{"class":554,"line":2305},26,[552,2307,1850],{"class":558},[552,2309,572],{"class":562},[552,2311,1855],{"class":1037},[552,2313,2315],{"class":554,"line":2314},27,[552,2316,2143],{"emptyLinePlaceholder":2142},[552,2318,2320,2322],{"class":554,"line":2319},28,[552,2321,2046],{"class":558},[552,2323,563],{"class":562},[552,2325,2327,2329,2331],{"class":554,"line":2326},29,[552,2328,2053],{"class":558},[552,2330,572],{"class":562},[552,2332,2058],{"class":1037},[552,2334,2336,2338,2340],{"class":554,"line":2335},30,[552,2337,2063],{"class":558},[552,2339,572],{"class":562},[552,2341,2068],{"class":1037},[458,2343,2345],{"id":2344},"next-steps","Next steps",[359,2347,2348,2358,2374,2381,2389],{},[362,2349,2350,2354,2355,2357],{},[365,2351,2352],{},[435,2353,281],{"href":282}," — every ",[324,2356,326],{}," key with type, default, and bounds.",[362,2359,2360,2369,2370,2373],{},[365,2361,2362],{},[435,2363,2364,2365,2368],{"href":163},"Runtime config (",[2366,2367],"runtime",{},")"," — the ",[324,2371,2372],{},"runtime.*"," block (HTTP, metrics, endpoints, health).",[362,2375,2376,2380],{},[365,2377,2378],{},[435,2379,456],{"href":173}," — passthrough consumer\u002Fproducer properties and the layered merge order.",[362,2382,2383,2388],{},[365,2384,2385],{},[435,2386,2387],{"href":168},"Defaults and presets"," — the opinionated defaults and how to override them.",[362,2390,2391,2395],{},[365,2392,2393],{},[435,2394,956],{"href":249}," — picking lane count, barrier cadence, and memory caps from observed behaviour.",[2397,2398,2399],"style",{},"html pre.shiki code .su6XF, html code.shiki .su6XF{--shiki-default:#998418}html pre.shiki code .sYZai, html code.shiki .sYZai{--shiki-default:#999999}html pre.shiki code .spphp, html code.shiki .spphp{--shiki-default:#B56959}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 pre.shiki code .sbBg2, html code.shiki .sbBg2{--shiki-default:#1E754F}html pre.shiki code .suHK_, html code.shiki .suHK_{--shiki-default:#393A34}html pre.shiki code .sySUi, html code.shiki .sySUi{--shiki-default:#59873A}html pre.shiki code .si04Y, html code.shiki .si04Y{--shiki-default:#AB5959}html pre.shiki code .svycV, html code.shiki .svycV{--shiki-default:#B07D48}html pre.shiki code .sSP4y, html code.shiki .sSP4y{--shiki-default:#B5695977}html pre.shiki code .s-TwI, html code.shiki .s-TwI{--shiki-default:#2F798A}",{"title":548,"searchDepth":566,"depth":566,"links":2401},[2402,2403,2404,2405,2406,2407,2411,2412,2413],{"id":460,"depth":566,"text":461},{"id":605,"depth":566,"text":606},{"id":909,"depth":566,"text":910},{"id":1051,"depth":566,"text":1052},{"id":418,"depth":566,"text":1342},{"id":1444,"depth":566,"text":1445,"children":2408},[2409,2410],{"id":1457,"depth":579,"text":1458},{"id":1695,"depth":579,"text":1696},{"id":1879,"depth":566,"text":1880},{"id":2103,"depth":566,"text":2104},{"id":2344,"depth":566,"text":2345},"The :core engine knobs every StoatFlow app sets — application id, brokers, default serdes, lanes, commit-barrier cadence, state dir, changelog, processing guarantee, and event-time coordination — with defaults from source.","md",{},{"icon":160},"how-to",{"title":157,"description":2414},"EwN9pvzLReD2MW9xA0HdckEJeZXwQ-ZywkbutJNKUwQ",[2422,2424],{"title":155,"path":151,"stem":152,"description":2423,"icon":75,"children":-1},"How the StoatFlow runtime loads configuration — application.yaml on the classpath, overlay files, environment variables, system properties, and the layered precedence order.",{"title":162,"path":163,"stem":164,"description":2425,"icon":165,"children":-1},"The runtime.* section of application.yaml — HTTP server, metrics, info\u002Fconfig endpoints, health checks — plus logging levels and Kafka client passthrough.",1783713359834]