[{"data":1,"prerenderedAt":511},["ShallowReactive",2],{"blog-pragvue-2026":3},{"id":4,"title":5,"articleType":6,"author":7,"authorSlug":6,"body":8,"date":495,"description":496,"extension":497,"faq":6,"featured":498,"image":499,"meta":500,"navigation":127,"path":501,"readTime":502,"seo":503,"seoTitle":504,"stem":505,"tags":506,"__hash__":510},"blog\u002Fblog\u002Fpragvue-2026.md","Epicmax at PragVue 2026: Your AI Agrees With You. That's the Problem.",null,"Epicmax Team",{"type":9,"value":10,"toc":480},"minimark",[11,23,30,35,38,41,44,48,51,56,59,63,66,312,319,323,326,343,346,350,358,362,365,368,372,375,391,394,398,407,428,432,440,443,447,450,458,462,465,471,476],[12,13,14,15,22],"p",{},"On 29 September our Senior Frontend Developer, Pavel Mironov, took the stage at ",[16,17,21],"a",{"href":18,"rel":19},"https:\u002F\u002Fpragvue.com\u002F2026",[20],"nofollow","PragVue 2026",", the Czech Vue.js conference, held at Arthur's Pub in Prague's Karlín district. Epicmax was also one of the event's sponsors. Pavel's talk was called \"Your AI Agrees With You. That's the Problem.\" Here is what it covered, and the habits he suggests to anyone who works with coding agents every day.",[12,24,25],{},[26,27],"img",{"alt":28,"src":29},"PragVue 2026 at Arthur's Pub in Prague: attendees at tables with laptops in front of the stage and the PragVue banner","\u002Fimages\u002Fblog\u002Fpragvue-2026\u002Fpragvue-2026-venue.jpg",[31,32,34],"h2",{"id":33},"a-talk-that-changed-while-it-was-being-written","A talk that changed while it was being written",[12,36,37],{},"It started as a simple talk about working better with AI agents: how to write instructions, how to use MCP, skills and agent personas. All of that is still useful. But while preparing it, Pavel kept running into a deeper problem. We talk a lot about how to configure AI, and much less about how well we are configured ourselves.",[12,39,40],{},"Look at how fast the job changed. First came autocomplete, then chat in the IDE, then tools that could see the whole codebase. Then agents doing small tasks, then big ones, and now agents that split the work, start their own subagents and pick their own tools. We used to control the code. Then we controlled the tasks. Now we control the goal, the limits and the proof. The agent works alone for a while and comes back with one word: \"Done.\" The responsibility is still ours.",[12,42,43],{},"Pavel compared it to the move from horses to cars. You get more speed, and more ways to crash.",[31,45,47],{"id":46},"four-biases-four-habits","Four biases, four habits",[12,49,50],{},"The core of the talk was about us, not the model. AI can be very convincing when it's wrong, and we are very good at believing it.",[52,53,55],"h3",{"id":54},"conviction-ask-for-evidence-not-an-explanation","Conviction: ask for evidence, not an explanation",[12,57,58],{},"When the agent says it fixed the hydration mismatch and the result is \"production-ready\", don't ask it to explain why. An explanation is just more text from the same agent. Ask for proof that doesn't depend on what it says: the test output, a screenshot, a log.",[52,60,62],{"id":61},"fluency-bias-read-the-diff-not-the-summary","Fluency bias: read the diff, not the summary",[12,64,65],{},"Code that reads smoothly feels correct. This cache from the talk is short, typed and well named:",[67,68,73],"pre",{"className":69,"code":70,"language":71,"meta":72,"style":72},"language-ts shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","const cache = new Map\u003Cstring, Product[]>()\n\nexport async function getProducts(q: ProductQuery) {\n  const key = `products:${q.category}`\n  if (cache.has(key)) return cache.get(key)!\n  const products = await api.products.list(q)\n  cache.set(key, products)\n  return products\n}\n","ts","",[74,75,76,122,129,164,197,243,276,297,306],"code",{"__ignoreMap":72},[77,78,81,85,89,93,96,100,103,107,110,113,116,119],"span",{"class":79,"line":80},"line",1,[77,82,84],{"class":83},"spNyl","const",[77,86,88],{"class":87},"sTEyZ"," cache ",[77,90,92],{"class":91},"sMK4o","=",[77,94,95],{"class":91}," new",[77,97,99],{"class":98},"s2Zo4"," Map",[77,101,102],{"class":91},"\u003C",[77,104,106],{"class":105},"sBMFI","string",[77,108,109],{"class":91},",",[77,111,112],{"class":105}," Product",[77,114,115],{"class":87},"[]",[77,117,118],{"class":91},">",[77,120,121],{"class":87},"()\n",[77,123,125],{"class":79,"line":124},2,[77,126,128],{"emptyLinePlaceholder":127},true,"\n",[77,130,132,136,139,142,145,148,152,155,158,161],{"class":79,"line":131},3,[77,133,135],{"class":134},"s7zQu","export",[77,137,138],{"class":83}," async",[77,140,141],{"class":83}," function",[77,143,144],{"class":98}," getProducts",[77,146,147],{"class":91},"(",[77,149,151],{"class":150},"sHdIc","q",[77,153,154],{"class":91},":",[77,156,157],{"class":105}," ProductQuery",[77,159,160],{"class":91},")",[77,162,163],{"class":91}," {\n",[77,165,167,170,173,176,179,183,186,188,191,194],{"class":79,"line":166},4,[77,168,169],{"class":83},"  const",[77,171,172],{"class":87}," key",[77,174,175],{"class":91}," =",[77,177,178],{"class":91}," `",[77,180,182],{"class":181},"sfazB","products:",[77,184,185],{"class":91},"${",[77,187,151],{"class":87},[77,189,190],{"class":91},".",[77,192,193],{"class":87},"category",[77,195,196],{"class":91},"}`\n",[77,198,200,203,207,210,212,215,217,220,223,226,229,231,234,236,238,240],{"class":79,"line":199},5,[77,201,202],{"class":134},"  if",[77,204,206],{"class":205},"swJcz"," (",[77,208,209],{"class":87},"cache",[77,211,190],{"class":91},[77,213,214],{"class":98},"has",[77,216,147],{"class":205},[77,218,219],{"class":87},"key",[77,221,222],{"class":205},")) ",[77,224,225],{"class":134},"return",[77,227,228],{"class":87}," cache",[77,230,190],{"class":91},[77,232,233],{"class":98},"get",[77,235,147],{"class":205},[77,237,219],{"class":87},[77,239,160],{"class":205},[77,241,242],{"class":91},"!\n",[77,244,246,248,251,253,256,259,261,264,266,269,271,273],{"class":79,"line":245},6,[77,247,169],{"class":83},[77,249,250],{"class":87}," products",[77,252,175],{"class":91},[77,254,255],{"class":134}," await",[77,257,258],{"class":87}," api",[77,260,190],{"class":91},[77,262,263],{"class":87},"products",[77,265,190],{"class":91},[77,267,268],{"class":98},"list",[77,270,147],{"class":205},[77,272,151],{"class":87},[77,274,275],{"class":205},")\n",[77,277,279,282,284,287,289,291,293,295],{"class":79,"line":278},7,[77,280,281],{"class":87},"  cache",[77,283,190],{"class":91},[77,285,286],{"class":98},"set",[77,288,147],{"class":205},[77,290,219],{"class":87},[77,292,109],{"class":91},[77,294,250],{"class":87},[77,296,275],{"class":205},[77,298,300,303],{"class":79,"line":299},8,[77,301,302],{"class":134},"  return",[77,304,305],{"class":87}," products\n",[77,307,309],{"class":79,"line":308},9,[77,310,311],{"class":91},"}\n",[12,313,314,315,318],{},"It's also wrong. The key ignores ",[74,316,317],{},"q.page",", so everyone who opens page two gets page one. Our brain quietly swaps the question \"is this correct?\" for \"does this look correct?\" Before you approve a change, try to name one input that breaks it. Here, that input is simply \"page two\".",[52,320,322],{"id":321},"satisficing-read-from-the-bottom-up-and-ask-for-alternatives","Satisficing: read from the bottom up, and ask for alternatives",[12,324,325],{},"We stop at the first answer that looks good enough, and AI hands us one in seconds. In the talk's example, a re-rendering product list got \"fixed\" with a memoized computed, and the answer ended with \"Looks fine. Ready to merge.\" The real cause was index keys: when a product was added at the top, each row kept its local state while a different product moved into it.",[67,327,331],{"className":328,"code":329,"language":330,"meta":72,"style":72},"language-diff shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","- \u003CRow v-for=\"(p, i) in rows\" :key=\"i\" :product=\"p\" \u002F>\n+ \u003CRow v-for=\"p in rows\" :key=\"p.id\" :product=\"p\" \u002F>\n","diff",[74,332,333,338],{"__ignoreMap":72},[77,334,335],{"class":79,"line":80},[77,336,337],{},"- \u003CRow v-for=\"(p, i) in rows\" :key=\"i\" :product=\"p\" \u002F>\n",[77,339,340],{"class":79,"line":124},[77,341,342],{},"+ \u003CRow v-for=\"p in rows\" :key=\"p.id\" :product=\"p\" \u002F>\n",[12,344,345],{},"Read the answer from the bottom up, starting with the conclusion, and ask whether the code above really proves it. Then ask for two or three approaches instead of one. Seen side by side, \"looks fine\" stops being enough.",[52,347,349],{"id":348},"confirmation-bias-ask-it-to-prove-you-wrong","Confirmation bias: ask it to prove you wrong",[12,351,352,353,357],{},"\"I think the checkout bug is in the cart store, check it\" will very often get you \"You're right, and here's why.\" But you were the one who told the agent where to look. Ask it to prove the bug is ",[354,355,356],"em",{},"not"," in the cart store and you may get a different cause. Neither answer is automatically right, but now you have two answers that disagree and something real to check. Sometimes the best move is not to share your guess at all: describe the symptom and let the agent find the cause.",[31,359,361],{"id":360},"one-wrong-assumption-travels-far","One wrong assumption travels far",[12,363,364],{},"When AI completed a few lines, a mistake was cheap. An agent can make one wrong decision at the start and then build everything around it very well: research, architecture, several changed files, tests, fixes and tokens. The result looks complete and convincing, and it all rests on that one assumption.",[12,366,367],{},"The cheapest place to catch it is before any code exists. Ask the agent to list its assumptions and what would prove each one wrong, then wait for your OK. Reading five assumptions takes a minute. Reading five changed files built on the wrong one takes an hour.",[31,369,371],{"id":370},"define-the-task-before-anyone-starts","Define the task before anyone starts",[12,373,374],{},"This isn't about better prompts. It's about thinking a task through before anyone starts on it, whether that's you, a colleague or an agent. Pavel's four questions:",[376,377,378,382,385,388],"ol",{},[379,380,381],"li",{},"What is the real problem?",[379,383,384],{},"What must not break?",[379,386,387],{},"What counts as \"done\"?",[379,389,390],{},"How will I know it works?",[12,392,393],{},"For the hydration bug, that turns \"fix the hydration mismatch\" into \"find the root cause and fix it\", with conditions attached. The order summary must still render on the server, otherwise turning SSR off is a perfectly valid fix from the agent's point of view. Done means no warnings, SSR still working and tests passing. And the agent comes back with an evidence report: the commands it ran, tests passed and failed, warnings before and after. If you can't answer the four questions, the agent can't either. It will guess, confidently.",[31,395,397],{"id":396},"evidence-not-prose","Evidence, not prose",[12,399,400,401,406],{},"The agent writes the code, then writes the story about the code, and \"I ran the tests and they pass\" reads the same whether the tests ran or not. Pavel's colleague Andrii Bohdanov built ",[16,402,405],{"href":403,"rel":404},"https:\u002F\u002Fwww.npmjs.com\u002Fpackage\u002Fevidence-layer",[20],"evidence-layer"," to make that report checkable. Tests run before the review is written, every \"verified\" points to a real result from the commit, cited files are checked against git, and the output is machine-readable so CI can check it again. It's a fresh experiment rather than a standard, but worth trying on one project:",[67,408,412],{"className":409,"code":410,"language":411,"meta":72,"style":72},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","npm i -D evidence-layer\n","bash",[74,413,414],{"__ignoreMap":72},[77,415,416,419,422,425],{"class":79,"line":80},[77,417,418],{"class":105},"npm",[77,420,421],{"class":181}," i",[77,423,424],{"class":181}," -D",[77,426,427],{"class":181}," evidence-layer\n",[31,429,431],{"id":430},"more-than-code","More than code",[12,433,434,435,439],{},"If we write less code by hand, our value moves to what we understand: the business, the users and the risks. The same Vue skills mean different things on different projects. An admin dashboard sits behind a login, is fine as an SPA and is used by trained staff on one browser. An online shop lives on SEO, needs content ",[16,436,438],{"href":437},"\u002Fblog\u002Fvue-js-seo-rendering","rendered on the server",", loses a sale on every slow page and is used by anyone on any phone. An agent will write the code for either, but it won't tell you SEO matters unless you know to ask.",[12,441,442],{},"And treat today's AI practices as guidelines rather than rules. Every new model changes what an agent can do on its own, so some of today's careful process will be unnecessary in six months. The skill that lasts is adapting.",[31,444,446],{"id":445},"back-to-the-title","Back to the title",[12,448,449],{},"Your AI agrees with you, and that's the problem, because it no longer just agrees. It takes your assumption and turns it into working code in minutes. When the assumption is right, that's amazing. When it's wrong, the same speed gets you to the wrong place fast. Pavel's closing point: the skill worth building is a process where both you and the AI can be wrong, and where you notice quickly.",[12,451,452,453],{},"The slides are online: ",[16,454,457],{"href":455,"rel":456},"https:\u002F\u002Funtael-pragvue.netlify.app\u002Fpragvue-2026\u002F1",[20],"Your AI Agrees With You. That's the Problem.",[31,459,461],{"id":460},"thanks-pragvue","Thanks, PragVue",[12,463,464],{},"The morning line-up also included Alois Seckar, Estéban Soubiran, Jakub Andrzejewski and Daniel Roe, and the day mixed talks with hands-on hacking. A big thank-you to the organisers, and to everyone who stayed for the questions after Pavel's talk.",[12,466,467],{},[26,468],{"alt":469,"src":470},"Prizes laid out at PragVue 2026: Epicmax gift vouchers, Atos notebooks, books, wireless earbuds and a speaker","\u002Fimages\u002Fblog\u002Fpragvue-2026\u002Fpragvue-2026-prizes.jpg",[472,473],"blog-button",{"label":474,"to":475},"Talk to a Vue expert","https:\u002F\u002Fcalendar.app.google\u002FXwRzASZitZRSVLxq6",[477,478,479],"style",{},"html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .s7zQu, html code.shiki .s7zQu{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#89DDFF;--shiki-default-font-style:italic;--shiki-dark:#89DDFF;--shiki-dark-font-style:italic}html pre.shiki code .sHdIc, html code.shiki .sHdIc{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#EEFFFF;--shiki-default-font-style:italic;--shiki-dark:#BABED8;--shiki-dark-font-style:italic}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}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 .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":72,"searchDepth":131,"depth":131,"links":481},[482,483,489,490,491,492,493,494],{"id":33,"depth":124,"text":34},{"id":46,"depth":124,"text":47,"children":484},[485,486,487,488],{"id":54,"depth":131,"text":55},{"id":61,"depth":131,"text":62},{"id":321,"depth":131,"text":322},{"id":348,"depth":131,"text":349},{"id":360,"depth":124,"text":361},{"id":370,"depth":124,"text":371},{"id":396,"depth":124,"text":397},{"id":430,"depth":124,"text":431},{"id":445,"depth":124,"text":446},{"id":460,"depth":124,"text":461},"2026-10-16","Pavel Mironov of Epicmax spoke at PragVue 2026 in Prague on working with AI coding agents: the biases that make us trust them and habits that catch mistakes.","md",false,"\u002Fimages\u002Fblog\u002Fpragvue-2026\u002Fcard.png",{},"\u002Fblog\u002Fpragvue-2026","6 min read",{"title":5,"description":496},"PragVue 2026 Talk: Your AI Agrees With You","blog\u002Fpragvue-2026",[507,508,509],"Events","Vue.js","AI","JIOO21fKfDFXp5onEfN8oxqplRKd3bJORlITPgxJSYQ",1792161236950]