[{"data":1,"prerenderedAt":797},["ShallowReactive",2],{"navigation":3,"\u002Fblog\u002Fai-assistant-skills":334,"\u002Fblog\u002Fai-assistant-skills-surround":786},[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":775,"description":776,"draft":42,"extension":777,"image":778,"meta":780,"navigation":781,"path":782,"seo":783,"stem":784,"__hash__":785},"posts\u002F3.blog\u002F9.ai-assistant-skills.md","StoatFlow AI Assistant Skills: correct StoatFlow, not hallucinated Kafka Streams",[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":765},"minimark",[348,411,418,421,426,437,440,472,475,479,482,570,576,580,596,600,613,710,714,717,720,723,728,731,735,758],[349,350,351,358],"blockquote",{},[352,353,354],"p",{},[355,356,357],"strong",{},"TL;DR",[359,360,361,368,383,396,402],"ul",{},[362,363,364,367],"li",{},[355,365,366],{},"What:"," a public, versioned pack — six task-cut skills (build, test, port, configure, set up, operate) plus a shared primer and editor rule files, all Apache-2.0.",[362,369,370,373,374,378,379,382],{},[355,371,372],{},"Install (Claude Code):"," ",[375,376,377],"code",{},"\u002Fplugin marketplace add stoatflow\u002Fskills",", then ",[375,380,381],{},"\u002Fplugin install stoatflow@stoatflow",".",[362,384,385,373,388,391,392,395],{},[355,386,387],{},"Install (any agent):",[375,389,390],{},"npx skills add stoatflow\u002Fskills",", or copy ",[375,393,394],{},"AGENTS.md"," into your repo.",[362,397,398,401],{},[355,399,400],{},"Pin the version:"," the pack ships in lockstep with StoatFlow releases — use the tag matching yours.",[362,403,404,407,408,382],{},[355,405,406],{},"The catch:"," it documents StoatFlow; you still need customer credentials to resolve the library from ",[375,409,410],{},"maven.stoatflow.io",[352,412,413,414,417],{},"We've published the ",[355,415,416],{},"StoatFlow AI Assistant Skills",": a free, open pack of six task-cut skills and editor rule files that make Claude Code, Cursor, Copilot, and other coding assistants write correct StoatFlow instead of hallucinated Kafka Streams.",[352,419,420],{},"The pack exists because of a specific problem. StoatFlow is source-compatible with Kafka Streams — swap the import root and your topology compiles — and that same compatibility is why an AI assistant gets it confidently wrong.",[422,423,425],"h2",{"id":424},"why-your-ai-assistant-writes-kafka-streams-not-stoatflow","Why your AI assistant writes Kafka Streams, not StoatFlow",[352,427,428,429,432,433,436],{},"StoatFlow ships the Kafka Streams DSL over a different engine. You swap ",[375,430,431],{},"org.apache.kafka.streams.*"," for ",[375,434,435],{},"io.stoatflow.core.*",", recompile, and existing topology code runs. That drop-in compatibility is the whole point of the DSL — and it's exactly what trips an assistant up.",[352,438,439],{},"Every mainstream model trained on years of Kafka Streams code and documentation. Ask one for a StoatFlow topology and it reaches for what it already knows:",[359,441,442,451,458,464,469],{},[362,443,444,445,447,448,450],{},"the wrong import root — ",[375,446,431],{}," rather than ",[375,449,435],{},";",[362,452,453,454,457],{},"the Kafka Streams ",[375,455,456],{},"at_least_once"," default, where StoatFlow defaults to exactly-once;",[362,459,460,463],{},[375,461,462],{},"replicas: N"," horizontal scaling, where StoatFlow runs one instance per app and scales up, not out;",[362,465,466,467,450],{},"Maven Central coordinates, where StoatFlow resolves only from the private ",[375,468,410],{},[362,470,471],{},"Kafka Streams watermark and timestamp semantics, where StoatFlow follows Flink instead.",[352,473,474],{},"Every one of these compiles. Every one is wrong in a way you catch only if you already know StoatFlow — a default baked into a config, a scaling model that doesn't exist here, an exactly-once guarantee downgraded to at-least-once. Source-compatibility removes the friction that would otherwise flag the mismatch, so the assistant never gets the signal that it's on unfamiliar ground.",[422,476,478],{"id":477},"whats-in-the-pack","What's in the pack",[352,480,481],{},"The guidance is cut the way you actually work — one skill per task, so the relevant rules load when they matter instead of arriving as one wall of text. Each skill fires on what you're doing:",[483,484,485,498],"table",{},[486,487,488],"thead",{},[489,490,491,495],"tr",{},[492,493,494],"th",{},"Skill",[492,496,497],{},"Loads when you're…",[499,500,501,512,526,536,550,560],"tbody",{},[489,502,503,509],{},[504,505,506],"td",{},[375,507,508],{},"stoatflow-build-topology",[504,510,511],{},"writing topology code — DSL, Processor API, serdes, state stores, DLQ",[489,513,514,519],{},[504,515,516],{},[375,517,518],{},"stoatflow-test",[504,520,521,522,525],{},"writing tests — ",[375,523,524],{},"TopologyTestDriver",", integration tests",[489,527,528,533],{},[504,529,530],{},[375,531,532],{},"stoatflow-port-from-ks",[504,534,535],{},"porting a Kafka Streams app — code and state",[489,537,538,543],{},[504,539,540],{},[375,541,542],{},"stoatflow-configure",[504,544,545,546,549],{},"configuring an app — ",[375,547,548],{},"application.yaml",", guarantees, lanes, HA",[489,551,552,557],{},[504,553,554],{},[375,555,556],{},"stoatflow-project-setup",[504,558,559],{},"wiring the build — the private Maven repo, licence, JDK 25, Docker, native image",[489,561,562,567],{},[504,563,564],{},[375,565,566],{},"stoatflow-operate",[504,568,569],{},"deploying and running it — single-instance Kubernetes, HA, probes, metrics, tuning",[352,571,572,573,575],{},"Under the skills sits a shared primer — the identity and the hard rules every skill inherits — and a set of editor rule files generated from that same source: an ",[375,574,394],{}," for Codex and the AGENTS.md-aware tools, plus Cursor, Copilot, and JetBrains variants. The same facts, whichever assistant reads them.",[422,577,579],{"id":578},"how-it-stays-correct","How it stays correct",[352,581,582,583,587,588,595],{},"Documentation that has drifted from the code is worse than none: it's wrong with authority, and an assistant repeats it without the hesitation a human reader might feel. The pack is built against that failure mode. On every StoatFlow release we drift-check it against the three sources it can't afford to lag — the porting guide, the compatibility matrix, and the configuration schema — and ship it with a version that ",[584,585,586],"em",{},"is"," the StoatFlow version it targets. Each artefact prints a ",[584,589,590,591,594],{},"\"Targets StoatFlow ",[592,593],"stoatflow-version",{},"\""," line. Pin the tag to your release, and the divergence rules and config reference match the library you're actually running.",[422,597,599],{"id":598},"install-it","Install it",[352,601,602,603,612],{},"The pack lives in the public repo ",[604,605,609],"a",{"href":606,"rel":607},"https:\u002F\u002Fgithub.com\u002Fstoatflow\u002Fskills",[608],"nofollow",[375,610,611],{},"stoatflow\u002Fskills",". Install it the way your assistant expects:",[483,614,615,625],{},[486,616,617],{},[489,618,619,622],{},[492,620,621],{},"Tool",[492,623,624],{},"Install",[499,626,627,640,651,664,680,695],{},[489,628,629,634],{},[504,630,631],{},[355,632,633],{},"Claude Code",[504,635,636,378,638],{},[375,637,377],{},[375,639,381],{},[489,641,642,647],{},[504,643,644],{},[355,645,646],{},"Any agent (skills CLI)",[504,648,649],{},[375,650,390],{},[489,652,653,658],{},[504,654,655],{},[355,656,657],{},"Codex \u002F AGENTS.md tools",[504,659,660,661,663],{},"copy ",[375,662,394],{}," into your app repo",[489,665,666,671],{},[504,667,668],{},[355,669,670],{},"Cursor",[504,672,660,673,676,677],{},[375,674,675],{},"cursor\u002Frules\u002Fstoatflow.mdc"," to ",[375,678,679],{},".cursor\u002Frules\u002F",[489,681,682,687],{},[504,683,684],{},[355,685,686],{},"GitHub Copilot",[504,688,660,689,676,692],{},[375,690,691],{},"copilot\u002Fstoatflow.instructions.md",[375,693,694],{},".github\u002Finstructions\u002F",[489,696,697,702],{},[504,698,699],{},[355,700,701],{},"JetBrains AI \u002F Junie",[504,703,660,704,676,707],{},[375,705,706],{},"jetbrains\u002Fguidelines.md",[375,708,709],{},".junie\u002Fguidelines.md",[422,711,713],{"id":712},"what-it-doesnt-do","What it doesn't do",[352,715,716],{},"A few boundaries worth stating plainly.",[352,718,719],{},"The pack teaches the public API and the concepts, and nothing below them. StoatFlow's engine internals are obfuscated in the shipped jar and off-limits by design; the pack holds the same line, so it won't explain — or invent — how the engine works inside.",[352,721,722],{},"A skill shifts what your assistant reaches for first. That's most of the battle, not a guarantee: a determined model can still produce Kafka Streams under a StoatFlow prompt. Read the output, especially around guarantees, scaling, and imports — the three it gets wrong most.",[352,724,725,726,382],{},"StoatFlow itself is commercial; the pack is free and Apache-2.0. Installing the skills documents the library, it doesn't unlock it — you still need customer credentials to resolve StoatFlow from ",[375,727,410],{},[352,729,730],{},"And it's new. It shipped with this release and improves with each one, so pin the matching tag and expect the rules to sharpen release over release.",[422,732,734],{"id":733},"where-to-go-next","Where to go next",[359,736,737,745,750],{},[362,738,739,740,382],{},"The pack, with every skill and rule file: ",[604,741,743],{"href":606,"rel":742},[608],[375,744,611],{},[362,746,747,748,382],{},"The setup guide, including the per-editor install: ",[604,749,38],{"href":39},[362,751,752,753,757],{},"Found something the pack gets wrong? ",[604,754,756],{"href":755},"\u002Fcontact","Reach out"," — it's maintained upstream, and a concrete miss is the most useful thing you can send.",[352,759,760,761,382],{},"For the running commentary on how StoatFlow gets built, ",[604,762,764],{"href":340,"rel":763},[608],"follow along on LinkedIn",{"title":766,"searchDepth":767,"depth":767,"links":768},"",2,[769,770,771,772,773,774],{"id":424,"depth":767,"text":425},{"id":477,"depth":767,"text":478},{"id":578,"depth":767,"text":579},{"id":598,"depth":767,"text":599},{"id":712,"depth":767,"text":713},{"id":733,"depth":767,"text":734},"2026-07-24","A free, open skills pack that makes AI coding assistants write correct StoatFlow instead of hallucinated Kafka Streams.","md",{"src":779},"\u002Fassets\u002Fblog\u002Fog\u002Fai-assistant-skills.png",{},true,"\u002Fblog\u002Fai-assistant-skills",{"title":336,"description":776},"3.blog\u002F9.ai-assistant-skills","Z3TQDRXKZQHmPa3PoprUIyvteh6yJQ2h1PAqYNTygtw",[787,792],{"title":788,"path":789,"stem":790,"description":791,"children":-1},"llms.txt for StoatFlow: docs your AI agent can fetch","\u002Fblog\u002Fllms-txt-machine-readable-docs","3.blog\u002F10.llms-txt-machine-readable-docs","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.",{"title":793,"path":794,"stem":795,"description":796,"children":-1},"Internal consistency on Kafka: emitting a correct answer at every commit","\u002Fblog\u002Finternal-consistency","3.blog\u002F8.internal-consistency","Money can only be moved, never created — so a stream that tracks balances should read total = 0 at every consistent cut. The Flink Table API gets it right 0.035% of the time; our Kafka Streams twin sends total to −1,619 … +1,792. StoatFlow holds it at exactly 0, at every one of its committed cuts. Here is why, and the measured proof.",1786987416002]