[{"data":1,"prerenderedAt":290},["ShallowReactive",2],{"flow-4utogag8sr9xrxey14yx5mjligci37ll":3},{"nodes":4,"edges":169},{"4utogag8sr9xrxey14yx5mjligci37ll":5,"gz9pvvpbkqywe71jq8wxhamsw4u6ehet":18,"vycu2m8ngoiu12e5moftgmblwi0i6xka":25,"2dnagf1ftzkmlgbhm144y56f5vta49rc":31,"zg0sghqa20ruch3ma4k50g3fuyylm3yq":37,"ba78wfrecih90ydpqqseqar5ao66a9j4":42,"a9uqpvli6bh2mu2ynx57bleq9q5bqb58":47,"qv2geyrx501cn7h584bdkvxbljsl0h62":52,"kh05lg8im8qpurdaoyfb9grws5nv0ipf":57,"f556kjt7cv145nsrka98qcc8p60okasf":62,"4rrgyzzc7z3r94uk6zknnzw6l35nvqdy":67,"7vr6sz8jwwluu0pdsb1d1z62y1fhcz15":73,"ll85d9aj20tug6wu9y0gv3kqfw8yf3v6":79,"188u59jnjrpoptw5l4147goyog1myzqw":84,"2k5474ikwvedmojd43vfap18krcvz98o":91,"oviuokndduyrhw60ahasgny9ut5jqhz9":97,"bfq5lf7uo6os4hbikhpgrd5s7d7pmtp4":102,"e9nnh5brnz4hxvm1ivonfoura0y7qkbt":112,"c12p8x5uqsqjm8rji7ovch8z1rtq2zm6":117,"u0122u3f9mz46ycjchbeka4p6aozi8g3":121,"fvraq8amb8f7mtv7f1i4m8n7vyb0i5xa":126,"v8gud314hbni51n5b3vpx314ve38z765":131,"ul2lxd5r4tdfnvflui5jwz9k0fr5jj17":136,"2fzanxhujn2yw0ats59nffmo3dzqcuoy":141,"4x86k09wwbw4l2163yvt5doabrt6rx6w":146,"mizqyf7gxvvz1o5y962il3y4ckjq8m3l":150,"84p6op3w9qrfoflkl0a2c4knmh8gq0w2":154,"k7ahzcc39ge5susz5qidfw9otwjhe4n9":158,"dax4az47qomaeaq00bc7ccunpre827lm":164},{"type":6,"x":7,"y":7,"properties":8},"start",0,{"title":9,"excerpt":10,"slug":11,"post":12,"author":13,"license":14,"channel":15,"category":16,"private":17},"Talking to Your Own Flow: An Ice Cream Configurator That Explains Itself","A tiny ice cream configurator you can actually talk to. Because a Wanderer flow is a visual graph and executable data at the same time, a reflector node can export its full structure, edges and current state included, straight into a GPT node. The result is a configurator that stays strictly deterministic while an LLM explains its own logic to you. Ask why you cannot have a spoon, and it will tell you: no cup, no spoon.","Talking-to-Your-Own-Flow-An-Ice-Cream-Configurator-That-Explains-Itself","Every Wanderer flow is two things at once. It is a visual graph you can look at, and it is data you can read. Because Reactive Graph Sequencing keeps the visual representation and the executable code as the same object, a flow can hand a description of itself to a language model. The result is a configurator you can actually talk to while you use it.\n\nThis example is a tiny ice cream configurator, embedded as a chat on a website. You pick a cup or a cone, choose a flavor, decide whether to eat here or take it away, and if you went with a cup you get asked about a spoon. Nothing surprising so far. The interesting part is that a GPT node sits alongside the flow and can answer questions about the flow itself.\n\n### Copy and Paste These Into the Chat\n\n- What can I do here?\n- What are my options?\n- Walk me through all the steps before I start.\n- How many decisions will I have to make?\n- Why can I not have a spoon?\n- What do I need to choose to unlock the spoon question?\n- What do I need to select to get cream?\n- Which of my choices depend on each other?\n- What happens if I pick a cone instead of a cup?\n- How did I decide so far?\n- What have I chosen up to now?\n- What is the next question going to be?\n- Can I still change my flavor?\n- Show me all the paths through this flow.\n- Which questions only appear in the cup branch?\n- Is there any choice I cannot undo?\n- What is the shortest way to finish?\n\n### How It Works\n\nA reflector node walks the graph and collects every message node and every question node together with the edges that connect them. It exports all of that, plus the current state of the run, as plain JSON text. That JSON gets pushed into a GPT node. The model now sees the full structure of the configurator and where you currently are inside it.\n\nBecause the JSON carries the edges, the model does not just see the questions. It sees the logic. It knows that the spoon question only exists downstream of the cup choice. So when you ask why you cannot have a spoon, GPT can tell you the real reason. No cup means no spoon. The spoon is a consequence of an earlier decision, and the graph makes that consequence visible in the data it exports.\n\n### What the Conversation Looks Like\n\nThe user in the example starts by asking what they can even do here. The assistant reads the exported flow and explains the available path. You will be asked cup or cone, then a flavor like strawberry, chocolate, or vanilla, then whether you eat here or take it away, and a spoon question appears only for a cup.\n\nLater the user picks a cone with chocolate to take away, then asks how they decided. The assistant reads the current state and reports it back accurately. When the user asks for a spoon, the assistant explains that the spoon question lives behind the cup branch, so a cone never reaches it, and it even suggests going back and choosing a cup instead. The user does exactly that, gets the spoon question, and confirms. The assistant then confirms why the question appeared this time. Cup selected, spoon offered.\n\n### Why This Matters\n\nThe system stays strictly deterministic. The graph decides what happens next, the edges enforce the rules, and the flow never guesses. The language model does not drive the flow and cannot break its logic. It reads the same structure the runtime uses and reflects on it with you. You get a configurator that behaves predictably and an assistant that can explain that behavior in your own words, because both are looking at the exact same graph.\n\nThat is the whole idea behind Context Reactivity. The context is not an approximation of the flow written by hand. It is the flow, exported as it really is, current state included, ready to be reasoned about.","Wanderer","CC BY 4.0","chat","Context Reactivity",false,{"type":19,"x":20,"y":21,"properties":22},"message",383.9897474826705,6.100407461392621,{"text":23,"repeatOnReentry":24,"repeatOnChance":24},"Hey! Welcome to the **ice cream configurator**.",true,{"type":26,"x":27,"y":28,"properties":29},"question",347.21249911201437,512.8153695011607,{"text":30,"multiple":17,"reviewable":24,"repeatOnReentry":17},"Would you prefer your ice cream in a cone or a cup?",{"type":32,"x":33,"y":34,"properties":35},"suggestion",504.9399682898261,710.0911866768188,{"label":36,"value":36},"Cup",{"type":32,"x":38,"y":39,"properties":40},80.47655050214956,717.3550366328452,{"label":41,"value":41},"Cone",{"type":26,"x":43,"y":44,"properties":45},487.22881330205314,1569.50620985126,{"text":46,"multiple":17,"reviewable":24,"repeatOnReentry":17},"Which flavor would you like?",{"type":32,"x":48,"y":49,"properties":50},211.22162424118616,1477.4247663547837,{"label":51,"value":51},"Strawberry",{"type":32,"x":53,"y":54,"properties":55},243.92351128802773,1685.6183561229363,{"label":56,"value":56},"Chocolate",{"type":32,"x":58,"y":59,"properties":60},210.08713911003468,1577.6877324590082,{"label":61,"value":61},"Vanilla",{"type":26,"x":63,"y":64,"properties":65},542.1773353325432,1959.017783564356,{"text":66,"multiple":17,"reviewable":24,"repeatOnReentry":17},"Would you like to take it with you or eat it here?",{"type":32,"x":68,"y":69,"properties":70},655.0883888103076,2169.857222325496,{"label":71,"value":72},"Eat here","no",{"type":32,"x":74,"y":75,"properties":76},391.0388739414591,2173.151678927355,{"label":77,"value":78},"Takeaway","yes",{"type":19,"x":80,"y":81,"properties":82},1106.3249916838429,2127.7088775127836,{"text":83,"repeatOnReentry":24,"repeatOnChance":24},"Perfect. Enjoy your ice cream. 🍨",{"type":85,"x":86,"y":87,"properties":88},"prompt",-1102.4150732421874,337.3650244140625,{"label":89,"placeholder":90,"hideAfterSent":17},"How can I help you?","Type your message",{"type":92,"x":93,"y":94,"properties":95},"conclusion",-933.9339751600675,136.74048126862468,{"text":96},"",{"type":98,"x":99,"y":100,"properties":101},"reflector",-754.4913939146259,349.9579772352954,[],{"type":103,"x":104,"y":105,"properties":106},"chatgpt",-957.1055995858655,727.4832715104374,{"systemPrompt":107,"userPrompt":108,"model":109,"manageHistory":17,"onReentry":110,"onChange":111},"You are a node in a deterministic chat flow. You receive the conversation as a JSON graph and answer the user's questions about what is possible and how to get there.\n\n## Nodes\n\nEach node has a \"type\":\n- \"message\"    -> text the flow sends. \"send\": true = already sent.\n- \"question\"   -> a question shown to the user. Fields: \"answered\", \"active\", \"multiple\" (more than one answer allowed).\n- \"suggestion\" -> a selectable answer to a question. Fields: \"selected\", \"active\".\n\nField meaning:\n- \"active\": true = reachable on the currently selected path right now. \"active\": false = NOT reachable right now.\n- \"active\" always overrides \"answered\": a question can be \"answered\": true but \"active\": false (the user answered it, then changed an upstream choice). Then it is NOT currently reachable.\n- \"selected\": true = the user actually chose this option.\n\n## Edges\n\n{ \"from\": A, \"to\": B } means B becomes reachable only after A happens. If A is a suggestion, B is reachable only while A is \"selected\". A question is shown only once a selected suggestion leads to it.\n\n## Determining reachability\n\nNever guess. For the node the user asks about:\n1. Read its \"active\" flag for current reachability.\n2. To explain how to reach it, trace incoming edges backward to the start and list exactly which suggestions must be selected. State only requirements backed by a real edge — never invent one.\n3. If multiple paths lead to it, report each valid one.\n4. Verify the currently selected path actually reaches the target. If a conflicting choice routes away, say so and name the specific suggestion to change and what to change it to (e.g. \"The whipped cream question only appears if you select 'Cup'; you currently have 'Cone' selected — scroll up and choose 'Cup'\").\n5. If no edge leads to the target from any reachable state, say it is not available in this flow at all. Do not invent a way.\n\nBe concrete: always name the specific suggestion and the question it belongs to. Never write \"a certain step\" or \"some previous answer\".\n\n## Free text is not a choice\n\nThe user's messages never change the state. Wanting or mentioning an option (e.g. \"I want a cone\") does NOT select it — only \"selected\": true does. So:\n- Never say \"since you chose X\" unless X is \"selected\": true.\n- Treat wishes as questions about the flow, and speak conditionally: \"if you choose the cone, the flavor question will appear\" — not \"now that you've chosen it, ...\".\n- The user must make every choice themselves via the buttons; you can only advise, not select.\n\n## Replying\n\n- The user cannot see the graph. Never mention graphs, nodes, edges, types, JSON, or \"flow\".\n- Do not ask the user questions and do not re-display or add options.\n- To change an earlier choice, tell them to scroll up in the chat and adjust their answer.\n","conversation graph: {{json reflection}}\nuser prompt: {{prompt}}","gpt-4.1-mini","reset","nothing",{"type":19,"x":113,"y":114,"properties":115},-956.9149774835535,1093.3775447468065,{"text":116,"repeatOnReentry":24,"repeatOnChance":24},"🤖 **Order Assistant:** {{answer}}",{"type":92,"x":118,"y":119,"properties":120},-1338.1099755859375,1038.1139267578124,{"text":96},{"type":26,"x":122,"y":123,"properties":124},740.5836087141251,846.8813805299806,{"text":125,"multiple":17,"reviewable":24,"repeatOnReentry":17},"Would you like a spoon?",{"type":32,"x":127,"y":128,"properties":129},977.668823485559,949.6675233976115,{"label":130,"value":78},"Yes",{"type":32,"x":132,"y":133,"properties":134},867.8051107912753,761.6287380133421,{"label":135,"value":72},"No",{"type":19,"x":137,"y":138,"properties":139},375.75034309355266,305.77819201619735,{"text":140,"repeatOnReentry":24,"repeatOnChance":24},"Ask, for example, what you can do here or about the status of your order.\n\n*Note: Free text entries are processed by OpenAI. Read more about this in our [privacy policy](https:\u002F\u002Fwanderer-flow.de\u002Fprivacy\u002F).*",{"type":26,"x":142,"y":143,"properties":144},762.3685148688485,1305.541330543318,{"text":145,"multiple":17,"reviewable":24,"repeatOnReentry":24},"Would you like some cream with it?",{"type":32,"x":147,"y":148,"properties":149},908.1255132896231,1145.3262934863212,{"label":72,"value":72},{"type":32,"x":151,"y":152,"properties":153},933.056005226145,1364.9820898099758,{"label":78,"value":78},{"type":92,"x":155,"y":156,"properties":157},2479.2380344635376,1113.9116706111977,{"text":96},{"type":159,"x":160,"y":161,"properties":162},"board",2585.6199672864045,1501.962100056673,{"text":163},"**Your Order Summary**\n\n{{#if order.type}}* Type: {{order.type}}{{\u002Fif}}\n{{#if order.spoon}}* Spoon: {{order.spoon}}{{\u002Fif}}\n{{#if order.cream}}* Cream: {{order.cream}}{{\u002Fif}}\n{{#if order.flavor}}* Flavor: {{order.flavor}}{{\u002Fif}}\n{{#if order.takeaway}}* Takeaway: {{order.takeaway}}{{\u002Fif}}\n\n",{"type":19,"x":165,"y":166,"properties":167},-616.3250244140625,935.89,{"text":168,"repeatOnReentry":24,"repeatOnChance":24},"I'm very sorry. It seems we haven't paid our OpenAI bills 😇. We're currently experiencing a high volume of requests and have reached our limit for this month. If you'd like to see the examples live on a private instance without limits, please get in touch.",{"e9yqo2sa6xw9256w9xzuqbtu2syq6rwh":170,"fbgmj46lv7bdb6g3gtqufzerms5a9xp9":176,"1vnzixs76cbi68czx6lzrwel1iokt66x":181,"bbh8xhqpxl4c6ycgghp4aq1e49pg1u5o":184,"ed6muqmernpa5tosmqh2xgzdxsu1d3kl":188,"uv66ldu8igw4vro9u1mcqohof67678gu":191,"o6mnix82imzyo6hhrvud9nl0a8sxlwll":194,"kvpadzom56r1cmt6638qsiv3li2466jw":198,"0yl0gtyxmwk8cx2jbt1svqfao7o0ccmy":201,"s0cb90mag9e8yhu0d9iun4scj77jpovl":204,"prnwwqrmxr0snvn2kkl610q9l6mi6k44":207,"uc9kxgez03srtjovtux2jos2h4acab7e":210,"sit50uuzgyte3s7vj18gfi3otwz5ah0x":213,"opi4wgiff0j6uv06nzvvosn4k11m4vic":216,"dk6k8e5pbjo35kabfjll6liqh0nwfy49":222,"skid76m9vof2bl1wk2zzjuuqj194lh0d":226,"dxw0cmk912xm51jfpbqp6av5lkhmwplg":231,"p9zzm6uxowm9ih8ci9hs0cntw5blkqji":235,"70pscwonktrprajek5wvpiqd7g0bu2ov":238,"jbmlklnrq0h4le3re8no8okd6m2boibm":242,"24x4ro98i3p0rh8tlxi4wut3ngpb9gm5":245,"m8vd4atn8vpko6x6jg1vhx53q0xlygud":248,"mnq720w52mfrocwiwei8pcm7oi5rm1u9":250,"akbxzsvums1d7tqpiaq3m98vxdkf0p8m":253,"l83qslylwcn6o9ufnn5gh8q3hmqw0r3y":255,"9ud217iv0ebkx6pgtefeme5c4whdsdnk":258,"iox9lw3hxykvqq5qhycytay0pifvw6b3":261,"ufyirkpwvuk2hcdot3bt1u19t4k02ffh":264,"4bnwmdufoeuh5wljginlsl5ejp3eoaa2":266,"s67ajgjo69jgdtw4nws4knmgs10i0z8r":270,"k01a7upktskiut4vh89k869znenu9xeh":273,"qafc36j2thake14znnzipyp1gts5i5a4":276,"by1rix2q82vcnh6y3897z6jkoszx7hr2":279,"l5kggi6csuw2hmvx0w5kmsk86zwnouak":282,"dkyljhlz90t1urociv8wcw4x0w9hbqk7":286},{"type":171,"from":172,"to":173,"properties":174},"may","4utogag8sr9xrxey14yx5mjligci37ll","gz9pvvpbkqywe71jq8wxhamsw4u6ehet",{"priority":175},6,{"type":171,"from":177,"to":178,"properties":179},"vycu2m8ngoiu12e5moftgmblwi0i6xka","2dnagf1ftzkmlgbhm144y56f5vta49rc",{"priority":180,"condition":96},4,{"type":171,"from":177,"to":182,"properties":183},"zg0sghqa20ruch3ma4k50g3fuyylm3yq",{"priority":180,"condition":96},{"type":171,"from":185,"to":186,"properties":187},"ba78wfrecih90ydpqqseqar5ao66a9j4","a9uqpvli6bh2mu2ynx57bleq9q5bqb58",{"priority":180,"condition":96},{"type":171,"from":185,"to":189,"properties":190},"qv2geyrx501cn7h584bdkvxbljsl0h62",{"priority":180,"condition":96},{"type":171,"from":185,"to":192,"properties":193},"kh05lg8im8qpurdaoyfb9grws5nv0ipf",{"priority":180,"condition":96},{"type":171,"from":185,"to":195,"properties":196},"f556kjt7cv145nsrka98qcc8p60okasf",{"priority":180,"condition":197},"answered",{"type":171,"from":195,"to":199,"properties":200},"4rrgyzzc7z3r94uk6zknnzw6l35nvqdy",{"priority":180,"condition":96},{"type":171,"from":195,"to":202,"properties":203},"7vr6sz8jwwluu0pdsb1d1z62y1fhcz15",{"priority":180,"condition":96},{"type":171,"from":195,"to":205,"properties":206},"ll85d9aj20tug6wu9y0gv3kqfw8yf3v6",{"priority":180,"condition":197},{"type":171,"from":172,"to":208,"properties":209},"2k5474ikwvedmojd43vfap18krcvz98o",{"priority":180},{"type":171,"from":208,"to":211,"properties":212},"188u59jnjrpoptw5l4147goyog1myzqw",{"priority":180},{"type":171,"from":208,"to":214,"properties":215},"oviuokndduyrhw60ahasgny9ut5jqhz9",{"priority":180},{"type":217,"from":211,"to":218,"properties":219},"must","bfq5lf7uo6os4hbikhpgrd5s7d7pmtp4",{"priority":180,"condition":220,"push":221,"as":85},"sent","value",{"type":217,"from":214,"to":218,"properties":223},{"priority":180,"push":224,"as":225},"result","reflection",{"type":171,"from":218,"to":227,"properties":228},"e9nnh5brnz4hxvm1ivonfoura0y7qkbt",{"priority":180,"condition":229,"push":230},"done","answer",{"type":171,"from":227,"to":232,"properties":233},"c12p8x5uqsqjm8rji7ovch8z1rtq2zm6",{"priority":180,"condition":234},"arrived",{"type":236,"from":232,"to":211,"properties":237},"call",{"priority":180,"method":110},{"type":171,"from":178,"to":239,"properties":240},"u0122u3f9mz46ycjchbeka4p6aozi8g3",{"priority":180,"condition":241},"selected",{"type":171,"from":239,"to":243,"properties":244},"fvraq8amb8f7mtv7f1i4m8n7vyb0i5xa",{"priority":180,"condition":96},{"type":171,"from":239,"to":246,"properties":247},"v8gud314hbni51n5b3vpx314ve38z765",{"priority":180,"condition":96},{"type":171,"from":182,"to":185,"properties":249},{"priority":180,"condition":241},{"type":171,"from":173,"to":251,"properties":252},"ul2lxd5r4tdfnvflui5jwz9k0fr5jj17",{"priority":180,"condition":234},{"type":171,"from":251,"to":177,"properties":254},{"priority":180,"condition":234},{"type":171,"from":239,"to":256,"properties":257},"2fzanxhujn2yw0ats59nffmo3dzqcuoy",{"priority":180,"condition":197},{"type":171,"from":256,"to":259,"properties":260},"4x86k09wwbw4l2163yvt5doabrt6rx6w",{"priority":180,"condition":96},{"type":171,"from":256,"to":262,"properties":263},"mizqyf7gxvvz1o5y962il3y4ckjq8m3l",{"priority":180,"condition":96},{"type":171,"from":256,"to":185,"properties":265},{"priority":180,"condition":197},{"type":217,"from":177,"to":267,"properties":268},"84p6op3w9qrfoflkl0a2c4knmh8gq0w2",{"priority":180,"condition":197,"push":221,"as":269},"type",{"type":171,"from":239,"to":267,"properties":271},{"priority":180,"condition":197,"push":221,"as":272},"spoon",{"type":171,"from":256,"to":267,"properties":274},{"priority":180,"condition":197,"push":221,"as":275},"cream",{"type":217,"from":185,"to":267,"properties":277},{"priority":180,"condition":197,"push":221,"as":278},"flavor",{"type":217,"from":195,"to":267,"properties":280},{"priority":180,"condition":197,"push":221,"as":281},"takeaway",{"type":171,"from":267,"to":283,"properties":284},"k7ahzcc39ge5susz5qidfw9otwjhe4n9",{"priority":180,"as":285},"order",{"type":171,"from":218,"to":287,"properties":288},"dax4az47qomaeaq00bc7ccunpre827lm",{"priority":180,"condition":289},"error",1785616523899]