[{"data":1,"prerenderedAt":693},["ShallowReactive",2],{"navigation":3,"\u002Fblog\u002Fllms-txt-machine-readable-docs":334,"\u002Fblog\u002Fllms-txt-machine-readable-docs-surround":683},[4,43,91,154,181,224,262,293],{"title":5,"path":6,"stem":7,"children":8,"icon":42},"Getting Started","\u002Fdocs\u002Fgetting-started","1.docs\u002F1.getting-started\u002F1.index",[9,12,17,22,27,32,37],{"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",{"title":38,"path":39,"stem":40,"icon":41},"AI assistants","\u002Fdocs\u002Fgetting-started\u002Fai-assistants","1.docs\u002F1.getting-started\u002F7.ai-assistants","i-lucide-bot",false,{"title":44,"path":45,"stem":46,"children":47,"icon":50},"Core Concepts","\u002Fdocs\u002Fconcepts","1.docs\u002F2.concepts\u002F1.index",[48,51,56,61,66,71,76,81,86],{"title":49,"path":45,"stem":46,"icon":50},"Core concepts","i-lucide-book-open",{"title":52,"path":53,"stem":54,"icon":55},"Architecture","\u002Fdocs\u002Fconcepts\u002Farchitecture","1.docs\u002F2.concepts\u002F2.architecture","i-lucide-layers",{"title":57,"path":58,"stem":59,"icon":60},"Exactly-once semantics","\u002Fdocs\u002Fconcepts\u002Fexactly-once","1.docs\u002F2.concepts\u002F3.exactly-once","i-lucide-shield-check",{"title":62,"path":63,"stem":64,"icon":65},"Lanes and parallelism","\u002Fdocs\u002Fconcepts\u002Flanes-and-parallelism","1.docs\u002F2.concepts\u002F4.lanes-and-parallelism","i-lucide-split",{"title":67,"path":68,"stem":69,"icon":70},"State and thread-safety","\u002Fdocs\u002Fconcepts\u002Fstate-and-thread-safety","1.docs\u002F2.concepts\u002F5.state-and-thread-safety","i-lucide-lock",{"title":72,"path":73,"stem":74,"icon":75},"Event time and watermarks","\u002Fdocs\u002Fconcepts\u002Fevent-time-and-watermarks","1.docs\u002F2.concepts\u002F6.event-time-and-watermarks","i-lucide-clock",{"title":77,"path":78,"stem":79,"icon":80},"The configuration model","\u002Fdocs\u002Fconcepts\u002Fconfiguration-model","1.docs\u002F2.concepts\u002F7.configuration-model","i-lucide-sliders-horizontal",{"title":82,"path":83,"stem":84,"icon":85},"The error-handling model","\u002Fdocs\u002Fconcepts\u002Ferror-handling-model","1.docs\u002F2.concepts\u002F8.error-handling-model","i-lucide-triangle-alert",{"title":87,"path":88,"stem":89,"icon":90},"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":92,"path":93,"stem":94,"children":95,"icon":98},"Building Topologies","\u002Fdocs\u002Fbuilding","1.docs\u002F3.building\u002F1.index",[96,99,104,109,114,119,124,129,134,139,144,149],{"title":97,"path":93,"stem":94,"icon":98},"Building topologies","i-lucide-blocks",{"title":100,"path":101,"stem":102,"icon":103},"Error handling and DLQ","\u002Fdocs\u002Fbuilding\u002Ferror-handling-dlq","1.docs\u002F3.building\u002F10.error-handling-dlq","i-lucide-circle-x",{"title":105,"path":106,"stem":107,"icon":108},"State stores","\u002Fdocs\u002Fbuilding\u002Fstate-stores","1.docs\u002F3.building\u002F11.state-stores","i-lucide-database",{"title":110,"path":111,"stem":112,"icon":113},"Testing topologies","\u002Fdocs\u002Fbuilding\u002Ftesting","1.docs\u002F3.building\u002F12.testing","i-lucide-flask-conical",{"title":115,"path":116,"stem":117,"icon":118},"Sources and sinks","\u002Fdocs\u002Fbuilding\u002Fstreams-builder","1.docs\u002F3.building\u002F2.streams-builder","i-lucide-import",{"title":120,"path":121,"stem":122,"icon":123},"KStream and KTable operations","\u002Fdocs\u002Fbuilding\u002Fkstream-ktable","1.docs\u002F3.building\u002F3.kstream-ktable","i-lucide-waypoints",{"title":125,"path":126,"stem":127,"icon":128},"Aggregations","\u002Fdocs\u002Fbuilding\u002Faggregations","1.docs\u002F3.building\u002F4.aggregations","i-lucide-sigma",{"title":130,"path":131,"stem":132,"icon":133},"Windowing","\u002Fdocs\u002Fbuilding\u002Fwindowing","1.docs\u002F3.building\u002F5.windowing","i-lucide-calendar-clock",{"title":135,"path":136,"stem":137,"icon":138},"Joins","\u002Fdocs\u002Fbuilding\u002Fjoins","1.docs\u002F3.building\u002F6.joins","i-lucide-git-merge",{"title":140,"path":141,"stem":142,"icon":143},"The Processor API","\u002Fdocs\u002Fbuilding\u002Fprocessor-api","1.docs\u002F3.building\u002F7.processor-api","i-lucide-cpu",{"title":145,"path":146,"stem":147,"icon":148},"Scheduled sources","\u002Fdocs\u002Fbuilding\u002Fscheduled-sources","1.docs\u002F3.building\u002F8.scheduled-sources","i-lucide-timer",{"title":150,"path":151,"stem":152,"icon":153},"Serdes and Avro","\u002Fdocs\u002Fbuilding\u002Fserdes","1.docs\u002F3.building\u002F9.serdes","i-lucide-binary",{"title":155,"path":156,"stem":157,"children":158,"icon":80},"Configuration","\u002Fdocs\u002Fconfiguration","1.docs\u002F4.configuration\u002F1.index",[159,161,166,171,176],{"title":160,"path":156,"stem":157,"icon":80},"How configuration works",{"title":162,"path":163,"stem":164,"icon":165},"Engine configuration (:core)","\u002Fdocs\u002Fconfiguration\u002Fcore-config","1.docs\u002F4.configuration\u002F2.core-config","i-lucide-settings-2",{"title":167,"path":168,"stem":169,"icon":170},"Runtime configuration (:runtime)","\u002Fdocs\u002Fconfiguration\u002Fruntime-config","1.docs\u002F4.configuration\u002F3.runtime-config","i-lucide-server-cog",{"title":172,"path":173,"stem":174,"icon":175},"Defaults, adaptivity, and presets","\u002Fdocs\u002Fconfiguration\u002Fdefaults-and-presets","1.docs\u002F4.configuration\u002F4.defaults-and-presets","i-lucide-gauge",{"title":177,"path":178,"stem":179,"icon":180},"Kafka client configuration","\u002Fdocs\u002Fconfiguration\u002Fkafka-client-config","1.docs\u002F4.configuration\u002F5.kafka-client-config","i-lucide-plug",{"title":182,"path":183,"stem":184,"children":185,"icon":188},"Running in Production","\u002Fdocs\u002Fruntime","1.docs\u002F5.runtime\u002F1.index",[186,189,194,199,204,209,214,219],{"title":187,"path":183,"stem":184,"icon":188},"The runtime","i-lucide-server",{"title":190,"path":191,"stem":192,"icon":193},"The REST API","\u002Fdocs\u002Fruntime\u002Frest-api","1.docs\u002F5.runtime\u002F2.rest-api","i-lucide-globe",{"title":195,"path":196,"stem":197,"icon":198},"Health checks","\u002Fdocs\u002Fruntime\u002Fhealth-checks","1.docs\u002F5.runtime\u002F3.health-checks","i-lucide-heart-pulse",{"title":200,"path":201,"stem":202,"icon":203},"Metrics","\u002Fdocs\u002Fruntime\u002Fmetrics","1.docs\u002F5.runtime\u002F4.metrics","i-lucide-activity",{"title":205,"path":206,"stem":207,"icon":208},"Pause and resume","\u002Fdocs\u002Fruntime\u002Fpause-unpause","1.docs\u002F5.runtime\u002F5.pause-unpause","i-lucide-pause",{"title":210,"path":211,"stem":212,"icon":213},"Plugins and lifecycle hooks","\u002Fdocs\u002Fruntime\u002Fplugins","1.docs\u002F5.runtime\u002F6.plugins","i-lucide-puzzle",{"title":215,"path":216,"stem":217,"icon":218},"Docker images","\u002Fdocs\u002Fruntime\u002Fdocker","1.docs\u002F5.runtime\u002F7.docker","i-lucide-container",{"title":220,"path":221,"stem":222,"icon":223},"GraalVM native image","\u002Fdocs\u002Fruntime\u002Fnative-image","1.docs\u002F5.runtime\u002F8.native-image","i-lucide-zap",{"title":225,"path":226,"stem":227,"children":228,"icon":231},"Deploying & Operating","\u002Fdocs\u002Foperating","1.docs\u002F6.operating\u002F1.index",[229,232,237,242,247,252,257],{"title":230,"path":226,"stem":227,"icon":231},"Deploying and operating","i-lucide-life-buoy",{"title":233,"path":234,"stem":235,"icon":236},"Running on Kubernetes","\u002Fdocs\u002Foperating\u002Fkubernetes","1.docs\u002F6.operating\u002F2.kubernetes","i-lucide-ship",{"title":238,"path":239,"stem":240,"icon":241},"High availability","\u002Fdocs\u002Foperating\u002Fhigh-availability","1.docs\u002F6.operating\u002F3.high-availability","i-lucide-copy",{"title":243,"path":244,"stem":245,"icon":246},"Liveness and readiness probes","\u002Fdocs\u002Foperating\u002Fprobes","1.docs\u002F6.operating\u002F4.probes","i-lucide-stethoscope",{"title":248,"path":249,"stem":250,"icon":251},"Observability","\u002Fdocs\u002Foperating\u002Fobservability","1.docs\u002F6.operating\u002F5.observability","i-lucide-telescope",{"title":253,"path":254,"stem":255,"icon":256},"Tuning under load","\u002Fdocs\u002Foperating\u002Ftuning","1.docs\u002F6.operating\u002F6.tuning","i-lucide-sliders",{"title":258,"path":259,"stem":260,"icon":261},"Production checklist","\u002Fdocs\u002Foperating\u002Fproduction-checklist","1.docs\u002F6.operating\u002F7.production-checklist","i-lucide-clipboard-check",{"title":263,"path":264,"stem":265,"children":266,"icon":90},"Migrating from Kafka Streams","\u002Fdocs\u002Fmigration","1.docs\u002F7.migration\u002F1.index",[267,268,273,278,283,288],{"title":263,"path":264,"stem":265,"icon":90},{"title":269,"path":270,"stem":271,"icon":272},"Automated port","\u002Fdocs\u002Fmigration\u002Fautomated-port","1.docs\u002F7.migration\u002F2.automated-port","i-lucide-wand-sparkles",{"title":274,"path":275,"stem":276,"icon":277},"Migration without carrying state","\u002Fdocs\u002Fmigration\u002Fwithout-data-migration","1.docs\u002F7.migration\u002F3.without-data-migration","i-lucide-sparkles",{"title":279,"path":280,"stem":281,"icon":282},"Migration carrying state","\u002Fdocs\u002Fmigration\u002Fwith-data-migration","1.docs\u002F7.migration\u002F4.with-data-migration","i-lucide-database-backup",{"title":284,"path":285,"stem":286,"icon":287},"The migration tool","\u002Fdocs\u002Fmigration\u002Fmigration-tool","1.docs\u002F7.migration\u002F5.migration-tool","i-lucide-truck",{"title":289,"path":290,"stem":291,"icon":292},"Reusing your Kafka Streams dashboards","\u002Fdocs\u002Fmigration\u002Freusing-kafka-streams-dashboards","1.docs\u002F7.migration\u002F6.reusing-kafka-streams-dashboards","i-lucide-line-chart",{"title":294,"path":295,"stem":296,"children":297,"icon":299},"Reference","\u002Fdocs\u002Freference","1.docs\u002F8.reference\u002F1.index",[298,300,305,310,315,320,325,329],{"title":294,"path":295,"stem":296,"icon":299},"i-lucide-list",{"title":301,"path":302,"stem":303,"icon":304},"Configuration reference","\u002Fdocs\u002Freference\u002Fconfiguration-reference","1.docs\u002F8.reference\u002F2.configuration-reference","i-lucide-table",{"title":306,"path":307,"stem":308,"icon":309},"REST API reference","\u002Fdocs\u002Freference\u002Frest-api-reference","1.docs\u002F8.reference\u002F3.rest-api-reference","i-lucide-network",{"title":311,"path":312,"stem":313,"icon":314},"Gradle plugin reference","\u002Fdocs\u002Freference\u002Fgradle-plugin-reference","1.docs\u002F8.reference\u002F4.gradle-plugin-reference","i-lucide-box",{"title":316,"path":317,"stem":318,"icon":319},"Maven reference","\u002Fdocs\u002Freference\u002Fmaven-reference","1.docs\u002F8.reference\u002F5.maven-reference","i-simple-icons-apachemaven",{"title":321,"path":322,"stem":323,"icon":324},"Kafka Streams compatibility matrix","\u002Fdocs\u002Freference\u002Fks-compatibility-matrix","1.docs\u002F8.reference\u002F6.ks-compatibility-matrix","i-lucide-table-2",{"title":326,"path":327,"stem":328,"icon":175},"Metrics reference","\u002Fdocs\u002Freference\u002Fmetrics-reference","1.docs\u002F8.reference\u002F7.metrics-reference",{"title":330,"path":331,"stem":332,"icon":333},"Glossary","\u002Fdocs\u002Freference\u002Fglossary","1.docs\u002F8.reference\u002F8.glossary","i-lucide-book-a",{"id":335,"title":336,"authors":337,"badge":343,"body":345,"date":672,"description":673,"draft":42,"extension":674,"image":675,"meta":677,"navigation":678,"path":679,"seo":680,"stem":681,"__hash__":682},"posts\u002F3.blog\u002F10.llms-txt-machine-readable-docs.md","llms.txt for StoatFlow: docs your AI agent can fetch",[338],{"name":339,"to":340,"avatar":341},"Hartmut Armbruster","https:\u002F\u002Fwww.linkedin.com\u002Fin\u002Fhartmut-co-uk\u002F",{"src":342},"\u002Fassets\u002Fhartmut_armbruster_monochromatic.jpg",{"label":344},"Announcement",{"type":346,"value":347,"toc":663},"minimark",[348,415,435,438,464,467,486,491,494,497,502,517,521,571,574,585,589,592,599,603,610,613,616,619,623,656],[349,350,351,358],"blockquote",{},[352,353,354],"p",{},[355,356,357],"strong",{},"TL;DR",[359,360,361,391,397,403,409],"ul",{},[362,363,364,367,368,378,379,386,387,390],"li",{},[355,365,366],{},"What:"," the StoatFlow documentation in machine-readable form — ",[369,370,374],"a",{"href":371,"rel":372},"https:\u002F\u002Fstoatflow.io\u002Fllms.txt",[373],"nofollow",[375,376,377],"code",{},"\u002Fllms.txt"," (index), ",[369,380,383],{"href":381,"rel":382},"https:\u002F\u002Fstoatflow.io\u002Fllms-full.txt",[373],[375,384,385],{},"\u002Fllms-full.txt"," (one bundle), and any page as raw markdown at ",[375,388,389],{},"\u002Fraw\u002F\u003Cpath>.md",".",[362,392,393,396],{},[355,394,395],{},"Install:"," nothing. Point your agent, or your retrieval pipeline, at the URL.",[362,398,399,402],{},[355,400,401],{},"Scope:"," the eight documentation sections, published blog posts, and the changelog. Marketing pages stay out.",[362,404,405,408],{},[355,406,407],{},"Freshness:"," regenerated on every docs deploy, so it cannot lag the site.",[362,410,411,414],{},[355,412,413],{},"The catch:"," the full bundle is around 1.2 MB — roughly 300,000 tokens. Sized for retrieval, not for pasting into a 200K-token context.",[352,416,417,418,424,425,431,432,434],{},"The StoatFlow documentation is now published in a form an AI agent can fetch directly. ",[369,419,421],{"href":371,"rel":420},[373],[375,422,423],{},"stoatflow.io\u002Fllms.txt"," is a curated index of every documentation page; ",[369,426,428],{"href":381,"rel":427},[373],[375,429,430],{},"stoatflow.io\u002Fllms-full.txt"," is the same documentation concatenated into a single markdown file; and every indexed page is also served as raw markdown at ",[375,433,389],{},". There is nothing to install and no key to configure.",[352,436,437],{},"If the convention is new to you, Chrome's documentation puts it plainly:",[349,439,440,453],{},[352,441,442,443,446,447,452],{},"The ",[375,444,445],{},"llms.txt"," file is an ",[369,448,451],{"href":449,"rel":450},"https:\u002F\u002Fllmstxt.org\u002F",[373],"emerging convention"," used to provide a machine-readable summary of a website's content, specifically designed for LLMs and AI agents. Without this file, agents may spend more time crawling the site to understand its high-level structure and primary content.",[352,454,455,456],{},"— ",[369,457,460,461],{"href":458,"rel":459},"https:\u002F\u002Fdeveloper.chrome.com\u002Fdocs\u002Flighthouse\u002Fagentic-browsing\u002Fllms-txt",[373],"Chrome for Developers, ",[462,463,445],"em",{},[352,465,466],{},"That last sentence is the whole value proposition. An agent that has to crawl a documentation site burns turns discovering structure before it can answer anything; one that fetches an index gets the map in a single request.",[352,468,469,470,474,475,478,479,481,482,485],{},"This is the other half of a pair. The ",[369,471,473],{"href":472},"\u002Fblog\u002Fai-assistant-skills","AI Assistant Skills pack"," is a set of skills and editor rule files you install so your assistant writes correct StoatFlow instead of hallucinated Kafka Streams. That channel ",[355,476,477],{},"pushes"," — the rules land in the assistant's context before it writes a line. ",[375,480,445],{}," ",[355,483,484],{},"pulls"," — the agent goes and gets the answer when it needs one.",[487,488,490],"h2",{"id":489},"two-channels-not-one","Two channels, not one",[352,492,493],{},"Both exist because they fail differently.",[352,495,496],{},"The pack only works where it's installed, and only for the assistants it targets. Where it applies it is the stronger intervention: the rules are in context before the model starts generating, which is where they shift behaviour most.",[352,498,499,501],{},[375,500,445],{}," reaches everything else — an agent nobody configured, a retrieval pipeline building an internal knowledge base, a coding tool that follows URLs. It's weaker per interaction, because the model has to decide to look. It has no setup step to skip.",[352,503,504,505,508,509,512,513,516],{},"An assistant with both gets the rules that stop it reaching for ",[375,506,507],{},"org.apache.kafka.streams.*",", ",[462,510,511],{},"and"," the page that says what ",[375,514,515],{},"barrier.max-interval-ms"," actually does.",[487,518,520],{"id":519},"whats-published","What's published",[522,523,524,537],"table",{},[525,526,527],"thead",{},[528,529,530,534],"tr",{},[531,532,533],"th",{},"URL",[531,535,536],{},"Contents",[538,539,540,550,559],"tbody",{},[528,541,542,547],{},[543,544,545],"td",{},[375,546,377],{},[543,548,549],{},"Curated index — every documentation page with its title and description, grouped by section. 65 links, 17 KB.",[528,551,552,556],{},[543,553,554],{},[375,555,385],{},[543,557,558],{},"The same pages concatenated into one markdown document. About 1.2 MB.",[528,560,561,565],{},[543,562,563],{},[375,564,389],{},[543,566,567,568,390],{},"Any indexed page as raw markdown — for example ",[375,569,570],{},"\u002Fraw\u002Fdocs\u002Fconcepts\u002Fexactly-once.md",[352,572,573],{},"Scope is the eight documentation sections — getting started, concepts, building topologies, configuration, running in production, operating, migration, reference — plus published blog posts and the changelog. Product and pricing pages stay out: they are marketing surfaces, and structured page content serialises poorly to markdown.",[352,575,576,577,581,582,584],{},"The format follows the ",[369,578,580],{"href":449,"rel":579},[373],"llms.txt convention",", which a growing number of documentation sites now publish. Nothing here is StoatFlow-specific: if your tooling already understands ",[375,583,445],{}," from another vendor, it understands ours.",[487,586,588],{"id":587},"how-it-stays-correct","How it stays correct",[352,590,591],{},"Documentation that has drifted from the code is worse than none — it is wrong with authority, and an agent repeats it without the hesitation a human reader might feel. The skills pack fights that with drift checks and a version that matches the release. This side avoids it structurally instead: both files are generated from the same markdown that renders the site, in the same build, on every deploy. There is no second copy to maintain and no hand-written index to rot.",[352,593,594,595,598],{},"The weight moves to configuration, which is worth one caution if you are publishing your own. Every section we expose is declared explicitly, because a generator like this never executes the page components that enforce a site's own rules. It is also worth knowing that a filter which ",[462,596,597],{},"looks"," like it excludes drafts can quietly exclude everything else instead, depending on how an unset field is stored: in SQL, unset is not \"false\". We check by reading the generated files, not by trusting a green build.",[487,600,602],{"id":601},"what-it-doesnt-do","What it doesn't do",[352,604,605,606,609],{},"The bundle is around 1.2 MB, roughly 300,000 tokens. That suits chunked retrieval and long-context models; it does not suit pasting into a 200K-token window. Use the index, or fetch the two or three ",[375,607,608],{},"\u002Fraw\u002F"," pages you actually need.",[352,611,612],{},"It is a pull channel. The agent has to decide to fetch it, and many won't unless told. If you want the rules in front of the model unconditionally, install the pack.",[352,614,615],{},"It covers the public API and the concepts, and nothing beneath them. StoatFlow's engine is obfuscated in the shipped jar; the documentation holds that same line, so the bundle explains what the API does and how the architecture works — never how the engine is implemented inside.",[352,617,618],{},"And it amplifies whatever the documentation says. A page that is wrong is now wrong at machine scale, republished on every deploy. That raises the bar on the docs themselves, which is our problem to stay on top of rather than one to discover later.",[487,620,622],{"id":621},"where-to-go-next","Where to go next",[359,624,625,634,643,648],{},[362,626,627,628,633],{},"The index: ",[369,629,631],{"href":371,"rel":630},[373],[375,632,423],{}," — start here, then fetch what you need.",[362,635,636,637,642],{},"The bundle: ",[369,638,640],{"href":381,"rel":639},[373],[375,641,430],{}," — for retrieval pipelines.",[362,644,645,646,390],{},"The push-side channel and its per-editor install: ",[369,647,38],{"href":39},[362,649,650,651,655],{},"Something the docs get wrong? ",[369,652,654],{"href":653},"\u002Fcontact","Reach out"," — a concrete miss is the most useful thing you can send, and it now propagates to every agent on the next deploy.",[352,657,658,659,390],{},"For the running commentary on how StoatFlow gets built, ",[369,660,662],{"href":340,"rel":661},[373],"follow along on LinkedIn",{"title":664,"searchDepth":665,"depth":665,"links":666},"",2,[667,668,669,670,671],{"id":489,"depth":665,"text":490},{"id":519,"depth":665,"text":520},{"id":587,"depth":665,"text":588},{"id":601,"depth":665,"text":602},{"id":621,"depth":665,"text":622},"2026-07-26","The StoatFlow documentation is now published as llms.txt, llms-full.txt, and raw markdown — the retrieval-side complement to the AI Assistant Skills pack. Nothing to install.","md",{"src":676},"\u002Fassets\u002Fblog\u002Fog\u002Fllms-txt-machine-readable-docs.png",{},true,"\u002Fblog\u002Fllms-txt-machine-readable-docs",{"title":336,"description":673},"3.blog\u002F10.llms-txt-machine-readable-docs","KESvRcH5suUSUY8peClVa43hBvKchojHanJpAc2ZFII",[684,689],{"title":685,"path":686,"stem":687,"description":688,"children":-1},"Three gates, one transaction: error handling in StoatFlow","\u002Fblog\u002Ferror-handling-three-gates-one-transaction","3.blog\u002F11.error-handling-three-gates-one-transaction","A record can fail on the way in, in the middle, or on the way out. StoatFlow gives every gate the same verdicts — continue, fail, or dead-letter — and settles them all inside the exactly-once transaction: DLQ records commit on the same barrier as your output, and what cannot be handled kills the epoch, never the guarantee. The full model, from one bad record to a Kubernetes restart.",{"title":690,"path":472,"stem":691,"description":692,"children":-1},"StoatFlow AI Assistant Skills: correct StoatFlow, not hallucinated Kafka Streams","3.blog\u002F9.ai-assistant-skills","A free, open skills pack that makes AI coding assistants write correct StoatFlow instead of hallucinated Kafka Streams.",1786987415944]